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
This commit is contained in:
Alexander Udalov
2021-04-19 20:12:39 +02:00
committed by Alexander Udalov
parent c959b271a4
commit 4fffed4165
9 changed files with 92 additions and 102 deletions
@@ -3000,12 +3000,6 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/callableReference/bound/equals/nullableReceiverInEquals.kt");
}
@Test
@TestMetadata("propertyAccessors.kt")
public void testPropertyAccessors() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/bound/equals/propertyAccessors.kt");
}
@Test
@TestMetadata("receiverInEquals.kt")
public void testReceiverInEquals() throws Exception {
@@ -35559,6 +35553,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/reflection/methodsFromAny/parametersToString.kt");
}
@Test
@TestMetadata("propertyAccessorEqualsHashCode.kt")
public void testPropertyAccessorEqualsHashCode() throws Exception {
runTest("compiler/testData/codegen/box/reflection/methodsFromAny/propertyAccessorEqualsHashCode.kt");
}
@Test
@TestMetadata("propertyEqualsHashCode.kt")
public void testPropertyEqualsHashCode() throws Exception {
@@ -1,64 +0,0 @@
// DONT_TARGET_EXACT_BACKEND: WASM
// WASM_MUTE_REASON: IGNORED_IN_JS
// IGNORE_BACKEND: JS_IR
// IGNORE_BACKEND: JS_IR_ES6
// TODO: investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
// WITH_REFLECT
import kotlin.reflect.KMutableProperty1
import kotlin.reflect.KMutableProperty2
import kotlin.reflect.full.*
class C {
var prop = 42
var String.prop: Int
get() = 42
set(value) {}
}
val cProp = C()::prop
val C_prop = C::prop
val C_propReflect = C::class.memberProperties.find { it.name == "prop" } as? KMutableProperty1 ?: throw AssertionError()
val C_extPropReflect = C::class.memberExtensionProperties.find { it.name == "prop" } as? KMutableProperty2 ?: throw AssertionError()
fun box() =
when {
C_prop.getter != C_propReflect.getter -> "C_prop.getter != C_propReflect.getter"
C_prop.setter != C_propReflect.setter -> "C_prop.setter != C_propReflect.setter"
C_propReflect.getter != C_prop.getter -> "C_propReflect.getter != C_prop.getter"
C_propReflect.setter != C_prop.setter -> "C_propReflect.setter != C_prop.setter"
// reflexive test of acessors of KProperty0, KProperty1, KProperty2
cProp.getter != cProp.getter -> "cProp.getter != cProp.getter"
cProp.setter != cProp.setter -> "cProp.setter != cProp.setter"
C_prop.getter != C_prop.getter -> "C_prop.getter != C_prop.getter"
C_prop.setter != C_prop.setter -> "C_prop.setter != C_prop.setter"
C_propReflect.getter != C_propReflect.getter -> "C_propReflect.getter != C_propReflect.getter"
C_propReflect.setter != C_propReflect.setter -> "C_propReflect.setter != C_propReflect.setter"
C_extPropReflect.getter != C_extPropReflect.getter -> "C_extPropReflect.getter != C_extPropReflect.getter"
C_extPropReflect.setter != C_extPropReflect.setter -> "C_extPropReflect.setter != C_extPropReflect.setter"
// acessors of KProperty0, Kproperty1 and Kproperty2 are not equal to each other
cProp.getter == C_prop.getter -> "cProp.getter == C_prop.getter"
cProp.setter == C_prop.setter -> "cProp.setter == C_prop.setter"
C_prop.getter == cProp.getter -> "C_prop.getter == cProp.getter"
C_prop.setter == cProp.setter -> "C_prop.setter == cProp.setter"
cProp.getter == C_propReflect.getter -> "cProp.getter == C_propReflect.getter"
cProp.setter == C_propReflect.setter -> "cProp.setter == C_propReflect.setter"
C_propReflect.getter == cProp.getter -> "C_propReflect.getter == cProp.getter"
C_propReflect.setter == cProp.setter -> "C_propReflect.setter == cProp.setter"
cProp.getter == C_extPropReflect.getter -> "cProp.getter == C_extPropReflect.getter"
cProp.setter == C_extPropReflect.setter -> "cProp.setter == C_extPropReflect.setter"
C_extPropReflect.getter == cProp.getter -> "C_extPropReflect.getter == cProp.getter"
C_extPropReflect.setter == cProp.setter -> "C_extPropReflect.setter == cProp.setter"
C_prop.getter == C_extPropReflect.getter -> "C_prop.getter == C_extPropReflect.getter"
C_prop.setter == C_extPropReflect.setter -> "C_prop.setter == C_extPropReflect.setter"
C_extPropReflect.getter == C_prop.getter -> "C_extPropReflect.getter == C_prop.getter"
C_extPropReflect.setter == C_prop.setter -> "C_extPropReflect.setter == C_prop.setter"
else -> "OK"
}
@@ -0,0 +1,69 @@
// 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"
}
@@ -3000,12 +3000,6 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/callableReference/bound/equals/nullableReceiverInEquals.kt");
}
@Test
@TestMetadata("propertyAccessors.kt")
public void testPropertyAccessors() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/bound/equals/propertyAccessors.kt");
}
@Test
@TestMetadata("receiverInEquals.kt")
public void testReceiverInEquals() throws Exception {
@@ -35535,6 +35529,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/reflection/methodsFromAny/parametersToString.kt");
}
@Test
@TestMetadata("propertyAccessorEqualsHashCode.kt")
public void testPropertyAccessorEqualsHashCode() throws Exception {
runTest("compiler/testData/codegen/box/reflection/methodsFromAny/propertyAccessorEqualsHashCode.kt");
}
@Test
@TestMetadata("propertyEqualsHashCode.kt")
public void testPropertyEqualsHashCode() throws Exception {
@@ -3000,12 +3000,6 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/callableReference/bound/equals/nullableReceiverInEquals.kt");
}
@Test
@TestMetadata("propertyAccessors.kt")
public void testPropertyAccessors() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/bound/equals/propertyAccessors.kt");
}
@Test
@TestMetadata("receiverInEquals.kt")
public void testReceiverInEquals() throws Exception {
@@ -35559,6 +35553,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/reflection/methodsFromAny/parametersToString.kt");
}
@Test
@TestMetadata("propertyAccessorEqualsHashCode.kt")
public void testPropertyAccessorEqualsHashCode() throws Exception {
runTest("compiler/testData/codegen/box/reflection/methodsFromAny/propertyAccessorEqualsHashCode.kt");
}
@Test
@TestMetadata("propertyEqualsHashCode.kt")
public void testPropertyEqualsHashCode() throws Exception {
@@ -2630,11 +2630,6 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/callableReference/bound/equals/nullableReceiverInEquals.kt");
}
@TestMetadata("propertyAccessors.kt")
public void testPropertyAccessors() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/bound/equals/propertyAccessors.kt");
}
@TestMetadata("receiverInEquals.kt")
public void testReceiverInEquals() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/bound/equals/receiverInEquals.kt");
@@ -28161,6 +28156,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/reflection/methodsFromAny/parametersToString.kt");
}
@TestMetadata("propertyAccessorEqualsHashCode.kt")
public void testPropertyAccessorEqualsHashCode() throws Exception {
runTest("compiler/testData/codegen/box/reflection/methodsFromAny/propertyAccessorEqualsHashCode.kt");
}
@TestMetadata("propertyEqualsHashCode.kt")
public void testPropertyEqualsHashCode() throws Exception {
runTest("compiler/testData/codegen/box/reflection/methodsFromAny/propertyEqualsHashCode.kt");
@@ -1850,11 +1850,6 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes
runTest("compiler/testData/codegen/box/callableReference/bound/equals/nullableReceiverInEquals.kt");
}
@TestMetadata("propertyAccessors.kt")
public void testPropertyAccessors() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/bound/equals/propertyAccessors.kt");
}
@TestMetadata("receiverInEquals.kt")
public void testReceiverInEquals() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/bound/equals/receiverInEquals.kt");
@@ -1850,11 +1850,6 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/callableReference/bound/equals/nullableReceiverInEquals.kt");
}
@TestMetadata("propertyAccessors.kt")
public void testPropertyAccessors() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/bound/equals/propertyAccessors.kt");
}
@TestMetadata("receiverInEquals.kt")
public void testReceiverInEquals() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/bound/equals/receiverInEquals.kt");
@@ -1850,11 +1850,6 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/callableReference/bound/equals/nullableReceiverInEquals.kt");
}
@TestMetadata("propertyAccessors.kt")
public void testPropertyAccessors() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/bound/equals/propertyAccessors.kt");
}
@TestMetadata("receiverInEquals.kt")
public void testReceiverInEquals() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/bound/equals/receiverInEquals.kt");