added "dynamic" fields (get/set/call fields by name using dynamic standard function

This commit is contained in:
sergeych committed 2025-08-12 00:15:45 +03:00
1 parent e916d9805a
commit 6d8eed7b8c
5 files changed
+170 -13

No files matched your search

+40 -11
View File
@@ -44,20 +44,49 @@ class OOTest {
""".trimIndent())
}
// @Test
fun testDynamic() = runTest {
@Test
fun testDynamicGet() = runTest {
eval("""
println("0")
class DynamicTest : Dynamic {
fun getDynamic(name) {
if (name == "foo") "bar" else null
val accessor = dynamic {
get { name ->
if( name == "foo" ) "bar" else null
}
}
println("1")
val d = DynamicTest()
println(d)
println("2")
println("-- " + accessor.foo)
assertEquals("bar", accessor.foo)
assertEquals(null, accessor.bar)
""".trimIndent())
}
@Test
fun testDelegateSet() = runTest {
eval("""
var setValueForBar = null
val accessor = dynamic {
get { name ->
when(name) {
"foo" -> "bar"
"bar" -> setValueForBar
else -> null
}
}
set { name, value ->
if( name == "bar" )
setValueForBar = value
else throw IllegalAssignmentException("Can't assign "+name)
}
}
assertEquals("bar", accessor.foo)
assertEquals(null, accessor.bar)
accessor.bar = "buzz"
assertEquals("buzz", accessor.bar)
assertThrows {
accessor.bad = "!23"
}
""".trimIndent())
}
}