001: package org.junit.internal.runners;
002:
003: import junit.extensions.TestDecorator;
004: import junit.framework.AssertionFailedError;
005: import junit.framework.JUnit4TestAdapter;
006: import junit.framework.JUnit4TestCaseFacade;
007: import junit.framework.Test;
008: import junit.framework.TestCase;
009: import junit.framework.TestListener;
010: import junit.framework.TestResult;
011: import junit.framework.TestSuite;
012: import org.junit.runner.Description;
013: import org.junit.runner.Runner;
014: import org.junit.runner.manipulation.Filter;
015: import org.junit.runner.manipulation.Filterable;
016: import org.junit.runner.manipulation.NoTestsRemainException;
017: import org.junit.runner.manipulation.Sortable;
018: import org.junit.runner.manipulation.Sorter;
019: import org.junit.runner.notification.Failure;
020: import org.junit.runner.notification.RunNotifier;
021:
022: public class JUnit38ClassRunner extends Runner implements Filterable,
023: Sortable {
024: private static final class OldTestClassAdaptingListener implements
025: TestListener {
026: private final RunNotifier fNotifier;
027:
028: private OldTestClassAdaptingListener(RunNotifier notifier) {
029: fNotifier = notifier;
030: }
031:
032: public void endTest(Test test) {
033: fNotifier.fireTestFinished(asDescription(test));
034: }
035:
036: public void startTest(Test test) {
037: fNotifier.fireTestStarted(asDescription(test));
038: }
039:
040: // Implement junit.framework.TestListener
041: public void addError(Test test, Throwable t) {
042: Failure failure = new Failure(asDescription(test), t);
043: fNotifier.fireTestFailure(failure);
044: }
045:
046: private Description asDescription(Test test) {
047: if (test instanceof JUnit4TestCaseFacade) {
048: JUnit4TestCaseFacade facade = (JUnit4TestCaseFacade) test;
049: return facade.getDescription();
050: }
051: return Description.createTestDescription(test.getClass(),
052: getName(test));
053: }
054:
055: private String getName(Test test) {
056: if (test instanceof TestCase)
057: return ((TestCase) test).getName();
058: else
059: return test.toString();
060: }
061:
062: public void addFailure(Test test, AssertionFailedError t) {
063: addError(test, t);
064: }
065: }
066:
067: private Test fTest;
068:
069: @SuppressWarnings("unchecked")
070: public JUnit38ClassRunner(Class<?> klass) {
071: this (new TestSuite(klass.asSubclass(TestCase.class)));
072: }
073:
074: public JUnit38ClassRunner(Test test) {
075: super ();
076: fTest = test;
077: }
078:
079: @Override
080: public void run(RunNotifier notifier) {
081: TestResult result = new TestResult();
082: result.addListener(createAdaptingListener(notifier));
083: fTest.run(result);
084: }
085:
086: public static TestListener createAdaptingListener(
087: final RunNotifier notifier) {
088: return new OldTestClassAdaptingListener(notifier);
089: }
090:
091: @Override
092: public Description getDescription() {
093: return makeDescription(fTest);
094: }
095:
096: private Description makeDescription(Test test) {
097: if (test instanceof TestCase) {
098: TestCase tc = (TestCase) test;
099: return Description.createTestDescription(tc.getClass(), tc
100: .getName());
101: } else if (test instanceof TestSuite) {
102: TestSuite ts = (TestSuite) test;
103: String name = ts.getName() == null ? "" : ts.getName();
104: Description description = Description
105: .createSuiteDescription(name);
106: int n = ts.testCount();
107: for (int i = 0; i < n; i++)
108: description.addChild(makeDescription(ts.testAt(i)));
109: return description;
110: } else if (test instanceof JUnit4TestAdapter) {
111: JUnit4TestAdapter adapter = (JUnit4TestAdapter) test;
112: return adapter.getDescription();
113: } else if (test instanceof TestDecorator) {
114: TestDecorator decorator = (TestDecorator) test;
115: return makeDescription(decorator.getTest());
116: } else {
117: // This is the best we can do in this case
118: return Description.createSuiteDescription(test.getClass());
119: }
120: }
121:
122: public void filter(Filter filter) throws NoTestsRemainException {
123: if (fTest instanceof JUnit4TestAdapter) {
124: JUnit4TestAdapter adapter = (JUnit4TestAdapter) fTest;
125: adapter.filter(filter);
126: }
127: }
128:
129: public void sort(Sorter sorter) {
130: if (fTest instanceof JUnit4TestAdapter) {
131: JUnit4TestAdapter adapter = (JUnit4TestAdapter) fTest;
132: adapter.sort(sorter);
133: }
134: }
135: }
|