View Javadoc

1   package net.sourceforge.pmd.typeresolution;
2   
3   import static org.junit.Assert.assertEquals;
4   import static org.junit.Assert.assertNull;
5   
6   import java.io.InputStream;
7   import java.io.InputStreamReader;
8   import java.util.ArrayList;
9   import java.util.List;
10  
11  import net.sourceforge.pmd.lang.LanguageVersion;
12  import net.sourceforge.pmd.lang.LanguageVersionHandler;
13  import net.sourceforge.pmd.lang.java.ast.ASTAllocationExpression;
14  import net.sourceforge.pmd.lang.java.ast.ASTBooleanLiteral;
15  import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration;
16  import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType;
17  import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
18  import net.sourceforge.pmd.lang.java.ast.ASTExpression;
19  import net.sourceforge.pmd.lang.java.ast.ASTFieldDeclaration;
20  import net.sourceforge.pmd.lang.java.ast.ASTFormalParameter;
21  import net.sourceforge.pmd.lang.java.ast.ASTImportDeclaration;
22  import net.sourceforge.pmd.lang.java.ast.ASTLiteral;
23  import net.sourceforge.pmd.lang.java.ast.ASTNullLiteral;
24  import net.sourceforge.pmd.lang.java.ast.ASTReferenceType;
25  import net.sourceforge.pmd.lang.java.ast.ASTStatementExpression;
26  import net.sourceforge.pmd.lang.java.ast.ASTType;
27  import net.sourceforge.pmd.lang.java.ast.ASTTypeDeclaration;
28  import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclarator;
29  import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclaratorId;
30  import net.sourceforge.pmd.lang.java.ast.TypeNode;
31  import net.sourceforge.pmd.lang.java.typeresolution.ClassTypeResolver;
32  import net.sourceforge.pmd.typeresolution.testdata.AnonymousInnerClass;
33  import net.sourceforge.pmd.typeresolution.testdata.ArrayListFound;
34  import net.sourceforge.pmd.typeresolution.testdata.ExtraTopLevelClass;
35  import net.sourceforge.pmd.typeresolution.testdata.InnerClass;
36  import net.sourceforge.pmd.typeresolution.testdata.Literals;
37  import net.sourceforge.pmd.typeresolution.testdata.Operators;
38  import net.sourceforge.pmd.typeresolution.testdata.Promotion;
39  
40  import org.jaxen.JaxenException;
41  import org.junit.Test;
42  
43  
44  public class ClassTypeResolverTest {
45  
46  	@Test
47  	public void testClassNameExists() {
48  		ClassTypeResolver classTypeResolver = new ClassTypeResolver();
49  		assertEquals(true, classTypeResolver.classNameExists("java.lang.System"));
50  		assertEquals(false, classTypeResolver.classNameExists("im.sure.that.this.does.not.Exist"));
51  		assertEquals(true, classTypeResolver.classNameExists("java.awt.List"));
52  	}
53  
54  	@Test
55  	public void acceptanceTest() {
56  		ASTCompilationUnit acu = parseAndTypeResolveForClass(ArrayListFound.class);
57  		assertEquals(ArrayListFound.class, acu.getFirstDescendantOfType(ASTTypeDeclaration.class).getType());
58  		assertEquals(ArrayListFound.class, acu.getFirstDescendantOfType(ASTClassOrInterfaceDeclaration.class).getType());
59  		ASTImportDeclaration id = acu.getFirstDescendantOfType(ASTImportDeclaration.class);
60  		assertEquals("java.util", id.getPackage().getName());
61  		assertEquals(java.util.ArrayList.class, id.getType());
62  		assertEquals(ArrayList.class, acu.getFirstDescendantOfType(ASTClassOrInterfaceType.class).getType());
63  		assertEquals(ArrayList.class, acu.getFirstDescendantOfType(ASTReferenceType.class).getType());
64  		assertEquals(ArrayList.class, acu.getFirstDescendantOfType(ASTType.class).getType());
65  		assertEquals(ArrayList.class, acu.getFirstDescendantOfType(ASTVariableDeclaratorId.class).getType());
66  		assertEquals(ArrayList.class, acu.getFirstDescendantOfType(ASTVariableDeclarator.class).getType());
67  		assertEquals(ArrayList.class, acu.getFirstDescendantOfType(ASTFieldDeclaration.class).getType());
68  	}
69  
70  	@Test
71  	public void testExtraTopLevelClass() throws ClassNotFoundException {
72  		ASTCompilationUnit acu = parseAndTypeResolveForClass(ExtraTopLevelClass.class);
73  		Class<?> theExtraTopLevelClass = Class.forName("net.sourceforge.pmd.typeresolution.testdata.TheExtraTopLevelClass");
74  		// First class
75  		ASTTypeDeclaration typeDeclaration = (ASTTypeDeclaration)acu.jjtGetChild(1);
76  		assertEquals(ExtraTopLevelClass.class, typeDeclaration.getType());
77  		assertEquals(ExtraTopLevelClass.class,
78  				typeDeclaration.getFirstDescendantOfType(ASTClassOrInterfaceDeclaration.class).getType());
79  		// Second class
80  		typeDeclaration = (ASTTypeDeclaration)acu.jjtGetChild(2);
81  		assertEquals(theExtraTopLevelClass, typeDeclaration.getType());
82  		assertEquals(theExtraTopLevelClass,
83  				typeDeclaration.getFirstDescendantOfType(ASTClassOrInterfaceDeclaration.class).getType());
84  	}
85  
86  	@Test
87  	public void testInnerClass() throws ClassNotFoundException {
88  		ASTCompilationUnit acu = parseAndTypeResolveForClass(InnerClass.class);
89  		Class<?> theInnerClass = Class.forName("net.sourceforge.pmd.typeresolution.testdata.InnerClass$TheInnerClass");
90  		// Outer class
91  		ASTTypeDeclaration typeDeclaration = acu.getFirstDescendantOfType(ASTTypeDeclaration.class);
92  		assertEquals(InnerClass.class, typeDeclaration.getType());
93  		ASTClassOrInterfaceDeclaration outerClassDeclaration = typeDeclaration.getFirstDescendantOfType(ASTClassOrInterfaceDeclaration.class);
94  		assertEquals(InnerClass.class, outerClassDeclaration.getType());
95  		// Inner class
96  		assertEquals(theInnerClass,
97  				outerClassDeclaration.getFirstDescendantOfType(ASTClassOrInterfaceDeclaration.class).getType());
98  		// Method parameter as inner class
99  		ASTFormalParameter formalParameter = typeDeclaration.getFirstDescendantOfType(ASTFormalParameter.class);
100 		assertEquals(theInnerClass, formalParameter.getTypeNode().getType());
101 	}
102 
103 	@Test
104 	public void testAnonymousInnerClass() throws ClassNotFoundException {
105 		ASTCompilationUnit acu = parseAndTypeResolveForClass(AnonymousInnerClass.class);
106 		Class<?> theAnonymousInnerClass = Class.forName("net.sourceforge.pmd.typeresolution.testdata.AnonymousInnerClass$1");
107 		// Outer class
108 		ASTTypeDeclaration typeDeclaration = acu.getFirstDescendantOfType(ASTTypeDeclaration.class);
109 		assertEquals(AnonymousInnerClass.class, typeDeclaration.getType());
110 		ASTClassOrInterfaceDeclaration outerClassDeclaration = typeDeclaration.getFirstDescendantOfType(ASTClassOrInterfaceDeclaration.class);
111 		assertEquals(AnonymousInnerClass.class, outerClassDeclaration.getType());
112 		// Anonymous Inner class
113 		assertEquals(theAnonymousInnerClass,
114 				outerClassDeclaration.getFirstDescendantOfType(ASTAllocationExpression.class).getType());
115 	}
116 
117 	@Test
118 	@SuppressWarnings("unchecked")
119 	public void testLiterals() throws JaxenException {
120 		ASTCompilationUnit acu = parseAndTypeResolveForClass(Literals.class);
121 		List<ASTLiteral> literals = acu.findChildNodesWithXPath("//Literal");
122 		int index = 0;
123 
124 		// String s = "s";
125 		assertEquals(0, literals.get(index).jjtGetNumChildren());
126 		assertEquals(String.class, literals.get(index++).getType());
127 
128 		// boolean boolean1 = false;
129 		assertEquals(Boolean.TYPE, literals.get(index).getFirstDescendantOfType(ASTBooleanLiteral.class).getType());
130 		assertEquals(Boolean.TYPE, literals.get(index++).getType());
131 
132 		// boolean boolean2 = true;
133 		assertEquals(Boolean.TYPE, literals.get(index).getFirstDescendantOfType(ASTBooleanLiteral.class).getType());
134 		assertEquals(Boolean.TYPE, literals.get(index++).getType());
135 
136 		// Object obj = null;
137 		assertNull(literals.get(index).getFirstDescendantOfType(ASTNullLiteral.class).getType());
138 		assertNull(literals.get(index++).getType());
139 
140 		// byte byte1 = 0;
141 		assertEquals(0, literals.get(index).jjtGetNumChildren());
142 		assertEquals(Integer.TYPE, literals.get(index++).getType());
143 
144 		// byte byte2 = 0x0F;
145 		assertEquals(0, literals.get(index).jjtGetNumChildren());
146 		assertEquals(Integer.TYPE, literals.get(index++).getType());
147 
148 		// byte byte3 = -007;
149 		assertEquals(0, literals.get(index).jjtGetNumChildren());
150 		assertEquals(Integer.TYPE, literals.get(index++).getType());
151 
152 		// short short1 = 0;
153 		assertEquals(0, literals.get(index).jjtGetNumChildren());
154 		assertEquals(Integer.TYPE, literals.get(index++).getType());
155 
156 		// short short2 = 0x0F;
157 		assertEquals(0, literals.get(index).jjtGetNumChildren());
158 		assertEquals(Integer.TYPE, literals.get(index++).getType());
159 
160 		// short short3 = -007;
161 		assertEquals(0, literals.get(index).jjtGetNumChildren());
162 		assertEquals(Integer.TYPE, literals.get(index++).getType());
163 
164 		// char char1 = 0;
165 		assertEquals(0, literals.get(index).jjtGetNumChildren());
166 		assertEquals(Integer.TYPE, literals.get(index++).getType());
167 
168 		// char char2 = 0x0F;
169 		assertEquals(0, literals.get(index).jjtGetNumChildren());
170 		assertEquals(Integer.TYPE, literals.get(index++).getType());
171 
172 		// char char3 = 007;
173 		assertEquals(0, literals.get(index).jjtGetNumChildren());
174 		assertEquals(Integer.TYPE, literals.get(index++).getType());
175 
176 		// char char4 = 'a';
177 		assertEquals(0, literals.get(index).jjtGetNumChildren());
178 		assertEquals(Character.TYPE, literals.get(index++).getType());
179 
180 		// int int1 = 0;
181 		assertEquals(0, literals.get(index).jjtGetNumChildren());
182 		assertEquals(Integer.TYPE, literals.get(index++).getType());
183 
184 		// int int2 = 0x0F;
185 		assertEquals(0, literals.get(index).jjtGetNumChildren());
186 		assertEquals(Integer.TYPE, literals.get(index++).getType());
187 
188 		// int int3 = -007;
189 		assertEquals(0, literals.get(index).jjtGetNumChildren());
190 		assertEquals(Integer.TYPE, literals.get(index++).getType());
191 
192 		// int int4 = 'a';
193 		assertEquals(0, literals.get(index).jjtGetNumChildren());
194 		assertEquals(Character.TYPE, literals.get(index++).getType());
195 
196 		// long long1 = 0;
197 		assertEquals(0, literals.get(index).jjtGetNumChildren());
198 		assertEquals(Integer.TYPE, literals.get(index++).getType());
199 
200 		// long long2 = 0x0F;
201 		assertEquals(0, literals.get(index).jjtGetNumChildren());
202 		assertEquals(Integer.TYPE, literals.get(index++).getType());
203 
204 		// long long3 = -007;
205 		assertEquals(0, literals.get(index).jjtGetNumChildren());
206 		assertEquals(Integer.TYPE, literals.get(index++).getType());
207 
208 		// long long4 = 0L;
209 		assertEquals(0, literals.get(index).jjtGetNumChildren());
210 		assertEquals(Long.TYPE, literals.get(index++).getType());
211 
212 		// long long5 = 0x0Fl;
213 		assertEquals(0, literals.get(index).jjtGetNumChildren());
214 		assertEquals(Long.TYPE, literals.get(index++).getType());
215 
216 		// long long6 = -007L;
217 		assertEquals(0, literals.get(index).jjtGetNumChildren());
218 		assertEquals(Long.TYPE, literals.get(index++).getType());
219 
220 		// long long7 = 'a';
221 		assertEquals(0, literals.get(index).jjtGetNumChildren());
222 		assertEquals(Character.TYPE, literals.get(index++).getType());
223 
224 		// float float1 = 0.0f;
225 		assertEquals(0, literals.get(index).jjtGetNumChildren());
226 		assertEquals(Float.TYPE, literals.get(index++).getType());
227 
228 		// float float2 = -10e+01f;
229 		assertEquals(0, literals.get(index).jjtGetNumChildren());
230 		assertEquals(Float.TYPE, literals.get(index++).getType());
231 
232 		// float float3 = 0x08.08p3f;
233 		assertEquals(0, literals.get(index).jjtGetNumChildren());
234 		assertEquals(Float.TYPE, literals.get(index++).getType());
235 
236 		// float float4 = 0xFF;
237 		assertEquals(0, literals.get(index).jjtGetNumChildren());
238 		assertEquals(Integer.TYPE, literals.get(index++).getType());
239 
240 		// float float5 = 'a';
241 		assertEquals(0, literals.get(index).jjtGetNumChildren());
242 		assertEquals(Character.TYPE, literals.get(index++).getType());
243 
244 		// double double1 = 0.0;
245 		assertEquals(0, literals.get(index).jjtGetNumChildren());
246 		assertEquals(Double.TYPE, literals.get(index++).getType());
247 
248 		// double double2 = -10e+01;
249 		assertEquals(0, literals.get(index).jjtGetNumChildren());
250 		assertEquals(Double.TYPE, literals.get(index++).getType());
251 
252 		// double double3 = 0x08.08p3;
253 		assertEquals(0, literals.get(index).jjtGetNumChildren());
254 		assertEquals(Double.TYPE, literals.get(index++).getType());
255 
256 		// double double4 = 0xFF;
257 		assertEquals(0, literals.get(index).jjtGetNumChildren());
258 		assertEquals(Integer.TYPE, literals.get(index++).getType());
259 
260 		// double double5 = 'a';
261 		assertEquals(0, literals.get(index).jjtGetNumChildren());
262 		assertEquals(Character.TYPE, literals.get(index++).getType());
263 
264 		// Make sure we got them all.
265 		assertEquals("All literals not tested", index, literals.size());
266 	}
267 
268 	@Test
269 	@SuppressWarnings("unchecked")
270 	public void testUnaryNumericPromotion() throws JaxenException {
271 		ASTCompilationUnit acu = parseAndTypeResolveForClass(Promotion.class);
272 		List<ASTExpression> expressions = acu.findChildNodesWithXPath("//Block[preceding-sibling::MethodDeclarator[@Image = 'unaryNumericPromotion']]//Expression[UnaryExpression]");
273 		int index = 0;
274 
275 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
276 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
277 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
278 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
279 		assertEquals(Long.TYPE, expressions.get(index++).getType());
280 		assertEquals(Float.TYPE, expressions.get(index++).getType());
281 		assertEquals(Double.TYPE, expressions.get(index++).getType());
282 
283 		// Make sure we got them all.
284 		assertEquals("All expressions not tested", index, expressions.size());
285 	}
286 
287 	@Test
288 	@SuppressWarnings("unchecked")
289 	public void testBinaryNumericPromotion() throws JaxenException {
290 		ASTCompilationUnit acu = parseAndTypeResolveForClass(Promotion.class);
291 		List<ASTExpression> expressions = acu.findChildNodesWithXPath("//Block[preceding-sibling::MethodDeclarator[@Image = 'binaryNumericPromotion']]//Expression[AdditiveExpression]");
292 		int index = 0;
293 
294 		// LHS = byte
295 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
296 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
297 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
298 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
299 		assertEquals(Long.TYPE, expressions.get(index++).getType());
300 		assertEquals(Float.TYPE, expressions.get(index++).getType());
301 		assertEquals(Double.TYPE, expressions.get(index++).getType());
302 		// LHS = short
303 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
304 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
305 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
306 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
307 		assertEquals(Long.TYPE, expressions.get(index++).getType());
308 		assertEquals(Float.TYPE, expressions.get(index++).getType());
309 		assertEquals(Double.TYPE, expressions.get(index++).getType());
310 		// LHS = char
311 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
312 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
313 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
314 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
315 		assertEquals(Long.TYPE, expressions.get(index++).getType());
316 		assertEquals(Float.TYPE, expressions.get(index++).getType());
317 		assertEquals(Double.TYPE, expressions.get(index++).getType());
318 		// LHS = int
319 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
320 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
321 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
322 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
323 		assertEquals(Long.TYPE, expressions.get(index++).getType());
324 		assertEquals(Float.TYPE, expressions.get(index++).getType());
325 		assertEquals(Double.TYPE, expressions.get(index++).getType());
326 		// LHS = long
327 		assertEquals(Long.TYPE, expressions.get(index++).getType());
328 		assertEquals(Long.TYPE, expressions.get(index++).getType());
329 		assertEquals(Long.TYPE, expressions.get(index++).getType());
330 		assertEquals(Long.TYPE, expressions.get(index++).getType());
331 		assertEquals(Long.TYPE, expressions.get(index++).getType());
332 		assertEquals(Float.TYPE, expressions.get(index++).getType());
333 		assertEquals(Double.TYPE, expressions.get(index++).getType());
334 		// LHS = float
335 		assertEquals(Float.TYPE, expressions.get(index++).getType());
336 		assertEquals(Float.TYPE, expressions.get(index++).getType());
337 		assertEquals(Float.TYPE, expressions.get(index++).getType());
338 		assertEquals(Float.TYPE, expressions.get(index++).getType());
339 		assertEquals(Float.TYPE, expressions.get(index++).getType());
340 		assertEquals(Float.TYPE, expressions.get(index++).getType());
341 		assertEquals(Double.TYPE, expressions.get(index++).getType());
342 		// LHS = double
343 		assertEquals(Double.TYPE, expressions.get(index++).getType());
344 		assertEquals(Double.TYPE, expressions.get(index++).getType());
345 		assertEquals(Double.TYPE, expressions.get(index++).getType());
346 		assertEquals(Double.TYPE, expressions.get(index++).getType());
347 		assertEquals(Double.TYPE, expressions.get(index++).getType());
348 		assertEquals(Double.TYPE, expressions.get(index++).getType());
349 		assertEquals(Double.TYPE, expressions.get(index++).getType());
350 
351 		// Make sure we got them all.
352 		assertEquals("All expressions not tested", index, expressions.size());
353 	}
354 
355 	@Test
356 	@SuppressWarnings("unchecked")
357 	public void testBinaryStringPromotion() throws JaxenException {
358 		ASTCompilationUnit acu = parseAndTypeResolveForClass(Promotion.class);
359 		List<ASTExpression> expressions = acu.findChildNodesWithXPath("//Block[preceding-sibling::MethodDeclarator[@Image = 'binaryStringPromotion']]//Expression");
360 		int index = 0;
361 
362 		assertEquals(String.class, expressions.get(index++).getType());
363 		assertEquals(String.class, expressions.get(index++).getType());
364 		assertEquals(String.class, expressions.get(index++).getType());
365 		assertEquals(String.class, expressions.get(index++).getType());
366 		assertEquals(String.class, expressions.get(index++).getType());
367 
368 		// Make sure we got them all.
369 		assertEquals("All expressions not tested", index, expressions.size());
370 	}
371 
372 	@Test
373 	@SuppressWarnings("unchecked")
374 	public void testUnaryLogicalOperators() throws JaxenException {
375 		ASTCompilationUnit acu = parseAndTypeResolveForClass(Operators.class);
376 		List<ASTExpression> expressions = acu.findChildNodesWithXPath("//Block[preceding-sibling::MethodDeclarator[@Image = 'unaryLogicalOperators']]//Expression");
377 		int index = 0;
378 
379 		assertEquals(Boolean.TYPE, expressions.get(index++).getType());
380 		assertEquals(Boolean.TYPE, expressions.get(index++).getType());
381 
382 		// Make sure we got them all.
383 		assertEquals("All expressions not tested", index, expressions.size());
384 	}
385 
386 	@Test
387 	@SuppressWarnings("unchecked")
388 	public void testBinaryLogicalOperators() throws JaxenException {
389 		ASTCompilationUnit acu = parseAndTypeResolveForClass(Operators.class);
390 		List<ASTExpression> expressions = acu.findChildNodesWithXPath("//Block[preceding-sibling::MethodDeclarator[@Image = 'binaryLogicalOperators']]//Expression");
391 		int index = 0;
392 
393 		assertEquals(Boolean.TYPE, expressions.get(index++).getType());
394 		assertEquals(Boolean.TYPE, expressions.get(index++).getType());
395 		assertEquals(Boolean.TYPE, expressions.get(index++).getType());
396 		assertEquals(Boolean.TYPE, expressions.get(index++).getType());
397 		assertEquals(Boolean.TYPE, expressions.get(index++).getType());
398 		assertEquals(Boolean.TYPE, expressions.get(index++).getType());
399 		assertEquals(Boolean.TYPE, expressions.get(index++).getType());
400 		assertEquals(Boolean.TYPE, expressions.get(index++).getType());
401 		assertEquals(Boolean.TYPE, expressions.get(index++).getType());
402 		assertEquals(Boolean.TYPE, expressions.get(index++).getType());
403 		assertEquals(Boolean.TYPE, expressions.get(index++).getType());
404 		assertEquals(Boolean.TYPE, expressions.get(index++).getType());
405 		assertEquals(Boolean.TYPE, expressions.get(index++).getType());
406 
407 		// Make sure we got them all.
408 		assertEquals("All expressions not tested", index, expressions.size());
409 	}
410 
411 	@Test
412 	@SuppressWarnings("unchecked")
413 	public void testUnaryNumericOperators() throws JaxenException {
414 		ASTCompilationUnit acu = parseAndTypeResolveForClass(Operators.class);
415 		List<TypeNode> expressions = new ArrayList<TypeNode>();
416 		expressions.addAll(acu.findChildNodesWithXPath("//Block[preceding-sibling::MethodDeclarator[@Image = 'unaryNumericOperators']]//Expression"));
417 		expressions.addAll(acu.findChildNodesWithXPath("//Block[preceding-sibling::MethodDeclarator[@Image = 'unaryNumericOperators']]//PostfixExpression"));
418 		expressions.addAll(acu.findChildNodesWithXPath("//Block[preceding-sibling::MethodDeclarator[@Image = 'unaryNumericOperators']]//PreIncrementExpression"));
419 		expressions.addAll(acu.findChildNodesWithXPath("//Block[preceding-sibling::MethodDeclarator[@Image = 'unaryNumericOperators']]//PreDecrementExpression"));
420 		int index = 0;
421 
422 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
423 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
424 		assertEquals(Double.TYPE, expressions.get(index++).getType());
425 		assertEquals(Double.TYPE, expressions.get(index++).getType());
426 		assertEquals(Double.TYPE, expressions.get(index++).getType());
427 		assertEquals(Double.TYPE, expressions.get(index++).getType());
428 
429 		// Make sure we got them all.
430 		assertEquals("All expressions not tested", index, expressions.size());
431 	}
432 
433 	@Test
434 	@SuppressWarnings("unchecked")
435 	public void testBinaryNumericOperators() throws JaxenException {
436 		ASTCompilationUnit acu = parseAndTypeResolveForClass(Operators.class);
437 		List<ASTExpression> expressions = acu.findChildNodesWithXPath("//Block[preceding-sibling::MethodDeclarator[@Image = 'binaryNumericOperators']]//Expression");
438 		int index = 0;
439 
440 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
441 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
442 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
443 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
444 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
445 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
446 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
447 		assertEquals(Integer.TYPE, expressions.get(index++).getType());
448 
449 		// Make sure we got them all.
450 		assertEquals("All expressions not tested", index, expressions.size());
451 	}
452 
453 	@Test
454 	@SuppressWarnings("unchecked")
455 	public void testAssignmentOperators() throws JaxenException {
456 		ASTCompilationUnit acu = parseAndTypeResolveForClass(Operators.class);
457 		List<ASTStatementExpression> expressions = acu.findChildNodesWithXPath("//Block[preceding-sibling::MethodDeclarator[@Image = 'assignmentOperators']]//StatementExpression");
458 		int index = 0;
459 
460 		assertEquals(Long.TYPE, expressions.get(index++).getType());
461 		assertEquals(Long.TYPE, expressions.get(index++).getType());
462 		assertEquals(Long.TYPE, expressions.get(index++).getType());
463 		assertEquals(Long.TYPE, expressions.get(index++).getType());
464 		assertEquals(Long.TYPE, expressions.get(index++).getType());
465 		assertEquals(Long.TYPE, expressions.get(index++).getType());
466 		assertEquals(Long.TYPE, expressions.get(index++).getType());
467 		assertEquals(Long.TYPE, expressions.get(index++).getType());
468 		assertEquals(Long.TYPE, expressions.get(index++).getType());
469 		assertEquals(Long.TYPE, expressions.get(index++).getType());
470 		assertEquals(Long.TYPE, expressions.get(index++).getType());
471 		assertEquals(Long.TYPE, expressions.get(index++).getType());
472 
473 		// Make sure we got them all.
474 		assertEquals("All expressions not tested", index, expressions.size());
475 	}
476 
477 	public static junit.framework.Test suite() {
478 		return new junit.framework.JUnit4TestAdapter(ClassTypeResolverTest.class);
479 	}
480 
481 	// Note: If you're using Eclipse or some other IDE to run this test, you _must_ have the regress folder in
482 	// the classpath.  Normally the IDE doesn't put source directories themselves directly in the classpath, only
483 	// the output directories are in the classpath.
484 	private ASTCompilationUnit parseAndTypeResolveForClass(Class<?> clazz) {
485 		String sourceFile = clazz.getName().replace('.', '/') + ".java";
486 		InputStream is = ClassTypeResolverTest.class.getClassLoader().getResourceAsStream(sourceFile);
487 		if (is == null) {
488 			throw new IllegalArgumentException("Unable to find source file " + sourceFile + " for " + clazz);
489 		}
490 		LanguageVersionHandler languageVersionHandler = LanguageVersion.JAVA_15.getLanguageVersionHandler();
491 		ASTCompilationUnit acu = (ASTCompilationUnit)languageVersionHandler.getParser(languageVersionHandler.getDefaultParserOptions()).parse(null, new InputStreamReader(is));
492 		languageVersionHandler.getSymbolFacade().start(acu);
493 		languageVersionHandler.getTypeResolutionFacade(ClassTypeResolverTest.class.getClassLoader()).start(acu);
494 		return acu;
495 	}
496 }