diff src/tests/java8/DefaultMethodTest.java @ 19:9fea3d8da9aa

!!! NOTE: this marks the beginning of Java 8 dependency for jpf-core compilation. From now on, we are free to use default methods and lambdas. added convenience Loggable and PrintStreamable interfaces that mix in the respective fat interfaces via default methods, so that we don't have to burn inheritance of respective target classes (they only have to provide getLogger() and getPrintStream() methods) added a abstract LoggablePeer so that model classes can implement Loggable with intercepted/native logging if they provide a respective concrete peer. added some more default interface method tests
author Peter Mehlitz <pcmehlitz@gmail.com>
date Wed, 01 Apr 2015 12:14:15 -0700
parents 61d41facf527
children
line wrap: on
line diff
--- a/src/tests/java8/DefaultMethodTest.java	Tue Mar 31 15:37:44 2015 -0700
+++ b/src/tests/java8/DefaultMethodTest.java	Wed Apr 01 12:14:15 2015 -0700
@@ -17,7 +17,10 @@
  */
 package java8;
 
+import gov.nasa.jpf.annotation.MJI;
 import gov.nasa.jpf.util.test.TestJPF;
+import gov.nasa.jpf.vm.MJIEnv;
+import gov.nasa.jpf.vm.NativePeer;
 import gov.nasa.jpf.vm.Verify;
 import org.junit.Test;
 
@@ -80,7 +83,64 @@
       assertTrue (result == 45);
     }    
   }
-  
-  
+
+  //------------------------------------------- overloaded methods
+
+  interface E1 {
+    default int foo (String s1, String s2){
+      System.out.println("this is E1.foo(String,String)");
+      return 42;
+    }
+
+    default int foo (Object o1, Object o2){
+      System.out.println("this is E1.foo(Object,Object)");
+      return 0;
+    }
+  }
+
+  static class F implements E1 {
+    String getId() {
+      return "whatever";
+    }
+
+    void bar (){
+      int r = foo("blah", getId());
+      assertTrue(r == 42);
+    }
+  }
+
+  @Test
+  public void testOverloadedDefaults(){
+    if (verifyNoPropertyViolation()){
+      F o = new F();
+      o.bar();
+    }
+  }
+
+  //----------------------------------------------- native peer for interface
+
+  interface G1 {
+    default int foo (){  // should be intercepted by peer
+      System.out.println("this is bytecode G1.foo()");
+      return -1;
+    }
+  }
+
+  static class H implements G1 {
+    void bar (){
+      int r = foo();
+      //assertTrue(r == 42);
+    }
+  }
+
+  @Test
+  public void testInterfacePeer(){
+    if (verifyNoPropertyViolation()){
+      H o = new H();
+      o.bar();
+    }
+  }
+
   // <2do> how to test IncompatibleClassChangeError without explicit classfile restore?
 }
+