xref: /vim-8.2.3635/src/testdir/test_tagjump.vim (revision 489d6099)
18d8aa0a3SBram Moolenaar" Tests for tagjump (tags and special searches)
28d8aa0a3SBram Moolenaar
3e8070987SBram Moolenaarsource check.vim
4e8070987SBram Moolenaarsource screendump.vim
5e8070987SBram Moolenaar
68d8aa0a3SBram Moolenaar" SEGV occurs in older versions.  (At least 7.4.1748 or older)
78d8aa0a3SBram Moolenaarfunc Test_ptag_with_notagstack()
85a4c3082SBram Moolenaar  CheckFeature quickfix
95a4c3082SBram Moolenaar
108d8aa0a3SBram Moolenaar  set notagstack
11e2e4075fSBram Moolenaar  call assert_fails('ptag does_not_exist_tag_name', 'E433:')
128d8aa0a3SBram Moolenaar  set tagstack&vim
138d8aa0a3SBram Moolenaarendfunc
14fd89d7eaSBram Moolenaar
155d3c9f8cSBram Moolenaarfunc Test_ptjump()
165d3c9f8cSBram Moolenaar  CheckFeature quickfix
175d3c9f8cSBram Moolenaar
185d3c9f8cSBram Moolenaar  set tags=Xtags
195d3c9f8cSBram Moolenaar  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
205d3c9f8cSBram Moolenaar        \ "one\tXfile\t1",
215d3c9f8cSBram Moolenaar        \ "three\tXfile\t3",
225d3c9f8cSBram Moolenaar        \ "two\tXfile\t2"],
235d3c9f8cSBram Moolenaar        \ 'Xtags')
245d3c9f8cSBram Moolenaar  call writefile(['one', 'two', 'three'], 'Xfile')
255d3c9f8cSBram Moolenaar
265d3c9f8cSBram Moolenaar  %bw!
275d3c9f8cSBram Moolenaar  ptjump two
285d3c9f8cSBram Moolenaar  call assert_equal(2, winnr())
295d3c9f8cSBram Moolenaar  wincmd p
305d3c9f8cSBram Moolenaar  call assert_equal(1, &previewwindow)
315d3c9f8cSBram Moolenaar  call assert_equal('Xfile', expand("%:p:t"))
325d3c9f8cSBram Moolenaar  call assert_equal(2, line('.'))
335d3c9f8cSBram Moolenaar  call assert_equal(2, winnr('$'))
345d3c9f8cSBram Moolenaar  call assert_equal(1, winnr())
355d3c9f8cSBram Moolenaar  close
365d3c9f8cSBram Moolenaar  call setline(1, ['one', 'two', 'three'])
375d3c9f8cSBram Moolenaar  exe "normal 3G\<C-W>g}"
385d3c9f8cSBram Moolenaar  call assert_equal(2, winnr())
395d3c9f8cSBram Moolenaar  wincmd p
405d3c9f8cSBram Moolenaar  call assert_equal(1, &previewwindow)
415d3c9f8cSBram Moolenaar  call assert_equal('Xfile', expand("%:p:t"))
425d3c9f8cSBram Moolenaar  call assert_equal(3, line('.'))
435d3c9f8cSBram Moolenaar  call assert_equal(2, winnr('$'))
445d3c9f8cSBram Moolenaar  call assert_equal(1, winnr())
455d3c9f8cSBram Moolenaar  close
465d3c9f8cSBram Moolenaar  exe "normal 3G5\<C-W>\<C-G>}"
475d3c9f8cSBram Moolenaar  wincmd p
485d3c9f8cSBram Moolenaar  call assert_equal(5, winheight(0))
495d3c9f8cSBram Moolenaar  close
505d3c9f8cSBram Moolenaar
515d3c9f8cSBram Moolenaar  call delete('Xtags')
525d3c9f8cSBram Moolenaar  call delete('Xfile')
535d3c9f8cSBram Moolenaar  set tags&
545d3c9f8cSBram Moolenaarendfunc
555d3c9f8cSBram Moolenaar
56358308ddSBram Moolenaarfunc Test_cancel_ptjump()
575a4c3082SBram Moolenaar  CheckFeature quickfix
585a4c3082SBram Moolenaar
59358308ddSBram Moolenaar  set tags=Xtags
60358308ddSBram Moolenaar  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
61358308ddSBram Moolenaar        \ "word\tfile1\tcmd1",
62358308ddSBram Moolenaar        \ "word\tfile2\tcmd2"],
63358308ddSBram Moolenaar        \ 'Xtags')
64358308ddSBram Moolenaar
65358308ddSBram Moolenaar  only!
66358308ddSBram Moolenaar  call feedkeys(":ptjump word\<CR>\<CR>", "xt")
67358308ddSBram Moolenaar  help
68358308ddSBram Moolenaar  call assert_equal(2, winnr('$'))
69358308ddSBram Moolenaar
70358308ddSBram Moolenaar  call delete('Xtags')
710331faf7SBram Moolenaar  set tags&
72358308ddSBram Moolenaar  quit
73358308ddSBram Moolenaarendfunc
74358308ddSBram Moolenaar
75a9d23c20SBram Moolenaarfunc Test_static_tagjump()
76a9d23c20SBram Moolenaar  set tags=Xtags
77a9d23c20SBram Moolenaar  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
78a9d23c20SBram Moolenaar        \ "one\tXfile1\t/^one/;\"\tf\tfile:\tsignature:(void)",
79a9d23c20SBram Moolenaar        \ "word\tXfile2\tcmd2"],
80a9d23c20SBram Moolenaar        \ 'Xtags')
81a9d23c20SBram Moolenaar  new Xfile1
82a9d23c20SBram Moolenaar  call setline(1, ['empty', 'one()', 'empty'])
83a9d23c20SBram Moolenaar  write
84a9d23c20SBram Moolenaar  tag one
85a9d23c20SBram Moolenaar  call assert_equal(2, line('.'))
86a9d23c20SBram Moolenaar
8798e83b29SBram Moolenaar  bwipe!
88a9d23c20SBram Moolenaar  set tags&
89a9d23c20SBram Moolenaar  call delete('Xtags')
90a9d23c20SBram Moolenaar  call delete('Xfile1')
9198e83b29SBram Moolenaarendfunc
9298e83b29SBram Moolenaar
9398e83b29SBram Moolenaarfunc Test_duplicate_tagjump()
9498e83b29SBram Moolenaar  set tags=Xtags
9598e83b29SBram Moolenaar  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
9698e83b29SBram Moolenaar        \ "thesame\tXfile1\t1;\"\td\tfile:",
9798e83b29SBram Moolenaar        \ "thesame\tXfile1\t2;\"\td\tfile:",
9898e83b29SBram Moolenaar        \ "thesame\tXfile1\t3;\"\td\tfile:",
9998e83b29SBram Moolenaar        \ ],
10098e83b29SBram Moolenaar        \ 'Xtags')
10198e83b29SBram Moolenaar  new Xfile1
10298e83b29SBram Moolenaar  call setline(1, ['thesame one', 'thesame two', 'thesame three'])
10398e83b29SBram Moolenaar  write
10498e83b29SBram Moolenaar  tag thesame
10598e83b29SBram Moolenaar  call assert_equal(1, line('.'))
10698e83b29SBram Moolenaar  tnext
10798e83b29SBram Moolenaar  call assert_equal(2, line('.'))
10898e83b29SBram Moolenaar  tnext
10998e83b29SBram Moolenaar  call assert_equal(3, line('.'))
11098e83b29SBram Moolenaar
111a9d23c20SBram Moolenaar  bwipe!
11298e83b29SBram Moolenaar  set tags&
11398e83b29SBram Moolenaar  call delete('Xtags')
11498e83b29SBram Moolenaar  call delete('Xfile1')
115a9d23c20SBram Moolenaarendfunc
116a9d23c20SBram Moolenaar
1178ad80deaSBram Moolenaarfunc Test_tagjump_switchbuf()
1185a4c3082SBram Moolenaar  CheckFeature quickfix
1195a4c3082SBram Moolenaar
1208ad80deaSBram Moolenaar  set tags=Xtags
1218ad80deaSBram Moolenaar  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
1228ad80deaSBram Moolenaar        \ "second\tXfile1\t2",
1238ad80deaSBram Moolenaar        \ "third\tXfile1\t3",],
1248ad80deaSBram Moolenaar        \ 'Xtags')
1258ad80deaSBram Moolenaar  call writefile(['first', 'second', 'third'], 'Xfile1')
1268ad80deaSBram Moolenaar
1278ad80deaSBram Moolenaar  enew | only
1288ad80deaSBram Moolenaar  set switchbuf=
1298ad80deaSBram Moolenaar  stag second
1308ad80deaSBram Moolenaar  call assert_equal(2, winnr('$'))
1318ad80deaSBram Moolenaar  call assert_equal(2, line('.'))
1328ad80deaSBram Moolenaar  stag third
1338ad80deaSBram Moolenaar  call assert_equal(3, winnr('$'))
1348ad80deaSBram Moolenaar  call assert_equal(3, line('.'))
1358ad80deaSBram Moolenaar
1368ad80deaSBram Moolenaar  enew | only
1378ad80deaSBram Moolenaar  set switchbuf=useopen
1388ad80deaSBram Moolenaar  stag second
1398ad80deaSBram Moolenaar  call assert_equal(2, winnr('$'))
1408ad80deaSBram Moolenaar  call assert_equal(2, line('.'))
1418ad80deaSBram Moolenaar  stag third
1428ad80deaSBram Moolenaar  call assert_equal(2, winnr('$'))
1438ad80deaSBram Moolenaar  call assert_equal(3, line('.'))
1448ad80deaSBram Moolenaar
1458ad80deaSBram Moolenaar  enew | only
1468ad80deaSBram Moolenaar  set switchbuf=usetab
1478ad80deaSBram Moolenaar  tab stag second
1488ad80deaSBram Moolenaar  call assert_equal(2, tabpagenr('$'))
1498ad80deaSBram Moolenaar  call assert_equal(2, line('.'))
1508ad80deaSBram Moolenaar  1tabnext | stag third
1518ad80deaSBram Moolenaar  call assert_equal(2, tabpagenr('$'))
1528ad80deaSBram Moolenaar  call assert_equal(3, line('.'))
1538ad80deaSBram Moolenaar
1548ad80deaSBram Moolenaar  tabclose!
1558ad80deaSBram Moolenaar  enew | only
1568ad80deaSBram Moolenaar  call delete('Xfile1')
1578ad80deaSBram Moolenaar  call delete('Xtags')
1580331faf7SBram Moolenaar  set tags&
1598ad80deaSBram Moolenaar  set switchbuf&vim
1608ad80deaSBram Moolenaarendfunc
1618ad80deaSBram Moolenaar
16253f1673cSBram Moolenaar" Tests for [ CTRL-I and CTRL-W CTRL-I commands
16353f1673cSBram Moolenaarfunction Test_keyword_jump()
16453f1673cSBram Moolenaar  call writefile(["#include Xinclude", "",
16553f1673cSBram Moolenaar	      \ "",
16653f1673cSBram Moolenaar	      \ "/* test text test tex start here",
16753f1673cSBram Moolenaar	      \ "		some text",
16853f1673cSBram Moolenaar	      \ "		test text",
16953f1673cSBram Moolenaar	      \ "		start OK if found this line",
17053f1673cSBram Moolenaar	      \ "	start found wrong line",
17153f1673cSBram Moolenaar	      \ "test text"], 'Xtestfile')
17253f1673cSBram Moolenaar  call writefile(["/* test text test tex start here",
17353f1673cSBram Moolenaar	      \ "		some text",
17453f1673cSBram Moolenaar	      \ "		test text",
17553f1673cSBram Moolenaar	      \ "		start OK if found this line",
17653f1673cSBram Moolenaar	      \ "	start found wrong line",
17753f1673cSBram Moolenaar	      \ "test text"], 'Xinclude')
17853f1673cSBram Moolenaar  new Xtestfile
17953f1673cSBram Moolenaar  call cursor(1,1)
18053f1673cSBram Moolenaar  call search("start")
18153f1673cSBram Moolenaar  exe "normal! 5[\<C-I>"
18253f1673cSBram Moolenaar  call assert_equal("		start OK if found this line", getline('.'))
18353f1673cSBram Moolenaar  call cursor(1,1)
18453f1673cSBram Moolenaar  call search("start")
18553f1673cSBram Moolenaar  exe "normal! 5\<C-W>\<C-I>"
18653f1673cSBram Moolenaar  call assert_equal("		start OK if found this line", getline('.'))
187531be47aSBram Moolenaar
188531be47aSBram Moolenaar  " invalid tag search pattern
189531be47aSBram Moolenaar  call assert_fails('tag /\%(/', 'E426:')
190531be47aSBram Moolenaar
19153f1673cSBram Moolenaar  enew! | only
19253f1673cSBram Moolenaar  call delete('Xtestfile')
19353f1673cSBram Moolenaar  call delete('Xinclude')
19453f1673cSBram Moolenaarendfunction
19553f1673cSBram Moolenaar
19615993ce9SBram Moolenaar" Test for jumping to a tag with 'hidden' set, with symbolic link in path of
19715993ce9SBram Moolenaar" tag.  This only works for Unix, because of the symbolic link.
19815993ce9SBram Moolenaarfunc Test_tag_symbolic()
1996d91bcb4SBram Moolenaar  CheckUnix
2006d91bcb4SBram Moolenaar
20115993ce9SBram Moolenaar  set hidden
20215993ce9SBram Moolenaar  call delete("Xtest.dir", "rf")
20315993ce9SBram Moolenaar  call system("ln -s . Xtest.dir")
20415993ce9SBram Moolenaar  " Create a tags file with the current directory name inserted.
20515993ce9SBram Moolenaar  call writefile([
20615993ce9SBram Moolenaar        \ "SECTION_OFF	" . getcwd() . "/Xtest.dir/Xtest.c	/^#define  SECTION_OFF  3$/",
20715993ce9SBram Moolenaar        \ '',
20815993ce9SBram Moolenaar        \ ], 'Xtags')
20915993ce9SBram Moolenaar  call writefile(['#define  SECTION_OFF  3',
21015993ce9SBram Moolenaar        \ '#define  NUM_SECTIONS 3'], 'Xtest.c')
21115993ce9SBram Moolenaar
21215993ce9SBram Moolenaar  " Try jumping to a tag, but with a path that contains a symbolic link.  When
21315993ce9SBram Moolenaar  " wrong, this will give the ATTENTION message.  The next space will then be
21415993ce9SBram Moolenaar  " eaten by hit-return, instead of moving the cursor to 'd'.
21515993ce9SBram Moolenaar  set tags=Xtags
21615993ce9SBram Moolenaar  enew!
21715993ce9SBram Moolenaar  call append(0, 'SECTION_OFF')
21815993ce9SBram Moolenaar  call cursor(1,1)
21915993ce9SBram Moolenaar  exe "normal \<C-]> "
22015993ce9SBram Moolenaar  call assert_equal('Xtest.c', expand('%:t'))
22115993ce9SBram Moolenaar  call assert_equal(2, col('.'))
22215993ce9SBram Moolenaar
22315993ce9SBram Moolenaar  set hidden&
22415993ce9SBram Moolenaar  set tags&
22515993ce9SBram Moolenaar  enew!
22615993ce9SBram Moolenaar  call delete('Xtags')
22715993ce9SBram Moolenaar  call delete('Xtest.c')
22815993ce9SBram Moolenaar  call delete("Xtest.dir", "rf")
22915993ce9SBram Moolenaar  %bwipe!
23015993ce9SBram Moolenaarendfunc
23115993ce9SBram Moolenaar
232430dc5d3SBram Moolenaar" Tests for tag search with !_TAG_FILE_ENCODING.
233430dc5d3SBram Moolenaar" Depends on the test83-tags2 and test83-tags3 files.
234430dc5d3SBram Moolenaarfunc Test_tag_file_encoding()
235430dc5d3SBram Moolenaar  if has('vms')
2366d91bcb4SBram Moolenaar    throw 'Skipped: does not work on VMS'
237430dc5d3SBram Moolenaar  endif
238430dc5d3SBram Moolenaar
239430dc5d3SBram Moolenaar  if !has('iconv') || iconv("\x82\x60", "cp932", "utf-8") != "\uff21"
2406d91bcb4SBram Moolenaar    throw 'Skipped: iconv does not work'
241430dc5d3SBram Moolenaar  endif
242430dc5d3SBram Moolenaar
243430dc5d3SBram Moolenaar  let save_enc = &encoding
244430dc5d3SBram Moolenaar  set encoding=utf8
245430dc5d3SBram Moolenaar
246430dc5d3SBram Moolenaar  let content = ['text for tags1', 'abcdefghijklmnopqrs']
247430dc5d3SBram Moolenaar  call writefile(content, 'Xtags1.txt')
248430dc5d3SBram Moolenaar  let content = ['text for tags2', 'ABC']
249430dc5d3SBram Moolenaar  call writefile(content, 'Xtags2.txt')
250430dc5d3SBram Moolenaar  let content = ['text for tags3', 'ABC']
251430dc5d3SBram Moolenaar  call writefile(content, 'Xtags3.txt')
252430dc5d3SBram Moolenaar  let content = ['!_TAG_FILE_ENCODING	utf-8	//', 'abcdefghijklmnopqrs	Xtags1.txt	/abcdefghijklmnopqrs']
253430dc5d3SBram Moolenaar  call writefile(content, 'Xtags1')
254430dc5d3SBram Moolenaar
255430dc5d3SBram Moolenaar  " case1:
256430dc5d3SBram Moolenaar  new
257430dc5d3SBram Moolenaar  set tags=Xtags1
258430dc5d3SBram Moolenaar  tag abcdefghijklmnopqrs
259430dc5d3SBram Moolenaar  call assert_equal('Xtags1.txt', expand('%:t'))
260430dc5d3SBram Moolenaar  call assert_equal('abcdefghijklmnopqrs', getline('.'))
261430dc5d3SBram Moolenaar  close
262430dc5d3SBram Moolenaar
263430dc5d3SBram Moolenaar  " case2:
264430dc5d3SBram Moolenaar  new
265430dc5d3SBram Moolenaar  set tags=test83-tags2
266430dc5d3SBram Moolenaar  tag /.BC
267430dc5d3SBram Moolenaar  call assert_equal('Xtags2.txt', expand('%:t'))
268430dc5d3SBram Moolenaar  call assert_equal('ABC', getline('.'))
269430dc5d3SBram Moolenaar  close
270430dc5d3SBram Moolenaar
271430dc5d3SBram Moolenaar  " case3:
272430dc5d3SBram Moolenaar  new
273430dc5d3SBram Moolenaar  set tags=test83-tags3
274430dc5d3SBram Moolenaar  tag abc50
275430dc5d3SBram Moolenaar  call assert_equal('Xtags3.txt', expand('%:t'))
276430dc5d3SBram Moolenaar  call assert_equal('ABC', getline('.'))
277430dc5d3SBram Moolenaar  close
278430dc5d3SBram Moolenaar
279430dc5d3SBram Moolenaar  set tags&
280430dc5d3SBram Moolenaar  let &encoding = save_enc
281430dc5d3SBram Moolenaar  call delete('Xtags1.txt')
282430dc5d3SBram Moolenaar  call delete('Xtags2.txt')
283430dc5d3SBram Moolenaar  call delete('Xtags3.txt')
284430dc5d3SBram Moolenaar  call delete('Xtags1')
285430dc5d3SBram Moolenaarendfunc
286430dc5d3SBram Moolenaar
287845e0ee5SBram Moolenaar" Test for emacs-style tags file (TAGS)
2880d207377SBram Moolenaarfunc Test_tagjump_etags()
2896d91bcb4SBram Moolenaar  CheckFeature emacs_tags
2906d91bcb4SBram Moolenaar
2910d207377SBram Moolenaar  call writefile([
2920d207377SBram Moolenaar        \ "void foo() {}",
2930d207377SBram Moolenaar        \ "int main(int argc, char **argv)",
2940d207377SBram Moolenaar        \ "{",
2950d207377SBram Moolenaar        \ "\tfoo();",
2960d207377SBram Moolenaar        \ "\treturn 0;",
2970d207377SBram Moolenaar        \ "}",
2980d207377SBram Moolenaar        \ ], 'Xmain.c')
2990d207377SBram Moolenaar
3000d207377SBram Moolenaar  call writefile([
3010d207377SBram Moolenaar	\ "\x0c",
3020d207377SBram Moolenaar        \ "Xmain.c,64",
3030d207377SBram Moolenaar        \ "void foo() {}\x7ffoo\x011,0",
3040d207377SBram Moolenaar        \ "int main(int argc, char **argv)\x7fmain\x012,14",
3050d207377SBram Moolenaar	\ ], 'Xtags')
3060d207377SBram Moolenaar  set tags=Xtags
3070d207377SBram Moolenaar  ta foo
3080d207377SBram Moolenaar  call assert_equal('void foo() {}', getline('.'))
3090d207377SBram Moolenaar
3103d9207adSBram Moolenaar  " Test for including another tags file
3113d9207adSBram Moolenaar  call writefile([
3123d9207adSBram Moolenaar        \ "\x0c",
3133d9207adSBram Moolenaar        \ "Xmain.c,64",
3143d9207adSBram Moolenaar        \ "void foo() {}\x7ffoo\x011,0",
3153d9207adSBram Moolenaar        \ "\x0c",
3163d9207adSBram Moolenaar        \ "Xnonexisting,include",
3173d9207adSBram Moolenaar        \ "\x0c",
3183d9207adSBram Moolenaar        \ "Xtags2,include"
3193d9207adSBram Moolenaar        \ ], 'Xtags')
3203d9207adSBram Moolenaar  call writefile([
3213d9207adSBram Moolenaar        \ "\x0c",
3223d9207adSBram Moolenaar        \ "Xmain.c,64",
3233d9207adSBram Moolenaar        \ "int main(int argc, char **argv)\x7fmain\x012,14",
3243d9207adSBram Moolenaar        \ ], 'Xtags2')
3253d9207adSBram Moolenaar  tag main
3263d9207adSBram Moolenaar  call assert_equal(2, line('.'))
3273d9207adSBram Moolenaar
3283d9207adSBram Moolenaar  " corrupted tag line
3293d9207adSBram Moolenaar  call writefile([
3303d9207adSBram Moolenaar        \ "\x0c",
3313d9207adSBram Moolenaar        \ "Xmain.c,8",
3323d9207adSBram Moolenaar        \ "int main"
3333d9207adSBram Moolenaar        \ ], 'Xtags', 'b')
3343d9207adSBram Moolenaar  call assert_fails('tag foo', 'E426:')
3353d9207adSBram Moolenaar
3363d9207adSBram Moolenaar  " invalid line number
3373d9207adSBram Moolenaar  call writefile([
3383d9207adSBram Moolenaar	\ "\x0c",
3393d9207adSBram Moolenaar        \ "Xmain.c,64",
3403d9207adSBram Moolenaar        \ "void foo() {}\x7ffoo\x0abc,0",
3413d9207adSBram Moolenaar	\ ], 'Xtags')
3423d9207adSBram Moolenaar  call assert_fails('tag foo', 'E426:')
3433d9207adSBram Moolenaar
3443d9207adSBram Moolenaar  " invalid tag name
3453d9207adSBram Moolenaar  call writefile([
3463d9207adSBram Moolenaar	\ "\x0c",
3473d9207adSBram Moolenaar        \ "Xmain.c,64",
3483d9207adSBram Moolenaar        \ ";;;;\x7f1,0",
3493d9207adSBram Moolenaar	\ ], 'Xtags')
3509b7bf9e9SBram Moolenaar  call assert_fails('tag foo', 'E431:')
3513d9207adSBram Moolenaar
3520d207377SBram Moolenaar  call delete('Xtags')
3533d9207adSBram Moolenaar  call delete('Xtags2')
3540d207377SBram Moolenaar  call delete('Xmain.c')
3553d9207adSBram Moolenaar  set tags&
3560d207377SBram Moolenaar  bwipe!
3570d207377SBram Moolenaarendfunc
3580d207377SBram Moolenaar
359f49cc60aSBram Moolenaar" Test for getting and modifying the tag stack
360f49cc60aSBram Moolenaarfunc Test_getsettagstack()
361f49cc60aSBram Moolenaar  call writefile(['line1', 'line2', 'line3'], 'Xfile1')
362f49cc60aSBram Moolenaar  call writefile(['line1', 'line2', 'line3'], 'Xfile2')
363f49cc60aSBram Moolenaar  call writefile(['line1', 'line2', 'line3'], 'Xfile3')
364f49cc60aSBram Moolenaar
365f49cc60aSBram Moolenaar  enew | only
366f49cc60aSBram Moolenaar  call settagstack(1, {'items' : []})
367f49cc60aSBram Moolenaar  call assert_equal(0, gettagstack(1).length)
3685d69fdb7SBram Moolenaar  call assert_equal([], 1->gettagstack().items)
369f49cc60aSBram Moolenaar  " Error cases
370f49cc60aSBram Moolenaar  call assert_equal({}, gettagstack(100))
371f49cc60aSBram Moolenaar  call assert_equal(-1, settagstack(100, {'items' : []}))
372e2e4075fSBram Moolenaar  call assert_fails('call settagstack(1, [1, 10])', 'E715:')
373e2e4075fSBram Moolenaar  call assert_fails("call settagstack(1, {'items' : 10})", 'E714:')
374e2e4075fSBram Moolenaar  call assert_fails("call settagstack(1, {'items' : []}, 10)", 'E928:')
375e2e4075fSBram Moolenaar  call assert_fails("call settagstack(1, {'items' : []}, 'b')", 'E962:')
376ad48e6c1SBram Moolenaar  call assert_equal(-1, settagstack(0, test_null_dict()))
377f49cc60aSBram Moolenaar
378f49cc60aSBram Moolenaar  set tags=Xtags
379f49cc60aSBram Moolenaar  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
380f49cc60aSBram Moolenaar        \ "one\tXfile1\t1",
381f49cc60aSBram Moolenaar        \ "three\tXfile3\t3",
382f49cc60aSBram Moolenaar        \ "two\tXfile2\t2"],
383f49cc60aSBram Moolenaar        \ 'Xtags')
384f49cc60aSBram Moolenaar
385f49cc60aSBram Moolenaar  let stk = []
386f49cc60aSBram Moolenaar  call add(stk, {'bufnr' : bufnr('%'), 'tagname' : 'one',
387f49cc60aSBram Moolenaar	\ 'from' : [bufnr('%'), line('.'), col('.'), 0], 'matchnr' : 1})
388f49cc60aSBram Moolenaar  tag one
389f49cc60aSBram Moolenaar  call add(stk, {'bufnr' : bufnr('%'), 'tagname' : 'two',
390f49cc60aSBram Moolenaar	\ 'from' : [bufnr('%'), line('.'), col('.'), 0], 'matchnr' : 1})
391f49cc60aSBram Moolenaar  tag two
392f49cc60aSBram Moolenaar  call add(stk, {'bufnr' : bufnr('%'), 'tagname' : 'three',
393f49cc60aSBram Moolenaar	\ 'from' : [bufnr('%'), line('.'), col('.'), 0], 'matchnr' : 1})
394f49cc60aSBram Moolenaar  tag three
395f49cc60aSBram Moolenaar  call assert_equal(3, gettagstack(1).length)
396f49cc60aSBram Moolenaar  call assert_equal(stk, gettagstack(1).items)
397f49cc60aSBram Moolenaar  " Check for default - current window
398f49cc60aSBram Moolenaar  call assert_equal(3, gettagstack().length)
399f49cc60aSBram Moolenaar  call assert_equal(stk, gettagstack().items)
400f49cc60aSBram Moolenaar
401f49cc60aSBram Moolenaar  " Try to set current index to invalid values
402f49cc60aSBram Moolenaar  call settagstack(1, {'curidx' : -1})
403f49cc60aSBram Moolenaar  call assert_equal(1, gettagstack().curidx)
404aad222c9SBram Moolenaar  eval {'curidx' : 50}->settagstack(1)
405f49cc60aSBram Moolenaar  call assert_equal(4, gettagstack().curidx)
406f49cc60aSBram Moolenaar
407f49cc60aSBram Moolenaar  " Try pushing invalid items onto the stack
408f49cc60aSBram Moolenaar  call settagstack(1, {'items' : []})
409f49cc60aSBram Moolenaar  call settagstack(1, {'items' : ["plate"]}, 'a')
410f49cc60aSBram Moolenaar  call assert_equal(0, gettagstack().length)
411f49cc60aSBram Moolenaar  call assert_equal([], gettagstack().items)
412f49cc60aSBram Moolenaar  call settagstack(1, {'items' : [{"tagname" : "abc"}]}, 'a')
413f49cc60aSBram Moolenaar  call assert_equal(0, gettagstack().length)
414f49cc60aSBram Moolenaar  call assert_equal([], gettagstack().items)
415f49cc60aSBram Moolenaar  call settagstack(1, {'items' : [{"from" : 100}]}, 'a')
416f49cc60aSBram Moolenaar  call assert_equal(0, gettagstack().length)
417f49cc60aSBram Moolenaar  call assert_equal([], gettagstack().items)
418f49cc60aSBram Moolenaar  call settagstack(1, {'items' : [{"from" : [2, 1, 0, 0]}]}, 'a')
419f49cc60aSBram Moolenaar  call assert_equal(0, gettagstack().length)
420f49cc60aSBram Moolenaar  call assert_equal([], gettagstack().items)
421f49cc60aSBram Moolenaar
422f49cc60aSBram Moolenaar  " Push one item at a time to the stack
423f49cc60aSBram Moolenaar  call settagstack(1, {'items' : []})
424f49cc60aSBram Moolenaar  call settagstack(1, {'items' : [stk[0]]}, 'a')
425f49cc60aSBram Moolenaar  call settagstack(1, {'items' : [stk[1]]}, 'a')
426f49cc60aSBram Moolenaar  call settagstack(1, {'items' : [stk[2]]}, 'a')
427f49cc60aSBram Moolenaar  call settagstack(1, {'curidx' : 4})
428f49cc60aSBram Moolenaar  call assert_equal({'length' : 3, 'curidx' : 4, 'items' : stk},
429f49cc60aSBram Moolenaar        \ gettagstack(1))
430f49cc60aSBram Moolenaar
431f49cc60aSBram Moolenaar  " Try pushing items onto a full stack
432f49cc60aSBram Moolenaar  for i in range(7)
433f49cc60aSBram Moolenaar    call settagstack(1, {'items' : stk}, 'a')
434f49cc60aSBram Moolenaar  endfor
435f49cc60aSBram Moolenaar  call assert_equal(20, gettagstack().length)
436f49cc60aSBram Moolenaar  call settagstack(1,
437f49cc60aSBram Moolenaar        \ {'items' : [{'tagname' : 'abc', 'from' : [1, 10, 1, 0]}]}, 'a')
438f49cc60aSBram Moolenaar  call assert_equal('abc', gettagstack().items[19].tagname)
439f49cc60aSBram Moolenaar
440271fa08aSBram Moolenaar  " truncate the tag stack
441271fa08aSBram Moolenaar  call settagstack(1,
442271fa08aSBram Moolenaar        \ {'curidx' : 9,
443271fa08aSBram Moolenaar        \  'items' : [{'tagname' : 'abc', 'from' : [1, 10, 1, 0]}]}, 't')
444271fa08aSBram Moolenaar  let t = gettagstack()
445271fa08aSBram Moolenaar  call assert_equal(9, t.length)
446271fa08aSBram Moolenaar  call assert_equal(10, t.curidx)
447271fa08aSBram Moolenaar
448271fa08aSBram Moolenaar  " truncate the tag stack without pushing any new items
449271fa08aSBram Moolenaar  call settagstack(1, {'curidx' : 5}, 't')
450271fa08aSBram Moolenaar  let t = gettagstack()
451271fa08aSBram Moolenaar  call assert_equal(4, t.length)
452271fa08aSBram Moolenaar  call assert_equal(5, t.curidx)
453271fa08aSBram Moolenaar
454271fa08aSBram Moolenaar  " truncate an empty tag stack and push new items
455271fa08aSBram Moolenaar  call settagstack(1, {'items' : []})
456271fa08aSBram Moolenaar  call settagstack(1,
457271fa08aSBram Moolenaar        \ {'items' : [{'tagname' : 'abc', 'from' : [1, 10, 1, 0]}]}, 't')
458271fa08aSBram Moolenaar  let t = gettagstack()
459271fa08aSBram Moolenaar  call assert_equal(1, t.length)
460271fa08aSBram Moolenaar  call assert_equal(2, t.curidx)
461271fa08aSBram Moolenaar
462f49cc60aSBram Moolenaar  " Tag with multiple matches
463f49cc60aSBram Moolenaar  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
464f49cc60aSBram Moolenaar        \ "two\tXfile1\t1",
465f49cc60aSBram Moolenaar        \ "two\tXfile2\t3",
466f49cc60aSBram Moolenaar        \ "two\tXfile3\t2"],
467f49cc60aSBram Moolenaar        \ 'Xtags')
468f49cc60aSBram Moolenaar  call settagstack(1, {'items' : []})
469f49cc60aSBram Moolenaar  tag two
470f49cc60aSBram Moolenaar  tnext
471f49cc60aSBram Moolenaar  tnext
472f49cc60aSBram Moolenaar  call assert_equal(1, gettagstack().length)
473f49cc60aSBram Moolenaar  call assert_equal(3, gettagstack().items[0].matchnr)
474f49cc60aSBram Moolenaar
475f49cc60aSBram Moolenaar  " Memory allocation failures
476f49cc60aSBram Moolenaar  call test_alloc_fail(GetAllocId('tagstack_items'), 0, 0)
477f49cc60aSBram Moolenaar  call assert_fails('call gettagstack()', 'E342:')
478f49cc60aSBram Moolenaar  call test_alloc_fail(GetAllocId('tagstack_from'), 0, 0)
479f49cc60aSBram Moolenaar  call assert_fails('call gettagstack()', 'E342:')
480f49cc60aSBram Moolenaar  call test_alloc_fail(GetAllocId('tagstack_details'), 0, 0)
481f49cc60aSBram Moolenaar  call assert_fails('call gettagstack()', 'E342:')
482f49cc60aSBram Moolenaar
483f49cc60aSBram Moolenaar  call settagstack(1, {'items' : []})
484f49cc60aSBram Moolenaar  call delete('Xfile1')
485f49cc60aSBram Moolenaar  call delete('Xfile2')
486f49cc60aSBram Moolenaar  call delete('Xfile3')
487f49cc60aSBram Moolenaar  call delete('Xtags')
488f49cc60aSBram Moolenaar  set tags&
489f49cc60aSBram Moolenaarendfunc
490f49cc60aSBram Moolenaar
4917559dcefSBram Moolenaarfunc Test_tag_with_count()
4927559dcefSBram Moolenaar  call writefile([
4937559dcefSBram Moolenaar	\ 'test	Xtest.h	/^void test();$/;"	p	typeref:typename:void	signature:()',
4947559dcefSBram Moolenaar	\ ], 'Xtags')
4957559dcefSBram Moolenaar  call writefile([
4967559dcefSBram Moolenaar	\ 'main	Xtest.c	/^int main()$/;"	f	typeref:typename:int	signature:()',
4977559dcefSBram Moolenaar	\ 'test	Xtest.c	/^void test()$/;"	f	typeref:typename:void	signature:()',
4987559dcefSBram Moolenaar	\ ], 'Ytags')
4997559dcefSBram Moolenaar  cal writefile([
5007559dcefSBram Moolenaar	\ 'int main()',
5017559dcefSBram Moolenaar	\ 'void test()',
5027559dcefSBram Moolenaar	\ ], 'Xtest.c')
5037559dcefSBram Moolenaar  cal writefile([
5047559dcefSBram Moolenaar	\ 'void test();',
5057559dcefSBram Moolenaar	\ ], 'Xtest.h')
5067559dcefSBram Moolenaar  set tags=Xtags,Ytags
5077559dcefSBram Moolenaar
5087559dcefSBram Moolenaar  new Xtest.c
5097559dcefSBram Moolenaar  let tl = taglist('test', 'Xtest.c')
5107559dcefSBram Moolenaar  call assert_equal(tl[0].filename, 'Xtest.c')
5117559dcefSBram Moolenaar  call assert_equal(tl[1].filename, 'Xtest.h')
5127559dcefSBram Moolenaar
5137559dcefSBram Moolenaar  tag test
5147559dcefSBram Moolenaar  call assert_equal(bufname('%'), 'Xtest.c')
5157559dcefSBram Moolenaar  1tag test
5167559dcefSBram Moolenaar  call assert_equal(bufname('%'), 'Xtest.c')
5177559dcefSBram Moolenaar  2tag test
5187559dcefSBram Moolenaar  call assert_equal(bufname('%'), 'Xtest.h')
5197559dcefSBram Moolenaar
5207559dcefSBram Moolenaar  set tags&
5217559dcefSBram Moolenaar  call delete('Xtags')
5227559dcefSBram Moolenaar  call delete('Ytags')
5237559dcefSBram Moolenaar  bwipe Xtest.h
5247559dcefSBram Moolenaar  bwipe Xtest.c
5257559dcefSBram Moolenaar  call delete('Xtest.h')
5267559dcefSBram Moolenaar  call delete('Xtest.c')
5277559dcefSBram Moolenaarendfunc
5287559dcefSBram Moolenaar
5297559dcefSBram Moolenaarfunc Test_tagnr_recall()
5307559dcefSBram Moolenaar  call writefile([
5317559dcefSBram Moolenaar	\ 'test	Xtest.h	/^void test();$/;"	p',
5327559dcefSBram Moolenaar	\ 'main	Xtest.c	/^int main()$/;"	f',
5337559dcefSBram Moolenaar	\ 'test	Xtest.c	/^void test()$/;"	f',
5347559dcefSBram Moolenaar	\ ], 'Xtags')
5357559dcefSBram Moolenaar  cal writefile([
5367559dcefSBram Moolenaar	\ 'int main()',
5377559dcefSBram Moolenaar	\ 'void test()',
5387559dcefSBram Moolenaar	\ ], 'Xtest.c')
5397559dcefSBram Moolenaar  cal writefile([
5407559dcefSBram Moolenaar	\ 'void test();',
5417559dcefSBram Moolenaar	\ ], 'Xtest.h')
5427559dcefSBram Moolenaar  set tags=Xtags
5437559dcefSBram Moolenaar
5447559dcefSBram Moolenaar  new Xtest.c
5457559dcefSBram Moolenaar  let tl = taglist('test', 'Xtest.c')
5467559dcefSBram Moolenaar  call assert_equal(tl[0].filename, 'Xtest.c')
5477559dcefSBram Moolenaar  call assert_equal(tl[1].filename, 'Xtest.h')
5487559dcefSBram Moolenaar
5497559dcefSBram Moolenaar  2tag test
5507559dcefSBram Moolenaar  call assert_equal(bufname('%'), 'Xtest.h')
5517559dcefSBram Moolenaar  pop
5527559dcefSBram Moolenaar  call assert_equal(bufname('%'), 'Xtest.c')
5537559dcefSBram Moolenaar  tag
5547559dcefSBram Moolenaar  call assert_equal(bufname('%'), 'Xtest.h')
5557559dcefSBram Moolenaar
5560331faf7SBram Moolenaar  set tags&
5577559dcefSBram Moolenaar  call delete('Xtags')
5587559dcefSBram Moolenaar  bwipe Xtest.h
5597559dcefSBram Moolenaar  bwipe Xtest.c
5607559dcefSBram Moolenaar  call delete('Xtest.h')
5617559dcefSBram Moolenaar  call delete('Xtest.c')
5627559dcefSBram Moolenaarendfunc
5637559dcefSBram Moolenaar
5645209334cSBram Moolenaarfunc Test_tag_line_toolong()
5655209334cSBram Moolenaar  call writefile([
5665209334cSBram Moolenaar	\ '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678	django/contrib/admin/templates/admin/edit_inline/stacked.html	16;"	j	line:16	language:HTML'
5675209334cSBram Moolenaar	\ ], 'Xtags')
5685209334cSBram Moolenaar  set tags=Xtags
5695209334cSBram Moolenaar  let old_vbs = &verbose
5705209334cSBram Moolenaar  set verbose=5
5715209334cSBram Moolenaar  " ":tjump" should give "tag not found" not "Format error in tags file"
572e2e4075fSBram Moolenaar  call assert_fails('tj /foo', 'E426:')
5735209334cSBram Moolenaar  try
5745209334cSBram Moolenaar    tj /foo
5755209334cSBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E431/
5765209334cSBram Moolenaar    call assert_report(v:exception)
5775209334cSBram Moolenaar  catch /.*/
5785209334cSBram Moolenaar  endtry
579dc9ef268SBram Moolenaar  call assert_equal('Searching tags file Xtags', split(execute('messages'), '\n')[-1])
580dc9ef268SBram Moolenaar
5815209334cSBram Moolenaar  call writefile([
5825209334cSBram Moolenaar	\ '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567	django/contrib/admin/templates/admin/edit_inline/stacked.html	16;"	j	line:16	language:HTML'
5835209334cSBram Moolenaar	\ ], 'Xtags')
584e2e4075fSBram Moolenaar  call assert_fails('tj /foo', 'E426:')
5855209334cSBram Moolenaar  try
5865209334cSBram Moolenaar    tj /foo
5875209334cSBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E431/
5885209334cSBram Moolenaar    call assert_report(v:exception)
5895209334cSBram Moolenaar  catch /.*/
5905209334cSBram Moolenaar  endtry
591dc9ef268SBram Moolenaar  call assert_equal('Searching tags file Xtags', split(execute('messages'), '\n')[-1])
592dc9ef268SBram Moolenaar
593dc9ef268SBram Moolenaar  " binary search works in file with long line
594dc9ef268SBram Moolenaar  call writefile([
595dc9ef268SBram Moolenaar        \ 'asdfasfd	nowhere	16',
596dc9ef268SBram Moolenaar	\ 'foobar	Xsomewhere	3; " 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567',
597dc9ef268SBram Moolenaar        \ 'zasdfasfd	nowhere	16',
598dc9ef268SBram Moolenaar	\ ], 'Xtags')
599dc9ef268SBram Moolenaar  call writefile([
600dc9ef268SBram Moolenaar        \ 'one',
601dc9ef268SBram Moolenaar        \ 'two',
602dc9ef268SBram Moolenaar        \ 'trhee',
603dc9ef268SBram Moolenaar        \ 'four',
604dc9ef268SBram Moolenaar        \ ], 'Xsomewhere')
605dc9ef268SBram Moolenaar  tag foobar
606dc9ef268SBram Moolenaar  call assert_equal('Xsomewhere', expand('%'))
607dc9ef268SBram Moolenaar  call assert_equal(3, getcurpos()[1])
608dc9ef268SBram Moolenaar
609*489d6099SGregory Anders  " expansion on command line works with long lines when &wildoptions contains
610*489d6099SGregory Anders  " 'tagfile'
611*489d6099SGregory Anders  set wildoptions=tagfile
612*489d6099SGregory Anders  call writefile([
613*489d6099SGregory Anders	\ 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa	file	/^pattern$/;"	f'
614*489d6099SGregory Anders	\ ], 'Xtags')
615*489d6099SGregory Anders  call feedkeys(":tag \<Tab>", 'tx')
616*489d6099SGregory Anders  " Should not crash
617*489d6099SGregory Anders  call assert_true(v:true)
618*489d6099SGregory Anders
6195209334cSBram Moolenaar  call delete('Xtags')
620dc9ef268SBram Moolenaar  call delete('Xsomewhere')
6210331faf7SBram Moolenaar  set tags&
6225209334cSBram Moolenaar  let &verbose = old_vbs
6235209334cSBram Moolenaarendfunc
6245209334cSBram Moolenaar
625e8070987SBram Moolenaar" Check that using :tselect does not run into the hit-enter prompt.
626e8070987SBram Moolenaar" Requires a terminal to trigger that prompt.
627e8070987SBram Moolenaarfunc Test_tselect()
628e8070987SBram Moolenaar  CheckScreendump
629e8070987SBram Moolenaar
630e8070987SBram Moolenaar  call writefile([
631e8070987SBram Moolenaar	\ 'main	Xtest.h	/^void test();$/;"	f',
632e8070987SBram Moolenaar	\ 'main	Xtest.c	/^int main()$/;"	f',
633e8070987SBram Moolenaar	\ 'main	Xtest.x	/^void test()$/;"	f',
634e8070987SBram Moolenaar	\ ], 'Xtags')
635e8070987SBram Moolenaar  cal writefile([
636e8070987SBram Moolenaar	\ 'int main()',
637e8070987SBram Moolenaar	\ 'void test()',
638e8070987SBram Moolenaar	\ ], 'Xtest.c')
639e8070987SBram Moolenaar
640e8070987SBram Moolenaar  let lines =<< trim [SCRIPT]
641e8070987SBram Moolenaar    set tags=Xtags
642e8070987SBram Moolenaar  [SCRIPT]
643e8070987SBram Moolenaar  call writefile(lines, 'XTest_tselect')
644e8070987SBram Moolenaar  let buf = RunVimInTerminal('-S XTest_tselect', {'rows': 10, 'cols': 50})
645e8070987SBram Moolenaar
6466a2c5a7dSBram Moolenaar  call TermWait(buf, 50)
647e8070987SBram Moolenaar  call term_sendkeys(buf, ":tselect main\<CR>2\<CR>")
648e8070987SBram Moolenaar  call VerifyScreenDump(buf, 'Test_tselect_1', {})
649e8070987SBram Moolenaar
6504facea31SBram Moolenaar  call StopVimInTerminal(buf)
651e8070987SBram Moolenaar  call delete('Xtags')
652e8070987SBram Moolenaar  call delete('Xtest.c')
653e8070987SBram Moolenaar  call delete('XTest_tselect')
654e8070987SBram Moolenaarendfunc
655e8070987SBram Moolenaar
656077b9dd3SBram Moolenaarfunc Test_tagline()
657077b9dd3SBram Moolenaar  call writefile([
658077b9dd3SBram Moolenaar	\ 'provision	Xtest.py	/^    def provision(self, **kwargs):$/;"	m	line:1	language:Python class:Foo',
659077b9dd3SBram Moolenaar	\ 'provision	Xtest.py	/^    def provision(self, **kwargs):$/;"	m	line:3	language:Python class:Bar',
660077b9dd3SBram Moolenaar	\], 'Xtags')
661077b9dd3SBram Moolenaar  call writefile([
662077b9dd3SBram Moolenaar	\ '    def provision(self, **kwargs):',
663077b9dd3SBram Moolenaar	\ '        pass',
664077b9dd3SBram Moolenaar	\ '    def provision(self, **kwargs):',
665077b9dd3SBram Moolenaar	\ '        pass',
666077b9dd3SBram Moolenaar	\], 'Xtest.py')
667077b9dd3SBram Moolenaar
668077b9dd3SBram Moolenaar  set tags=Xtags
669077b9dd3SBram Moolenaar
670077b9dd3SBram Moolenaar  1tag provision
671077b9dd3SBram Moolenaar  call assert_equal(line('.'), 1)
672077b9dd3SBram Moolenaar  2tag provision
673077b9dd3SBram Moolenaar  call assert_equal(line('.'), 3)
674077b9dd3SBram Moolenaar
675077b9dd3SBram Moolenaar  call delete('Xtags')
676077b9dd3SBram Moolenaar  call delete('Xtest.py')
677077b9dd3SBram Moolenaar  set tags&
678077b9dd3SBram Moolenaarendfunc
679077b9dd3SBram Moolenaar
680830c1afcSBram Moolenaar" Test for expanding environment variable in a tag file name
681830c1afcSBram Moolenaarfunc Test_tag_envvar()
682830c1afcSBram Moolenaar  call writefile(["Func1\t$FOO\t/^Func1/"], 'Xtags')
683830c1afcSBram Moolenaar  set tags=Xtags
684830c1afcSBram Moolenaar
685830c1afcSBram Moolenaar  let $FOO='TagTestEnv'
686830c1afcSBram Moolenaar
687830c1afcSBram Moolenaar  let caught_exception = v:false
688830c1afcSBram Moolenaar  try
689830c1afcSBram Moolenaar    tag Func1
690830c1afcSBram Moolenaar  catch /E429:/
691830c1afcSBram Moolenaar    call assert_match('E429:.*"TagTestEnv".*', v:exception)
692830c1afcSBram Moolenaar    let caught_exception = v:true
693830c1afcSBram Moolenaar  endtry
694830c1afcSBram Moolenaar  call assert_true(caught_exception)
695830c1afcSBram Moolenaar
696830c1afcSBram Moolenaar  set tags&
697830c1afcSBram Moolenaar  call delete('Xtags')
698830c1afcSBram Moolenaar  unlet $FOO
699830c1afcSBram Moolenaarendfunc
700830c1afcSBram Moolenaar
701830c1afcSBram Moolenaar" Test for :ptag
702a1353b53SBram Moolenaarfunc Test_tag_preview()
703830c1afcSBram Moolenaar  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
704830c1afcSBram Moolenaar        \ "second\tXfile1\t2",
705830c1afcSBram Moolenaar        \ "third\tXfile1\t3",],
706830c1afcSBram Moolenaar        \ 'Xtags')
707830c1afcSBram Moolenaar  set tags=Xtags
708830c1afcSBram Moolenaar  call writefile(['first', 'second', 'third'], 'Xfile1')
709830c1afcSBram Moolenaar
710830c1afcSBram Moolenaar  enew | only
711830c1afcSBram Moolenaar  ptag third
712830c1afcSBram Moolenaar  call assert_equal(2, winnr())
713830c1afcSBram Moolenaar  call assert_equal(2, winnr('$'))
714830c1afcSBram Moolenaar  call assert_equal(1, getwinvar(1, '&previewwindow'))
715830c1afcSBram Moolenaar  call assert_equal(0, getwinvar(2, '&previewwindow'))
716a1353b53SBram Moolenaar  wincmd P
717830c1afcSBram Moolenaar  call assert_equal(3, line('.'))
718830c1afcSBram Moolenaar
719830c1afcSBram Moolenaar  " jump to the tag again
720a1353b53SBram Moolenaar  wincmd w
721830c1afcSBram Moolenaar  ptag third
722a1353b53SBram Moolenaar  wincmd P
723a1353b53SBram Moolenaar  call assert_equal(3, line('.'))
724a1353b53SBram Moolenaar
725a1353b53SBram Moolenaar  " jump to the newer tag
726a1353b53SBram Moolenaar  wincmd w
727a1353b53SBram Moolenaar  ptag
728a1353b53SBram Moolenaar  wincmd P
729830c1afcSBram Moolenaar  call assert_equal(3, line('.'))
730830c1afcSBram Moolenaar
731830c1afcSBram Moolenaar  " close the preview window
732830c1afcSBram Moolenaar  pclose
733830c1afcSBram Moolenaar  call assert_equal(1, winnr('$'))
734830c1afcSBram Moolenaar
735830c1afcSBram Moolenaar  call delete('Xfile1')
736830c1afcSBram Moolenaar  call delete('Xtags')
737830c1afcSBram Moolenaar  set tags&
738830c1afcSBram Moolenaarendfunc
739830c1afcSBram Moolenaar
740830c1afcSBram Moolenaar" Tests for guessing the tag location
741830c1afcSBram Moolenaarfunc Test_tag_guess()
742830c1afcSBram Moolenaar  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
743830c1afcSBram Moolenaar        \ "func1\tXfoo\t/^int func1(int x)/",
744830c1afcSBram Moolenaar        \ "func2\tXfoo\t/^int func2(int y)/",
745830c1afcSBram Moolenaar        \ "func3\tXfoo\t/^func3/",
746830c1afcSBram Moolenaar        \ "func4\tXfoo\t/^func4/"],
747830c1afcSBram Moolenaar        \ 'Xtags')
748830c1afcSBram Moolenaar  set tags=Xtags
749830c1afcSBram Moolenaar  let code =<< trim [CODE]
750830c1afcSBram Moolenaar
751830c1afcSBram Moolenaar    int FUNC1  (int x) { }
752830c1afcSBram Moolenaar    int
753830c1afcSBram Moolenaar    func2   (int y) { }
754830c1afcSBram Moolenaar    int * func3 () { }
755830c1afcSBram Moolenaar
756830c1afcSBram Moolenaar  [CODE]
757830c1afcSBram Moolenaar  call writefile(code, 'Xfoo')
758830c1afcSBram Moolenaar
759830c1afcSBram Moolenaar  let v:statusmsg = ''
760830c1afcSBram Moolenaar  ta func1
761830c1afcSBram Moolenaar  call assert_match('E435:', v:statusmsg)
762830c1afcSBram Moolenaar  call assert_equal(2, line('.'))
763830c1afcSBram Moolenaar  let v:statusmsg = ''
764830c1afcSBram Moolenaar  ta func2
765830c1afcSBram Moolenaar  call assert_match('E435:', v:statusmsg)
766830c1afcSBram Moolenaar  call assert_equal(4, line('.'))
767830c1afcSBram Moolenaar  let v:statusmsg = ''
768830c1afcSBram Moolenaar  ta func3
769830c1afcSBram Moolenaar  call assert_match('E435:', v:statusmsg)
770830c1afcSBram Moolenaar  call assert_equal(5, line('.'))
771830c1afcSBram Moolenaar  call assert_fails('ta func4', 'E434:')
772830c1afcSBram Moolenaar
773830c1afcSBram Moolenaar  call delete('Xtags')
774830c1afcSBram Moolenaar  call delete('Xfoo')
775830c1afcSBram Moolenaar  set tags&
776830c1afcSBram Moolenaarendfunc
777830c1afcSBram Moolenaar
778830c1afcSBram Moolenaar" Test for an unsorted tags file
779830c1afcSBram Moolenaarfunc Test_tag_sort()
780830c1afcSBram Moolenaar  call writefile([
781830c1afcSBram Moolenaar        \ "first\tXfoo\t1",
782830c1afcSBram Moolenaar        \ "ten\tXfoo\t3",
783830c1afcSBram Moolenaar        \ "six\tXfoo\t2"],
784830c1afcSBram Moolenaar        \ 'Xtags')
785830c1afcSBram Moolenaar  set tags=Xtags
786830c1afcSBram Moolenaar  let code =<< trim [CODE]
787830c1afcSBram Moolenaar    int first() {}
788830c1afcSBram Moolenaar    int six() {}
789830c1afcSBram Moolenaar    int ten() {}
790830c1afcSBram Moolenaar  [CODE]
791830c1afcSBram Moolenaar  call writefile(code, 'Xfoo')
792830c1afcSBram Moolenaar
793830c1afcSBram Moolenaar  call assert_fails('tag first', 'E432:')
794830c1afcSBram Moolenaar
795830c1afcSBram Moolenaar  call delete('Xtags')
796830c1afcSBram Moolenaar  call delete('Xfoo')
797830c1afcSBram Moolenaar  set tags&
798830c1afcSBram Moolenaar  %bwipe
799830c1afcSBram Moolenaarendfunc
800830c1afcSBram Moolenaar
801830c1afcSBram Moolenaar" Test for an unsorted tags file
802830c1afcSBram Moolenaarfunc Test_tag_fold()
803830c1afcSBram Moolenaar  call writefile([
804830c1afcSBram Moolenaar        \ "!_TAG_FILE_ENCODING\tutf-8\t//",
805830c1afcSBram Moolenaar        \ "!_TAG_FILE_SORTED\t2\t/0=unsorted, 1=sorted, 2=foldcase/",
806830c1afcSBram Moolenaar        \ "first\tXfoo\t1",
807830c1afcSBram Moolenaar        \ "second\tXfoo\t2",
808830c1afcSBram Moolenaar        \ "third\tXfoo\t3"],
809830c1afcSBram Moolenaar        \ 'Xtags')
810830c1afcSBram Moolenaar  set tags=Xtags
811830c1afcSBram Moolenaar  let code =<< trim [CODE]
812830c1afcSBram Moolenaar    int first() {}
813830c1afcSBram Moolenaar    int second() {}
814830c1afcSBram Moolenaar    int third() {}
815830c1afcSBram Moolenaar  [CODE]
816830c1afcSBram Moolenaar  call writefile(code, 'Xfoo')
817830c1afcSBram Moolenaar
818830c1afcSBram Moolenaar  enew
819830c1afcSBram Moolenaar  tag second
820830c1afcSBram Moolenaar  call assert_equal('Xfoo', bufname(''))
821830c1afcSBram Moolenaar  call assert_equal(2, line('.'))
822830c1afcSBram Moolenaar
823830c1afcSBram Moolenaar  call delete('Xtags')
824830c1afcSBram Moolenaar  call delete('Xfoo')
825830c1afcSBram Moolenaar  set tags&
826830c1afcSBram Moolenaar  %bwipe
827830c1afcSBram Moolenaarendfunc
828830c1afcSBram Moolenaar
829830c1afcSBram Moolenaar" Test for the :ltag command
830830c1afcSBram Moolenaarfunc Test_ltag()
831830c1afcSBram Moolenaar  call writefile([
832830c1afcSBram Moolenaar        \ "!_TAG_FILE_ENCODING\tutf-8\t//",
833830c1afcSBram Moolenaar        \ "first\tXfoo\t1",
834830c1afcSBram Moolenaar        \ "second\tXfoo\t/^int second() {}$/",
835830c1afcSBram Moolenaar        \ "third\tXfoo\t3"],
836830c1afcSBram Moolenaar        \ 'Xtags')
837830c1afcSBram Moolenaar  set tags=Xtags
838830c1afcSBram Moolenaar  let code =<< trim [CODE]
839830c1afcSBram Moolenaar    int first() {}
840830c1afcSBram Moolenaar    int second() {}
841830c1afcSBram Moolenaar    int third() {}
842830c1afcSBram Moolenaar  [CODE]
843830c1afcSBram Moolenaar  call writefile(code, 'Xfoo')
844830c1afcSBram Moolenaar
845830c1afcSBram Moolenaar  enew
846830c1afcSBram Moolenaar  call setloclist(0, [], 'f')
847830c1afcSBram Moolenaar  ltag third
848830c1afcSBram Moolenaar  call assert_equal('Xfoo', bufname(''))
849830c1afcSBram Moolenaar  call assert_equal(3, line('.'))
8506864efa5Sthinca  call assert_equal([{'lnum': 3, 'end_lnum': 0, 'bufnr': bufnr('Xfoo'),
8516864efa5Sthinca        \ 'col': 0, 'end_col': 0, 'pattern': '', 'valid': 1, 'vcol': 0,
8526864efa5Sthinca        \ 'nr': 0, 'type': '', 'module': '', 'text': 'third'}], getloclist(0))
853830c1afcSBram Moolenaar
854830c1afcSBram Moolenaar  ltag second
855830c1afcSBram Moolenaar  call assert_equal(2, line('.'))
8566864efa5Sthinca  call assert_equal([{'lnum': 0, 'end_lnum': 0, 'bufnr': bufnr('Xfoo'),
8576864efa5Sthinca        \ 'col': 0, 'end_col': 0, 'pattern': '^\Vint second() {}\$',
8586864efa5Sthinca        \ 'valid': 1, 'vcol': 0, 'nr': 0, 'type': '', 'module': '',
8596864efa5Sthinca        \ 'text': 'second'}], getloclist(0))
860830c1afcSBram Moolenaar
861830c1afcSBram Moolenaar  call delete('Xtags')
862830c1afcSBram Moolenaar  call delete('Xfoo')
863830c1afcSBram Moolenaar  set tags&
864830c1afcSBram Moolenaar  %bwipe
865830c1afcSBram Moolenaarendfunc
866830c1afcSBram Moolenaar
867830c1afcSBram Moolenaar" Test for setting the last search pattern to the tag search pattern
868830c1afcSBram Moolenaar" when cpoptions has 't'
869830c1afcSBram Moolenaarfunc Test_tag_last_search_pat()
870830c1afcSBram Moolenaar  call writefile([
871830c1afcSBram Moolenaar        \ "!_TAG_FILE_ENCODING\tutf-8\t//",
872830c1afcSBram Moolenaar        \ "first\tXfoo\t/^int first() {}/",
873830c1afcSBram Moolenaar        \ "second\tXfoo\t/^int second() {}/",
874830c1afcSBram Moolenaar        \ "third\tXfoo\t/^int third() {}/"],
875830c1afcSBram Moolenaar        \ 'Xtags')
876830c1afcSBram Moolenaar  set tags=Xtags
877830c1afcSBram Moolenaar  let code =<< trim [CODE]
878830c1afcSBram Moolenaar    int first() {}
879830c1afcSBram Moolenaar    int second() {}
880830c1afcSBram Moolenaar    int third() {}
881830c1afcSBram Moolenaar  [CODE]
882830c1afcSBram Moolenaar  call writefile(code, 'Xfoo')
883830c1afcSBram Moolenaar
884830c1afcSBram Moolenaar  enew
885830c1afcSBram Moolenaar  let save_cpo = &cpo
886830c1afcSBram Moolenaar  set cpo+=t
887830c1afcSBram Moolenaar  let @/ = ''
888830c1afcSBram Moolenaar  tag second
889830c1afcSBram Moolenaar  call assert_equal('^int second() {}', @/)
890830c1afcSBram Moolenaar  let &cpo = save_cpo
891830c1afcSBram Moolenaar
892830c1afcSBram Moolenaar  call delete('Xtags')
893830c1afcSBram Moolenaar  call delete('Xfoo')
894830c1afcSBram Moolenaar  set tags&
895830c1afcSBram Moolenaar  %bwipe
896830c1afcSBram Moolenaarendfunc
897830c1afcSBram Moolenaar
898a1353b53SBram Moolenaar" Tag stack tests
899a1353b53SBram Moolenaarfunc Test_tag_stack()
900830c1afcSBram Moolenaar  let l = []
901830c1afcSBram Moolenaar  for i in range(10, 31)
902830c1afcSBram Moolenaar    let l += ["var" .. i .. "\tXfoo\t/^int var" .. i .. ";$/"]
903830c1afcSBram Moolenaar  endfor
904830c1afcSBram Moolenaar  call writefile(l, 'Xtags')
905830c1afcSBram Moolenaar  set tags=Xtags
906830c1afcSBram Moolenaar
907830c1afcSBram Moolenaar  let l = []
908830c1afcSBram Moolenaar  for i in range(10, 31)
909830c1afcSBram Moolenaar    let l += ["int var" .. i .. ";"]
910830c1afcSBram Moolenaar  endfor
911830c1afcSBram Moolenaar  call writefile(l, 'Xfoo')
912830c1afcSBram Moolenaar
913a1353b53SBram Moolenaar  " Jump to a tag when the tag stack is full. Oldest entry should be removed.
914830c1afcSBram Moolenaar  enew
915830c1afcSBram Moolenaar  for i in range(10, 30)
916830c1afcSBram Moolenaar    exe "tag var" .. i
917830c1afcSBram Moolenaar  endfor
918830c1afcSBram Moolenaar  let l = gettagstack()
919830c1afcSBram Moolenaar  call assert_equal(20, l.length)
920830c1afcSBram Moolenaar  call assert_equal('var11', l.items[0].tagname)
921830c1afcSBram Moolenaar  tag var31
922830c1afcSBram Moolenaar  let l = gettagstack()
923830c1afcSBram Moolenaar  call assert_equal('var12', l.items[0].tagname)
924830c1afcSBram Moolenaar  call assert_equal('var31', l.items[19].tagname)
925830c1afcSBram Moolenaar
926a1353b53SBram Moolenaar  " Use tnext with a single match
927a1353b53SBram Moolenaar  call assert_fails('tnext', 'E427:')
928a1353b53SBram Moolenaar
929a1353b53SBram Moolenaar  " Jump to newest entry from the top of the stack
930830c1afcSBram Moolenaar  call assert_fails('tag', 'E556:')
931830c1afcSBram Moolenaar
932a1353b53SBram Moolenaar  " Pop with zero count from the top of the stack
933a1353b53SBram Moolenaar  call assert_fails('0pop', 'E556:')
934a1353b53SBram Moolenaar
935830c1afcSBram Moolenaar  " Pop from an unsaved buffer
936830c1afcSBram Moolenaar  enew!
937830c1afcSBram Moolenaar  call append(1, "sample text")
938830c1afcSBram Moolenaar  call assert_fails('pop', 'E37:')
939830c1afcSBram Moolenaar  call assert_equal(21, gettagstack().curidx)
940830c1afcSBram Moolenaar  enew!
941830c1afcSBram Moolenaar
942830c1afcSBram Moolenaar  " Pop all the entries in the tag stack
943830c1afcSBram Moolenaar  call assert_fails('30pop', 'E555:')
944830c1afcSBram Moolenaar
945a1353b53SBram Moolenaar  " Pop with a count when already at the bottom of the stack
946a1353b53SBram Moolenaar  call assert_fails('exe "normal 4\<C-T>"', 'E555:')
947a1353b53SBram Moolenaar  call assert_equal(1, gettagstack().curidx)
948a1353b53SBram Moolenaar
949a1353b53SBram Moolenaar  " Jump to newest entry from the bottom of the stack with zero count
950a1353b53SBram Moolenaar  call assert_fails('0tag', 'E555:')
951a1353b53SBram Moolenaar
952830c1afcSBram Moolenaar  " Pop the tag stack when it is empty
953830c1afcSBram Moolenaar  call settagstack(1, {'items' : []})
954830c1afcSBram Moolenaar  call assert_fails('pop', 'E73:')
955830c1afcSBram Moolenaar
956830c1afcSBram Moolenaar  call delete('Xtags')
957830c1afcSBram Moolenaar  call delete('Xfoo')
958830c1afcSBram Moolenaar  set tags&
959830c1afcSBram Moolenaar  %bwipe
960830c1afcSBram Moolenaarendfunc
961830c1afcSBram Moolenaar
962830c1afcSBram Moolenaar" Test for browsing multiple matching tags
963830c1afcSBram Moolenaarfunc Test_tag_multimatch()
964830c1afcSBram Moolenaar  call writefile([
965830c1afcSBram Moolenaar        \ "!_TAG_FILE_ENCODING\tutf-8\t//",
966830c1afcSBram Moolenaar        \ "first\tXfoo\t1",
967830c1afcSBram Moolenaar        \ "first\tXfoo\t2",
968830c1afcSBram Moolenaar        \ "first\tXfoo\t3"],
969830c1afcSBram Moolenaar        \ 'Xtags')
970830c1afcSBram Moolenaar  set tags=Xtags
971830c1afcSBram Moolenaar  let code =<< trim [CODE]
972830c1afcSBram Moolenaar    int first() {}
973830c1afcSBram Moolenaar    int first() {}
974830c1afcSBram Moolenaar    int first() {}
975830c1afcSBram Moolenaar  [CODE]
976830c1afcSBram Moolenaar  call writefile(code, 'Xfoo')
977830c1afcSBram Moolenaar
978a1353b53SBram Moolenaar  call settagstack(1, {'items' : []})
979830c1afcSBram Moolenaar  tag first
980830c1afcSBram Moolenaar  tlast
981830c1afcSBram Moolenaar  call assert_equal(3, line('.'))
982830c1afcSBram Moolenaar  call assert_fails('tnext', 'E428:')
983830c1afcSBram Moolenaar  tfirst
984830c1afcSBram Moolenaar  call assert_equal(1, line('.'))
985830c1afcSBram Moolenaar  call assert_fails('tprev', 'E425:')
986830c1afcSBram Moolenaar
987a1353b53SBram Moolenaar  tlast
988a1353b53SBram Moolenaar  call feedkeys("5\<CR>", 't')
989a1353b53SBram Moolenaar  tselect first
990a1353b53SBram Moolenaar  call assert_equal(2, gettagstack().curidx)
991a1353b53SBram Moolenaar
992a1353b53SBram Moolenaar  set ignorecase
993a1353b53SBram Moolenaar  tag FIRST
994a1353b53SBram Moolenaar  tnext
995a1353b53SBram Moolenaar  call assert_equal(2, line('.'))
996bc2b71d4SBram Moolenaar  tlast
997bc2b71d4SBram Moolenaar  tprev
998bc2b71d4SBram Moolenaar  call assert_equal(2, line('.'))
999bc2b71d4SBram Moolenaar  tNext
1000bc2b71d4SBram Moolenaar  call assert_equal(1, line('.'))
1001a1353b53SBram Moolenaar  set ignorecase&
1002a1353b53SBram Moolenaar
1003a1353b53SBram Moolenaar  call delete('Xtags')
1004a1353b53SBram Moolenaar  call delete('Xfoo')
1005a1353b53SBram Moolenaar  set tags&
1006a1353b53SBram Moolenaar  %bwipe
1007a1353b53SBram Moolenaarendfunc
1008a1353b53SBram Moolenaar
1009a1353b53SBram Moolenaar" Test for previewing multiple matching tags
1010a1353b53SBram Moolenaarfunc Test_preview_tag_multimatch()
1011a1353b53SBram Moolenaar  call writefile([
1012a1353b53SBram Moolenaar        \ "!_TAG_FILE_ENCODING\tutf-8\t//",
1013a1353b53SBram Moolenaar        \ "first\tXfoo\t1",
1014a1353b53SBram Moolenaar        \ "first\tXfoo\t2",
1015a1353b53SBram Moolenaar        \ "first\tXfoo\t3"],
1016a1353b53SBram Moolenaar        \ 'Xtags')
1017a1353b53SBram Moolenaar  set tags=Xtags
1018a1353b53SBram Moolenaar  let code =<< trim [CODE]
1019a1353b53SBram Moolenaar    int first() {}
1020a1353b53SBram Moolenaar    int first() {}
1021a1353b53SBram Moolenaar    int first() {}
1022a1353b53SBram Moolenaar  [CODE]
1023a1353b53SBram Moolenaar  call writefile(code, 'Xfoo')
1024a1353b53SBram Moolenaar
1025a1353b53SBram Moolenaar  enew | only
1026a1353b53SBram Moolenaar  ptag first
1027a1353b53SBram Moolenaar  ptlast
1028a1353b53SBram Moolenaar  wincmd P
1029a1353b53SBram Moolenaar  call assert_equal(3, line('.'))
1030a1353b53SBram Moolenaar  wincmd w
1031a1353b53SBram Moolenaar  call assert_fails('ptnext', 'E428:')
1032a1353b53SBram Moolenaar  ptprev
1033a1353b53SBram Moolenaar  wincmd P
1034a1353b53SBram Moolenaar  call assert_equal(2, line('.'))
1035a1353b53SBram Moolenaar  wincmd w
1036a1353b53SBram Moolenaar  ptfirst
1037a1353b53SBram Moolenaar  wincmd P
1038a1353b53SBram Moolenaar  call assert_equal(1, line('.'))
1039a1353b53SBram Moolenaar  wincmd w
1040a1353b53SBram Moolenaar  call assert_fails('ptprev', 'E425:')
1041a1353b53SBram Moolenaar  ptnext
1042a1353b53SBram Moolenaar  wincmd P
1043a1353b53SBram Moolenaar  call assert_equal(2, line('.'))
1044a1353b53SBram Moolenaar  wincmd w
1045a1353b53SBram Moolenaar  ptlast
1046a1353b53SBram Moolenaar  call feedkeys("5\<CR>", 't')
1047a1353b53SBram Moolenaar  ptselect first
1048a1353b53SBram Moolenaar  wincmd P
1049a1353b53SBram Moolenaar  call assert_equal(3, line('.'))
1050a1353b53SBram Moolenaar
1051a1353b53SBram Moolenaar  pclose
1052a1353b53SBram Moolenaar
1053a1353b53SBram Moolenaar  call delete('Xtags')
1054a1353b53SBram Moolenaar  call delete('Xfoo')
1055a1353b53SBram Moolenaar  set tags&
1056a1353b53SBram Moolenaar  %bwipe
1057a1353b53SBram Moolenaarendfunc
1058a1353b53SBram Moolenaar
1059a1353b53SBram Moolenaar" Test for jumping to multiple matching tags across multiple :tags commands
1060a1353b53SBram Moolenaarfunc Test_tnext_multimatch()
1061a1353b53SBram Moolenaar  call writefile([
1062a1353b53SBram Moolenaar        \ "!_TAG_FILE_ENCODING\tutf-8\t//",
1063a1353b53SBram Moolenaar        \ "first\tXfoo1\t1",
1064a1353b53SBram Moolenaar        \ "first\tXfoo2\t1",
1065a1353b53SBram Moolenaar        \ "first\tXfoo3\t1"],
1066a1353b53SBram Moolenaar        \ 'Xtags')
1067a1353b53SBram Moolenaar  set tags=Xtags
1068a1353b53SBram Moolenaar  let code =<< trim [CODE]
1069a1353b53SBram Moolenaar    int first() {}
1070a1353b53SBram Moolenaar  [CODE]
1071a1353b53SBram Moolenaar  call writefile(code, 'Xfoo1')
1072a1353b53SBram Moolenaar  call writefile(code, 'Xfoo2')
1073a1353b53SBram Moolenaar  call writefile(code, 'Xfoo3')
1074a1353b53SBram Moolenaar
1075a1353b53SBram Moolenaar  tag first
1076a1353b53SBram Moolenaar  tag first
1077a1353b53SBram Moolenaar  pop
1078a1353b53SBram Moolenaar  tnext
1079a1353b53SBram Moolenaar  tnext
1080a1353b53SBram Moolenaar  call assert_fails('tnext', 'E428:')
1081a1353b53SBram Moolenaar
1082a1353b53SBram Moolenaar  call delete('Xtags')
1083a1353b53SBram Moolenaar  call delete('Xfoo1')
1084a1353b53SBram Moolenaar  call delete('Xfoo2')
1085a1353b53SBram Moolenaar  call delete('Xfoo3')
1086a1353b53SBram Moolenaar  set tags&
1087a1353b53SBram Moolenaar  %bwipe
1088a1353b53SBram Moolenaarendfunc
1089a1353b53SBram Moolenaar
1090a1353b53SBram Moolenaar" Test for jumping to multiple matching tags in non-existing files
1091a1353b53SBram Moolenaarfunc Test_multimatch_non_existing_files()
1092a1353b53SBram Moolenaar  call writefile([
1093a1353b53SBram Moolenaar        \ "!_TAG_FILE_ENCODING\tutf-8\t//",
1094a1353b53SBram Moolenaar        \ "first\tXfoo1\t1",
1095a1353b53SBram Moolenaar        \ "first\tXfoo2\t1",
1096a1353b53SBram Moolenaar        \ "first\tXfoo3\t1"],
1097a1353b53SBram Moolenaar        \ 'Xtags')
1098a1353b53SBram Moolenaar  set tags=Xtags
1099a1353b53SBram Moolenaar
1100a1353b53SBram Moolenaar  call settagstack(1, {'items' : []})
1101a1353b53SBram Moolenaar  call assert_fails('tag first', 'E429:')
1102a1353b53SBram Moolenaar  call assert_equal(3, gettagstack().items[0].matchnr)
1103a1353b53SBram Moolenaar
1104a1353b53SBram Moolenaar  call delete('Xtags')
1105a1353b53SBram Moolenaar  set tags&
1106a1353b53SBram Moolenaar  %bwipe
1107a1353b53SBram Moolenaarendfunc
1108a1353b53SBram Moolenaar
1109a1353b53SBram Moolenaarfunc Test_tselect_listing()
1110a1353b53SBram Moolenaar  call writefile([
1111a1353b53SBram Moolenaar        \ "!_TAG_FILE_ENCODING\tutf-8\t//",
1112a1353b53SBram Moolenaar        \ "first\tXfoo\t1" .. ';"' .. "\tv\ttyperef:typename:int\tfile:",
1113845e0ee5SBram Moolenaar        \ "first\tXfoo\t2" .. ';"' .. "\tkind:v\ttyperef:typename:char\tfile:"],
1114a1353b53SBram Moolenaar        \ 'Xtags')
1115a1353b53SBram Moolenaar  set tags=Xtags
1116a1353b53SBram Moolenaar
1117a1353b53SBram Moolenaar  let code =<< trim [CODE]
1118a1353b53SBram Moolenaar    static int first;
1119a1353b53SBram Moolenaar    static char first;
1120a1353b53SBram Moolenaar  [CODE]
1121a1353b53SBram Moolenaar  call writefile(code, 'Xfoo')
1122a1353b53SBram Moolenaar
1123a1353b53SBram Moolenaar  call feedkeys("\<CR>", "t")
1124a1353b53SBram Moolenaar  let l = split(execute("tselect first"), "\n")
1125a1353b53SBram Moolenaar  let expected =<< [DATA]
1126a1353b53SBram Moolenaar  # pri kind tag               file
1127a1353b53SBram Moolenaar  1 FS  v    first             Xfoo
1128a1353b53SBram Moolenaar               typeref:typename:int
1129a1353b53SBram Moolenaar               1
1130a1353b53SBram Moolenaar  2 FS  v    first             Xfoo
1131a1353b53SBram Moolenaar               typeref:typename:char
1132a1353b53SBram Moolenaar               2
113313b8205bSBram MoolenaarType number and <Enter> (q or empty cancels):
1134a1353b53SBram Moolenaar[DATA]
1135a1353b53SBram Moolenaar  call assert_equal(expected, l)
1136a1353b53SBram Moolenaar
1137830c1afcSBram Moolenaar  call delete('Xtags')
1138830c1afcSBram Moolenaar  call delete('Xfoo')
1139830c1afcSBram Moolenaar  set tags&
1140830c1afcSBram Moolenaar  %bwipe
1141830c1afcSBram Moolenaarendfunc
1142830c1afcSBram Moolenaar
1143bc2b71d4SBram Moolenaar" Test for :isearch, :ilist, :ijump and :isplit commands
1144bc2b71d4SBram Moolenaar" Test for [i, ]i, [I, ]I, [ CTRL-I, ] CTRL-I and CTRL-W i commands
1145bc2b71d4SBram Moolenaarfunc Test_inc_search()
1146bc2b71d4SBram Moolenaar  new
11478a9bc95eSBram Moolenaar  call setline(1, ['1:foo', '2:foo', 'foo', '3:foo', '4:foo', '==='])
1148bc2b71d4SBram Moolenaar  call cursor(3, 1)
1149bc2b71d4SBram Moolenaar
1150bc2b71d4SBram Moolenaar  " Test for [i and ]i
1151bc2b71d4SBram Moolenaar  call assert_equal('1:foo', execute('normal [i'))
1152bc2b71d4SBram Moolenaar  call assert_equal('2:foo', execute('normal 2[i'))
1153bc2b71d4SBram Moolenaar  call assert_fails('normal 3[i', 'E387:')
1154bc2b71d4SBram Moolenaar  call assert_equal('3:foo', execute('normal ]i'))
1155bc2b71d4SBram Moolenaar  call assert_equal('4:foo', execute('normal 2]i'))
1156bc2b71d4SBram Moolenaar  call assert_fails('normal 3]i', 'E389:')
11578a9bc95eSBram Moolenaar  call assert_fails('normal G]i', 'E349:')
11588a9bc95eSBram Moolenaar  call assert_fails('normal [i', 'E349:')
11598a9bc95eSBram Moolenaar  call cursor(3, 1)
1160bc2b71d4SBram Moolenaar
1161bc2b71d4SBram Moolenaar  " Test for :isearch
1162bc2b71d4SBram Moolenaar  call assert_equal('1:foo', execute('isearch foo'))
1163bc2b71d4SBram Moolenaar  call assert_equal('3:foo', execute('isearch 4 /foo/'))
1164bc2b71d4SBram Moolenaar  call assert_fails('isearch 3 foo', 'E387:')
1165bc2b71d4SBram Moolenaar  call assert_equal('3:foo', execute('+1,$isearch foo'))
1166bc2b71d4SBram Moolenaar  call assert_fails('1,.-1isearch 3 foo', 'E389:')
1167bc2b71d4SBram Moolenaar  call assert_fails('isearch bar', 'E389:')
1168bc2b71d4SBram Moolenaar  call assert_fails('isearch /foo/3', 'E488:')
1169bc2b71d4SBram Moolenaar
1170bc2b71d4SBram Moolenaar  " Test for [I and ]I
1171bc2b71d4SBram Moolenaar  call assert_equal([
1172bc2b71d4SBram Moolenaar        \ '  1:    1 1:foo',
1173bc2b71d4SBram Moolenaar        \ '  2:    2 2:foo',
1174bc2b71d4SBram Moolenaar        \ '  3:    3 foo',
1175bc2b71d4SBram Moolenaar        \ '  4:    4 3:foo',
1176bc2b71d4SBram Moolenaar        \ '  5:    5 4:foo'], split(execute('normal [I'), "\n"))
1177bc2b71d4SBram Moolenaar  call assert_equal([
1178bc2b71d4SBram Moolenaar        \ '  1:    4 3:foo',
1179bc2b71d4SBram Moolenaar        \ '  2:    5 4:foo'], split(execute('normal ]I'), "\n"))
11808a9bc95eSBram Moolenaar  call assert_fails('normal G]I', 'E349:')
11818a9bc95eSBram Moolenaar  call assert_fails('normal [I', 'E349:')
11828a9bc95eSBram Moolenaar  call cursor(3, 1)
1183bc2b71d4SBram Moolenaar
1184bc2b71d4SBram Moolenaar  " Test for :ilist
1185bc2b71d4SBram Moolenaar  call assert_equal([
1186bc2b71d4SBram Moolenaar        \ '  1:    1 1:foo',
1187bc2b71d4SBram Moolenaar        \ '  2:    2 2:foo',
1188bc2b71d4SBram Moolenaar        \ '  3:    3 foo',
1189bc2b71d4SBram Moolenaar        \ '  4:    4 3:foo',
1190bc2b71d4SBram Moolenaar        \ '  5:    5 4:foo'], split(execute('ilist foo'), "\n"))
1191bc2b71d4SBram Moolenaar  call assert_equal([
1192bc2b71d4SBram Moolenaar        \ '  1:    4 3:foo',
1193bc2b71d4SBram Moolenaar        \ '  2:    5 4:foo'], split(execute('+1,$ilist /foo/'), "\n"))
1194bc2b71d4SBram Moolenaar  call assert_fails('ilist bar', 'E389:')
1195bc2b71d4SBram Moolenaar
1196bc2b71d4SBram Moolenaar  " Test for [ CTRL-I and ] CTRL-I
1197bc2b71d4SBram Moolenaar  exe "normal [\t"
1198bc2b71d4SBram Moolenaar  call assert_equal([1, 3], [line('.'), col('.')])
1199bc2b71d4SBram Moolenaar  exe "normal 2j4[\t"
1200bc2b71d4SBram Moolenaar  call assert_equal([4, 3], [line('.'), col('.')])
1201bc2b71d4SBram Moolenaar  call assert_fails("normal k3[\t", 'E387:')
1202bc2b71d4SBram Moolenaar  call assert_fails("normal 6[\t", 'E389:')
1203bc2b71d4SBram Moolenaar  exe "normal ]\t"
1204bc2b71d4SBram Moolenaar  call assert_equal([4, 3], [line('.'), col('.')])
1205bc2b71d4SBram Moolenaar  exe "normal k2]\t"
1206bc2b71d4SBram Moolenaar  call assert_equal([5, 3], [line('.'), col('.')])
1207bc2b71d4SBram Moolenaar  call assert_fails("normal 2k3]\t", 'E389:')
12088a9bc95eSBram Moolenaar  call assert_fails("normal G[\t", 'E349:')
12098a9bc95eSBram Moolenaar  call assert_fails("normal ]\t", 'E349:')
12108a9bc95eSBram Moolenaar  call cursor(3, 1)
1211bc2b71d4SBram Moolenaar
1212bc2b71d4SBram Moolenaar  " Test for :ijump
1213bc2b71d4SBram Moolenaar  call cursor(3, 1)
1214bc2b71d4SBram Moolenaar  ijump foo
1215bc2b71d4SBram Moolenaar  call assert_equal([1, 3], [line('.'), col('.')])
1216bc2b71d4SBram Moolenaar  call cursor(3, 1)
1217bc2b71d4SBram Moolenaar  ijump 4 /foo/
1218bc2b71d4SBram Moolenaar  call assert_equal([4, 3], [line('.'), col('.')])
1219bc2b71d4SBram Moolenaar  call cursor(3, 1)
1220bc2b71d4SBram Moolenaar  call assert_fails('ijump 3 foo', 'E387:')
1221bc2b71d4SBram Moolenaar  +,$ijump 2 foo
1222bc2b71d4SBram Moolenaar  call assert_equal([5, 3], [line('.'), col('.')])
1223bc2b71d4SBram Moolenaar  call assert_fails('ijump bar', 'E389:')
1224bc2b71d4SBram Moolenaar
1225bc2b71d4SBram Moolenaar  " Test for CTRL-W i
1226bc2b71d4SBram Moolenaar  call cursor(3, 1)
1227bc2b71d4SBram Moolenaar  wincmd i
1228bc2b71d4SBram Moolenaar  call assert_equal([1, 3, 3], [line('.'), col('.'), winnr('$')])
1229bc2b71d4SBram Moolenaar  close
1230bc2b71d4SBram Moolenaar  5wincmd i
1231bc2b71d4SBram Moolenaar  call assert_equal([5, 3, 3], [line('.'), col('.'), winnr('$')])
1232bc2b71d4SBram Moolenaar  close
1233bc2b71d4SBram Moolenaar  call assert_fails('3wincmd i', 'E387:')
1234bc2b71d4SBram Moolenaar  call assert_fails('6wincmd i', 'E389:')
12358a9bc95eSBram Moolenaar  call assert_fails("normal G\<C-W>i", 'E349:')
12368a9bc95eSBram Moolenaar  call cursor(3, 1)
1237bc2b71d4SBram Moolenaar
1238bc2b71d4SBram Moolenaar  " Test for :isplit
1239bc2b71d4SBram Moolenaar  isplit foo
1240bc2b71d4SBram Moolenaar  call assert_equal([1, 3, 3], [line('.'), col('.'), winnr('$')])
1241bc2b71d4SBram Moolenaar  close
1242bc2b71d4SBram Moolenaar  isplit 5 /foo/
1243bc2b71d4SBram Moolenaar  call assert_equal([5, 3, 3], [line('.'), col('.'), winnr('$')])
1244bc2b71d4SBram Moolenaar  close
1245bc2b71d4SBram Moolenaar  call assert_fails('isplit 3 foo', 'E387:')
1246bc2b71d4SBram Moolenaar  call assert_fails('isplit 6 foo', 'E389:')
1247bc2b71d4SBram Moolenaar  call assert_fails('isplit bar', 'E389:')
1248bc2b71d4SBram Moolenaar
1249bc2b71d4SBram Moolenaar  close!
1250bc2b71d4SBram Moolenaarendfunc
1251bc2b71d4SBram Moolenaar
1252bc2b71d4SBram Moolenaar" Test for :dsearch, :dlist, :djump and :dsplit commands
1253bc2b71d4SBram Moolenaar" Test for [d, ]d, [D, ]D, [ CTRL-D, ] CTRL-D and CTRL-W d commands
12541671f448SBram Moolenaarfunc Test_macro_search()
1255bc2b71d4SBram Moolenaar  new
1256bc2b71d4SBram Moolenaar  call setline(1, ['#define FOO 1', '#define FOO 2', '#define FOO 3',
1257bc2b71d4SBram Moolenaar        \ '#define FOO 4', '#define FOO 5'])
1258bc2b71d4SBram Moolenaar  call cursor(3, 9)
1259bc2b71d4SBram Moolenaar
1260bc2b71d4SBram Moolenaar  " Test for [d and ]d
1261bc2b71d4SBram Moolenaar  call assert_equal('#define FOO 1', execute('normal [d'))
1262bc2b71d4SBram Moolenaar  call assert_equal('#define FOO 2', execute('normal 2[d'))
1263bc2b71d4SBram Moolenaar  call assert_fails('normal 3[d', 'E387:')
1264bc2b71d4SBram Moolenaar  call assert_equal('#define FOO 4', execute('normal ]d'))
1265bc2b71d4SBram Moolenaar  call assert_equal('#define FOO 5', execute('normal 2]d'))
1266bc2b71d4SBram Moolenaar  call assert_fails('normal 3]d', 'E388:')
1267bc2b71d4SBram Moolenaar
1268bc2b71d4SBram Moolenaar  " Test for :dsearch
1269bc2b71d4SBram Moolenaar  call assert_equal('#define FOO 1', execute('dsearch FOO'))
1270bc2b71d4SBram Moolenaar  call assert_equal('#define FOO 5', execute('dsearch 5 /FOO/'))
1271bc2b71d4SBram Moolenaar  call assert_fails('dsearch 3 FOO', 'E387:')
1272bc2b71d4SBram Moolenaar  call assert_equal('#define FOO 4', execute('+1,$dsearch FOO'))
1273bc2b71d4SBram Moolenaar  call assert_fails('1,.-1dsearch 3 FOO', 'E388:')
1274bc2b71d4SBram Moolenaar  call assert_fails('dsearch BAR', 'E388:')
1275bc2b71d4SBram Moolenaar
1276bc2b71d4SBram Moolenaar  " Test for [D and ]D
1277bc2b71d4SBram Moolenaar  call assert_equal([
1278bc2b71d4SBram Moolenaar        \ '  1:    1 #define FOO 1',
1279bc2b71d4SBram Moolenaar        \ '  2:    2 #define FOO 2',
1280bc2b71d4SBram Moolenaar        \ '  3:    3 #define FOO 3',
1281bc2b71d4SBram Moolenaar        \ '  4:    4 #define FOO 4',
1282bc2b71d4SBram Moolenaar        \ '  5:    5 #define FOO 5'], split(execute('normal [D'), "\n"))
1283bc2b71d4SBram Moolenaar  call assert_equal([
1284bc2b71d4SBram Moolenaar        \ '  1:    4 #define FOO 4',
1285bc2b71d4SBram Moolenaar        \ '  2:    5 #define FOO 5'], split(execute('normal ]D'), "\n"))
1286bc2b71d4SBram Moolenaar
1287bc2b71d4SBram Moolenaar  " Test for :dlist
1288bc2b71d4SBram Moolenaar  call assert_equal([
1289bc2b71d4SBram Moolenaar        \ '  1:    1 #define FOO 1',
1290bc2b71d4SBram Moolenaar        \ '  2:    2 #define FOO 2',
1291bc2b71d4SBram Moolenaar        \ '  3:    3 #define FOO 3',
1292bc2b71d4SBram Moolenaar        \ '  4:    4 #define FOO 4',
1293bc2b71d4SBram Moolenaar        \ '  5:    5 #define FOO 5'], split(execute('dlist FOO'), "\n"))
1294bc2b71d4SBram Moolenaar  call assert_equal([
1295bc2b71d4SBram Moolenaar        \ '  1:    4 #define FOO 4',
1296bc2b71d4SBram Moolenaar        \ '  2:    5 #define FOO 5'], split(execute('+1,$dlist /FOO/'), "\n"))
1297bc2b71d4SBram Moolenaar  call assert_fails('dlist BAR', 'E388:')
1298bc2b71d4SBram Moolenaar
1299bc2b71d4SBram Moolenaar  " Test for [ CTRL-D and ] CTRL-D
1300bc2b71d4SBram Moolenaar  exe "normal [\<C-D>"
1301bc2b71d4SBram Moolenaar  call assert_equal([1, 9], [line('.'), col('.')])
1302bc2b71d4SBram Moolenaar  exe "normal 2j4[\<C-D>"
1303bc2b71d4SBram Moolenaar  call assert_equal([4, 9], [line('.'), col('.')])
1304bc2b71d4SBram Moolenaar  call assert_fails("normal k3[\<C-D>", 'E387:')
1305bc2b71d4SBram Moolenaar  call assert_fails("normal 6[\<C-D>", 'E388:')
1306bc2b71d4SBram Moolenaar  exe "normal ]\<C-D>"
1307bc2b71d4SBram Moolenaar  call assert_equal([4, 9], [line('.'), col('.')])
1308bc2b71d4SBram Moolenaar  exe "normal k2]\<C-D>"
1309bc2b71d4SBram Moolenaar  call assert_equal([5, 9], [line('.'), col('.')])
1310bc2b71d4SBram Moolenaar  call assert_fails("normal 2k3]\<C-D>", 'E388:')
1311bc2b71d4SBram Moolenaar
1312bc2b71d4SBram Moolenaar  " Test for :djump
1313bc2b71d4SBram Moolenaar  call cursor(3, 9)
1314bc2b71d4SBram Moolenaar  djump FOO
1315bc2b71d4SBram Moolenaar  call assert_equal([1, 9], [line('.'), col('.')])
1316bc2b71d4SBram Moolenaar  call cursor(3, 9)
1317bc2b71d4SBram Moolenaar  djump 4 /FOO/
1318bc2b71d4SBram Moolenaar  call assert_equal([4, 9], [line('.'), col('.')])
1319bc2b71d4SBram Moolenaar  call cursor(3, 9)
1320bc2b71d4SBram Moolenaar  call assert_fails('djump 3 FOO', 'E387:')
1321bc2b71d4SBram Moolenaar  +,$djump 2 FOO
1322bc2b71d4SBram Moolenaar  call assert_equal([5, 9], [line('.'), col('.')])
1323bc2b71d4SBram Moolenaar  call assert_fails('djump BAR', 'E388:')
1324bc2b71d4SBram Moolenaar
1325bc2b71d4SBram Moolenaar  " Test for CTRL-W d
1326bc2b71d4SBram Moolenaar  call cursor(3, 9)
1327bc2b71d4SBram Moolenaar  wincmd d
1328bc2b71d4SBram Moolenaar  call assert_equal([1, 9, 3], [line('.'), col('.'), winnr('$')])
1329bc2b71d4SBram Moolenaar  close
1330bc2b71d4SBram Moolenaar  5wincmd d
1331bc2b71d4SBram Moolenaar  call assert_equal([5, 9, 3], [line('.'), col('.'), winnr('$')])
1332bc2b71d4SBram Moolenaar  close
1333bc2b71d4SBram Moolenaar  call assert_fails('3wincmd d', 'E387:')
1334bc2b71d4SBram Moolenaar  call assert_fails('6wincmd d', 'E388:')
13355d3c9f8cSBram Moolenaar  new
13365d3c9f8cSBram Moolenaar  call assert_fails("normal \<C-W>d", 'E349:')
13375d3c9f8cSBram Moolenaar  call assert_fails("normal \<C-W>\<C-D>", 'E349:')
13385d3c9f8cSBram Moolenaar  close
1339bc2b71d4SBram Moolenaar
1340bc2b71d4SBram Moolenaar  " Test for :dsplit
1341bc2b71d4SBram Moolenaar  dsplit FOO
1342bc2b71d4SBram Moolenaar  call assert_equal([1, 9, 3], [line('.'), col('.'), winnr('$')])
1343bc2b71d4SBram Moolenaar  close
1344bc2b71d4SBram Moolenaar  dsplit 5 /FOO/
1345bc2b71d4SBram Moolenaar  call assert_equal([5, 9, 3], [line('.'), col('.'), winnr('$')])
1346bc2b71d4SBram Moolenaar  close
1347bc2b71d4SBram Moolenaar  call assert_fails('dsplit 3 FOO', 'E387:')
1348bc2b71d4SBram Moolenaar  call assert_fails('dsplit 6 FOO', 'E388:')
1349bc2b71d4SBram Moolenaar  call assert_fails('dsplit BAR', 'E388:')
1350bc2b71d4SBram Moolenaar
1351bc2b71d4SBram Moolenaar  close!
1352bc2b71d4SBram Moolenaarendfunc
1353bc2b71d4SBram Moolenaar
13541671f448SBram Moolenaar" Test for [*, [/, ]* and ]/
13551671f448SBram Moolenaarfunc Test_comment_search()
13561671f448SBram Moolenaar  new
13571671f448SBram Moolenaar  call setline(1, ['', '/*', ' *', ' *', ' */'])
13581671f448SBram Moolenaar  normal! 4gg[/
13591671f448SBram Moolenaar  call assert_equal([2, 1], [line('.'), col('.')])
13601671f448SBram Moolenaar  normal! 3gg[*
13611671f448SBram Moolenaar  call assert_equal([2, 1], [line('.'), col('.')])
13621671f448SBram Moolenaar  normal! 3gg]/
13631671f448SBram Moolenaar  call assert_equal([5, 3], [line('.'), col('.')])
13641671f448SBram Moolenaar  normal! 3gg]*
13651671f448SBram Moolenaar  call assert_equal([5, 3], [line('.'), col('.')])
13661671f448SBram Moolenaar  %d
13671671f448SBram Moolenaar  call setline(1, ['', '/*', ' *', ' *'])
13681671f448SBram Moolenaar  call assert_beeps('normal! 3gg]/')
13691671f448SBram Moolenaar  %d
13701671f448SBram Moolenaar  call setline(1, ['', ' *', ' *', ' */'])
13711671f448SBram Moolenaar  call assert_beeps('normal! 4gg[/')
13721671f448SBram Moolenaar  %d
13731671f448SBram Moolenaar  call setline(1, '        /* comment */')
13741671f448SBram Moolenaar  normal! 15|[/
13751671f448SBram Moolenaar  call assert_equal(9, col('.'))
13761671f448SBram Moolenaar  normal! 15|]/
13771671f448SBram Moolenaar  call assert_equal(21, col('.'))
13781671f448SBram Moolenaar  call setline(1, '         comment */')
13791671f448SBram Moolenaar  call assert_beeps('normal! 15|[/')
13801671f448SBram Moolenaar  call setline(1, '        /* comment')
13811671f448SBram Moolenaar  call assert_beeps('normal! 15|]/')
13821671f448SBram Moolenaar  close!
13831671f448SBram Moolenaarendfunc
13841671f448SBram Moolenaar
13853d9207adSBram Moolenaar" Test for the 'taglength' option
13863d9207adSBram Moolenaarfunc Test_tag_length()
13873d9207adSBram Moolenaar  set tags=Xtags
13883d9207adSBram Moolenaar  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
13893d9207adSBram Moolenaar        \ "tame\tXfile1\t1;",
13903d9207adSBram Moolenaar        \ "tape\tXfile2\t1;"], 'Xtags')
13913d9207adSBram Moolenaar  call writefile(['tame'], 'Xfile1')
13923d9207adSBram Moolenaar  call writefile(['tape'], 'Xfile2')
13933d9207adSBram Moolenaar
13943d9207adSBram Moolenaar  " Jumping to the tag 'tape', should instead jump to 'tame'
13953d9207adSBram Moolenaar  new
13963d9207adSBram Moolenaar  set taglength=2
13973d9207adSBram Moolenaar  tag tape
13983d9207adSBram Moolenaar  call assert_equal('Xfile1', @%)
13993d9207adSBram Moolenaar  " Tag search should jump to the right tag
14003d9207adSBram Moolenaar  enew
14013d9207adSBram Moolenaar  tag /^tape$
14023d9207adSBram Moolenaar  call assert_equal('Xfile2', @%)
14033d9207adSBram Moolenaar
14043d9207adSBram Moolenaar  call delete('Xtags')
14053d9207adSBram Moolenaar  call delete('Xfile1')
14063d9207adSBram Moolenaar  call delete('Xfile2')
14073d9207adSBram Moolenaar  set tags& taglength&
14083d9207adSBram Moolenaarendfunc
14093d9207adSBram Moolenaar
1410845e0ee5SBram Moolenaar" Tests for errors in a tags file
1411845e0ee5SBram Moolenaarfunc Test_tagfile_errors()
1412845e0ee5SBram Moolenaar  set tags=Xtags
1413845e0ee5SBram Moolenaar
1414845e0ee5SBram Moolenaar  " missing search pattern or line number for a tag
1415845e0ee5SBram Moolenaar  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
1416845e0ee5SBram Moolenaar        \ "foo\tXfile\t"], 'Xtags', 'b')
1417845e0ee5SBram Moolenaar  call writefile(['foo'], 'Xfile')
1418845e0ee5SBram Moolenaar
1419845e0ee5SBram Moolenaar  enew
1420845e0ee5SBram Moolenaar  tag foo
1421845e0ee5SBram Moolenaar  call assert_equal('', @%)
1422845e0ee5SBram Moolenaar  let caught_431 = v:false
1423845e0ee5SBram Moolenaar  try
1424845e0ee5SBram Moolenaar    eval taglist('.*')
1425845e0ee5SBram Moolenaar  catch /:E431:/
1426845e0ee5SBram Moolenaar    let caught_431 = v:true
1427845e0ee5SBram Moolenaar  endtry
1428845e0ee5SBram Moolenaar  call assert_equal(v:true, caught_431)
1429845e0ee5SBram Moolenaar
1430845e0ee5SBram Moolenaar  call delete('Xtags')
1431845e0ee5SBram Moolenaar  call delete('Xfile')
1432845e0ee5SBram Moolenaar  set tags&
1433845e0ee5SBram Moolenaarendfunc
1434845e0ee5SBram Moolenaar
1435845e0ee5SBram Moolenaar" When :stag fails to open the file, should close the new window
1436845e0ee5SBram Moolenaarfunc Test_stag_close_window_on_error()
1437845e0ee5SBram Moolenaar  new | only
1438845e0ee5SBram Moolenaar  set tags=Xtags
1439845e0ee5SBram Moolenaar  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
1440845e0ee5SBram Moolenaar        \ "foo\tXfile\t1"], 'Xtags')
1441845e0ee5SBram Moolenaar  call writefile(['foo'], 'Xfile')
1442845e0ee5SBram Moolenaar  call writefile([], '.Xfile.swp')
1443845e0ee5SBram Moolenaar  " Remove the catch-all that runtest.vim adds
1444845e0ee5SBram Moolenaar  au! SwapExists
1445845e0ee5SBram Moolenaar  augroup StagTest
1446845e0ee5SBram Moolenaar    au!
1447845e0ee5SBram Moolenaar    autocmd SwapExists Xfile let v:swapchoice='q'
1448845e0ee5SBram Moolenaar  augroup END
1449845e0ee5SBram Moolenaar
1450845e0ee5SBram Moolenaar  stag foo
1451845e0ee5SBram Moolenaar  call assert_equal(1, winnr('$'))
1452845e0ee5SBram Moolenaar  call assert_equal('', @%)
1453845e0ee5SBram Moolenaar
1454845e0ee5SBram Moolenaar  augroup StagTest
1455845e0ee5SBram Moolenaar    au!
1456845e0ee5SBram Moolenaar  augroup END
1457845e0ee5SBram Moolenaar  call delete('Xfile')
1458845e0ee5SBram Moolenaar  call delete('.Xfile.swp')
1459845e0ee5SBram Moolenaar  set tags&
1460845e0ee5SBram Moolenaarendfunc
1461845e0ee5SBram Moolenaar
14629e4d8215SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
1463