| // TARGET_BACKEND: WASM |
| // WITH_STDLIB |
| |
| @JsFun("""(s) => s.length""") |
| external fun jsLength(s: String): Int |
| |
| @JsFun("""(s, index) => s.charCodeAt(index)""") |
| external fun jsCharCodeAt(s: String, index: Int): Int |
| |
| private fun check(actual: String, expected: String, label: String): String? = |
| if (actual == expected) null else "Fail $label: <$actual>" |
| |
| fun box(): String { |
| val chars = charArrayOf('a', '\uD83D', '\uDE80', '\u0000', 'e', '\u0301', 'z') |
| val s = chars.concatToString() |
| |
| check(s, "a\uD83D\uDE80\u0000e\u0301z", "concatToString")?.let { return it } |
| if (s.length != chars.size) return "Fail Kotlin length: ${s.length}" |
| if (jsLength(s) != chars.size) return "Fail JS length: ${jsLength(s)}" |
| |
| for (index in chars.indices) { |
| val actual = jsCharCodeAt(s, index) |
| if (actual != chars[index].code) return "Fail charCodeAt $index: $actual" |
| } |
| |
| val destination = CharArray(8) { '_' } |
| val copied = s.toCharArray(destination, 1, 1, 6).concatToString() |
| val expectedCopy = charArrayOf('_', '\uD83D', '\uDE80', '\u0000', 'e', '\u0301', '_', '_').concatToString() |
| check(copied, expectedCopy, "toCharArray subrange")?.let { return it } |
| |
| return "OK" |
| } |