From 55eccf6abe4c8a70a27c239ebe77bdad797d89c5 Mon Sep 17 00:00:00 2001 From: Gonzalo Chumillas Date: Fri, 30 May 2025 04:15:08 +0100 Subject: [PATCH] jsgen: fix string.runes method (fix #20500) (#24609) --- vlib/builtin/js/string.js.v | 11 +++--- vlib/v/gen/js/tests/string.v | 66 ++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 vlib/v/gen/js/tests/string.v diff --git a/vlib/builtin/js/string.js.v b/vlib/builtin/js/string.js.v index f33eb0926c..3672c801af 100644 --- a/vlib/builtin/js/string.js.v +++ b/vlib/builtin/js/string.js.v @@ -7,13 +7,10 @@ pub: } pub fn (s string) runes() []rune { - mut runes := []rune{} - for i := 0; i < s.len; i++ { - mut r := rune(`0`) - #r = new rune(s.str[i.val].charCodeAt()) - runes << r - } - return runes + ret := JS.makeEmptyArray() + #for (r of s.str) array_push(ret,new rune(r),false); + + return ret } pub fn (s string) slice(a int, b int) string { diff --git a/vlib/v/gen/js/tests/string.v b/vlib/v/gen/js/tests/string.v new file mode 100644 index 0000000000..836db5aa19 --- /dev/null +++ b/vlib/v/gen/js/tests/string.v @@ -0,0 +1,66 @@ +fn test_runes() { + // Test basic ASCII + emoji + r1 := 'hello๐ŸŽ…'.runes() + assert r1.len == 6 + assert r1[0] == `h` + assert r1[1] == `e` + assert r1[2] == `l` + assert r1[3] == `l` + assert r1[4] == `o` + assert r1[5] == `๐ŸŽ…` + + // Test empty string + r2 := ''.runes() + assert r2.len == 0 + + // Test single character + r3 := 'A'.runes() + assert r3.len == 1 + assert r3[0] == `A` + + // Test Unicode characters + r4 := 'cafรฉ'.runes() + assert r4.len == 4 + assert r4[0] == `c` + assert r4[1] == `a` + assert r4[2] == `f` + assert r4[3] == `รฉ` + + // Test multiple emojis + r5 := '๐ŸŽ…๐ŸŽ„๐ŸŽ'.runes() + assert r5.len == 3 + assert r5[0] == `๐ŸŽ…` + assert r5[1] == `๐ŸŽ„` + assert r5[2] == `๐ŸŽ` + + // Test mixed ASCII, Unicode and emojis + r6 := 'helloไธ–็•Œ๐ŸŒ'.runes() + assert r6.len == 8 + assert r6[0] == `h` + assert r6[1] == `e` + assert r6[2] == `l` + assert r6[3] == `l` + assert r6[4] == `o` + assert r6[5] == `ไธ–` + assert r6[6] == `็•Œ` + assert r6[7] == `๐ŸŒ` + + // Test special characters + r7 := '\n\t'.runes() + assert r7.len == 2 + assert r7[0] == `\n` + assert r7[1] == `\t` + + // Test mathematical symbols + r8 := 'ฮฑ+ฮฒ=ฮณ'.runes() + assert r8.len == 5 + assert r8[0] == `ฮฑ` + assert r8[1] == `+` + assert r8[2] == `ฮฒ` + assert r8[3] == `=` + assert r8[4] == `ฮณ` +} + +fn main() { + test_runes() +}