Save This Page
Home » JUnit-4.7 » org.junit.internal.runners » [javadoc | source]
    1   package org.junit.internal.runners;
    2   
    3   import junit.extensions.TestDecorator;
    4   import junit.framework.AssertionFailedError;
    5   import junit.framework.Test;
    6   import junit.framework.TestCase;
    7   import junit.framework.TestListener;
    8   import junit.framework.TestResult;
    9   import junit.framework.TestSuite;
   10   import org.junit.runner.Describable;
   11   import org.junit.runner.Description;
   12   import org.junit.runner.Runner;
   13   import org.junit.runner.manipulation.Filter;
   14   import org.junit.runner.manipulation.Filterable;
   15   import org.junit.runner.manipulation.NoTestsRemainException;
   16   import org.junit.runner.manipulation.Sortable;
   17   import org.junit.runner.manipulation.Sorter;
   18   import org.junit.runner.notification.Failure;
   19   import org.junit.runner.notification.RunNotifier;
   20   
   21   public class JUnit38ClassRunner extends Runner implements Filterable, Sortable {
   22   	private final class OldTestClassAdaptingListener implements
   23   			TestListener {
   24   		private final RunNotifier fNotifier;
   25   
   26   		private OldTestClassAdaptingListener(RunNotifier notifier) {
   27   			fNotifier= notifier;
   28   		}
   29   
   30   		public void endTest(Test test) {
   31   			fNotifier.fireTestFinished(asDescription(test));
   32   		}
   33   
   34   		public void startTest(Test test) {
   35   			fNotifier.fireTestStarted(asDescription(test));
   36   		}
   37   
   38   		// Implement junit.framework.TestListener
   39   		public void addError(Test test, Throwable t) {
   40   			Failure failure= new Failure(asDescription(test), t);
   41   			fNotifier.fireTestFailure(failure);
   42   		}
   43   
   44   		private Description asDescription(Test test) {
   45   			if (test instanceof Describable) {
   46   				Describable facade= (Describable) test;
   47   				return facade.getDescription();
   48   			}
   49   			return Description.createTestDescription(getEffectiveClass(test), getName(test));
   50   		}
   51   
   52   		private Class<? extends Test> getEffectiveClass(Test test) {
   53   			return test.getClass();
   54   		}
   55   
   56   		private String getName(Test test) {
   57   			if (test instanceof TestCase)
   58   				return ((TestCase) test).getName();
   59   			else
   60   				return test.toString();
   61   		}
   62   
   63   		public void addFailure(Test test, AssertionFailedError t) {
   64   			addError(test, t);
   65   		}
   66   	}
   67   
   68   	private Test fTest;
   69   	
   70   	public JUnit38ClassRunner(Class<?> klass) {
   71   		this(new TestSuite(klass.asSubclass(TestCase.class)));
   72   	}
   73   
   74   	public JUnit38ClassRunner(Test test) {
   75   		super();
   76   		setTest(test);
   77   	}
   78   
   79   	@Override
   80   	public void run(RunNotifier notifier) {
   81   		TestResult result= new TestResult();
   82   		result.addListener(createAdaptingListener(notifier));
   83   		getTest().run(result);
   84   	}
   85   
   86   	public TestListener createAdaptingListener(final RunNotifier notifier) {
   87   		return new OldTestClassAdaptingListener(notifier);
   88   	}
   89   	
   90   	@Override
   91   	public Description getDescription() {
   92   		return makeDescription(getTest());
   93   	}
   94   
   95   	private static Description makeDescription(Test test) {
   96   		if (test instanceof TestCase) {
   97   			TestCase tc= (TestCase) test;
   98   			return Description.createTestDescription(tc.getClass(), tc.getName());
   99   		} else if (test instanceof TestSuite) {
  100   			TestSuite ts= (TestSuite) test;
  101   			String name= ts.getName() == null ? createSuiteDescription(ts) : ts.getName();
  102   			Description description= Description.createSuiteDescription(name);
  103   			int n= ts.testCount();
  104   			for (int i= 0; i < n; i++) {
  105   				Description made= makeDescription(ts.testAt(i));
  106   				description.addChild(made);
  107   			}
  108   			return description;
  109   		} else if (test instanceof Describable) {
  110   			Describable adapter= (Describable) test;
  111   			return adapter.getDescription();
  112   		} else if (test instanceof TestDecorator) {
  113   			TestDecorator decorator= (TestDecorator) test;
  114   			return makeDescription(decorator.getTest());
  115   		} else {
  116   			// This is the best we can do in this case
  117   			return Description.createSuiteDescription(test.getClass());
  118   		}
  119   	}
  120   
  121   	private static String createSuiteDescription(TestSuite ts) {
  122   		int count= ts.countTestCases();
  123   		String example = count == 0 ? "" : String.format(" [example: %s]", ts.testAt(0));
  124   		return String.format("TestSuite with %s tests%s", count, example);
  125   	}
  126   
  127   	public void filter(Filter filter) throws NoTestsRemainException {
  128   		if (getTest() instanceof Filterable) {
  129   			Filterable adapter= (Filterable) getTest();
  130   			adapter.filter(filter);
  131   		} else if (getTest() instanceof TestSuite) {
  132   			TestSuite suite= (TestSuite) getTest();
  133   			TestSuite filtered= new TestSuite(suite.getName());
  134   			int n= suite.testCount();
  135   			for (int i= 0; i < n; i++) {
  136   				Test test= suite.testAt(i);
  137   				if (filter.shouldRun(makeDescription(test)))
  138   					filtered.addTest(test);
  139   			}
  140   			setTest(filtered);
  141   		}
  142   	}
  143   
  144   	public void sort(Sorter sorter) {
  145   		if (getTest() instanceof Sortable) {
  146   			Sortable adapter= (Sortable) getTest();
  147   			adapter.sort(sorter);
  148   		}
  149   	}
  150   
  151   	private void setTest(Test test) {
  152   		fTest = test;
  153   	}
  154   
  155   	private Test getTest() {
  156   		return fTest;
  157   	}
  158   }

Save This Page
Home » JUnit-4.7 » org.junit.internal.runners » [javadoc | source]