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 * basic test for capture of non-mutable locals 29 * @author Brian Goetz 30 * @author Maurizio Cimadamore 31 * @run main LambdaCapture01 32 */ 33 34public class LambdaCapture01 { 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 Tester { 45 void test(); 46 } 47 48 interface TU<T, U> { 49 public T foo(U u); 50 } 51 52 public static <T, U> T exec(TU<T, U> lambda, U x) { 53 return lambda.foo(x); 54 } 55 56 public int n = 5; 57 58 //Simple local capture 59 void test1() { 60 final int N = 1; 61 int res = LambdaCapture01.<Integer,Integer>exec((Integer x) -> x + N, 3); 62 assertTrue(4 == res); 63 } 64 65 //Local capture with multiple scopes (anon class) 66 void test2() { 67 final int N = 1; 68 new Tester() { 69 public void test() { 70 final int M = 2; 71 int res = LambdaCapture01.<Integer,Integer>exec((Integer x) -> x + N + M, 3); 72 assertTrue(6 == res); 73 } 74 }.test(); 75 } 76 77 //Local capture with multiple scopes (local class) 78 void test3() { 79 final int N = 1; 80 class MyTester implements Tester { 81 public void test() { 82 final int M = 2; 83 int res = LambdaCapture01.<Integer,Integer>exec((Integer x) -> x + N + M, 3); 84 assertTrue(6 == res); 85 } 86 } 87 new MyTester().test(); 88 } 89 90 //access to field from enclosing scope 91 void test4() { 92 final int N = 4; 93 int res1 = LambdaCapture01.<Integer,Integer>exec((Integer x) -> x + n + N, 3); 94 assertTrue(12 == res1); 95 int res2 = LambdaCapture01.<Integer,Integer>exec((Integer x) -> x + LambdaCapture01.this.n + N, 3); 96 assertTrue(12 == res2); 97 } 98 99 public static void main(String[] args) { 100 LambdaCapture01 t = new LambdaCapture01(); 101 t.test1(); 102 t.test2(); 103 t.test3(); 104 t.test4(); 105 assertTrue(assertionCount == 5); 106 } 107} 108