xref: /vim-8.2.3635/src/testdir/test_goto.vim (revision 12ee7ff0)
1" Test commands that jump somewhere.
2
3" 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)
7  new
8  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('.'))
14  quit!
15endfunc
16
17func Test_gD()
18  let lines =<< trim [CODE]
19  int x;
20
21  int func(void)
22  {
23    return x;
24  }
25  [CODE]
26
27  call XTest_goto_decl('gD', lines, 1, 5)
28endfunc
29
30func Test_gD_too()
31  let lines =<< trim [CODE]
32  Filename x;
33
34  int Filename
35  int func() {
36    Filename x;
37    return x;
38  [CODE]
39
40  call XTest_goto_decl('gD', lines, 1, 10)
41endfunc
42
43func Test_gD_comment()
44  let lines =<< trim [CODE]
45  /* int x; */
46  int x;
47
48  int func(void)
49  {
50    return x;
51  }
52  [CODE]
53
54  call XTest_goto_decl('gD', lines, 2, 5)
55endfunc
56
57func Test_gD_inline_comment()
58  let lines =<< trim [CODE]
59  int y /* , x */;
60  int x;
61
62  int func(void)
63  {
64    return x;
65  }
66  [CODE]
67
68  call XTest_goto_decl('gD', lines, 2, 5)
69endfunc
70
71func Test_gD_string()
72  let lines =<< trim [CODE]
73  char *s[] = "x";
74  int x = 1;
75
76  int func(void)
77  {
78    return x;
79  }
80  [CODE]
81
82  call XTest_goto_decl('gD', lines, 2, 5)
83endfunc
84
85func Test_gD_string_same_line()
86  let lines =<< trim [CODE]
87  char *s[] = "x", int x = 1;
88
89  int func(void)
90  {
91    return x;
92  }
93  [CODE]
94
95  call XTest_goto_decl('gD', lines, 1, 22)
96endfunc
97
98func Test_gD_char()
99  let lines =<< trim [CODE]
100  char c = 'x';
101  int x = 1;
102
103  int func(void)
104  {
105    return x;
106  }
107  [CODE]
108
109  call XTest_goto_decl('gD', lines, 2, 5)
110endfunc
111
112func Test_gd()
113  let lines =<< trim [CODE]
114  int x;
115
116  int func(int x)
117  {
118    return x;
119  }
120  [CODE]
121
122  call XTest_goto_decl('gd', lines, 3, 14)
123endfunc
124
125func Test_gd_not_local()
126  let lines =<< trim [CODE]
127  int func1(void)
128  {
129    return x;
130  }
131
132  int func2(int x)
133  {
134    return x;
135  }
136  [CODE]
137
138  call XTest_goto_decl('gd', lines, 3, 10)
139endfunc
140
141func Test_gd_kr_style()
142  let lines =<< trim [CODE]
143  int func(x)
144    int x;
145  {
146    return x;
147  }
148  [CODE]
149
150  call XTest_goto_decl('gd', lines, 2, 7)
151endfunc
152
153func Test_gd_missing_braces()
154  let lines =<< trim [CODE]
155  def func1(a)
156    a + 1
157  end
158
159  a = 1
160
161  def func2()
162    return a
163  end
164  [CODE]
165
166  call XTest_goto_decl('gd', lines, 1, 11)
167endfunc
168
169func Test_gd_comment()
170  let lines =<< trim [CODE]
171  int func(void)
172  {
173    /* int x; */
174    int x;
175    return x;
176  }
177  [CODE]
178
179  call XTest_goto_decl('gd', lines, 4, 7)
180endfunc
181
182func Test_gd_comment_in_string()
183  let lines =<< trim [CODE]
184  int func(void)
185  {
186    char *s ="//"; int x;
187    int x;
188    return x;
189  }
190  [CODE]
191
192  call XTest_goto_decl('gd', lines, 3, 22)
193endfunc
194
195func Test_gd_string_in_comment()
196  set comments=
197  let lines =<< trim [CODE]
198  int func(void)
199  {
200    /* " */ int x;
201    int x;
202    return x;
203  }
204  [CODE]
205
206  call XTest_goto_decl('gd', lines, 3, 15)
207  set comments&
208endfunc
209
210func Test_gd_inline_comment()
211  let lines =<< trim [CODE]
212  int func(/* x is an int */ int x)
213  {
214    return x;
215  }
216  [CODE]
217
218  call XTest_goto_decl('gd', lines, 1, 32)
219endfunc
220
221func Test_gd_inline_comment_only()
222  let lines =<< trim [CODE]
223  int func(void) /* one lonely x */
224  {
225    return x;
226  }
227  [CODE]
228
229  call XTest_goto_decl('gd', lines, 3, 10)
230endfunc
231
232func Test_gd_inline_comment_body()
233  let lines =<< trim [CODE]
234  int func(void)
235  {
236    int y /* , x */;
237
238    for (/* int x = 0 */; y < 2; y++);
239
240    int x = 0;
241
242    return x;
243  }
244  [CODE]
245
246  call XTest_goto_decl('gd', lines, 7, 7)
247endfunc
248
249func Test_gd_trailing_multiline_comment()
250  let lines =<< trim [CODE]
251  int func(int x) /* x is an int */
252  {
253    return x;
254  }
255  [CODE]
256
257  call XTest_goto_decl('gd', lines, 1, 14)
258endfunc
259
260func Test_gd_trailing_comment()
261  let lines =<< trim [CODE]
262  int func(int x) // x is an int
263  {
264    return x;
265  }
266  [CODE]
267
268  call XTest_goto_decl('gd', lines, 1, 14)
269endfunc
270
271func Test_gd_string()
272  let lines =<< trim [CODE]
273  int func(void)
274  {
275    char *s = "x";
276    int x = 1;
277
278    return x;
279  }
280  [CODE]
281  call XTest_goto_decl('gd', lines, 4, 7)
282endfunc
283
284func Test_gd_string_only()
285  let lines =<< trim [CODE]
286  int func(void)
287  {
288    char *s = "x";
289
290    return x;
291  }
292  [CODE]
293
294  call XTest_goto_decl('gd', lines, 5, 10)
295endfunc
296
297" Check that setting 'cursorline' does not change curswant
298func Test_cursorline_keep_col()
299  new
300  call setline(1, ['long long long line', 'short line'])
301  normal ggfi
302  let pos = getcurpos()
303  normal j
304  set cursorline
305  normal k
306  call assert_equal(pos, getcurpos())
307  bwipe!
308  set nocursorline
309endfunc
310
311func Test_gd_local_block()
312  let lines =<< trim [CODE]
313    int main()
314  {
315    char *a = "NOT NULL";
316    if(a)
317    {
318      char *b = a;
319      printf("%s\n", b);
320    }
321    else
322    {
323      char *b = "NULL";
324      return b;
325    }
326
327    return 0;
328  }
329  [CODE]
330
331  call XTest_goto_decl('1gd', lines, 11, 11)
332endfunc
333
334func Test_motion_if_elif_else_endif()
335  new
336  a
337/* Test pressing % on #if, #else #elsif and #endif,
338 * with nested #if
339 */
340#if FOO
341/* ... */
342#  if BAR
343/* ... */
344#  endif
345#elif BAR
346/* ... */
347#else
348/* ... */
349#endif
350.
351  /#if FOO
352  norm %
353  call assert_equal([9, 1], getpos('.')[1:2])
354  norm %
355  call assert_equal([11, 1], getpos('.')[1:2])
356  norm %
357  call assert_equal([13, 1], getpos('.')[1:2])
358  norm %
359  call assert_equal([4, 1], getpos('.')[1:2])
360  /#  if BAR
361  norm $%
362  call assert_equal([8, 1], getpos('.')[1:2])
363  norm $%
364  call assert_equal([6, 1], getpos('.')[1:2])
365
366  bw!
367endfunc
368
369func Test_motion_c_comment()
370  new
371  a
372/*
373 * Test pressing % on beginning/end
374 * of C comments.
375 */
376/* Another comment */
377.
378  norm gg0%
379  call assert_equal([4, 3], getpos('.')[1:2])
380  norm %
381  call assert_equal([1, 1], getpos('.')[1:2])
382  norm gg0l%
383  call assert_equal([4, 3], getpos('.')[1:2])
384  norm h%
385  call assert_equal([1, 1], getpos('.')[1:2])
386
387  norm G^
388  norm %
389  call assert_equal([5, 21], getpos('.')[1:2])
390  norm %
391  call assert_equal([5, 1], getpos('.')[1:2])
392
393  bw!
394endfunc
395