package component.generics;
import com.flextrade.jfixture.JFixture;
import com.flextrade.jfixture.utility.SpecimenType;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.assertTrue;
// These tests mostly come from use cases that have
// been found to cause errors. Due to Type Erasure
// in the JVM handling generics is quite complex
// so I want to a keep a suite of tests that cover
// issues as they arise to ensure we don't have a regression
public class TestComplexGenerics {
JFixture fixture = new JFixture();
@Test
public void can_construct_types_with_multiple_levels_of_generic_types_with_a_list() {
SpecimenType<FooWithBarWithList<String>> type = new SpecimenType<FooWithBarWithList<String>>(){};
FooWithBarWithList<String> instance = fixture.create(type);
assertTrue(instance != null);
assertTrue(instance.bar != null);
assertTrue(instance.bar.list != null);
assertTrue(instance.bar.list.size() > 0);;
assertTrue(instance.bar.list.get(0) instanceof String);
}
@Test
public void can_construct_types_with_multiple_levels_of_generic_types_with_a_single_value() {
SpecimenType<FooWithBarWithValue<String>> type = new SpecimenType<FooWithBarWithValue<String>>(){};
FooWithBarWithValue<String> instance = fixture.create(type);
assertTrue(instance != null);
assertTrue(instance.bar != null);
assertTrue(instance.bar.value != null);
assertTrue(instance.bar.value instanceof String);
}
public static class FooWithBarWithList<T> {
private BarWithList<T> bar;
public FooWithBarWithList(BarWithList<T> bar) {
this.bar = bar;
}
}
public static class BarWithList<T> {
private List<T> list;
public BarWithList(List<T> list) {
this.list = list;
}
}
public static class FooWithBarWithValue<T> {
private BarWithValue<T> bar;
public FooWithBarWithValue(BarWithValue<T> bar) {
this.bar = bar;
}
}
public static class BarWithValue<T> {
private T value;
public BarWithValue(T value) {
this.value = value;
}
}
}