forked from aniani/vim
Problem: Compiling weird regexp pattern is very slow. Solution: When reallocating post list increase size by 50%. (Kuang-che Wu, closes #4012) Make assert_inrange() accept float values.
144 lines
3.6 KiB
VimL
144 lines
3.6 KiB
VimL
" Tests for regexp in latin1 encoding
|
|
set encoding=latin1
|
|
scriptencoding latin1
|
|
|
|
func s:equivalence_test()
|
|
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ñ oòóôõöø p q r s t uùúûü v w x yýÿ z"
|
|
let groups = split(str)
|
|
for group1 in groups
|
|
for c in split(group1, '\zs')
|
|
" next statement confirms that equivalence class matches every
|
|
" character in group
|
|
call assert_match('^[[=' . c . '=]]*$', group1)
|
|
for group2 in groups
|
|
if group2 != group1
|
|
" next statement converts that equivalence class doesn't match
|
|
" a character in any other group
|
|
call assert_equal(-1, match(group2, '[[=' . c . '=]]'))
|
|
endif
|
|
endfor
|
|
endfor
|
|
endfor
|
|
endfunc
|
|
|
|
func Test_equivalence_re1()
|
|
set re=1
|
|
call s:equivalence_test()
|
|
endfunc
|
|
|
|
func Test_equivalence_re2()
|
|
set re=2
|
|
call s:equivalence_test()
|
|
endfunc
|
|
|
|
func Test_recursive_substitute()
|
|
new
|
|
s/^/\=execute("s#^##gn")
|
|
" check we are now not in the sandbox
|
|
call setwinvar(1, 'myvar', 1)
|
|
bwipe!
|
|
endfunc
|
|
|
|
func Test_nested_backrefs()
|
|
" Check example in change.txt.
|
|
new
|
|
for re in range(0, 2)
|
|
exe 'set re=' . re
|
|
call setline(1, 'aa ab x')
|
|
1s/\(\(a[a-d] \)*\)\(x\)/-\1- -\2- -\3-/
|
|
call assert_equal('-aa ab - -ab - -x-', getline(1))
|
|
|
|
call assert_equal('-aa ab - -ab - -x-', substitute('aa ab x', '\(\(a[a-d] \)*\)\(x\)', '-\1- -\2- -\3-', ''))
|
|
endfor
|
|
bwipe!
|
|
set re=0
|
|
endfunc
|
|
|
|
func Test_eow_with_optional()
|
|
let expected = ['abc def', 'abc', 'def', '', '', '', '', '', '', '']
|
|
for re in range(0, 2)
|
|
exe 'set re=' . re
|
|
let actual = matchlist('abc def', '\(abc\>\)\?\s*\(def\)')
|
|
call assert_equal(expected, actual)
|
|
endfor
|
|
endfunc
|
|
|
|
func Test_backref()
|
|
new
|
|
call setline(1, ['one', 'two', 'three', 'four', 'five'])
|
|
call assert_equal(3, search('\%#=1\(e\)\1'))
|
|
call assert_equal(3, search('\%#=2\(e\)\1'))
|
|
call assert_fails('call search("\\%#=1\\(e\\1\\)")', 'E65:')
|
|
call assert_fails('call search("\\%#=2\\(e\\1\\)")', 'E65:')
|
|
bwipe!
|
|
endfunc
|
|
|
|
func Test_multi_failure()
|
|
set re=1
|
|
call assert_fails('/a**', 'E61:')
|
|
call assert_fails('/a*\+', 'E62:')
|
|
call assert_fails('/a\{a}', 'E554:')
|
|
set re=2
|
|
call assert_fails('/a**', 'E871:')
|
|
call assert_fails('/a*\+', 'E871:')
|
|
call assert_fails('/a\{a}', 'E870:')
|
|
set re=0
|
|
endfunc
|
|
|
|
func Test_recursive_addstate()
|
|
" This will call addstate() recursively until it runs into the limit.
|
|
let lnum = search('\v((){328}){389}')
|
|
call assert_equal(0, lnum)
|
|
endfunc
|
|
|
|
func Test_out_of_memory()
|
|
new
|
|
s/^/,n
|
|
" This will be slow...
|
|
call assert_fails('call search("\\v((n||<)+);")', 'E363:')
|
|
endfunc
|
|
|
|
func Test_get_equi_class()
|
|
new
|
|
" Incomplete equivalence class caused invalid memory access
|
|
s/^/[[=
|
|
call assert_equal(1, search(getline(1)))
|
|
s/.*/[[.
|
|
call assert_equal(1, search(getline(1)))
|
|
endfunc
|
|
|
|
func Test_rex_init()
|
|
set noincsearch
|
|
set re=1
|
|
new
|
|
setlocal iskeyword=a-z
|
|
call setline(1, ['abc', 'ABC'])
|
|
call assert_equal(1, search('[[:keyword:]]'))
|
|
new
|
|
setlocal iskeyword=A-Z
|
|
call setline(1, ['abc', 'ABC'])
|
|
call assert_equal(2, search('[[:keyword:]]'))
|
|
bwipe!
|
|
bwipe!
|
|
set re=0
|
|
endfunc
|
|
|
|
func Test_range_with_newline()
|
|
new
|
|
call setline(1, "a")
|
|
call assert_equal(0, search("[ -*\\n- ]"))
|
|
call assert_equal(0, search("[ -*\\t-\\n]"))
|
|
bwipe!
|
|
endfunc
|
|
|
|
func Test_pattern_compile_speed()
|
|
if !exists('+spellcapcheck') || !has('reltime')
|
|
return
|
|
endif
|
|
let start = reltime()
|
|
" this used to be very slow, not it should be about a second
|
|
set spc=\\v(((((Nxxxxxxx&&xxxx){179})+)+)+){179}
|
|
call assert_inrange(0.01, 10.0, reltimefloat(reltime(start)))
|
|
set spc=
|
|
endfunc
|