aoqi@0: /* aoqi@0: * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. Oracle designates this aoqi@0: * particular file as subject to the "Classpath" exception as provided aoqi@0: * by Oracle in the LICENSE file that accompanied this code. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: */ aoqi@0: aoqi@0: /** aoqi@0: * @test aoqi@0: * @bug 8003639 aoqi@0: * @summary convert lambda testng tests to jtreg and add them aoqi@0: * @run testng LambdaTranslationTest2 aoqi@0: */ aoqi@0: aoqi@0: import org.testng.annotations.Test; aoqi@0: aoqi@0: import java.util.ArrayList; aoqi@0: import java.util.List; aoqi@0: aoqi@0: import static org.testng.Assert.assertEquals; aoqi@0: import static org.testng.Assert.assertTrue; aoqi@0: aoqi@0: /** aoqi@0: * LambdaTranslationTest2 -- end-to-end smoke tests for lambda evaluation aoqi@0: */ aoqi@0: aoqi@0: @Test aoqi@0: public class LambdaTranslationTest2 { aoqi@0: aoqi@0: final String dummy = "dummy"; aoqi@0: aoqi@0: public void testLambdas() { aoqi@0: TPredicate isEmpty = s -> s.isEmpty(); aoqi@0: assertTrue(isEmpty.test("")); aoqi@0: assertTrue(!isEmpty.test("foo")); aoqi@0: aoqi@0: TPredicate oIsEmpty = s -> ((String) s).isEmpty(); aoqi@0: assertTrue(oIsEmpty.test("")); aoqi@0: assertTrue(!oIsEmpty.test("foo")); aoqi@0: aoqi@0: TPredicate alwaysTrue = o -> true; aoqi@0: assertTrue(alwaysTrue.test("")); aoqi@0: assertTrue(alwaysTrue.test(null)); aoqi@0: aoqi@0: TPredicate alwaysFalse = o -> false; aoqi@0: assertTrue(!alwaysFalse.test("")); aoqi@0: assertTrue(!alwaysFalse.test(null)); aoqi@0: aoqi@0: // tests local capture aoqi@0: String foo = "foo"; aoqi@0: TPredicate equalsFoo = s -> s.equals(foo); aoqi@0: assertTrue(!equalsFoo.test("")); aoqi@0: assertTrue(equalsFoo.test("foo")); aoqi@0: aoqi@0: // tests instance capture aoqi@0: TPredicate equalsDummy = s -> s.equals(dummy); aoqi@0: assertTrue(!equalsDummy.test("")); aoqi@0: assertTrue(equalsDummy.test("dummy")); aoqi@0: aoqi@0: TMapper ident = s -> s; aoqi@0: aoqi@0: assertEquals("blarf", ident.map("blarf")); aoqi@0: assertEquals("wooga", ident.map("wooga")); aoqi@0: assertTrue("wooga" == ident.map("wooga")); aoqi@0: aoqi@0: // constant capture aoqi@0: TMapper prefixer = s -> "p" + s; aoqi@0: assertEquals("pblarf", prefixer.map("blarf")); aoqi@0: assertEquals("pwooga", prefixer.map("wooga")); aoqi@0: aoqi@0: // instance capture aoqi@0: TMapper prefixer2 = s -> dummy + s; aoqi@0: assertEquals("dummyblarf", prefixer2.map("blarf")); aoqi@0: assertEquals("dummywooga", prefixer2.map("wooga")); aoqi@0: } aoqi@0: aoqi@0: interface Factory { aoqi@0: T make(); aoqi@0: } aoqi@0: aoqi@0: interface StringFactory extends Factory { } aoqi@0: aoqi@0: interface StringFactory2 extends Factory { aoqi@0: String make(); aoqi@0: } aoqi@0: aoqi@0: public void testBridges() { aoqi@0: Factory of = () -> "y"; aoqi@0: Factory ef = () -> "z"; aoqi@0: aoqi@0: assertEquals("y", of.make()); aoqi@0: assertEquals("y", ((Factory) of).make()); aoqi@0: assertEquals("y", ((Factory) of).make()); aoqi@0: aoqi@0: assertEquals("z", ef.make()); aoqi@0: assertEquals("z", ((Factory) ef).make()); aoqi@0: } aoqi@0: aoqi@0: public void testBridgesImplicitSpecialization() { aoqi@0: StringFactory sf = () -> "x"; aoqi@0: aoqi@0: assertEquals("x", sf.make()); aoqi@0: assertEquals("x", ((Factory) sf).make()); aoqi@0: assertEquals("x", ((Factory) sf).make()); aoqi@0: assertEquals("x", ((Factory) sf).make()); aoqi@0: } aoqi@0: aoqi@0: public void testBridgesExplicitSpecialization() { aoqi@0: StringFactory2 sf = () -> "x"; aoqi@0: aoqi@0: assertEquals("x", sf.make()); aoqi@0: assertEquals("x", ((Factory) sf).make()); aoqi@0: assertEquals("x", ((Factory) sf).make()); aoqi@0: assertEquals("x", ((Factory) sf).make()); aoqi@0: } aoqi@0: aoqi@0: public void testSuperCapture() { aoqi@0: class A { aoqi@0: String make() { return "x"; } aoqi@0: } aoqi@0: aoqi@0: class B extends A { aoqi@0: void testSuperCapture() { aoqi@0: StringFactory sf = () -> super.make(); aoqi@0: assertEquals("x", sf.make()); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: new B().testSuperCapture(); aoqi@0: } aoqi@0: aoqi@0: interface WidenD { aoqi@0: public String m(float a0, double a1); aoqi@0: } aoqi@0: aoqi@0: interface WidenS { aoqi@0: public String m(byte a0, short a1); aoqi@0: } aoqi@0: aoqi@0: interface WidenI { aoqi@0: public String m(byte a0, short a1, char a2, int a3); aoqi@0: } aoqi@0: aoqi@0: interface WidenL { aoqi@0: public String m(byte a0, short a1, char a2, int a3, long a4); aoqi@0: } aoqi@0: aoqi@0: interface Box { aoqi@0: public String m(byte a0, short a1, char a2, int a3, long a4, boolean a5, float a6, double a7); aoqi@0: } aoqi@0: aoqi@0: static String pb(Byte a0, Short a1, Character a2, Integer a3, Long a4, Boolean a5, Float a6, Double a7) { aoqi@0: return String.format("b%d s%d c%c i%d j%d z%b f%f d%f", a0, a1, a2, a3, a4, a5, a6, a7); aoqi@0: } aoqi@0: aoqi@0: static String pwI1(int a0, int a1, int a2, int a3) { aoqi@0: return String.format("b%d s%d c%d i%d", a0, a1, a2, a3); aoqi@0: } aoqi@0: aoqi@0: static String pwI2(Integer a0, Integer a1, Integer a2, Integer a3) { aoqi@0: return String.format("b%d s%d c%d i%d", a0, a1, a2, a3); aoqi@0: } aoqi@0: aoqi@0: static String pwL1(long a0, long a1, long a2, long a3, long a4) { aoqi@0: return String.format("b%d s%d c%d i%d j%d", a0, a1, a2, a3, a4); aoqi@0: } aoqi@0: aoqi@0: static String pwL2(Long a0, Long a1, Long a2, Long a3, Long a4) { aoqi@0: return String.format("b%d s%d c%d i%d j%d", a0, a1, a2, a3, a4); aoqi@0: } aoqi@0: aoqi@0: static String pwS1(short a0, short a1) { aoqi@0: return String.format("b%d s%d", a0, a1); aoqi@0: } aoqi@0: aoqi@0: static String pwS2(Short a0, Short a1) { aoqi@0: return String.format("b%d s%d", a0, a1); aoqi@0: } aoqi@0: aoqi@0: static String pwD1(double a0, double a1) { aoqi@0: return String.format("f%f d%f", a0, a1); aoqi@0: } aoqi@0: aoqi@0: static String pwD2(Double a0, Double a1) { aoqi@0: return String.format("f%f d%f", a0, a1); aoqi@0: } aoqi@0: aoqi@0: public void testPrimitiveWidening() { aoqi@0: WidenS ws1 = LambdaTranslationTest2::pwS1; aoqi@0: assertEquals("b1 s2", ws1.m((byte) 1, (short) 2)); aoqi@0: aoqi@0: WidenD wd1 = LambdaTranslationTest2::pwD1; aoqi@0: assertEquals("f1.000000 d2.000000", wd1.m(1.0f, 2.0)); aoqi@0: aoqi@0: WidenI wi1 = LambdaTranslationTest2::pwI1; aoqi@0: assertEquals("b1 s2 c3 i4", wi1.m((byte) 1, (short) 2, (char) 3, 4)); aoqi@0: aoqi@0: WidenL wl1 = LambdaTranslationTest2::pwL1; aoqi@0: assertEquals("b1 s2 c3 i4 j5", wl1.m((byte) 1, (short) 2, (char) 3, 4, 5L)); aoqi@0: aoqi@0: // @@@ TODO: clarify spec on widen+box conversion aoqi@0: } aoqi@0: aoqi@0: interface Unbox { aoqi@0: public String m(Byte a0, Short a1, Character a2, Integer a3, Long a4, Boolean a5, Float a6, Double a7); aoqi@0: } aoqi@0: aoqi@0: static String pu(byte a0, short a1, char a2, int a3, long a4, boolean a5, float a6, double a7) { aoqi@0: return String.format("b%d s%d c%c i%d j%d z%b f%f d%f", a0, a1, a2, a3, a4, a5, a6, a7); aoqi@0: } aoqi@0: aoqi@0: public void testUnboxing() { aoqi@0: Unbox u = LambdaTranslationTest2::pu; aoqi@0: assertEquals("b1 s2 cA i4 j5 ztrue f6.000000 d7.000000", u.m((byte)1, (short) 2, 'A', 4, 5L, true, 6.0f, 7.0)); aoqi@0: } aoqi@0: aoqi@0: public void testBoxing() { aoqi@0: Box b = LambdaTranslationTest2::pb; aoqi@0: assertEquals("b1 s2 cA i4 j5 ztrue f6.000000 d7.000000", b.m((byte) 1, (short) 2, 'A', 4, 5L, true, 6.0f, 7.0)); aoqi@0: } aoqi@0: aoqi@0: static boolean cc(Object o) { aoqi@0: return ((String) o).equals("foo"); aoqi@0: } aoqi@0: aoqi@0: public void testArgCastingAdaptation() { aoqi@0: TPredicate p = LambdaTranslationTest2::cc; aoqi@0: assertTrue(p.test("foo")); aoqi@0: assertTrue(!p.test("bar")); aoqi@0: } aoqi@0: aoqi@0: interface SonOfPredicate extends TPredicate { } aoqi@0: aoqi@0: public void testExtendsSAM() { aoqi@0: SonOfPredicate p = s -> s.isEmpty(); aoqi@0: assertTrue(p.test("")); aoqi@0: assertTrue(!p.test("foo")); aoqi@0: } aoqi@0: aoqi@0: public void testConstructorRef() { aoqi@0: Factory> lf = ArrayList::new; aoqi@0: List list = lf.make(); aoqi@0: assertTrue(list instanceof ArrayList); aoqi@0: assertTrue(list != lf.make()); aoqi@0: list.add("a"); aoqi@0: assertEquals("[a]", list.toString()); aoqi@0: } aoqi@0: aoqi@0: private static String privateMethod() { aoqi@0: return "private"; aoqi@0: } aoqi@0: aoqi@0: public void testPrivateMethodRef() { aoqi@0: Factory sf = LambdaTranslationTest2::privateMethod; aoqi@0: assertEquals("private", sf.make()); aoqi@0: } aoqi@0: aoqi@0: private interface PrivateIntf { aoqi@0: String make(); aoqi@0: } aoqi@0: aoqi@0: public void testPrivateIntf() { aoqi@0: PrivateIntf p = () -> "foo"; aoqi@0: assertEquals("foo", p.make()); aoqi@0: } aoqi@0: aoqi@0: interface Op { aoqi@0: public T op(T a, T b); aoqi@0: } aoqi@0: aoqi@0: public void testBoxToObject() { aoqi@0: Op maxer = Math::max; aoqi@0: for (int i=-100000; i < 100000; i += 100) aoqi@0: for (int j=-100000; j < 100000; j += 99) { aoqi@0: assertEquals((int) maxer.op(i,j), Math.max(i,j)); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: protected static String protectedMethod() { aoqi@0: return "protected"; aoqi@0: } aoqi@0: aoqi@0: public void testProtectedMethodRef() { aoqi@0: Factory sf = LambdaTranslationTest2::protectedMethod; aoqi@0: assertEquals("protected", sf.make()); aoqi@0: } aoqi@0: aoqi@0: class Inner1 { aoqi@0: String m1() { aoqi@0: return "Inner1.m1()"; aoqi@0: } aoqi@0: aoqi@0: class Inner2 { aoqi@0: public String m1() { aoqi@0: return "Inner1.Inner2.m1()"; aoqi@0: } aoqi@0: aoqi@0: protected String m2() { aoqi@0: return "Inner1.Inner2.m2()"; aoqi@0: } aoqi@0: aoqi@0: String m3() { aoqi@0: return "Inner1.Inner2.m3()"; aoqi@0: } aoqi@0: aoqi@0: class Inner3 { aoqi@0: T t = null; aoqi@0: Inner3(T t) { aoqi@0: this.t = t; aoqi@0: } aoqi@0: T m1() { aoqi@0: return t; aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: public void testInnerClassMethodRef() { aoqi@0: Factory fs = new Inner1()::m1; aoqi@0: assertEquals("Inner1.m1()", fs.make()); aoqi@0: aoqi@0: fs = new Inner1().new Inner2()::m1; aoqi@0: assertEquals("Inner1.Inner2.m1()", fs.make()); aoqi@0: aoqi@0: fs = new Inner1().new Inner2()::m2; aoqi@0: assertEquals("Inner1.Inner2.m2()", fs.make()); aoqi@0: aoqi@0: fs = new Inner1().new Inner2()::m3; aoqi@0: assertEquals("Inner1.Inner2.m3()", fs.make()); aoqi@0: aoqi@0: fs = new Inner1().new Inner2().new Inner3("Inner1.Inner2.Inner3")::m1; aoqi@0: assertEquals("Inner1.Inner2.Inner3", fs.make()); aoqi@0: aoqi@0: Factory fsi = new Inner1().new Inner2().new Inner3(100)::m1; aoqi@0: assertEquals(100, (int)fsi.make()); aoqi@0: } aoqi@0: }