test/langtools/tools/javac/lambda/lambdaExpression/LambdaTest6.java
changeset 58871 27c2d2a4b695
parent 47216 71c04702a3d5
equal deleted inserted replaced
58868:f547a06da806 58871:27c2d2a4b695
    24 /**
    24 /**
    25  * @test
    25  * @test
    26  * @bug 8003280
    26  * @bug 8003280
    27  * @summary Add lambda tests
    27  * @summary Add lambda tests
    28  *   Test bridge methods for certain SAM conversions
    28  *   Test bridge methods for certain SAM conversions
       
    29  *   Tests that jdk.internal.lambda.disableEagerInitialization=true creates a
       
    30  *   get$Lambda method for non-capturing lambdas
    29  * @compile LambdaTest6.java
    31  * @compile LambdaTest6.java
    30  * @run main LambdaTest6
    32  * @run main LambdaTest6
       
    33  * @run main/othervm -Djdk.internal.lambda.disableEagerInitialization=true LambdaTest6
    31  */
    34  */
    32 
    35 
    33 import java.lang.reflect.Method;
    36 import java.lang.reflect.Method;
    34 import java.util.HashSet;
    37 import java.util.HashSet;
    35 import java.util.Set;
    38 import java.util.Set;
    58         s.add("java.lang.String");
    61         s.add("java.lang.String");
    59         s.add("java.lang.Object");
    62         s.add("java.lang.Object");
    60         return s;
    63         return s;
    61     }
    64     }
    62 
    65 
       
    66     private static Set<String> allowedMethods() {
       
    67         Set<String> s = new HashSet<>();
       
    68         s.add("m");
       
    69         if (Boolean.getBoolean("jdk.internal.lambda.disableEagerInitialization")) {
       
    70             s.add("get$Lambda");
       
    71         }
       
    72         return s;
       
    73     }
       
    74 
       
    75     private static boolean matchingMethodNames(Method[] methods) {
       
    76         Set<String> methodNames = new HashSet<>();
       
    77         for (Method m : methods) {
       
    78             methodNames.add(m.getName());
       
    79         }
       
    80         return methodNames.equals(allowedMethods());
       
    81     }
       
    82 
    63     private void test1()
    83     private void test1()
    64     {
    84     {
    65         L la = s -> { };
    85         L la = s -> { };
    66         la.m("hi");
    86         la.m("hi");
    67         Class<? extends L> c1 = la.getClass();
    87         Class<? extends L> c1 = la.getClass();
    68         Method[] methods = c1.getDeclaredMethods();
    88         Method[] methods = c1.getDeclaredMethods();
       
    89         assertTrue(matchingMethodNames(methods));
    69         Set<String> types = setOfStringObject();
    90         Set<String> types = setOfStringObject();
    70         for(Method m : methods) {
    91         for(Method m : methods) {
    71             assertTrue(m.getName().equals("m"));
    92             if ("m".equals(m.getName())) {
    72             Class[] parameterTypes = m.getParameterTypes();
    93                 Class[] parameterTypes = m.getParameterTypes();
    73             assertTrue(parameterTypes.length == 1);
    94                 assertTrue(parameterTypes.length == 1);
    74             assertTrue(types.remove(parameterTypes[0].getName()));
    95                 assertTrue(types.remove(parameterTypes[0].getName()));
       
    96             }
    75         }
    97         }
    76         assertTrue(types.isEmpty() || (types.size() == 1 && types.contains("java.lang.String")));
    98         assertTrue(types.isEmpty() || (types.size() == 1 && types.contains("java.lang.String")));
    77     }
    99     }
    78 
   100 
    79     private void test2()
   101     private void test2()
    80     {
   102     {
    81         KM km = s -> { };
   103         KM km = s -> { };
    82         //km.m("hi");
   104         //km.m("hi");
    83         Class<? extends KM> c2 = km.getClass();
   105         Class<? extends KM> c2 = km.getClass();
    84         Method[] methods = c2.getDeclaredMethods();
   106         Method[] methods = c2.getDeclaredMethods();
       
   107         assertTrue(matchingMethodNames(methods));
    85         Set<String> types = setOfStringObject();
   108         Set<String> types = setOfStringObject();
    86         for(Method m : methods) {
   109         for(Method m : methods) {
    87             assertTrue(m.getName().equals("m"));
   110             if ("m".equals(m.getName())) {
    88             Class[] parameterTypes = m.getParameterTypes();
   111                 Class[] parameterTypes = m.getParameterTypes();
    89             assertTrue(parameterTypes.length == 1);
   112                 assertTrue(parameterTypes.length == 1);
    90             assertTrue(types.remove(parameterTypes[0].getName()));
   113                 assertTrue(types.remove(parameterTypes[0].getName()));
       
   114             }
    91         }
   115         }
    92         assertTrue(types.isEmpty());
   116         assertTrue(types.isEmpty());
    93     }
   117     }
    94 
   118 
    95     private void test3()
   119     private void test3()
    97         N na = ()-> "hi";
   121         N na = ()-> "hi";
    98         assertTrue( na.m().equals("hi") );
   122         assertTrue( na.m().equals("hi") );
    99         assertTrue( ((H)na).m().equals("hi") );
   123         assertTrue( ((H)na).m().equals("hi") );
   100         Class<? extends N> c3 = na.getClass();
   124         Class<? extends N> c3 = na.getClass();
   101         Method[] methods = c3.getDeclaredMethods();
   125         Method[] methods = c3.getDeclaredMethods();
       
   126         assertTrue(matchingMethodNames(methods));
   102         Set<String> types = setOfStringObject();
   127         Set<String> types = setOfStringObject();
   103         for(Method m : methods) {
   128         for(Method m : methods) {
   104             assertTrue(m.getName().equals("m"));
   129             if ("m".equals(m.getName())) {
   105             Class returnType = m.getReturnType();
   130                 Class returnType = m.getReturnType();
   106             assertTrue(types.remove(returnType.getName()));
   131                 assertTrue(types.remove(returnType.getName()));
       
   132             }
   107         }
   133         }
   108         assertTrue(types.size() == 1); //there's a bridge
   134         assertTrue(types.size() == 1); //there's a bridge
   109     }
   135     }
   110 
   136 
   111 
   137