1 package org.pojomatic.internal; 2 3 import java.util.Arrays; 4 import java.util.List; 5 import java.util.Set; 6 7 import org.testng.annotations.DataProvider; 8 9 import com.google.common.base.Function; 10 import com.google.common.collect.FluentIterable; 11 import com.google.common.collect.Iterables; 12 import com.google.common.collect.Sets; 13 14 public class TypeProviders { 15 @DataProvider(name = "types") 16 public static Object[][] types() { 17 return FluentIterable.from(Iterables.concat(simpleTypes(), simpleArrays())) 18 .transform(ArrayWrap.INSTANCE) 19 .toArray(Object[].class); 20 } 21 22 @DataProvider(name = "arrayTypes") 23 public static Object[][] arrayTypes() { 24 return annotatedTypes(simpleArrays(), doubleArrays()); 25 } 26 27 @DataProvider(name = "deepArrayTypes") 28 public static Object[][] deepArrayTypes() { 29 return annotatedTypes(doubleArrays()); 30 } 31 32 @SuppressWarnings("unchecked") 33 @DataProvider(name = "annotations") 34 public static Object[][] annotationCombinations() { 35 return FluentIterable.from(Sets.<Object>cartesianProduct(booleans())) 36 .transform(ListToArray.INSTANCE) 37 .toArray(Object[].class); 38 } 39 40 @SafeVarargs 41 @SuppressWarnings("unchecked") 42 private static Object[][] annotatedTypes(Iterable<Type>... types) { 43 return FluentIterable.from( 44 Sets.cartesianProduct(Sets.newLinkedHashSet(Iterables.concat(types)), booleans())) 45 .transform(ListToArray.INSTANCE) 46 .toArray(Object[].class); 47 } 48 49 static Iterable<Type> simpleArrays() { 50 return Iterables.transform(simpleTypes(), Arrayify.INSTANCE); 51 } 52 53 static Iterable<Type> doubleArrays() { 54 return Iterables.transform(simpleArrays(), Arrayify.INSTANCE); 55 } 56 57 private static enum Arrayify implements Function<Type, Type> { 58 INSTANCE { @Override public Type apply(Type type) { return new ArrayType(type); } } 59 } 60 61 private static enum ArrayWrap implements Function<Type, Object[]> { 62 INSTANCE { @Override public Object[] apply(Type type) { return new Object[] { type }; } } 63 } 64 65 private static enum ListToArray implements Function<List<Object>, Object[]> { 66 INSTANCE { @Override public Object[] apply(List<Object> o) { return o.toArray(); } } 67 } 68 69 private static Set<Boolean> booleans() { 70 return Sets.newLinkedHashSet(Arrays.asList(false, true)); 71 } 72 73 private static Iterable<Type> simpleTypes() { 74 return Arrays.<Type>asList(BaseType.values()); 75 } 76 }