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()
91*af631f61SDominique Pelle
92*af631f61SDominique Pelle  for e in ['utf-8', 'latin1', 'cp932']
93db510071SBram Moolenaar    enew!
94*af631f61SDominique Pelle    exe 'set enc=' .. e
95db510071SBram Moolenaar
96db510071SBram Moolenaar    let t = '"wo\"rd\\" foo'
97db510071SBram Moolenaar    put =t
98db510071SBram Moolenaar    normal! da"
99*af631f61SDominique Pelle    call assert_equal('foo', getline('.'), e)
100db510071SBram Moolenaar
101db510071SBram Moolenaar    let t = "'foo' 'bar' 'piep'"
102db510071SBram Moolenaar    put =t
103db510071SBram Moolenaar    normal! 0va'a'rx
104*af631f61SDominique Pelle    call assert_equal("xxxxxxxxxxxx'piep'", getline('.'), e)
105db510071SBram Moolenaar
106db510071SBram Moolenaar    let t = "bla bla `quote` blah"
107db510071SBram Moolenaar    put =t
108db510071SBram Moolenaar    normal! 02f`da`
109*af631f61SDominique Pelle    call assert_equal("bla bla blah", getline('.'), e)
110db510071SBram Moolenaar
111db510071SBram Moolenaar    let t = 'out " in "noXno"'
112db510071SBram Moolenaar    put =t
113db510071SBram Moolenaar    normal! 0fXdi"
114*af631f61SDominique Pelle    call assert_equal('out " in ""', getline('.'), e)
115db510071SBram Moolenaar
116db510071SBram Moolenaar    let t = "\"'\" 'blah' rep 'buh'"
117db510071SBram Moolenaar    put =t
118db510071SBram Moolenaar    normal! 03f'vi'ry
119*af631f61SDominique Pelle    call assert_equal("\"'\" 'blah'yyyyy'buh'", getline('.'), e)
120db510071SBram Moolenaar
121db510071SBram Moolenaar    set quoteescape=+*-
122db510071SBram Moolenaar    let t = "bla `s*`d-`+++`l**` b`la"
123db510071SBram Moolenaar    put =t
124db510071SBram Moolenaar    normal! di`
125*af631f61SDominique Pelle    call assert_equal("bla `` b`la", getline('.'), e)
126db510071SBram Moolenaar
127db510071SBram Moolenaar    let t = 'voo "nah" sdf " asdf" sdf " sdf" sd'
128db510071SBram Moolenaar    put =t
129db510071SBram Moolenaar    normal! $F"va"oha"i"rz
130*af631f61SDominique Pelle    call assert_equal('voo "zzzzzzzzzzzzzzzzzzzzzzzzzzzzsd', getline('.'), e)
131db510071SBram Moolenaar
132db510071SBram Moolenaar    let t = "-<b>asdf<i>Xasdf</i>asdf</b>-"
133db510071SBram Moolenaar    put =t
134db510071SBram Moolenaar    normal! fXdit
135*af631f61SDominique Pelle    call assert_equal('-<b>asdf<i></i>asdf</b>-', getline('.'), e)
136db510071SBram Moolenaar
137db510071SBram Moolenaar    let t = "-<b>asdX<i>a<i />sdf</i>asdf</b>-"
138db510071SBram Moolenaar    put =t
139db510071SBram Moolenaar    normal! 0fXdit
140*af631f61SDominique Pelle    call assert_equal('-<b></b>-', getline('.'), e)
141db510071SBram Moolenaar
142db510071SBram Moolenaar    let t = "-<b>asdf<i>Xasdf</i>asdf</b>-"
143db510071SBram Moolenaar    put =t
144db510071SBram Moolenaar    normal! fXdat
145*af631f61SDominique Pelle    call assert_equal('-<b>asdfasdf</b>-', getline('.'), e)
146db510071SBram Moolenaar
147db510071SBram Moolenaar    let t = "-<b>asdX<i>as<b />df</i>asdf</b>-"
148db510071SBram Moolenaar    put =t
149db510071SBram Moolenaar    normal! 0fXdat
150*af631f61SDominique Pelle    call assert_equal('--', getline('.'), e)
151db510071SBram Moolenaar
152db510071SBram Moolenaar    let t = "-<b>\ninnertext object\n</b>"
153db510071SBram Moolenaar    put =t
154db510071SBram Moolenaar    normal! dit
155*af631f61SDominique Pelle    call assert_equal('-<b></b>', getline('.'), e)
156db510071SBram Moolenaar
157224a5f17SBram Moolenaar    " copy the tag block from leading indentation before the start tag
158224a5f17SBram Moolenaar    let t = "    <b>\ntext\n</b>"
159224a5f17SBram Moolenaar    $put =t
160224a5f17SBram Moolenaar    normal! 2kvaty
161*af631f61SDominique Pelle    call assert_equal("<b>\ntext\n</b>", @", e)
162224a5f17SBram Moolenaar
163224a5f17SBram Moolenaar    " copy the tag block from the end tag
164224a5f17SBram Moolenaar    let t = "<title>\nwelcome\n</title>"
165224a5f17SBram Moolenaar    $put =t
166224a5f17SBram Moolenaar    normal! $vaty
167*af631f61SDominique Pelle    call assert_equal("<title>\nwelcome\n</title>", @", e)
168224a5f17SBram Moolenaar
169224a5f17SBram Moolenaar    " copy the outer tag block from a tag without an end tag
170224a5f17SBram Moolenaar    let t = "<html>\n<title>welcome\n</html>"
171224a5f17SBram Moolenaar    $put =t
172224a5f17SBram Moolenaar    normal! k$vaty
173*af631f61SDominique Pelle    call assert_equal("<html>\n<title>welcome\n</html>", @", e)
174224a5f17SBram Moolenaar
175a604ccc9SBram Moolenaar    " nested tag that has < in a different line from >
176a604ccc9SBram Moolenaar    let t = "<div><div\n></div></div>"
177a604ccc9SBram Moolenaar    $put =t
178a604ccc9SBram Moolenaar    normal! k0vaty
179*af631f61SDominique Pelle    call assert_equal("<div><div\n></div></div>", @", e)
180a604ccc9SBram Moolenaar
181a604ccc9SBram Moolenaar    " nested tag with attribute that has < in a different line from >
182a604ccc9SBram Moolenaar    let t = "<div><div\nattr=\"attr\"\n></div></div>"
183a604ccc9SBram Moolenaar    $put =t
184a604ccc9SBram Moolenaar    normal! 2k0vaty
185*af631f61SDominique Pelle    call assert_equal("<div><div\nattr=\"attr\"\n></div></div>", @", e)
186a604ccc9SBram Moolenaar
187db510071SBram Moolenaar    set quoteescape&
188*af631f61SDominique Pelle  endfor
189*af631f61SDominique Pelle
190*af631f61SDominique Pelle  set enc=utf-8
191*af631f61SDominique Pelle  bwipe!
192db510071SBram Moolenaarendfunc
193db510071SBram Moolenaar
194b476cb7dSBram Moolenaarfunc Test_empty_html_tag()
195b476cb7dSBram Moolenaar  new
196b476cb7dSBram Moolenaar  call setline(1, '<div></div>')
197b476cb7dSBram Moolenaar  normal 0citxxx
198b476cb7dSBram Moolenaar  call assert_equal('<div>xxx</div>', getline(1))
199b476cb7dSBram Moolenaar
200b476cb7dSBram Moolenaar  call setline(1, '<div></div>')
201b476cb7dSBram Moolenaar  normal 0f<cityyy
202b476cb7dSBram Moolenaar  call assert_equal('<div>yyy</div>', getline(1))
203b476cb7dSBram Moolenaar
204b476cb7dSBram Moolenaar  call setline(1, '<div></div>')
205b476cb7dSBram Moolenaar  normal 0f<vitsaaa
206b476cb7dSBram Moolenaar  call assert_equal('aaa', getline(1))
207b476cb7dSBram Moolenaar
208224a5f17SBram Moolenaar  " selecting a tag block in an non-empty blank line should fail
209224a5f17SBram Moolenaar  call setline(1, '    ')
210224a5f17SBram Moolenaar  call assert_beeps('normal $vaty')
211224a5f17SBram Moolenaar
212b476cb7dSBram Moolenaar  bwipe!
213b476cb7dSBram Moolenaarendfunc
214b476cb7dSBram Moolenaar
215db510071SBram Moolenaar" Tests for match() and matchstr()
216db510071SBram Moolenaarfunc Test_match()
217db510071SBram Moolenaar  call assert_equal("b", matchstr("abcd", ".", 0, 2))
218db510071SBram Moolenaar  call assert_equal("bc", matchstr("abcd", "..", 0, 2))
219db510071SBram Moolenaar  call assert_equal("c", matchstr("abcd", ".", 2, 0))
220db510071SBram Moolenaar  call assert_equal("a", matchstr("abcd", ".", 0, -1))
221db510071SBram Moolenaar  call assert_equal(-1, match("abcd", ".", 0, 5))
222db510071SBram Moolenaar  call assert_equal(0, match("abcd", ".", 0, -1))
223db510071SBram Moolenaar  call assert_equal(0, match('abc', '.', 0, 1))
224db510071SBram Moolenaar  call assert_equal(1, match('abc', '.', 0, 2))
225db510071SBram Moolenaar  call assert_equal(2, match('abc', '.', 0, 3))
226db510071SBram Moolenaar  call assert_equal(-1, match('abc', '.', 0, 4))
227db510071SBram Moolenaar  call assert_equal(1, match('abc', '.', 1, 1))
228db510071SBram Moolenaar  call assert_equal(2, match('abc', '.', 2, 1))
229db510071SBram Moolenaar  call assert_equal(-1, match('abc', '.', 3, 1))
230db510071SBram Moolenaar  call assert_equal(3, match('abc', '$', 0, 1))
231db510071SBram Moolenaar  call assert_equal(-1, match('abc', '$', 0, 2))
232db510071SBram Moolenaar  call assert_equal(3, match('abc', '$', 1, 1))
233db510071SBram Moolenaar  call assert_equal(3, match('abc', '$', 2, 1))
234db510071SBram Moolenaar  call assert_equal(3, match('abc', '$', 3, 1))
235db510071SBram Moolenaar  call assert_equal(-1, match('abc', '$', 4, 1))
236db510071SBram Moolenaar  call assert_equal(0, match('abc', '\zs', 0, 1))
237db510071SBram Moolenaar  call assert_equal(1, match('abc', '\zs', 0, 2))
238db510071SBram Moolenaar  call assert_equal(2, match('abc', '\zs', 0, 3))
239db510071SBram Moolenaar  call assert_equal(3, match('abc', '\zs', 0, 4))
240db510071SBram Moolenaar  call assert_equal(-1, match('abc', '\zs', 0, 5))
241db510071SBram Moolenaar  call assert_equal(1, match('abc', '\zs', 1, 1))
242db510071SBram Moolenaar  call assert_equal(2, match('abc', '\zs', 2, 1))
243db510071SBram Moolenaar  call assert_equal(3, match('abc', '\zs', 3, 1))
244db510071SBram Moolenaar  call assert_equal(-1, match('abc', '\zs', 4, 1))
245db510071SBram Moolenaarendfunc
24682846a00SBram Moolenaar
24782846a00SBram Moolenaar" This was causing an illegal memory access
24882846a00SBram Moolenaarfunc Test_inner_tag()
24982846a00SBram Moolenaar  new
25082846a00SBram Moolenaar  norm ixxx
25182846a00SBram Moolenaar  call feedkeys("v", 'xt')
25282846a00SBram Moolenaar  insert
25382846a00SBram Moolenaarx
25482846a00SBram Moolenaarx
25582846a00SBram Moolenaar.
25682846a00SBram Moolenaar  norm it
25782846a00SBram Moolenaar  q!
25882846a00SBram Moolenaarendfunc
25985160711SBram Moolenaar
26085160711SBram Moolenaarfunc Test_sentence()
26185160711SBram Moolenaar  enew!
26285160711SBram Moolenaar  call setline(1, 'A sentence.  A sentence?  A sentence!')
26385160711SBram Moolenaar
26485160711SBram Moolenaar  normal yis
26585160711SBram Moolenaar  call assert_equal('A sentence.', @")
26685160711SBram Moolenaar  normal yas
26785160711SBram Moolenaar  call assert_equal('A sentence.  ', @")
26885160711SBram Moolenaar
26985160711SBram Moolenaar  normal )
27085160711SBram Moolenaar
27185160711SBram Moolenaar  normal yis
27285160711SBram Moolenaar  call assert_equal('A sentence?', @")
27385160711SBram Moolenaar  normal yas
27485160711SBram Moolenaar  call assert_equal('A sentence?  ', @")
27585160711SBram Moolenaar
27685160711SBram Moolenaar  normal )
27785160711SBram Moolenaar
27885160711SBram Moolenaar  normal yis
27985160711SBram Moolenaar  call assert_equal('A sentence!', @")
28085160711SBram Moolenaar  normal yas
28185160711SBram Moolenaar  call assert_equal('  A sentence!', @")
28285160711SBram Moolenaar
28385160711SBram Moolenaar  normal 0
28485160711SBram Moolenaar  normal 2yis
28585160711SBram Moolenaar  call assert_equal('A sentence.  ', @")
28685160711SBram Moolenaar  normal 3yis
28785160711SBram Moolenaar  call assert_equal('A sentence.  A sentence?', @")
28885160711SBram Moolenaar  normal 2yas
28985160711SBram Moolenaar  call assert_equal('A sentence.  A sentence?  ', @")
29085160711SBram Moolenaar
29185160711SBram Moolenaar  %delete _
29285160711SBram Moolenaarendfunc
29385160711SBram Moolenaar
29485160711SBram Moolenaarfunc Test_sentence_with_quotes()
29585160711SBram Moolenaar  enew!
29685160711SBram Moolenaar  call setline(1, 'A "sentence."  A sentence.')
29785160711SBram Moolenaar
29885160711SBram Moolenaar  normal yis
29985160711SBram Moolenaar  call assert_equal('A "sentence."', @")
30085160711SBram Moolenaar  normal yas
30185160711SBram Moolenaar  call assert_equal('A "sentence."  ', @")
30285160711SBram Moolenaar
30385160711SBram Moolenaar  normal )
30485160711SBram Moolenaar
30585160711SBram Moolenaar  normal yis
30685160711SBram Moolenaar  call assert_equal('A sentence.', @")
30785160711SBram Moolenaar  normal yas
30885160711SBram Moolenaar  call assert_equal('  A sentence.', @")
30985160711SBram Moolenaar
31085160711SBram Moolenaar  %delete _
31185160711SBram Moolenaarendfunc
31285160711SBram Moolenaar
3131e115360SBram Moolenaarfunc Test_sentence_with_cursor_on_delimiter()
31485160711SBram Moolenaar  enew!
31585160711SBram Moolenaar  call setline(1, "A '([sentence.])'  A sentence.")
31685160711SBram Moolenaar
31785160711SBram Moolenaar  normal! 15|yis
31885160711SBram Moolenaar  call assert_equal("A '([sentence.])'", @")
31985160711SBram Moolenaar  normal! 15|yas
32085160711SBram Moolenaar  call assert_equal("A '([sentence.])'  ", @")
32185160711SBram Moolenaar
32285160711SBram Moolenaar  normal! 16|yis
32385160711SBram Moolenaar  call assert_equal("A '([sentence.])'", @")
32485160711SBram Moolenaar  normal! 16|yas
32585160711SBram Moolenaar  call assert_equal("A '([sentence.])'  ", @")
32685160711SBram Moolenaar
32785160711SBram Moolenaar  normal! 17|yis
32885160711SBram Moolenaar  call assert_equal("A '([sentence.])'", @")
32985160711SBram Moolenaar  normal! 17|yas
33085160711SBram Moolenaar  call assert_equal("A '([sentence.])'  ", @")
33185160711SBram Moolenaar
3322f03e5a0SBram Moolenaar  " don't get stuck on a quote at the start of a sentence
3332f03e5a0SBram Moolenaar  %delete _
3342f03e5a0SBram Moolenaar  call setline(1, ['A sentence.', '"A sentence"?', 'A sentence!'])
3352f03e5a0SBram Moolenaar  normal gg))
3362f03e5a0SBram Moolenaar  call assert_equal(3, getcurpos()[1])
3372f03e5a0SBram Moolenaar
3382f03e5a0SBram Moolenaar  %delete _
3392f03e5a0SBram Moolenaar  call setline(1, ['A sentence.', "'A sentence'?", 'A sentence!'])
3402f03e5a0SBram Moolenaar  normal gg))
3412f03e5a0SBram Moolenaar  call assert_equal(3, getcurpos()[1])
3422f03e5a0SBram Moolenaar
34385160711SBram Moolenaar  %delete _
34485160711SBram Moolenaarendfunc
345224a5f17SBram Moolenaar
346224a5f17SBram Moolenaar" Test for the paragraph (ap) text object
347224a5f17SBram Moolenaarfunc Test_paragraph()
348224a5f17SBram Moolenaar  new
349224a5f17SBram Moolenaar  call setline(1, ['First line.', 'Second line.', 'Third line.'])
350224a5f17SBram Moolenaar  call cursor(2, 1)
351224a5f17SBram Moolenaar  normal vapy
352224a5f17SBram Moolenaar  call assert_equal("First line.\nSecond line.\nThird line.\n", @")
353224a5f17SBram Moolenaar
354224a5f17SBram Moolenaar  call cursor(2, 1)
355224a5f17SBram Moolenaar  call assert_beeps('normal vapapy')
356224a5f17SBram Moolenaar
357224a5f17SBram Moolenaar  call setline(1, ['First line.', 'Second line.', '  ', ''])
358224a5f17SBram Moolenaar  call cursor(1, 1)
359224a5f17SBram Moolenaar  normal vapy
360224a5f17SBram Moolenaar  call assert_equal("First line.\nSecond line.\n  \n\n", @")
361224a5f17SBram Moolenaar
362224a5f17SBram Moolenaar  call setline(1, ['', '', '', 'First line.', 'Second line.'])
363224a5f17SBram Moolenaar  call cursor(2, 1)
364224a5f17SBram Moolenaar  normal yap
365224a5f17SBram Moolenaar  call assert_equal("\n\n\nFirst line.\nSecond line.\n", @")
366224a5f17SBram Moolenaar  call assert_beeps('normal 3yap')
367224a5f17SBram Moolenaar  exe "normal \<C-C>"
368224a5f17SBram Moolenaar
369224a5f17SBram Moolenaar  %d
370224a5f17SBram Moolenaar  call setline(1, ['  ', '  ', '  '])
371224a5f17SBram Moolenaar  call cursor(2, 1)
372224a5f17SBram Moolenaar  normal Vipy
373224a5f17SBram Moolenaar  call assert_equal("  \n  \n  \n", @")
374224a5f17SBram Moolenaar  call cursor(2, 1)
375224a5f17SBram Moolenaar  call assert_beeps("normal Vipip")
376224a5f17SBram Moolenaar  exe "normal \<C-C>"
377224a5f17SBram Moolenaar
378224a5f17SBram Moolenaar  close!
379224a5f17SBram Moolenaarendfunc
380224a5f17SBram Moolenaar
381224a5f17SBram Moolenaar" Tests for text object aw
382224a5f17SBram Moolenaarfunc Test_textobj_a_word()
383224a5f17SBram Moolenaar  new
384224a5f17SBram Moolenaar  call append(0, ['foobar,eins,foobar', 'foo,zwei,foo    '])
385224a5f17SBram Moolenaar  " diw
386224a5f17SBram Moolenaar  norm! 1gg0diw
387224a5f17SBram Moolenaar  call assert_equal([',eins,foobar', 'foo,zwei,foo    ', ''], getline(1,'$'))
388224a5f17SBram Moolenaar  " daw
389224a5f17SBram Moolenaar  norm! 2ggEdaw
390224a5f17SBram Moolenaar  call assert_equal([',eins,foobar', 'foo,zwei,', ''], getline(1, '$'))
391224a5f17SBram Moolenaar  " daw the last word in a line
392224a5f17SBram Moolenaar  call setline(1, ['foo bar', 'foo bar', ''])
393224a5f17SBram Moolenaar  call cursor(1, 5)
394224a5f17SBram Moolenaar  normal daw
395224a5f17SBram Moolenaar  call assert_equal('foo', getline(1))
396224a5f17SBram Moolenaar  " aw in visual mode
397224a5f17SBram Moolenaar  call cursor(2, 5)
398224a5f17SBram Moolenaar  normal! vawx
399224a5f17SBram Moolenaar  call assert_equal('foo', getline(2))
400224a5f17SBram Moolenaar  %d
401224a5f17SBram Moolenaar  call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo   "])
402224a5f17SBram Moolenaar  " diW
403224a5f17SBram Moolenaar  norm! 2ggwd2iW
404224a5f17SBram Moolenaar  call assert_equal(['foo	eins	foobar', 'foo	foo   ', ''], getline(1,'$'))
405224a5f17SBram Moolenaar  " daW
406224a5f17SBram Moolenaar  norm! 1ggd2aW
407224a5f17SBram Moolenaar  call assert_equal(['foobar', 'foo	foo   ', ''], getline(1,'$'))
408224a5f17SBram Moolenaar
409224a5f17SBram Moolenaar  %d
410224a5f17SBram Moolenaar  call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo   "])
411224a5f17SBram Moolenaar  " aw in visual line mode switches to characterwise mode
412224a5f17SBram Moolenaar  norm! 2gg$Vawd
413224a5f17SBram Moolenaar  call assert_equal(['foo	eins	foobar', 'foo	zwei	foo'], getline(1,'$'))
414224a5f17SBram Moolenaar  norm! 1gg$Viwd
415224a5f17SBram Moolenaar  call assert_equal(['foo	eins	', 'foo	zwei	foo'], getline(1,'$'))
416224a5f17SBram Moolenaar
417224a5f17SBram Moolenaar  " visually selecting a tab before a word with 'selection' set to 'exclusive'
418224a5f17SBram Moolenaar  set selection=exclusive
419224a5f17SBram Moolenaar  normal gg3lvlawy
420224a5f17SBram Moolenaar  call assert_equal("\teins", @")
421224a5f17SBram Moolenaar  " visually selecting a tab before a word with 'selection' set to 'inclusive'
422224a5f17SBram Moolenaar  set selection=inclusive
423224a5f17SBram Moolenaar  normal gg3lvlawy
424224a5f17SBram Moolenaar  call assert_equal("\teins\t", @")
425224a5f17SBram Moolenaar  set selection&
426224a5f17SBram Moolenaar
427224a5f17SBram Moolenaar  " selecting a word with no non-space characters in a buffer fails
428224a5f17SBram Moolenaar  %d
429224a5f17SBram Moolenaar  call setline(1, '    ')
430224a5f17SBram Moolenaar  call assert_beeps('normal 3lyaw')
431224a5f17SBram Moolenaar
432224a5f17SBram Moolenaar  " visually selecting words backwards with no more words to select
433224a5f17SBram Moolenaar  call setline(1, 'one two')
434224a5f17SBram Moolenaar  call assert_beeps('normal 2lvh2aw')
435224a5f17SBram Moolenaar  exe "normal \<C-C>"
436224a5f17SBram Moolenaar  call assert_beeps('normal $vh3aw')
437224a5f17SBram Moolenaar  exe "normal \<C-C>"
438224a5f17SBram Moolenaar  call setline(1, ['', 'one two'])
439224a5f17SBram Moolenaar  call assert_beeps('normal 2G2lvh3aw')
440224a5f17SBram Moolenaar  exe "normal \<C-C>"
441224a5f17SBram Moolenaar
442224a5f17SBram Moolenaar  " selecting words forward with no more words to select
443224a5f17SBram Moolenaar  %d
444224a5f17SBram Moolenaar  call setline(1, 'one a')
445224a5f17SBram Moolenaar  call assert_beeps('normal 0y3aw')
446224a5f17SBram Moolenaar  call setline(1, 'one two ')
447224a5f17SBram Moolenaar  call assert_beeps('normal 0y3aw')
448224a5f17SBram Moolenaar  call assert_beeps('normal 03ly2aw')
449224a5f17SBram Moolenaar
450224a5f17SBram Moolenaar  " clean up
451224a5f17SBram Moolenaar  bw!
452224a5f17SBram Moolenaarendfunc
453224a5f17SBram Moolenaar
454224a5f17SBram Moolenaar" Test for is and as text objects
455224a5f17SBram Moolenaarfunc Test_textobj_sentence()
456224a5f17SBram Moolenaar  new
457224a5f17SBram Moolenaar  call append(0, ['This is a test. With some sentences!', '',
458224a5f17SBram Moolenaar        \ 'Even with a question? And one more. And no sentence here'])
459224a5f17SBram Moolenaar  " Test for dis - does not remove trailing whitespace
460224a5f17SBram Moolenaar  norm! 1gg0dis
461224a5f17SBram Moolenaar  call assert_equal([' With some sentences!', '',
462224a5f17SBram Moolenaar        \ 'Even with a question? And one more. And no sentence here', ''],
463224a5f17SBram Moolenaar        \ getline(1,'$'))
464224a5f17SBram Moolenaar  " Test for das - removes leading whitespace
465224a5f17SBram Moolenaar  norm! 3ggf?ldas
466224a5f17SBram Moolenaar  call assert_equal([' With some sentences!', '',
467224a5f17SBram Moolenaar        \ 'Even with a question? And no sentence here', ''], getline(1,'$'))
468224a5f17SBram Moolenaar  " when used in visual mode, is made characterwise
469224a5f17SBram Moolenaar  norm! 3gg$Visy
470224a5f17SBram Moolenaar  call assert_equal('v', visualmode())
471224a5f17SBram Moolenaar  " reset visualmode()
472224a5f17SBram Moolenaar  norm! 3ggVy
473224a5f17SBram Moolenaar  norm! 3gg$Vasy
474224a5f17SBram Moolenaar  call assert_equal('v', visualmode())
475224a5f17SBram Moolenaar  " basic testing for textobjects a< and at
476224a5f17SBram Moolenaar  %d
477224a5f17SBram Moolenaar  call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>','    </div>', ' '])
478224a5f17SBram Moolenaar  " a<
479224a5f17SBram Moolenaar  norm! 1gg0da<
480224a5f17SBram Moolenaar  call assert_equal([' ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
481224a5f17SBram Moolenaar  norm! 1pj
482224a5f17SBram Moolenaar  call assert_equal([' <div>', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
483224a5f17SBram Moolenaar  " at
484224a5f17SBram Moolenaar  norm! d2at
485224a5f17SBram Moolenaar  call assert_equal([' '], getline(1,'$'))
486224a5f17SBram Moolenaar  %d
487224a5f17SBram Moolenaar  call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>','    </div>', ' '])
488224a5f17SBram Moolenaar  " i<
489224a5f17SBram Moolenaar  norm! 1gg0di<
490224a5f17SBram Moolenaar  call assert_equal(['<> ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
491224a5f17SBram Moolenaar  norm! 1Pj
492224a5f17SBram Moolenaar  call assert_equal(['<div> ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
493224a5f17SBram Moolenaar  norm! d2it
494224a5f17SBram Moolenaar  call assert_equal(['<div></div>',' '], getline(1,'$'))
495224a5f17SBram Moolenaar  " basic testing for a[ and i[ text object
496224a5f17SBram Moolenaar  %d
497224a5f17SBram Moolenaar  call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
498224a5f17SBram Moolenaar  norm! 3gg0di[
499224a5f17SBram Moolenaar  call assert_equal([' ', '[', ']'], getline(1,'$'))
500224a5f17SBram Moolenaar  call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
501224a5f17SBram Moolenaar  norm! 3gg0ftd2a[
502224a5f17SBram Moolenaar  call assert_equal([' '], getline(1,'$'))
503224a5f17SBram Moolenaar
504224a5f17SBram Moolenaar  " clean up
505224a5f17SBram Moolenaar  bw!
506224a5f17SBram Moolenaarendfunc
507224a5f17SBram Moolenaar
508224a5f17SBram Moolenaar" Test for quote (', " and `) textobjects
509224a5f17SBram Moolenaarfunc Test_textobj_quote()
510224a5f17SBram Moolenaar  new
511224a5f17SBram Moolenaar
512224a5f17SBram Moolenaar  " Test for i" when cursor is in front of a quoted object
513224a5f17SBram Moolenaar  call append(0, 'foo "bar"')
514224a5f17SBram Moolenaar  norm! 1gg0di"
515224a5f17SBram Moolenaar  call assert_equal(['foo ""', ''], getline(1,'$'))
516224a5f17SBram Moolenaar
517224a5f17SBram Moolenaar  " Test for visually selecting an inner quote
518224a5f17SBram Moolenaar  %d
519224a5f17SBram Moolenaar  " extend visual selection from one quote to the next
520224a5f17SBram Moolenaar  call setline(1, 'color "red" color "blue"')
521224a5f17SBram Moolenaar  call cursor(1, 7)
522224a5f17SBram Moolenaar  normal v4li"y
523224a5f17SBram Moolenaar  call assert_equal('"red" color "blue', @")
524224a5f17SBram Moolenaar
525224a5f17SBram Moolenaar  " try to extend visual selection from one quote to a non-existing quote
526224a5f17SBram Moolenaar  call setline(1, 'color "red" color blue')
527224a5f17SBram Moolenaar  call cursor(1, 7)
528224a5f17SBram Moolenaar  call feedkeys('v4li"y', 'xt')
529224a5f17SBram Moolenaar  call assert_equal('"red"', @")
530224a5f17SBram Moolenaar
531224a5f17SBram Moolenaar  " try to extend visual selection from one quote to a next partial quote
532224a5f17SBram Moolenaar  call setline(1, 'color "red" color "blue')
533224a5f17SBram Moolenaar  call cursor(1, 7)
534224a5f17SBram Moolenaar  normal v4li"y
535224a5f17SBram Moolenaar  call assert_equal('"red" color ', @")
536224a5f17SBram Moolenaar
537224a5f17SBram Moolenaar  " select a quote backwards in visual mode
538224a5f17SBram Moolenaar  call cursor(1, 12)
539224a5f17SBram Moolenaar  normal vhi"y
540224a5f17SBram Moolenaar  call assert_equal('red" ', @")
541224a5f17SBram Moolenaar  call assert_equal(8, col('.'))
542224a5f17SBram Moolenaar
543224a5f17SBram Moolenaar  " select a quote backwards in visual mode from outside the quote
544224a5f17SBram Moolenaar  call cursor(1, 17)
545224a5f17SBram Moolenaar  normal v2hi"y
546224a5f17SBram Moolenaar  call assert_equal('red', @")
547224a5f17SBram Moolenaar  call assert_equal(8, col('.'))
548224a5f17SBram Moolenaar
549224a5f17SBram Moolenaar  " visually selecting a quote with 'selection' set to 'exclusive'
550224a5f17SBram Moolenaar  call setline(1, 'He said "How are you?"')
551224a5f17SBram Moolenaar  set selection=exclusive
552224a5f17SBram Moolenaar  normal 012lv2li"y
553224a5f17SBram Moolenaar  call assert_equal('How are you?', @")
554224a5f17SBram Moolenaar  set selection&
555224a5f17SBram Moolenaar
556224a5f17SBram Moolenaar  " try copy a quote object with a single quote in the line
557224a5f17SBram Moolenaar  call setline(1, "Smith's car")
558224a5f17SBram Moolenaar  call cursor(1, 6)
559224a5f17SBram Moolenaar  call assert_beeps("normal yi'")
560224a5f17SBram Moolenaar  call assert_beeps("normal 2lyi'")
561224a5f17SBram Moolenaar
562224a5f17SBram Moolenaar  " selecting space before and after a quoted string
563224a5f17SBram Moolenaar  call setline(1, "some    'special'    string")
564224a5f17SBram Moolenaar  normal 0ya'
565224a5f17SBram Moolenaar  call assert_equal("'special'    ", @")
566224a5f17SBram Moolenaar  call setline(1, "some    'special'string")
567224a5f17SBram Moolenaar  normal 0ya'
568224a5f17SBram Moolenaar  call assert_equal("    'special'", @")
569224a5f17SBram Moolenaar
570*af631f61SDominique Pelle  " quoted string with odd or even number of backslashes.
571*af631f61SDominique Pelle  call setline(1, 'char *s = "foo\"bar"')
572*af631f61SDominique Pelle  normal $hhyi"
573*af631f61SDominique Pelle  call assert_equal('foo\"bar', @")
574*af631f61SDominique Pelle  call setline(1, 'char *s = "foo\\"bar"')
575*af631f61SDominique Pelle  normal $hhyi"
576*af631f61SDominique Pelle  call assert_equal('bar', @")
577*af631f61SDominique Pelle  call setline(1, 'char *s = "foo\\\"bar"')
578*af631f61SDominique Pelle  normal $hhyi"
579*af631f61SDominique Pelle  call assert_equal('foo\\\"bar', @")
580*af631f61SDominique Pelle  call setline(1, 'char *s = "foo\\\\"bar"')
581*af631f61SDominique Pelle  normal $hhyi"
582*af631f61SDominique Pelle  call assert_equal('bar', @")
583*af631f61SDominique Pelle
584224a5f17SBram Moolenaar  close!
585224a5f17SBram Moolenaarendfunc
586224a5f17SBram Moolenaar
587b9115da4SConnor Lane Smith" Test for i(, i<, etc. when cursor is in front of a block
588b9115da4SConnor Lane Smithfunc Test_textobj_find_paren_forward()
589b9115da4SConnor Lane Smith  new
590b9115da4SConnor Lane Smith
591b9115da4SConnor Lane Smith  " i< and a> when cursor is in front of a block
592b9115da4SConnor Lane Smith  call setline(1, '#include <foo.h>')
593b9115da4SConnor Lane Smith  normal 0yi<
594b9115da4SConnor Lane Smith  call assert_equal('foo.h', @")
595b9115da4SConnor Lane Smith  normal 0ya>
596b9115da4SConnor Lane Smith  call assert_equal('<foo.h>', @")
597b9115da4SConnor Lane Smith
598b9115da4SConnor Lane Smith  " 2i(, 3i( in front of a block enters second/third nested '('
599b9115da4SConnor Lane Smith  call setline(1, 'foo (bar (baz (quux)))')
600b9115da4SConnor Lane Smith  normal 0yi)
601b9115da4SConnor Lane Smith  call assert_equal('bar (baz (quux))', @")
602b9115da4SConnor Lane Smith  normal 02yi)
603b9115da4SConnor Lane Smith  call assert_equal('baz (quux)', @")
604b9115da4SConnor Lane Smith  normal 03yi)
605b9115da4SConnor Lane Smith  call assert_equal('quux', @")
606b9115da4SConnor Lane Smith
607b9115da4SConnor Lane Smith  " 3i( in front of a block doesn't enter third but un-nested '('
608b9115da4SConnor Lane Smith  call setline(1, 'foo (bar (baz) (quux))')
609b9115da4SConnor Lane Smith  normal 03di)
610b9115da4SConnor Lane Smith  call assert_equal('foo (bar (baz) (quux))', getline(1))
611b9115da4SConnor Lane Smith  normal 02di)
612b9115da4SConnor Lane Smith  call assert_equal('foo (bar () (quux))', getline(1))
613b9115da4SConnor Lane Smith  normal 0di)
614b9115da4SConnor Lane Smith  call assert_equal('foo ()', getline(1))
615b9115da4SConnor Lane Smith
616b9115da4SConnor Lane Smith  close!
617b9115da4SConnor Lane Smithendfunc
618b9115da4SConnor Lane Smith
619224a5f17SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
620