From: David S. <ds...@us...> - 2006-10-18 17:07:10
|
Update of /cvsroot/junit/junit/org/junit/runners In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv7311/org/junit/runners Modified Files: Tag: saff_r41_runner_refactoring Parameterized.java Added Files: Tag: saff_r41_runner_refactoring ParameterizedInterpreter.java Log Message: BeforeAndAfterRunner is no more --- NEW FILE: ParameterizedInterpreter.java --- /** * */ package org.junit.runners; import static org.junit.Assert.*; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.junit.internal.runners.JavaClass; import org.junit.internal.runners.JavaMethod; import org.junit.internal.runners.JavaTestInterpreter; class ParameterizedInterpreter extends JavaTestInterpreter { private final Object fEach; private final int fNumber; ParameterizedInterpreter(Object each, int number) { fEach= each; fNumber= number; } @Override public JavaClass interpretJavaClass(Class<?> superclass) { return new JavaClass(superclass) { // TODO: too many exceptions @Override protected Object newInstance() throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { return getOnlyConstructor().newInstance( (Object[]) fEach); } @Override public String getName() { return String.format("[%s]", fNumber); } @Override protected JavaMethod makeJavaMethod(Method method) { return new JavaMethod(this, method) { @Override public String getName() { return String.format("%s[%s]", super.getName(), fNumber); } }; } private Constructor getOnlyConstructor() { Constructor[] constructors= getTestClass() .getConstructors(); assertEquals(1, constructors.length); return constructors[0]; } }; } } Index: Parameterized.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/runners/Parameterized.java,v retrieving revision 1.5.2.1 retrieving revision 1.5.2.2 diff -u -d -r1.5.2.1 -r1.5.2.2 --- Parameterized.java 17 Oct 2006 19:08:40 -0000 1.5.2.1 +++ Parameterized.java 18 Oct 2006 17:07:05 -0000 1.5.2.2 @@ -1,58 +1,61 @@ package org.junit.runners; -import static org.junit.Assert.*; - -import java.lang.annotation.Annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.junit.internal.runners.CompositeRunner; import org.junit.internal.runners.JavaClass; -import org.junit.internal.runners.JavaModelElement; +import org.junit.internal.runners.JavaMethod; import org.junit.internal.runners.JavaTestInterpreter; import org.junit.internal.runners.MethodValidator; import org.junit.internal.runners.TestClassMethodsRunner; import org.junit.internal.runners.TestClassRunner; -/** <p>The custom runner <code>Parameterized</code> implements parameterized +/** + * <p> + * The custom runner <code>Parameterized</code> implements parameterized * tests. When running a parameterized test class, instances are created for the - * cross-product of the test methods and the test data elements.</p> + * cross-product of the test methods and the test data elements. + * </p> * * For example, to test a Fibonacci function, write: + * * <pre> - * @RunWith(Parameterized.class) + * @RunWith(Parameterized.class) * public class FibonacciTest { - * @Parameters - * public static Collection<Object[]> data() { - * return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 }, - * { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } }); - * } - * - * private int fInput; - * private int fExpected; - * - * public FibonacciTest(int input, int expected) { - * fInput= input; - * fExpected= expected; - * } - * - * @Test public void test() { - * assertEquals(fExpected, Fibonacci.compute(fInput)); - * } + * @Parameters + * public static Collection<Object[]> data() { + * return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 }, + * { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } }); + * } + * + * private int fInput; + * + * private int fExpected; + * + * public FibonacciTest(int input, int expected) { + * fInput= input; + * fExpected= expected; + * } + * + * @Test + * public void test() { + * assertEquals(fExpected, Fibonacci.compute(fInput)); + * } * } * </pre> * - * <p>Each instance of <code>FibonacciTest</code> will be constructed using the two-argument - * constructor and the data values in the <code>@Parameters</code> method.</p> + * <p> + * Each instance of <code>FibonacciTest</code> will be constructed using the + * two-argument constructor and the data values in the + * <code>@Parameters</code> method. + * </p> */ public class Parameterized extends TestClassRunner { @Retention(RetentionPolicy.RUNTIME) @@ -67,87 +70,60 @@ return results; } - // TODO: single-class this extension - - private static class TestClassRunnerForParameters extends TestClassMethodsRunner { - private final Object[] fParameters; - - private final int fParameterSetNumber; + public Parameterized(final Class<?> klass) throws Exception { + super(klass, buildCompositeRunner(new JavaClass(klass))); + } - private final Constructor fConstructor; + // TODO: I think this now eagerly reads parameters, which was never the + // point. - private TestClassRunnerForParameters(JavaClass klass, Object[] parameters, int i) { - super(klass, new JavaTestInterpreter()); - fParameters= parameters; - fParameterSetNumber= i; - fConstructor= getOnlyConstructor(); + // TODO: pull interpreter back in? + private static CompositeRunner buildCompositeRunner( + final JavaClass klass) throws Exception { + CompositeRunner runner= new CompositeRunner(klass.getName()); + int i= 0; + for (final Object each : getParametersList(klass)) { + if (each instanceof Object[]) { + final int parameterSetNumber= i++; + JavaTestInterpreter interpreter= new ParameterizedInterpreter( + each, parameterSetNumber); + runner + .add(new TestClassMethodsRunner(interpreter + .interpretJavaClass(klass.getTestClass()), + interpreter)); + } else + throw new Exception(String.format( + "%s.%s() must return a Collection of arrays.", klass + .getName(), getParametersMethod(klass) + .getName())); } + return runner; + } - @Override - protected Object createTest() throws Exception { - return fConstructor.newInstance(fParameters); - } - - @Override - protected String getName() { - return String.format("[%s]", fParameterSetNumber); - } - - @Override - protected String testName(final JavaModelElement method) { - return String.format("%s[%s]", method.getName(), fParameterSetNumber); - } + @Override + protected void validate(MethodValidator methodValidator) { + methodValidator.validateStaticMethods(); + methodValidator.validateInstanceMethods(); + } - private Constructor getOnlyConstructor() { - Constructor[] constructors= getTestClass().getTestClass().getConstructors(); - assertEquals(1, constructors.length); - return constructors[0]; - } + // TODO: make non-static + static private Collection getParametersList(JavaClass javaClass) + throws IllegalAccessException, InvocationTargetException, Exception { + return (Collection) getParametersMethod(javaClass).invoke(null); } - - // TODO: I think this now eagerly reads parameters, which was never the point. - - public static class RunAllParameterMethods extends CompositeRunner { - private final JavaClass fKlass; - public RunAllParameterMethods(JavaClass klass) throws Exception { - super(klass.getName()); - fKlass= klass; - int i= 0; - for (final Object each : getParametersList()) { - if (each instanceof Object[]) - super.add(new TestClassRunnerForParameters(klass, (Object[])each, i++)); - else - throw new Exception(String.format("%s.%s() must return a Collection of arrays.", fKlass.getName(), getParametersMethod().getName())); - } - } + static private JavaMethod getParametersMethod(JavaClass javaClass) + throws Exception { + // TODO: is this DUP? + List<JavaMethod> methods= javaClass.getMethods(Parameters.class, + new JavaTestInterpreter()); - private Collection getParametersList() throws IllegalAccessException, InvocationTargetException, Exception { - return (Collection) getParametersMethod().invoke(null); - } - - private Method getParametersMethod() throws Exception { - for (Method each : fKlass.getTestClass().getMethods()) { - if (Modifier.isStatic(each.getModifiers())) { - Annotation[] annotations= each.getAnnotations(); - for (Annotation annotation : annotations) { - if (annotation.annotationType() == Parameters.class) - return each; - } - } + for (JavaMethod each : methods) { + if (each.isStatic() && each.isPublic()) { + return each; } - throw new Exception("No public static parameters method on class " - + getName()); } - } - - public Parameterized(final Class<?> klass) throws Exception { - super(klass, new RunAllParameterMethods(new JavaClass(klass))); - } - - @Override - protected void validate(MethodValidator methodValidator) { - methodValidator.validateStaticMethods(); - methodValidator.validateInstanceMethods(); + throw new Exception("No public static parameters method on class " + + javaClass.getName()); } } |