122e42154SBram Moolenaar" Tests for regexp in utf8 encoding
222e42154SBram Moolenaar
322e42154SBram Moolenaarfunc s:equivalence_test()
40b94e297SBram Moolenaar  let str = "AÀÁÂÃÄÅĀĂĄǍǞǠǺȂȦȺḀẠẢẤẦẨẪẬẮẰẲẴẶ BƁɃḂḄḆ CÇĆĈĊČƇȻḈꞒ DĎĐƊḊḌḎḐḒ EÈÉÊËĒĔĖĘĚȄȆȨɆḔḖḘḚḜẸẺẼẾỀỂỄỆ FƑḞꞘ GĜĞĠĢƓǤǦǴḠꞠ HĤĦȞḢḤḦḨḪⱧ IÌÍÎÏĨĪĬĮİƗǏȈȊḬḮỈỊ JĴɈ KĶƘǨḰḲḴⱩꝀ LĹĻĽĿŁȽḶḸḺḼⱠ MḾṀṂ NÑŃŅŇǸṄṆṈṊꞤ OÒÓÔÕÖØŌŎŐƟƠǑǪǬǾȌȎȪȬȮȰṌṎṐṒỌỎỐỒỔỖỘỚỜỞỠỢ PƤṔṖⱣ QɊ RŔŖŘȐȒɌṘṚṜṞⱤꞦ SŚŜŞŠȘṠṢṤṦṨⱾꞨ TŢŤŦƬƮȚȾṪṬṮṰ UÙÚÛÜŨŪŬŮŰƯǕǙǛǓǗȔȖɄṲṴṶṸṺỤỦỨỪỬỮỰ  VƲṼṾ WŴẀẂẄẆẈ XẊẌ YÝŶŸƳȲɎẎỲỴỶỸ ZŹŻŽƵẐẒẔⱫ aàáâãäåāăąǎǟǡǻȃȧᶏḁẚạảấầẩẫậắằẳẵặⱥ bƀɓᵬᶀḃḅḇ cçćĉċčƈȼḉꞓꞔ dďđɗᵭᶁᶑḋḍḏḑḓ eèéêëēĕėęěȅȇȩɇᶒḕḗḙḛḝẹẻẽếềểễệ fƒᵮᶂḟꞙ gĝğġģǥǧǵɠᶃḡꞡ hĥħȟḣḥḧḩḫẖⱨꞕ iìíîïĩīĭįǐȉȋɨᶖḭḯỉị jĵǰɉ kķƙǩᶄḱḳḵⱪꝁ lĺļľŀłƚḷḹḻḽⱡ mᵯḿṁṃ nñńņňʼnǹᵰᶇṅṇṉṋꞥ oòóôõöøōŏőơǒǫǭǿȍȏȫȭȯȱɵṍṏṑṓọỏốồổỗộớờởỡợ pƥᵱᵽᶈṕṗ qɋʠ rŕŗřȑȓɍɽᵲᵳᶉṛṝṟꞧ sśŝşšșȿᵴᶊṡṣṥṧṩꞩ tţťŧƫƭțʈᵵṫṭṯṱẗⱦ uùúûüũūŭůűųǚǖưǔǘǜȕȗʉᵾᶙṳṵṷṹṻụủứừửữự vʋᶌṽṿ wŵẁẃẅẇẉẘ xẋẍ yýÿŷƴȳɏẏẙỳỵỷỹ zźżžƶᵶᶎẑẓẕⱬ"
522e42154SBram Moolenaar  let groups = split(str)
622e42154SBram Moolenaar  for group1 in groups
722e42154SBram Moolenaar      for c in split(group1, '\zs')
822e42154SBram Moolenaar	" next statement confirms that equivalence class matches every
922e42154SBram Moolenaar	" character in group
100b94e297SBram Moolenaar        call assert_match('^[[=' .. c .. '=]]*$', group1)
1122e42154SBram Moolenaar        for group2 in groups
1222e42154SBram Moolenaar          if group2 != group1
1322e42154SBram Moolenaar	    " next statement converts that equivalence class doesn't match
1422e42154SBram Moolenaar	    " character in any other group
150b94e297SBram Moolenaar            call assert_equal(-1, match(group2, '[[=' .. c .. '=]]'), c)
1622e42154SBram Moolenaar          endif
1722e42154SBram Moolenaar        endfor
1822e42154SBram Moolenaar      endfor
1922e42154SBram Moolenaar  endfor
2022e42154SBram Moolenaarendfunc
2122e42154SBram Moolenaar
2222e42154SBram Moolenaarfunc Test_equivalence_re1()
2322e42154SBram Moolenaar  set re=1
2422e42154SBram Moolenaar  call s:equivalence_test()
256bff02ebSBram Moolenaar  set re=0
2622e42154SBram Moolenaarendfunc
2722e42154SBram Moolenaar
2822e42154SBram Moolenaarfunc Test_equivalence_re2()
2922e42154SBram Moolenaar  set re=2
3022e42154SBram Moolenaar  call s:equivalence_test()
316bff02ebSBram Moolenaar  set re=0
3222e42154SBram Moolenaarendfunc
33af98a49dSBram Moolenaar
34af98a49dSBram Moolenaarfunc s:classes_test()
35470adb82SBram Moolenaar  if has('win32')
36470adb82SBram Moolenaar    set iskeyword=@,48-57,_,192-255
37470adb82SBram Moolenaar  endif
38490465bdSBram Moolenaar  set isprint=@,161-255
39af98a49dSBram Moolenaar  call assert_equal('Motörhead', matchstr('Motörhead', '[[:print:]]\+'))
40af98a49dSBram Moolenaar
41af98a49dSBram Moolenaar  let alnumchars = ''
420c078fc7SBram Moolenaar  let alphachars = ''
430c078fc7SBram Moolenaar  let backspacechar = ''
440c078fc7SBram Moolenaar  let blankchars = ''
450c078fc7SBram Moolenaar  let cntrlchars = ''
460c078fc7SBram Moolenaar  let digitchars = ''
470c078fc7SBram Moolenaar  let escapechar = ''
480c078fc7SBram Moolenaar  let graphchars = ''
490c078fc7SBram Moolenaar  let lowerchars = ''
50af98a49dSBram Moolenaar  let printchars = ''
51af98a49dSBram Moolenaar  let punctchars = ''
520c078fc7SBram Moolenaar  let returnchar = ''
530c078fc7SBram Moolenaar  let spacechars = ''
540c078fc7SBram Moolenaar  let tabchar = ''
550c078fc7SBram Moolenaar  let upperchars = ''
56af98a49dSBram Moolenaar  let xdigitchars = ''
57221cd9f4SBram Moolenaar  let identchars = ''
58221cd9f4SBram Moolenaar  let identchars1 = ''
59221cd9f4SBram Moolenaar  let kwordchars = ''
60221cd9f4SBram Moolenaar  let kwordchars1 = ''
61221cd9f4SBram Moolenaar  let fnamechars = ''
62221cd9f4SBram Moolenaar  let fnamechars1 = ''
63af98a49dSBram Moolenaar  let i = 1
64af98a49dSBram Moolenaar  while i <= 255
65af98a49dSBram Moolenaar    let c = nr2char(i)
66af98a49dSBram Moolenaar    if c =~ '[[:alpha:]]'
67af98a49dSBram Moolenaar      let alphachars .= c
68af98a49dSBram Moolenaar    endif
69af98a49dSBram Moolenaar    if c =~ '[[:alnum:]]'
70af98a49dSBram Moolenaar      let alnumchars .= c
71af98a49dSBram Moolenaar    endif
720c078fc7SBram Moolenaar    if c =~ '[[:backspace:]]'
730c078fc7SBram Moolenaar      let backspacechar .= c
740c078fc7SBram Moolenaar    endif
750c078fc7SBram Moolenaar    if c =~ '[[:blank:]]'
760c078fc7SBram Moolenaar      let blankchars .= c
770c078fc7SBram Moolenaar    endif
780c078fc7SBram Moolenaar    if c =~ '[[:cntrl:]]'
790c078fc7SBram Moolenaar      let cntrlchars .= c
800c078fc7SBram Moolenaar    endif
810c078fc7SBram Moolenaar    if c =~ '[[:digit:]]'
820c078fc7SBram Moolenaar      let digitchars .= c
830c078fc7SBram Moolenaar    endif
840c078fc7SBram Moolenaar    if c =~ '[[:escape:]]'
850c078fc7SBram Moolenaar      let escapechar .= c
860c078fc7SBram Moolenaar    endif
870c078fc7SBram Moolenaar    if c =~ '[[:graph:]]'
880c078fc7SBram Moolenaar      let graphchars .= c
890c078fc7SBram Moolenaar    endif
900c078fc7SBram Moolenaar    if c =~ '[[:lower:]]'
910c078fc7SBram Moolenaar      let lowerchars .= c
920c078fc7SBram Moolenaar    endif
93af98a49dSBram Moolenaar    if c =~ '[[:print:]]'
94af98a49dSBram Moolenaar      let printchars .= c
95af98a49dSBram Moolenaar    endif
96af98a49dSBram Moolenaar    if c =~ '[[:punct:]]'
97af98a49dSBram Moolenaar      let punctchars .= c
98af98a49dSBram Moolenaar    endif
990c078fc7SBram Moolenaar    if c =~ '[[:return:]]'
1000c078fc7SBram Moolenaar      let returnchar .= c
1010c078fc7SBram Moolenaar    endif
1020c078fc7SBram Moolenaar    if c =~ '[[:space:]]'
1030c078fc7SBram Moolenaar      let spacechars .= c
1040c078fc7SBram Moolenaar    endif
1050c078fc7SBram Moolenaar    if c =~ '[[:tab:]]'
1060c078fc7SBram Moolenaar      let tabchar .= c
1070c078fc7SBram Moolenaar    endif
1080c078fc7SBram Moolenaar    if c =~ '[[:upper:]]'
1090c078fc7SBram Moolenaar      let upperchars .= c
1100c078fc7SBram Moolenaar    endif
111af98a49dSBram Moolenaar    if c =~ '[[:xdigit:]]'
112af98a49dSBram Moolenaar      let xdigitchars .= c
113af98a49dSBram Moolenaar    endif
114221cd9f4SBram Moolenaar    if c =~ '[[:ident:]]'
115221cd9f4SBram Moolenaar      let identchars .= c
116221cd9f4SBram Moolenaar    endif
117221cd9f4SBram Moolenaar    if c =~ '\i'
118221cd9f4SBram Moolenaar      let identchars1 .= c
119221cd9f4SBram Moolenaar    endif
120221cd9f4SBram Moolenaar    if c =~ '[[:keyword:]]'
121221cd9f4SBram Moolenaar      let kwordchars .= c
122221cd9f4SBram Moolenaar    endif
123221cd9f4SBram Moolenaar    if c =~ '\k'
124221cd9f4SBram Moolenaar      let kwordchars1 .= c
125221cd9f4SBram Moolenaar    endif
126221cd9f4SBram Moolenaar    if c =~ '[[:fname:]]'
127221cd9f4SBram Moolenaar      let fnamechars .= c
128221cd9f4SBram Moolenaar    endif
129221cd9f4SBram Moolenaar    if c =~ '\f'
130221cd9f4SBram Moolenaar      let fnamechars1 .= c
131221cd9f4SBram Moolenaar    endif
132af98a49dSBram Moolenaar    let i += 1
133af98a49dSBram Moolenaar  endwhile
134af98a49dSBram Moolenaar
135af98a49dSBram Moolenaar  call assert_equal('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', alphachars)
136af98a49dSBram Moolenaar  call assert_equal('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', alnumchars)
1370c078fc7SBram Moolenaar  call assert_equal("\b", backspacechar)
1380c078fc7SBram Moolenaar  call assert_equal("\t ", blankchars)
13913489b9cSBram Moolenaar  call assert_equal("\x01\x02\x03\x04\x05\x06\x07\b\t\n\x0b\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\e\x1c\x1d\x1e\x1f\x7f", cntrlchars)
1400c078fc7SBram Moolenaar  call assert_equal("0123456789", digitchars)
1410c078fc7SBram Moolenaar  call assert_equal("\<Esc>", escapechar)
14213489b9cSBram Moolenaar  call assert_equal('!"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~', graphchars)
1430c078fc7SBram Moolenaar  call assert_equal('abcdefghijklmnopqrstuvwxyzµßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ', lowerchars)
144af98a49dSBram Moolenaar  call assert_equal(' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ', printchars)
145af98a49dSBram Moolenaar  call assert_equal('!"#$%&''()*+,-./:;<=>?@[\]^_`{|}~', punctchars)
1460c078fc7SBram Moolenaar  call assert_equal('ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ', upperchars)
1470c078fc7SBram Moolenaar  call assert_equal("\r", returnchar)
1480c078fc7SBram Moolenaar  call assert_equal("\t\n\x0b\f\r ", spacechars)
1490c078fc7SBram Moolenaar  call assert_equal("\t", tabchar)
150af98a49dSBram Moolenaar  call assert_equal('0123456789ABCDEFabcdef', xdigitchars)
151221cd9f4SBram Moolenaar
152221cd9f4SBram Moolenaar  if has('win32')
153221cd9f4SBram Moolenaar    let identchars_ok = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ'
154221cd9f4SBram Moolenaar    let kwordchars_ok = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzµÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
155221cd9f4SBram Moolenaar  elseif has('ebcdic')
156221cd9f4SBram Moolenaar    let identchars_ok = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz€ŒŽœž¬®µº¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
157221cd9f4SBram Moolenaar    let kwordchars_ok = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz€ŒŽœž¬®µº¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
158221cd9f4SBram Moolenaar  else
159221cd9f4SBram Moolenaar    let identchars_ok = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzµÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
160221cd9f4SBram Moolenaar    let kwordchars_ok = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzµÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
161221cd9f4SBram Moolenaar  endif
162221cd9f4SBram Moolenaar
163221cd9f4SBram Moolenaar  if has('win32')
164221cd9f4SBram Moolenaar    let fnamechars_ok = '!#$%+,-./0123456789:=@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]_abcdefghijklmnopqrstuvwxyz{}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
165221cd9f4SBram Moolenaar  elseif has('amiga')
166221cd9f4SBram Moolenaar    let fnamechars_ok = '$+,-./0123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
167221cd9f4SBram Moolenaar  elseif has('vms')
168221cd9f4SBram Moolenaar    let fnamechars_ok = '#$%+,-./0123456789:;<>ABCDEFGHIJKLMNOPQRSTUVWXYZ[]_abcdefghijklmnopqrstuvwxyz~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
169221cd9f4SBram Moolenaar  elseif has('ebcdic')
170221cd9f4SBram Moolenaar    let fnamechars_ok = '#$%+,-./=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
171221cd9f4SBram Moolenaar  else
172221cd9f4SBram Moolenaar    let fnamechars_ok = '#$%+,-./0123456789=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
173221cd9f4SBram Moolenaar  endif
174221cd9f4SBram Moolenaar
175221cd9f4SBram Moolenaar  call assert_equal(identchars_ok, identchars)
176221cd9f4SBram Moolenaar  call assert_equal(kwordchars_ok, kwordchars)
177221cd9f4SBram Moolenaar  call assert_equal(fnamechars_ok, fnamechars)
178221cd9f4SBram Moolenaar
179221cd9f4SBram Moolenaar  call assert_equal(identchars1, identchars)
180221cd9f4SBram Moolenaar  call assert_equal(kwordchars1, kwordchars)
181221cd9f4SBram Moolenaar  call assert_equal(fnamechars1, fnamechars)
182af98a49dSBram Moolenaarendfunc
183af98a49dSBram Moolenaar
184af98a49dSBram Moolenaarfunc Test_classes_re1()
185af98a49dSBram Moolenaar  set re=1
186af98a49dSBram Moolenaar  call s:classes_test()
1876bff02ebSBram Moolenaar  set re=0
188af98a49dSBram Moolenaarendfunc
189af98a49dSBram Moolenaar
190af98a49dSBram Moolenaarfunc Test_classes_re2()
191af98a49dSBram Moolenaar  set re=2
192af98a49dSBram Moolenaar  call s:classes_test()
1936bff02ebSBram Moolenaar  set re=0
1946bff02ebSBram Moolenaarendfunc
195966e58e4SBram Moolenaar
196966e58e4SBram Moolenaarfunc Test_reversed_range()
197966e58e4SBram Moolenaar  for re in range(0, 2)
198966e58e4SBram Moolenaar    exe 'set re=' . re
1990b94e297SBram Moolenaar    call assert_fails('call match("abc def", "[c-a]")', 'E944:', re)
200966e58e4SBram Moolenaar  endfor
201966e58e4SBram Moolenaar  set re=0
202966e58e4SBram Moolenaarendfunc
203966e58e4SBram Moolenaar
204966e58e4SBram Moolenaarfunc Test_large_class()
205966e58e4SBram Moolenaar  set re=1
206966e58e4SBram Moolenaar  call assert_fails('call match("abc def", "[\u3000-\u4000]")', 'E945:')
207966e58e4SBram Moolenaar  set re=2
208966e58e4SBram Moolenaar  call assert_equal(0, 'abc def' =~# '[\u3000-\u4000]')
209966e58e4SBram Moolenaar  call assert_equal(1, "\u3042" =~# '[\u3000-\u4000]')
210966e58e4SBram Moolenaar  set re=0
211966e58e4SBram Moolenaarendfunc
2122a5b5275SBram Moolenaar
2132a5b5275SBram Moolenaarfunc Test_optmatch_toolong()
2142a5b5275SBram Moolenaar  set re=1
2152a5b5275SBram Moolenaar  " Can only handle about 8000 characters.
2162a5b5275SBram Moolenaar  let pat = '\\%[' .. repeat('x', 9000) .. ']'
2172a5b5275SBram Moolenaar  call assert_fails('call match("abc def", "' .. pat .. '")', 'E339:')
2182a5b5275SBram Moolenaar  set re=0
2192a5b5275SBram Moolenaarendfunc
2202a5b5275SBram Moolenaar
221afc13bd8SBram Moolenaar" Test for regexp patterns with multi-byte support, using utf-8.
222afc13bd8SBram Moolenaarfunc Test_multibyte_chars()
223afc13bd8SBram Moolenaar  " tl is a List of Lists with:
224afc13bd8SBram Moolenaar  "    2: test auto/old/new  0: test auto/old  1: test auto/new
225afc13bd8SBram Moolenaar  "    regexp pattern
226afc13bd8SBram Moolenaar  "    text to test the pattern on
227afc13bd8SBram Moolenaar  "    expected match (optional)
228afc13bd8SBram Moolenaar  "    expected submatch 1 (optional)
229afc13bd8SBram Moolenaar  "    expected submatch 2 (optional)
230afc13bd8SBram Moolenaar  "    etc.
231afc13bd8SBram Moolenaar  "  When there is no match use only the first two items.
232afc13bd8SBram Moolenaar  let tl = []
233afc13bd8SBram Moolenaar
234afc13bd8SBram Moolenaar  " Multi-byte character tests. These will fail unless vim is compiled
235afc13bd8SBram Moolenaar  " with Multibyte (FEAT_MBYTE) or BIG/HUGE features.
236afc13bd8SBram Moolenaar  call add(tl, [2, '[[:alpha:][=a=]]\+', '879 aiaãâaiuvna ', 'aiaãâaiuvna'])
237afc13bd8SBram Moolenaar  call add(tl, [2, '[[=a=]]\+', 'ddaãâbcd', 'aãâ'])								" equivalence classes
238afc13bd8SBram Moolenaar  call add(tl, [2, '[^ม ]\+', 'มม oijasoifjos ifjoisj f osij j มมมมม abcd', 'oijasoifjos'])
239afc13bd8SBram Moolenaar  call add(tl, [2, ' [^ ]\+', 'start มabcdม ', ' มabcdม'])
240afc13bd8SBram Moolenaar  call add(tl, [2, '[ม[:alpha:][=a=]]\+', '879 aiaãมâมaiuvna ', 'aiaãมâมaiuvna'])
241afc13bd8SBram Moolenaar
242afc13bd8SBram Moolenaar  " this is not a normal "i" but 0xec
243afc13bd8SBram Moolenaar  call add(tl, [2, '\p\+', 'ìa', 'ìa'])
244afc13bd8SBram Moolenaar  call add(tl, [2, '\p*', 'aあ', 'aあ'])
245afc13bd8SBram Moolenaar
246afc13bd8SBram Moolenaar  " Test recognition of some character classes
247afc13bd8SBram Moolenaar  call add(tl, [2, '\i\+', '&*¨xx ', 'xx'])
248afc13bd8SBram Moolenaar  call add(tl, [2, '\f\+', '&*Ÿfname ', 'fname'])
249afc13bd8SBram Moolenaar
250afc13bd8SBram Moolenaar  " Test composing character matching
251afc13bd8SBram Moolenaar  call add(tl, [2, '.ม', 'xม่x yมy', 'yม'])
252afc13bd8SBram Moolenaar  call add(tl, [2, '.ม่', 'xม่x yมy', 'xม่'])
253afc13bd8SBram Moolenaar  call add(tl, [2, "\u05b9", " x\u05b9 ", "x\u05b9"])
254afc13bd8SBram Moolenaar  call add(tl, [2, ".\u05b9", " x\u05b9 ", "x\u05b9"])
255afc13bd8SBram Moolenaar  call add(tl, [2, "\u05b9\u05bb", " x\u05b9\u05bb ", "x\u05b9\u05bb"])
256afc13bd8SBram Moolenaar  call add(tl, [2, ".\u05b9\u05bb", " x\u05b9\u05bb ", "x\u05b9\u05bb"])
257afc13bd8SBram Moolenaar  call add(tl, [2, "\u05bb\u05b9", " x\u05b9\u05bb ", "x\u05b9\u05bb"])
258afc13bd8SBram Moolenaar  call add(tl, [2, ".\u05bb\u05b9", " x\u05b9\u05bb ", "x\u05b9\u05bb"])
259afc13bd8SBram Moolenaar  call add(tl, [2, "\u05b9", " y\u05bb x\u05b9 ", "x\u05b9"])
260afc13bd8SBram Moolenaar  call add(tl, [2, ".\u05b9", " y\u05bb x\u05b9 ", "x\u05b9"])
261afc13bd8SBram Moolenaar  call add(tl, [2, "\u05b9", " y\u05bb\u05b9 x\u05b9 ", "y\u05bb\u05b9"])
262afc13bd8SBram Moolenaar  call add(tl, [2, ".\u05b9", " y\u05bb\u05b9 x\u05b9 ", "y\u05bb\u05b9"])
263afc13bd8SBram Moolenaar  call add(tl, [1, "\u05b9\u05bb", " y\u05b9 x\u05b9\u05bb ", "x\u05b9\u05bb"])
264afc13bd8SBram Moolenaar  call add(tl, [2, ".\u05b9\u05bb", " y\u05bb x\u05b9\u05bb ", "x\u05b9\u05bb"])
265afc13bd8SBram Moolenaar  call add(tl, [2, "a", "ca\u0300t"])
266afc13bd8SBram Moolenaar  call add(tl, [2, "ca", "ca\u0300t"])
267afc13bd8SBram Moolenaar  call add(tl, [2, "a\u0300", "ca\u0300t", "a\u0300"])
268afc13bd8SBram Moolenaar  call add(tl, [2, 'a\%C', "ca\u0300t", "a\u0300"])
269afc13bd8SBram Moolenaar  call add(tl, [2, 'ca\%C', "ca\u0300t", "ca\u0300"])
270afc13bd8SBram Moolenaar  call add(tl, [2, 'ca\%Ct', "ca\u0300t", "ca\u0300t"])
271afc13bd8SBram Moolenaar
272afc13bd8SBram Moolenaar  " Test \Z
273afc13bd8SBram Moolenaar  call add(tl, [2, 'ú\Z', 'x'])
274afc13bd8SBram Moolenaar  call add(tl, [2, 'יהוה\Z', 'יהוה', 'יהוה'])
275afc13bd8SBram Moolenaar  call add(tl, [2, 'יְהוָה\Z', 'יהוה', 'יהוה'])
276afc13bd8SBram Moolenaar  call add(tl, [2, 'יהוה\Z', 'יְהוָה', 'יְהוָה'])
277afc13bd8SBram Moolenaar  call add(tl, [2, 'יְהוָה\Z', 'יְהוָה', 'יְהוָה'])
278afc13bd8SBram Moolenaar  call add(tl, [2, 'יְ\Z', 'וְיַ', 'יַ'])
279afc13bd8SBram Moolenaar  call add(tl, [2, "ק\u200d\u05b9x\\Z", "xק\u200d\u05b9xy", "ק\u200d\u05b9x"])
280afc13bd8SBram Moolenaar  call add(tl, [2, "ק\u200d\u05b9x\\Z", "xק\u200dxy", "ק\u200dx"])
281afc13bd8SBram Moolenaar  call add(tl, [2, "ק\u200dx\\Z", "xק\u200d\u05b9xy", "ק\u200d\u05b9x"])
282afc13bd8SBram Moolenaar  call add(tl, [2, "ק\u200dx\\Z", "xק\u200dxy", "ק\u200dx"])
283afc13bd8SBram Moolenaar  call add(tl, [2, "\u05b9\\Z", "xyz"])
284afc13bd8SBram Moolenaar  call add(tl, [2, "\\Z\u05b9", "xyz"])
285afc13bd8SBram Moolenaar  call add(tl, [2, "\u05b9\\Z", "xy\u05b9z", "y\u05b9"])
286afc13bd8SBram Moolenaar  call add(tl, [2, "\\Z\u05b9", "xy\u05b9z", "y\u05b9"])
287afc13bd8SBram Moolenaar  call add(tl, [1, "\u05b9\\+\\Z", "xy\u05b9z\u05b9 ", "y\u05b9z\u05b9"])
288afc13bd8SBram Moolenaar  call add(tl, [1, "\\Z\u05b9\\+", "xy\u05b9z\u05b9 ", "y\u05b9z\u05b9"])
289afc13bd8SBram Moolenaar
290afc13bd8SBram Moolenaar  " Combining different tests and features
291afc13bd8SBram Moolenaar  call add(tl, [2, '[^[=a=]]\+', 'ddaãâbcd', 'dd'])
292afc13bd8SBram Moolenaar
293afc13bd8SBram Moolenaar  " Run the tests
294afc13bd8SBram Moolenaar  for t in tl
295afc13bd8SBram Moolenaar    let re = t[0]
296afc13bd8SBram Moolenaar    let pat = t[1]
297afc13bd8SBram Moolenaar    let text = t[2]
298afc13bd8SBram Moolenaar    let matchidx = 3
299afc13bd8SBram Moolenaar    for engine in [0, 1, 2]
300afc13bd8SBram Moolenaar      if engine == 2 && re == 0 || engine == 1 && re == 1
301afc13bd8SBram Moolenaar        continue
302afc13bd8SBram Moolenaar      endif
303afc13bd8SBram Moolenaar      let &regexpengine = engine
304afc13bd8SBram Moolenaar      try
305afc13bd8SBram Moolenaar        let l = matchlist(text, pat)
306afc13bd8SBram Moolenaar      catch
307afc13bd8SBram Moolenaar        call assert_report('Error ' . engine . ': pat: \"' . pat .
308afc13bd8SBram Moolenaar		    \ '\", text: \"' . text .
309afc13bd8SBram Moolenaar		    \ '\", caused an exception: \"' . v:exception . '\"')
310afc13bd8SBram Moolenaar      endtry
311afc13bd8SBram Moolenaar      " check the match itself
312afc13bd8SBram Moolenaar      if len(l) == 0 && len(t) > matchidx
313afc13bd8SBram Moolenaar        call assert_report('Error ' . engine . ': pat: \"' . pat .
314afc13bd8SBram Moolenaar		    \ '\", text: \"' . text .
315afc13bd8SBram Moolenaar		    \ '\", did not match, expected: \"' . t[matchidx] . '\"')
316afc13bd8SBram Moolenaar      elseif len(l) > 0 && len(t) == matchidx
317afc13bd8SBram Moolenaar        call assert_report('Error ' . engine . ': pat: \"' . pat .
318afc13bd8SBram Moolenaar		    \ '\", text: \"' . text . '\", match: \"' . l[0] .
319afc13bd8SBram Moolenaar		    \ '\", expected no match')
320afc13bd8SBram Moolenaar      elseif len(t) > matchidx && l[0] != t[matchidx]
321afc13bd8SBram Moolenaar        call assert_report('Error ' . engine . ': pat: \"' . pat .
322afc13bd8SBram Moolenaar		    \ '\", text: \"' . text . '\", match: \"' . l[0] .
323afc13bd8SBram Moolenaar		    \ '\", expected: \"' . t[matchidx] . '\"')
324afc13bd8SBram Moolenaar      else
325afc13bd8SBram Moolenaar        " Test passed
326afc13bd8SBram Moolenaar      endif
327afc13bd8SBram Moolenaar      if len(l) > 0
328afc13bd8SBram Moolenaar        " check all the nine submatches
329afc13bd8SBram Moolenaar        for i in range(1, 9)
330afc13bd8SBram Moolenaar          if len(t) <= matchidx + i
331afc13bd8SBram Moolenaar            let e = ''
332afc13bd8SBram Moolenaar          else
333afc13bd8SBram Moolenaar            let e = t[matchidx + i]
334afc13bd8SBram Moolenaar          endif
335afc13bd8SBram Moolenaar          if l[i] != e
336afc13bd8SBram Moolenaar            call assert_report('Error ' . engine . ': pat: \"' . pat .
337afc13bd8SBram Moolenaar                  \ '\", text: \"' . text . '\", submatch ' . i .
338afc13bd8SBram Moolenaar                  \ ': \"' . l[i] . '\", expected: \"' . e . '\"')
339afc13bd8SBram Moolenaar          endif
340afc13bd8SBram Moolenaar        endfor
341afc13bd8SBram Moolenaar        unlet i
342afc13bd8SBram Moolenaar      endif
343afc13bd8SBram Moolenaar    endfor
344afc13bd8SBram Moolenaar  endfor
345afc13bd8SBram Moolenaar  set regexpengine&
346afc13bd8SBram Moolenaarendfunc
347afc13bd8SBram Moolenaar
348afc13bd8SBram Moolenaar" check that 'ambiwidth' does not change the meaning of \p
349afc13bd8SBram Moolenaarfunc Test_ambiwidth()
350afc13bd8SBram Moolenaar  set regexpengine=1 ambiwidth=single
351afc13bd8SBram Moolenaar  call assert_equal(0, match("\u00EC", '\p'))
352afc13bd8SBram Moolenaar  set regexpengine=1 ambiwidth=double
353afc13bd8SBram Moolenaar  call assert_equal(0, match("\u00EC", '\p'))
354afc13bd8SBram Moolenaar  set regexpengine=2 ambiwidth=single
355afc13bd8SBram Moolenaar  call assert_equal(0, match("\u00EC", '\p'))
356afc13bd8SBram Moolenaar  set regexpengine=2 ambiwidth=double
357afc13bd8SBram Moolenaar  call assert_equal(0, match("\u00EC", '\p'))
358afc13bd8SBram Moolenaar  set regexpengine& ambiwidth&
359afc13bd8SBram Moolenaarendfunc
360afc13bd8SBram Moolenaar
36159de417bSBram Moolenaarfunc Run_regexp_ignore_case()
36259de417bSBram Moolenaar  call assert_equal('iIİ', substitute('iIİ', '\([iIİ]\)', '\1', 'g'))
36359de417bSBram Moolenaar
36459de417bSBram Moolenaar  call assert_equal('iIx', substitute('iIİ', '\c\([İ]\)', 'x', 'g'))
36559de417bSBram Moolenaar  call assert_equal('xxİ', substitute('iIİ', '\(i\c\)', 'x', 'g'))
36659de417bSBram Moolenaar  call assert_equal('iIx', substitute('iIİ', '\(İ\c\)', 'x', 'g'))
36759de417bSBram Moolenaar  call assert_equal('iIx', substitute('iIİ', '\c\(\%u0130\)', 'x', 'g'))
36859de417bSBram Moolenaar  call assert_equal('iIx', substitute('iIİ', '\c\([\u0130]\)', 'x', 'g'))
36959de417bSBram Moolenaar  call assert_equal('iIx', substitute('iIİ', '\c\([\u012f-\u0131]\)', 'x', 'g'))
37059de417bSBram Moolenaarendfunc
37159de417bSBram Moolenaar
37259de417bSBram Moolenaarfunc Test_regexp_ignore_case()
37359de417bSBram Moolenaar  set regexpengine=1
37459de417bSBram Moolenaar  call Run_regexp_ignore_case()
37559de417bSBram Moolenaar  set regexpengine=2
37659de417bSBram Moolenaar  call Run_regexp_ignore_case()
37759de417bSBram Moolenaar  set regexpengine&
37859de417bSBram Moolenaarendfunc
37959de417bSBram Moolenaar
3807d40b8a5SBram Moolenaar" Tests for regexp with multi-byte encoding and various magic settings
3817d40b8a5SBram Moolenaarfunc Run_regexp_multibyte_magic()
3827d40b8a5SBram Moolenaar  let text =<< trim END
3837d40b8a5SBram Moolenaar    1 a aa abb abbccc
3847d40b8a5SBram Moolenaar    2 d dd dee deefff
3857d40b8a5SBram Moolenaar    3 g gg ghh ghhiii
3867d40b8a5SBram Moolenaar    4 j jj jkk jkklll
3877d40b8a5SBram Moolenaar    5 m mm mnn mnnooo
3887d40b8a5SBram Moolenaar    6 x ^aa$ x
3897d40b8a5SBram Moolenaar    7 (a)(b) abbaa
3907d40b8a5SBram Moolenaar    8 axx [ab]xx
3917d40b8a5SBram Moolenaar    9 หม่x อมx
3927d40b8a5SBram Moolenaar    a อมx หม่x
3937d40b8a5SBram Moolenaar    b ちカヨは
3947d40b8a5SBram Moolenaar    c x ¬€x
3957d40b8a5SBram Moolenaar    d 天使x
3967d40b8a5SBram Moolenaar    e ������y
3977d40b8a5SBram Moolenaar    f ������z
3987d40b8a5SBram Moolenaar    g a啷bb
3997d40b8a5SBram Moolenaar    j 0123❤x
4007d40b8a5SBram Moolenaar    k combinations
4017d40b8a5SBram Moolenaar    l äö üᾱ̆́
4027d40b8a5SBram Moolenaar  END
4037d40b8a5SBram Moolenaar
4047d40b8a5SBram Moolenaar  new
4057d40b8a5SBram Moolenaar  call setline(1, text)
4067d40b8a5SBram Moolenaar  exe 'normal /a*b\{2}c\+/e' .. "\<CR>x"
4077d40b8a5SBram Moolenaar  call assert_equal('1 a aa abb abbcc', getline('.'))
4087d40b8a5SBram Moolenaar  exe 'normal /\Md\*e\{2}f\+/e' .. "\<CR>x"
4097d40b8a5SBram Moolenaar  call assert_equal('2 d dd dee deeff', getline('.'))
4107d40b8a5SBram Moolenaar  set nomagic
4117d40b8a5SBram Moolenaar  exe 'normal /g\*h\{2}i\+/e' .. "\<CR>x"
4127d40b8a5SBram Moolenaar  call assert_equal('3 g gg ghh ghhii', getline('.'))
4137d40b8a5SBram Moolenaar  exe 'normal /\mj*k\{2}l\+/e' .. "\<CR>x"
4147d40b8a5SBram Moolenaar  call assert_equal('4 j jj jkk jkkll', getline('.'))
4157d40b8a5SBram Moolenaar  exe 'normal /\vm*n{2}o+/e' .. "\<CR>x"
4167d40b8a5SBram Moolenaar  call assert_equal('5 m mm mnn mnnoo', getline('.'))
4177d40b8a5SBram Moolenaar  exe 'normal /\V^aa$/' .. "\<CR>x"
4187d40b8a5SBram Moolenaar  call assert_equal('6 x aa$ x', getline('.'))
4197d40b8a5SBram Moolenaar  set magic
4207d40b8a5SBram Moolenaar  exe 'normal /\v(a)(b)\2\1\1/e' .. "\<CR>x"
4217d40b8a5SBram Moolenaar  call assert_equal('7 (a)(b) abba', getline('.'))
4227d40b8a5SBram Moolenaar  exe 'normal /\V[ab]\(\[xy]\)\1' .. "\<CR>x"
4237d40b8a5SBram Moolenaar  call assert_equal('8 axx ab]xx', getline('.'))
4247d40b8a5SBram Moolenaar
4257d40b8a5SBram Moolenaar  " search for multi-byte without composing char
4267d40b8a5SBram Moolenaar  exe 'normal /ม' .. "\<CR>x"
4277d40b8a5SBram Moolenaar  call assert_equal('9 หม่x อx', getline('.'))
4287d40b8a5SBram Moolenaar
4297d40b8a5SBram Moolenaar  " search for multi-byte with composing char
4307d40b8a5SBram Moolenaar  exe 'normal /ม่' .. "\<CR>x"
4317d40b8a5SBram Moolenaar  call assert_equal('a อมx หx', getline('.'))
4327d40b8a5SBram Moolenaar
4337d40b8a5SBram Moolenaar  " find word by change of word class
4347d40b8a5SBram Moolenaar  exe 'normal /ち\<カヨ\>は' .. "\<CR>x"
4357d40b8a5SBram Moolenaar  call assert_equal('b カヨは', getline('.'))
4367d40b8a5SBram Moolenaar
4377d40b8a5SBram Moolenaar  " Test \%u, [\u] and friends
4387d40b8a5SBram Moolenaar  " c
4397d40b8a5SBram Moolenaar  exe 'normal /\%u20ac' .. "\<CR>x"
4407d40b8a5SBram Moolenaar  call assert_equal('c x ¬x', getline('.'))
4417d40b8a5SBram Moolenaar  " d
4427d40b8a5SBram Moolenaar  exe 'normal /[\u4f7f\u5929]\+' .. "\<CR>x"
4437d40b8a5SBram Moolenaar  call assert_equal('d 使x', getline('.'))
4447d40b8a5SBram Moolenaar  " e
4457d40b8a5SBram Moolenaar  exe 'normal /\%U12345678' .. "\<CR>x"
4467d40b8a5SBram Moolenaar  call assert_equal('e y', getline('.'))
4477d40b8a5SBram Moolenaar  " f
4487d40b8a5SBram Moolenaar  exe 'normal /[\U1234abcd\u1234\uabcd]' .. "\<CR>x"
4497d40b8a5SBram Moolenaar  call assert_equal('f z', getline('.'))
4507d40b8a5SBram Moolenaar  " g
4517d40b8a5SBram Moolenaar  exe 'normal /\%d21879b' .. "\<CR>x"
4527d40b8a5SBram Moolenaar  call assert_equal('g abb', getline('.'))
4537d40b8a5SBram Moolenaar
4547d40b8a5SBram Moolenaar  " j Test backwards search from a multi-byte char
4557d40b8a5SBram Moolenaar  exe "normal /x\<CR>x?.\<CR>x"
4567d40b8a5SBram Moolenaar  call assert_equal('j 012❤', getline('.'))
4577d40b8a5SBram Moolenaar  " k
4587d40b8a5SBram Moolenaar  let @w=':%s#comb[i]nations#œ̄ṣ́m̥̄ᾱ̆́#g'
4597d40b8a5SBram Moolenaar  @w
4607d40b8a5SBram Moolenaar  call assert_equal('k œ̄ṣ́m̥̄ᾱ̆́', getline(18))
4617d40b8a5SBram Moolenaar
4627d40b8a5SBram Moolenaar  close!
4637d40b8a5SBram Moolenaarendfunc
4647d40b8a5SBram Moolenaar
4657d40b8a5SBram Moolenaarfunc Test_regexp_multibyte_magic()
4667d40b8a5SBram Moolenaar  set regexpengine=1
4677d40b8a5SBram Moolenaar  call Run_regexp_multibyte_magic()
4687d40b8a5SBram Moolenaar  set regexpengine=2
4697d40b8a5SBram Moolenaar  call Run_regexp_multibyte_magic()
4707d40b8a5SBram Moolenaar  set regexpengine&
4717d40b8a5SBram Moolenaarendfunc
4727d40b8a5SBram Moolenaar
4737d40b8a5SBram Moolenaar" Test for 7.3.192
4747d40b8a5SBram Moolenaar" command ":s/ \?/ /g" splits multi-byte characters into bytes
4757d40b8a5SBram Moolenaarfunc Test_split_multibyte_to_bytes()
4767d40b8a5SBram Moolenaar  new
4777d40b8a5SBram Moolenaar  call setline(1, 'l äö üᾱ̆́')
4787d40b8a5SBram Moolenaar  s/ \?/ /g
4797d40b8a5SBram Moolenaar  call assert_equal(' l ä ö ü ᾱ̆́', getline(1))
4807d40b8a5SBram Moolenaar  close!
4817d40b8a5SBram Moolenaarendfunc
4827d40b8a5SBram Moolenaar
4837d40b8a5SBram Moolenaar" Test for matchstr() with multibyte characters
4847d40b8a5SBram Moolenaarfunc Test_matchstr_multibyte()
4857d40b8a5SBram Moolenaar  new
4867d40b8a5SBram Moolenaar  call assert_equal('ב', matchstr("אבגד", ".", 0, 2))
4877d40b8a5SBram Moolenaar  call assert_equal('בג', matchstr("אבגד", "..", 0, 2))
4887d40b8a5SBram Moolenaar  call assert_equal('א', matchstr("אבגד", ".", 0, 0))
4897d40b8a5SBram Moolenaar  call assert_equal('ג', matchstr("אבגד", ".", 4, -1))
4907d40b8a5SBram Moolenaar  close!
4917d40b8a5SBram Moolenaarendfunc
4927d40b8a5SBram Moolenaar
4937d40b8a5SBram Moolenaar" Test for 7.4.636
4947d40b8a5SBram Moolenaar" A search with end offset gets stuck at end of file.
4957d40b8a5SBram Moolenaarfunc Test_search_with_end_offset()
4967d40b8a5SBram Moolenaar  new
4977d40b8a5SBram Moolenaar  call setline(1, ['', 'dog(a', 'cat('])
4988a9bc95eSBram Moolenaar  exe "normal /(/e+\<CR>"
4998a9bc95eSBram Moolenaar  normal n"ayn
5007d40b8a5SBram Moolenaar  call assert_equal("a\ncat(", @a)
5017d40b8a5SBram Moolenaar  close!
5027d40b8a5SBram Moolenaarendfunc
5037d40b8a5SBram Moolenaar
504ef2dff52SBram Moolenaar" Check that "^" matches even when the line starts with a combining char
505ef2dff52SBram Moolenaarfunc Test_match_start_of_line_combining()
506ef2dff52SBram Moolenaar  new
507ef2dff52SBram Moolenaar  call setline(1, ['', "\u05ae", ''])
508ef2dff52SBram Moolenaar  exe "normal gg/^\<CR>"
509ef2dff52SBram Moolenaar  call assert_equal(2, getcurpos()[1])
510ef2dff52SBram Moolenaar  bwipe!
511ef2dff52SBram Moolenaarendfunc
512ef2dff52SBram Moolenaar
51366c50c56SBram Moolenaar" Check that [[:upper:]] matches for automatic engine
51466c50c56SBram Moolenaarfunc Test_match_char_class_upper()
51566c50c56SBram Moolenaar  new
51666c50c56SBram Moolenaar  let _engine=&regexpengine
517ef2dff52SBram Moolenaar
51866c50c56SBram Moolenaar  " Test 1: [[:upper:]]\{2,\}
51966c50c56SBram Moolenaar  set regexpengine=0
52066c50c56SBram Moolenaar  call setline(1, ['05. ПЕСНЯ О ГЕРОЯХ муз. А. Давиденко, М. Коваля и Б. Шехтера ...', '05. PJESNJA O GJEROJAKH mus. A. Davidjenko, M. Kovalja i B. Shjekhtjera ...'])
52166c50c56SBram Moolenaar  call cursor(1,1)
52266c50c56SBram Moolenaar  let search_cmd='norm /\<[[:upper:]]\{2,\}\>' .. "\<CR>"
52366c50c56SBram Moolenaar  exe search_cmd
52466c50c56SBram Moolenaar  call assert_equal(4, searchcount().total, 'TEST 1')
52566c50c56SBram Moolenaar  set regexpengine=1
52666c50c56SBram Moolenaar  exe search_cmd
52766c50c56SBram Moolenaar  call assert_equal(2, searchcount().total, 'TEST 1')
52866c50c56SBram Moolenaar  set regexpengine=2
52966c50c56SBram Moolenaar  exe search_cmd
53066c50c56SBram Moolenaar  call assert_equal(4, searchcount().total, 'TEST 1')
53166c50c56SBram Moolenaar
53266c50c56SBram Moolenaar  " Test 2: [[:upper:]].\+
53366c50c56SBram Moolenaar  let search_cmd='norm /\<[[:upper:]].\+\>' .. "\<CR>"
53466c50c56SBram Moolenaar  set regexpengine=0
53566c50c56SBram Moolenaar  exe search_cmd
53666c50c56SBram Moolenaar  call assert_equal(2, searchcount().total, 'TEST 2')
53766c50c56SBram Moolenaar  set regexpengine=1
53866c50c56SBram Moolenaar  exe search_cmd
53966c50c56SBram Moolenaar  call assert_equal(1, searchcount().total, 'TEST 2')
54066c50c56SBram Moolenaar  set regexpengine=2
54166c50c56SBram Moolenaar  exe search_cmd
54266c50c56SBram Moolenaar  call assert_equal(2, searchcount().total, 'TEST 2')
54366c50c56SBram Moolenaar
54466c50c56SBram Moolenaar  " Test 3: [[:lower:]]\+
54566c50c56SBram Moolenaar  let search_cmd='norm /\<[[:lower:]]\+\>' .. "\<CR>"
54666c50c56SBram Moolenaar  set regexpengine=0
54766c50c56SBram Moolenaar  exe search_cmd
54866c50c56SBram Moolenaar  call assert_equal(4, searchcount().total, 'TEST 3 lower')
54966c50c56SBram Moolenaar  set regexpengine=1
55066c50c56SBram Moolenaar  exe search_cmd
55166c50c56SBram Moolenaar  call assert_equal(2, searchcount().total, 'TEST 3 lower')
55266c50c56SBram Moolenaar  set regexpengine=2
55366c50c56SBram Moolenaar  exe search_cmd
55466c50c56SBram Moolenaar  call assert_equal(4, searchcount().total, 'TEST 3 lower')
55566c50c56SBram Moolenaar
55666c50c56SBram Moolenaar  " clean up
55766c50c56SBram Moolenaar  let &regexpengine=_engine
55866c50c56SBram Moolenaar  bwipe!
55966c50c56SBram Moolenaarendfunc
560ef2dff52SBram Moolenaar
561*65b60566SBram Moolenaarfunc Test_match_invalid_byte()
562*65b60566SBram Moolenaar  call writefile(0z630a.765d30aa0a.2e0a.790a.4030, 'Xinvalid')
563*65b60566SBram Moolenaar  new
564*65b60566SBram Moolenaar  source Xinvalid
565*65b60566SBram Moolenaar  bwipe!
566*65b60566SBram Moolenaar  call delete('Xinvalid')
567*65b60566SBram Moolenaarendfunc
568*65b60566SBram Moolenaar
569afc13bd8SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
570