package org.junit.tests.experimental.theories.runner; import static org.junit.Assert.assertEquals; import static org.junit.tests.experimental.theories.TheoryTestUtils.potentialAssignments; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.theories.ParameterSignature; import org.junit.experimental.theories.ParameterSupplier; import org.junit.experimental.theories.ParametersSuppliedBy; import org.junit.experimental.theories.PotentialAssignment; import org.junit.experimental.theories.Theories; import org.junit.experimental.theories.Theory; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.junit.runners.model.InitializationError; import org.junit.runners.model.TestClass; public class WithParameterSupplier { @Rule public ExpectedException expected = ExpectedException.none(); private static class SimplePotentialAssignment extends PotentialAssignment { private String description; private Object value; public SimplePotentialAssignment(Object value, String description) { this.value = value; this.description = description; } @Override public Object getValue() throws CouldNotGenerateValueException { return value; } @Override public String getDescription() throws CouldNotGenerateValueException { return description; } } private static final List<String> DATAPOINTS = Arrays.asList("qwe", "asd"); public static class SimpleSupplier extends ParameterSupplier { @Override public List<PotentialAssignment> getValueSources(ParameterSignature sig) { List<PotentialAssignment> assignments = new ArrayList<PotentialAssignment>(); for (String datapoint : DATAPOINTS) { assignments.add(new SimplePotentialAssignment(datapoint, datapoint)); } return assignments; } } @RunWith(Theories.class) public static class TestClassUsingParameterSupplier { @Theory public void theoryMethod(@ParametersSuppliedBy(SimpleSupplier.class) String param) { } } @Test public void shouldPickUpDataPointsFromParameterSupplier() throws Throwable { List<PotentialAssignment> assignments = potentialAssignments(TestClassUsingParameterSupplier.class .getMethod("theoryMethod", String.class)); assertEquals(2, assignments.size()); assertEquals(DATAPOINTS.get(0), assignments.get(0).getValue()); assertEquals(DATAPOINTS.get(1), assignments.get(1).getValue()); } public static class SupplierWithUnknownConstructor extends ParameterSupplier { public SupplierWithUnknownConstructor(String param) { } @Override public List<PotentialAssignment> getValueSources(ParameterSignature sig) { return null; } } @RunWith(Theories.class) public static class TestClassUsingSupplierWithUnknownConstructor { @Theory public void theory(@ParametersSuppliedBy(SupplierWithUnknownConstructor.class) String param) { } } @Test public void shouldRejectSuppliersWithUnknownConstructors() throws Exception { expected.expect(InitializationError.class); new Theories(TestClassUsingSupplierWithUnknownConstructor.class); } public static class SupplierWithTwoConstructors extends ParameterSupplier { public SupplierWithTwoConstructors(String param) { } @Override public List<PotentialAssignment> getValueSources(ParameterSignature sig) { return null; } } @RunWith(Theories.class) public static class TestClassUsingSupplierWithTwoConstructors { @Theory public void theory(@ParametersSuppliedBy(SupplierWithTwoConstructors.class) String param) { } } @Test public void shouldRejectSuppliersWithTwoConstructors() throws Exception { expected.expect(InitializationError.class); new Theories(TestClassUsingSupplierWithTwoConstructors.class); } public static class SupplierWithTestClassConstructor extends ParameterSupplier { public SupplierWithTestClassConstructor(TestClass param) { } @Override public List<PotentialAssignment> getValueSources(ParameterSignature sig) { return null; } } @RunWith(Theories.class) public static class TestClassUsingSupplierWithTestClassConstructor { @Theory public void theory(@ParametersSuppliedBy(SupplierWithTestClassConstructor.class) String param) { } } @Test public void shouldAcceptSuppliersWithTestClassConstructor() throws Exception { new Theories(TestClassUsingSupplierWithTestClassConstructor.class); } }