46 lines
1.4 KiB
Kotlin
Vendored
46 lines
1.4 KiB
Kotlin
Vendored
var log = ""
|
|
|
|
fun <T> logged(value: T): T =
|
|
value.also { log += value }
|
|
|
|
fun doTest(id: String, expected: String, expectedLog: String, test: () -> String) {
|
|
log = ""
|
|
val actual = test()
|
|
if (actual != expected) throw AssertionError("$id expected: $expected, actual: $actual")
|
|
if (log != expectedLog) throw AssertionError("$id expectedLog: $expectedLog, actual: $log")
|
|
}
|
|
|
|
object A {
|
|
var sets = ""
|
|
|
|
fun f(vararg va: String, a: String = "default_a;", b: String): String {
|
|
var ret = ""
|
|
for (s in va) {
|
|
ret += s
|
|
}
|
|
return ret + a + b
|
|
}
|
|
|
|
operator fun set(vararg va: String, value: String) {
|
|
for (s in va) {
|
|
sets += s
|
|
}
|
|
log += "set=$value;"
|
|
}
|
|
}
|
|
|
|
operator fun String.inc() = this + logged("inc;")
|
|
|
|
fun box(): String {
|
|
doTest("test1", "1;2;3;", "1;2;3;value;set=value;;") {
|
|
A[logged("1;"), logged("2;"), logged("3;")] = logged("value;")
|
|
A.sets
|
|
}
|
|
|
|
doTest("test2", "1;2;3;default_a;b;", "1;2;3;b;") { A.f(logged("1;"), logged("2;"), logged("3;"), b = logged("b;")) }
|
|
doTest("test3", "1;2;3;a;b;", "1;2;3;b;a;") { A.f(logged("1;"), logged("2;"), logged("3;"), b = logged("b;"), a = logged("a;")) }
|
|
doTest("test4", "1;2;3;a;b;", "1;2;3;a;b;") { A.f(logged("1;"), logged("2;"), logged("3;"), a = logged("a;"), b = logged("b;")) }
|
|
|
|
return "OK"
|
|
}
|