1 /* |
1 /* |
2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
36 @Test |
36 @Test |
37 public class TypeNameTest extends KullaTesting { |
37 public class TypeNameTest extends KullaTesting { |
38 |
38 |
39 |
39 |
40 private void assertType(String expr, String type) { |
40 private void assertType(String expr, String type) { |
|
41 assertType(expr, type, type); |
|
42 } |
|
43 |
|
44 private void assertType(String expr, String type, String inferType) { |
41 assertEquals(varKey(assertEval(expr)).typeName(), type); |
45 assertEquals(varKey(assertEval(expr)).typeName(), type); |
42 assertInferredType(expr, type); |
46 assertInferredType(expr, inferType); |
43 } |
47 } |
44 |
48 |
45 public void testTypeInference() { |
49 public void testTypeInference() { |
46 assertEval("import java.util.List;"); |
50 assertEval("import java.util.List;"); |
47 assertEval("import java.util.ArrayList;"); |
51 assertEval("import java.util.ArrayList;"); |
56 assertEval("class D<T extends CharSequence> { D<? super T> getS() { return null; } }"); |
60 assertEval("class D<T extends CharSequence> { D<? super T> getS() { return null; } }"); |
57 assertEval("D<?> d = new D<String>();"); |
61 assertEval("D<?> d = new D<String>();"); |
58 assertType("d.getS()", "D<?>"); |
62 assertType("d.getS()", "D<?>"); |
59 assertType("null", "Object"); |
63 assertType("null", "Object"); |
60 assertType("Class.forName( \"java.util.ArrayList\" )", "Class<?>"); |
64 assertType("Class.forName( \"java.util.ArrayList\" )", "Class<?>"); |
61 assertType("new ArrayList<Boolean>() {}", "ArrayList<Boolean>"); |
65 assertType("new ArrayList<Boolean>() {}", "<anonymous class extending ArrayList<Boolean>>", "ArrayList<Boolean>"); |
62 assertType("new ArrayList<String>().stream()", "java.util.stream.Stream<String>"); |
66 assertType("new ArrayList<String>().stream()", "java.util.stream.Stream<String>"); |
63 assertType("Arrays.asList( 1, 2, 3)", "List<Integer>"); |
67 assertType("Arrays.asList( 1, 2, 3)", "List<Integer>"); |
64 assertType("new ArrayList().getClass().getClass()", "Class<? extends Class>"); |
68 assertType("new ArrayList().getClass().getClass()", "Class<? extends Class>"); |
65 |
69 |
66 assertEval("interface A {}"); |
70 assertEval("interface A {}"); |
186 assertType("listOf(true).get(0)", "Boolean"); |
190 assertType("listOf(true).get(0)", "Boolean"); |
187 assertType("arrayOf(99)", "Integer[]"); |
191 assertType("arrayOf(99)", "Integer[]"); |
188 assertType("arrayOf(99)[0]", "Integer"); |
192 assertType("arrayOf(99)[0]", "Integer"); |
189 |
193 |
190 assertEval("<Z> Z choose(Z z1, Z z2) { return z1; }"); |
194 assertEval("<Z> Z choose(Z z1, Z z2) { return z1; }"); |
191 assertType("choose(1, 1L);", "Object"); |
195 assertType("choose(1, 1L);", "Number&Comparable<? extends Number&Comparable<?>>", "Object"); |
192 } |
196 } |
193 |
197 |
194 public void testVariableTypeName() { |
198 public void testVariableTypeName() { |
195 assertType("\"x\"", "String"); |
199 assertType("\"x\"", "String"); |
196 |
200 |
213 } |
217 } |
214 |
218 |
215 public void testAnonymousClassName() { |
219 public void testAnonymousClassName() { |
216 assertEval("class C {}"); |
220 assertEval("class C {}"); |
217 assertType("new C();", "C"); |
221 assertType("new C();", "C"); |
218 assertType("new C() { int x; };", "C"); |
222 assertType("new C() { int x; };", "<anonymous class extending C>", "C"); |
219 } |
223 } |
220 |
224 |
221 public void testCapturedTypeName() { |
225 public void testCapturedTypeName() { |
222 assertType("\"\".getClass();", "Class<? extends String>"); |
226 assertType("\"\".getClass();", "Class<? extends String>"); |
223 assertType("\"\".getClass().getEnumConstants();", "String[]"); |
227 assertType("\"\".getClass().getEnumConstants();", "String[]"); |
241 assertEval("class Test1<X extends CharSequence> { public X get() { return null; } }"); |
245 assertEval("class Test1<X extends CharSequence> { public X get() { return null; } }"); |
242 assertEval("Test1<?> test1 = new Test1<>();"); |
246 assertEval("Test1<?> test1 = new Test1<>();"); |
243 assertType("test1.get()", "CharSequence"); |
247 assertType("test1.get()", "CharSequence"); |
244 assertEval("class Test2<X extends Number & CharSequence> { public X get() { return null; } }"); |
248 assertEval("class Test2<X extends Number & CharSequence> { public X get() { return null; } }"); |
245 assertEval("Test2<?> test2 = new Test2<>();"); |
249 assertEval("Test2<?> test2 = new Test2<>();"); |
246 assertType("test2.get()", "Object"); |
250 assertType("test2.get()", "Number&CharSequence", "Object"); |
247 assertEval("class Test3<T> { T[][] get() { return null; } }"); |
251 assertEval("class Test3<T> { T[][] get() { return null; } }"); |
248 assertEval("Test3<? extends String> test3 = new Test3<>();"); |
252 assertEval("Test3<? extends String> test3 = new Test3<>();"); |
249 assertType("test3.get()", "String[][]"); |
253 assertType("test3.get()", "String[][]"); |
250 } |
254 } |
251 } |
255 } |