var log = "" fun 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" }