100b24be4SBram Moolenaar" Test for textobjects
200b24be4SBram Moolenaar
3b46fecd3SBram Moolenaarsource check.vim
4b46fecd3SBram MoolenaarCheckFeature textobjects
500b24be4SBram Moolenaar
6c5e2b040SBram Moolenaarfunc CpoM(line, useM, expected)
700b24be4SBram Moolenaar  new
800b24be4SBram Moolenaar
900b24be4SBram Moolenaar  if a:useM
1000b24be4SBram Moolenaar    set cpoptions+=M
1100b24be4SBram Moolenaar  else
1200b24be4SBram Moolenaar    set cpoptions-=M
1300b24be4SBram Moolenaar  endif
1400b24be4SBram Moolenaar
1500b24be4SBram Moolenaar  call setline(1, a:line)
1600b24be4SBram Moolenaar
1700b24be4SBram Moolenaar  call setreg('"', '')
1800b24be4SBram Moolenaar  normal! ggfrmavi)y
1900b24be4SBram Moolenaar  call assert_equal(getreg('"'), a:expected[0])
2000b24be4SBram Moolenaar
2100b24be4SBram Moolenaar  call setreg('"', '')
2200b24be4SBram Moolenaar  normal! `afbmavi)y
2300b24be4SBram Moolenaar  call assert_equal(getreg('"'), a:expected[1])
2400b24be4SBram Moolenaar
2500b24be4SBram Moolenaar  call setreg('"', '')
2600b24be4SBram Moolenaar  normal! `afgmavi)y
2700b24be4SBram Moolenaar  call assert_equal(getreg('"'), a:expected[2])
2800b24be4SBram Moolenaar
2900b24be4SBram Moolenaar  q!
30c5e2b040SBram Moolenaarendfunc
3100b24be4SBram Moolenaar
32c5e2b040SBram Moolenaarfunc Test_inner_block_without_cpo_M()
3300b24be4SBram Moolenaar  call CpoM('(red \(blue) green)', 0, ['red \(blue', 'red \(blue', ''])
34c5e2b040SBram Moolenaarendfunc
3500b24be4SBram Moolenaar
36c5e2b040SBram Moolenaarfunc Test_inner_block_with_cpo_M_left_backslash()
3700b24be4SBram Moolenaar  call CpoM('(red \(blue) green)', 1, ['red \(blue) green', 'blue', 'red \(blue) green'])
38c5e2b040SBram Moolenaarendfunc
3900b24be4SBram Moolenaar
40c5e2b040SBram Moolenaarfunc Test_inner_block_with_cpo_M_right_backslash()
4100b24be4SBram Moolenaar  call CpoM('(red (blue\) green)', 1, ['red (blue\) green', 'blue\', 'red (blue\) green'])
42c5e2b040SBram Moolenaarendfunc
43c5e2b040SBram Moolenaar
44c5e2b040SBram Moolenaarfunc Test_quote_selection_selection_exclusive()
45c5e2b040SBram Moolenaar  new
46c5e2b040SBram Moolenaar  call setline(1, "a 'bcde' f")
47c5e2b040SBram Moolenaar  set selection=exclusive
4894d9f4faSBram Moolenaar
49c5e2b040SBram Moolenaar  exe "norm! fdvhi'y"
50c5e2b040SBram Moolenaar  call assert_equal('bcde', @")
5194d9f4faSBram Moolenaar
527170b295SBram Moolenaar  let @"='dummy'
537170b295SBram Moolenaar  exe "norm! $gevi'y"
547170b295SBram Moolenaar  call assert_equal('bcde', @")
5594d9f4faSBram Moolenaar
5694d9f4faSBram Moolenaar  let @"='dummy'
5794d9f4faSBram Moolenaar  exe "norm! 0fbhvi'y"
5894d9f4faSBram Moolenaar  call assert_equal('bcde', @")
5994d9f4faSBram Moolenaar
60c5e2b040SBram Moolenaar  set selection&vim
61c5e2b040SBram Moolenaar  bw!
62c5e2b040SBram Moolenaarendfunc
63db510071SBram Moolenaar
6455d3bdbbSBram Moolenaarfunc Test_quote_selection_selection_exclusive_abort()
6555d3bdbbSBram Moolenaar  new
6655d3bdbbSBram Moolenaar  set selection=exclusive
6755d3bdbbSBram Moolenaar  call setline(1, "'abzzc'")
6855d3bdbbSBram Moolenaar  let exp_curs = [0, 1, 6, 0]
6955d3bdbbSBram Moolenaar  call cursor(1,1)
7055d3bdbbSBram Moolenaar  exe 'norm! fcdvi"'
7155d3bdbbSBram Moolenaar  " make sure to end visual mode to have a clear state
7255d3bdbbSBram Moolenaar  exe "norm! \<esc>"
7355d3bdbbSBram Moolenaar  call assert_equal(exp_curs, getpos('.'))
7455d3bdbbSBram Moolenaar  call cursor(1,1)
7555d3bdbbSBram Moolenaar  exe 'norm! fcvi"'
7655d3bdbbSBram Moolenaar  exe "norm! \<esc>"
7755d3bdbbSBram Moolenaar  call assert_equal(exp_curs, getpos('.'))
7855d3bdbbSBram Moolenaar  call cursor(1,2)
7955d3bdbbSBram Moolenaar  exe 'norm! vfcoi"'
8055d3bdbbSBram Moolenaar  exe "norm! \<esc>"
8155d3bdbbSBram Moolenaar  let exp_curs = [0, 1, 2, 0]
8255d3bdbbSBram Moolenaar  let exp_visu = [0, 1, 7, 0]
8355d3bdbbSBram Moolenaar  call assert_equal(exp_curs, getpos('.'))
8455d3bdbbSBram Moolenaar  call assert_equal(exp_visu, getpos("'>"))
8555d3bdbbSBram Moolenaar  set selection&vim
8655d3bdbbSBram Moolenaar  bw!
8755d3bdbbSBram Moolenaarendfunc
8855d3bdbbSBram Moolenaar
89db510071SBram Moolenaar" Tests for string and html text objects
90db510071SBram Moolenaarfunc Test_string_html_objects()
91db510071SBram Moolenaar  enew!
92db510071SBram Moolenaar
93db510071SBram Moolenaar  let t = '"wo\"rd\\" foo'
94db510071SBram Moolenaar  put =t
95db510071SBram Moolenaar  normal! da"
96db510071SBram Moolenaar  call assert_equal('foo', getline('.'))
97db510071SBram Moolenaar
98db510071SBram Moolenaar  let t = "'foo' 'bar' 'piep'"
99db510071SBram Moolenaar  put =t
100db510071SBram Moolenaar  normal! 0va'a'rx
101db510071SBram Moolenaar  call assert_equal("xxxxxxxxxxxx'piep'", getline('.'))
102db510071SBram Moolenaar
103db510071SBram Moolenaar  let t = "bla bla `quote` blah"
104db510071SBram Moolenaar  put =t
105db510071SBram Moolenaar  normal! 02f`da`
106db510071SBram Moolenaar  call assert_equal("bla bla blah", getline('.'))
107db510071SBram Moolenaar
108db510071SBram Moolenaar  let t = 'out " in "noXno"'
109db510071SBram Moolenaar  put =t
110db510071SBram Moolenaar  normal! 0fXdi"
111db510071SBram Moolenaar  call assert_equal('out " in ""', getline('.'))
112db510071SBram Moolenaar
113db510071SBram Moolenaar  let t = "\"'\" 'blah' rep 'buh'"
114db510071SBram Moolenaar  put =t
115db510071SBram Moolenaar  normal! 03f'vi'ry
116db510071SBram Moolenaar  call assert_equal("\"'\" 'blah'yyyyy'buh'", getline('.'))
117db510071SBram Moolenaar
118db510071SBram Moolenaar  set quoteescape=+*-
119db510071SBram Moolenaar  let t = "bla `s*`d-`+++`l**` b`la"
120db510071SBram Moolenaar  put =t
121db510071SBram Moolenaar  normal! di`
122db510071SBram Moolenaar  call assert_equal("bla `` b`la", getline('.'))
123db510071SBram Moolenaar
124db510071SBram Moolenaar  let t = 'voo "nah" sdf " asdf" sdf " sdf" sd'
125db510071SBram Moolenaar  put =t
126db510071SBram Moolenaar  normal! $F"va"oha"i"rz
127db510071SBram Moolenaar  call assert_equal('voo "zzzzzzzzzzzzzzzzzzzzzzzzzzzzsd', getline('.'))
128db510071SBram Moolenaar
129db510071SBram Moolenaar  let t = "-<b>asdf<i>Xasdf</i>asdf</b>-"
130db510071SBram Moolenaar  put =t
131db510071SBram Moolenaar  normal! fXdit
132db510071SBram Moolenaar  call assert_equal('-<b>asdf<i></i>asdf</b>-', getline('.'))
133db510071SBram Moolenaar
134db510071SBram Moolenaar  let t = "-<b>asdX<i>a<i />sdf</i>asdf</b>-"
135db510071SBram Moolenaar  put =t
136db510071SBram Moolenaar  normal! 0fXdit
137db510071SBram Moolenaar  call assert_equal('-<b></b>-', getline('.'))
138db510071SBram Moolenaar
139db510071SBram Moolenaar  let t = "-<b>asdf<i>Xasdf</i>asdf</b>-"
140db510071SBram Moolenaar  put =t
141db510071SBram Moolenaar  normal! fXdat
142db510071SBram Moolenaar  call assert_equal('-<b>asdfasdf</b>-', getline('.'))
143db510071SBram Moolenaar
144db510071SBram Moolenaar  let t = "-<b>asdX<i>as<b />df</i>asdf</b>-"
145db510071SBram Moolenaar  put =t
146db510071SBram Moolenaar  normal! 0fXdat
147db510071SBram Moolenaar  call assert_equal('--', getline('.'))
148db510071SBram Moolenaar
149db510071SBram Moolenaar  let t = "-<b>\ninnertext object\n</b>"
150db510071SBram Moolenaar  put =t
151db510071SBram Moolenaar  normal! dit
152db510071SBram Moolenaar  call assert_equal('-<b></b>', getline('.'))
153db510071SBram Moolenaar
154224a5f17SBram Moolenaar  " copy the tag block from leading indentation before the start tag
155224a5f17SBram Moolenaar  let t = "    <b>\ntext\n</b>"
156224a5f17SBram Moolenaar  $put =t
157224a5f17SBram Moolenaar  normal! 2kvaty
158224a5f17SBram Moolenaar  call assert_equal("<b>\ntext\n</b>", @")
159224a5f17SBram Moolenaar
160224a5f17SBram Moolenaar  " copy the tag block from the end tag
161224a5f17SBram Moolenaar  let t = "<title>\nwelcome\n</title>"
162224a5f17SBram Moolenaar  $put =t
163224a5f17SBram Moolenaar  normal! $vaty
164224a5f17SBram Moolenaar  call assert_equal("<title>\nwelcome\n</title>", @")
165224a5f17SBram Moolenaar
166224a5f17SBram Moolenaar  " copy the outer tag block from a tag without an end tag
167224a5f17SBram Moolenaar  let t = "<html>\n<title>welcome\n</html>"
168224a5f17SBram Moolenaar  $put =t
169224a5f17SBram Moolenaar  normal! k$vaty
170224a5f17SBram Moolenaar  call assert_equal("<html>\n<title>welcome\n</html>", @")
171224a5f17SBram Moolenaar
172*a604ccc9SBram Moolenaar  " nested tag that has < in a different line from >
173*a604ccc9SBram Moolenaar  let t = "<div><div\n></div></div>"
174*a604ccc9SBram Moolenaar  $put =t
175*a604ccc9SBram Moolenaar  normal! k0vaty
176*a604ccc9SBram Moolenaar  call assert_equal("<div><div\n></div></div>", @")
177*a604ccc9SBram Moolenaar
178*a604ccc9SBram Moolenaar  " nested tag with attribute that has < in a different line from >
179*a604ccc9SBram Moolenaar  let t = "<div><div\nattr=\"attr\"\n></div></div>"
180*a604ccc9SBram Moolenaar  $put =t
181*a604ccc9SBram Moolenaar  normal! 2k0vaty
182*a604ccc9SBram Moolenaar  call assert_equal("<div><div\nattr=\"attr\"\n></div></div>", @")
183*a604ccc9SBram Moolenaar
184db510071SBram Moolenaar  set quoteescape&
185db510071SBram Moolenaar  enew!
186db510071SBram Moolenaarendfunc
187db510071SBram Moolenaar
188b476cb7dSBram Moolenaarfunc Test_empty_html_tag()
189b476cb7dSBram Moolenaar  new
190b476cb7dSBram Moolenaar  call setline(1, '<div></div>')
191b476cb7dSBram Moolenaar  normal 0citxxx
192b476cb7dSBram Moolenaar  call assert_equal('<div>xxx</div>', getline(1))
193b476cb7dSBram Moolenaar
194b476cb7dSBram Moolenaar  call setline(1, '<div></div>')
195b476cb7dSBram Moolenaar  normal 0f<cityyy
196b476cb7dSBram Moolenaar  call assert_equal('<div>yyy</div>', getline(1))
197b476cb7dSBram Moolenaar
198b476cb7dSBram Moolenaar  call setline(1, '<div></div>')
199b476cb7dSBram Moolenaar  normal 0f<vitsaaa
200b476cb7dSBram Moolenaar  call assert_equal('aaa', getline(1))
201b476cb7dSBram Moolenaar
202224a5f17SBram Moolenaar  " selecting a tag block in an non-empty blank line should fail
203224a5f17SBram Moolenaar  call setline(1, '    ')
204224a5f17SBram Moolenaar  call assert_beeps('normal $vaty')
205224a5f17SBram Moolenaar
206b476cb7dSBram Moolenaar  bwipe!
207b476cb7dSBram Moolenaarendfunc
208b476cb7dSBram Moolenaar
209db510071SBram Moolenaar" Tests for match() and matchstr()
210db510071SBram Moolenaarfunc Test_match()
211db510071SBram Moolenaar  call assert_equal("b", matchstr("abcd", ".", 0, 2))
212db510071SBram Moolenaar  call assert_equal("bc", matchstr("abcd", "..", 0, 2))
213db510071SBram Moolenaar  call assert_equal("c", matchstr("abcd", ".", 2, 0))
214db510071SBram Moolenaar  call assert_equal("a", matchstr("abcd", ".", 0, -1))
215db510071SBram Moolenaar  call assert_equal(-1, match("abcd", ".", 0, 5))
216db510071SBram Moolenaar  call assert_equal(0, match("abcd", ".", 0, -1))
217db510071SBram Moolenaar  call assert_equal(0, match('abc', '.', 0, 1))
218db510071SBram Moolenaar  call assert_equal(1, match('abc', '.', 0, 2))
219db510071SBram Moolenaar  call assert_equal(2, match('abc', '.', 0, 3))
220db510071SBram Moolenaar  call assert_equal(-1, match('abc', '.', 0, 4))
221db510071SBram Moolenaar  call assert_equal(1, match('abc', '.', 1, 1))
222db510071SBram Moolenaar  call assert_equal(2, match('abc', '.', 2, 1))
223db510071SBram Moolenaar  call assert_equal(-1, match('abc', '.', 3, 1))
224db510071SBram Moolenaar  call assert_equal(3, match('abc', '$', 0, 1))
225db510071SBram Moolenaar  call assert_equal(-1, match('abc', '$', 0, 2))
226db510071SBram Moolenaar  call assert_equal(3, match('abc', '$', 1, 1))
227db510071SBram Moolenaar  call assert_equal(3, match('abc', '$', 2, 1))
228db510071SBram Moolenaar  call assert_equal(3, match('abc', '$', 3, 1))
229db510071SBram Moolenaar  call assert_equal(-1, match('abc', '$', 4, 1))
230db510071SBram Moolenaar  call assert_equal(0, match('abc', '\zs', 0, 1))
231db510071SBram Moolenaar  call assert_equal(1, match('abc', '\zs', 0, 2))
232db510071SBram Moolenaar  call assert_equal(2, match('abc', '\zs', 0, 3))
233db510071SBram Moolenaar  call assert_equal(3, match('abc', '\zs', 0, 4))
234db510071SBram Moolenaar  call assert_equal(-1, match('abc', '\zs', 0, 5))
235db510071SBram Moolenaar  call assert_equal(1, match('abc', '\zs', 1, 1))
236db510071SBram Moolenaar  call assert_equal(2, match('abc', '\zs', 2, 1))
237db510071SBram Moolenaar  call assert_equal(3, match('abc', '\zs', 3, 1))
238db510071SBram Moolenaar  call assert_equal(-1, match('abc', '\zs', 4, 1))
239db510071SBram Moolenaarendfunc
24082846a00SBram Moolenaar
24182846a00SBram Moolenaar" This was causing an illegal memory access
24282846a00SBram Moolenaarfunc Test_inner_tag()
24382846a00SBram Moolenaar  new
24482846a00SBram Moolenaar  norm ixxx
24582846a00SBram Moolenaar  call feedkeys("v", 'xt')
24682846a00SBram Moolenaar  insert
24782846a00SBram Moolenaarx
24882846a00SBram Moolenaarx
24982846a00SBram Moolenaar.
25082846a00SBram Moolenaar  norm it
25182846a00SBram Moolenaar  q!
25282846a00SBram Moolenaarendfunc
25385160711SBram Moolenaar
25485160711SBram Moolenaarfunc Test_sentence()
25585160711SBram Moolenaar  enew!
25685160711SBram Moolenaar  call setline(1, 'A sentence.  A sentence?  A sentence!')
25785160711SBram Moolenaar
25885160711SBram Moolenaar  normal yis
25985160711SBram Moolenaar  call assert_equal('A sentence.', @")
26085160711SBram Moolenaar  normal yas
26185160711SBram Moolenaar  call assert_equal('A sentence.  ', @")
26285160711SBram Moolenaar
26385160711SBram Moolenaar  normal )
26485160711SBram Moolenaar
26585160711SBram Moolenaar  normal yis
26685160711SBram Moolenaar  call assert_equal('A sentence?', @")
26785160711SBram Moolenaar  normal yas
26885160711SBram Moolenaar  call assert_equal('A sentence?  ', @")
26985160711SBram Moolenaar
27085160711SBram Moolenaar  normal )
27185160711SBram Moolenaar
27285160711SBram Moolenaar  normal yis
27385160711SBram Moolenaar  call assert_equal('A sentence!', @")
27485160711SBram Moolenaar  normal yas
27585160711SBram Moolenaar  call assert_equal('  A sentence!', @")
27685160711SBram Moolenaar
27785160711SBram Moolenaar  normal 0
27885160711SBram Moolenaar  normal 2yis
27985160711SBram Moolenaar  call assert_equal('A sentence.  ', @")
28085160711SBram Moolenaar  normal 3yis
28185160711SBram Moolenaar  call assert_equal('A sentence.  A sentence?', @")
28285160711SBram Moolenaar  normal 2yas
28385160711SBram Moolenaar  call assert_equal('A sentence.  A sentence?  ', @")
28485160711SBram Moolenaar
28585160711SBram Moolenaar  %delete _
28685160711SBram Moolenaarendfunc
28785160711SBram Moolenaar
28885160711SBram Moolenaarfunc Test_sentence_with_quotes()
28985160711SBram Moolenaar  enew!
29085160711SBram Moolenaar  call setline(1, 'A "sentence."  A sentence.')
29185160711SBram Moolenaar
29285160711SBram Moolenaar  normal yis
29385160711SBram Moolenaar  call assert_equal('A "sentence."', @")
29485160711SBram Moolenaar  normal yas
29585160711SBram Moolenaar  call assert_equal('A "sentence."  ', @")
29685160711SBram Moolenaar
29785160711SBram Moolenaar  normal )
29885160711SBram Moolenaar
29985160711SBram Moolenaar  normal yis
30085160711SBram Moolenaar  call assert_equal('A sentence.', @")
30185160711SBram Moolenaar  normal yas
30285160711SBram Moolenaar  call assert_equal('  A sentence.', @")
30385160711SBram Moolenaar
30485160711SBram Moolenaar  %delete _
30585160711SBram Moolenaarendfunc
30685160711SBram Moolenaar
3071e115360SBram Moolenaarfunc Test_sentence_with_cursor_on_delimiter()
30885160711SBram Moolenaar  enew!
30985160711SBram Moolenaar  call setline(1, "A '([sentence.])'  A sentence.")
31085160711SBram Moolenaar
31185160711SBram Moolenaar  normal! 15|yis
31285160711SBram Moolenaar  call assert_equal("A '([sentence.])'", @")
31385160711SBram Moolenaar  normal! 15|yas
31485160711SBram Moolenaar  call assert_equal("A '([sentence.])'  ", @")
31585160711SBram Moolenaar
31685160711SBram Moolenaar  normal! 16|yis
31785160711SBram Moolenaar  call assert_equal("A '([sentence.])'", @")
31885160711SBram Moolenaar  normal! 16|yas
31985160711SBram Moolenaar  call assert_equal("A '([sentence.])'  ", @")
32085160711SBram Moolenaar
32185160711SBram Moolenaar  normal! 17|yis
32285160711SBram Moolenaar  call assert_equal("A '([sentence.])'", @")
32385160711SBram Moolenaar  normal! 17|yas
32485160711SBram Moolenaar  call assert_equal("A '([sentence.])'  ", @")
32585160711SBram Moolenaar
3262f03e5a0SBram Moolenaar  " don't get stuck on a quote at the start of a sentence
3272f03e5a0SBram Moolenaar  %delete _
3282f03e5a0SBram Moolenaar  call setline(1, ['A sentence.', '"A sentence"?', 'A sentence!'])
3292f03e5a0SBram Moolenaar  normal gg))
3302f03e5a0SBram Moolenaar  call assert_equal(3, getcurpos()[1])
3312f03e5a0SBram Moolenaar
3322f03e5a0SBram Moolenaar  %delete _
3332f03e5a0SBram Moolenaar  call setline(1, ['A sentence.', "'A sentence'?", 'A sentence!'])
3342f03e5a0SBram Moolenaar  normal gg))
3352f03e5a0SBram Moolenaar  call assert_equal(3, getcurpos()[1])
3362f03e5a0SBram Moolenaar
33785160711SBram Moolenaar  %delete _
33885160711SBram Moolenaarendfunc
339224a5f17SBram Moolenaar
340224a5f17SBram Moolenaar" Test for the paragraph (ap) text object
341224a5f17SBram Moolenaarfunc Test_paragraph()
342224a5f17SBram Moolenaar  new
343224a5f17SBram Moolenaar  call setline(1, ['First line.', 'Second line.', 'Third line.'])
344224a5f17SBram Moolenaar  call cursor(2, 1)
345224a5f17SBram Moolenaar  normal vapy
346224a5f17SBram Moolenaar  call assert_equal("First line.\nSecond line.\nThird line.\n", @")
347224a5f17SBram Moolenaar
348224a5f17SBram Moolenaar  call cursor(2, 1)
349224a5f17SBram Moolenaar  call assert_beeps('normal vapapy')
350224a5f17SBram Moolenaar
351224a5f17SBram Moolenaar  call setline(1, ['First line.', 'Second line.', '  ', ''])
352224a5f17SBram Moolenaar  call cursor(1, 1)
353224a5f17SBram Moolenaar  normal vapy
354224a5f17SBram Moolenaar  call assert_equal("First line.\nSecond line.\n  \n\n", @")
355224a5f17SBram Moolenaar
356224a5f17SBram Moolenaar  call setline(1, ['', '', '', 'First line.', 'Second line.'])
357224a5f17SBram Moolenaar  call cursor(2, 1)
358224a5f17SBram Moolenaar  normal yap
359224a5f17SBram Moolenaar  call assert_equal("\n\n\nFirst line.\nSecond line.\n", @")
360224a5f17SBram Moolenaar  call assert_beeps('normal 3yap')
361224a5f17SBram Moolenaar  exe "normal \<C-C>"
362224a5f17SBram Moolenaar
363224a5f17SBram Moolenaar  %d
364224a5f17SBram Moolenaar  call setline(1, ['  ', '  ', '  '])
365224a5f17SBram Moolenaar  call cursor(2, 1)
366224a5f17SBram Moolenaar  normal Vipy
367224a5f17SBram Moolenaar  call assert_equal("  \n  \n  \n", @")
368224a5f17SBram Moolenaar  call cursor(2, 1)
369224a5f17SBram Moolenaar  call assert_beeps("normal Vipip")
370224a5f17SBram Moolenaar  exe "normal \<C-C>"
371224a5f17SBram Moolenaar
372224a5f17SBram Moolenaar  close!
373224a5f17SBram Moolenaarendfunc
374224a5f17SBram Moolenaar
375224a5f17SBram Moolenaar" Tests for text object aw
376224a5f17SBram Moolenaarfunc Test_textobj_a_word()
377224a5f17SBram Moolenaar  new
378224a5f17SBram Moolenaar  call append(0, ['foobar,eins,foobar', 'foo,zwei,foo    '])
379224a5f17SBram Moolenaar  " diw
380224a5f17SBram Moolenaar  norm! 1gg0diw
381224a5f17SBram Moolenaar  call assert_equal([',eins,foobar', 'foo,zwei,foo    ', ''], getline(1,'$'))
382224a5f17SBram Moolenaar  " daw
383224a5f17SBram Moolenaar  norm! 2ggEdaw
384224a5f17SBram Moolenaar  call assert_equal([',eins,foobar', 'foo,zwei,', ''], getline(1, '$'))
385224a5f17SBram Moolenaar  " daw the last word in a line
386224a5f17SBram Moolenaar  call setline(1, ['foo bar', 'foo bar', ''])
387224a5f17SBram Moolenaar  call cursor(1, 5)
388224a5f17SBram Moolenaar  normal daw
389224a5f17SBram Moolenaar  call assert_equal('foo', getline(1))
390224a5f17SBram Moolenaar  " aw in visual mode
391224a5f17SBram Moolenaar  call cursor(2, 5)
392224a5f17SBram Moolenaar  normal! vawx
393224a5f17SBram Moolenaar  call assert_equal('foo', getline(2))
394224a5f17SBram Moolenaar  %d
395224a5f17SBram Moolenaar  call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo   "])
396224a5f17SBram Moolenaar  " diW
397224a5f17SBram Moolenaar  norm! 2ggwd2iW
398224a5f17SBram Moolenaar  call assert_equal(['foo	eins	foobar', 'foo	foo   ', ''], getline(1,'$'))
399224a5f17SBram Moolenaar  " daW
400224a5f17SBram Moolenaar  norm! 1ggd2aW
401224a5f17SBram Moolenaar  call assert_equal(['foobar', 'foo	foo   ', ''], getline(1,'$'))
402224a5f17SBram Moolenaar
403224a5f17SBram Moolenaar  %d
404224a5f17SBram Moolenaar  call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo   "])
405224a5f17SBram Moolenaar  " aw in visual line mode switches to characterwise mode
406224a5f17SBram Moolenaar  norm! 2gg$Vawd
407224a5f17SBram Moolenaar  call assert_equal(['foo	eins	foobar', 'foo	zwei	foo'], getline(1,'$'))
408224a5f17SBram Moolenaar  norm! 1gg$Viwd
409224a5f17SBram Moolenaar  call assert_equal(['foo	eins	', 'foo	zwei	foo'], getline(1,'$'))
410224a5f17SBram Moolenaar
411224a5f17SBram Moolenaar  " visually selecting a tab before a word with 'selection' set to 'exclusive'
412224a5f17SBram Moolenaar  set selection=exclusive
413224a5f17SBram Moolenaar  normal gg3lvlawy
414224a5f17SBram Moolenaar  call assert_equal("\teins", @")
415224a5f17SBram Moolenaar  " visually selecting a tab before a word with 'selection' set to 'inclusive'
416224a5f17SBram Moolenaar  set selection=inclusive
417224a5f17SBram Moolenaar  normal gg3lvlawy
418224a5f17SBram Moolenaar  call assert_equal("\teins\t", @")
419224a5f17SBram Moolenaar  set selection&
420224a5f17SBram Moolenaar
421224a5f17SBram Moolenaar  " selecting a word with no non-space characters in a buffer fails
422224a5f17SBram Moolenaar  %d
423224a5f17SBram Moolenaar  call setline(1, '    ')
424224a5f17SBram Moolenaar  call assert_beeps('normal 3lyaw')
425224a5f17SBram Moolenaar
426224a5f17SBram Moolenaar  " visually selecting words backwards with no more words to select
427224a5f17SBram Moolenaar  call setline(1, 'one two')
428224a5f17SBram Moolenaar  call assert_beeps('normal 2lvh2aw')
429224a5f17SBram Moolenaar  exe "normal \<C-C>"
430224a5f17SBram Moolenaar  call assert_beeps('normal $vh3aw')
431224a5f17SBram Moolenaar  exe "normal \<C-C>"
432224a5f17SBram Moolenaar  call setline(1, ['', 'one two'])
433224a5f17SBram Moolenaar  call assert_beeps('normal 2G2lvh3aw')
434224a5f17SBram Moolenaar  exe "normal \<C-C>"
435224a5f17SBram Moolenaar
436224a5f17SBram Moolenaar  " selecting words forward with no more words to select
437224a5f17SBram Moolenaar  %d
438224a5f17SBram Moolenaar  call setline(1, 'one a')
439224a5f17SBram Moolenaar  call assert_beeps('normal 0y3aw')
440224a5f17SBram Moolenaar  call setline(1, 'one two ')
441224a5f17SBram Moolenaar  call assert_beeps('normal 0y3aw')
442224a5f17SBram Moolenaar  call assert_beeps('normal 03ly2aw')
443224a5f17SBram Moolenaar
444224a5f17SBram Moolenaar  " clean up
445224a5f17SBram Moolenaar  bw!
446224a5f17SBram Moolenaarendfunc
447224a5f17SBram Moolenaar
448224a5f17SBram Moolenaar" Test for is and as text objects
449224a5f17SBram Moolenaarfunc Test_textobj_sentence()
450224a5f17SBram Moolenaar  new
451224a5f17SBram Moolenaar  call append(0, ['This is a test. With some sentences!', '',
452224a5f17SBram Moolenaar        \ 'Even with a question? And one more. And no sentence here'])
453224a5f17SBram Moolenaar  " Test for dis - does not remove trailing whitespace
454224a5f17SBram Moolenaar  norm! 1gg0dis
455224a5f17SBram Moolenaar  call assert_equal([' With some sentences!', '',
456224a5f17SBram Moolenaar        \ 'Even with a question? And one more. And no sentence here', ''],
457224a5f17SBram Moolenaar        \ getline(1,'$'))
458224a5f17SBram Moolenaar  " Test for das - removes leading whitespace
459224a5f17SBram Moolenaar  norm! 3ggf?ldas
460224a5f17SBram Moolenaar  call assert_equal([' With some sentences!', '',
461224a5f17SBram Moolenaar        \ 'Even with a question? And no sentence here', ''], getline(1,'$'))
462224a5f17SBram Moolenaar  " when used in visual mode, is made characterwise
463224a5f17SBram Moolenaar  norm! 3gg$Visy
464224a5f17SBram Moolenaar  call assert_equal('v', visualmode())
465224a5f17SBram Moolenaar  " reset visualmode()
466224a5f17SBram Moolenaar  norm! 3ggVy
467224a5f17SBram Moolenaar  norm! 3gg$Vasy
468224a5f17SBram Moolenaar  call assert_equal('v', visualmode())
469224a5f17SBram Moolenaar  " basic testing for textobjects a< and at
470224a5f17SBram Moolenaar  %d
471224a5f17SBram Moolenaar  call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>','    </div>', ' '])
472224a5f17SBram Moolenaar  " a<
473224a5f17SBram Moolenaar  norm! 1gg0da<
474224a5f17SBram Moolenaar  call assert_equal([' ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
475224a5f17SBram Moolenaar  norm! 1pj
476224a5f17SBram Moolenaar  call assert_equal([' <div>', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
477224a5f17SBram Moolenaar  " at
478224a5f17SBram Moolenaar  norm! d2at
479224a5f17SBram Moolenaar  call assert_equal([' '], getline(1,'$'))
480224a5f17SBram Moolenaar  %d
481224a5f17SBram Moolenaar  call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>','    </div>', ' '])
482224a5f17SBram Moolenaar  " i<
483224a5f17SBram Moolenaar  norm! 1gg0di<
484224a5f17SBram Moolenaar  call assert_equal(['<> ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
485224a5f17SBram Moolenaar  norm! 1Pj
486224a5f17SBram Moolenaar  call assert_equal(['<div> ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
487224a5f17SBram Moolenaar  norm! d2it
488224a5f17SBram Moolenaar  call assert_equal(['<div></div>',' '], getline(1,'$'))
489224a5f17SBram Moolenaar  " basic testing for a[ and i[ text object
490224a5f17SBram Moolenaar  %d
491224a5f17SBram Moolenaar  call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
492224a5f17SBram Moolenaar  norm! 3gg0di[
493224a5f17SBram Moolenaar  call assert_equal([' ', '[', ']'], getline(1,'$'))
494224a5f17SBram Moolenaar  call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
495224a5f17SBram Moolenaar  norm! 3gg0ftd2a[
496224a5f17SBram Moolenaar  call assert_equal([' '], getline(1,'$'))
497224a5f17SBram Moolenaar
498224a5f17SBram Moolenaar  " clean up
499224a5f17SBram Moolenaar  bw!
500224a5f17SBram Moolenaarendfunc
501224a5f17SBram Moolenaar
502224a5f17SBram Moolenaar" Test for quote (', " and `) textobjects
503224a5f17SBram Moolenaarfunc Test_textobj_quote()
504224a5f17SBram Moolenaar  new
505224a5f17SBram Moolenaar
506224a5f17SBram Moolenaar  " Test for i" when cursor is in front of a quoted object
507224a5f17SBram Moolenaar  call append(0, 'foo "bar"')
508224a5f17SBram Moolenaar  norm! 1gg0di"
509224a5f17SBram Moolenaar  call assert_equal(['foo ""', ''], getline(1,'$'))
510224a5f17SBram Moolenaar
511224a5f17SBram Moolenaar  " Test for visually selecting an inner quote
512224a5f17SBram Moolenaar  %d
513224a5f17SBram Moolenaar  " extend visual selection from one quote to the next
514224a5f17SBram Moolenaar  call setline(1, 'color "red" color "blue"')
515224a5f17SBram Moolenaar  call cursor(1, 7)
516224a5f17SBram Moolenaar  normal v4li"y
517224a5f17SBram Moolenaar  call assert_equal('"red" color "blue', @")
518224a5f17SBram Moolenaar
519224a5f17SBram Moolenaar  " try to extend visual selection from one quote to a non-existing quote
520224a5f17SBram Moolenaar  call setline(1, 'color "red" color blue')
521224a5f17SBram Moolenaar  call cursor(1, 7)
522224a5f17SBram Moolenaar  call feedkeys('v4li"y', 'xt')
523224a5f17SBram Moolenaar  call assert_equal('"red"', @")
524224a5f17SBram Moolenaar
525224a5f17SBram Moolenaar  " try to extend visual selection from one quote to a next partial quote
526224a5f17SBram Moolenaar  call setline(1, 'color "red" color "blue')
527224a5f17SBram Moolenaar  call cursor(1, 7)
528224a5f17SBram Moolenaar  normal v4li"y
529224a5f17SBram Moolenaar  call assert_equal('"red" color ', @")
530224a5f17SBram Moolenaar
531224a5f17SBram Moolenaar  " select a quote backwards in visual mode
532224a5f17SBram Moolenaar  call cursor(1, 12)
533224a5f17SBram Moolenaar  normal vhi"y
534224a5f17SBram Moolenaar  call assert_equal('red" ', @")
535224a5f17SBram Moolenaar  call assert_equal(8, col('.'))
536224a5f17SBram Moolenaar
537224a5f17SBram Moolenaar  " select a quote backwards in visual mode from outside the quote
538224a5f17SBram Moolenaar  call cursor(1, 17)
539224a5f17SBram Moolenaar  normal v2hi"y
540224a5f17SBram Moolenaar  call assert_equal('red', @")
541224a5f17SBram Moolenaar  call assert_equal(8, col('.'))
542224a5f17SBram Moolenaar
543224a5f17SBram Moolenaar  " visually selecting a quote with 'selection' set to 'exclusive'
544224a5f17SBram Moolenaar  call setline(1, 'He said "How are you?"')
545224a5f17SBram Moolenaar  set selection=exclusive
546224a5f17SBram Moolenaar  normal 012lv2li"y
547224a5f17SBram Moolenaar  call assert_equal('How are you?', @")
548224a5f17SBram Moolenaar  set selection&
549224a5f17SBram Moolenaar
550224a5f17SBram Moolenaar  " try copy a quote object with a single quote in the line
551224a5f17SBram Moolenaar  call setline(1, "Smith's car")
552224a5f17SBram Moolenaar  call cursor(1, 6)
553224a5f17SBram Moolenaar  call assert_beeps("normal yi'")
554224a5f17SBram Moolenaar  call assert_beeps("normal 2lyi'")
555224a5f17SBram Moolenaar
556224a5f17SBram Moolenaar  " selecting space before and after a quoted string
557224a5f17SBram Moolenaar  call setline(1, "some    'special'    string")
558224a5f17SBram Moolenaar  normal 0ya'
559224a5f17SBram Moolenaar  call assert_equal("'special'    ", @")
560224a5f17SBram Moolenaar  call setline(1, "some    'special'string")
561224a5f17SBram Moolenaar  normal 0ya'
562224a5f17SBram Moolenaar  call assert_equal("    'special'", @")
563224a5f17SBram Moolenaar
564224a5f17SBram Moolenaar  close!
565224a5f17SBram Moolenaarendfunc
566224a5f17SBram Moolenaar
567224a5f17SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
568