| var log = "" |
| fun log(a: String) { |
| log += a + ";" |
| } |
| |
| interface C { |
| fun foo(x: Int): Unit { |
| log("C.foo($x)") |
| } |
| } |
| |
| interface I { |
| fun foo(x: Int = 1): Unit |
| } |
| |
| class G(c: C) : C by c, I |
| class H(c: C) : I, C by c |
| |
| fun test1() { |
| log = "" |
| |
| val g1 = G(object: C {}) |
| g1.foo(2) |
| g1.foo() |
| val g2 = G(object: C { |
| override fun foo(x: Int) { |
| log("[2] object:C.foo($x)") |
| } |
| }) |
| g2.foo(2) |
| g2.foo() |
| } |
| |
| fun test2() { |
| log = "" |
| |
| val h1 = H(object: C {}) |
| h1.foo(2) |
| h1.foo() |
| val h2 = H(object: C { |
| override fun foo(x: Int) { |
| log("[2] object:C.foo($x)") |
| } |
| }) |
| h2.foo(2) |
| h2.foo() |
| } |
| |
| |
| fun box(): String { |
| test1() |
| if (log != "C.foo(2);C.foo(1);[2] object:C.foo(2);[2] object:C.foo(1);") return "fail1: $log" |
| |
| test2() |
| if (log != "C.foo(2);C.foo(1);[2] object:C.foo(2);[2] object:C.foo(1);") return "fail2: $log" |
| |
| return "OK" |
| } |