Add contract samples for stdlib
This commit is contained in:
@@ -0,0 +1,213 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package samples.contracts
|
||||
|
||||
import samples.*
|
||||
import kotlin.test.*
|
||||
import kotlin.contracts.*
|
||||
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
fun returnsContract(condition: Boolean) {
|
||||
contract {
|
||||
returns() implies (condition)
|
||||
}
|
||||
if (!condition) throw IllegalArgumentException()
|
||||
}
|
||||
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
fun returnsTrueContract(condition: Boolean): Boolean {
|
||||
contract {
|
||||
returns(true) implies (condition)
|
||||
}
|
||||
return condition
|
||||
}
|
||||
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
fun returnsFalseContract(condition: Boolean): Boolean {
|
||||
contract {
|
||||
returns(false) implies (condition)
|
||||
}
|
||||
return !condition
|
||||
}
|
||||
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
fun returnsNullContract(condition: Boolean): Boolean? {
|
||||
contract {
|
||||
returns(null) implies (condition)
|
||||
}
|
||||
return if (condition) null else false
|
||||
}
|
||||
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
fun returnsNotNullContract(condition: Boolean): Boolean? {
|
||||
contract {
|
||||
returnsNotNull() implies (condition)
|
||||
}
|
||||
return if (condition) true else null
|
||||
}
|
||||
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
inline fun callsInPlaceAtMostOnceContract(block: () -> Unit) {
|
||||
contract {
|
||||
callsInPlace(block, InvocationKind.AT_MOST_ONCE)
|
||||
}
|
||||
}
|
||||
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
inline fun callsInPlaceAtLeastOnceContract(block: () -> Unit) {
|
||||
contract {
|
||||
callsInPlace(block, InvocationKind.AT_LEAST_ONCE)
|
||||
}
|
||||
block()
|
||||
block()
|
||||
}
|
||||
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
inline fun <T> callsInPlaceExactlyOnceContract(block: () -> T): T {
|
||||
contract {
|
||||
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
return block()
|
||||
}
|
||||
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
inline fun callsInPlaceUnknownContract(block: () -> Unit) {
|
||||
contract {
|
||||
callsInPlace(block, InvocationKind.UNKNOWN)
|
||||
}
|
||||
block()
|
||||
block()
|
||||
block()
|
||||
}
|
||||
|
||||
@RunWith(Enclosed::class)
|
||||
class Contracts {
|
||||
|
||||
class Initialization {
|
||||
|
||||
@Sample
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
fun valPossibleInitialization() {
|
||||
val x: Int
|
||||
|
||||
callsInPlaceAtMostOnceContract {
|
||||
x = 10
|
||||
assertEquals(10, x)
|
||||
}
|
||||
}
|
||||
|
||||
@Sample
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
fun varInitializationOrReassignment() {
|
||||
var x: Int
|
||||
|
||||
callsInPlaceAtLeastOnceContract {
|
||||
x = 10
|
||||
}
|
||||
|
||||
assertEquals(10, x)
|
||||
}
|
||||
|
||||
@Sample
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
fun valInitialization() {
|
||||
val x: Int
|
||||
|
||||
callsInPlaceExactlyOnceContract {
|
||||
x = 10
|
||||
}
|
||||
|
||||
assertEquals(10, x)
|
||||
}
|
||||
|
||||
@Sample
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
fun varPossibleInitialization() {
|
||||
var x: Int
|
||||
|
||||
callsInPlaceUnknownContract {
|
||||
x = 10
|
||||
assertEquals(10, x)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Smartcasts {
|
||||
@Sample
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
fun continueWithNotNull() {
|
||||
fun run(x: Any?) {
|
||||
returnsContract(x != null)
|
||||
assertNotNull(x)
|
||||
}
|
||||
|
||||
try {
|
||||
run("Hello, Kotlin!")
|
||||
run(10)
|
||||
run(null)
|
||||
} catch (e: IllegalArgumentException) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Sample
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
fun continueWithInt() {
|
||||
fun run(x: Number) {
|
||||
if (returnsTrueContract(x is Int)) {
|
||||
@Suppress("USELESS_IS_CHECK")
|
||||
assertTrue(x is Int)
|
||||
}
|
||||
}
|
||||
|
||||
run(10)
|
||||
run(-.9)
|
||||
run(0L)
|
||||
}
|
||||
|
||||
@Sample
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
fun continueWithNotNullString() {
|
||||
fun run(x: Any?) {
|
||||
if (!returnsFalseContract(x is String)) {
|
||||
assertNotNull(x)
|
||||
@Suppress("USELESS_IS_CHECK")
|
||||
assertTrue(x is String)
|
||||
}
|
||||
}
|
||||
|
||||
run("Hello, Kotlin!")
|
||||
run(10)
|
||||
run(null)
|
||||
}
|
||||
|
||||
@Sample
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
fun continueWithNotNullInt() {
|
||||
fun run(x: Int?) {
|
||||
if (returnsNullContract(x != null) == null) {
|
||||
assertNotNull(x)
|
||||
}
|
||||
}
|
||||
|
||||
run(10)
|
||||
run(null)
|
||||
}
|
||||
|
||||
@Sample
|
||||
@kotlin.contracts.ExperimentalContracts
|
||||
fun continueWithNull() {
|
||||
fun run(x: Any?) {
|
||||
if (returnsNotNullContract(x == null) != null) {
|
||||
assertNull(x)
|
||||
}
|
||||
}
|
||||
|
||||
run(10)
|
||||
run(null)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user