1/*
2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
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
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @bug 8003280
27 * @summary Add lambda tests
28 *  SAM types and method type inference
29 * @author  Brian Goetz
30 * @author  Maurizio Cimadamore
31 * @run main LambdaConv03
32 */
33
34public class LambdaConv03 {
35
36    static int assertionCount = 0;
37
38    static void assertTrue(boolean cond) {
39        assertionCount++;
40        if (!cond)
41            throw new AssertionError();
42    }
43
44    interface TU<T, U> {
45      public T foo(U u);
46    }
47
48    public static <T, U> T exec(TU<T, U> lambda, U x) {
49        return lambda.foo(x);
50    }
51
52    static {
53        //Covariant returns:
54        int i1 = exec((Integer x) -> { return x; }, 3);
55        assertTrue(3 == i1);
56        //Method resolution with boxing:
57        int i2 = exec((Integer x) -> { return x; }, 3);
58        assertTrue(3 == i2);
59        //Runtime exception transparency:
60        try {
61            exec((Object x) -> { return x.hashCode(); }, null);
62        }
63        catch (RuntimeException e) {
64            assertTrue(true);
65        }
66    }
67
68    {
69        //Covariant returns:
70        int i1 = exec((Integer x) -> { return x; }, 3);
71        assertTrue(3 == i1);
72        //Method resolution with boxing:
73        int i2 = exec((Integer x) -> { return x; }, 3);
74        assertTrue(3 == i2);
75        //Runtime exception transparency:
76        try {
77            exec((Object x) -> { return x.hashCode(); }, null);
78        }
79        catch (RuntimeException e) {
80            assertTrue(true);
81        }
82    }
83
84    public static void test1() {
85        //Covariant returns:
86        int i1 = exec((Integer x) -> { return x; }, 3);
87        assertTrue(3 == i1);
88        //Method resolution with boxing:
89        int i2 = exec((Integer x) -> { return x; }, 3);
90        assertTrue(3 == i2);
91        //Runtime exception transparency:
92        try {
93            exec((Object x) -> { return x.hashCode(); }, null);
94        }
95        catch (RuntimeException e) {
96            assertTrue(true);
97        }
98    }
99
100    public void test2() {
101        //Covariant returns:
102        int i1 = exec((Integer x) -> { return x; }, 3);
103        assertTrue(3 == i1);
104        //Method resolution with boxing:
105        int i2 = exec((Integer x) -> { return x; }, 3);
106        assertTrue(3 == i2);
107        //Runtime exception transparency:
108        try {
109            exec((Object x) -> { return x.hashCode(); }, null);
110        }
111        catch (RuntimeException e) {
112            assertTrue(true);
113        }
114    }
115
116    public static void main(String[] args) {
117        test1();
118        new LambdaConv03().test2();
119        assertTrue(assertionCount == 12);
120    }
121}
122