diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/reline/test_unicode.rb | 137 |
1 files changed, 126 insertions, 11 deletions
diff --git a/test/reline/test_unicode.rb b/test/reline/test_unicode.rb index 98ffdcfa26..a0ed7eed7b 100644 --- a/test/reline/test_unicode.rb +++ b/test/reline/test_unicode.rb @@ -30,17 +30,22 @@ class Reline::Unicode::Test < Reline::TestCase end def test_split_by_width - assert_equal [['abc', nil, 'de'], 2], Reline::Unicode.split_by_width('abcde', 3) - assert_equal [['abc', nil, 'def', nil, ''], 3], Reline::Unicode.split_by_width('abcdef', 3) - assert_equal [['ab', nil, 'あd', nil, 'ef'], 3], Reline::Unicode.split_by_width('abあdef', 3) - assert_equal [['ab[zero]c', nil, 'def', nil, ''], 3], Reline::Unicode.split_by_width("ab\1[zero]\2cdef", 3) - assert_equal [["\e[31mabc", nil, "\e[31md\e[42mef", nil, "\e[31m\e[42mg"], 3], Reline::Unicode.split_by_width("\e[31mabcd\e[42mefg", 3) - assert_equal [["ab\e]0;1\ac", nil, "\e]0;1\ad"], 2], Reline::Unicode.split_by_width("ab\e]0;1\acd", 3) + # IRB uses this method. + assert_equal [['abc', 'de'], 2], Reline::Unicode.split_by_width('abcde', 3) end - def test_split_by_width_csi_reset_sgr_optimization - assert_equal [["\e[1ma\e[mb\e[2mc", nil, "\e[2md\e[0me\e[3mf", nil, "\e[3mg"], 3], Reline::Unicode.split_by_width("\e[1ma\e[mb\e[2mcd\e[0me\e[3mfg", 3) - assert_equal [["\e[1ma\e[mzero\e[0m\e[2mb", nil, "\e[1m\e[2mc"], 2], Reline::Unicode.split_by_width("\e[1ma\1\e[mzero\e[0m\2\e[2mbc", 2) + def test_split_line_by_width + assert_equal ['abc', 'de'], Reline::Unicode.split_line_by_width('abcde', 3) + assert_equal ['abc', 'def', ''], Reline::Unicode.split_line_by_width('abcdef', 3) + assert_equal ['ab', 'あd', 'ef'], Reline::Unicode.split_line_by_width('abあdef', 3) + assert_equal ['ab[zero]c', 'def', ''], Reline::Unicode.split_line_by_width("ab\1[zero]\2cdef", 3) + assert_equal ["\e[31mabc", "\e[31md\e[42mef", "\e[31m\e[42mg"], Reline::Unicode.split_line_by_width("\e[31mabcd\e[42mefg", 3) + assert_equal ["ab\e]0;1\ac", "\e]0;1\ad"], Reline::Unicode.split_line_by_width("ab\e]0;1\acd", 3) + end + + def test_split_line_by_width_csi_reset_sgr_optimization + assert_equal ["\e[1ma\e[mb\e[2mc", "\e[2md\e[0me\e[3mf", "\e[3mg"], Reline::Unicode.split_line_by_width("\e[1ma\e[mb\e[2mcd\e[0me\e[3mfg", 3) + assert_equal ["\e[1ma\e[mzero\e[0m\e[2mb", "\e[1m\e[2mc"], Reline::Unicode.split_line_by_width("\e[1ma\1\e[mzero\e[0m\2\e[2mbc", 2) end def test_take_range @@ -56,9 +61,9 @@ class Reline::Unicode::Test < Reline::TestCase def test_nonprinting_start_end # \1 and \2 should be removed assert_equal 'ab[zero]cd', Reline::Unicode.take_range("ab\1[zero]\2cdef", 0, 4) - assert_equal [['ab[zero]cd', nil, 'ef'], 2], Reline::Unicode.split_by_width("ab\1[zero]\2cdef", 4) + assert_equal ['ab[zero]cd', 'ef'], Reline::Unicode.split_line_by_width("ab\1[zero]\2cdef", 4) # CSI between \1 and \2 does not need to be applied to the sebsequent line - assert_equal [["\e[31mab\e[32mcd", nil, "\e[31mef"], 2], Reline::Unicode.split_by_width("\e[31mab\1\e[32m\2cdef", 4) + assert_equal ["\e[31mab\e[32mcd", "\e[31mef"], Reline::Unicode.split_line_by_width("\e[31mab\1\e[32m\2cdef", 4) end def test_strip_non_printing_start_end @@ -129,4 +134,114 @@ class Reline::Unicode::Test < Reline::TestCase assert_equal(sjis_texts, texts.map { |s| Reline::Unicode.safe_encode(s, 'sjis') }) assert_equal(sjis_texts, texts.map { |s| Reline::Unicode.safe_encode(s, Encoding::Windows_31J) }) end + + def test_em_forward_word + assert_equal(12, Reline::Unicode.em_forward_word('abc---fooあbar-baz', 3)) + assert_equal(3, Reline::Unicode.em_forward_word('abcfoo', 3)) + assert_equal(3, Reline::Unicode.em_forward_word('abc---', 3)) + assert_equal(0, Reline::Unicode.em_forward_word('abc', 3)) + end + + def test_em_forward_word_with_capitalization + assert_equal([12, '---Fooあbar'], Reline::Unicode.em_forward_word_with_capitalization('abc---foOあBar-baz', 3)) + assert_equal([3, 'Foo'], Reline::Unicode.em_forward_word_with_capitalization('abcfOo', 3)) + assert_equal([3, '---'], Reline::Unicode.em_forward_word_with_capitalization('abc---', 3)) + assert_equal([0, ''], Reline::Unicode.em_forward_word_with_capitalization('abc', 3)) + assert_equal([6, 'Ii̇i̇'], Reline::Unicode.em_forward_word_with_capitalization('ıİİ', 0)) + end + + def test_em_backward_word + assert_equal(12, Reline::Unicode.em_backward_word('abc foo-barあbaz--- xyz', 20)) + assert_equal(2, Reline::Unicode.em_backward_word(' ', 2)) + assert_equal(2, Reline::Unicode.em_backward_word('ab', 2)) + assert_equal(0, Reline::Unicode.em_backward_word('ab', 0)) + end + + def test_em_big_backward_word + assert_equal(16, Reline::Unicode.em_big_backward_word('abc foo-barあbaz--- xyz', 20)) + assert_equal(2, Reline::Unicode.em_big_backward_word(' ', 2)) + assert_equal(2, Reline::Unicode.em_big_backward_word('ab', 2)) + assert_equal(0, Reline::Unicode.em_big_backward_word('ab', 0)) + end + + def test_ed_transpose_words + # any value that does not trigger transpose + assert_equal([0, 0, 0, 2], Reline::Unicode.ed_transpose_words('aa bb cc ', 1)) + + assert_equal([0, 2, 3, 5], Reline::Unicode.ed_transpose_words('aa bb cc ', 2)) + assert_equal([0, 2, 3, 5], Reline::Unicode.ed_transpose_words('aa bb cc ', 4)) + assert_equal([3, 5, 6, 8], Reline::Unicode.ed_transpose_words('aa bb cc ', 5)) + assert_equal([3, 5, 6, 8], Reline::Unicode.ed_transpose_words('aa bb cc ', 7)) + assert_equal([3, 5, 6, 10], Reline::Unicode.ed_transpose_words('aa bb cc ', 8)) + assert_equal([3, 5, 6, 10], Reline::Unicode.ed_transpose_words('aa bb cc ', 9)) + word1 = 'fooあ' + word2 = 'barあbaz' + left = 'aaa -' + middle = '- -' + right = '- bbb' + expected = [left.bytesize, (left + word1).bytesize, (left + word1 + middle).bytesize, (left + word1 + middle + word2).bytesize] + assert_equal(expected, Reline::Unicode.ed_transpose_words(left + word1 + middle + word2 + right, left.bytesize + word1.bytesize)) + assert_equal(expected, Reline::Unicode.ed_transpose_words(left + word1 + middle + word2 + right, left.bytesize + word1.bytesize + middle.bytesize)) + assert_equal(expected, Reline::Unicode.ed_transpose_words(left + word1 + middle + word2 + right, left.bytesize + word1.bytesize + middle.bytesize + word2.bytesize - 1)) + end + + def test_vi_big_forward_word + assert_equal(18, Reline::Unicode.vi_big_forward_word('abc---fooあbar-baz xyz', 3)) + assert_equal(8, Reline::Unicode.vi_big_forward_word('abcfooあ --', 3)) + assert_equal(6, Reline::Unicode.vi_big_forward_word('abcfooあ', 3)) + assert_equal(2, Reline::Unicode.vi_big_forward_word('abc- ', 3)) # maybe inconsistent + assert_equal(0, Reline::Unicode.vi_big_forward_word('abc', 3)) + end + + def test_vi_big_forward_end_word + assert_equal(4, Reline::Unicode.vi_big_forward_end_word('a bb c', 0)) + assert_equal(4, Reline::Unicode.vi_big_forward_end_word('- bb c', 0)) + assert_equal(1, Reline::Unicode.vi_big_forward_end_word('-a b', 0)) + assert_equal(1, Reline::Unicode.vi_big_forward_end_word('a- b', 0)) + assert_equal(1, Reline::Unicode.vi_big_forward_end_word('aa b', 0)) + assert_equal(3, Reline::Unicode.vi_big_forward_end_word(' aa b', 0)) + assert_equal(15, Reline::Unicode.vi_big_forward_end_word('abc---fooあbar-baz xyz', 3)) + assert_equal(3, Reline::Unicode.vi_big_forward_end_word('abcfooあ --', 3)) + assert_equal(3, Reline::Unicode.vi_big_forward_end_word('abcfooあ', 3)) + assert_equal(2, Reline::Unicode.vi_big_forward_end_word('abc- ', 3)) + assert_equal(0, Reline::Unicode.vi_big_forward_end_word('abc', 3)) + end + + def test_vi_big_backward_word + assert_equal(16, Reline::Unicode.vi_big_backward_word('abc foo-barあbaz--- xyz', 20)) + assert_equal(2, Reline::Unicode.vi_big_backward_word(' ', 2)) + assert_equal(2, Reline::Unicode.vi_big_backward_word('ab', 2)) + assert_equal(0, Reline::Unicode.vi_big_backward_word('ab', 0)) + end + + def test_vi_forward_word + assert_equal(3, Reline::Unicode.vi_forward_word('abc---fooあbar-baz', 3)) + assert_equal(3, Reline::Unicode.vi_forward_word('abc---fooあbar-baz', 6)) # maybe bug + assert_equal(3, Reline::Unicode.vi_forward_word('abcfooあ', 3)) # maybe bug + assert_equal(3, Reline::Unicode.vi_forward_word('abc---', 3)) + assert_equal(0, Reline::Unicode.vi_forward_word('abc', 3)) + end + + def test_vi_forward_end_word + assert_equal(2, Reline::Unicode.vi_forward_end_word('abc---fooあbar-baz', 3)) + assert_equal(2, Reline::Unicode.vi_forward_end_word('abc---fooあbar-baz', 6)) # maybe bug + assert_equal(2, Reline::Unicode.vi_forward_end_word('abcfooあ', 3)) # maybe bug + assert_equal(2, Reline::Unicode.vi_forward_end_word('abc---', 3)) + assert_equal(0, Reline::Unicode.vi_forward_end_word('abc', 3)) + end + + def test_vi_backward_word + assert_equal(3, Reline::Unicode.vi_backward_word('abc foo-barあbaz--- xyz', 20)) + assert_equal(3, Reline::Unicode.vi_backward_word('abc foo-barあbaz--- xyz', 17)) # maybe bug + assert_equal(2, Reline::Unicode.vi_backward_word(' ', 2)) + assert_equal(2, Reline::Unicode.vi_backward_word('ab', 2)) + assert_equal(0, Reline::Unicode.vi_backward_word('ab', 0)) + end + + def test_vi_first_print + assert_equal(3, Reline::Unicode.vi_first_print(' abcdefg')) + assert_equal(2, Reline::Unicode.vi_first_print(' ')) # maybe inconsistent + assert_equal(0, Reline::Unicode.vi_first_print('abc')) + assert_equal(0, Reline::Unicode.vi_first_print('')) + end end |