001 package junit.framework;
002
003 import java.util.ArrayList;
004 import java.util.Arrays;
005 import java.util.HashMap;
006 import java.util.List;
007
008 import org.junit.runner.Description;
009 import org.junit.runner.notification.Failure;
010 import org.junit.runner.notification.RunListener;
011 import org.junit.runner.notification.RunNotifier;
012
013 public class JUnit4TestAdapterCache extends HashMap<Description, Test> {
014 private static final long serialVersionUID = 1L;
015 private static final JUnit4TestAdapterCache fInstance = new JUnit4TestAdapterCache();
016
017 public static JUnit4TestAdapterCache getDefault() {
018 return fInstance;
019 }
020
021 public Test asTest(Description description) {
022 if (description.isSuite()) {
023 return createTest(description);
024 } else {
025 if (!containsKey(description)) {
026 put(description, createTest(description));
027 }
028 return get(description);
029 }
030 }
031
032 Test createTest(Description description) {
033 if (description.isTest()) {
034 return new JUnit4TestCaseFacade(description);
035 } else {
036 TestSuite suite = new TestSuite(description.getDisplayName());
037 for (Description child : description.getChildren()) {
038 suite.addTest(asTest(child));
039 }
040 return suite;
041 }
042 }
043
044 public RunNotifier getNotifier(final TestResult result, final JUnit4TestAdapter adapter) {
045 RunNotifier notifier = new RunNotifier();
046 notifier.addListener(new RunListener() {
047 @Override
048 public void testFailure(Failure failure) throws Exception {
049 result.addError(asTest(failure.getDescription()), failure.getException());
050 }
051
052 @Override
053 public void testFinished(Description description) throws Exception {
054 result.endTest(asTest(description));
055 }
056
057 @Override
058 public void testStarted(Description description) throws Exception {
059 result.startTest(asTest(description));
060 }
061 });
062 return notifier;
063 }
064
065 public List<Test> asTestList(Description description) {
066 if (description.isTest()) {
067 return Arrays.asList(asTest(description));
068 } else {
069 List<Test> returnThis = new ArrayList<Test>();
070 for (Description child : description.getChildren()) {
071 returnThis.add(asTest(child));
072 }
073 return returnThis;
074 }
075 }
076
077 }