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