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 |