View Javadoc
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  }