jaroslav@1639: /** jaroslav@1639: * Back 2 Browser Bytecode Translator jaroslav@1639: * Copyright (C) 2012 Jaroslav Tulach jaroslav@1639: * jaroslav@1639: * This program is free software: you can redistribute it and/or modify jaroslav@1639: * it under the terms of the GNU General Public License as published by jaroslav@1639: * the Free Software Foundation, version 2 of the License. jaroslav@1639: * jaroslav@1639: * This program is distributed in the hope that it will be useful, jaroslav@1639: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@1639: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@1639: * GNU General Public License for more details. jaroslav@1639: * jaroslav@1639: * You should have received a copy of the GNU General Public License jaroslav@1639: * along with this program. Look for COPYING file in the top folder. jaroslav@1639: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@1639: */ jaroslav@1639: package org.apidesign.bck2brwsr.vm8; jaroslav@1639: jaroslav@1692: import java.util.ArrayList; jaroslav@1692: import java.util.Arrays; jaroslav@1692: import java.util.List; jaroslav@1692: import java.util.concurrent.Callable; jaroslav@1680: import org.apidesign.bck2brwsr.vmtest.Compare; jaroslav@1680: import org.apidesign.bck2brwsr.vmtest.VMTest; jaroslav@1680: import org.testng.annotations.Factory; jaroslav@1639: jaroslav@1639: /** jaroslav@1639: * jaroslav@1639: * @author Jaroslav Tulach jaroslav@1639: */ jaroslav@1692: public class LambdasTest extends LambdasSuper { jaroslav@1680: @Compare public String StringverifyJSTime() throws Exception { jaroslav@1680: return Lambdas.compound(); jaroslav@1639: } jaroslav@1692: jaroslav@1692: @Compare jaroslav@1692: public int canCallLambda() { jaroslav@1692: int[] arr = {0}; jaroslav@1692: Runnable incr = () -> { jaroslav@1692: arr[0]++; jaroslav@1692: }; jaroslav@1692: incr.run(); jaroslav@1692: return arr[0]; jaroslav@1692: } jaroslav@1692: jaroslav@1692: @Compare jaroslav@1692: public String lambdaReturnsString() throws Exception { jaroslav@1692: Callable lambda = () -> "Hello World!"; jaroslav@1692: return lambda.call(); jaroslav@1692: } jaroslav@1692: jaroslav@1692: private interface Convertor { jaroslav@1692: jaroslav@1692: public R convert(P value); jaroslav@1692: } jaroslav@1692: jaroslav@1692: @Compare jaroslav@1692: public int convertToLength() { jaroslav@1692: Convertor lambda = (String s) -> s.getBytes().length; jaroslav@1692: return lambda.convert("buu"); jaroslav@1692: } jaroslav@1692: jaroslav@1692: private int meaningOfWorld = 0; jaroslav@1692: jaroslav@1692: @Compare jaroslav@1692: public int accessToInstanceVar() { jaroslav@1692: Runnable lambda = () -> { jaroslav@1692: meaningOfWorld = 42; jaroslav@1692: }; jaroslav@1692: lambda.run(); jaroslav@1692: return meaningOfWorld; jaroslav@1692: } jaroslav@1692: jaroslav@1692: @Compare jaroslav@1692: public int localMeaningOfWorld() { jaroslav@1692: int[] meansOfWorld = new int[1]; jaroslav@1692: Runnable lambda = () -> { jaroslav@1692: meansOfWorld[0] = 42; jaroslav@1692: }; jaroslav@1692: lambda.run(); jaroslav@1692: return meansOfWorld[0]; jaroslav@1692: } jaroslav@1692: jaroslav@1692: @Compare jaroslav@1692: public int useLocalVars() throws Exception { jaroslav@1692: boolean bool = true; jaroslav@1692: byte b = 2; jaroslav@1692: short s = 3; jaroslav@1692: int i = 4; jaroslav@1692: long l = 5; jaroslav@1692: float f = 6; jaroslav@1692: double d = 7; jaroslav@1692: char c = 8; jaroslav@1692: Callable lambda = () -> (int) ((bool ? 1 : 0) + b + s + i + l + f + d + c); jaroslav@1692: return lambda.call(); jaroslav@1692: } jaroslav@1692: jaroslav@1692: @Compare jaroslav@1692: public String callVirtualMethod() throws Exception { jaroslav@1692: String foo = "foo"; jaroslav@1692: Callable ref = foo::toUpperCase; jaroslav@1692: return ref.call(); jaroslav@1692: } jaroslav@1692: jaroslav@1692: @Compare jaroslav@1692: public int callInterfaceMethod() throws Exception { jaroslav@1692: List foos = Arrays.asList("foo"); jaroslav@1692: Callable ref = foos::size; jaroslav@1692: return ref.call(); jaroslav@1692: } jaroslav@1692: jaroslav@1692: @Compare jaroslav@1692: public long callStaticMethod() throws Exception { jaroslav@1692: long expected = System.currentTimeMillis(); jaroslav@1692: Callable ref = System::currentTimeMillis; jaroslav@1692: return ref.call() & ~0xffff; jaroslav@1692: } jaroslav@1692: jaroslav@1692: @Compare jaroslav@1692: public String callConstructor() throws Exception { jaroslav@1692: Callable> ref = ArrayList::new; jaroslav@1692: return ref.call().toString(); jaroslav@1692: } jaroslav@1692: jaroslav@1692: @Compare jaroslav@1692: public String superMethodOverridenByThis() throws Exception { jaroslav@1692: Callable ref = super::inheritedMethod; jaroslav@1692: return ref.call(); jaroslav@1692: } jaroslav@1692: jaroslav@1692: @Override jaroslav@1692: String inheritedMethod() { jaroslav@1692: return "overridden version"; jaroslav@1692: } jaroslav@1692: jaroslav@1692: @Compare jaroslav@1692: public String referencePrivateClassMethod() throws Exception { jaroslav@1692: StringBuilder sb = new StringBuilder(); jaroslav@1692: jaroslav@1692: Callable ref1 = LambdasTest::privateClassMethod; jaroslav@1692: sb.append(ref1.call()); jaroslav@1692: jaroslav@1692: Callable ref2 = this::privateInstanceMethod; jaroslav@1692: sb.append("\n").append(ref2.call()); jaroslav@1692: jaroslav@1692: // Normal method calls should still work after our magic jaroslav@1692: // of making them them accessible from the lambda classes. jaroslav@1692: sb.append("\n").append(privateClassMethod()); jaroslav@1692: sb.append("\n").append(privateInstanceMethod()); jaroslav@1692: jaroslav@1692: return sb.toString(); jaroslav@1692: } jaroslav@1692: jaroslav@1692: private String privateInstanceMethod() { jaroslav@1692: return "foo"; jaroslav@1692: } jaroslav@1692: jaroslav@1692: private static String privateClassMethod() { jaroslav@1692: return "foo"; jaroslav@1692: } jaroslav@1692: jaroslav@1692: private String unrelatedPrivateMethod() { jaroslav@1692: return "foo"; jaroslav@1692: } jaroslav@1639: jaroslav@1680: @Factory public static Object[] create() { jaroslav@1680: return VMTest.create(LambdasTest.class); jaroslav@1639: } jaroslav@1639: } jaroslav@1639: