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 }