| 1 | // vtest build: linux |
| 2 | // vtest retry: 2 |
| 3 | import os |
| 4 | import time |
| 5 | |
| 6 | fn test_input_rune_iterator_with_unicode_input() { |
| 7 | mut p := os.new_process(@VEXE) |
| 8 | p.set_args(['-e', 'for i, r in input_rune_iterator() { println("> i: \${i:04} | r: `\${r}`") }']) |
| 9 | p.set_redirect_stdio() |
| 10 | p.run() |
| 11 | spawn fn [mut p] () { |
| 12 | time.sleep(10 * time.millisecond) |
| 13 | dump(p.pid) |
| 14 | p.stdin_write('Проба Abc 你好 🌍 123') |
| 15 | time.sleep(10 * time.millisecond) |
| 16 | p.stdin_write('\0x00') // 0 should break the input stream |
| 17 | time.sleep(10 * time.millisecond) |
| 18 | eprintln('>>> done') |
| 19 | }() |
| 20 | mut olines := []string{} |
| 21 | for p.is_alive() { |
| 22 | if oline := p.pipe_read(.stdout) { |
| 23 | olines << oline |
| 24 | } |
| 25 | time.sleep(1 * time.millisecond) |
| 26 | } |
| 27 | p.close() |
| 28 | p.wait() |
| 29 | assert p.code == 0 |
| 30 | eprintln('done') |
| 31 | solines := olines.join('').trim_space().replace('\r', '') |
| 32 | eprintln('solines.len: ${solines.len} | solines: ${solines}') |
| 33 | assert solines.len > 100 |
| 34 | assert solines == '> i: 0000 | r: `П` |
| 35 | > i: 0001 | r: `р` |
| 36 | > i: 0002 | r: `о` |
| 37 | > i: 0003 | r: `б` |
| 38 | > i: 0004 | r: `а` |
| 39 | > i: 0005 | r: ` ` |
| 40 | > i: 0006 | r: `A` |
| 41 | > i: 0007 | r: `b` |
| 42 | > i: 0008 | r: `c` |
| 43 | > i: 0009 | r: ` ` |
| 44 | > i: 0010 | r: `你` |
| 45 | > i: 0011 | r: `好` |
| 46 | > i: 0012 | r: ` ` |
| 47 | > i: 0013 | r: `🌍` |
| 48 | > i: 0014 | r: ` ` |
| 49 | > i: 0015 | r: `1` |
| 50 | > i: 0016 | r: `2` |
| 51 | > i: 0017 | r: `3`' |
| 52 | } |
| 53 | |