blob: 85c156ac7ace9b6d6c1b2ff40b4ced4683e188d7 [file] [log] [blame]
Bram Moolenaarf9660b52016-04-16 22:19:15 +02001" Test commands that jump somewhere.
2
Bram Moolenaar226630a2016-10-08 19:21:31 +02003" Create a new buffer using "lines" and place the cursor on the word after the
4" first occurrence of return and invoke "cmd". The cursor should now be
5" positioned at the given line and col.
6func XTest_goto_decl(cmd, lines, line, col)
Bram Moolenaarf9660b52016-04-16 22:19:15 +02007 new
Bram Moolenaar226630a2016-10-08 19:21:31 +02008 call setline(1, a:lines)
9 /return/
10 normal! W
11 execute 'norm! ' . a:cmd
12 call assert_equal(a:line, line('.'))
13 call assert_equal(a:col, col('.'))
Bram Moolenaarf9660b52016-04-16 22:19:15 +020014 quit!
15endfunc
Bram Moolenaar23c60f22016-06-15 22:03:48 +020016
Bram Moolenaar226630a2016-10-08 19:21:31 +020017func Test_gD()
Bram Moolenaarc79745a2019-05-20 22:12:34 +020018 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +020019 int x;
Bram Moolenaar94722c52023-01-28 19:19:03 +000020
Bram Moolenaare7eb9272019-06-24 00:58:07 +020021 int func(void)
22 {
23 return x;
24 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +020025 [CODE]
26
Bram Moolenaar226630a2016-10-08 19:21:31 +020027 call XTest_goto_decl('gD', lines, 1, 5)
28endfunc
29
30func Test_gD_too()
Bram Moolenaarc79745a2019-05-20 22:12:34 +020031 let lines =<< trim [CODE]
Bram Moolenaarc79745a2019-05-20 22:12:34 +020032 Filename x;
Bram Moolenaar94722c52023-01-28 19:19:03 +000033
Bram Moolenaare7eb9272019-06-24 00:58:07 +020034 int Filename
35 int func() {
36 Filename x;
37 return x;
Bram Moolenaarc79745a2019-05-20 22:12:34 +020038 [CODE]
39
Bram Moolenaar226630a2016-10-08 19:21:31 +020040 call XTest_goto_decl('gD', lines, 1, 10)
41endfunc
42
43func Test_gD_comment()
Bram Moolenaarc79745a2019-05-20 22:12:34 +020044 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +020045 /* int x; */
46 int x;
Bram Moolenaar94722c52023-01-28 19:19:03 +000047
Bram Moolenaare7eb9272019-06-24 00:58:07 +020048 int func(void)
49 {
50 return x;
51 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +020052 [CODE]
53
Bram Moolenaar226630a2016-10-08 19:21:31 +020054 call XTest_goto_decl('gD', lines, 2, 5)
55endfunc
56
57func Test_gD_inline_comment()
Bram Moolenaarc79745a2019-05-20 22:12:34 +020058 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +020059 int y /* , x */;
60 int x;
Bram Moolenaar94722c52023-01-28 19:19:03 +000061
Bram Moolenaare7eb9272019-06-24 00:58:07 +020062 int func(void)
63 {
64 return x;
65 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +020066 [CODE]
67
Bram Moolenaar226630a2016-10-08 19:21:31 +020068 call XTest_goto_decl('gD', lines, 2, 5)
69endfunc
70
71func Test_gD_string()
Bram Moolenaarc79745a2019-05-20 22:12:34 +020072 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +020073 char *s[] = "x";
74 int x = 1;
Bram Moolenaar94722c52023-01-28 19:19:03 +000075
Bram Moolenaare7eb9272019-06-24 00:58:07 +020076 int func(void)
77 {
78 return x;
79 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +020080 [CODE]
81
Bram Moolenaar226630a2016-10-08 19:21:31 +020082 call XTest_goto_decl('gD', lines, 2, 5)
83endfunc
84
85func Test_gD_string_same_line()
Bram Moolenaarc79745a2019-05-20 22:12:34 +020086 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +020087 char *s[] = "x", int x = 1;
Bram Moolenaar94722c52023-01-28 19:19:03 +000088
Bram Moolenaare7eb9272019-06-24 00:58:07 +020089 int func(void)
90 {
91 return x;
92 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +020093 [CODE]
94
Bram Moolenaar226630a2016-10-08 19:21:31 +020095 call XTest_goto_decl('gD', lines, 1, 22)
96endfunc
97
98func Test_gD_char()
Bram Moolenaarc79745a2019-05-20 22:12:34 +020099 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200100 char c = 'x';
101 int x = 1;
Bram Moolenaar94722c52023-01-28 19:19:03 +0000102
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200103 int func(void)
104 {
105 return x;
106 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200107 [CODE]
108
Bram Moolenaar226630a2016-10-08 19:21:31 +0200109 call XTest_goto_decl('gD', lines, 2, 5)
110endfunc
111
112func Test_gd()
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200113 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200114 int x;
Bram Moolenaar94722c52023-01-28 19:19:03 +0000115
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200116 int func(int x)
117 {
118 return x;
119 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200120 [CODE]
121
Bram Moolenaar226630a2016-10-08 19:21:31 +0200122 call XTest_goto_decl('gd', lines, 3, 14)
123endfunc
124
Bram Moolenaard1ad99b2020-10-04 16:16:54 +0200125" Using gd to jump to a declaration in a fold
126func Test_gd_with_fold()
127 new
128 let lines =<< trim END
129 #define ONE 1
130 #define TWO 2
131 #define THREE 3
132
133 TWO
134 END
135 call setline(1, lines)
136 1,3fold
137 call feedkeys('Ggd', 'xt')
138 call assert_equal(2, line('.'))
139 call assert_equal(-1, foldclosedend(2))
140 bw!
141endfunc
142
Bram Moolenaar226630a2016-10-08 19:21:31 +0200143func Test_gd_not_local()
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200144 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200145 int func1(void)
146 {
147 return x;
148 }
Bram Moolenaar94722c52023-01-28 19:19:03 +0000149
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200150 int func2(int x)
151 {
152 return x;
153 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200154 [CODE]
155
Bram Moolenaar226630a2016-10-08 19:21:31 +0200156 call XTest_goto_decl('gd', lines, 3, 10)
157endfunc
158
159func Test_gd_kr_style()
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200160 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200161 int func(x)
162 int x;
163 {
164 return x;
165 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200166 [CODE]
167
Bram Moolenaar226630a2016-10-08 19:21:31 +0200168 call XTest_goto_decl('gd', lines, 2, 7)
169endfunc
170
171func Test_gd_missing_braces()
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200172 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200173 def func1(a)
174 a + 1
175 end
Bram Moolenaar94722c52023-01-28 19:19:03 +0000176
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200177 a = 1
Bram Moolenaar94722c52023-01-28 19:19:03 +0000178
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200179 def func2()
180 return a
181 end
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200182 [CODE]
183
Bram Moolenaar226630a2016-10-08 19:21:31 +0200184 call XTest_goto_decl('gd', lines, 1, 11)
185endfunc
186
187func Test_gd_comment()
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200188 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200189 int func(void)
190 {
191 /* int x; */
192 int x;
193 return x;
194 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200195 [CODE]
196
Bram Moolenaar226630a2016-10-08 19:21:31 +0200197 call XTest_goto_decl('gd', lines, 4, 7)
198endfunc
199
200func Test_gd_comment_in_string()
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200201 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200202 int func(void)
203 {
204 char *s ="//"; int x;
205 int x;
206 return x;
207 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200208 [CODE]
209
Bram Moolenaar226630a2016-10-08 19:21:31 +0200210 call XTest_goto_decl('gd', lines, 3, 22)
211endfunc
212
213func Test_gd_string_in_comment()
214 set comments=
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200215 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200216 int func(void)
217 {
218 /* " */ int x;
219 int x;
220 return x;
221 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200222 [CODE]
223
Bram Moolenaar226630a2016-10-08 19:21:31 +0200224 call XTest_goto_decl('gd', lines, 3, 15)
225 set comments&
226endfunc
227
228func Test_gd_inline_comment()
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200229 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200230 int func(/* x is an int */ int x)
231 {
232 return x;
233 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200234 [CODE]
235
Bram Moolenaar226630a2016-10-08 19:21:31 +0200236 call XTest_goto_decl('gd', lines, 1, 32)
237endfunc
238
239func Test_gd_inline_comment_only()
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200240 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200241 int func(void) /* one lonely x */
242 {
243 return x;
244 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200245 [CODE]
246
Bram Moolenaar226630a2016-10-08 19:21:31 +0200247 call XTest_goto_decl('gd', lines, 3, 10)
248endfunc
249
250func Test_gd_inline_comment_body()
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200251 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200252 int func(void)
253 {
254 int y /* , x */;
Bram Moolenaar94722c52023-01-28 19:19:03 +0000255
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200256 for (/* int x = 0 */; y < 2; y++);
Bram Moolenaar94722c52023-01-28 19:19:03 +0000257
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200258 int x = 0;
Bram Moolenaar94722c52023-01-28 19:19:03 +0000259
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200260 return x;
261 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200262 [CODE]
263
Bram Moolenaar226630a2016-10-08 19:21:31 +0200264 call XTest_goto_decl('gd', lines, 7, 7)
265endfunc
266
267func Test_gd_trailing_multiline_comment()
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200268 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200269 int func(int x) /* x is an int */
270 {
271 return x;
272 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200273 [CODE]
274
Bram Moolenaar226630a2016-10-08 19:21:31 +0200275 call XTest_goto_decl('gd', lines, 1, 14)
276endfunc
277
278func Test_gd_trailing_comment()
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200279 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200280 int func(int x) // x is an int
281 {
282 return x;
283 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200284 [CODE]
285
Bram Moolenaar226630a2016-10-08 19:21:31 +0200286 call XTest_goto_decl('gd', lines, 1, 14)
287endfunc
288
289func Test_gd_string()
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200290 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200291 int func(void)
292 {
293 char *s = "x";
294 int x = 1;
Bram Moolenaar94722c52023-01-28 19:19:03 +0000295
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200296 return x;
297 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200298 [CODE]
Bram Moolenaar226630a2016-10-08 19:21:31 +0200299 call XTest_goto_decl('gd', lines, 4, 7)
300endfunc
301
302func Test_gd_string_only()
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200303 let lines =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200304 int func(void)
305 {
306 char *s = "x";
Bram Moolenaar94722c52023-01-28 19:19:03 +0000307
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200308 return x;
309 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200310 [CODE]
311
Bram Moolenaar226630a2016-10-08 19:21:31 +0200312 call XTest_goto_decl('gd', lines, 5, 10)
Bram Moolenaar23c60f22016-06-15 22:03:48 +0200313endfunc
Bram Moolenaara2477fd2016-12-03 15:13:20 +0100314
315" Check that setting 'cursorline' does not change curswant
316func Test_cursorline_keep_col()
317 new
318 call setline(1, ['long long long line', 'short line'])
319 normal ggfi
320 let pos = getcurpos()
321 normal j
322 set cursorline
323 normal k
324 call assert_equal(pos, getcurpos())
325 bwipe!
326 set nocursorline
327endfunc
328
Bram Moolenaar60402d62017-04-20 18:54:50 +0200329func Test_gd_local_block()
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200330 let lines =<< trim [CODE]
331 int main()
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200332 {
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200333 char *a = "NOT NULL";
334 if(a)
335 {
336 char *b = a;
337 printf("%s\n", b);
338 }
339 else
340 {
341 char *b = "NULL";
342 return b;
343 }
Bram Moolenaar94722c52023-01-28 19:19:03 +0000344
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200345 return 0;
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200346 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200347 [CODE]
348
Bram Moolenaar60402d62017-04-20 18:54:50 +0200349 call XTest_goto_decl('1gd', lines, 11, 11)
350endfunc
Bram Moolenaar6b69e5c2018-05-26 18:39:32 +0200351
352func Test_motion_if_elif_else_endif()
353 new
Bram Moolenaar224a5f12020-04-28 20:29:07 +0200354 let lines =<< trim END
355 /* Test pressing % on #if, #else #elsif and #endif,
356 * with nested #if
357 */
358 #if FOO
359 /* ... */
360 # if BAR
361 /* ... */
362 # endif
363 #elif BAR
364 /* ... */
365 #else
366 /* ... */
367 #endif
368
369 #define FOO 1
370 END
371 call setline(1, lines)
Bram Moolenaar6b69e5c2018-05-26 18:39:32 +0200372 /#if FOO
373 norm %
374 call assert_equal([9, 1], getpos('.')[1:2])
375 norm %
376 call assert_equal([11, 1], getpos('.')[1:2])
377 norm %
378 call assert_equal([13, 1], getpos('.')[1:2])
379 norm %
380 call assert_equal([4, 1], getpos('.')[1:2])
381 /# if BAR
382 norm $%
383 call assert_equal([8, 1], getpos('.')[1:2])
384 norm $%
385 call assert_equal([6, 1], getpos('.')[1:2])
386
Bram Moolenaar224a5f12020-04-28 20:29:07 +0200387 " Test for [# and ]# command
388 call cursor(5, 1)
389 normal [#
390 call assert_equal([4, 1], getpos('.')[1:2])
391 call cursor(5, 1)
392 normal ]#
393 call assert_equal([9, 1], getpos('.')[1:2])
394 call cursor(10, 1)
395 normal [#
396 call assert_equal([9, 1], getpos('.')[1:2])
397 call cursor(10, 1)
398 normal ]#
399 call assert_equal([11, 1], getpos('.')[1:2])
400
401 " Finding a match before the first line or after the last line should fail
402 normal gg
403 call assert_beeps('normal [#')
404 normal G
405 call assert_beeps('normal ]#')
406
407 " Finding a match for a macro definition (#define) should fail
408 normal G
409 call assert_beeps('normal %')
410
Bram Moolenaar6b69e5c2018-05-26 18:39:32 +0200411 bw!
412endfunc
413
414func Test_motion_c_comment()
415 new
416 a
417/*
418 * Test pressing % on beginning/end
419 * of C comments.
420 */
421/* Another comment */
422.
423 norm gg0%
424 call assert_equal([4, 3], getpos('.')[1:2])
425 norm %
426 call assert_equal([1, 1], getpos('.')[1:2])
427 norm gg0l%
428 call assert_equal([4, 3], getpos('.')[1:2])
429 norm h%
430 call assert_equal([1, 1], getpos('.')[1:2])
431
432 norm G^
433 norm %
434 call assert_equal([5, 21], getpos('.')[1:2])
435 norm %
436 call assert_equal([5, 1], getpos('.')[1:2])
437
438 bw!
439endfunc
Bram Moolenaar224a5f12020-04-28 20:29:07 +0200440
441" vim: shiftwidth=2 sts=2 expandtab