Mercurial > vim
view src/testdir/test_digraph.vim @ 25340:37001467805f v8.2.3207
patch 8.2.3207: Vim9: crash when compiling string fails
Commit: https://github.com/vim/vim/commit/5a234eb18e6e43408755bb24e813330306c11629
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Jul 24 13:18:48 2021 +0200
patch 8.2.3207: Vim9: crash when compiling string fails
Problem: Vim9: crash when compiling string fails. (Yegappan Lakshmanan)
Solution: Adjust the type stack length.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 24 Jul 2021 13:30:04 +0200 |
parents | c626fd34b66f |
children | 890fd8211202 |
line wrap: on
line source
" Tests for digraphs source check.vim CheckFeature digraphs source term_util.vim func Put_Dig(chars) exe "norm! o\<c-k>".a:chars endfu func Put_Dig_BS(char1, char2) exe "norm! o".a:char1."\<bs>".a:char2 endfu func Test_digraphs() new call Put_Dig("00") call assert_equal("∞", getline('.')) " not a digraph call Put_Dig("el") call assert_equal("l", getline('.')) call Put_Dig("ht") call assert_equal("þ", getline('.')) " digraph "ab" is the same as "ba" call Put_Dig("ab") call Put_Dig("ba") call assert_equal(["ば","ば"], getline(line('.')-1,line('.'))) " Euro sign call Put_Dig("e=") call Put_Dig("=e") call Put_Dig("Eu") call Put_Dig("uE") call assert_equal(['е']+repeat(["€"],3), getline(line('.')-3,line('.'))) " Rouble sign call Put_Dig("R=") call Put_Dig("=R") call Put_Dig("=P") call Put_Dig("P=") call assert_equal(['Р']+repeat(["₽"],2)+['П'], getline(line('.')-3,line('.'))) " Not a digraph call Put_Dig("a\<bs>") call Put_Dig("\<bs>a") call assert_equal(["<BS>", "<BS>a"], getline(line('.')-1,line('.'))) " Grave call Put_Dig("a!") call Put_Dig("!e") call Put_Dig("b!") " not defined call assert_equal(["à", "è", "!"], getline(line('.')-2,line('.'))) " Acute accent call Put_Dig("a'") call Put_Dig("'e") call Put_Dig("b'") " not defined call assert_equal(["á", "é", "'"], getline(line('.')-2,line('.'))) " Cicumflex call Put_Dig("a>") call Put_Dig(">e") call Put_Dig("b>") " not defined call assert_equal(['â', 'ê', '>'], getline(line('.')-2,line('.'))) " Tilde call Put_Dig("o~") call Put_Dig("~u") " not defined call Put_Dig("z~") " not defined call assert_equal(['õ', 'u', '~'], getline(line('.')-2,line('.'))) " Tilde call Put_Dig("o?") call Put_Dig("?u") call Put_Dig("z?") " not defined call assert_equal(['õ', 'ũ', '?'], getline(line('.')-2,line('.'))) " Macron call Put_Dig("o-") call Put_Dig("-u") call Put_Dig("z-") " not defined call assert_equal(['ō', 'ū', '-'], getline(line('.')-2,line('.'))) " Breve call Put_Dig("o(") call Put_Dig("(u") call Put_Dig("z(") " not defined call assert_equal(['ŏ', 'ŭ', '('], getline(line('.')-2,line('.'))) " Dot above call Put_Dig("b.") call Put_Dig(".e") call Put_Dig("a.") " not defined call assert_equal(['ḃ', 'ė', '.'], getline(line('.')-2,line('.'))) " Diaeresis call Put_Dig("a:") call Put_Dig(":u") call Put_Dig("b:") " not defined call assert_equal(['ä', 'ü', ':'], getline(line('.')-2,line('.'))) " Cedilla call Put_Dig("',") call Put_Dig(",C") call Put_Dig("b,") " not defined call assert_equal(['¸', 'Ç', ','], getline(line('.')-2,line('.'))) " Underline call Put_Dig("B_") call Put_Dig("_t") call Put_Dig("a_") " not defined call assert_equal(['Ḇ', 'ṯ', '_'], getline(line('.')-2,line('.'))) " Stroke call Put_Dig("j/") call Put_Dig("/l") call Put_Dig("b/") " not defined call assert_equal(['/', 'ł', '/'], getline(line('.')-2,line('.'))) " Double acute call Put_Dig('O"') call Put_Dig('"y') call Put_Dig('b"') " not defined call assert_equal(['Ő', 'ÿ', '"'], getline(line('.')-2,line('.'))) " Ogonek call Put_Dig('u;') call Put_Dig(';E') call Put_Dig('b;') " not defined call assert_equal(['ų', 'Ę', ';'], getline(line('.')-2,line('.'))) " Caron call Put_Dig('u<') call Put_Dig('<E') call Put_Dig('b<') " not defined call assert_equal(['ǔ', 'Ě', '<'], getline(line('.')-2,line('.'))) " Ring above call Put_Dig('u0') call Put_Dig('0E') " not defined call Put_Dig('b0') " not defined call assert_equal(['ů', 'E', '0'], getline(line('.')-2,line('.'))) " Hook call Put_Dig('u2') call Put_Dig('2E') call Put_Dig('b2') " not defined call assert_equal(['ủ', 'Ẻ', '2'], getline(line('.')-2,line('.'))) " Horn call Put_Dig('u9') call Put_Dig('9E') " not defined call Put_Dig('b9') " not defined call assert_equal(['ư', 'E', '9'], getline(line('.')-2,line('.'))) " Cyrillic call Put_Dig('u=') call Put_Dig('=b') call Put_Dig('=_') call assert_equal(['у', 'б', '〓'], getline(line('.')-2,line('.'))) " Greek call Put_Dig('u*') call Put_Dig('*b') call Put_Dig('*_') call assert_equal(['υ', 'β', '々'], getline(line('.')-2,line('.'))) " Greek/Cyrillic special call Put_Dig('u%') call Put_Dig('%b') " not defined call Put_Dig('%_') " not defined call assert_equal(['ύ', 'b', '_'], getline(line('.')-2,line('.'))) " Arabic call Put_Dig('u+') call Put_Dig('+b') call Put_Dig('+_') " japanese industrial symbol call assert_equal(['+', 'ب', '〄'], getline(line('.')-2,line('.'))) " Hebrew call Put_Dig('Q+') call Put_Dig('+B') call Put_Dig('+X') call assert_equal(['ק', 'ב', 'ח'], getline(line('.')-2,line('.'))) " Latin call Put_Dig('a3') call Put_Dig('A3') call Put_Dig('3X') call assert_equal(['ǣ', 'Ǣ', 'X'], getline(line('.')-2,line('.'))) " Bopomofo call Put_Dig('a4') call Put_Dig('A4') call Put_Dig('4X') call assert_equal(['ㄚ', '4', 'X'], getline(line('.')-2,line('.'))) " Hiragana call Put_Dig('a5') call Put_Dig('A5') call Put_Dig('5X') call assert_equal(['あ', 'ぁ', 'X'], getline(line('.')-2,line('.'))) " Katakana call Put_Dig('a6') call Put_Dig('A6') call Put_Dig('6X') call assert_equal(['ァ', 'ア', 'X'], getline(line('.')-2,line('.'))) " Superscripts call Put_Dig('1S') call Put_Dig('2S') call Put_Dig('3S') call assert_equal(['¹', '²', '³'], getline(line('.')-2,line('.'))) " Subscripts call Put_Dig('1s') call Put_Dig('2s') call Put_Dig('3s') call assert_equal(['₁', '₂', '₃'], getline(line('.')-2,line('.'))) " Eszet (only lowercase) call Put_Dig("ss") call Put_Dig("SS") " start of string call assert_equal(["ß", ""], getline(line('.')-1,line('.'))) " High bit set call Put_Dig("a ") call Put_Dig(" A") call assert_equal(['á', 'Á'], getline(line('.')-1,line('.'))) " Escape is not part of a digraph call Put_Dig("a\<esc>") call Put_Dig("\<esc>A") call assert_equal(['', 'A'], getline(line('.')-1,line('.'))) " define some custom digraphs " old: 00 ∞ " old: el l digraph 00 9216 digraph el 0252 call Put_Dig("00") call Put_Dig("el") " Reset digraphs digraph 00 8734 digraph el 108 call Put_Dig("00") call Put_Dig("el") call assert_equal(['␀', 'ü', '∞', 'l'], getline(line('.')-3,line('.'))) call assert_fails('exe "digraph a\<Esc> 100"', 'E104:') call assert_fails('exe "digraph \<Esc>a 100"', 'E104:') call assert_fails('digraph xy z', 'E39:') call assert_fails('digraph x', 'E1214:') bw! endfunc func Test_digraphs_option() " reset whichwrap option, so that testing <esc><bs>A works, " without moving up a line set digraph ww= new call Put_Dig_BS("0","0") call assert_equal("∞", getline('.')) " not a digraph call Put_Dig_BS("e","l") call assert_equal("l", getline('.')) call Put_Dig_BS("h","t") call assert_equal("þ", getline('.')) " digraph "ab" is the same as "ba" call Put_Dig_BS("a","b") call Put_Dig_BS("b","a") call assert_equal(["ば","ば"], getline(line('.')-1,line('.'))) " Euro sign call Put_Dig_BS("e","=") call Put_Dig_BS("=","e") call Put_Dig_BS("E","u") call Put_Dig_BS("u","E") call assert_equal(['е']+repeat(["€"],3), getline(line('.')-3,line('.'))) " Rouble sign call Put_Dig_BS("R","=") call Put_Dig_BS("=","R") call Put_Dig_BS("=","P") call Put_Dig_BS("P","=") call assert_equal(['Р']+repeat(["₽"],2)+['П'], getline(line('.')-3,line('.'))) " Not a digraph: this is different from <c-k>! call Put_Dig_BS("a","\<bs>") call Put_Dig_BS("\<bs>","a") call assert_equal(['','a'], getline(line('.')-1,line('.'))) " Grave call Put_Dig_BS("a","!") call Put_Dig_BS("!","e") call Put_Dig_BS("b","!") " not defined call assert_equal(["à", "è", "!"], getline(line('.')-2,line('.'))) " Acute accent call Put_Dig_BS("a","'") call Put_Dig_BS("'","e") call Put_Dig_BS("b","'") " not defined call assert_equal(["á", "é", "'"], getline(line('.')-2,line('.'))) " Cicumflex call Put_Dig_BS("a",">") call Put_Dig_BS(">","e") call Put_Dig_BS("b",">") " not defined call assert_equal(['â', 'ê', '>'], getline(line('.')-2,line('.'))) " Tilde call Put_Dig_BS("o","~") call Put_Dig_BS("~","u") " not defined call Put_Dig_BS("z","~") " not defined call assert_equal(['õ', 'u', '~'], getline(line('.')-2,line('.'))) " Tilde call Put_Dig_BS("o","?") call Put_Dig_BS("?","u") call Put_Dig_BS("z","?") " not defined call assert_equal(['õ', 'ũ', '?'], getline(line('.')-2,line('.'))) " Macron call Put_Dig_BS("o","-") call Put_Dig_BS("-","u") call Put_Dig_BS("z","-") " not defined call assert_equal(['ō', 'ū', '-'], getline(line('.')-2,line('.'))) " Breve call Put_Dig_BS("o","(") call Put_Dig_BS("(","u") call Put_Dig_BS("z","(") " not defined call assert_equal(['ŏ', 'ŭ', '('], getline(line('.')-2,line('.'))) " Dot above call Put_Dig_BS("b",".") call Put_Dig_BS(".","e") call Put_Dig_BS("a",".") " not defined call assert_equal(['ḃ', 'ė', '.'], getline(line('.')-2,line('.'))) " Diaeresis call Put_Dig_BS("a",":") call Put_Dig_BS(":","u") call Put_Dig_BS("b",":") " not defined call assert_equal(['ä', 'ü', ':'], getline(line('.')-2,line('.'))) " Cedilla call Put_Dig_BS("'",",") call Put_Dig_BS(",","C") call Put_Dig_BS("b",",") " not defined call assert_equal(['¸', 'Ç', ','], getline(line('.')-2,line('.'))) " Underline call Put_Dig_BS("B","_") call Put_Dig_BS("_","t") call Put_Dig_BS("a","_") " not defined call assert_equal(['Ḇ', 'ṯ', '_'], getline(line('.')-2,line('.'))) " Stroke call Put_Dig_BS("j","/") call Put_Dig_BS("/","l") call Put_Dig_BS("b","/") " not defined call assert_equal(['/', 'ł', '/'], getline(line('.')-2,line('.'))) " Double acute call Put_Dig_BS('O','"') call Put_Dig_BS('"','y') call Put_Dig_BS('b','"') " not defined call assert_equal(['Ő', 'ÿ', '"'], getline(line('.')-2,line('.'))) " Ogonek call Put_Dig_BS('u',';') call Put_Dig_BS(';','E') call Put_Dig_BS('b',';') " not defined call assert_equal(['ų', 'Ę', ';'], getline(line('.')-2,line('.'))) " Caron call Put_Dig_BS('u','<') call Put_Dig_BS('<','E') call Put_Dig_BS('b','<') " not defined call assert_equal(['ǔ', 'Ě', '<'], getline(line('.')-2,line('.'))) " Ring above call Put_Dig_BS('u','0') call Put_Dig_BS('0','E') " not defined call Put_Dig_BS('b','0') " not defined call assert_equal(['ů', 'E', '0'], getline(line('.')-2,line('.'))) " Hook call Put_Dig_BS('u','2') call Put_Dig_BS('2','E') call Put_Dig_BS('b','2') " not defined call assert_equal(['ủ', 'Ẻ', '2'], getline(line('.')-2,line('.'))) " Horn call Put_Dig_BS('u','9') call Put_Dig_BS('9','E') " not defined call Put_Dig_BS('b','9') " not defined call assert_equal(['ư', 'E', '9'], getline(line('.')-2,line('.'))) " Cyrillic call Put_Dig_BS('u','=') call Put_Dig_BS('=','b') call Put_Dig_BS('=','_') call assert_equal(['у', 'б', '〓'], getline(line('.')-2,line('.'))) " Greek call Put_Dig_BS('u','*') call Put_Dig_BS('*','b') call Put_Dig_BS('*','_') call assert_equal(['υ', 'β', '々'], getline(line('.')-2,line('.'))) " Greek/Cyrillic special call Put_Dig_BS('u','%') call Put_Dig_BS('%','b') " not defined call Put_Dig_BS('%','_') " not defined call assert_equal(['ύ', 'b', '_'], getline(line('.')-2,line('.'))) " Arabic call Put_Dig_BS('u','+') call Put_Dig_BS('+','b') call Put_Dig_BS('+','_') " japanese industrial symbol call assert_equal(['+', 'ب', '〄'], getline(line('.')-2,line('.'))) " Hebrew call Put_Dig_BS('Q','+') call Put_Dig_BS('+','B') call Put_Dig_BS('+','X') call assert_equal(['ק', 'ב', 'ח'], getline(line('.')-2,line('.'))) " Latin call Put_Dig_BS('a','3') call Put_Dig_BS('A','3') call Put_Dig_BS('3','X') call assert_equal(['ǣ', 'Ǣ', 'X'], getline(line('.')-2,line('.'))) " Bopomofo call Put_Dig_BS('a','4') call Put_Dig_BS('A','4') call Put_Dig_BS('4','X') call assert_equal(['ㄚ', '4', 'X'], getline(line('.')-2,line('.'))) " Hiragana call Put_Dig_BS('a','5') call Put_Dig_BS('A','5') call Put_Dig_BS('5','X') call assert_equal(['あ', 'ぁ', 'X'], getline(line('.')-2,line('.'))) " Katakana call Put_Dig_BS('a','6') call Put_Dig_BS('A','6') call Put_Dig_BS('6','X') call assert_equal(['ァ', 'ア', 'X'], getline(line('.')-2,line('.'))) " Superscripts call Put_Dig_BS('1','S') call Put_Dig_BS('2','S') call Put_Dig_BS('3','S') call assert_equal(['¹', '²', '³'], getline(line('.')-2,line('.'))) " Subscripts call Put_Dig_BS('1','s') call Put_Dig_BS('2','s') call Put_Dig_BS('3','s') call assert_equal(['₁', '₂', '₃'], getline(line('.')-2,line('.'))) " Eszet (only lowercase) call Put_Dig_BS("s","s") call Put_Dig_BS("S","S") " start of string call assert_equal(["ß", ""], getline(line('.')-1,line('.'))) " High bit set (different from <c-k>) call Put_Dig_BS("a"," ") call Put_Dig_BS(" ","A") call assert_equal([' ', 'A'], getline(line('.')-1,line('.'))) " Escape is not part of a digraph (different from <c-k>) call Put_Dig_BS("a","\<esc>") call Put_Dig_BS("\<esc>","A") call assert_equal(['', ''], getline(line('.')-1,line('.'))) " define some custom digraphs " old: 00 ∞ " old: el l digraph 00 9216 digraph el 0252 call Put_Dig_BS("0","0") call Put_Dig_BS("e","l") " Reset digraphs digraph 00 8734 digraph el 108 call Put_Dig_BS("0","0") call Put_Dig_BS("e","l") call assert_equal(['␀', 'ü', '∞', 'l'], getline(line('.')-3,line('.'))) set nodigraph ww&vim bw! endfunc func Test_digraphs_output() new let out = execute(':digraph') call assert_equal('Eu € 8364', matchstr(out, '\C\<Eu\D*8364\>')) call assert_equal('=e € 8364', matchstr(out, '\C=e\D*8364\>')) call assert_equal('=R ₽ 8381', matchstr(out, '\C=R\D*8381\>')) call assert_equal('=P ₽ 8381', matchstr(out, '\C=P\D*8381\>')) call assert_equal('o: ö 246', matchstr(out, '\C\<o:\D*246\>')) call assert_equal('v4 ㄪ 12586', matchstr(out, '\C\<v4\D*12586\>')) call assert_equal("'0 ˚ 730", matchstr(out, '\C''0\D*730\>')) call assert_equal('Z% Ж 1046', matchstr(out, '\C\<Z%\D*1046\>')) call assert_equal('u- ū 363', matchstr(out, '\C\<u-\D*363\>')) call assert_equal('SH ^A 1', matchstr(out, '\C\<SH\D*1\>')) call assert_notmatch('Latin supplement', out) let out_bang_without_custom = execute(':digraph!') digraph lt 60 let out_bang_with_custom = execute(':digraph!') call assert_notmatch('lt', out_bang_without_custom) call assert_match("^\n" \ .. "NU ^@ 10 .*\n" \ .. "Latin supplement\n" \ .. "!I ¡ 161 .*\n" \ .. ".*\n" \ .. 'Custom\n.*\<lt < 60\>', out_bang_with_custom) bw! endfunc func Test_loadkeymap() CheckFeature keymap new set keymap=czech set iminsert=0 call feedkeys("o|\<c-^>|01234567890|\<esc>", 'tx') call assert_equal("|'é+ěščřžýáíé'", getline('.')) " reset keymap and encoding option set keymap= bw! endfunc func Test_digraph_cmndline() " Create digraph on commandline call feedkeys(":\"\<c-k>Eu\<cr>", 'xt') call assert_equal('"€', @:) " Canceling a CTRL-K on the cmdline call feedkeys(":\"a\<c-k>\<esc>b\<cr>", 'xt') call assert_equal('"ab', @:) endfunc func Test_show_digraph() new call Put_Dig("e=") call assert_equal("\n<е> 1077, Hex 0435, Oct 2065, Digr e=", execute('ascii')) bwipe! endfunc func Test_show_digraph_cp1251() new set encoding=cp1251 call Put_Dig("='") call assert_equal("\n<\xfa> <|z> <M-z> 250, Hex fa, Oct 372, Digr ='", execute('ascii')) set encoding=utf-8 bwipe! endfunc " Test for error in a keymap file func Test_loadkeymap_error() CheckFeature keymap call assert_fails('loadkeymap', 'E105:') call writefile(['loadkeymap', 'a'], 'Xkeymap') call assert_fails('source Xkeymap', 'E791:') call delete('Xkeymap') endfunc " Test for the characters displayed on the screen when entering a digraph func Test_entering_digraph() CheckRunVimInTerminal let buf = RunVimInTerminal('', {'rows': 6}) call term_sendkeys(buf, "i\<C-K>") call TermWait(buf) call assert_equal('?', term_getline(buf, 1)) call term_sendkeys(buf, "1") call TermWait(buf) call assert_equal('1', term_getline(buf, 1)) call term_sendkeys(buf, "2") call TermWait(buf) call assert_equal('½', term_getline(buf, 1)) call StopVimInTerminal(buf) endfunc func Test_setdigraph_function() new call setdigraph('aa', 'あ') call Put_Dig('aa') call assert_equal('あ', getline('$')) call setdigraph(' i', 'い') call Put_Dig(' i') call assert_equal('い', getline('$')) call setdigraph(' ', 'う') call Put_Dig(' ') call assert_equal('う', getline('$')) eval 'aa'->setdigraph('え') call Put_Dig('aa') call assert_equal('え', getline('$')) call assert_fails('call setdigraph("aaa", "あ")', 'E1214: Digraph must be just two characters: aaa') call assert_fails('call setdigraph("b", "あ")', 'E1214: Digraph must be just two characters: b') call assert_fails('call setdigraph("あ", "あ")', 'E1214: Digraph must be just two characters: あ') call assert_fails('call setdigraph("aa", "ああ")', 'E1215: Digraph must be one character: ああ') call assert_fails('call setdigraph("aa", "か" .. nr2char(0x3099))', 'E1215: Digraph must be one character: か' .. nr2char(0x3099)) bwipe! endfunc func Test_getdigraph_function() " Built-in digraphs call assert_equal('∞', getdigraph('00')) " User-defined digraphs call setdigraph('aa', 'あ') call setdigraph(' i', 'い') call setdigraph(' ', 'う') call assert_equal('あ', getdigraph('aa')) call assert_equal('あ', 'aa'->getdigraph()) call assert_equal('い', getdigraph(' i')) call assert_equal('う', getdigraph(' ')) call assert_fails('call getdigraph("aaa")', 'E1214: Digraph must be just two characters: aaa') call assert_fails('call getdigraph("b")', 'E1214: Digraph must be just two characters: b') endfunc func Test_getdigraph_function_encode() CheckFeature iconv let testcases = { \'00': '∞', \'aa': 'あ', \} for [key, ch] in items(testcases) call setdigraph(key, ch) set encoding=japan call assert_equal(iconv(ch, 'utf-8', 'japan'), getdigraph(key)) set encoding& endfor endfunc func Test_setdigraphlist_function() call setdigraphlist([['aa', 'き'], ['bb', 'く']]) call assert_equal('き', getdigraph('aa')) call assert_equal('く', getdigraph('bb')) call assert_fails('call setdigraphlist([[]])', 'E1216:') call assert_fails('call setdigraphlist([["aa", "b", "cc"]])', '1216:') call assert_fails('call setdigraphlist([["あ", "あ"]])', 'E1214: Digraph must be just two characters: あ') endfunc func Test_getdigraphlist_function() " Make sure user-defined digraphs are defined call setdigraphlist([['aa', 'き'], ['bb', 'く']]) for pair in getdigraphlist(1) call assert_equal(getdigraph(pair[0]), pair[1]) endfor " We don't know how many digraphs are registered before, so check the number " of digraphs returned. call assert_equal(getdigraphlist()->len(), getdigraphlist(0)->len()) call assert_notequal((getdigraphlist()->len()), getdigraphlist(1)->len()) endfunc " vim: shiftwidth=2 sts=2 expandtab