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"
}