Mercurial > vim
diff src/testdir/test_functions.vim @ 32570:5d8cff99a027 v9.0.1617
patch 9.0.1617: charidx() result is not consistent with byteidx()
Commit: https://github.com/vim/vim/commit/577922b917e48285a7a312daf7b5bbc6e272939c
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Thu Jun 8 17:09:45 2023 +0100
patch 9.0.1617: charidx() result is not consistent with byteidx()
Problem: charidx() and utf16idx() result is not consistent with byteidx().
Solution: When the index is equal to the length of the text return the
lenght of the text instead of -1. (Yegappan Lakshmanan,
closes #12503)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 08 Jun 2023 18:15:04 +0200 |
parents | aa64fdad1f60 |
children | a699363f01cd |
line wrap: on
line diff
--- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -1395,7 +1395,8 @@ func Test_charidx() call assert_equal(1, charidx(a, 3)) call assert_equal(2, charidx(a, 4)) call assert_equal(3, charidx(a, 7)) - call assert_equal(-1, charidx(a, 8)) + call assert_equal(4, charidx(a, 8)) + call assert_equal(-1, charidx(a, 9)) call assert_equal(-1, charidx(a, -1)) " count composing characters @@ -1403,14 +1404,18 @@ func Test_charidx() call assert_equal(2, a->charidx(2, 1)) call assert_equal(3, a->charidx(4, 1)) call assert_equal(5, a->charidx(7, 1)) - call assert_equal(-1, a->charidx(8, 1)) + call assert_equal(6, a->charidx(8, 1)) + call assert_equal(-1, a->charidx(9, 1)) " empty string - call assert_equal(-1, charidx('', 0)) - call assert_equal(-1, charidx('', 0, 1)) + call assert_equal(0, charidx('', 0)) + call assert_equal(-1, charidx('', 1)) + call assert_equal(0, charidx('', 0, 1)) + call assert_equal(-1, charidx('', 1, 1)) " error cases - call assert_equal(-1, charidx(test_null_string(), 0)) + call assert_equal(0, charidx(test_null_string(), 0)) + call assert_equal(-1, charidx(test_null_string(), 1)) call assert_fails('let x = charidx([], 1)', 'E1174:') call assert_fails('let x = charidx("abc", [])', 'E1210:') call assert_fails('let x = charidx("abc", 1, [])', 'E1212:') @@ -1422,10 +1427,10 @@ endfunc func Test_charidx_from_utf16_index() " string with single byte characters let str = "abc" - for i in range(3) + for i in range(4) call assert_equal(i, charidx(str, i, v:false, v:true)) endfor - call assert_equal(-1, charidx(str, 3, v:false, v:true)) + call assert_equal(-1, charidx(str, 4, v:false, v:true)) " string with two byte characters let str = "a漏漏b" @@ -1433,7 +1438,8 @@ func Test_charidx_from_utf16_index() call assert_equal(1, charidx(str, 1, v:false, v:true)) call assert_equal(2, charidx(str, 2, v:false, v:true)) call assert_equal(3, charidx(str, 3, v:false, v:true)) - call assert_equal(-1, charidx(str, 4, v:false, v:true)) + call assert_equal(4, charidx(str, 4, v:false, v:true)) + call assert_equal(-1, charidx(str, 5, v:false, v:true)) " string with four byte characters let str = "a馃槉馃槉b" @@ -1443,38 +1449,48 @@ func Test_charidx_from_utf16_index() call assert_equal(2, charidx(str, 3, v:false, v:true)) call assert_equal(2, charidx(str, 4, v:false, v:true)) call assert_equal(3, charidx(str, 5, v:false, v:true)) - call assert_equal(-1, charidx(str, 6, v:false, v:true)) + call assert_equal(4, charidx(str, 6, v:false, v:true)) + call assert_equal(-1, charidx(str, 7, v:false, v:true)) " string with composing characters let str = '-a虂-b虂' for i in str->strcharlen()->range() call assert_equal(i, charidx(str, i, v:false, v:true)) endfor - call assert_equal(-1, charidx(str, 4, v:false, v:true)) + call assert_equal(4, charidx(str, 4, v:false, v:true)) + call assert_equal(-1, charidx(str, 5, v:false, v:true)) for i in str->strchars()->range() call assert_equal(i, charidx(str, i, v:true, v:true)) endfor - call assert_equal(-1, charidx(str, 6, v:true, v:true)) + call assert_equal(6, charidx(str, 6, v:true, v:true)) + call assert_equal(-1, charidx(str, 7, v:true, v:true)) " string with multiple composing characters let str = '-a台虂-a台虂' for i in str->strcharlen()->range() call assert_equal(i, charidx(str, i, v:false, v:true)) endfor - call assert_equal(-1, charidx(str, 4, v:false, v:true)) + call assert_equal(4, charidx(str, 4, v:false, v:true)) + call assert_equal(-1, charidx(str, 5, v:false, v:true)) for i in str->strchars()->range() call assert_equal(i, charidx(str, i, v:true, v:true)) endfor - call assert_equal(-1, charidx(str, 8, v:true, v:true)) + call assert_equal(8, charidx(str, 8, v:true, v:true)) + call assert_equal(-1, charidx(str, 9, v:true, v:true)) " empty string - call assert_equal(-1, charidx('', 0, v:false, v:true)) - call assert_equal(-1, charidx('', 0, v:true, v:true)) + call assert_equal(0, charidx('', 0, v:false, v:true)) + call assert_equal(-1, charidx('', 1, v:false, v:true)) + call assert_equal(0, charidx('', 0, v:true, v:true)) + call assert_equal(-1, charidx('', 1, v:true, v:true)) " error cases - call assert_equal(-1, charidx('', 0, v:false, v:true)) - call assert_equal(-1, charidx('', 0, v:true, v:true)) - call assert_equal(-1, charidx(test_null_string(), 0, v:false, v:true)) + call assert_equal(0, charidx('', 0, v:false, v:true)) + call assert_equal(-1, charidx('', 1, v:false, v:true)) + call assert_equal(0, charidx('', 0, v:true, v:true)) + call assert_equal(-1, charidx('', 1, v:true, v:true)) + call assert_equal(0, charidx(test_null_string(), 0, v:false, v:true)) + call assert_equal(-1, charidx(test_null_string(), 1, v:false, v:true)) call assert_fails('let x = charidx("abc", 1, v:false, [])', 'E1212:') call assert_fails('let x = charidx("abc", 1, v:true, [])', 'E1212:') endfunc @@ -1483,10 +1499,10 @@ endfunc func Test_utf16idx_from_byteidx() " UTF-16 index of a string with single byte characters let str = "abc" - for i in range(3) + for i in range(4) call assert_equal(i, utf16idx(str, i)) endfor - call assert_equal(-1, utf16idx(str, 3)) + call assert_equal(-1, utf16idx(str, 4)) " UTF-16 index of a string with two byte characters let str = 'a漏漏b' @@ -1496,7 +1512,8 @@ func Test_utf16idx_from_byteidx() call assert_equal(2, str->utf16idx(3)) call assert_equal(2, str->utf16idx(4)) call assert_equal(3, str->utf16idx(5)) - call assert_equal(-1, str->utf16idx(6)) + call assert_equal(4, str->utf16idx(6)) + call assert_equal(-1, str->utf16idx(7)) " UTF-16 index of a string with four byte characters let str = 'a馃槉馃槉b' @@ -1510,7 +1527,8 @@ func Test_utf16idx_from_byteidx() call assert_equal(4, utf16idx(str, 7)) call assert_equal(4, utf16idx(str, 8)) call assert_equal(5, utf16idx(str, 9)) - call assert_equal(-1, utf16idx(str, 10)) + call assert_equal(6, utf16idx(str, 10)) + call assert_equal(-1, utf16idx(str, 11)) " UTF-16 index of a string with composing characters let str = '-a虂-b虂' @@ -1522,7 +1540,8 @@ func Test_utf16idx_from_byteidx() call assert_equal(3, utf16idx(str, 5)) call assert_equal(3, utf16idx(str, 6)) call assert_equal(3, utf16idx(str, 7)) - call assert_equal(-1, utf16idx(str, 8)) + call assert_equal(4, utf16idx(str, 8)) + call assert_equal(-1, utf16idx(str, 9)) call assert_equal(0, utf16idx(str, 0, v:true)) call assert_equal(1, utf16idx(str, 1, v:true)) call assert_equal(2, utf16idx(str, 2, v:true)) @@ -1531,7 +1550,8 @@ func Test_utf16idx_from_byteidx() call assert_equal(4, utf16idx(str, 5, v:true)) call assert_equal(5, utf16idx(str, 6, v:true)) call assert_equal(5, utf16idx(str, 7, v:true)) - call assert_equal(-1, utf16idx(str, 8, v:true)) + call assert_equal(6, utf16idx(str, 8, v:true)) + call assert_equal(-1, utf16idx(str, 9, v:true)) " string with multiple composing characters let str = '-a台虂-a台虂' @@ -1547,7 +1567,8 @@ func Test_utf16idx_from_byteidx() call assert_equal(3, utf16idx(str, 9)) call assert_equal(3, utf16idx(str, 10)) call assert_equal(3, utf16idx(str, 11)) - call assert_equal(-1, utf16idx(str, 12)) + call assert_equal(4, utf16idx(str, 12)) + call assert_equal(-1, utf16idx(str, 13)) call assert_equal(0, utf16idx(str, 0, v:true)) call assert_equal(1, utf16idx(str, 1, v:true)) call assert_equal(2, utf16idx(str, 2, v:true)) @@ -1560,16 +1581,21 @@ func Test_utf16idx_from_byteidx() call assert_equal(6, utf16idx(str, 9, v:true)) call assert_equal(7, utf16idx(str, 10, v:true)) call assert_equal(7, utf16idx(str, 11, v:true)) - call assert_equal(-1, utf16idx(str, 12, v:true)) + call assert_equal(8, utf16idx(str, 12, v:true)) + call assert_equal(-1, utf16idx(str, 13, v:true)) " empty string - call assert_equal(-1, utf16idx('', 0)) - call assert_equal(-1, utf16idx('', 0, v:true)) + call assert_equal(0, utf16idx('', 0)) + call assert_equal(-1, utf16idx('', 1)) + call assert_equal(0, utf16idx('', 0, v:true)) + call assert_equal(-1, utf16idx('', 1, v:true)) " error cases - call assert_equal(-1, utf16idx("", 0)) + call assert_equal(0, utf16idx("", 0)) + call assert_equal(-1, utf16idx("", 1)) call assert_equal(-1, utf16idx("abc", -1)) - call assert_equal(-1, utf16idx(test_null_string(), 0)) + call assert_equal(0, utf16idx(test_null_string(), 0)) + call assert_equal(-1, utf16idx(test_null_string(), 1)) call assert_fails('let l = utf16idx([], 0)', 'E1174:') call assert_fails('let l = utf16idx("ab", [])', 'E1210:') call assert_fails('let l = utf16idx("ab", 0, [])', 'E1212:') @@ -1581,14 +1607,16 @@ func Test_utf16idx_from_charidx() for i in str->strcharlen()->range() call assert_equal(i, utf16idx(str, i, v:false, v:true)) endfor - call assert_equal(-1, utf16idx(str, 3, v:false, v:true)) + call assert_equal(3, utf16idx(str, 3, v:false, v:true)) + call assert_equal(-1, utf16idx(str, 4, v:false, v:true)) " UTF-16 index of a string with two byte characters let str = "a漏漏b" for i in str->strcharlen()->range() call assert_equal(i, utf16idx(str, i, v:false, v:true)) endfor - call assert_equal(-1, utf16idx(str, 4, v:false, v:true)) + call assert_equal(4, utf16idx(str, 4, v:false, v:true)) + call assert_equal(-1, utf16idx(str, 5, v:false, v:true)) " UTF-16 index of a string with four byte characters let str = "a馃槉馃槉b" @@ -1596,36 +1624,44 @@ func Test_utf16idx_from_charidx() call assert_equal(2, utf16idx(str, 1, v:false, v:true)) call assert_equal(4, utf16idx(str, 2, v:false, v:true)) call assert_equal(5, utf16idx(str, 3, v:false, v:true)) - call assert_equal(-1, utf16idx(str, 4, v:false, v:true)) + call assert_equal(6, utf16idx(str, 4, v:false, v:true)) + call assert_equal(-1, utf16idx(str, 5, v:false, v:true)) " UTF-16 index of a string with composing characters let str = '-a虂-b虂' for i in str->strcharlen()->range() call assert_equal(i, utf16idx(str, i, v:false, v:true)) endfor - call assert_equal(-1, utf16idx(str, 4, v:false, v:true)) + call assert_equal(4, utf16idx(str, 4, v:false, v:true)) + call assert_equal(-1, utf16idx(str, 5, v:false, v:true)) for i in str->strchars()->range() call assert_equal(i, utf16idx(str, i, v:true, v:true)) endfor - call assert_equal(-1, utf16idx(str, 6, v:true, v:true)) + call assert_equal(6, utf16idx(str, 6, v:true, v:true)) + call assert_equal(-1, utf16idx(str, 7, v:true, v:true)) " string with multiple composing characters let str = '-a台虂-a台虂' for i in str->strcharlen()->range() call assert_equal(i, utf16idx(str, i, v:false, v:true)) endfor - call assert_equal(-1, utf16idx(str, 4, v:false, v:true)) + call assert_equal(4, utf16idx(str, 4, v:false, v:true)) + call assert_equal(-1, utf16idx(str, 5, v:false, v:true)) for i in str->strchars()->range() call assert_equal(i, utf16idx(str, i, v:true, v:true)) endfor - call assert_equal(-1, utf16idx(str, 8, v:true, v:true)) + call assert_equal(8, utf16idx(str, 8, v:true, v:true)) + call assert_equal(-1, utf16idx(str, 9, v:true, v:true)) " empty string - call assert_equal(-1, utf16idx('', 0, v:false, v:true)) - call assert_equal(-1, utf16idx('', 0, v:true, v:true)) + call assert_equal(0, utf16idx('', 0, v:false, v:true)) + call assert_equal(-1, utf16idx('', 1, v:false, v:true)) + call assert_equal(0, utf16idx('', 0, v:true, v:true)) + call assert_equal(-1, utf16idx('', 1, v:true, v:true)) " error cases - call assert_equal(-1, utf16idx(test_null_string(), 0, v:true, v:true)) + call assert_equal(0, utf16idx(test_null_string(), 0, v:true, v:true)) + call assert_equal(-1, utf16idx(test_null_string(), 1, v:true, v:true)) call assert_fails('let l = utf16idx("ab", 0, v:false, [])', 'E1212:') endfunc