| // FILE: externals.js | |
| function createObject() { | |
| return { | |
| getXmethod() { return this.x; }, | |
| setXmethod(v) { this.x = v; } | |
| }; | |
| } | |
| function setX(obj, x) { | |
| obj.x = x; | |
| } | |
| function getX(obj) { | |
| return obj.x; | |
| } | |
| const readOnlyProp = 123; | |
| var mutableProp = "20"; | |
| class C1 { | |
| constructor(a, b) { | |
| this.a = a; | |
| this.b = b; | |
| } | |
| getA() { return this.a; } | |
| setA(v) { this.a = v; } | |
| getB() { return this.b; } | |
| } | |
| C1.Nested1 = class {} | |
| C1.Nested1.Nested2 = class {} | |
| C1.Nested1.Nested2.Nested3 = class { | |
| constructor(x) { | |
| this.x = x; | |
| } | |
| foo() { return this.x + " from Nested 3"; } | |
| } | |
| class C2 extends C1 { | |
| constructor(a, b) { | |
| super(a, b); | |
| this.c = "C"; | |
| } | |
| } | |
| C2.Object1 = { Object2: { Object3: { x: "C2.Object1.Object2.Object3.x" } } } | |
| const externalObj = { | |
| x: "externalObj.x", | |
| y: { x: "externalObj.y.x" }, | |
| c: class { x = "(new externalObj.c()).x" } | |
| } | |
| function jsRenamed() { | |
| return 'renamed' | |
| } | |
| // FILE: externals.kt | |
| external interface Obj { | |
| var x: Int | |
| fun getXmethod(): Int | |
| fun setXmethod(v: Int) | |
| } | |
| external fun createObject(): Obj | |
| external fun setX(obj: Obj, x: Int) | |
| external fun getX(obj: Obj): Int | |
| external val readOnlyProp: Int | |
| external var mutableProp: String | |
| open external class C1 { | |
| constructor(a: String, b: String) | |
| var a: String | |
| val b: String | |
| fun getA(): String | |
| fun setA(x: String) | |
| fun getB(): String | |
| class Nested1 { | |
| class Nested2 { | |
| class Nested3 { | |
| constructor(x: String) | |
| fun foo(): String | |
| } | |
| } | |
| } | |
| } | |
| external class C2 : C1 { | |
| constructor(a: String, b: String) | |
| val c: String | |
| object Object1 { | |
| object Object2 { | |
| object Object3 { | |
| val x: String | |
| } | |
| } | |
| } | |
| } | |
| external object externalObj { | |
| val x: String | |
| object y { | |
| val x: String | |
| } | |
| class c { | |
| val x: String | |
| } | |
| } | |
| @JsName("jsRenamed") | |
| external fun testJsName(): String | |
| fun box(): String { | |
| val obj = createObject() | |
| setX(obj, 100) | |
| if (getX(obj) != 100) return "Fail 2" | |
| if (obj.x != 100) return "Fail 2.1" | |
| obj.x = 200 | |
| if (getX(obj) != 200) return "Fail 2.2" | |
| val objXRef = obj::x | |
| objXRef.set(300) | |
| if (getX(obj) != 300 || obj.x != 300 || objXRef.get() != 300) return "Fail 2.3" | |
| if (obj.getXmethod() != 300) return "Fail 2.4" | |
| obj.setXmethod(400) | |
| if (obj.getXmethod() != 400 || getX(obj) != 400) return "Fail 2.5" | |
| if (readOnlyProp != 123) return "Fail 3" | |
| if (::readOnlyProp.get() != 123) return "Fail 4" | |
| if (mutableProp != "20") return "Fail 5" | |
| mutableProp = "30" | |
| if (mutableProp != "30") return "Fail 6" | |
| (::mutableProp).set("40") | |
| if (mutableProp != "40") return "Fail 7" | |
| val c1 = C1("A", "B") | |
| if (c1.a != "A" || c1.b != "B") return "Fail 8" | |
| if (c1.getA() != "A" || c1.getB() != "B") return "Fail 9" | |
| c1.setA("A2") | |
| if (c1.a != "A2") return "Fail 10" | |
| c1.a = "A3" | |
| if (c1.getA() != "A3") return "Fail 11" | |
| val c2 = C2("A", "B") | |
| if (c2.a != "A" || c2.b != "B" || c2.c != "C") return "Fail 12" | |
| val c2_as_c1: C1 = c2 | |
| if (c2_as_c1.a != "A" || c2_as_c1.b != "B") return "Fail 13" | |
| val nested3 = C1.Nested1.Nested2.Nested3("example") | |
| if (nested3.foo() != "example from Nested 3") return "Fail 14" | |
| if (C2.Object1.Object2.Object3.x != "C2.Object1.Object2.Object3.x") return "Fail 15" | |
| if (externalObj.x != "externalObj.x") return "Fail 16" | |
| if (externalObj.y.x != "externalObj.y.x") return "Fail 17" | |
| if (externalObj.c().x != "(new externalObj.c()).x") return "Fail 18" | |
| if (c1 as Any !is C1) return "Fail 19" | |
| if (c2 as Any !is C1) return "Fail 20" | |
| if (c2 as Any !is C2) return "Fail 21" | |
| if (externalObj.c() as Any !is externalObj.c) return "Fail 22" | |
| if (10 as Any is C1) return "Fail 23" | |
| if (c1 as Any is C2) return "Fail 24" | |
| if (testJsName() != "renamed") return "Fail 25" | |
| return "OK" | |
| } |