1 package org.junit.runners;
2
3 import java.lang.annotation.ElementType;
4 import java.lang.annotation.Inherited;
5 import java.lang.annotation.Retention;
6 import java.lang.annotation.RetentionPolicy;
7 import java.lang.annotation.Target;
8 import java.util.Collections;
9 import java.util.List;
10
11 import org.junit.internal.builders.AllDefaultPossibilitiesBuilder;
12 import org.junit.runner.Description;
13 import org.junit.runner.Runner;
14 import org.junit.runner.notification.RunNotifier;
15 import org.junit.runners.model.InitializationError;
16 import org.junit.runners.model.RunnerBuilder;
17
18
19
20
21
22
23
24
25
26
27 public class Suite extends ParentRunner<Runner> {
28
29
30
31 public static Runner emptySuite() {
32 try {
33 return new Suite((Class<?>) null, new Class<?>[0]);
34 } catch (InitializationError e) {
35 throw new RuntimeException("This shouldn't be possible");
36 }
37 }
38
39
40
41
42
43 @Retention(RetentionPolicy.RUNTIME)
44 @Target(ElementType.TYPE)
45 @Inherited
46 public @interface SuiteClasses {
47
48
49
50 public Class<?>[] value();
51 }
52
53 private static Class<?>[] getAnnotatedClasses(Class<?> klass) throws InitializationError {
54 SuiteClasses annotation = klass.getAnnotation(SuiteClasses.class);
55 if (annotation == null) {
56 throw new InitializationError(String.format("class '%s' must have a SuiteClasses annotation", klass.getName()));
57 }
58 return annotation.value();
59 }
60
61 private final List<Runner> runners;
62
63
64
65
66
67
68
69 public Suite(Class<?> klass, RunnerBuilder builder) throws InitializationError {
70 this(builder, klass, getAnnotatedClasses(klass));
71 }
72
73
74
75
76
77
78
79
80 public Suite(RunnerBuilder builder, Class<?>[] classes) throws InitializationError {
81 this(null, builder.runners(null, classes));
82 }
83
84
85
86
87
88
89
90 protected Suite(Class<?> klass, Class<?>[] suiteClasses) throws InitializationError {
91 this(new AllDefaultPossibilitiesBuilder(true), klass, suiteClasses);
92 }
93
94
95
96
97
98
99
100
101 protected Suite(RunnerBuilder builder, Class<?> klass, Class<?>[] suiteClasses) throws InitializationError {
102 this(klass, builder.runners(klass, suiteClasses));
103 }
104
105
106
107
108
109
110
111 protected Suite(Class<?> klass, List<Runner> runners) throws InitializationError {
112 super(klass);
113 this.runners = Collections.unmodifiableList(runners);
114 }
115
116 @Override
117 protected List<Runner> getChildren() {
118 return runners;
119 }
120
121 @Override
122 protected Description describeChild(Runner child) {
123 return child.getDescription();
124 }
125
126 @Override
127 protected void runChild(Runner runner, final RunNotifier notifier) {
128 runner.run(notifier);
129 }
130 }