fb80c0cb0d
Co-authored-by: ilya-g <ilya.gorbunov@jetbrains.com>
96 lines
2.9 KiB
Kotlin
96 lines
2.9 KiB
Kotlin
/*
|
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
|
*/
|
|
|
|
package test.properties.delegation
|
|
|
|
import kotlin.test.*
|
|
import kotlin.properties.*
|
|
|
|
class NotNullVarTest() {
|
|
@Test fun doTest() {
|
|
NotNullVarTestGeneric("a", "b").doTest()
|
|
}
|
|
}
|
|
|
|
private class NotNullVarTestGeneric<T : Any>(val a1: String, val b1: T) {
|
|
var a: String by Delegates.notNull()
|
|
val bDelegate = Delegates.notNull<T>()
|
|
var b by bDelegate
|
|
|
|
public fun doTest() {
|
|
assertEquals("NotNullProperty(value not initialized yet)", bDelegate.toString())
|
|
a = a1
|
|
b = b1
|
|
assertTrue(a == "a", "fail: a should be a, but was $a")
|
|
assertTrue(b == "b", "fail: b should be b, but was $b")
|
|
assertEquals("NotNullProperty(value=$b)", bDelegate.toString())
|
|
}
|
|
}
|
|
|
|
class ObservablePropertyTest {
|
|
var result = false
|
|
|
|
val bDelegate = Delegates.observable(1) { property, old, new ->
|
|
assertEquals("b", property.name)
|
|
if (!result) assertEquals(1, old)
|
|
result = true
|
|
assertEquals(new, b, "New value has already been set")
|
|
}
|
|
|
|
var b: Int by bDelegate
|
|
|
|
@Test fun doTest() {
|
|
b = 4
|
|
assertTrue(b == 4, "fail: b != 4")
|
|
assertTrue(result, "fail: result should be true")
|
|
assertEquals("ObservableProperty(value=$b)", bDelegate.toString())
|
|
}
|
|
}
|
|
|
|
class A(val p: Boolean)
|
|
|
|
class VetoablePropertyTest {
|
|
var result = false
|
|
var b: A by Delegates.vetoable(A(true), { property, old, new ->
|
|
assertEquals("b", property.name)
|
|
assertEquals(old, b, "New value hasn't been set yet")
|
|
result = new.p == true;
|
|
result
|
|
})
|
|
|
|
@Test fun doTest() {
|
|
val firstValue = A(true)
|
|
b = firstValue
|
|
assertTrue(b == firstValue, "fail1: b should be firstValue = A(true)")
|
|
assertTrue(result, "fail2: result should be true")
|
|
b = A(false)
|
|
assertTrue(b == firstValue, "fail3: b should be firstValue = A(true)")
|
|
assertFalse(result, "fail4: result should be false")
|
|
}
|
|
}
|
|
|
|
private typealias ReadOnlyPropertyDelegateProvider<T, V> =
|
|
PropertyDelegateProvider<T, ReadOnlyProperty<T, V>>
|
|
|
|
class DelegationInterfacesTest {
|
|
val a by ReadOnlyProperty { _, property -> property.name }
|
|
|
|
private val delegatedToProvider = mutableListOf<String>()
|
|
private val provider = ReadOnlyPropertyDelegateProvider { thisRef: DelegationInterfacesTest, property ->
|
|
val index = thisRef.delegatedToProvider.size
|
|
thisRef.delegatedToProvider.add(property.name)
|
|
ReadOnlyProperty { _, prop -> "${prop.name} is numbered $index" }
|
|
}
|
|
|
|
val b by provider
|
|
val c by provider
|
|
|
|
@Test fun doTest() {
|
|
assertEquals("a", a)
|
|
assertEquals(listOf("b", "c"), delegatedToProvider)
|
|
assertEquals("b is numbered 0", b)
|
|
assertEquals("c is numbered 1", c)
|
|
}
|
|
} |