1 package org.junit.tests.experimental.theories.internal; 2 3 import static org.hamcrest.CoreMatchers.hasItem; 4 import static org.hamcrest.CoreMatchers.hasItems; 5 import static org.junit.Assert.assertEquals; 6 import static org.junit.Assert.assertThat; 7 8 import java.util.ArrayList; 9 import java.util.List; 10 11 import org.junit.Test; 12 import org.junit.experimental.theories.DataPoint; 13 import org.junit.experimental.theories.DataPoints; 14 import org.junit.experimental.theories.FromDataPoints; 15 import org.junit.experimental.theories.ParameterSignature; 16 import org.junit.experimental.theories.PotentialAssignment; 17 import org.junit.experimental.theories.PotentialAssignment.CouldNotGenerateValueException; 18 import org.junit.experimental.theories.internal.SpecificDataPointsSupplier; 19 import org.junit.runners.model.TestClass; 20 21 public class SpecificDataPointsSupplierTest { 22 23 public static class TestClassWithNamedDataPoints { 24 25 @DataPoints({"field", "named"}) 26 public static String[] values = new String[] { "named field" }; 27 28 @DataPoints 29 public static String[] otherValues = new String[] { "other" }; 30 31 @DataPoints({"method", "named"}) 32 public static String[] getValues() { 33 return new String[] { "named method" }; 34 } 35 36 @DataPoint({"single", "named"}) 37 public static String singleValue = "named single value"; 38 39 @DataPoint 40 public static String otherSingleValue = "other value"; 41 42 @DataPoint({"singlemethod", "named"}) 43 public static String getSingleValue() { 44 return "named single method value"; 45 } 46 47 @DataPoint 48 public static String getSingleOtherValue() { 49 return "other single method value"; 50 } 51 52 @DataPoints 53 public static String[] getOtherValues() { 54 return new String[] { "other method" }; 55 } 56 } 57 58 @Test 59 public void shouldReturnOnlyTheNamedDataPoints() throws Throwable { 60 SpecificDataPointsSupplier supplier = new SpecificDataPointsSupplier(new TestClass(TestClassWithNamedDataPoints.class)); 61 62 List<PotentialAssignment> assignments = supplier.getValueSources(signature("methodWantingAllNamedStrings")); 63 List<String> assignedStrings = getStringValuesFromAssignments(assignments); 64 65 assertEquals(4, assignedStrings.size()); 66 assertThat(assignedStrings, hasItems("named field", "named method", "named single value", "named single method value")); 67 } 68 69 @Test 70 public void shouldReturnOnlyTheNamedFieldDataPoints() throws Throwable { 71 SpecificDataPointsSupplier supplier = new SpecificDataPointsSupplier(new TestClass(TestClassWithNamedDataPoints.class)); 72 73 List<PotentialAssignment> assignments = supplier.getValueSources(signature("methodWantingNamedFieldString")); 74 List<String> assignedStrings = getStringValuesFromAssignments(assignments); 75 76 assertEquals(1, assignedStrings.size()); 77 assertThat(assignedStrings, hasItem("named field")); 78 } 79 80 @Test 81 public void shouldReturnOnlyTheNamedMethodDataPoints() throws Throwable { 82 SpecificDataPointsSupplier supplier = new SpecificDataPointsSupplier(new TestClass(TestClassWithNamedDataPoints.class)); 83 84 List<PotentialAssignment> assignments = supplier.getValueSources(signature("methodWantingNamedMethodString")); 85 List<String> assignedStrings = getStringValuesFromAssignments(assignments); 86 87 assertEquals(1, assignedStrings.size()); 88 assertThat(assignedStrings, hasItem("named method")); 89 } 90 91 @Test 92 public void shouldReturnOnlyTheNamedSingleFieldDataPoints() throws Throwable { 93 SpecificDataPointsSupplier supplier = new SpecificDataPointsSupplier(new TestClass(TestClassWithNamedDataPoints.class)); 94 95 List<PotentialAssignment> assignments = supplier.getValueSources(signature("methodWantingNamedSingleFieldString")); 96 List<String> assignedStrings = getStringValuesFromAssignments(assignments); 97 98 assertEquals(1, assignedStrings.size()); 99 assertThat(assignedStrings, hasItem("named single value")); 100 } 101 102 @Test 103 public void shouldReturnOnlyTheNamedSingleMethodDataPoints() throws Throwable { 104 SpecificDataPointsSupplier supplier = new SpecificDataPointsSupplier(new TestClass(TestClassWithNamedDataPoints.class)); 105 106 List<PotentialAssignment> assignments = supplier.getValueSources(signature("methodWantingNamedSingleMethodString")); 107 List<String> assignedStrings = getStringValuesFromAssignments(assignments); 108 109 assertEquals(1, assignedStrings.size()); 110 assertThat(assignedStrings, hasItem("named single method value")); 111 } 112 113 @Test 114 public void shouldReturnNothingIfTheNamedDataPointsAreMissing() throws Throwable { 115 SpecificDataPointsSupplier supplier = new SpecificDataPointsSupplier(new TestClass(TestClassWithNamedDataPoints.class)); 116 117 List<PotentialAssignment> assignments = supplier.getValueSources(signature("methodWantingWrongNamedString")); 118 List<String> assignedStrings = getStringValuesFromAssignments(assignments); 119 120 assertEquals(0, assignedStrings.size()); 121 } 122 123 private List<String> getStringValuesFromAssignments(List<PotentialAssignment> assignments) throws CouldNotGenerateValueException { 124 List<String> stringValues = new ArrayList<String>(); 125 for (PotentialAssignment assignment : assignments) { 126 stringValues.add((String) assignment.getValue()); 127 } 128 return stringValues; 129 } 130 131 private ParameterSignature signature(String methodName) throws Exception { 132 return ParameterSignature.signatures(this.getClass().getMethod(methodName, String.class)).get(0); 133 } 134 135 public void methodWantingAnyString(String input) { 136 } 137 138 public void methodWantingNamedFieldString(@FromDataPoints("field") String input) { 139 } 140 141 public void methodWantingNamedMethodString(@FromDataPoints("method") String input) { 142 } 143 144 public void methodWantingNamedSingleFieldString(@FromDataPoints("single") String input) { 145 } 146 147 public void methodWantingNamedSingleMethodString(@FromDataPoints("singlemethod") String input) { 148 } 149 150 public void methodWantingAllNamedStrings(@FromDataPoints("named") String input) { 151 } 152 153 public void methodWantingWrongNamedString(@FromDataPoints("invalid name") String input) { 154 } 155 156 }