Mercurial > hg > Members > kono > jpf-core
diff src/tests/java8/LambdaTest.java @ 0:61d41facf527
initial v8 import (history reset)
author | Peter Mehlitz <Peter.C.Mehlitz@nasa.gov> |
---|---|
date | Fri, 23 Jan 2015 10:14:01 -0800 |
parents | |
children | 7be90179bb3b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/tests/java8/LambdaTest.java Fri Jan 23 10:14:01 2015 -0800 @@ -0,0 +1,170 @@ +/* + * Copyright (C) 2014, United States Government, as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All rights reserved. + * + * The Java Pathfinder core (jpf-core) platform is licensed under the + * Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package java8; + +import gov.nasa.jpf.util.test.TestJPF; + +import org.junit.Test; + +/** + * @author Nastaran Shafiei <nastaran.shafiei@gmail.com> + */ +public class LambdaTest extends TestJPF{ + + static class EnforcedException extends RuntimeException { + // nothing in here + } + + @Test + public void testFuncObjAssignment() { + if(verifyUnhandledException(EnforcedException.class.getName())) { + + Runnable r = () -> { + throw new EnforcedException(); // make sure it gets here + }; + + assertTrue(r != null); + + (new Thread(r)).start(); + } + } + + public interface FI1 { + void sam(); + } + + public interface FI2 extends FI1 { + @Override + public String toString(); + } + + @Test + public void testSyntheticFuncObjClass() { + if (verifyNoPropertyViolation()) { + + FI2 fi = () -> { + return; + }; + + assertTrue(fi != null); + + Class cls = fi.getClass(); + + assertEquals(cls.getInterfaces().length, 1); + + assertEquals(cls.getDeclaredMethods().length, 1); + + assertSame(cls.getInterfaces()[0], FI2.class); + + assertSame(cls.getSuperclass(), Object.class); + } + } + + public interface FI3 { + public String ret(); + } + + @Test + public void testSAMReturn() { + if (verifyNoPropertyViolation()) { + FI3 rt = () -> { + return "something"; + }; + + assertEquals(rt.ret(),"something"); + } + } + + public class C { + int x = 1; + } + + public interface IncX { + public int incX(C o); + } + + @Test + public void testLambdaArgument() { + if (verifyNoPropertyViolation()) { + IncX fo = (arg) -> { + return ++arg.x; + }; + + C o = new C(); + + assertEquals(fo.incX(o),2); + assertEquals(fo.incX(o),3); + } + } + + static Integer io = new Integer(20); + + @Test + public void testClosure() { + if (verifyNoPropertyViolation()) { + int i = 10; + + FI1 fi = () -> { + assertSame(i,10); + assertSame(io.intValue(), 20); + }; + + fi.sam(); + } + } + + static void method(FI1 fi) { + fi.sam(); + } + + @Test + public void testPassingToMethod() { + if (verifyUnhandledException(EnforcedException.class.getName())) { + int i = 10; + + method(() -> { + assertSame(i,10); + assertSame(io.intValue(), 20); + throw new EnforcedException(); + }); + } + } + + // When invokedynamic executes for the first time, it creates a new function object. + // Re-executing the same bytecode returns the existing function object. + @Test + public void testRepeatInvokedynamic() { + if (verifyNoPropertyViolation()) { + int i = 10; + FI1 f1, f2 = null; + + for(int j=0; j<2; j++) { + f1 = () -> { + System.out.println("hello world!"); + }; + + if(j==1) { + assertTrue(f1!=null); + assertSame(f1,f2); + } + + f2 = f1; + } + } + } +}