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    }