/* * 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(val a1: String, val b1: T) { var a: String by Delegates.notNull() val bDelegate = Delegates.notNull() 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 = PropertyDelegateProvider> class DelegationInterfacesTest { val a by ReadOnlyProperty { _, property -> property.name } private val delegatedToProvider = mutableListOf() 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) } }