" 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