Files
kotlin-fork/compiler/testData/codegen/box/vararg/evaluationOrder.kt
T

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"
}