1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.reflect;
18
19 import junit.framework.TestCase;
20
21 import java.lang.reflect.ParameterizedType;
22 import java.lang.reflect.Type;
23 import java.util.List;
24 import java.util.Map;
25
26
27
28
29
30
31 public class TypeResolverTest extends TestCase {
32
33 public void testWhere_noMapping() {
34 Type t = aTypeVariable();
35 assertEquals(t, new TypeResolver().resolveType(t));
36 }
37
38 public void testWhere_typeVariableMapping() {
39 Type t = aTypeVariable();
40 assertEquals(String.class, new TypeResolver().where(t, String.class).resolveType(t));
41 }
42
43 public <T> void testWhere_indirectMapping() {
44 Type t1 = new TypeCapture<T>() {}.capture();
45 Type t2 = aTypeVariable();
46 assertEquals(String.class,
47 new TypeResolver().where(t1, t2).where(t2, String.class).resolveType(t1));
48 }
49
50 public void testWhere_typeVariableSelfMapping() {
51 TypeResolver resolver = new TypeResolver();
52 Type t = aTypeVariable();
53 assertEquals(t, resolver.where(t, t).resolveType(t));
54 }
55
56 public <T> void testWhere_parameterizedSelfMapping() {
57 TypeResolver resolver = new TypeResolver();
58 Type t = new TypeCapture<List<T>>() {}.capture();
59 assertEquals(t, resolver.where(t, t).resolveType(t));
60 }
61
62 public <T> void testWhere_genericArraySelfMapping() {
63 TypeResolver resolver = new TypeResolver();
64 Type t = new TypeCapture<T[]>() {}.capture();
65 assertEquals(t, resolver.where(t, t).resolveType(t));
66 }
67
68 public <T> void testWhere_rawClassSelfMapping() {
69 TypeResolver resolver = new TypeResolver();
70 assertEquals(String.class,
71 resolver.where(String.class, String.class).resolveType(String.class));
72 }
73
74 public <T> void testWhere_wildcardSelfMapping() {
75 TypeResolver resolver = new TypeResolver();
76 Type t = aWildcardType();
77 assertEquals(t, resolver.where(t, t).resolveType(t));
78 }
79
80 public <T> void testWhere_duplicateMapping() {
81 Type t = aTypeVariable();
82 TypeResolver resolver = new TypeResolver().where(t, String.class);
83 try {
84 resolver.where(t, String.class);
85 fail();
86 } catch (IllegalArgumentException expected) {}
87 }
88
89 public <T1, T2 extends List<T1>> void testWhere_recursiveMapping() {
90 Type t1 = new TypeCapture<T1>() {}.capture();
91 Type t2 = new TypeCapture<T2>() {}.capture();
92 assertEquals(t2, new TypeResolver().where(t1, t2).resolveType(t1));
93 }
94
95 public <T> void testWhere_genericArrayMapping() {
96 Type t = new TypeCapture<T>() {}.capture();
97 assertEquals(String.class, new TypeResolver()
98 .where(new TypeCapture<T[]>() {}.capture(), String[].class)
99 .resolveType(t));
100 }
101
102 public <T> void testWhere_primitiveArrayMapping() {
103 Type t = new TypeCapture<T>() {}.capture();
104 assertEquals(int.class,
105 new TypeResolver().where(new TypeCapture<T[]>() {}.capture(), int[].class).resolveType(t));
106 }
107
108 public <T> void testWhere_parameterizedTypeMapping() {
109 Type t = new TypeCapture<T>() {}.capture();
110 assertEquals(String.class, new TypeResolver()
111 .where(new TypeCapture<List<T>>() {}.capture(),
112 new TypeCapture<List<String>>() {}.capture())
113 .resolveType(t));
114 assertEquals(Types.subtypeOf(String.class), new TypeResolver()
115 .where(new TypeCapture<List<T>>() {}.capture(),
116 new TypeCapture<List<? extends String>>() {}.capture())
117 .resolveType(t));
118 assertEquals(Types.supertypeOf(String.class), new TypeResolver()
119 .where(new TypeCapture<List<T>>() {}.capture(),
120 new TypeCapture<List<? super String>>() {}.capture())
121 .resolveType(t));
122 }
123
124 public <T> void testWhere_wildcardTypeMapping() {
125 Type t = new TypeCapture<T>() {}.capture();
126 assertEquals(String.class, new TypeResolver()
127 .where(new TypeCapture<List<? extends T>>() {}.capture(),
128 new TypeCapture<List<? extends String>>() {}.capture())
129 .resolveType(t));
130 assertEquals(String.class, new TypeResolver()
131 .where(new TypeCapture<List<? super T>>() {}.capture(),
132 new TypeCapture<List<? super String>>() {}.capture())
133 .resolveType(t));
134 }
135
136 public <T> void testWhere_incompatibleGenericArrayMapping() {
137 try {
138 new TypeResolver().where(new TypeCapture<T[]>() {}.capture(), String.class);
139 fail();
140 } catch (IllegalArgumentException expected) {}
141 }
142
143 public <T> void testWhere_incompatibleParameterizedTypeMapping() {
144 try {
145 new TypeResolver().where(new TypeCapture<Iterable<T>>() {}.capture(), List.class);
146 fail();
147 } catch (IllegalArgumentException expected) {}
148 }
149
150 public <T> void testWhere_impossibleParameterizedTypeMapping() {
151 try {
152 new TypeResolver().where(
153 new TypeCapture<List<T>>() {}.capture(),
154 new TypeCapture<Map<String, Integer>>() {}.capture());
155 fail();
156 } catch (IllegalArgumentException expected) {}
157 }
158
159 public <T> void testWhere_incompatibleWildcardUpperBound() {
160 try {
161 new TypeResolver().where(
162 new TypeCapture<List<? extends String>>() {}.capture(),
163 new TypeCapture<List<? extends Integer>>() {}.capture());
164 fail();
165 } catch (IllegalArgumentException expected) {}
166 }
167
168 public <T> void testWhere_incompatibleWildcardLowerBound() {
169 try {
170 new TypeResolver().where(
171 new TypeCapture<List<? super String>>() {}.capture(),
172 new TypeCapture<List<? super Integer>>() {}.capture());
173 fail();
174 } catch (IllegalArgumentException expected) {}
175 }
176
177 public <T> void testWhere_incompatibleWildcardBounds() {
178 try {
179 new TypeResolver().where(
180 new TypeCapture<List<? extends T>>() {}.capture(),
181 new TypeCapture<List<? super String>>() {}.capture());
182 fail();
183 } catch (IllegalArgumentException expected) {}
184 }
185
186 public <T> void testWhere_wrongOrder() {
187 try {
188 new TypeResolver().where(String.class, aTypeVariable());
189 fail();
190 } catch (IllegalArgumentException expected) {}
191 }
192
193 public <T> void testWhere_mapFromConcreteParameterizedType() {
194 try {
195 new TypeResolver().where(new TypeCapture<List<String>>() {}.capture(), aTypeVariable());
196 fail();
197 } catch (IllegalArgumentException expected) {}
198 }
199
200 public <T> void testWhere_mapFromConcreteGenericArrayType() {
201 try {
202 new TypeResolver().where(new TypeCapture<List<String>>() {}.capture(), aTypeVariable());
203 fail();
204 } catch (IllegalArgumentException expected) {}
205 }
206
207 private static <T> Type aTypeVariable() {
208 return new TypeCapture<T>() {}.capture();
209 }
210
211 private static <T> Type aWildcardType() {
212 ParameterizedType parameterizedType = (ParameterizedType)
213 new TypeCapture<List<? extends T>>() {}.capture();
214 return parameterizedType.getActualTypeArguments()[0];
215 }
216 }