forked from junit-team/junit4
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
alpha-ready implementation of SuiteBuilder
- Loading branch information
Showing
10 changed files
with
188 additions
and
119 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
|
||
Can't open /Users/saff/Documents/git-repos/junit/doc/ReleaseNotes4.9-SNAPSHOT-20100512-0041.txt: No such file or directory at build/Markdown.pl line 218. | ||
Use of uninitialized value in substitution (s///) at build/Markdown.pl line 245. | ||
Use of uninitialized value in substitution (s///) at build/Markdown.pl line 246. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
<h2>Summary of Changes in version 4.9</h2> | ||
|
||
<h3>SuiteBuilder</h3> | ||
|
||
<p>A new way of declaring suites to run. SuiteBuilder allows for flexible | ||
specification of where to find the classes containing tests, and how | ||
to filter the resulting runners. This suite class lists the | ||
explicit test classes to consider running, and then filters it down | ||
to only those tests or classes annotated with <code>@Category(Yes.class)</code>:</p> | ||
|
||
<pre><code>@RunWith(SuiteBuilder.class) | ||
public static class OnlyYes { | ||
@Classes | ||
public Listed classes= new Listed(Yes1.class, Yes2.class, No1.class); | ||
|
||
@RunnerFilter | ||
public CategoryFilter filter= CategoryFilter.include(Yes.class); | ||
} | ||
</code></pre> | ||
|
||
<p>We hope to soon include other implementations for the @Classes annotation, | ||
including a classpath-searching test gatherer.</p> | ||
|
||
<h3>Bug fixes</h3> | ||
|
||
<ul> | ||
<li>github#98: assumeTrue() does not work with expected exceptions</li> | ||
</ul> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,25 @@ | ||
## Summary of Changes in version 4.9 ## | ||
|
||
### SuiteBuilder ### | ||
|
||
A new way of declaring suites to run. SuiteBuilder allows for flexible | ||
specification of where to find the classes containing tests, and how | ||
to filter the resulting runners. This suite class lists the | ||
explicit test classes to consider running, and then filters it down | ||
to only those tests or classes annotated with `@Category(Yes.class)`: | ||
|
||
@RunWith(SuiteBuilder.class) | ||
public static class OnlyYes { | ||
@Classes | ||
public Listed classes= new Listed(Yes1.class, Yes2.class, No1.class); | ||
|
||
@RunnerFilter | ||
public CategoryFilter filter= CategoryFilter.include(Yes.class); | ||
} | ||
|
||
We hope to soon include other implementations for the @Classes annotation, | ||
including a classpath-searching test gatherer. | ||
|
||
### Bug fixes ### | ||
|
||
- github#98: assumeTrue() does not work with expected exceptions |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
/** | ||
* | ||
*/ | ||
package org.junit.experimental.runners; | ||
|
||
import java.util.Arrays; | ||
import java.util.List; | ||
|
||
public class Listed implements SuiteBuilder.Classes.Value { | ||
private final Class<?>[] fClasses; | ||
|
||
public Listed(Class<?>... classes) { | ||
fClasses= classes; | ||
} | ||
|
||
public List<? extends Class<?>> get() { | ||
return Arrays.asList(fClasses); | ||
} | ||
} |
99 changes: 99 additions & 0 deletions
99
src/main/java/org/junit/experimental/runners/SuiteBuilder.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
/** | ||
* | ||
*/ | ||
package org.junit.experimental.runners; | ||
|
||
import java.lang.annotation.Retention; | ||
import java.lang.annotation.RetentionPolicy; | ||
import java.util.ArrayList; | ||
import java.util.Collection; | ||
import java.util.List; | ||
|
||
import org.junit.internal.builders.AllDefaultPossibilitiesBuilder; | ||
import org.junit.runner.Description; | ||
import org.junit.runner.Runner; | ||
import org.junit.runner.notification.RunNotifier; | ||
import org.junit.runners.model.InitializationError; | ||
import org.junit.runners.model.TestClass; | ||
|
||
public class SuiteBuilder extends Runner { | ||
@Retention(RetentionPolicy.RUNTIME) | ||
public @interface RunnerFilter { | ||
public static interface Value { | ||
public abstract List<Runner> matchingRunners( | ||
List<Runner> allPossibleRunners); | ||
} | ||
} | ||
|
||
@Retention(RetentionPolicy.RUNTIME) | ||
public @interface Classes { | ||
public static interface Value { | ||
public abstract Collection<? extends Class<?>> get(); | ||
} | ||
} | ||
|
||
private final TestClass fTestClass; | ||
private final Object fInstance; | ||
private final List<Runner> fRunners; | ||
|
||
public SuiteBuilder(Class<?> testClass) throws InitializationError { | ||
fTestClass= new TestClass(testClass); | ||
fInstance = createInstance(); | ||
fRunners= computeRunners(); | ||
} | ||
|
||
private Object createInstance() throws InitializationError { | ||
try { | ||
return fTestClass.getOnlyConstructor().newInstance(); | ||
} catch (Exception e) { | ||
throw new InitializationError(e); | ||
} | ||
} | ||
|
||
@Override | ||
public Description getDescription() { | ||
Description description= Description.createSuiteDescription(fTestClass.getJavaClass()); | ||
for (Runner each : fRunners) { | ||
description.addChild(each.getDescription()); | ||
} | ||
return description; | ||
} | ||
|
||
@Override | ||
public void run(RunNotifier notifier) { | ||
for (Runner each : fRunners) | ||
each.run(notifier); | ||
} | ||
|
||
private List<Runner> computeRunners() throws InitializationError { | ||
List<Class<?>> allPossibleClasses= gatherClasses(); | ||
List<Runner> allPossibleRunners= runnersForClasses(allPossibleClasses); | ||
return filterRunners(allPossibleRunners); | ||
} | ||
|
||
private List<Runner> filterRunners(List<Runner> allPossibleRunners) { | ||
List<Runner> result= allPossibleRunners; | ||
for (SuiteBuilder.RunnerFilter.Value each : getFilters()) | ||
result= each.matchingRunners(result); | ||
return result; | ||
} | ||
|
||
private List<SuiteBuilder.RunnerFilter.Value> getFilters() { | ||
return fTestClass.getAnnotatedFieldValues(fInstance, | ||
SuiteBuilder.RunnerFilter.class, SuiteBuilder.RunnerFilter.Value.class); | ||
} | ||
|
||
private List<Runner> runnersForClasses(List<Class<?>> allPossibleClasses) throws InitializationError { | ||
return new AllDefaultPossibilitiesBuilder(true).runners(fTestClass | ||
.getJavaClass(), allPossibleClasses); | ||
} | ||
|
||
public List<Class<?>> gatherClasses() { | ||
ArrayList<Class<?>> result= new ArrayList<Class<?>>(); | ||
List<SuiteBuilder.Classes.Value> classeses= fTestClass.getAnnotatedFieldValues( | ||
fInstance, SuiteBuilder.Classes.class, SuiteBuilder.Classes.Value.class); | ||
for (SuiteBuilder.Classes.Value each : classeses) | ||
result.addAll(each.get()); | ||
return result; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters