carbidecpp20devenv/plugins/org.eclipse.test.source_3.3.0.v20080507/src/org.junit4_4.3.1/junitsrc/org/junit/runners/Parameterized.java
author cawthron
Wed, 18 Mar 2009 17:21:00 -0500
changeset 1 82d1d1de1a01
permissions -rw-r--r--
import Carbide.c++
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     1
package org.junit.runners;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     2
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     3
import static org.junit.Assert.assertEquals;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     4
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     5
import java.lang.annotation.Annotation;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     6
import java.lang.annotation.ElementType;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     7
import java.lang.annotation.Retention;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     8
import java.lang.annotation.RetentionPolicy;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     9
import java.lang.annotation.Target;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    10
import java.lang.reflect.Constructor;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    11
import java.lang.reflect.InvocationTargetException;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    12
import java.lang.reflect.Method;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    13
import java.lang.reflect.Modifier;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    14
import java.util.ArrayList;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    15
import java.util.Collection;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    16
import java.util.List;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    17
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    18
import org.junit.internal.runners.CompositeRunner;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    19
import org.junit.internal.runners.MethodValidator;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    20
import org.junit.internal.runners.TestClassMethodsRunner;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    21
import org.junit.internal.runners.TestClassRunner;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    22
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    23
/** <p>The custom runner <code>Parameterized</code> implements parameterized
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    24
 * tests. When running a parameterized test class, instances are created for the
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    25
 * cross-product of the test methods and the test data elements.</p>
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    26
 * 
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    27
 * For example, to test a Fibonacci function, write:
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    28
 * <pre>
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    29
 * &#064;RunWith(Parameterized.class)
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    30
 * public class FibonacciTest {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    31
 *    &#064;Parameters
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    32
 *    public static Collection<Object[]> data() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    33
 *          return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    34
 *             { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    35
 *    }
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    36
 *
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    37
 *    private int fInput;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    38
 *    private int fExpected;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    39
 *
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    40
 *    public FibonacciTest(int input, int expected) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    41
 *       fInput= input;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    42
 *       fExpected= expected;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    43
 *    }
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    44
 *
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    45
 *    &#064;Test public void test() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    46
 *       assertEquals(fExpected, Fibonacci.compute(fInput));
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    47
 *    }
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    48
 * }
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    49
 * </pre>
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    50
 * 
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    51
 * <p>Each instance of <code>FibonacciTest</code> will be constructed using the two-argument
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    52
 * constructor and the data values in the <code>&#064;Parameters</code> method.</p>
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    53
 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    54
public class Parameterized extends TestClassRunner {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    55
	@Retention(RetentionPolicy.RUNTIME)
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    56
	@Target(ElementType.METHOD)
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    57
	public static @interface Parameters {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    58
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    59
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    60
	public static Collection<Object[]> eachOne(Object... params) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    61
		List<Object[]> results= new ArrayList<Object[]>();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    62
		for (Object param : params)
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    63
			results.add(new Object[] { param });
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    64
		return results;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    65
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    66
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    67
	// TODO: single-class this extension
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    68
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    69
	private static class TestClassRunnerForParameters extends TestClassMethodsRunner {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    70
		private final Object[] fParameters;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    71
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    72
		private final int fParameterSetNumber;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    73
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    74
		private final Constructor<?> fConstructor;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    75
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    76
		private TestClassRunnerForParameters(Class<?> klass, Object[] parameters, int i) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    77
			super(klass);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    78
			fParameters= parameters;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    79
			fParameterSetNumber= i;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    80
			fConstructor= getOnlyConstructor();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    81
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    82
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    83
		@Override
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    84
		protected Object createTest() throws Exception {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    85
			return fConstructor.newInstance(fParameters);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    86
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    87
		
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    88
		@Override
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    89
		protected String getName() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    90
			return String.format("[%s]", fParameterSetNumber);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    91
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    92
		
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    93
		@Override
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    94
		protected String testName(final Method method) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    95
			return String.format("%s[%s]", method.getName(), fParameterSetNumber);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    96
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    97
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    98
		private Constructor<?> getOnlyConstructor() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    99
			Constructor<?>[] constructors= getTestClass().getConstructors();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   100
			assertEquals(1, constructors.length);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   101
			return constructors[0];
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   102
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   103
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   104
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   105
	// TODO: I think this now eagerly reads parameters, which was never the point.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   106
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   107
	public static class RunAllParameterMethods extends CompositeRunner {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   108
		private final Class<?> fKlass;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   109
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   110
		public RunAllParameterMethods(Class<?> klass) throws Exception {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   111
			super(klass.getName());
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   112
			fKlass= klass;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   113
			int i= 0;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   114
			for (final Object each : getParametersList()) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   115
				if (each instanceof Object[])
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   116
					super.add(new TestClassRunnerForParameters(klass, (Object[])each, i++));
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   117
				else
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   118
					throw new Exception(String.format("%s.%s() must return a Collection of arrays.", fKlass.getName(), getParametersMethod().getName()));
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   119
			}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   120
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   121
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   122
		private Collection<?> getParametersList() throws IllegalAccessException, InvocationTargetException, Exception {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   123
			return (Collection<?>) getParametersMethod().invoke(null);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   124
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   125
		
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   126
		private Method getParametersMethod() throws Exception {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   127
			for (Method each : fKlass.getMethods()) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   128
				if (Modifier.isStatic(each.getModifiers())) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   129
					Annotation[] annotations= each.getAnnotations();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   130
					for (Annotation annotation : annotations) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   131
						if (annotation.annotationType() == Parameters.class)
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   132
							return each;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   133
					}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   134
				}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   135
			}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   136
			throw new Exception("No public static parameters method on class "
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   137
					+ getName());
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   138
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   139
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   140
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   141
	public Parameterized(final Class<?> klass) throws Exception {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   142
		super(klass, new RunAllParameterMethods(klass));
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   143
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   144
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   145
	@Override
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   146
	protected void validate(MethodValidator methodValidator) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   147
		methodValidator.validateStaticMethods();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   148
		methodValidator.validateInstanceMethods();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   149
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   150
}