View Javadoc
1   /*
2    * Copyright (C) 2012 The Guava Authors
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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   * Unit tests of {@link TypeResolver}.
28   *
29   * @author Ben Yu
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 }