Skip to content

Commit

Permalink
Added support for iterable datapoints
Browse files Browse the repository at this point in the history
  • Loading branch information
pimterry committed Apr 1, 2013
1 parent 540fa75 commit b421d0e
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 6 deletions.
Expand Up @@ -4,6 +4,7 @@
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.junit.Assume;
Expand Down Expand Up @@ -76,9 +77,11 @@ private void addMultiPointMethods(ParameterSignature sig, List<PotentialAssignme
for (FrameworkMethod dataPointsMethod : getDataPointsMethods(sig)) {
Class<?> returnType = dataPointsMethod.getReturnType();

if (returnType.isArray() && sig.canPotentiallyAcceptType(returnType.getComponentType())) {
if ((returnType.isArray() && sig.canPotentiallyAcceptType(returnType.getComponentType())) ||
Iterable.class.isAssignableFrom(returnType)) {
try {
addArrayValues(sig, dataPointsMethod.getName(), list, dataPointsMethod.invokeExplosively(null));
addDataPointsValues(returnType, sig, dataPointsMethod.getName(), list,
dataPointsMethod.invokeExplosively(null));
} catch (Throwable throwable) {
DataPoints annotation = dataPointsMethod.getAnnotation(DataPoints.class);
if (annotation != null && isAssignableToAnyOf(annotation.ignoredExceptions(), throwable)) {
Expand All @@ -101,9 +104,10 @@ private void addSinglePointMethods(ParameterSignature sig, List<PotentialAssignm

private void addMultiPointFields(ParameterSignature sig, List<PotentialAssignment> list) {
for (final Field field : getDataPointsFields(sig)) {
addArrayValues(sig, field.getName(), list, getStaticFieldValue(field));
Class<?> type = field.getType();
addDataPointsValues(type, sig, field.getName(), list, getStaticFieldValue(field));
}
}
}

private void addSinglePointFields(ParameterSignature sig, List<PotentialAssignment> list) {
for (final Field field : getSingleDataPointFields(sig)) {
Expand All @@ -114,6 +118,16 @@ private void addSinglePointFields(ParameterSignature sig, List<PotentialAssignme
}
}
}

private void addDataPointsValues(Class<?> type, ParameterSignature sig, String name,
List<PotentialAssignment> list, Object value) {
if (type.isArray()) {
addArrayValues(sig, name, list, value);
}
else if (Iterable.class.isAssignableFrom(type)) {
addIterableValues(sig, name, list, (Iterable<?>) value);
}
}

private void addArrayValues(ParameterSignature sig, String name, List<PotentialAssignment> list, Object array) {
for (int i = 0; i < Array.getLength(array); i++) {
Expand All @@ -123,6 +137,18 @@ private void addArrayValues(ParameterSignature sig, String name, List<PotentialA
}
}
}

private void addIterableValues(ParameterSignature sig, String name, List<PotentialAssignment> list, Iterable<?> iterable) {
Iterator<?> iterator = iterable.iterator();
int i = 0;
while (iterator.hasNext()) {
Object value = iterator.next();
if (sig.canAcceptValue(value)) {
list.add(PotentialAssignment.forValue(name + "[" + i + "]", value));
}
i += 1;
}
}

private Object getStaticFieldValue(final Field field) {
try {
Expand Down
Expand Up @@ -6,6 +6,7 @@
import static org.junit.Assert.assertThat;
import static org.junit.tests.experimental.theories.TheoryTestUtils.potentialAssignments;

import java.util.Arrays;
import java.util.List;

import org.junit.Rule;
Expand All @@ -23,7 +24,6 @@ public class AllMembersSupplierTest {
@Rule
public ExpectedException expected = ExpectedException.none();


public static class HasDataPointsArrayField {
@DataPoints
public static String[] list = new String[] { "qwe", "asd" };
Expand Down Expand Up @@ -153,4 +153,57 @@ private List<PotentialAssignment> allMemberValuesFor(Class<?> testClass,
testClass.getConstructor(constructorParameterTypes))
.get(0));
}
}

public static class HasDataPointsListField {
@DataPoints
public static List<String> list = Arrays.asList("one", "two");

@Theory
public void theory(String param) {
}
}

@Test
public void dataPointsCollectionFieldsShouldBeRecognized() throws Throwable {
List<PotentialAssignment> assignments = potentialAssignments(
HasDataPointsListField.class.getMethod("theory", String.class));

assertEquals(2, assignments.size());
}

public static class HasDataPointsListMethod {
@DataPoints
public static List<String> getList() {
return Arrays.asList("one", "two");
}

@Theory
public void theory(String param) {
}
}

@Test
public void dataPointsCollectionMethodShouldBeRecognized() throws Throwable {
List<PotentialAssignment> assignments = potentialAssignments(
HasDataPointsListMethod.class.getMethod("theory", String.class));

assertEquals(2, assignments.size());
}

public static class HasDataPointsListFieldWithOverlyGenericTypes {
@DataPoints
public static List<Object> list = Arrays.asList("string", new Object());

@Theory
public void theory(String param) {
}
}

@Test
public void dataPointsCollectionShouldBeRecognizedIgnoringStrangeTypes() throws Throwable {
List<PotentialAssignment> assignments = potentialAssignments(
HasDataPointsListFieldWithOverlyGenericTypes.class.getMethod("theory", String.class));

assertEquals(1, assignments.size());
}
}

0 comments on commit b421d0e

Please sign in to comment.