test/langtools/jdk/jshell/TypeNameTest.java
changeset 48610 a587f95313f1
parent 47959 5dd899009525
child 52914 4fa75d8ad418
equal deleted inserted replaced
48609:be4d948d1299 48610:a587f95313f1
     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.
    21  * questions.
    21  * questions.
    22  */
    22  */
    23 
    23 
    24 /*
    24 /*
    25  * @test
    25  * @test
    26  * @bug 8144903 8171981 8191802
    26  * @bug 8144903 8171981 8191802 8191842
    27  * @summary Tests for determining the type from the expression
    27  * @summary Tests for determining the type from the expression
    28  * @build KullaTesting TestingInputStream
    28  * @build KullaTesting TestingInputStream
    29  * @run testng TypeNameTest
    29  * @run testng TypeNameTest
    30  */
    30  */
    31 
    31 
    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 }