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:
committed by
Alexander Udalov
parent
c959b271a4
commit
4fffed4165
+6
-6
@@ -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 {
|
||||
|
||||
-64
@@ -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"
|
||||
}
|
||||
+69
@@ -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"
|
||||
}
|
||||
+6
-6
@@ -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 {
|
||||
|
||||
+6
-6
@@ -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 {
|
||||
|
||||
+5
-5
@@ -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");
|
||||
|
||||
js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java
Generated
-5
@@ -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");
|
||||
|
||||
Generated
-5
@@ -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");
|
||||
|
||||
Generated
-5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user