" Test for textobjects if !has('textobjects') finish endif func CpoM(line, useM, expected) new if a:useM set cpoptions+=M else set cpoptions-=M endif call setline(1, a:line) call setreg('"', '') normal! ggfrmavi)y call assert_equal(getreg('"'), a:expected[0]) call setreg('"', '') normal! `afbmavi)y call assert_equal(getreg('"'), a:expected[1]) call setreg('"', '') normal! `afgmavi)y call assert_equal(getreg('"'), a:expected[2]) q! endfunc func Test_inner_block_without_cpo_M() call CpoM('(red \(blue) green)', 0, ['red \(blue', 'red \(blue', '']) endfunc func Test_inner_block_with_cpo_M_left_backslash() call CpoM('(red \(blue) green)', 1, ['red \(blue) green', 'blue', 'red \(blue) green']) endfunc func Test_inner_block_with_cpo_M_right_backslash() call CpoM('(red (blue\) green)', 1, ['red (blue\) green', 'blue\', 'red (blue\) green']) endfunc func Test_quote_selection_selection_exclusive() new call setline(1, "a 'bcde' f") set selection=exclusive exe "norm! fdvhi'y" call assert_equal('bcde', @") let @"='dummy' exe "norm! $gevi'y" call assert_equal('bcde', @") let @"='dummy' exe "norm! 0fbhvi'y" call assert_equal('bcde', @") set selection&vim bw! endfunc func Test_quote_selection_selection_exclusive_abort() new set selection=exclusive call setline(1, "'abzzc'") let exp_curs = [0, 1, 6, 0] call cursor(1,1) exe 'norm! fcdvi"' " make sure to end visual mode to have a clear state exe "norm! \" call assert_equal(exp_curs, getpos('.')) call cursor(1,1) exe 'norm! fcvi"' exe "norm! \" call assert_equal(exp_curs, getpos('.')) call cursor(1,2) exe 'norm! vfcoi"' exe "norm! \" let exp_curs = [0, 1, 2, 0] let exp_visu = [0, 1, 7, 0] call assert_equal(exp_curs, getpos('.')) call assert_equal(exp_visu, getpos("'>")) set selection&vim bw! endfunc " Tests for string and html text objects func Test_string_html_objects() enew! let t = '"wo\"rd\\" foo' put =t normal! da" call assert_equal('foo', getline('.')) let t = "'foo' 'bar' 'piep'" put =t normal! 0va'a'rx call assert_equal("xxxxxxxxxxxx'piep'", getline('.')) let t = "bla bla `quote` blah" put =t normal! 02f`da` call assert_equal("bla bla blah", getline('.')) let t = 'out " in "noXno"' put =t normal! 0fXdi" call assert_equal('out " in ""', getline('.')) let t = "\"'\" 'blah' rep 'buh'" put =t normal! 03f'vi'ry call assert_equal("\"'\" 'blah'yyyyy'buh'", getline('.')) set quoteescape=+*- let t = "bla `s*`d-`+++`l**` b`la" put =t normal! di` call assert_equal("bla `` b`la", getline('.')) let t = 'voo "nah" sdf " asdf" sdf " sdf" sd' put =t normal! $F"va"oha"i"rz call assert_equal('voo "zzzzzzzzzzzzzzzzzzzzzzzzzzzzsd', getline('.')) let t = "-asdfXasdfasdf-" put =t normal! fXdit call assert_equal('-asdfasdf-', getline('.')) let t = "-asdXasdfasdf-" put =t normal! 0fXdit call assert_equal('--', getline('.')) let t = "-asdfXasdfasdf-" put =t normal! fXdat call assert_equal('-asdfasdf-', getline('.')) let t = "-asdXasdfasdf-" put =t normal! 0fXdat call assert_equal('--', getline('.')) let t = "-\ninnertext object\n" put =t normal! dit call assert_equal('-', getline('.')) " copy the tag block from leading indentation before the start tag let t = " \ntext\n" $put =t normal! 2kvaty call assert_equal("\ntext\n", @") " copy the tag block from the end tag let t = "\nwelcome\n" $put =t normal! $vaty call assert_equal("\nwelcome\n", @") " copy the outer tag block from a tag without an end tag let t = "\nwelcome\n</html>" $put =t normal! k$vaty call assert_equal("<html>\n<title>welcome\n</html>", @") " nested tag that has < in a different line from > let t = "<div><div\n></div></div>" $put =t normal! k0vaty call assert_equal("<div><div\n></div></div>", @") " nested tag with attribute that has < in a different line from > let t = "<div><div\nattr=\"attr\"\n></div></div>" $put =t normal! 2k0vaty call assert_equal("<div><div\nattr=\"attr\"\n></div></div>", @") set quoteescape& enew! endfunc func Test_empty_html_tag() new call setline(1, '<div></div>') normal 0citxxx call assert_equal('<div>xxx</div>', getline(1)) call setline(1, '<div></div>') normal 0f<cityyy call assert_equal('<div>yyy</div>', getline(1)) call setline(1, '<div></div>') normal 0f<vitsaaa call assert_equal('aaa', getline(1)) bwipe! endfunc " Tests for match() and matchstr() func Test_match() call assert_equal("b", matchstr("abcd", ".", 0, 2)) call assert_equal("bc", matchstr("abcd", "..", 0, 2)) call assert_equal("c", matchstr("abcd", ".", 2, 0)) call assert_equal("a", matchstr("abcd", ".", 0, -1)) call assert_equal(-1, match("abcd", ".", 0, 5)) call assert_equal(0 , match("abcd", ".", 0, -1)) call assert_equal(0 , match('abc', '.', 0, 1)) call assert_equal(1 , match('abc', '.', 0, 2)) call assert_equal(2 , match('abc', '.', 0, 3)) call assert_equal(-1, match('abc', '.', 0, 4)) call assert_equal(1 , match('abc', '.', 1, 1)) call assert_equal(2 , match('abc', '.', 2, 1)) call assert_equal(-1, match('abc', '.', 3, 1)) call assert_equal(3 , match('abc', '$', 0, 1)) call assert_equal(-1, match('abc', '$', 0, 2)) call assert_equal(3 , match('abc', '$', 1, 1)) call assert_equal(3 , match('abc', '$', 2, 1)) call assert_equal(3 , match('abc', '$', 3, 1)) call assert_equal(-1, match('abc', '$', 4, 1)) call assert_equal(0 , match('abc', '\zs', 0, 1)) call assert_equal(1 , match('abc', '\zs', 0, 2)) call assert_equal(2 , match('abc', '\zs', 0, 3)) call assert_equal(3 , match('abc', '\zs', 0, 4)) call assert_equal(-1, match('abc', '\zs', 0, 5)) call assert_equal(1 , match('abc', '\zs', 1, 1)) call assert_equal(2 , match('abc', '\zs', 2, 1)) call assert_equal(3 , match('abc', '\zs', 3, 1)) call assert_equal(-1, match('abc', '\zs', 4, 1)) endfunc " This was causing an illegal memory access func Test_inner_tag() new norm ixxx call feedkeys("v", 'xt') insert x x . norm it q! endfunc func Test_sentence() enew! call setline(1, 'A sentence. A sentence? A sentence!') normal yis call assert_equal('A sentence.', @") normal yas call assert_equal('A sentence. ', @") normal ) normal yis call assert_equal('A sentence?', @") normal yas call assert_equal('A sentence? ', @") normal ) normal yis call assert_equal('A sentence!', @") normal yas call assert_equal(' A sentence!', @") normal 0 normal 2yis call assert_equal('A sentence. ', @") normal 3yis call assert_equal('A sentence. A sentence?', @") normal 2yas call assert_equal('A sentence. A sentence? ', @") %delete _ endfunc func Test_sentence_with_quotes() enew! call setline(1, 'A "sentence." A sentence.') normal yis call assert_equal('A "sentence."', @") normal yas call assert_equal('A "sentence." ', @") normal ) normal yis call assert_equal('A sentence.', @") normal yas call assert_equal(' A sentence.', @") %delete _ endfunc func Test_sentence_with_cursor_on_delimiter() enew! call setline(1, "A '([sentence.])' A sentence.") normal! 15|yis call assert_equal("A '([sentence.])'", @") normal! 15|yas call assert_equal("A '([sentence.])' ", @") normal! 16|yis call assert_equal("A '([sentence.])'", @") normal! 16|yas call assert_equal("A '([sentence.])' ", @") normal! 17|yis call assert_equal("A '([sentence.])'", @") normal! 17|yas call assert_equal("A '([sentence.])' ", @") " don't get stuck on a quote at the start of a sentence %delete _ call setline(1, ['A sentence.', '"A sentence"?', 'A sentence!']) normal gg)) call assert_equal(3, getcurpos()[1]) %delete _ call setline(1, ['A sentence.', "'A sentence'?", 'A sentence!']) normal gg)) call assert_equal(3, getcurpos()[1]) %delete _ endfunc