4fffed4165
Remove duplication & unnecessary checks, check equality in both directions, check hashCode, add more cases, rename variables for clarity. #KT-13490
70 lines
2.6 KiB
Kotlin
Vendored
70 lines
2.6 KiB
Kotlin
Vendored
// TARGET_BACKEND: JVM
|
|
// WITH_REFLECT
|
|
|
|
import kotlin.reflect.KMutableProperty1
|
|
import kotlin.reflect.KMutableProperty2
|
|
import kotlin.reflect.full.*
|
|
|
|
class C(val token: Int) {
|
|
var member = 42
|
|
var String.memberExtension: Int
|
|
get() = 42
|
|
set(value) {}
|
|
|
|
override fun equals(other: Any?): Boolean =
|
|
other is C && token == other.token
|
|
}
|
|
|
|
var String.topLevel: String
|
|
get() = this
|
|
set(value) {}
|
|
|
|
fun checkEqual(a: Any, b: Any) {
|
|
if (a != b || b != a) throw AssertionError("Objects should be equal")
|
|
if (a.hashCode() != b.hashCode()) throw AssertionError("Hash codes should be equal")
|
|
}
|
|
|
|
fun checkNotEqual(a: Any, b: Any) {
|
|
if (a == b || b == a) throw AssertionError("Objects should NOT be equal")
|
|
}
|
|
|
|
fun box(): String {
|
|
val unboundMember = C::member
|
|
val unboundMemberReflect = C::class.memberProperties.single { it.name == "member" } as KMutableProperty1
|
|
val unboundTopLevel = String::topLevel
|
|
|
|
checkEqual(unboundMember.getter, unboundMemberReflect.getter)
|
|
checkEqual(unboundMember.setter, unboundMemberReflect.setter)
|
|
checkNotEqual(unboundMember.getter, unboundMember.setter)
|
|
|
|
val boundMember = C(42)::member
|
|
val boundTopLevel = ""::topLevel
|
|
|
|
checkEqual(boundMember.getter, boundMember.getter)
|
|
checkEqual(boundMember.setter, boundMember.setter)
|
|
checkEqual(unboundMember.getter, C::member.getter)
|
|
checkEqual(unboundMember.setter, C::member.setter)
|
|
|
|
val memberExtension = C::class.memberExtensionProperties.single { it.name == "memberExtension" } as KMutableProperty2
|
|
|
|
// Accessors of KProperty0, KProperty1 and KProperty2 are not equal to each other
|
|
checkNotEqual(boundMember.getter, unboundMember.getter)
|
|
checkNotEqual(boundMember.setter, unboundMember.setter)
|
|
checkNotEqual(boundMember.getter, unboundMemberReflect.getter)
|
|
checkNotEqual(boundMember.setter, unboundMemberReflect.setter)
|
|
checkNotEqual(boundMember.getter, memberExtension.getter)
|
|
checkNotEqual(boundMember.setter, memberExtension.setter)
|
|
checkNotEqual(unboundMember.getter, memberExtension.getter)
|
|
checkNotEqual(unboundMember.setter, memberExtension.setter)
|
|
checkNotEqual(unboundTopLevel.getter, unboundMember.getter)
|
|
checkNotEqual(unboundTopLevel.setter, unboundMember.setter)
|
|
checkNotEqual(unboundTopLevel.getter, boundTopLevel.getter)
|
|
checkNotEqual(unboundTopLevel.setter, boundTopLevel.setter)
|
|
|
|
// Check that receiver value has effect on equals
|
|
checkNotEqual(C(42)::member.getter, C(43)::member.getter)
|
|
checkNotEqual(C(42)::member.setter, C(43)::member.setter)
|
|
|
|
return "OK"
|
|
}
|