100b24be4SBram Moolenaar" Test for textobjects
200b24be4SBram Moolenaar
300b24be4SBram Moolenaarif !has('textobjects')
400b24be4SBram Moolenaar  finish
500b24be4SBram Moolenaarendif
600b24be4SBram Moolenaar
7c5e2b040SBram Moolenaarfunc CpoM(line, useM, expected)
800b24be4SBram Moolenaar  new
900b24be4SBram Moolenaar
1000b24be4SBram Moolenaar  if a:useM
1100b24be4SBram Moolenaar    set cpoptions+=M
1200b24be4SBram Moolenaar  else
1300b24be4SBram Moolenaar    set cpoptions-=M
1400b24be4SBram Moolenaar  endif
1500b24be4SBram Moolenaar
1600b24be4SBram Moolenaar  call setline(1, a:line)
1700b24be4SBram Moolenaar
1800b24be4SBram Moolenaar  call setreg('"', '')
1900b24be4SBram Moolenaar  normal! ggfrmavi)y
2000b24be4SBram Moolenaar  call assert_equal(getreg('"'), a:expected[0])
2100b24be4SBram Moolenaar
2200b24be4SBram Moolenaar  call setreg('"', '')
2300b24be4SBram Moolenaar  normal! `afbmavi)y
2400b24be4SBram Moolenaar  call assert_equal(getreg('"'), a:expected[1])
2500b24be4SBram Moolenaar
2600b24be4SBram Moolenaar  call setreg('"', '')
2700b24be4SBram Moolenaar  normal! `afgmavi)y
2800b24be4SBram Moolenaar  call assert_equal(getreg('"'), a:expected[2])
2900b24be4SBram Moolenaar
3000b24be4SBram Moolenaar  q!
31c5e2b040SBram Moolenaarendfunc
3200b24be4SBram Moolenaar
33c5e2b040SBram Moolenaarfunc Test_inner_block_without_cpo_M()
3400b24be4SBram Moolenaar  call CpoM('(red \(blue) green)', 0, ['red \(blue', 'red \(blue', ''])
35c5e2b040SBram Moolenaarendfunc
3600b24be4SBram Moolenaar
37c5e2b040SBram Moolenaarfunc Test_inner_block_with_cpo_M_left_backslash()
3800b24be4SBram Moolenaar  call CpoM('(red \(blue) green)', 1, ['red \(blue) green', 'blue', 'red \(blue) green'])
39c5e2b040SBram Moolenaarendfunc
4000b24be4SBram Moolenaar
41c5e2b040SBram Moolenaarfunc Test_inner_block_with_cpo_M_right_backslash()
4200b24be4SBram Moolenaar  call CpoM('(red (blue\) green)', 1, ['red (blue\) green', 'blue\', 'red (blue\) green'])
43c5e2b040SBram Moolenaarendfunc
44c5e2b040SBram Moolenaar
45c5e2b040SBram Moolenaarfunc Test_quote_selection_selection_exclusive()
46c5e2b040SBram Moolenaar  new
47c5e2b040SBram Moolenaar  call setline(1, "a 'bcde' f")
48c5e2b040SBram Moolenaar  set selection=exclusive
49c5e2b040SBram Moolenaar  exe "norm! fdvhi'y"
50c5e2b040SBram Moolenaar  call assert_equal('bcde', @")
51c5e2b040SBram Moolenaar  set selection&vim
52c5e2b040SBram Moolenaar  bw!
53c5e2b040SBram Moolenaarendfunc
54db510071SBram Moolenaar
55*55d3bdbbSBram Moolenaarfunc Test_quote_selection_selection_exclusive_abort()
56*55d3bdbbSBram Moolenaar  new
57*55d3bdbbSBram Moolenaar  set selection=exclusive
58*55d3bdbbSBram Moolenaar  call setline(1, "'abzzc'")
59*55d3bdbbSBram Moolenaar  let exp_curs = [0, 1, 6, 0]
60*55d3bdbbSBram Moolenaar  call cursor(1,1)
61*55d3bdbbSBram Moolenaar  exe 'norm! fcdvi"'
62*55d3bdbbSBram Moolenaar  " make sure to end visual mode to have a clear state
63*55d3bdbbSBram Moolenaar  exe "norm! \<esc>"
64*55d3bdbbSBram Moolenaar  call assert_equal(exp_curs, getpos('.'))
65*55d3bdbbSBram Moolenaar  call cursor(1,1)
66*55d3bdbbSBram Moolenaar  exe 'norm! fcvi"'
67*55d3bdbbSBram Moolenaar  exe "norm! \<esc>"
68*55d3bdbbSBram Moolenaar  call assert_equal(exp_curs, getpos('.'))
69*55d3bdbbSBram Moolenaar  call cursor(1,2)
70*55d3bdbbSBram Moolenaar  exe 'norm! vfcoi"'
71*55d3bdbbSBram Moolenaar  exe "norm! \<esc>"
72*55d3bdbbSBram Moolenaar  let exp_curs = [0, 1, 2, 0]
73*55d3bdbbSBram Moolenaar  let exp_visu = [0, 1, 7, 0]
74*55d3bdbbSBram Moolenaar  call assert_equal(exp_curs, getpos('.'))
75*55d3bdbbSBram Moolenaar  call assert_equal(exp_visu, getpos("'>"))
76*55d3bdbbSBram Moolenaar  set selection&vim
77*55d3bdbbSBram Moolenaar  bw!
78*55d3bdbbSBram Moolenaarendfunc
79*55d3bdbbSBram Moolenaar
80db510071SBram Moolenaar" Tests for string and html text objects
81db510071SBram Moolenaarfunc Test_string_html_objects()
82db510071SBram Moolenaar  enew!
83db510071SBram Moolenaar
84db510071SBram Moolenaar  let t = '"wo\"rd\\" foo'
85db510071SBram Moolenaar  put =t
86db510071SBram Moolenaar  normal! da"
87db510071SBram Moolenaar  call assert_equal('foo', getline('.'))
88db510071SBram Moolenaar
89db510071SBram Moolenaar  let t = "'foo' 'bar' 'piep'"
90db510071SBram Moolenaar  put =t
91db510071SBram Moolenaar  normal! 0va'a'rx
92db510071SBram Moolenaar  call assert_equal("xxxxxxxxxxxx'piep'", getline('.'))
93db510071SBram Moolenaar
94db510071SBram Moolenaar  let t = "bla bla `quote` blah"
95db510071SBram Moolenaar  put =t
96db510071SBram Moolenaar  normal! 02f`da`
97db510071SBram Moolenaar  call assert_equal("bla bla blah", getline('.'))
98db510071SBram Moolenaar
99db510071SBram Moolenaar  let t = 'out " in "noXno"'
100db510071SBram Moolenaar  put =t
101db510071SBram Moolenaar  normal! 0fXdi"
102db510071SBram Moolenaar  call assert_equal('out " in ""', getline('.'))
103db510071SBram Moolenaar
104db510071SBram Moolenaar  let t = "\"'\" 'blah' rep 'buh'"
105db510071SBram Moolenaar  put =t
106db510071SBram Moolenaar  normal! 03f'vi'ry
107db510071SBram Moolenaar  call assert_equal("\"'\" 'blah'yyyyy'buh'", getline('.'))
108db510071SBram Moolenaar
109db510071SBram Moolenaar  set quoteescape=+*-
110db510071SBram Moolenaar  let t = "bla `s*`d-`+++`l**` b`la"
111db510071SBram Moolenaar  put =t
112db510071SBram Moolenaar  normal! di`
113db510071SBram Moolenaar  call assert_equal("bla `` b`la", getline('.'))
114db510071SBram Moolenaar
115db510071SBram Moolenaar  let t = 'voo "nah" sdf " asdf" sdf " sdf" sd'
116db510071SBram Moolenaar  put =t
117db510071SBram Moolenaar  normal! $F"va"oha"i"rz
118db510071SBram Moolenaar  call assert_equal('voo "zzzzzzzzzzzzzzzzzzzzzzzzzzzzsd', getline('.'))
119db510071SBram Moolenaar
120db510071SBram Moolenaar  let t = "-<b>asdf<i>Xasdf</i>asdf</b>-"
121db510071SBram Moolenaar  put =t
122db510071SBram Moolenaar  normal! fXdit
123db510071SBram Moolenaar  call assert_equal('-<b>asdf<i></i>asdf</b>-', getline('.'))
124db510071SBram Moolenaar
125db510071SBram Moolenaar  let t = "-<b>asdX<i>a<i />sdf</i>asdf</b>-"
126db510071SBram Moolenaar  put =t
127db510071SBram Moolenaar  normal! 0fXdit
128db510071SBram Moolenaar  call assert_equal('-<b></b>-', getline('.'))
129db510071SBram Moolenaar
130db510071SBram Moolenaar  let t = "-<b>asdf<i>Xasdf</i>asdf</b>-"
131db510071SBram Moolenaar  put =t
132db510071SBram Moolenaar  normal! fXdat
133db510071SBram Moolenaar  call assert_equal('-<b>asdfasdf</b>-', getline('.'))
134db510071SBram Moolenaar
135db510071SBram Moolenaar  let t = "-<b>asdX<i>as<b />df</i>asdf</b>-"
136db510071SBram Moolenaar  put =t
137db510071SBram Moolenaar  normal! 0fXdat
138db510071SBram Moolenaar  call assert_equal('--', getline('.'))
139db510071SBram Moolenaar
140db510071SBram Moolenaar  let t = "-<b>\ninnertext object\n</b>"
141db510071SBram Moolenaar  put =t
142db510071SBram Moolenaar  normal! dit
143db510071SBram Moolenaar  call assert_equal('-<b></b>', getline('.'))
144db510071SBram Moolenaar
145db510071SBram Moolenaar  set quoteescape&
146db510071SBram Moolenaar  enew!
147db510071SBram Moolenaarendfunc
148db510071SBram Moolenaar
149b476cb7dSBram Moolenaarfunc Test_empty_html_tag()
150b476cb7dSBram Moolenaar  new
151b476cb7dSBram Moolenaar  call setline(1, '<div></div>')
152b476cb7dSBram Moolenaar  normal 0citxxx
153b476cb7dSBram Moolenaar  call assert_equal('<div>xxx</div>', getline(1))
154b476cb7dSBram Moolenaar
155b476cb7dSBram Moolenaar  call setline(1, '<div></div>')
156b476cb7dSBram Moolenaar  normal 0f<cityyy
157b476cb7dSBram Moolenaar  call assert_equal('<div>yyy</div>', getline(1))
158b476cb7dSBram Moolenaar
159b476cb7dSBram Moolenaar  call setline(1, '<div></div>')
160b476cb7dSBram Moolenaar  normal 0f<vitsaaa
161b476cb7dSBram Moolenaar  call assert_equal('aaa', getline(1))
162b476cb7dSBram Moolenaar
163b476cb7dSBram Moolenaar  bwipe!
164b476cb7dSBram Moolenaarendfunc
165b476cb7dSBram Moolenaar
166db510071SBram Moolenaar" Tests for match() and matchstr()
167db510071SBram Moolenaarfunc Test_match()
168db510071SBram Moolenaar  call assert_equal("b", matchstr("abcd", ".", 0, 2))
169db510071SBram Moolenaar  call assert_equal("bc", matchstr("abcd", "..", 0, 2))
170db510071SBram Moolenaar  call assert_equal("c", matchstr("abcd", ".", 2, 0))
171db510071SBram Moolenaar  call assert_equal("a", matchstr("abcd", ".", 0, -1))
172db510071SBram Moolenaar  call assert_equal(-1, match("abcd", ".", 0, 5))
173db510071SBram Moolenaar  call assert_equal(0 , match("abcd", ".", 0, -1))
174db510071SBram Moolenaar  call assert_equal(0 , match('abc', '.', 0, 1))
175db510071SBram Moolenaar  call assert_equal(1 , match('abc', '.', 0, 2))
176db510071SBram Moolenaar  call assert_equal(2 , match('abc', '.', 0, 3))
177db510071SBram Moolenaar  call assert_equal(-1, match('abc', '.', 0, 4))
178db510071SBram Moolenaar  call assert_equal(1 , match('abc', '.', 1, 1))
179db510071SBram Moolenaar  call assert_equal(2 , match('abc', '.', 2, 1))
180db510071SBram Moolenaar  call assert_equal(-1, match('abc', '.', 3, 1))
181db510071SBram Moolenaar  call assert_equal(3 , match('abc', '$', 0, 1))
182db510071SBram Moolenaar  call assert_equal(-1, match('abc', '$', 0, 2))
183db510071SBram Moolenaar  call assert_equal(3 , match('abc', '$', 1, 1))
184db510071SBram Moolenaar  call assert_equal(3 , match('abc', '$', 2, 1))
185db510071SBram Moolenaar  call assert_equal(3 , match('abc', '$', 3, 1))
186db510071SBram Moolenaar  call assert_equal(-1, match('abc', '$', 4, 1))
187db510071SBram Moolenaar  call assert_equal(0 , match('abc', '\zs', 0, 1))
188db510071SBram Moolenaar  call assert_equal(1 , match('abc', '\zs', 0, 2))
189db510071SBram Moolenaar  call assert_equal(2 , match('abc', '\zs', 0, 3))
190db510071SBram Moolenaar  call assert_equal(3 , match('abc', '\zs', 0, 4))
191db510071SBram Moolenaar  call assert_equal(-1, match('abc', '\zs', 0, 5))
192db510071SBram Moolenaar  call assert_equal(1 , match('abc', '\zs', 1, 1))
193db510071SBram Moolenaar  call assert_equal(2 , match('abc', '\zs', 2, 1))
194db510071SBram Moolenaar  call assert_equal(3 , match('abc', '\zs', 3, 1))
195db510071SBram Moolenaar  call assert_equal(-1, match('abc', '\zs', 4, 1))
196db510071SBram Moolenaarendfunc
19782846a00SBram Moolenaar
19882846a00SBram Moolenaar" This was causing an illegal memory access
19982846a00SBram Moolenaarfunc Test_inner_tag()
20082846a00SBram Moolenaar  new
20182846a00SBram Moolenaar  norm ixxx
20282846a00SBram Moolenaar  call feedkeys("v", 'xt')
20382846a00SBram Moolenaar  insert
20482846a00SBram Moolenaarx
20582846a00SBram Moolenaarx
20682846a00SBram Moolenaar.
20782846a00SBram Moolenaar  norm it
20882846a00SBram Moolenaar  q!
20982846a00SBram Moolenaarendfunc
21085160711SBram Moolenaar
21185160711SBram Moolenaarfunc Test_sentence()
21285160711SBram Moolenaar  enew!
21385160711SBram Moolenaar  call setline(1, 'A sentence.  A sentence?  A sentence!')
21485160711SBram Moolenaar
21585160711SBram Moolenaar  normal yis
21685160711SBram Moolenaar  call assert_equal('A sentence.', @")
21785160711SBram Moolenaar  normal yas
21885160711SBram Moolenaar  call assert_equal('A sentence.  ', @")
21985160711SBram Moolenaar
22085160711SBram Moolenaar  normal )
22185160711SBram Moolenaar
22285160711SBram Moolenaar  normal yis
22385160711SBram Moolenaar  call assert_equal('A sentence?', @")
22485160711SBram Moolenaar  normal yas
22585160711SBram Moolenaar  call assert_equal('A sentence?  ', @")
22685160711SBram Moolenaar
22785160711SBram Moolenaar  normal )
22885160711SBram Moolenaar
22985160711SBram Moolenaar  normal yis
23085160711SBram Moolenaar  call assert_equal('A sentence!', @")
23185160711SBram Moolenaar  normal yas
23285160711SBram Moolenaar  call assert_equal('  A sentence!', @")
23385160711SBram Moolenaar
23485160711SBram Moolenaar  normal 0
23585160711SBram Moolenaar  normal 2yis
23685160711SBram Moolenaar  call assert_equal('A sentence.  ', @")
23785160711SBram Moolenaar  normal 3yis
23885160711SBram Moolenaar  call assert_equal('A sentence.  A sentence?', @")
23985160711SBram Moolenaar  normal 2yas
24085160711SBram Moolenaar  call assert_equal('A sentence.  A sentence?  ', @")
24185160711SBram Moolenaar
24285160711SBram Moolenaar  %delete _
24385160711SBram Moolenaarendfunc
24485160711SBram Moolenaar
24585160711SBram Moolenaarfunc Test_sentence_with_quotes()
24685160711SBram Moolenaar  enew!
24785160711SBram Moolenaar  call setline(1, 'A "sentence."  A sentence.')
24885160711SBram Moolenaar
24985160711SBram Moolenaar  normal yis
25085160711SBram Moolenaar  call assert_equal('A "sentence."', @")
25185160711SBram Moolenaar  normal yas
25285160711SBram Moolenaar  call assert_equal('A "sentence."  ', @")
25385160711SBram Moolenaar
25485160711SBram Moolenaar  normal )
25585160711SBram Moolenaar
25685160711SBram Moolenaar  normal yis
25785160711SBram Moolenaar  call assert_equal('A sentence.', @")
25885160711SBram Moolenaar  normal yas
25985160711SBram Moolenaar  call assert_equal('  A sentence.', @")
26085160711SBram Moolenaar
26185160711SBram Moolenaar  %delete _
26285160711SBram Moolenaarendfunc
26385160711SBram Moolenaar
2641e115360SBram Moolenaarfunc Test_sentence_with_cursor_on_delimiter()
26585160711SBram Moolenaar  enew!
26685160711SBram Moolenaar  call setline(1, "A '([sentence.])'  A sentence.")
26785160711SBram Moolenaar
26885160711SBram Moolenaar  normal! 15|yis
26985160711SBram Moolenaar  call assert_equal("A '([sentence.])'", @")
27085160711SBram Moolenaar  normal! 15|yas
27185160711SBram Moolenaar  call assert_equal("A '([sentence.])'  ", @")
27285160711SBram Moolenaar
27385160711SBram Moolenaar  normal! 16|yis
27485160711SBram Moolenaar  call assert_equal("A '([sentence.])'", @")
27585160711SBram Moolenaar  normal! 16|yas
27685160711SBram Moolenaar  call assert_equal("A '([sentence.])'  ", @")
27785160711SBram Moolenaar
27885160711SBram Moolenaar  normal! 17|yis
27985160711SBram Moolenaar  call assert_equal("A '([sentence.])'", @")
28085160711SBram Moolenaar  normal! 17|yas
28185160711SBram Moolenaar  call assert_equal("A '([sentence.])'  ", @")
28285160711SBram Moolenaar
28385160711SBram Moolenaar  %delete _
28485160711SBram Moolenaarendfunc
285