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