Files
kotlin-fork/compiler/testData/codegen/box/reflection/methodsFromAny/propertyAccessorEqualsHashCode.kt
T
Alexander Udalov 4fffed4165 Improve test on equals/hashCode for KProperty accessors
Remove duplication & unnecessary checks, check equality in both
directions, check hashCode, add more cases, rename variables for
clarity.

 #KT-13490
2021-04-19 20:39:54 +02:00

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