Merge boxWithStdlib testData into box, delete BoxWithStdlib test
This commit is contained in:
committed by
Alexander Udalov
parent
22bfc9786a
commit
06a67e6602
@@ -0,0 +1,37 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.*
|
||||
import kotlin.reflect.jvm.*
|
||||
|
||||
class K {
|
||||
class Nested
|
||||
inner class Inner
|
||||
}
|
||||
|
||||
class Secondary {
|
||||
constructor(x: Int) {}
|
||||
}
|
||||
|
||||
fun check(f: KFunction<Any>) {
|
||||
assert(f.javaMethod == null) { "Fail f method" }
|
||||
assert(f.javaConstructor != null) { "Fail f constructor" }
|
||||
val c = f.javaConstructor!!
|
||||
|
||||
assert(c.kotlinFunction != null) { "Fail m function" }
|
||||
val ff = c.kotlinFunction!!
|
||||
|
||||
assert(f == ff) { "Fail f != ff" }
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
check(::K)
|
||||
|
||||
// Workaround KT-8596
|
||||
val nested = K::Nested
|
||||
check(nested)
|
||||
|
||||
check(K::Inner)
|
||||
check(::Secondary)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class K(var value: Long)
|
||||
|
||||
var K.ext: Double
|
||||
get() = value.toDouble()
|
||||
set(value) {
|
||||
this.value = value.toLong()
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val p = K::ext
|
||||
|
||||
val getter = p.javaGetter!!
|
||||
val setter = p.javaSetter!!
|
||||
|
||||
assertEquals(getter, Class.forName("ExtensionPropertyKt").getMethod("getExt", K::class.java))
|
||||
assertEquals(setter, Class.forName("ExtensionPropertyKt").getMethod("setExt", K::class.java, Double::class.java))
|
||||
|
||||
val k = K(42L)
|
||||
assert(getter.invoke(null, k) == 42.0) { "Fail k getter" }
|
||||
setter.invoke(null, k, -239.0)
|
||||
assert(getter.invoke(null, k) == -239.0) { "Fail k setter" }
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
// WITH_REFLECT
|
||||
// KT-8131 Cannot find backing field in ancestor class via reflection
|
||||
|
||||
import kotlin.reflect.*
|
||||
import kotlin.reflect.jvm.*
|
||||
|
||||
open class TestBase {
|
||||
var id = 0L
|
||||
}
|
||||
|
||||
class TestChild : TestBase()
|
||||
|
||||
fun box(): String {
|
||||
val property = TestChild::class.memberProperties.first { it.name == "id" } as KMutableProperty<*>
|
||||
if (property.javaField == null)
|
||||
return "Fail: no field"
|
||||
if (property.javaGetter == null)
|
||||
return "Fail: no getter"
|
||||
if (property.javaSetter == null)
|
||||
return "Fail: no setter"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.*
|
||||
import kotlin.reflect.jvm.*
|
||||
|
||||
open class TestBase {
|
||||
fun id() = 0L
|
||||
}
|
||||
|
||||
class TestChild : TestBase()
|
||||
|
||||
fun box(): String {
|
||||
if (TestChild::class.memberFunctions.first { it.name == "id" }.javaMethod == null)
|
||||
return "No method for TestChild.id()"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.*
|
||||
import kotlin.reflect.jvm.*
|
||||
|
||||
class K {
|
||||
fun foo(s: String): Int = s.length
|
||||
}
|
||||
fun bar(s: String): Int = s.length
|
||||
fun String.baz(): Int = this.length
|
||||
|
||||
fun check(f: KFunction<Int>) {
|
||||
assert(f.javaConstructor == null) { "Fail f constructor" }
|
||||
assert(f.javaMethod != null) { "Fail f method" }
|
||||
val m = f.javaMethod!!
|
||||
|
||||
assert(m.kotlinFunction != null) { "Fail m function" }
|
||||
val ff = m.kotlinFunction!!
|
||||
|
||||
assert(f == ff) { "Fail f != ff" }
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
check(K::foo)
|
||||
check(::bar)
|
||||
check(String::baz)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.KFunction
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.*
|
||||
|
||||
class C {
|
||||
companion object {
|
||||
@JvmStatic
|
||||
fun foo(s: String): Int = s.length
|
||||
}
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val foo = C.Companion::class.members.single { it.name == "foo" } as KFunction<*>
|
||||
|
||||
val j = foo.javaMethod ?: return "Fail: no Java method found for C::foo"
|
||||
assertEquals(3, j.invoke(C, "abc"))
|
||||
|
||||
val k = j.kotlinFunction ?: return "Fail: no Kotlin function found for Java method C::foo"
|
||||
assertEquals(3, k.call(C, "def"))
|
||||
|
||||
|
||||
val staticMethod = C::class.java.getDeclaredMethod("foo", String::class.java)
|
||||
val k2 = staticMethod.kotlinFunction ?:
|
||||
return "Fail: no Kotlin function found for static bridge for @JvmStatic method in companion object C::foo"
|
||||
assertEquals(3, k2.call(C, "ghi"))
|
||||
|
||||
assertFailsWith(NullPointerException::class) { k2.call(null, "")!! }
|
||||
|
||||
val j2 = k2.javaMethod
|
||||
assertEquals(j, j2)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.KFunction
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
object O {
|
||||
@JvmStatic
|
||||
fun foo(s: String): Int = s.length
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val foo = O::class.members.single { it.name == "foo" } as KFunction<*>
|
||||
|
||||
val j = foo.javaMethod ?: return "Fail: no Java method found for O::foo"
|
||||
assertEquals(3, j.invoke(null, "abc"))
|
||||
|
||||
val k = j.kotlinFunction ?: return "Fail: no Kotlin function found for Java method O::foo"
|
||||
assertEquals(3, k.call(O, "def"))
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
class A
|
||||
|
||||
fun box(): String {
|
||||
val a1 = A::class.java.kotlin
|
||||
val a2 = A::class
|
||||
|
||||
if (a1 != a2) return "Fail equals"
|
||||
if (a1.hashCode() != a2.hashCode()) return "Fail hashCode"
|
||||
if (a1.toString() != a2.toString()) return "Fail toString"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class K(var value: Long)
|
||||
|
||||
fun box(): String {
|
||||
val p = K::value
|
||||
|
||||
assert(p.javaField != null) { "Fail p field" }
|
||||
|
||||
val getter = p.javaGetter!!
|
||||
val setter = p.javaSetter!!
|
||||
|
||||
assertEquals(getter, K::class.java.getMethod("getValue"))
|
||||
assertEquals(setter, K::class.java.getMethod("setValue", Long::class.java))
|
||||
|
||||
val k = K(42L)
|
||||
assert(getter.invoke(k) == 42L) { "Fail k getter" }
|
||||
setter.invoke(k, -239L)
|
||||
assert(getter.invoke(k) == -239L) { "Fail k setter" }
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.*
|
||||
|
||||
var foo = "foo"
|
||||
|
||||
class A {
|
||||
var bar = "bar"
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val fooGetter = ::foo.getter.javaMethod ?: return "Fail fooGetter"
|
||||
assertEquals("foo", fooGetter.invoke(null))
|
||||
|
||||
val fooSetter = ::foo.setter.javaMethod ?: return "Fail fooSetter"
|
||||
fooSetter.invoke(null, "foof")
|
||||
assertEquals("foof", foo)
|
||||
|
||||
assertNull(::foo.getter.javaConstructor)
|
||||
assertNull(::foo.setter.javaConstructor)
|
||||
|
||||
|
||||
val a = A()
|
||||
val barGetter = A::bar.getter.javaMethod ?: return "Fail barGetter"
|
||||
assertEquals("bar", barGetter.invoke(a))
|
||||
|
||||
val barSetter = A::bar.setter.javaMethod ?: return "Fail barSetter"
|
||||
barSetter.invoke(a, "barb")
|
||||
assertEquals("barb", a.bar)
|
||||
|
||||
assertNull(A::bar.getter.javaConstructor)
|
||||
assertNull(A::bar.setter.javaConstructor)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.jvm.*
|
||||
|
||||
var state: String = "value"
|
||||
@JvmName("getter")
|
||||
get
|
||||
@JvmName("setter")
|
||||
set
|
||||
|
||||
fun box(): String {
|
||||
val p = ::state
|
||||
|
||||
if (p.name != "state") return "Fail name: ${p.name}"
|
||||
if (p.get() != "value") return "Fail get: ${p.get()}"
|
||||
p.set("OK")
|
||||
|
||||
val getterName = p.javaGetter!!.getName()
|
||||
if (getterName != "getter") return "Fail getter name: $getterName"
|
||||
|
||||
val setterName = p.javaSetter!!.getName()
|
||||
if (setterName != "setter") return "Fail setter name: $setterName"
|
||||
|
||||
return p.get()
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.jvm.kotlin
|
||||
|
||||
enum class A {
|
||||
// There's a synthetic field "$VALUES" here
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
for (field in A::class.java.getDeclaredFields()) {
|
||||
val prop = field.kotlin
|
||||
if (prop != null) return "Fail, property found: $prop"
|
||||
}
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
var topLevel = "123"
|
||||
|
||||
fun box(): String {
|
||||
val p = ::topLevel
|
||||
|
||||
assert(p.javaField != null) { "Fail p field" }
|
||||
val field = p.javaField!!
|
||||
val className = field.getDeclaringClass().getName()
|
||||
assertEquals("TopLevelPropertyKt", className)
|
||||
|
||||
val getter = p.javaGetter!!
|
||||
val setter = p.javaSetter!!
|
||||
|
||||
assertEquals(getter, Class.forName("TopLevelPropertyKt").getMethod("getTopLevel"))
|
||||
assertEquals(setter, Class.forName("TopLevelPropertyKt").getMethod("setTopLevel", String::class.java))
|
||||
|
||||
assert(getter.invoke(null) == "123") { "Fail k getter" }
|
||||
setter.invoke(null, "456")
|
||||
assert(getter.invoke(null) == "456") { "Fail k setter" }
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
// WITH_REFLECT
|
||||
// FULL_JDK
|
||||
|
||||
import java.lang.reflect.GenericArrayType
|
||||
import java.lang.reflect.TypeVariable
|
||||
import java.lang.reflect.ParameterizedType
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
fun foo(strings: Array<String>, integers: Array<Int>, objectArrays: Array<Array<Any>>) {}
|
||||
|
||||
fun bar(): Array<List<String>> = null!!
|
||||
class A<T> {
|
||||
fun baz(): Array<T> = null!!
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
assertEquals(Array<String>::class.java, ::foo.parameters[0].type.javaType)
|
||||
assertEquals(Array<Int>::class.java, ::foo.parameters[1].type.javaType)
|
||||
assertEquals(Array<Array<Any>>::class.java, ::foo.parameters[2].type.javaType)
|
||||
|
||||
val g = ::bar.returnType.javaType
|
||||
if (g !is GenericArrayType || g.genericComponentType !is ParameterizedType)
|
||||
return "Fail: should be array of parameterized type, but was $g (${g.javaClass})"
|
||||
|
||||
val h = A<String>::baz.returnType.javaType
|
||||
if (h !is GenericArrayType || h.genericComponentType !is TypeVariable<*>)
|
||||
return "Fail: should be array of type variable, but was $h (${h.javaClass})"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.*
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class A(d: Double, s: String, parent: A?) {
|
||||
class Nested(a: A)
|
||||
inner class Inner(nested: Nested)
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
assertEquals(listOf(java.lang.Double.TYPE, String::class.java, A::class.java), ::A.parameters.map { it.type.javaType })
|
||||
assertEquals(listOf(A::class.java), A::Nested.parameters.map { it.type.javaType })
|
||||
assertEquals(listOf(A::class.java, A.Nested::class.java), A::Inner.parameters.map { it.type.javaType })
|
||||
|
||||
assertEquals(A::class.java, ::A.returnType.javaType)
|
||||
assertEquals(A.Nested::class.java, A::Nested.returnType.javaType)
|
||||
assertEquals(A.Inner::class.java, A::Inner.returnType.javaType)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.jvm.javaType
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class A {
|
||||
fun foo(t: Long?): Long = t!!
|
||||
}
|
||||
|
||||
object O {
|
||||
@JvmStatic
|
||||
fun bar(a: A): String = ""
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val foo = A::foo
|
||||
assertEquals(listOf(A::class.java, java.lang.Long::class.java), foo.parameters.map { it.type.javaType })
|
||||
assertEquals(java.lang.Long.TYPE, foo.returnType.javaType)
|
||||
|
||||
val bar = O::class.members.single { it.name == "bar" }
|
||||
assertEquals(listOf(O::class.java, A::class.java), bar.parameters.map { it.type.javaType })
|
||||
assertEquals(String::class.java, bar.returnType.javaType)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.*
|
||||
|
||||
interface I {
|
||||
fun foo(): Any
|
||||
}
|
||||
|
||||
class A : I {
|
||||
override fun foo(): Int = 0
|
||||
fun bar(x: Long): Int = x.toInt()
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
assertEquals(Integer::class.java, A::foo.returnType.javaType)
|
||||
assertNotEquals(Integer.TYPE, A::foo.returnType.javaType)
|
||||
|
||||
assertNotEquals(Integer::class.java, A::bar.returnType.javaType)
|
||||
assertEquals(Integer.TYPE, A::bar.returnType.javaType)
|
||||
|
||||
assertEquals(java.lang.Long.TYPE, A::bar.parameters.last().type.javaType)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
// WITH_REFLECT
|
||||
// FULL_JDK
|
||||
|
||||
import java.lang.reflect.ParameterizedType
|
||||
import kotlin.reflect.*
|
||||
import kotlin.reflect.jvm.javaType
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class A(private var foo: List<String>)
|
||||
|
||||
object O {
|
||||
@JvmStatic
|
||||
private var bar: List<String> = listOf()
|
||||
}
|
||||
|
||||
fun topLevel(): List<String> = listOf()
|
||||
fun Any.extension(): List<String> = listOf()
|
||||
|
||||
fun assertGenericType(type: KType) {
|
||||
val javaType = type.javaType
|
||||
if (javaType !is ParameterizedType) {
|
||||
throw AssertionError("Type should be a parameterized type, but was $javaType (${javaType.javaClass})")
|
||||
}
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val foo = A::class.members.single { it.name == "foo" } as KMutableProperty<*>
|
||||
assertGenericType(foo.returnType)
|
||||
assertGenericType(foo.getter.returnType)
|
||||
assertGenericType(foo.setter.parameters.last().type)
|
||||
|
||||
val bar = O::class.members.single { it.name == "bar" } as KMutableProperty<*>
|
||||
assertGenericType(bar.returnType)
|
||||
assertGenericType(bar.getter.returnType)
|
||||
assertGenericType(bar.setter.parameters.last().type)
|
||||
|
||||
assertGenericType(::topLevel.returnType)
|
||||
assertGenericType(Any::extension.returnType)
|
||||
assertGenericType(::A.parameters.single().type)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.KMutableProperty
|
||||
import kotlin.reflect.jvm.javaType
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class A(private var foo: String)
|
||||
|
||||
object O {
|
||||
@JvmStatic
|
||||
private var bar: String = ""
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val foo = A::class.members.single { it.name == "foo" } as KMutableProperty<*>
|
||||
assertEquals(listOf(A::class.java), foo.parameters.map { it.type.javaType })
|
||||
assertEquals(listOf(A::class.java), foo.getter.parameters.map { it.type.javaType })
|
||||
assertEquals(listOf(A::class.java, String::class.java), foo.setter.parameters.map { it.type.javaType })
|
||||
|
||||
val bar = O::class.members.single { it.name == "bar" } as KMutableProperty<*>
|
||||
assertEquals(listOf(O::class.java), bar.parameters.map { it.type.javaType })
|
||||
assertEquals(listOf(O::class.java), bar.getter.parameters.map { it.type.javaType })
|
||||
assertEquals(listOf(O::class.java, String::class.java), bar.setter.parameters.map { it.type.javaType })
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
fun free(s: String): Int = s.length
|
||||
|
||||
fun Any.extension() {}
|
||||
|
||||
fun box(): String {
|
||||
assertEquals(java.lang.Integer.TYPE, ::free.returnType.javaType)
|
||||
assertEquals(String::class.java, ::free.parameters.single().type.javaType)
|
||||
|
||||
assertEquals(Any::class.java, Any::extension.parameters.single().type.javaType)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
// WITH_REFLECT
|
||||
// FULL_JDK
|
||||
|
||||
import java.lang.reflect.TypeVariable
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class A<T> {
|
||||
fun foo(t: T) {}
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val f = A<String>::foo
|
||||
val t = f.parameters.last().type.javaType
|
||||
if (t !is TypeVariable<*>) return "Fail, t should be a type variable: $t"
|
||||
|
||||
assertEquals("T", t.name)
|
||||
assertEquals("A", (t.genericDeclaration as Class<*>).name)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
fun foo(unitParam: Unit, nullableUnitParam: Unit?): Unit {}
|
||||
|
||||
var bar: Unit = Unit
|
||||
|
||||
fun box(): String {
|
||||
assert(Unit::class.java != java.lang.Void.TYPE)
|
||||
|
||||
assertEquals(Unit::class.java, ::foo.parameters[0].type.javaType)
|
||||
assertEquals(Unit::class.java, ::foo.parameters[1].type.javaType)
|
||||
assertEquals(java.lang.Void.TYPE, ::foo.returnType.javaType)
|
||||
|
||||
assertEquals(Unit::class.java, ::bar.returnType.javaType)
|
||||
assertEquals(Unit::class.java, ::bar.getter.returnType.javaType)
|
||||
assertEquals(Unit::class.java, ::bar.setter.parameters.single().type.javaType)
|
||||
assertEquals(java.lang.Void.TYPE, ::bar.setter.returnType.javaType)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user