Add contracts to assertions

This commit is contained in:
Pavel Punegov
2018-10-22 20:44:17 +03:00
committed by Pavel Punegov
parent ed323a98b5
commit b3797c98ff
2 changed files with 23 additions and 0 deletions
@@ -163,6 +163,24 @@ class BasicAssertionsTest {
fun testExpectFails() {
checkFailedAssertion { expect(1) { 2 } }
}
@Test
fun testContracts() {
open class S
class P(val str: String = "P") : S()
val s: S = P()
val p: Any = P("A")
assertTrue(s is P)
assertEquals("P", s.str)
assertFalse(p !is P)
assertEquals("A", p.str)
val nullableT: P? = P("N")
assertNotNull(nullableT)
assertEquals("N", nullableT.str)
}
}
@@ -10,6 +10,7 @@
package kotlin.test
import kotlin.contracts.*
import kotlin.internal.InlineOnly
import kotlin.internal.OnlyInputTypes
import kotlin.reflect.KClass
@@ -25,6 +26,7 @@ public fun assertTrue(message: String? = null, block: () -> Boolean): Unit = ass
/** Asserts that the expression is `true` with an optional [message]. */
public fun assertTrue(actual: Boolean, message: String? = null) {
contract { returns() implies actual }
return asserter.assertTrue(message ?: "Expected value to be true.", actual)
}
@@ -33,6 +35,7 @@ public fun assertFalse(message: String? = null, block: () -> Boolean): Unit = as
/** Asserts that the expression is `false` with an optional [message]. */
public fun assertFalse(actual: Boolean, message: String? = null) {
contract { returns() implies (!actual) }
return asserter.assertTrue(message ?: "Expected value to be false.", !actual)
}
@@ -58,12 +61,14 @@ public fun <@OnlyInputTypes T> assertNotSame(illegal: T, actual: T, message: Str
/** Asserts that the [actual] value is not `null`, with an optional [message]. */
public fun <T : Any> assertNotNull(actual: T?, message: String? = null): T {
contract { returns() implies (actual != null) }
asserter.assertNotNull(message, actual)
return actual!!
}
/** Asserts that the [actual] value is not `null`, with an optional [message] and a function [block] to process the not-null value. */
public fun <T: Any, R> assertNotNull(actual: T?, message: String? = null, block: (T) -> R) {
contract { returns() implies (actual != null) }
asserter.assertNotNull(message, actual)
if (actual != null) {
block(actual)