Add more tests for SAM wrappers

This commit is contained in:
Steven Schäfer
2019-09-16 13:43:23 +02:00
committed by Alexander Udalov
parent c3d0a7582c
commit 64aa50a921
6 changed files with 185 additions and 0 deletions
+76
View File
@@ -0,0 +1,76 @@
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// FILE: MyRunnable.java
public interface MyRunnable {
public void run();
}
// FILE: Foo.kt
package foo
import MyRunnable
class A {
inline fun doWork(noinline job: () -> Unit) {
Runnable(job).run()
}
fun doNoninlineWork(job: () -> Unit) {
Runnable(job).run()
}
}
class B {
inline fun doWork(noinline job: () -> Unit) {
Runnable(job).run()
}
fun doNonInlineWork(job: () -> Unit) {
MyRunnable(job).run()
}
}
// FILE: test.kt
import foo.A
import foo.B
fun classForName(name: String): Class<*>? =
try {
java.lang.Class.forName(name)
} catch (e: Throwable) {
null
}
fun box(): String {
var result = false
A().doWork { result = true }
if (!result) return "Fail 1"
result = false
A().doNoninlineWork { result = true }
if (!result) return "Fail 2"
result = false
B().doWork { result = true }
if (!result) return "Fail 3"
result = false
B().doNonInlineWork { result = true }
if (!result) return "Fail 4"
val inlineWrapperA = classForName("foo.A\$sam\$i\$java_lang_Runnable$0")
if (inlineWrapperA == null) return "Fail 5: Can't find sam wrapper"
if (inlineWrapperA.modifiers and 1 == 0) return "Fail 6: inline sam wrapper is non-public"
val wrapperA = classForName("foo.A\$sam\$java_lang_Runnable$0")
if (wrapperA == null) return "Fail 7: Can't find sam wrapper"
if (wrapperA.modifiers and 1 != 0) return "Fail 8: non-inline sam wrapper is public"
val inlineWrapperB = classForName("foo.B\$sam\$i\$java_lang_Runnable$0")
if (inlineWrapperB != null) return "Fail 9: sam wrapper not cached"
val wrapperB = classForName("foo.B\$sam\$MyRunnable$0")
if (wrapperB == null) return "Fail 10: Can't find sam wrapper"
if (wrapperB.modifiers and 1 != 0) return "Fail 11: non-inline sam wrapper is public"
return "OK"
}
+26
View File
@@ -0,0 +1,26 @@
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// FILE: Test.java
public class Test {
public static boolean isNull(Runnable r) {
if (r == null)
return true;
r.run();
return false;
}
}
// FILE: test.kt
fun nullableFun(fromNull: Boolean): (() -> Unit)? =
if (fromNull) null else {{}}
fun box(): String {
if (!Test.isNull(nullableFun(true))) return "Fail 1"
if (Test.isNull(nullableFun(false))) return "Fail 2"
if (!Test.isNull(null)) return "Fail 3"
if (Test.isNull {}) return "Fail 4"
return "OK"
}
@@ -0,0 +1,38 @@
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// FULL_JDK
// FILE: test.kt
// Test that SAM wrappers with type parameters are cached properly.
class A {
fun stringPredicate(string: String, p: (String) -> Boolean): Boolean {
return java.util.function.Predicate<String>(p).test(string)
}
fun intPredicate(int: Int, p: (Int) -> Boolean): Boolean {
return java.util.function.Predicate<Int>(p).test(int)
}
}
fun wrapStringPredicate(p: (String) -> Boolean): java.util.function.Predicate<String> =
java.util.function.Predicate<String>(p)
fun wrapIntPredicate(p: (Int) -> Boolean): java.util.function.Predicate<Int> =
java.util.function.Predicate<Int>(p)
fun box(): String {
if (!A().stringPredicate("OK") { it == "OK"}) return "Fail 1"
if (!A().intPredicate(0) { it == 0 }) return "Fail 2"
try {
java.lang.Class.forName("TestKt\$sam\$java_util_function_Predicate$0")
} catch (e: Throwable) {
return "Fail 3: sam wrapper not found"
}
val stringPredicateWrapperClass = wrapStringPredicate { true }::class.java
val intPredicateWrapperClass = wrapIntPredicate { false }::class.java
if (stringPredicateWrapperClass !== intPredicateWrapperClass)
return "Fail 4: sam wrapper not cached"
return "OK"
}