// TARGET_BACKEND: WASM // WITH_RUNTIME // FILE: externals.js function roundTrip(x) { return x; } // FILE: externals.kt external fun roundTrip(x: EI?): EI? fun assertTrue(x: Boolean) { if (!x) error("assertTrue fail") } fun assertFalse(x: Boolean) { if (x) error("assertFalse fail") } external interface EI @JsFun("() => null") external fun getNull(): EI? @JsFun("() => undefined") external fun getUndefined(): EI? @JsFun("(ref) => ref === null") external fun isJsNull(ref: EI?): Boolean @JsFun("(ref) => ref === undefined") external fun isJsUndefined(ref: EI?): Boolean @JsFun("() => null") external fun getJsNullAsNonNullable(): EI @JsFun("() => undefined") external fun getJsUndefinedAsNonNullable(): EI fun box(): String { val jsNull = getNull() val jsUndefined = getUndefined() assertTrue(jsNull == null) assertTrue((jsNull as Any?) == null) assertTrue((jsNull as Any?) === null) assertTrue(jsUndefined == null) assertTrue(isJsNull(null)) assertTrue(isJsNull(null as EI?)) assertTrue(isJsNull(null as? EI?)) assertTrue(isJsNull(roundTrip(null))) assertTrue(isJsNull(jsNull)) assertFalse(isJsUndefined(null)) assertTrue(isJsUndefined(jsUndefined)) // TODO: Should these fail? val n2 = getJsNullAsNonNullable() val ud2 = getJsUndefinedAsNonNullable() assertTrue(isJsNull(n2)) assertTrue(isJsUndefined(ud2)) return "OK" }