diff --git a/libraries/kotlin.test/common/src/main/kotlin/kotlin/test/Assertions.kt b/libraries/kotlin.test/common/src/main/kotlin/kotlin/test/Assertions.kt index 3c104fb9126c9..b515dbf37d1ba 100644 --- a/libraries/kotlin.test/common/src/main/kotlin/kotlin/test/Assertions.kt +++ b/libraries/kotlin.test/common/src/main/kotlin/kotlin/test/Assertions.kt @@ -61,6 +61,16 @@ fun <@OnlyInputTypes T> assertNotEquals(illegal: T, actual: T, message: String? asserter.assertNotEquals(message, illegal, actual) } +/** Asserts that [expected] is the same instance as [actual], with an optional [message]. */ +fun <@OnlyInputTypes T> assertSame(expected: T, actual: T, message: String? = null) { + asserter.assertSame(message, expected, actual) +} + +/** Asserts that [actual] is not the same instance as [illegal], with an optional [message]. */ +fun <@OnlyInputTypes T> assertNotSame(illegal: T, actual: T, message: String? = null) { + asserter.assertNotSame(message, illegal, actual) +} + /** Asserts that the [actual] value is not `null`, with an optional [message]. */ fun assertNotNull(actual: T?, message: String? = null): T { asserter.assertNotNull(message, actual) @@ -170,6 +180,24 @@ interface Asserter { assertTrue({ messagePrefix(message) + "Illegal value: <$actual>." }, actual != illegal) } + /** + * Asserts that the specified values are the same instance. + * + * @param message the message to report if the assertion fails. + */ + fun assertSame(message: String?, expected: Any?, actual: Any?): Unit { + assertTrue({ messagePrefix(message) + "Expected <$expected>, actual <$actual>." }, actual === expected) + } + + /** + * Asserts that the specified values are not the same instance. + * + * @param message the message to report if the assertion fails. + */ + fun assertNotSame(message: String?, illegal: Any?, actual: Any?): Unit { + assertTrue({ messagePrefix(message) + "Illegal value: <$actual>." }, actual !== illegal) + } + /** * Asserts that the specified value is `null`. * diff --git a/libraries/kotlin.test/common/src/test/kotlin/kotlin/test/tests/BasicAssertionsTest.kt b/libraries/kotlin.test/common/src/test/kotlin/kotlin/test/tests/BasicAssertionsTest.kt index 6dacb8f08ea34..1f4b724135084 100644 --- a/libraries/kotlin.test/common/src/test/kotlin/kotlin/test/tests/BasicAssertionsTest.kt +++ b/libraries/kotlin.test/common/src/test/kotlin/kotlin/test/tests/BasicAssertionsTest.kt @@ -9,6 +9,12 @@ class BasicAssertionsTest { assertEquals(1, 1) } + @Test + fun testAssertSame() { + val instance: Any = object {} + assertSame(instance, instance) + } + @Test fun testAssertEqualsString() { assertEquals("a", "a") @@ -67,6 +73,13 @@ class BasicAssertionsTest { checkFailedAssertion { assertEquals(1, 2) } } + @Test + fun testAssertSameFails() { + val instance1: Any = object {} + val instance2: Any = object {} + checkFailedAssertion { assertEquals(instance1, instance2) } + } + @Test fun testAssertTrue() { assertTrue(true) @@ -107,11 +120,24 @@ class BasicAssertionsTest { assertNotEquals(1, 2) } + @Test + fun testAssertNotSame() { + val instance1: Any = object {} + val instance2: Any = object {} + assertNotEquals(instance1, instance2) + } + @Test() fun testAssertNotEqualsFails() { checkFailedAssertion { assertNotEquals(1, 1) } } + @Test + fun testAssertNotSameFails() { + val instance: Any = object {} + checkFailedAssertion { assertNotEquals(instance, instance) } + } + @Test fun testAssertNotNull() { assertNotNull(true) diff --git a/libraries/kotlin.test/js/src/main/kotlin/kotlin/test/DefaultJsAsserter.kt b/libraries/kotlin.test/js/src/main/kotlin/kotlin/test/DefaultJsAsserter.kt index f5e165f506572..0a23bdb480874 100644 --- a/libraries/kotlin.test/js/src/main/kotlin/kotlin/test/DefaultJsAsserter.kt +++ b/libraries/kotlin.test/js/src/main/kotlin/kotlin/test/DefaultJsAsserter.kt @@ -44,6 +44,18 @@ internal object DefaultJsAsserter : Asserter { super.assertNotEquals(message, illegal, actual) } + override fun assertSame(message: String?, expected: Any?, actual: Any?) { + e = expected + a = actual + super.assertSame(message, expected, actual) + } + + override fun assertNotSame(message: String?, illegal: Any?, actual: Any?) { + e = illegal + a = actual + super.assertNotSame(message, illegal, actual) + } + override fun assertNull(message: String?, actual: Any?) { a = actual super.assertNull(message, actual) diff --git a/libraries/kotlin.test/junit/src/main/kotlin/JUnitSupport.kt b/libraries/kotlin.test/junit/src/main/kotlin/JUnitSupport.kt index a0aa575d5c4a9..b6dc8db119998 100644 --- a/libraries/kotlin.test/junit/src/main/kotlin/JUnitSupport.kt +++ b/libraries/kotlin.test/junit/src/main/kotlin/JUnitSupport.kt @@ -27,6 +27,14 @@ object JUnitAsserter : Asserter { Assert.assertNotEquals(message, illegal, actual) } + override fun assertSame(message : String?, expected : Any?, actual : Any?) { + Assert.assertSame(message, expected, actual) + } + + override fun assertNotSame(message : String?, illegal : Any?, actual : Any?) { + Assert.assertNotSame(message, illegal, actual) + } + override fun assertNotNull(message : String?, actual : Any?) { Assert.assertNotNull(message ?: "actual value is null", actual) }