To: vim_dev@googlegroups.com Subject: Patch 8.2.0535 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.0535 Problem: Regexp patterns not fully tested. Solution: Add more regexp tests and others. (Yegappan Lakshmanan, closes #5901) Files: src/testdir/test_marks.vim, src/testdir/test_options.vim, src/testdir/test_regexp_latin.vim, src/testdir/test_search.vim *** ../vim-8.2.0534/src/testdir/test_marks.vim 2020-03-25 22:23:41.898363595 +0100 --- src/testdir/test_marks.vim 2020-04-09 18:40:27.150400719 +0200 *************** *** 207,212 **** --- 207,215 ---- call assert_fails('mark xx', 'E488:') call assert_fails('mark _', 'E191:') call assert_beeps('normal! m~') + + call setpos("'k", [0, 100, 1, 0]) + call assert_fails("normal 'k", 'E19:') endfunc " Test for :lockmarks when pasting content *** ../vim-8.2.0534/src/testdir/test_options.vim 2020-04-06 21:35:02.464237765 +0200 --- src/testdir/test_options.vim 2020-04-09 18:40:27.150400719 +0200 *************** *** 677,682 **** --- 677,691 ---- bwipe! endfunc + " Test for the 'shell' option + func Test_shell() + CheckUnix + let save_shell = &shell + set shell= + call assert_fails('shell', 'E91:') + let &shell = save_shell + endfunc + " Test for the 'shellquote' option func Test_shellquote() CheckUnix *** ../vim-8.2.0534/src/testdir/test_regexp_latin.vim 2020-01-30 18:24:47.001204003 +0100 --- src/testdir/test_regexp_latin.vim 2020-04-09 18:40:27.154400707 +0200 *************** *** 147,153 **** " Tests for regexp patterns without multi-byte support. func Test_regexp_single_line_pat() " tl is a List of Lists with: ! " regexp engine " regexp pattern " text to test the pattern on " expected match (optional) --- 147,156 ---- " Tests for regexp patterns without multi-byte support. func Test_regexp_single_line_pat() " tl is a List of Lists with: ! " regexp engines to test ! " 0 - test with 'regexpengine' values 0 and 1 ! " 1 - test with 'regexpengine' values 0 and 2 ! " 2 - test with 'regexpengine' values 0, 1 and 2 " regexp pattern " text to test the pattern on " expected match (optional) *************** *** 168,173 **** --- 171,178 ---- call add(tl, [2, 'c*', 'abdef', '']) call add(tl, [2, 'bc\+', 'abccccdef', 'bcccc']) call add(tl, [2, 'bc\+', 'abdef']) " no match + " match newline character in a string + call add(tl, [2, 'o\nb', "foo\nbar", "o\nb"]) " operator \| call add(tl, [2, 'a\|ab', 'cabd', 'a']) " alternation is ordered *************** *** 591,596 **** --- 596,604 ---- " Test \%V atom call add(tl, [2, '\%>70vGesamt', 'Jean-Michel Charlier & Victor Hubinon\Gesamtausgabe [Salleck] Buck Danny {Jean-Michel Charlier & Victor Hubinon}\Gesamtausgabe', 'Gesamt']) + " Test for ignoring case and matching repeated characters + call add(tl, [2, '\cb\+', 'aAbBbBcC', 'bBbB']) + " Run the tests for t in tl let re = t[0] *************** *** 650,655 **** --- 658,671 ---- " Tests for multi-line regexp patterns without multi-byte support. func Test_regexp_multiline_pat() + " tl is a List of Lists with: + " regexp engines to test + " 0 - test with 'regexpengine' values 0 and 1 + " 1 - test with 'regexpengine' values 0 and 2 + " 2 - test with 'regexpengine' values 0, 1 and 2 + " regexp pattern + " List with text to test the pattern on + " List with the expected match let tl = [] " back references *************** *** 659,664 **** --- 675,744 ---- " line breaks call add(tl, [2, '\S.*\nx', ['abc', 'def', 'ghi', 'xjk', 'lmn'], ['abc', 'def', 'XXjk', 'lmn']]) + " Any single character or end-of-line + call add(tl, [2, '\_.\+', ['a', 'b', 'c'], ['XX']]) + " Any identifier or end-of-line + call add(tl, [2, '\_i\+', ['a', 'b', ';', '2'], ['XX;XX']]) + " Any identifier but excluding digits or end-of-line + call add(tl, [2, '\_I\+', ['a', 'b', ';', '2'], ['XX;XX2XX']]) + " Any keyword or end-of-line + call add(tl, [2, '\_k\+', ['a', 'b', '=', '2'], ['XX=XX']]) + " Any keyword but excluding digits or end-of-line + call add(tl, [2, '\_K\+', ['a', 'b', '=', '2'], ['XX=XX2XX']]) + " Any filename character or end-of-line + call add(tl, [2, '\_f\+', ['a', 'b', '.', '5'], ['XX']]) + " Any filename character but excluding digits or end-of-line + call add(tl, [2, '\_F\+', ['a', 'b', '.', '5'], ['XX5XX']]) + " Any printable character or end-of-line + call add(tl, [2, '\_p\+', ['a', 'b', '=', '4'], ['XX']]) + " Any printable character excluding digits or end-of-line + call add(tl, [2, '\_P\+', ['a', 'b', '=', '4'], ['XX4XX']]) + " Any whitespace character or end-of-line + call add(tl, [2, '\_s\+', [' ', ' ', 'a', 'b'], ['XXaXXbXX']]) + " Any non-whitespace character or end-of-line + call add(tl, [2, '\_S\+', [' ', ' ', 'a', 'b'], [' XX XX']]) + " Any decimal digit or end-of-line + call add(tl, [2, '\_d\+', ['1', 'a', '2', 'b', '3'], ['XXaXXbXX']]) + " Any non-decimal digit or end-of-line + call add(tl, [2, '\_D\+', ['1', 'a', '2', 'b', '3'], ['1XX2XX3XX']]) + " Any hexadecimal digit or end-of-line + call add(tl, [2, '\_x\+', ['1', 'a', 'g', '9', '8'], ['XXgXX']]) + " Any non-hexadecimal digit or end-of-line + call add(tl, [2, '\_X\+', ['1', 'a', 'g', '9', '8'], ['1XXaXX9XX8XX']]) + " Any octal digit or end-of-line + call add(tl, [2, '\_o\+', ['0', '7', '8', '9', '0'], ['XX8XX9XX']]) + " Any non-octal digit or end-of-line + call add(tl, [2, '\_O\+', ['0', '7', '8', '9', '0'], ['0XX7XX0XX']]) + " Any word character or end-of-line + call add(tl, [2, '\_w\+', ['A', 'B', '=', 'C', 'D'], ['XX=XX']]) + " Any non-word character or end-of-line + call add(tl, [2, '\_W\+', ['A', 'B', '=', 'C', 'D'], ['AXXBXXCXXDXX']]) + " Any head-of-word character or end-of-line + call add(tl, [2, '\_h\+', ['a', '1', 'b', '2', 'c'], ['XX1XX2XX']]) + " Any non-head-of-word character or end-of-line + call add(tl, [2, '\_H\+', ['a', '1', 'b', '2', 'c'], ['aXXbXXcXX']]) + " Any alphabetic character or end-of-line + call add(tl, [2, '\_a\+', ['a', '1', 'b', '2', 'c'], ['XX1XX2XX']]) + " Any non-alphabetic character or end-of-line + call add(tl, [2, '\_A\+', ['a', '1', 'b', '2', 'c'], ['aXXbXXcXX']]) + " Any lowercase character or end-of-line + call add(tl, [2, '\_l\+', ['a', 'A', 'b', 'B'], ['XXAXXBXX']]) + " Any non-lowercase character or end-of-line + call add(tl, [2, '\_L\+', ['a', 'A', 'b', 'B'], ['aXXbXX']]) + " Any uppercase character or end-of-line + call add(tl, [2, '\_u\+', ['a', 'A', 'b', 'B'], ['aXXbXX']]) + " Any non-uppercase character or end-of-line + call add(tl, [2, '\_U\+', ['a', 'A', 'b', 'B'], ['XXAXXBXX']]) + " Collection or end-of-line + call add(tl, [2, '\_[a-z]\+', ['a', 'A', 'b', 'B'], ['XXAXXBXX']]) + " start of line anywhere in the text + call add(tl, [2, 'one\zs\_s*\_^\zetwo', + \ ['', 'one', ' two', 'one', '', 'two'], + \ ['', 'one', ' two', 'oneXXtwo']]) + " end of line anywhere in the text + call add(tl, [2, 'one\zs\_$\_s*two', + \ ['', 'one', ' two', 'one', '', 'two'], ['', 'oneXX', 'oneXX']]) + " Check that \_[0-9] matching EOL does not break a following \> call add(tl, [2, '\<\(\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\.\)\{3\}\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\>', ['', 'localnet/192.168.0.1', ''], ['', 'localnet/XX', '']]) *************** *** 674,680 **** let before = t[2] let after = t[3] for engine in [0, 1, 2] ! if engine == 2 && re == 0 || engine == 1 && re ==1 continue endif let ®expengine = engine --- 754,760 ---- let before = t[2] let after = t[3] for engine in [0, 1, 2] ! if engine == 2 && re == 0 || engine == 1 && re == 1 continue endif let ®expengine = engine *************** *** 722,730 **** bwipe! endfunc ! " Check matching Visual area ! func Test_matching_visual_area() ! new call append(0, ['Visual:', 'thexe the thexethe', 'andaxand andaxand', \ 'oooxofor foroxooo', 'oooxofor foroxooo']) call cursor(1, 1) --- 802,809 ---- bwipe! endfunc ! " Test for the \%V atom (match inside the visual area) ! func Regex_Match_Visual_Area() call append(0, ['Visual:', 'thexe the thexethe', 'andaxand andaxand', \ 'oooxofor foroxooo', 'oooxofor foroxooo']) call cursor(1, 1) *************** *** 733,744 **** exe "normal jfx\fxj:s/\\%Vo/O/g\" call assert_equal(['Visual:', 'thexE thE thExethe', 'AndAxAnd AndAxAnd', \ 'oooxOfOr fOrOxooo', 'oooxOfOr fOrOxooo', ''], getline(1, '$')) bwipe! endfunc " Check matching marks ! func Test_matching_marks() ! new call append(0, ['', '', '', 'Marks:', 'asdfSasdfsadfEasdf', 'asdfSas', \ 'dfsadfEasdf', '', '', '', '', '']) call cursor(4, 1) --- 812,833 ---- exe "normal jfx\fxj:s/\\%Vo/O/g\" call assert_equal(['Visual:', 'thexE thE thExethe', 'AndAxAnd AndAxAnd', \ 'oooxOfOr fOrOxooo', 'oooxOfOr fOrOxooo', ''], getline(1, '$')) + %d + endfunc + + " Check matching Visual area + func Test_matching_visual_area() + new + set regexpengine=1 + call Regex_Match_Visual_Area() + set regexpengine=2 + call Regex_Match_Visual_Area() + set regexpengine& bwipe! endfunc " Check matching marks ! func Regex_Mark() call append(0, ['', '', '', 'Marks:', 'asdfSasdfsadfEasdf', 'asdfSas', \ 'dfsadfEasdf', '', '', '', '', '']) call cursor(4, 1) *************** *** 746,751 **** --- 835,849 ---- exe "normal jfSmsj0fEme:.-4,.+6s/.\\%>'s\\_.*\\%<'e../again/\" call assert_equal(['', '', '', 'Marks:', 'asdfhereasdf', 'asdfagainasdf', \ '', '', '', '', '', ''], getline(1, '$')) + %d + endfunc + + func Test_matching_marks() + new + set regexpengine=1 + call Regex_Mark() + set regexpengine=2 + call Regex_Mark() bwipe! endfunc *************** *** 786,793 **** endfunc " Test for matching the start and end of a buffer ! func Test_start_end_of_buffer_match() ! new call setline(1, repeat(['vim edit'], 20)) /\%^ call assert_equal([0, 1, 1, 0], getpos('.')) --- 884,890 ---- endfunc " Test for matching the start and end of a buffer ! func Regex_start_end_buffer() call setline(1, repeat(['vim edit'], 20)) /\%^ call assert_equal([0, 1, 1, 0], getpos('.')) *************** *** 797,811 **** call assert_equal([0, 20, 8, 0], getpos('.')) exe "normal 6gg/..\\%$\" call assert_equal([0, 20, 7, 0], getpos('.')) bwipe! endfunc " Check for detecting error func Test_regexp_error() ! set regexpengine=2 ! call assert_fails("call matchlist('x x', ' \\ze*')", 'E888:') ! call assert_fails("call matchlist('x x', ' \\zs*')", 'E888:') ! set re& endfunc " vim: shiftwidth=2 sts=2 expandtab --- 894,927 ---- call assert_equal([0, 20, 8, 0], getpos('.')) exe "normal 6gg/..\\%$\" call assert_equal([0, 20, 7, 0], getpos('.')) + %d + endfunc + + func Test_start_end_of_buffer_match() + new + set regexpengine=1 + call Regex_start_end_buffer() + set regexpengine=2 + call Regex_start_end_buffer() bwipe! endfunc " Check for detecting error func Test_regexp_error() ! call assert_fails("call matchlist('x x', '\\%#=1 \\zs*')", 'E888:') ! call assert_fails("call matchlist('x x', '\\%#=1 \\ze*')", 'E888:') ! call assert_fails("call matchlist('x x', '\\%#=2 \\zs*')", 'E888:') ! call assert_fails("call matchlist('x x', '\\%#=2 \\ze*')", 'E888:') ! call assert_fails('exe "normal /\\%#=1\\%[x\\%[x]]\"', 'E369:') ! endfunc ! ! " Test for using the last substitute string pattern (~) ! func Test_regexp_last_subst_string() ! new ! s/bar/baz/e ! call assert_equal(matchstr("foo\nbaz\nbar", "\\%#=1\~"), "baz") ! call assert_equal(matchstr("foo\nbaz\nbar", "\\%#=2\~"), "baz") ! close! endfunc " vim: shiftwidth=2 sts=2 expandtab *** ../vim-8.2.0534/src/testdir/test_search.vim 2020-04-08 21:50:18.876619651 +0200 --- src/testdir/test_search.vim 2020-04-09 18:40:27.154400707 +0200 *************** *** 688,696 **** endfunc " Tests for regexp with various magic settings ! func Test_search_regexp() ! enew! ! put ='1 a aa abb abbccc' exe 'normal! /a*b\{2}c\+/e' . "\" call assert_equal([0, 2, 17, 0], getpos('.')) --- 688,694 ---- endfunc " Tests for regexp with various magic settings ! func Run_search_regexp_magic_opt() put ='1 a aa abb abbccc' exe 'normal! /a*b\{2}c\+/e' . "\" call assert_equal([0, 2, 17, 0], getpos('.')) *************** *** 725,730 **** --- 723,740 ---- exe 'normal! /\V[ab]\(\[xy]\)\1' . "\" call assert_equal([0, 9, 7, 0], getpos('.')) + %d + endfunc + + func Test_search_regexp() + enew! + + set regexpengine=1 + call Run_search_regexp_magic_opt() + set regexpengine=2 + call Run_search_regexp_magic_opt() + set regexpengine& + set undolevels=100 put ='9 foobar' put ='' *************** *** 732,743 **** normal G exe 'normal! dv?bar?' . "\" call assert_equal('9 foo', getline('.')) ! call assert_equal([0, 10, 5, 0], getpos('.')) ! call assert_equal(10, line('$')) normal u call assert_equal('9 foobar', getline('.')) ! call assert_equal([0, 10, 6, 0], getpos('.')) ! call assert_equal(11, line('$')) set undolevels& enew! --- 742,753 ---- normal G exe 'normal! dv?bar?' . "\" call assert_equal('9 foo', getline('.')) ! call assert_equal([0, 2, 5, 0], getpos('.')) ! call assert_equal(2, line('$')) normal u call assert_equal('9 foobar', getline('.')) ! call assert_equal([0, 2, 6, 0], getpos('.')) ! call assert_equal(3, line('$')) set undolevels& enew! *************** *** 1547,1554 **** func Test_invalid_regexp() set regexpengine=1 call assert_fails("call search(repeat('\\(.\\)', 10))", 'E51:') ! call assert_fails("call search('a\\+*')", 'E61:') call assert_fails("call search('x\\@#')", 'E59:') call assert_fails("call search('\\_m')", 'E63:') call assert_fails("call search('\\+')", 'E64:') call assert_fails("call search('\\1')", 'E65:') --- 1557,1568 ---- func Test_invalid_regexp() set regexpengine=1 call assert_fails("call search(repeat('\\(.\\)', 10))", 'E51:') ! call assert_fails("call search('\\%(')", 'E53:') ! call assert_fails("call search('\\(')", 'E54:') ! call assert_fails("call search('\\)')", 'E55:') call assert_fails("call search('x\\@#')", 'E59:') + call assert_fails('call search(''\v%(%(%(%(%(%(%(%(%(%(%(a){1}){1}){1}){1}){1}){1}){1}){1}){1}){1}){1}'')', 'E60:') + call assert_fails("call search('a\\+*')", 'E61:') call assert_fails("call search('\\_m')", 'E63:') call assert_fails("call search('\\+')", 'E64:') call assert_fails("call search('\\1')", 'E65:') *************** *** 1573,1578 **** --- 1587,1593 ---- call assert_fails("call search('\\)')", 'E55:') call assert_fails("call search('\\z\\(\\)')", 'E66:') call assert_fails("call search('\\%[ab')", 'E69:') + call assert_fails("call search('\\%[]')", 'E70:') call assert_fails("call search('\\%9999999999999999999999999999v')", 'E951:') set regexpengine& call assert_fails("call search('\\%#=3ab')", 'E864:') *** ../vim-8.2.0534/src/version.c 2020-04-08 22:56:23.470398582 +0200 --- src/version.c 2020-04-09 18:40:59.854293187 +0200 *************** *** 740,741 **** --- 740,743 ---- { /* Add new patch number below this line */ + /**/ + 535, /**/ -- No children may attend school with their breath smelling of "wild onions." [real standing law in West Virginia, United States of America] /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///