mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	vim-patch:8.2.0092: tags functionality insufficiently tested
Problem:    Tags functionality insufficiently tested.
Solution:   Add more tags tests. (Yegappan Lakshmanan, closes vim/vim#5446)
a1353b5352
			
			
This commit is contained in:
		@@ -641,7 +641,7 @@ func Test_tag_envvar()
 | 
				
			|||||||
endfunc
 | 
					endfunc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
" Test for :ptag
 | 
					" Test for :ptag
 | 
				
			||||||
func Test_ptag()
 | 
					func Test_tag_preview()
 | 
				
			||||||
  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
 | 
					  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
 | 
				
			||||||
        \ "second\tXfile1\t2",
 | 
					        \ "second\tXfile1\t2",
 | 
				
			||||||
        \ "third\tXfile1\t3",],
 | 
					        \ "third\tXfile1\t3",],
 | 
				
			||||||
@@ -655,11 +655,19 @@ func Test_ptag()
 | 
				
			|||||||
  call assert_equal(2, winnr('$'))
 | 
					  call assert_equal(2, winnr('$'))
 | 
				
			||||||
  call assert_equal(1, getwinvar(1, '&previewwindow'))
 | 
					  call assert_equal(1, getwinvar(1, '&previewwindow'))
 | 
				
			||||||
  call assert_equal(0, getwinvar(2, '&previewwindow'))
 | 
					  call assert_equal(0, getwinvar(2, '&previewwindow'))
 | 
				
			||||||
  wincmd w
 | 
					  wincmd P
 | 
				
			||||||
  call assert_equal(3, line('.'))
 | 
					  call assert_equal(3, line('.'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  " jump to the tag again
 | 
					  " jump to the tag again
 | 
				
			||||||
 | 
					  wincmd w
 | 
				
			||||||
  ptag third
 | 
					  ptag third
 | 
				
			||||||
 | 
					  wincmd P
 | 
				
			||||||
 | 
					  call assert_equal(3, line('.'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  " jump to the newer tag
 | 
				
			||||||
 | 
					  wincmd w
 | 
				
			||||||
 | 
					  ptag
 | 
				
			||||||
 | 
					  wincmd P
 | 
				
			||||||
  call assert_equal(3, line('.'))
 | 
					  call assert_equal(3, line('.'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  " close the preview window
 | 
					  " close the preview window
 | 
				
			||||||
@@ -829,8 +837,8 @@ func Test_tag_last_search_pat()
 | 
				
			|||||||
  %bwipe
 | 
					  %bwipe
 | 
				
			||||||
endfunc
 | 
					endfunc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
" Test for jumping to a tag when the tag stack is full
 | 
					" Tag stack tests
 | 
				
			||||||
func Test_tag_stack_full()
 | 
					func Test_tag_stack()
 | 
				
			||||||
  let l = []
 | 
					  let l = []
 | 
				
			||||||
  for i in range(10, 31)
 | 
					  for i in range(10, 31)
 | 
				
			||||||
    let l += ["var" .. i .. "\tXfoo\t/^int var" .. i .. ";$/"]
 | 
					    let l += ["var" .. i .. "\tXfoo\t/^int var" .. i .. ";$/"]
 | 
				
			||||||
@@ -844,6 +852,7 @@ func Test_tag_stack_full()
 | 
				
			|||||||
  endfor
 | 
					  endfor
 | 
				
			||||||
  call writefile(l, 'Xfoo')
 | 
					  call writefile(l, 'Xfoo')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  " Jump to a tag when the tag stack is full. Oldest entry should be removed.
 | 
				
			||||||
  enew
 | 
					  enew
 | 
				
			||||||
  for i in range(10, 30)
 | 
					  for i in range(10, 30)
 | 
				
			||||||
    exe "tag var" .. i
 | 
					    exe "tag var" .. i
 | 
				
			||||||
@@ -856,9 +865,15 @@ func Test_tag_stack_full()
 | 
				
			|||||||
  call assert_equal('var12', l.items[0].tagname)
 | 
					  call assert_equal('var12', l.items[0].tagname)
 | 
				
			||||||
  call assert_equal('var31', l.items[19].tagname)
 | 
					  call assert_equal('var31', l.items[19].tagname)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  " Jump from the top of the stack
 | 
					  " Use tnext with a single match
 | 
				
			||||||
 | 
					  call assert_fails('tnext', 'E427:')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  " Jump to newest entry from the top of the stack
 | 
				
			||||||
  call assert_fails('tag', 'E556:')
 | 
					  call assert_fails('tag', 'E556:')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  " Pop with zero count from the top of the stack
 | 
				
			||||||
 | 
					  call assert_fails('0pop', 'E556:')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  " Pop from an unsaved buffer
 | 
					  " Pop from an unsaved buffer
 | 
				
			||||||
  enew!
 | 
					  enew!
 | 
				
			||||||
  call append(1, "sample text")
 | 
					  call append(1, "sample text")
 | 
				
			||||||
@@ -869,6 +884,13 @@ func Test_tag_stack_full()
 | 
				
			|||||||
  " Pop all the entries in the tag stack
 | 
					  " Pop all the entries in the tag stack
 | 
				
			||||||
  call assert_fails('30pop', 'E555:')
 | 
					  call assert_fails('30pop', 'E555:')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  " Pop with a count when already at the bottom of the stack
 | 
				
			||||||
 | 
					  call assert_fails('exe "normal 4\<C-T>"', 'E555:')
 | 
				
			||||||
 | 
					  call assert_equal(1, gettagstack().curidx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  " Jump to newest entry from the bottom of the stack with zero count
 | 
				
			||||||
 | 
					  call assert_fails('0tag', 'E555:')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  " Pop the tag stack when it is empty
 | 
					  " Pop the tag stack when it is empty
 | 
				
			||||||
  call settagstack(1, {'items' : []})
 | 
					  call settagstack(1, {'items' : []})
 | 
				
			||||||
  call assert_fails('pop', 'E73:')
 | 
					  call assert_fails('pop', 'E73:')
 | 
				
			||||||
@@ -895,6 +917,7 @@ func Test_tag_multimatch()
 | 
				
			|||||||
  [CODE]
 | 
					  [CODE]
 | 
				
			||||||
  call writefile(code, 'Xfoo')
 | 
					  call writefile(code, 'Xfoo')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  call settagstack(1, {'items' : []})
 | 
				
			||||||
  tag first
 | 
					  tag first
 | 
				
			||||||
  tlast
 | 
					  tlast
 | 
				
			||||||
  call assert_equal(3, line('.'))
 | 
					  call assert_equal(3, line('.'))
 | 
				
			||||||
@@ -903,6 +926,151 @@ func Test_tag_multimatch()
 | 
				
			|||||||
  call assert_equal(1, line('.'))
 | 
					  call assert_equal(1, line('.'))
 | 
				
			||||||
  call assert_fails('tprev', 'E425:')
 | 
					  call assert_fails('tprev', 'E425:')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  tlast
 | 
				
			||||||
 | 
					  call feedkeys("5\<CR>", 't')
 | 
				
			||||||
 | 
					  tselect first
 | 
				
			||||||
 | 
					  call assert_equal(2, gettagstack().curidx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  set ignorecase
 | 
				
			||||||
 | 
					  tag FIRST
 | 
				
			||||||
 | 
					  tnext
 | 
				
			||||||
 | 
					  call assert_equal(2, line('.'))
 | 
				
			||||||
 | 
					  set ignorecase&
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  call delete('Xtags')
 | 
				
			||||||
 | 
					  call delete('Xfoo')
 | 
				
			||||||
 | 
					  set tags&
 | 
				
			||||||
 | 
					  %bwipe
 | 
				
			||||||
 | 
					endfunc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" Test for previewing multiple matching tags
 | 
				
			||||||
 | 
					func Test_preview_tag_multimatch()
 | 
				
			||||||
 | 
					  call writefile([
 | 
				
			||||||
 | 
					        \ "!_TAG_FILE_ENCODING\tutf-8\t//",
 | 
				
			||||||
 | 
					        \ "first\tXfoo\t1",
 | 
				
			||||||
 | 
					        \ "first\tXfoo\t2",
 | 
				
			||||||
 | 
					        \ "first\tXfoo\t3"],
 | 
				
			||||||
 | 
					        \ 'Xtags')
 | 
				
			||||||
 | 
					  set tags=Xtags
 | 
				
			||||||
 | 
					  let code =<< trim [CODE]
 | 
				
			||||||
 | 
					    int first() {}
 | 
				
			||||||
 | 
					    int first() {}
 | 
				
			||||||
 | 
					    int first() {}
 | 
				
			||||||
 | 
					  [CODE]
 | 
				
			||||||
 | 
					  call writefile(code, 'Xfoo')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  enew | only
 | 
				
			||||||
 | 
					  ptag first
 | 
				
			||||||
 | 
					  ptlast
 | 
				
			||||||
 | 
					  wincmd P
 | 
				
			||||||
 | 
					  call assert_equal(3, line('.'))
 | 
				
			||||||
 | 
					  wincmd w
 | 
				
			||||||
 | 
					  call assert_fails('ptnext', 'E428:')
 | 
				
			||||||
 | 
					  ptprev
 | 
				
			||||||
 | 
					  wincmd P
 | 
				
			||||||
 | 
					  call assert_equal(2, line('.'))
 | 
				
			||||||
 | 
					  wincmd w
 | 
				
			||||||
 | 
					  ptfirst
 | 
				
			||||||
 | 
					  wincmd P
 | 
				
			||||||
 | 
					  call assert_equal(1, line('.'))
 | 
				
			||||||
 | 
					  wincmd w
 | 
				
			||||||
 | 
					  call assert_fails('ptprev', 'E425:')
 | 
				
			||||||
 | 
					  ptnext
 | 
				
			||||||
 | 
					  wincmd P
 | 
				
			||||||
 | 
					  call assert_equal(2, line('.'))
 | 
				
			||||||
 | 
					  wincmd w
 | 
				
			||||||
 | 
					  ptlast
 | 
				
			||||||
 | 
					  call feedkeys("5\<CR>", 't')
 | 
				
			||||||
 | 
					  ptselect first
 | 
				
			||||||
 | 
					  wincmd P
 | 
				
			||||||
 | 
					  call assert_equal(3, line('.'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pclose
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  call delete('Xtags')
 | 
				
			||||||
 | 
					  call delete('Xfoo')
 | 
				
			||||||
 | 
					  set tags&
 | 
				
			||||||
 | 
					  %bwipe
 | 
				
			||||||
 | 
					endfunc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" Test for jumping to multiple matching tags across multiple :tags commands
 | 
				
			||||||
 | 
					func Test_tnext_multimatch()
 | 
				
			||||||
 | 
					  call writefile([
 | 
				
			||||||
 | 
					        \ "!_TAG_FILE_ENCODING\tutf-8\t//",
 | 
				
			||||||
 | 
					        \ "first\tXfoo1\t1",
 | 
				
			||||||
 | 
					        \ "first\tXfoo2\t1",
 | 
				
			||||||
 | 
					        \ "first\tXfoo3\t1"],
 | 
				
			||||||
 | 
					        \ 'Xtags')
 | 
				
			||||||
 | 
					  set tags=Xtags
 | 
				
			||||||
 | 
					  let code =<< trim [CODE]
 | 
				
			||||||
 | 
					    int first() {}
 | 
				
			||||||
 | 
					  [CODE]
 | 
				
			||||||
 | 
					  call writefile(code, 'Xfoo1')
 | 
				
			||||||
 | 
					  call writefile(code, 'Xfoo2')
 | 
				
			||||||
 | 
					  call writefile(code, 'Xfoo3')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  tag first
 | 
				
			||||||
 | 
					  tag first
 | 
				
			||||||
 | 
					  pop
 | 
				
			||||||
 | 
					  tnext
 | 
				
			||||||
 | 
					  tnext
 | 
				
			||||||
 | 
					  call assert_fails('tnext', 'E428:')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  call delete('Xtags')
 | 
				
			||||||
 | 
					  call delete('Xfoo1')
 | 
				
			||||||
 | 
					  call delete('Xfoo2')
 | 
				
			||||||
 | 
					  call delete('Xfoo3')
 | 
				
			||||||
 | 
					  set tags&
 | 
				
			||||||
 | 
					  %bwipe
 | 
				
			||||||
 | 
					endfunc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" Test for jumping to multiple matching tags in non-existing files
 | 
				
			||||||
 | 
					func Test_multimatch_non_existing_files()
 | 
				
			||||||
 | 
					  call writefile([
 | 
				
			||||||
 | 
					        \ "!_TAG_FILE_ENCODING\tutf-8\t//",
 | 
				
			||||||
 | 
					        \ "first\tXfoo1\t1",
 | 
				
			||||||
 | 
					        \ "first\tXfoo2\t1",
 | 
				
			||||||
 | 
					        \ "first\tXfoo3\t1"],
 | 
				
			||||||
 | 
					        \ 'Xtags')
 | 
				
			||||||
 | 
					  set tags=Xtags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  call settagstack(1, {'items' : []})
 | 
				
			||||||
 | 
					  call assert_fails('tag first', 'E429:')
 | 
				
			||||||
 | 
					  call assert_equal(3, gettagstack().items[0].matchnr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  call delete('Xtags')
 | 
				
			||||||
 | 
					  set tags&
 | 
				
			||||||
 | 
					  %bwipe
 | 
				
			||||||
 | 
					endfunc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Test_tselect_listing()
 | 
				
			||||||
 | 
					  call writefile([
 | 
				
			||||||
 | 
					        \ "!_TAG_FILE_ENCODING\tutf-8\t//",
 | 
				
			||||||
 | 
					        \ "first\tXfoo\t1" .. ';"' .. "\tv\ttyperef:typename:int\tfile:",
 | 
				
			||||||
 | 
					        \ "first\tXfoo\t2" .. ';"' .. "\tv\ttyperef:typename:char\tfile:"],
 | 
				
			||||||
 | 
					        \ 'Xtags')
 | 
				
			||||||
 | 
					  set tags=Xtags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let code =<< trim [CODE]
 | 
				
			||||||
 | 
					    static int first;
 | 
				
			||||||
 | 
					    static char first;
 | 
				
			||||||
 | 
					  [CODE]
 | 
				
			||||||
 | 
					  call writefile(code, 'Xfoo')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  call feedkeys("\<CR>", "t")
 | 
				
			||||||
 | 
					  let l = split(execute("tselect first"), "\n")
 | 
				
			||||||
 | 
					  let expected =<< [DATA]
 | 
				
			||||||
 | 
					  # pri kind tag               file
 | 
				
			||||||
 | 
					  1 FS  v    first             Xfoo
 | 
				
			||||||
 | 
					               typeref:typename:int 
 | 
				
			||||||
 | 
					               1
 | 
				
			||||||
 | 
					  2 FS  v    first             Xfoo
 | 
				
			||||||
 | 
					               typeref:typename:char 
 | 
				
			||||||
 | 
					               2
 | 
				
			||||||
 | 
					Type number and <Enter> (empty cancels): 
 | 
				
			||||||
 | 
					[DATA]
 | 
				
			||||||
 | 
					  call assert_equal(expected, l)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  call delete('Xtags')
 | 
					  call delete('Xtags')
 | 
				
			||||||
  call delete('Xfoo')
 | 
					  call delete('Xfoo')
 | 
				
			||||||
  set tags&
 | 
					  set tags&
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user