blob: 5366a35fbae1b488006e5a5c1b76e725f04007bd [file] [log] [blame]
Bram Moolenaar00b24be2016-07-23 22:04:47 +02001" Test for textobjects
2
3if !has('textobjects')
Bram Moolenaarb0f94c12019-06-13 22:19:53 +02004 throw 'Skipped, textobjects feature missing'
Bram Moolenaar00b24be2016-07-23 22:04:47 +02005endif
6
Bram Moolenaarc5e2b042017-06-05 16:37:07 +02007func CpoM(line, useM, expected)
Bram Moolenaar00b24be2016-07-23 22:04:47 +02008 new
9
10 if a:useM
11 set cpoptions+=M
12 else
13 set cpoptions-=M
14 endif
15
16 call setline(1, a:line)
17
18 call setreg('"', '')
19 normal! ggfrmavi)y
20 call assert_equal(getreg('"'), a:expected[0])
21
22 call setreg('"', '')
23 normal! `afbmavi)y
24 call assert_equal(getreg('"'), a:expected[1])
25
26 call setreg('"', '')
27 normal! `afgmavi)y
28 call assert_equal(getreg('"'), a:expected[2])
29
30 q!
Bram Moolenaarc5e2b042017-06-05 16:37:07 +020031endfunc
Bram Moolenaar00b24be2016-07-23 22:04:47 +020032
Bram Moolenaarc5e2b042017-06-05 16:37:07 +020033func Test_inner_block_without_cpo_M()
Bram Moolenaar00b24be2016-07-23 22:04:47 +020034 call CpoM('(red \(blue) green)', 0, ['red \(blue', 'red \(blue', ''])
Bram Moolenaarc5e2b042017-06-05 16:37:07 +020035endfunc
Bram Moolenaar00b24be2016-07-23 22:04:47 +020036
Bram Moolenaarc5e2b042017-06-05 16:37:07 +020037func Test_inner_block_with_cpo_M_left_backslash()
Bram Moolenaar00b24be2016-07-23 22:04:47 +020038 call CpoM('(red \(blue) green)', 1, ['red \(blue) green', 'blue', 'red \(blue) green'])
Bram Moolenaarc5e2b042017-06-05 16:37:07 +020039endfunc
Bram Moolenaar00b24be2016-07-23 22:04:47 +020040
Bram Moolenaarc5e2b042017-06-05 16:37:07 +020041func Test_inner_block_with_cpo_M_right_backslash()
Bram Moolenaar00b24be2016-07-23 22:04:47 +020042 call CpoM('(red (blue\) green)', 1, ['red (blue\) green', 'blue\', 'red (blue\) green'])
Bram Moolenaarc5e2b042017-06-05 16:37:07 +020043endfunc
44
45func Test_quote_selection_selection_exclusive()
46 new
47 call setline(1, "a 'bcde' f")
48 set selection=exclusive
49 exe "norm! fdvhi'y"
50 call assert_equal('bcde', @")
51 set selection&vim
52 bw!
53endfunc
Bram Moolenaardb510072017-09-28 21:52:17 +020054
Bram Moolenaar55d3bdb2019-02-22 15:04:17 +010055func Test_quote_selection_selection_exclusive_abort()
56 new
57 set selection=exclusive
58 call setline(1, "'abzzc'")
59 let exp_curs = [0, 1, 6, 0]
60 call cursor(1,1)
61 exe 'norm! fcdvi"'
62 " make sure to end visual mode to have a clear state
63 exe "norm! \<esc>"
64 call assert_equal(exp_curs, getpos('.'))
65 call cursor(1,1)
66 exe 'norm! fcvi"'
67 exe "norm! \<esc>"
68 call assert_equal(exp_curs, getpos('.'))
69 call cursor(1,2)
70 exe 'norm! vfcoi"'
71 exe "norm! \<esc>"
72 let exp_curs = [0, 1, 2, 0]
73 let exp_visu = [0, 1, 7, 0]
74 call assert_equal(exp_curs, getpos('.'))
75 call assert_equal(exp_visu, getpos("'>"))
76 set selection&vim
77 bw!
78endfunc
79
Bram Moolenaardb510072017-09-28 21:52:17 +020080" Tests for string and html text objects
81func Test_string_html_objects()
82 enew!
83
84 let t = '"wo\"rd\\" foo'
85 put =t
86 normal! da"
87 call assert_equal('foo', getline('.'))
88
89 let t = "'foo' 'bar' 'piep'"
90 put =t
91 normal! 0va'a'rx
92 call assert_equal("xxxxxxxxxxxx'piep'", getline('.'))
93
94 let t = "bla bla `quote` blah"
95 put =t
96 normal! 02f`da`
97 call assert_equal("bla bla blah", getline('.'))
98
99 let t = 'out " in "noXno"'
100 put =t
101 normal! 0fXdi"
102 call assert_equal('out " in ""', getline('.'))
103
104 let t = "\"'\" 'blah' rep 'buh'"
105 put =t
106 normal! 03f'vi'ry
107 call assert_equal("\"'\" 'blah'yyyyy'buh'", getline('.'))
108
109 set quoteescape=+*-
110 let t = "bla `s*`d-`+++`l**` b`la"
111 put =t
112 normal! di`
113 call assert_equal("bla `` b`la", getline('.'))
114
115 let t = 'voo "nah" sdf " asdf" sdf " sdf" sd'
116 put =t
117 normal! $F"va"oha"i"rz
118 call assert_equal('voo "zzzzzzzzzzzzzzzzzzzzzzzzzzzzsd', getline('.'))
119
120 let t = "-<b>asdf<i>Xasdf</i>asdf</b>-"
121 put =t
122 normal! fXdit
123 call assert_equal('-<b>asdf<i></i>asdf</b>-', getline('.'))
124
125 let t = "-<b>asdX<i>a<i />sdf</i>asdf</b>-"
126 put =t
127 normal! 0fXdit
128 call assert_equal('-<b></b>-', getline('.'))
129
130 let t = "-<b>asdf<i>Xasdf</i>asdf</b>-"
131 put =t
132 normal! fXdat
133 call assert_equal('-<b>asdfasdf</b>-', getline('.'))
134
135 let t = "-<b>asdX<i>as<b />df</i>asdf</b>-"
136 put =t
137 normal! 0fXdat
138 call assert_equal('--', getline('.'))
139
140 let t = "-<b>\ninnertext object\n</b>"
141 put =t
142 normal! dit
143 call assert_equal('-<b></b>', getline('.'))
144
145 set quoteescape&
146 enew!
147endfunc
148
Bram Moolenaarb476cb72018-08-16 21:37:50 +0200149func Test_empty_html_tag()
150 new
151 call setline(1, '<div></div>')
152 normal 0citxxx
153 call assert_equal('<div>xxx</div>', getline(1))
154
155 call setline(1, '<div></div>')
156 normal 0f<cityyy
157 call assert_equal('<div>yyy</div>', getline(1))
158
159 call setline(1, '<div></div>')
160 normal 0f<vitsaaa
161 call assert_equal('aaa', getline(1))
162
163 bwipe!
164endfunc
165
Bram Moolenaardb510072017-09-28 21:52:17 +0200166" Tests for match() and matchstr()
167func Test_match()
168 call assert_equal("b", matchstr("abcd", ".", 0, 2))
169 call assert_equal("bc", matchstr("abcd", "..", 0, 2))
170 call assert_equal("c", matchstr("abcd", ".", 2, 0))
171 call assert_equal("a", matchstr("abcd", ".", 0, -1))
172 call assert_equal(-1, match("abcd", ".", 0, 5))
173 call assert_equal(0 , match("abcd", ".", 0, -1))
174 call assert_equal(0 , match('abc', '.', 0, 1))
175 call assert_equal(1 , match('abc', '.', 0, 2))
176 call assert_equal(2 , match('abc', '.', 0, 3))
177 call assert_equal(-1, match('abc', '.', 0, 4))
178 call assert_equal(1 , match('abc', '.', 1, 1))
179 call assert_equal(2 , match('abc', '.', 2, 1))
180 call assert_equal(-1, match('abc', '.', 3, 1))
181 call assert_equal(3 , match('abc', '$', 0, 1))
182 call assert_equal(-1, match('abc', '$', 0, 2))
183 call assert_equal(3 , match('abc', '$', 1, 1))
184 call assert_equal(3 , match('abc', '$', 2, 1))
185 call assert_equal(3 , match('abc', '$', 3, 1))
186 call assert_equal(-1, match('abc', '$', 4, 1))
187 call assert_equal(0 , match('abc', '\zs', 0, 1))
188 call assert_equal(1 , match('abc', '\zs', 0, 2))
189 call assert_equal(2 , match('abc', '\zs', 0, 3))
190 call assert_equal(3 , match('abc', '\zs', 0, 4))
191 call assert_equal(-1, match('abc', '\zs', 0, 5))
192 call assert_equal(1 , match('abc', '\zs', 1, 1))
193 call assert_equal(2 , match('abc', '\zs', 2, 1))
194 call assert_equal(3 , match('abc', '\zs', 3, 1))
195 call assert_equal(-1, match('abc', '\zs', 4, 1))
196endfunc
Bram Moolenaar82846a02018-02-09 18:09:54 +0100197
198" This was causing an illegal memory access
199func Test_inner_tag()
200 new
201 norm ixxx
202 call feedkeys("v", 'xt')
203 insert
204x
205x
206.
207 norm it
208 q!
209endfunc
Bram Moolenaar85160712018-06-19 18:27:41 +0200210
211func Test_sentence()
212 enew!
213 call setline(1, 'A sentence. A sentence? A sentence!')
214
215 normal yis
216 call assert_equal('A sentence.', @")
217 normal yas
218 call assert_equal('A sentence. ', @")
219
220 normal )
221
222 normal yis
223 call assert_equal('A sentence?', @")
224 normal yas
225 call assert_equal('A sentence? ', @")
226
227 normal )
228
229 normal yis
230 call assert_equal('A sentence!', @")
231 normal yas
232 call assert_equal(' A sentence!', @")
233
234 normal 0
235 normal 2yis
236 call assert_equal('A sentence. ', @")
237 normal 3yis
238 call assert_equal('A sentence. A sentence?', @")
239 normal 2yas
240 call assert_equal('A sentence. A sentence? ', @")
241
242 %delete _
243endfunc
244
245func Test_sentence_with_quotes()
246 enew!
247 call setline(1, 'A "sentence." A sentence.')
248
249 normal yis
250 call assert_equal('A "sentence."', @")
251 normal yas
252 call assert_equal('A "sentence." ', @")
253
254 normal )
255
256 normal yis
257 call assert_equal('A sentence.', @")
258 normal yas
259 call assert_equal(' A sentence.', @")
260
261 %delete _
262endfunc
263
Bram Moolenaar1e115362019-01-09 23:01:02 +0100264func Test_sentence_with_cursor_on_delimiter()
Bram Moolenaar85160712018-06-19 18:27:41 +0200265 enew!
266 call setline(1, "A '([sentence.])' A sentence.")
267
268 normal! 15|yis
269 call assert_equal("A '([sentence.])'", @")
270 normal! 15|yas
271 call assert_equal("A '([sentence.])' ", @")
272
273 normal! 16|yis
274 call assert_equal("A '([sentence.])'", @")
275 normal! 16|yas
276 call assert_equal("A '([sentence.])' ", @")
277
278 normal! 17|yis
279 call assert_equal("A '([sentence.])'", @")
280 normal! 17|yas
281 call assert_equal("A '([sentence.])' ", @")
282
283 %delete _
284endfunc