aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/testdir/test_quickfix.vim
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2023-11-30 20:35:25 +0000
committerJosh Rahm <joshuarahm@gmail.com>2023-11-30 20:35:25 +0000
commit1b7b916b7631ddf73c38e3a0070d64e4636cb2f3 (patch)
treecd08258054db80bb9a11b1061bb091c70b76926a /src/nvim/testdir/test_quickfix.vim
parenteaa89c11d0f8aefbb512de769c6c82f61a8baca3 (diff)
parent4a8bf24ac690004aedf5540fa440e788459e5e34 (diff)
downloadrneovim-aucmd_textputpost.tar.gz
rneovim-aucmd_textputpost.tar.bz2
rneovim-aucmd_textputpost.zip
Merge remote-tracking branch 'upstream/master' into aucmd_textputpostaucmd_textputpost
Diffstat (limited to 'src/nvim/testdir/test_quickfix.vim')
-rw-r--r--src/nvim/testdir/test_quickfix.vim6236
1 files changed, 0 insertions, 6236 deletions
diff --git a/src/nvim/testdir/test_quickfix.vim b/src/nvim/testdir/test_quickfix.vim
deleted file mode 100644
index 8dc4173d60..0000000000
--- a/src/nvim/testdir/test_quickfix.vim
+++ /dev/null
@@ -1,6236 +0,0 @@
-" Test for the quickfix feature.
-
-source check.vim
-source vim9.vim
-CheckFeature quickfix
-
-source screendump.vim
-
-set encoding=utf-8
-
-func s:setup_commands(cchar)
- if a:cchar == 'c'
- command! -nargs=* -bang Xlist <mods>clist<bang> <args>
- command! -nargs=* Xgetexpr <mods>cgetexpr <args>
- command! -nargs=* Xaddexpr <mods>caddexpr <args>
- command! -nargs=* -count Xolder <mods><count>colder <args>
- command! -nargs=* Xnewer <mods>cnewer <args>
- command! -nargs=* Xopen <mods> copen <args>
- command! -nargs=* Xwindow <mods>cwindow <args>
- command! -nargs=* Xbottom <mods>cbottom <args>
- command! -nargs=* Xclose <mods>cclose <args>
- command! -nargs=* -bang Xfile <mods>cfile<bang> <args>
- command! -nargs=* Xgetfile <mods>cgetfile <args>
- command! -nargs=* Xaddfile <mods>caddfile <args>
- command! -nargs=* -bang Xbuffer <mods>cbuffer<bang> <args>
- command! -nargs=* Xgetbuffer <mods>cgetbuffer <args>
- command! -nargs=* Xaddbuffer <mods>caddbuffer <args>
- command! -nargs=* Xrewind <mods>crewind <args>
- command! -count -nargs=* -bang Xnext <mods><count>cnext<bang> <args>
- command! -count -nargs=* -bang Xprev <mods><count>cprev<bang> <args>
- command! -nargs=* -bang Xfirst <mods>cfirst<bang> <args>
- command! -nargs=* -bang Xlast <mods>clast<bang> <args>
- command! -count -nargs=* -bang Xnfile <mods><count>cnfile<bang> <args>
- command! -nargs=* -bang Xpfile <mods>cpfile<bang> <args>
- command! -nargs=* Xexpr <mods>cexpr <args>
- command! -count=999 -nargs=* Xvimgrep <mods> <count>vimgrep <args>
- command! -nargs=* Xvimgrepadd <mods> vimgrepadd <args>
- command! -nargs=* Xgrep <mods> grep <args>
- command! -nargs=* Xgrepadd <mods> grepadd <args>
- command! -nargs=* Xhelpgrep helpgrep <args>
- command! -nargs=0 -count Xcc <count>cc
- command! -count=1 -nargs=0 Xbelow <mods><count>cbelow
- command! -count=1 -nargs=0 Xabove <mods><count>cabove
- command! -count=1 -nargs=0 Xbefore <mods><count>cbefore
- command! -count=1 -nargs=0 Xafter <mods><count>cafter
- let g:Xgetlist = function('getqflist')
- let g:Xsetlist = function('setqflist')
- call setqflist([], 'f')
- else
- command! -nargs=* -bang Xlist <mods>llist<bang> <args>
- command! -nargs=* Xgetexpr <mods>lgetexpr <args>
- command! -nargs=* Xaddexpr <mods>laddexpr <args>
- command! -nargs=* -count Xolder <mods><count>lolder <args>
- command! -nargs=* Xnewer <mods>lnewer <args>
- command! -nargs=* Xopen <mods> lopen <args>
- command! -nargs=* Xwindow <mods>lwindow <args>
- command! -nargs=* Xbottom <mods>lbottom <args>
- command! -nargs=* Xclose <mods>lclose <args>
- command! -nargs=* -bang Xfile <mods>lfile<bang> <args>
- command! -nargs=* Xgetfile <mods>lgetfile <args>
- command! -nargs=* Xaddfile <mods>laddfile <args>
- command! -nargs=* -bang Xbuffer <mods>lbuffer<bang> <args>
- command! -nargs=* Xgetbuffer <mods>lgetbuffer <args>
- command! -nargs=* Xaddbuffer <mods>laddbuffer <args>
- command! -nargs=* Xrewind <mods>lrewind <args>
- command! -count -nargs=* -bang Xnext <mods><count>lnext<bang> <args>
- command! -count -nargs=* -bang Xprev <mods><count>lprev<bang> <args>
- command! -nargs=* -bang Xfirst <mods>lfirst<bang> <args>
- command! -nargs=* -bang Xlast <mods>llast<bang> <args>
- command! -count -nargs=* -bang Xnfile <mods><count>lnfile<bang> <args>
- command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args>
- command! -nargs=* Xexpr <mods>lexpr <args>
- command! -count=999 -nargs=* Xvimgrep <mods> <count>lvimgrep <args>
- command! -nargs=* Xvimgrepadd <mods> lvimgrepadd <args>
- command! -nargs=* Xgrep <mods> lgrep <args>
- command! -nargs=* Xgrepadd <mods> lgrepadd <args>
- command! -nargs=* Xhelpgrep lhelpgrep <args>
- command! -nargs=0 -count Xcc <count>ll
- command! -count=1 -nargs=0 Xbelow <mods><count>lbelow
- command! -count=1 -nargs=0 Xabove <mods><count>labove
- command! -count=1 -nargs=0 Xbefore <mods><count>lbefore
- command! -count=1 -nargs=0 Xafter <mods><count>lafter
- let g:Xgetlist = function('getloclist', [0])
- let g:Xsetlist = function('setloclist', [0])
- call setloclist(0, [], 'f')
- endif
-endfunc
-
-" This must be run before any error lists are created.
-func Test_AA_cc_no_errors()
- call assert_fails('cc', 'E42:')
- call assert_fails('ll', 'E42:')
-endfunc
-
-" Tests for the :clist and :llist commands
-func XlistTests(cchar)
- call s:setup_commands(a:cchar)
-
- if a:cchar == 'l'
- call assert_fails('llist', 'E776:')
- endif
- " With an empty list, command should return error
- Xgetexpr []
- silent! Xlist
- call assert_true(v:errmsg ==# 'E42: No Errors')
-
- " Populate the list and then try
- let lines =<< trim END
- non-error 1
- Xtestfile1:1:3:Line1
- non-error 2
- Xtestfile2:2:2:Line2
- non-error| 3
- Xtestfile3:3:1:Line3
- END
- Xgetexpr lines
-
- " List only valid entries
- let l = split(execute('Xlist', ''), "\n")
- call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
- \ ' 4 Xtestfile2:2 col 2: Line2',
- \ ' 6 Xtestfile3:3 col 1: Line3'], l)
-
- " List all the entries
- let l = split(execute('Xlist!', ''), "\n")
- call assert_equal([' 1: non-error 1', ' 2 Xtestfile1:1 col 3: Line1',
- \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2',
- \ ' 5: non-error| 3', ' 6 Xtestfile3:3 col 1: Line3'], l)
-
- " List a range of errors
- let l = split(execute('Xlist 3,6', ''), "\n")
- call assert_equal([' 4 Xtestfile2:2 col 2: Line2',
- \ ' 6 Xtestfile3:3 col 1: Line3'], l)
-
- let l = split(execute('Xlist! 3,4', ''), "\n")
- call assert_equal([' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
-
- let l = split(execute('Xlist -6,-4', ''), "\n")
- call assert_equal([' 2 Xtestfile1:1 col 3: Line1'], l)
-
- let l = split(execute('Xlist! -5,-3', ''), "\n")
- call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
- \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
-
- " Test for '+'
- let l = split(execute('Xlist! +2', ''), "\n")
- call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
- \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
-
- " Ranged entries
- call g:Xsetlist([{'lnum':10,'text':'Line1'},
- \ {'lnum':20,'col':10,'text':'Line2'},
- \ {'lnum':30,'col':15,'end_col':20,'text':'Line3'},
- \ {'lnum':40,'end_lnum':45,'text':'Line4'},
- \ {'lnum':50,'end_lnum':55,'col':15,'text':'Line5'},
- \ {'lnum':60,'end_lnum':65,'col':25,'end_col':35,'text':'Line6'}])
- let l = split(execute('Xlist', ""), "\n")
- call assert_equal([' 1:10: Line1',
- \ ' 2:20 col 10: Line2',
- \ ' 3:30 col 15-20: Line3',
- \ ' 4:40-45: Line4',
- \ ' 5:50-55 col 15: Line5',
- \ ' 6:60-65 col 25-35: Line6'], l)
-
- " Different types of errors
- call g:Xsetlist([{'lnum':10,'col':5,'type':'W', 'text':'Warning','nr':11},
- \ {'lnum':20,'col':10,'type':'e','text':'Error','nr':22},
- \ {'lnum':30,'col':15,'type':'i','text':'Info','nr':33},
- \ {'lnum':40,'col':20,'type':'x', 'text':'Other','nr':44},
- \ {'lnum':50,'col':25,'type':"\<C-A>",'text':'one','nr':55}])
- let l = split(execute('Xlist', ""), "\n")
- call assert_equal([' 1:10 col 5 warning 11: Warning',
- \ ' 2:20 col 10 error 22: Error',
- \ ' 3:30 col 15 info 33: Info',
- \ ' 4:40 col 20 x 44: Other',
- \ ' 5:50 col 25 55: one'], l)
-
- " Test for module names, one needs to explicitly set `'valid':v:true` so
- call g:Xsetlist([
- \ {'lnum':10,'col':5,'type':'W','module':'Data.Text','text':'ModuleWarning','nr':11,'valid':v:true},
- \ {'lnum':20,'col':10,'type':'W','module':'Data.Text','filename':'Data/Text.hs','text':'ModuleWarning','nr':22,'valid':v:true},
- \ {'lnum':30,'col':15,'type':'W','filename':'Data/Text.hs','text':'FileWarning','nr':33,'valid':v:true}])
- let l = split(execute('Xlist', ""), "\n")
- call assert_equal([' 1 Data.Text:10 col 5 warning 11: ModuleWarning',
- \ ' 2 Data.Text:20 col 10 warning 22: ModuleWarning',
- \ ' 3 Data/Text.hs:30 col 15 warning 33: FileWarning'], l)
-
- " Very long line should be displayed.
- let text = 'Line' .. repeat('1234567890', 130)
- let lines = ['Xtestfile9:2:9:' .. text]
- Xgetexpr lines
-
- let l = split(execute('Xlist', ''), "\n")
- call assert_equal([' 1 Xtestfile9:2 col 9: ' .. text] , l)
-
- " For help entries in the quickfix list, only the filename without directory
- " should be displayed
- Xhelpgrep setqflist()
- let l = split(execute('Xlist 1', ''), "\n")
- call assert_match('^ 1 [^\\/]\{-}:', l[0])
-
- " Error cases
- call assert_fails('Xlist abc', 'E488:')
-endfunc
-
-func Test_clist()
- call XlistTests('c')
- call XlistTests('l')
-endfunc
-
-" Tests for the :colder, :cnewer, :lolder and :lnewer commands
-" Note that this test assumes that a quickfix/location list is
-" already set by the caller.
-func XageTests(cchar)
- call s:setup_commands(a:cchar)
-
- if a:cchar == 'l'
- " No location list for the current window
- call assert_fails('lolder', 'E776:')
- call assert_fails('lnewer', 'E776:')
- endif
-
- let list = [{'bufnr': bufnr('%'), 'lnum': 1}]
- call g:Xsetlist(list)
-
- " Jumping to a non existent list should return error
- silent! Xolder 99
- call assert_true(v:errmsg ==# 'E380: At bottom of quickfix stack')
-
- silent! Xnewer 99
- call assert_true(v:errmsg ==# 'E381: At top of quickfix stack')
-
- " Add three quickfix/location lists
- Xgetexpr ['Xtestfile1:1:3:Line1']
- Xgetexpr ['Xtestfile2:2:2:Line2']
- Xgetexpr ['Xtestfile3:3:1:Line3']
-
- " Go back two lists
- Xolder
- let l = g:Xgetlist()
- call assert_equal('Line2', l[0].text)
-
- " Go forward two lists
- Xnewer
- let l = g:Xgetlist()
- call assert_equal('Line3', l[0].text)
-
- " Test for the optional count argument
- Xolder 2
- let l = g:Xgetlist()
- call assert_equal('Line1', l[0].text)
-
- Xnewer 2
- let l = g:Xgetlist()
- call assert_equal('Line3', l[0].text)
-endfunc
-
-func Test_cage()
- call XageTests('c')
- call XageTests('l')
-endfunc
-
-" Tests for the :cwindow, :lwindow :cclose, :lclose, :copen and :lopen
-" commands
-func XwindowTests(cchar)
- call s:setup_commands(a:cchar)
-
- " Opening the location list window without any errors should fail
- if a:cchar == 'l'
- call assert_fails('lopen', 'E776:')
- call assert_fails('lwindow', 'E776:')
- endif
-
- " Create a list with no valid entries
- Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
-
- " Quickfix/Location window should not open with no valid errors
- Xwindow
- call assert_true(winnr('$') == 1)
-
- " Create a list with valid entries
- let lines =<< trim END
- Xtestfile1:1:3:Line1
- Xtestfile2:2:2:Line2
- Xtestfile3:3:1:Line3
- END
- Xgetexpr lines
-
- " Open the window
- Xwindow
- call assert_true(winnr('$') == 2 && winnr() == 2 &&
- \ getline('.') ==# 'Xtestfile1|1 col 3| Line1')
- redraw!
-
- " Close the window
- Xclose
- call assert_true(winnr('$') == 1)
-
- " Create a list with no valid entries
- Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
-
- " Open the window
- Xopen 5
- call assert_true(winnr('$') == 2 && getline('.') ==# '|| non-error 1'
- \ && winheight(0) == 5)
-
- " Opening the window again, should move the cursor to that window
- wincmd t
- Xopen 7
- call assert_true(winnr('$') == 2 && winnr() == 2 &&
- \ winheight(0) == 7 &&
- \ getline('.') ==# '|| non-error 1')
-
- " :cnext in quickfix window should move to the next entry
- Xnext
- call assert_equal(2, g:Xgetlist({'idx' : 0}).idx)
-
- " Calling cwindow should close the quickfix window with no valid errors
- Xwindow
- call assert_true(winnr('$') == 1)
-
- " Specifying the width should adjust the width for a vertically split
- " quickfix window.
- vert Xopen
- call assert_equal(10, winwidth(0))
- vert Xopen 12
- call assert_equal(12, winwidth(0))
- Xclose
-
- " Horizontally or vertically splitting the quickfix window should create a
- " normal window/buffer
- Xopen
- wincmd s
- call assert_equal(0, getwininfo(win_getid())[0].quickfix)
- call assert_equal(0, getwininfo(win_getid())[0].loclist)
- call assert_notequal('quickfix', &buftype)
- close
- Xopen
- wincmd v
- call assert_equal(0, getwininfo(win_getid())[0].quickfix)
- call assert_equal(0, getwininfo(win_getid())[0].loclist)
- call assert_notequal('quickfix', &buftype)
- close
- Xopen
- Xclose
-
- if a:cchar == 'c'
- " Opening the quickfix window in multiple tab pages should reuse the
- " quickfix buffer
- let lines =<< trim END
- Xtestfile1:1:3:Line1
- Xtestfile2:2:2:Line2
- Xtestfile3:3:1:Line3
- END
- Xgetexpr lines
- Xopen
- let qfbufnum = bufnr('%')
- tabnew
- Xopen
- call assert_equal(qfbufnum, bufnr('%'))
- new | only | tabonly
- endif
-endfunc
-
-func Test_cwindow()
- call XwindowTests('c')
- call XwindowTests('l')
-endfunc
-
-func Test_copenHeight()
- copen
- wincmd H
- let height = winheight(0)
- copen 10
- call assert_equal(height, winheight(0))
- quit
-endfunc
-
-func Test_copenHeight_tabline()
- set tabline=foo showtabline=2
- copen
- wincmd H
- let height = winheight(0)
- copen 10
- call assert_equal(height, winheight(0))
- quit
- set tabline& showtabline&
-endfunc
-
-" Tests for the :cfile, :lfile, :caddfile, :laddfile, :cgetfile and :lgetfile
-" commands.
-func XfileTests(cchar)
- call s:setup_commands(a:cchar)
-
- let lines =<< trim END
- Xtestfile1:700:10:Line 700
- Xtestfile2:800:15:Line 800
- END
- call writefile(lines, 'Xqftestfile1')
-
- enew!
- Xfile Xqftestfile1
- let l = g:Xgetlist()
- call assert_true(len(l) == 2 &&
- \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
- \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
-
- " Test with a non existent file
- call assert_fails('Xfile non_existent_file', 'E40')
-
- " Run cfile/lfile from a modified buffer
- enew!
- silent! put ='Quickfix'
- silent! Xfile Xqftestfile1
- call assert_true(v:errmsg ==# 'E37: No write since last change (add ! to override)')
-
- call writefile(['Xtestfile3:900:30:Line 900'], 'Xqftestfile1')
- Xaddfile Xqftestfile1
- let l = g:Xgetlist()
- call assert_true(len(l) == 3 &&
- \ l[2].lnum == 900 && l[2].col == 30 && l[2].text ==# 'Line 900')
-
- let lines =<< trim END
- Xtestfile1:222:77:Line 222
- Xtestfile2:333:88:Line 333
- END
- call writefile(lines, 'Xqftestfile1')
-
- enew!
- Xgetfile Xqftestfile1
- let l = g:Xgetlist()
- call assert_true(len(l) == 2 &&
- \ l[0].lnum == 222 && l[0].col == 77 && l[0].text ==# 'Line 222' &&
- \ l[1].lnum == 333 && l[1].col == 88 && l[1].text ==# 'Line 333')
-
- " Test for a file with a long line and without a newline at the end
- let text = repeat('x', 1024)
- let t = 'a.txt:18:' . text
- call writefile([t], 'Xqftestfile1', 'b')
- silent! Xfile Xqftestfile1
- call assert_equal(text, g:Xgetlist()[0].text)
-
- call delete('Xqftestfile1')
-endfunc
-
-func Test_cfile()
- call XfileTests('c')
- call XfileTests('l')
-endfunc
-
-" Tests for the :cbuffer, :lbuffer, :caddbuffer, :laddbuffer, :cgetbuffer and
-" :lgetbuffer commands.
-func XbufferTests(cchar)
- call s:setup_commands(a:cchar)
-
- enew!
- let lines =<< trim END
- Xtestfile7:700:10:Line 700
- Xtestfile8:800:15:Line 800
- END
- silent! call setline(1, lines)
- Xbuffer!
- let l = g:Xgetlist()
- call assert_true(len(l) == 2 &&
- \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
- \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
-
- enew!
- let lines =<< trim END
- Xtestfile9:900:55:Line 900
- Xtestfile10:950:66:Line 950
- END
- silent! call setline(1, lines)
- Xgetbuffer
- let l = g:Xgetlist()
- call assert_true(len(l) == 2 &&
- \ l[0].lnum == 900 && l[0].col == 55 && l[0].text ==# 'Line 900' &&
- \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950')
-
- enew!
- let lines =<< trim END
- Xtestfile11:700:20:Line 700
- Xtestfile12:750:25:Line 750
- END
- silent! call setline(1, lines)
- Xaddbuffer
- let l = g:Xgetlist()
- call assert_true(len(l) == 4 &&
- \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950' &&
- \ l[2].lnum == 700 && l[2].col == 20 && l[2].text ==# 'Line 700' &&
- \ l[3].lnum == 750 && l[3].col == 25 && l[3].text ==# 'Line 750')
- enew!
-
- " Check for invalid buffer
- call assert_fails('Xbuffer 199', 'E474:')
-
- " Check for unloaded buffer
- edit Xtestfile1
- let bnr = bufnr('%')
- enew!
- call assert_fails('Xbuffer ' . bnr, 'E681:')
-
- " Check for invalid range
- " Using Xbuffer will not run the range check in the cbuffer/lbuffer
- " commands. So directly call the commands.
- if (a:cchar == 'c')
- call assert_fails('900,999cbuffer', 'E16:')
- else
- call assert_fails('900,999lbuffer', 'E16:')
- endif
-endfunc
-
-func Test_cbuffer()
- call XbufferTests('c')
- call XbufferTests('l')
-endfunc
-
-func XexprTests(cchar)
- call s:setup_commands(a:cchar)
-
- call assert_fails('Xexpr 10', 'E777:')
-endfunc
-
-func Test_cexpr()
- call XexprTests('c')
- call XexprTests('l')
-endfunc
-
-" Tests for :cnext, :cprev, :cfirst, :clast commands
-func Xtest_browse(cchar)
- call s:setup_commands(a:cchar)
-
- call g:Xsetlist([], 'f')
- " Jumping to first or next location list entry without any error should
- " result in failure
- if a:cchar == 'c'
- let err = 'E42:'
- let cmd = '$cc'
- else
- let err = 'E776:'
- let cmd = '$ll'
- endif
- call assert_fails('Xnext', err)
- call assert_fails('Xprev', err)
- call assert_fails('Xnfile', err)
- call assert_fails('Xpfile', err)
- call assert_fails(cmd, err)
-
- Xexpr ''
- call assert_fails(cmd, 'E42:')
-
- call s:create_test_file('Xqftestfile1')
- call s:create_test_file('Xqftestfile2')
-
- let lines =<< trim END
- Xqftestfile1:5:Line5
- Xqftestfile1:6:Line6
- Xqftestfile2:10:Line10
- Xqftestfile2:11:Line11
- RegularLine1
- RegularLine2
- END
- Xgetexpr lines
-
- Xfirst
- call assert_fails('-5Xcc', 'E16:')
- call assert_fails('Xprev', 'E553')
- call assert_fails('Xpfile', 'E553')
- Xnfile
- call assert_equal('Xqftestfile2', @%)
- call assert_equal(10, line('.'))
- Xpfile
- call assert_equal('Xqftestfile1', @%)
- call assert_equal(6, line('.'))
- 5Xcc
- call assert_equal(5, g:Xgetlist({'idx':0}).idx)
- 2Xcc
- call assert_equal(2, g:Xgetlist({'idx':0}).idx)
- if a:cchar == 'c'
- cc
- else
- ll
- endif
- call assert_equal(2, g:Xgetlist({'idx':0}).idx)
- 10Xcc
- call assert_equal(6, g:Xgetlist({'idx':0}).idx)
- Xlast
- Xprev
- call assert_equal('Xqftestfile2', @%)
- call assert_equal(11, line('.'))
- call assert_fails('Xnext', 'E553')
- call assert_fails('Xnfile', 'E553')
- " To process the range using quickfix list entries, directly use the
- " quickfix commands (don't use the user defined commands)
- if a:cchar == 'c'
- $cc
- else
- $ll
- endif
- call assert_equal(6, g:Xgetlist({'idx':0}).idx)
- Xrewind
- call assert_equal('Xqftestfile1', @%)
- call assert_equal(5, line('.'))
-
- 10Xnext
- call assert_equal('Xqftestfile2', @%)
- call assert_equal(11, line('.'))
- 10Xprev
- call assert_equal('Xqftestfile1', @%)
- call assert_equal(5, line('.'))
-
- " Jumping to an error from the error window using cc command
- let lines =<< trim END
- Xqftestfile1:5:Line5
- Xqftestfile1:6:Line6
- Xqftestfile2:10:Line10
- Xqftestfile2:11:Line11
- END
- Xgetexpr lines
- Xopen
- 10Xcc
- call assert_equal(11, line('.'))
- call assert_equal('Xqftestfile2', @%)
- Xopen
- call cursor(2, 1)
- if a:cchar == 'c'
- .cc
- else
- .ll
- endif
- call assert_equal(6, line('.'))
- call assert_equal('Xqftestfile1', @%)
-
- " Jumping to an error from the error window (when only the error window is
- " present)
- Xopen | only
- Xlast 1
- call assert_equal(5, line('.'))
- call assert_equal('Xqftestfile1', @%)
-
- Xexpr ""
- call assert_fails('Xnext', 'E42:')
-
- call delete('Xqftestfile1')
- call delete('Xqftestfile2')
-
- " Should be able to use next/prev with invalid entries
- Xexpr ""
- call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
- call assert_equal(0, g:Xgetlist({'size' : 0}).size)
- Xaddexpr ['foo', 'bar', 'baz', 'quux', 'sh|moo']
- call assert_equal(5, g:Xgetlist({'size' : 0}).size)
- Xlast
- call assert_equal(5, g:Xgetlist({'idx' : 0}).idx)
- Xfirst
- call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
- 2Xnext
- call assert_equal(3, g:Xgetlist({'idx' : 0}).idx)
-endfunc
-
-func Test_browse()
- call Xtest_browse('c')
- call Xtest_browse('l')
-endfunc
-
-func s:test_xhelpgrep(cchar)
- call s:setup_commands(a:cchar)
- Xhelpgrep quickfix
- Xopen
- if a:cchar == 'c'
- let title_text = ':helpgrep quickfix'
- else
- let title_text = ':lhelpgrep quickfix'
- endif
- call assert_true(w:quickfix_title =~ title_text, w:quickfix_title)
-
- " Jumping to a help topic should open the help window
- only
- Xnext
- call assert_true(&buftype == 'help')
- call assert_true(winnr('$') == 2)
- " Jumping to the next match should reuse the help window
- Xnext
- call assert_true(&buftype == 'help')
- call assert_true(winnr() == 1)
- call assert_true(winnr('$') == 2)
- " Jumping to the next match from the quickfix window should reuse the help
- " window
- Xopen
- Xnext
- call assert_true(&buftype == 'help')
- call assert_true(winnr() == 1)
- call assert_true(winnr('$') == 2)
- call assert_match('|\d\+ col \d\+-\d\+|', getbufline(winbufnr(2), 1)[0])
-
- " This wipes out the buffer, make sure that doesn't cause trouble.
- Xclose
-
- " When the current window is vertically split, jumping to a help match
- " should open the help window at the top.
- only | enew
- let w1 = win_getid()
- vert new
- let w2 = win_getid()
- Xnext
- let w3 = win_getid()
- call assert_true(&buftype == 'help')
- call assert_true(winnr() == 1)
- " See jump_to_help_window() for details
- let w2_width = winwidth(w2)
- if w2_width != &columns && w2_width < 80
- call assert_equal(['col', [['leaf', w3],
- \ ['row', [['leaf', w2], ['leaf', w1]]]]], winlayout())
- else
- call assert_equal(['row', [['col', [['leaf', w3], ['leaf', w2]]],
- \ ['leaf', w1]]] , winlayout())
- endif
-
- new | only
- set buftype=help
- set modified
- call assert_fails('Xnext', 'E37:')
- set nomodified
- new | only
-
- if a:cchar == 'l'
- " When a help window is present, running :lhelpgrep should reuse the
- " help window and not the current window
- new | only
- call g:Xsetlist([], 'f')
- help index.txt
- wincmd w
- lhelpgrep quickfix
- call assert_equal(1, winnr())
- call assert_notequal([], getloclist(1))
- call assert_equal([], getloclist(2))
- endif
-
- new | only
-
- " Search for non existing help string
- call assert_fails('Xhelpgrep a1b2c3', 'E480:')
- " Invalid regular expression
- call assert_fails('Xhelpgrep \@<!', 'E866:')
-endfunc
-
-func Test_helpgrep()
- call s:test_xhelpgrep('c')
- helpclose
- call s:test_xhelpgrep('l')
-endfunc
-
-" When running the :helpgrep command, if an autocmd modifies the 'cpoptions'
-" value, then Vim crashes. (issue fixed by 7.2b-004 and 8.2.4453)
-func Test_helpgrep_restore_cpo_aucmd()
- let save_cpo = &cpo
- augroup QF_Test
- au!
- autocmd BufNew * set cpo=acd
- augroup END
-
- helpgrep quickfix
- call assert_equal('acd', &cpo)
- %bw!
-
- set cpo&vim
- augroup QF_Test
- au!
- autocmd BufReadPost * set cpo=
- augroup END
-
- helpgrep buffer
- call assert_equal('', &cpo)
-
- augroup QF_Test
- au!
- augroup END
- %bw!
- let &cpo = save_cpo
-endfunc
-
-func Test_errortitle()
- augroup QfBufWinEnter
- au!
- au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
- augroup END
- copen
- let a=[{'lnum': 308, 'bufnr': bufnr(''), 'col': 58, 'valid': 1, 'vcol': 0, 'nr': 0, 'type': '', 'pattern': '', 'text': ' au BufWinEnter * :let g:a=get(w:, ''quickfix_title'', ''NONE'')'}]
- call setqflist(a)
- call assert_equal(':setqflist()', g:a)
- augroup QfBufWinEnter
- au!
- augroup END
- augroup! QfBufWinEnter
-endfunc
-
-func Test_vimgreptitle()
- augroup QfBufWinEnter
- au!
- au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
- augroup END
- try
- vimgrep /pattern/j file
- catch /E480/
- endtry
- copen
- call assert_equal(': vimgrep /pattern/j file', g:a)
- augroup QfBufWinEnter
- au!
- augroup END
- augroup! QfBufWinEnter
-endfunc
-
-func Test_bufwinenter_once()
- augroup QfBufWinEnter
- au!
- au BufWinEnter * let g:got_afile ..= 'got ' .. expand('<afile>')
- augroup END
- let g:got_afile = ''
- copen
- call assert_equal('got quickfix', g:got_afile)
-
- cclose
- unlet g:got_afile
- augroup QfBufWinEnter
- au!
- augroup END
- augroup! QfBufWinEnter
-endfunc
-
-func XqfTitleTests(cchar)
- call s:setup_commands(a:cchar)
-
- Xgetexpr ['file:1:1:message']
- let l = g:Xgetlist()
- if a:cchar == 'c'
- call setqflist(l, 'r')
- else
- call setloclist(0, l, 'r')
- endif
-
- Xopen
- if a:cchar == 'c'
- let title = ':setqflist()'
- else
- let title = ':setloclist()'
- endif
- call assert_equal(title, w:quickfix_title)
- Xclose
-endfunc
-
-" Tests for quickfix window's title
-func Test_qf_title()
- call XqfTitleTests('c')
- call XqfTitleTests('l')
-endfunc
-
-" Tests for 'errorformat'
-func Test_efm()
- let save_efm = &efm
- set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%#
- cgetexpr ['WWWW', 'EEEE', 'CCCC']
- let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
- call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
- cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC']
- let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
- call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
- cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY']
- let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
- call assert_equal("[['W', 1], ['ZZZZ', 0], ['E^@CCCC', 1], ['YYYY', 0]]", l)
- let &efm = save_efm
-endfunc
-
-" This will test for problems in quickfix:
-" A. incorrectly copying location lists which caused the location list to show
-" a different name than the file that was actually being displayed.
-" B. not reusing the window for which the location list window is opened but
-" instead creating new windows.
-" C. make sure that the location list window is not reused instead of the
-" window it belongs to.
-"
-" Set up the test environment:
-func ReadTestProtocol(name)
- let base = substitute(a:name, '\v^test://(.*)%(\.[^.]+)?', '\1', '')
- let word = substitute(base, '\v(.*)\..*', '\1', '')
-
- setl modifiable
- setl noreadonly
- setl noswapfile
- setl bufhidden=delete
- %del _
- " For problem 2:
- " 'buftype' has to be set to reproduce the constant opening of new windows
- setl buftype=nofile
-
- call setline(1, word)
-
- setl nomodified
- setl nomodifiable
- setl readonly
- exe 'doautocmd BufRead ' . substitute(a:name, '\v^test://(.*)', '\1', '')
-endfunc
-
-func Test_locationlist()
- enew
-
- augroup testgroup
- au!
- autocmd BufReadCmd test://* call ReadTestProtocol(expand("<amatch>"))
- augroup END
-
- let words = [ "foo", "bar", "baz", "quux", "shmoo", "spam", "eggs" ]
-
- let qflist = []
- for word in words
- call add(qflist, {'filename': 'test://' . word . '.txt', 'text': 'file ' . word . '.txt', })
- " NOTE: problem 1:
- " intentionally not setting 'lnum' so that the quickfix entries are not
- " valid
- eval qflist->setloclist(0, ' ')
- endfor
-
- " Test A
- lrewind
- enew
- lopen
- 4lnext
- vert split
- wincmd L
- lopen
- wincmd p
- lnext
- let fileName = expand("%")
- wincmd p
- let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '')
- let fileName = substitute(fileName, '\\', '/', 'g')
- let locationListFileName = substitute(locationListFileName, '\\', '/', 'g')
- call assert_equal("test://bar.txt", fileName)
- call assert_equal("test://bar.txt", locationListFileName)
-
- wincmd n | only
-
- " Test B:
- lrewind
- lopen
- 2
- exe "normal \<CR>"
- wincmd p
- 3
- exe "normal \<CR>"
- wincmd p
- 4
- exe "normal \<CR>"
- call assert_equal(2, winnr('$'))
- wincmd n | only
-
- " Test C:
- lrewind
- lopen
- " Let's move the location list window to the top to check whether it (the
- " first window found) will be reused when we try to open new windows:
- wincmd K
- 2
- exe "normal \<CR>"
- wincmd p
- 3
- exe "normal \<CR>"
- wincmd p
- 4
- exe "normal \<CR>"
- 1wincmd w
- call assert_equal('quickfix', &buftype)
- 2wincmd w
- let bufferName = expand("%")
- let bufferName = substitute(bufferName, '\\', '/', 'g')
- call assert_equal('test://quux.txt', bufferName)
-
- wincmd n | only
-
- augroup! testgroup
-endfunc
-
-func Test_locationlist_curwin_was_closed()
- augroup testgroup
- au!
- autocmd BufReadCmd test_curwin.txt call R(expand("<amatch>"))
- augroup END
-
- func! R(n)
- quit
- endfunc
-
- new
- let q = []
- call add(q, {'filename': 'test_curwin.txt' })
- call setloclist(0, q)
- call assert_fails('lrewind', 'E924:')
-
- augroup! testgroup
- delfunc R
-endfunc
-
-func Test_locationlist_cross_tab_jump()
- call writefile(['loclistfoo'], 'loclistfoo')
- call writefile(['loclistbar'], 'loclistbar')
- set switchbuf=usetab
-
- edit loclistfoo
- tabedit loclistbar
- silent lgrep loclistfoo loclist*
- call assert_equal(1, tabpagenr())
-
- enew | only | tabonly
- set switchbuf&vim
- call delete('loclistfoo')
- call delete('loclistbar')
-endfunc
-
-" More tests for 'errorformat'
-func Test_efm1()
- if !has('unix')
- " The 'errorformat' setting is different on non-Unix systems.
- " This test works only on Unix-like systems.
- return
- endif
-
- let l =<< trim [DATA]
- "Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.
- "Xtestfile", line 6 col 19; this is an error
- gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include version.c
- Xtestfile:9: parse error before `asd'
- make: *** [vim] Error 1
- in file "Xtestfile" linenr 10: there is an error
-
- 2 returned
- "Xtestfile", line 11 col 1; this is an error
- "Xtestfile", line 12 col 2; this is another error
- "Xtestfile", line 14:10; this is an error in column 10
- =Xtestfile=, line 15:10; this is another error, but in vcol 10 this time
- "Xtestfile", linenr 16: yet another problem
- Error in "Xtestfile" at line 17:
- x should be a dot
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17
- ^
- Error in "Xtestfile" at line 18:
- x should be a dot
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18
- .............^
- Error in "Xtestfile" at line 19:
- x should be a dot
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19
- --------------^
- Error in "Xtestfile" at line 20:
- x should be a dot
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20
- ^
-
- Does anyone know what is the problem and how to correction it?
- "Xtestfile", line 21 col 9: What is the title of the quickfix window?
- "Xtestfile", line 22 col 9: What is the title of the quickfix window?
- [DATA]
-
- call writefile(l, 'Xerrorfile1')
- call writefile(l[:-2], 'Xerrorfile2')
-
- let m =<< [DATA]
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 2
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 3
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 4
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 5
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 6
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 7
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 8
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 9
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 10
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 11
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 12
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 13
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 14
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 15
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 16
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 21
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 22
-[DATA]
- call writefile(m, 'Xtestfile')
-
- let save_efm = &efm
- set efm+==%f=\\,\ line\ %l%*\\D%v%*[^\ ]\ %m
- set efm^=%AError\ in\ \"%f\"\ at\ line\ %l:,%Z%p^,%C%m
-
- exe 'cf Xerrorfile2'
- clast
- copen
- call assert_equal(':cf Xerrorfile2', w:quickfix_title)
- wincmd p
-
- exe 'cf Xerrorfile1'
- call assert_equal([4, 12], [line('.'), col('.')])
- cn
- call assert_equal([6, 19], [line('.'), col('.')])
- cn
- call assert_equal([9, 2], [line('.'), col('.')])
- cn
- call assert_equal([10, 2], [line('.'), col('.')])
- cn
- call assert_equal([11, 1], [line('.'), col('.')])
- cn
- call assert_equal([12, 2], [line('.'), col('.')])
- cn
- call assert_equal([14, 10], [line('.'), col('.')])
- cn
- call assert_equal([15, 3, 10], [line('.'), col('.'), virtcol('.')])
- cn
- call assert_equal([16, 2], [line('.'), col('.')])
- cn
- call assert_equal([17, 6], [line('.'), col('.')])
- cn
- call assert_equal([18, 7], [line('.'), col('.')])
- cn
- call assert_equal([19, 8], [line('.'), col('.')])
- cn
- call assert_equal([20, 9], [line('.'), col('.')])
- clast
- cprev
- cprev
- wincmd w
- call assert_equal(':cf Xerrorfile1', w:quickfix_title)
- wincmd p
-
- let &efm = save_efm
- call delete('Xerrorfile1')
- call delete('Xerrorfile2')
- call delete('Xtestfile')
-endfunc
-
-" Test for quickfix directory stack support
-func s:dir_stack_tests(cchar)
- call s:setup_commands(a:cchar)
-
- let save_efm=&efm
- set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
-
- let lines =<< trim END
- Entering dir 'dir1/a'
- habits2.txt:1:Nine Healthy Habits
- Entering dir 'b'
- habits3.txt:2:0 Hours of television
- habits2.txt:7:5 Small meals
- Entering dir 'dir1/c'
- habits4.txt:3:1 Hour of exercise
- Leaving dir 'dir1/c'
- Leaving dir 'dir1/a'
- habits1.txt:4:2 Liters of water
- Entering dir 'dir2'
- habits5.txt:5:3 Cups of hot green tea
- Leaving dir 'dir2'
- END
-
- Xexpr ""
- for l in lines
- Xaddexpr l
- endfor
-
- let qf = g:Xgetlist()
-
- call assert_equal('dir1/a/habits2.txt', bufname(qf[1].bufnr))
- call assert_equal(1, qf[1].lnum)
- call assert_equal('dir1/a/b/habits3.txt', bufname(qf[3].bufnr))
- call assert_equal(2, qf[3].lnum)
- call assert_equal('dir1/a/habits2.txt', bufname(qf[4].bufnr))
- call assert_equal(7, qf[4].lnum)
- call assert_equal('dir1/c/habits4.txt', bufname(qf[6].bufnr))
- call assert_equal(3, qf[6].lnum)
- call assert_equal('habits1.txt', bufname(qf[9].bufnr))
- call assert_equal(4, qf[9].lnum)
- call assert_equal('dir2/habits5.txt', bufname(qf[11].bufnr))
- call assert_equal(5, qf[11].lnum)
-
- let &efm=save_efm
-endfunc
-
-" Tests for %D and %X errorformat options
-func Test_efm_dirstack()
- " Create the directory stack and files
- call mkdir('dir1')
- call mkdir('dir1/a')
- call mkdir('dir1/a/b')
- call mkdir('dir1/c')
- call mkdir('dir2')
-
- let lines =<< trim END
- Nine Healthy Habits
- 0 Hours of television
- 1 Hour of exercise
- 2 Liters of water
- 3 Cups of hot green tea
- 4 Short mental breaks
- 5 Small meals
- 6 AM wake up time
- 7 Minutes of laughter
- 8 Hours of sleep (at least)
- 9 PM end of the day and off to bed
- END
- call writefile(lines, 'habits1.txt')
- call writefile(lines, 'dir1/a/habits2.txt')
- call writefile(lines, 'dir1/a/b/habits3.txt')
- call writefile(lines, 'dir1/c/habits4.txt')
- call writefile(lines, 'dir2/habits5.txt')
-
- call s:dir_stack_tests('c')
- call s:dir_stack_tests('l')
-
- call delete('dir1', 'rf')
- call delete('dir2', 'rf')
- call delete('habits1.txt')
-endfunc
-
-" Test for resync after continuing an ignored message
-func Xefm_ignore_continuations(cchar)
- call s:setup_commands(a:cchar)
-
- let save_efm = &efm
-
- let &efm =
- \ '%Eerror %m %l,' .
- \ '%-Wignored %m %l,' .
- \ '%+Cmore ignored %m %l,' .
- \ '%Zignored end'
- let lines =<< trim END
- ignored warning 1
- more ignored continuation 2
- ignored end
- error resync 4
- END
- Xgetexpr lines
- let l = map(g:Xgetlist(), '[v:val.text, v:val.valid, v:val.lnum, v:val.type]')
- call assert_equal([['resync', 1, 4, 'E']], l)
-
- let &efm = save_efm
-endfunc
-
-func Test_efm_ignore_continuations()
- call Xefm_ignore_continuations('c')
- call Xefm_ignore_continuations('l')
-endfunc
-
-" Tests for invalid error format specifies
-func Xinvalid_efm_Tests(cchar)
- call s:setup_commands(a:cchar)
-
- let save_efm = &efm
-
- set efm=%f:%l:%m,%f:%f:%l:%m
- call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E372:')
-
- set efm=%f:%l:%m,%f:%l:%r:%m
- call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
-
- set efm=%f:%l:%m,%O:%f:%l:%m
- call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
-
- set efm=%f:%l:%m,%f:%l:%*[^a-z
- call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E374:')
-
- set efm=%f:%l:%m,%f:%l:%*c
- call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E375:')
-
- set efm=%f:%l:%m,%L%M%N
- call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E376:')
-
- set efm=%f:%l:%m,%f:%l:%m:%R
- call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E377:')
-
- " Invalid regular expression
- set efm=%\\%%k
- call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E867:')
-
- set efm=
- call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:')
-
- " Empty directory name. When there is an error in parsing new entries, make
- " sure the previous quickfix list is made the current list.
- set efm&
- cexpr ["one", "two"]
- let qf_id = getqflist(#{id: 0}).id
- set efm=%DEntering\ dir\ abc,%f:%l:%m
- call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]', 'E379:')
- call assert_equal(qf_id, getqflist(#{id: 0}).id)
-
- let &efm = save_efm
-endfunc
-
-func Test_invalid_efm()
- call Xinvalid_efm_Tests('c')
- call Xinvalid_efm_Tests('l')
-endfunc
-
-" TODO:
-" Add tests for the following formats in 'errorformat'
-" %r %O
-func Test_efm2()
- let save_efm = &efm
-
- " Test for %s format in efm
- set efm=%f:%s
- cexpr 'Xtestfile:Line search text'
- let l = getqflist()
- call assert_equal('^\VLine search text\$', l[0].pattern)
- call assert_equal(0, l[0].lnum)
-
- let l = split(execute('clist', ''), "\n")
- call assert_equal([' 1 Xtestfile:^\VLine search text\$: '], l)
-
- " Test for a long line
- cexpr 'Xtestfile:' . repeat('a', 1026)
- let l = getqflist()
- call assert_equal('^\V' . repeat('a', 1019) . '\$', l[0].pattern)
-
- " Test for %P, %Q and %t format specifiers
- let lines =<< trim [DATA]
- [Xtestfile1]
- (1,17) error: ';' missing
- (21,2) warning: variable 'z' not defined
- (67,3) error: end of file found before string ended
- --
-
- [Xtestfile2]
- --
-
- [Xtestfile3]
- NEW compiler v1.1
- (2,2) warning: variable 'x' not defined
- (67,3) warning: 's' already defined
- --
- [DATA]
-
- set efm=%+P[%f]%r,(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%+Q--%r
- " To exercise the push/pop file functionality in quickfix, the test files
- " need to be created.
- call writefile(['Line1'], 'Xtestfile1')
- call writefile(['Line2'], 'Xtestfile2')
- call writefile(['Line3'], 'Xtestfile3')
- cexpr ""
- for l in lines
- caddexpr l
- endfor
- let l = getqflist()
- call assert_equal(12, len(l))
- call assert_equal(21, l[2].lnum)
- call assert_equal(2, l[2].col)
- call assert_equal('w', l[2].type)
- call assert_equal('e', l[3].type)
- call delete('Xtestfile1')
- call delete('Xtestfile2')
- call delete('Xtestfile3')
-
- " Test for %P, %Q with non-existing files
- cexpr lines
- let l = getqflist()
- call assert_equal(14, len(l))
- call assert_equal('[Xtestfile1]', l[0].text)
- call assert_equal('[Xtestfile2]', l[6].text)
- call assert_equal('[Xtestfile3]', l[9].text)
-
- " Tests for %E, %C and %Z format specifiers
- let lines =<< trim [DATA]
- Error 275
- line 42
- column 3
- ' ' expected after '--'
- [DATA]
-
- set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
- cgetexpr lines
- let l = getqflist()
- call assert_equal(275, l[0].nr)
- call assert_equal(42, l[0].lnum)
- call assert_equal(3, l[0].col)
- call assert_equal('E', l[0].type)
- call assert_equal("\n' ' expected after '--'", l[0].text)
-
- " Test for %>
- let lines =<< trim [DATA]
- Error in line 147 of foo.c:
- unknown variable 'i'
- [DATA]
-
- set efm=unknown\ variable\ %m,%E%>Error\ in\ line\ %l\ of\ %f:,%Z%m
- cgetexpr lines
- let l = getqflist()
- call assert_equal(147, l[0].lnum)
- call assert_equal('E', l[0].type)
- call assert_equal("\nunknown variable 'i'", l[0].text)
-
- " Test for %A, %C and other formats
- let lines =<< trim [DATA]
- ==============================================================
- FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)
- --------------------------------------------------------------
- Traceback (most recent call last):
- File "unittests/dbfacadeTest.py", line 89, in testFoo
- self.assertEquals(34, dtid)
- File "/usr/lib/python2.2/unittest.py", line 286, in
- failUnlessEqual
- raise self.failureException, \\
- W:AssertionError: 34 != 33
-
- --------------------------------------------------------------
- Ran 27 tests in 0.063s
- [DATA]
-
- set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%t:%m
- cgetexpr lines
- let l = getqflist()
- call assert_equal(8, len(l))
- call assert_equal(89, l[4].lnum)
- call assert_equal(1, l[4].valid)
- call assert_equal('unittests/dbfacadeTest.py', bufname(l[4].bufnr))
- call assert_equal('W', l[4].type)
-
- " Test for %o
- set efm=%f(%o):%l\ %m
- cgetexpr ['Xotestfile(Language.PureScript.Types):20 Error']
- call writefile(['Line1'], 'Xotestfile')
- let l = getqflist()
- call assert_equal(1, len(l), string(l))
- call assert_equal('Language.PureScript.Types', l[0].module)
- copen
- call assert_equal('Language.PureScript.Types|20| Error', getline(1))
- call feedkeys("\<CR>", 'xn')
- call assert_equal('Xotestfile', expand('%:t'))
- cclose
- bd
- call delete("Xotestfile")
-
- " Test for a long module name
- cexpr 'Xtest(' . repeat('m', 1026) . '):15 message'
- let l = getqflist()
- " call assert_equal(repeat('m', 1024), l[0].module)
- call assert_equal(repeat('m', 1023), l[0].module)
- call assert_equal(15, l[0].lnum)
- call assert_equal('message', l[0].text)
-
- " The following sequence of commands used to crash Vim
- set efm=%W%m
- cgetexpr ['msg1']
- let l = getqflist()
- call assert_equal(1, len(l), string(l))
- call assert_equal('msg1', l[0].text)
- set efm=%C%m
- lexpr 'msg2'
- let l = getloclist(0)
- call assert_equal(1, len(l), string(l))
- call assert_equal('msg2', l[0].text)
- lopen
- call setqflist([], 'r')
- caddbuf
- let l = getqflist()
- call assert_equal(1, len(l), string(l))
- call assert_equal('|| msg2', l[0].text)
-
- " When matching error lines, case should be ignored. Test for this.
- set noignorecase
- let l=getqflist({'lines' : ['Xtest:FOO10:Line 20'], 'efm':'%f:foo%l:%m'})
- call assert_equal(10, l.items[0].lnum)
- call assert_equal('Line 20', l.items[0].text)
- set ignorecase&
-
- new | only
- let &efm = save_efm
-endfunc
-
-" Test for '%t' (error type) field in 'efm'
-func Test_efm_error_type()
- let save_efm = &efm
-
- " error type
- set efm=%f:%l:%t:%m
- let lines =<< trim END
- Xfile1:10:E:msg1
- Xfile1:20:W:msg2
- Xfile1:30:I:msg3
- Xfile1:40:N:msg4
- Xfile1:50:R:msg5
- END
- cexpr lines
- let output = split(execute('clist'), "\n")
- call assert_equal([
- \ ' 1 Xfile1:10 error: msg1',
- \ ' 2 Xfile1:20 warning: msg2',
- \ ' 3 Xfile1:30 info: msg3',
- \ ' 4 Xfile1:40 note: msg4',
- \ ' 5 Xfile1:50 R: msg5'], output)
-
- " error type and a error number
- set efm=%f:%l:%t:%n:%m
- let lines =<< trim END
- Xfile1:10:E:2:msg1
- Xfile1:20:W:4:msg2
- Xfile1:30:I:6:msg3
- Xfile1:40:N:8:msg4
- Xfile1:50:R:3:msg5
- END
- cexpr lines
- let output = split(execute('clist'), "\n")
- call assert_equal([
- \ ' 1 Xfile1:10 error 2: msg1',
- \ ' 2 Xfile1:20 warning 4: msg2',
- \ ' 3 Xfile1:30 info 6: msg3',
- \ ' 4 Xfile1:40 note 8: msg4',
- \ ' 5 Xfile1:50 R 3: msg5'], output)
- let &efm = save_efm
-endfunc
-
-" Test for end_lnum ('%e') and end_col ('%k') fields in 'efm'
-func Test_efm_end_lnum_col()
- let save_efm = &efm
-
- " single line
- set efm=%f:%l-%e:%c-%k:%t:%m
- cexpr ["Xfile1:10-20:1-2:E:msg1", "Xfile1:20-30:2-3:W:msg2",]
- let output = split(execute('clist'), "\n")
- call assert_equal([
- \ ' 1 Xfile1:10-20 col 1-2 error: msg1',
- \ ' 2 Xfile1:20-30 col 2-3 warning: msg2'], output)
-
- " multiple lines
- set efm=%A%n)%m,%Z%f:%l-%e:%c-%k
- let lines =<< trim END
- 1)msg1
- Xfile1:14-24:1-2
- 2)msg2
- Xfile1:24-34:3-4
- END
- cexpr lines
- let output = split(execute('clist'), "\n")
- call assert_equal([
- \ ' 1 Xfile1:14-24 col 1-2 error 1: msg1',
- \ ' 2 Xfile1:24-34 col 3-4 error 2: msg2'], output)
- let &efm = save_efm
-endfunc
-
-func XquickfixChangedByAutocmd(cchar)
- call s:setup_commands(a:cchar)
- if a:cchar == 'c'
- let ErrorNr = 'E925'
- func! ReadFunc()
- colder
- cgetexpr []
- endfunc
- else
- let ErrorNr = 'E926'
- func! ReadFunc()
- lolder
- lgetexpr []
- endfunc
- endif
-
- augroup QF_Test
- au!
- autocmd BufReadCmd test_changed.txt call ReadFunc()
- augroup END
-
- new | only
- let words = [ "a", "b" ]
- let qflist = []
- for word in words
- call add(qflist, {'filename': 'test_changed.txt'})
- call g:Xsetlist(qflist, ' ')
- endfor
- call assert_fails('Xrewind', ErrorNr . ':')
-
- augroup QF_Test
- au!
- augroup END
-
- if a:cchar == 'c'
- cexpr ["Xtest1:1:Line"]
- cwindow
- only
- augroup QF_Test
- au!
- autocmd WinEnter * call setqflist([], 'f')
- augroup END
- call assert_fails('exe "normal \<CR>"', 'E925:')
- augroup QF_Test
- au!
- augroup END
- endif
- %bw!
-endfunc
-
-func Test_quickfix_was_changed_by_autocmd()
- call XquickfixChangedByAutocmd('c')
- call XquickfixChangedByAutocmd('l')
-endfunc
-
-func Test_setloclist_in_autocommand()
- call writefile(['test1', 'test2'], 'Xfile')
- edit Xfile
- let s:bufnr = bufnr()
- call setloclist(1,
- \ [{'bufnr' : s:bufnr, 'lnum' : 1, 'text' : 'test1'},
- \ {'bufnr' : s:bufnr, 'lnum' : 2, 'text' : 'test2'}])
-
- augroup Test_LocList
- au!
- autocmd BufEnter * call setloclist(1,
- \ [{'bufnr' : s:bufnr, 'lnum' : 1, 'text' : 'test1'},
- \ {'bufnr' : s:bufnr, 'lnum' : 2, 'text' : 'test2'}], 'r')
- augroup END
-
- lopen
- call assert_fails('exe "normal j\<CR>"', 'E926:')
-
- augroup Test_LocList
- au!
- augroup END
- call delete('Xfile')
-endfunc
-
-func Test_caddbuffer_to_empty()
- helpgr quickfix
- call setqflist([], 'r')
- cad
- try
- cn
- catch
- " number of matches is unknown
- call assert_true(v:exception =~ 'E553:')
- endtry
- quit!
-endfunc
-
-func Test_cgetexpr_works()
- " this must not crash Vim
- cgetexpr [$x]
- lgetexpr [$x]
-endfunc
-
-" Tests for the setqflist() and setloclist() functions
-func SetXlistTests(cchar, bnum)
- call s:setup_commands(a:cchar)
-
- call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 1},
- \ {'bufnr': a:bnum, 'lnum': 2, 'end_lnum': 3, 'col': 4, 'end_col': 5}])
- let l = g:Xgetlist()
- call assert_equal(2, len(l))
- call assert_equal(2, l[1].lnum)
- call assert_equal(3, l[1].end_lnum)
- call assert_equal(4, l[1].col)
- call assert_equal(5, l[1].end_col)
-
- Xnext
- call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3}], 'a')
- let l = g:Xgetlist()
- call assert_equal(3, len(l))
- Xnext
- call assert_equal(3, line('.'))
-
- " Appending entries to the list should not change the cursor position
- " in the quickfix window
- Xwindow
- 1
- call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 4},
- \ {'bufnr': a:bnum, 'lnum': 5}], 'a')
- call assert_equal(1, line('.'))
- close
-
- call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3},
- \ {'bufnr': a:bnum, 'lnum': 4},
- \ {'bufnr': a:bnum, 'lnum': 5}], 'r')
- let l = g:Xgetlist()
- call assert_equal(3, len(l))
- call assert_equal(5, l[2].lnum)
-
- call g:Xsetlist([])
- let l = g:Xgetlist()
- call assert_equal(0, len(l))
-
- " Tests for setting the 'valid' flag
- call g:Xsetlist([{'bufnr':a:bnum, 'lnum':4, 'valid':0}])
- Xwindow
- call assert_equal(1, winnr('$'))
- let l = g:Xgetlist()
- call g:Xsetlist(l)
- call assert_equal(0, g:Xgetlist()[0].valid)
- " Adding a non-valid entry should not mark the list as having valid entries
- call g:Xsetlist([{'bufnr':a:bnum, 'lnum':5, 'valid':0}], 'a')
- Xwindow
- call assert_equal(1, winnr('$'))
-
- " :cnext/:cprev should still work even with invalid entries in the list
- let l = [{'bufnr' : a:bnum, 'lnum' : 1, 'text' : '1', 'valid' : 0},
- \ {'bufnr' : a:bnum, 'lnum' : 2, 'text' : '2', 'valid' : 0}]
- call g:Xsetlist(l)
- Xnext
- call assert_equal(2, g:Xgetlist({'idx' : 0}).idx)
- Xprev
- call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
- " :cnext/:cprev should still work after appending invalid entries to an
- " empty list
- call g:Xsetlist([])
- call g:Xsetlist(l, 'a')
- Xnext
- call assert_equal(2, g:Xgetlist({'idx' : 0}).idx)
- Xprev
- call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
-
- call g:Xsetlist([{'text':'Text1', 'valid':1}])
- Xwindow
- call assert_equal(2, winnr('$'))
- Xclose
- let save_efm = &efm
- set efm=%m
- Xgetexpr 'TestMessage'
- let l = g:Xgetlist()
- call g:Xsetlist(l)
- call assert_equal(1, g:Xgetlist()[0].valid)
- let &efm = save_efm
-
- " Error cases:
- " Refer to a non-existing buffer and pass a non-dictionary type
- call assert_fails("call g:Xsetlist([{'bufnr':998, 'lnum':4}," .
- \ " {'bufnr':999, 'lnum':5}])", 'E92:')
- call g:Xsetlist([[1, 2,3]])
- call assert_equal(0, len(g:Xgetlist()))
- call assert_fails('call g:Xsetlist([], [])', 'E928:')
- call g:Xsetlist([v:_null_dict])
- call assert_equal([], g:Xgetlist())
-endfunc
-
-func Test_setqflist()
- new Xtestfile | only
- let bnum = bufnr('%')
- call setline(1, range(1,5))
-
- call SetXlistTests('c', bnum)
- call SetXlistTests('l', bnum)
-
- enew!
- call delete('Xtestfile')
-endfunc
-
-func Xlist_empty_middle(cchar)
- call s:setup_commands(a:cchar)
-
- " create three quickfix lists
- let @/ = 'Test_'
- Xvimgrep // test_quickfix.vim
- let testlen = len(g:Xgetlist())
- call assert_true(testlen > 0)
- Xvimgrep empty test_quickfix.vim
- call assert_true(len(g:Xgetlist()) > 0)
- Xvimgrep matches test_quickfix.vim
- let matchlen = len(g:Xgetlist())
- call assert_true(matchlen > 0)
- Xolder
- " make the middle list empty
- call g:Xsetlist([], 'r')
- call assert_true(len(g:Xgetlist()) == 0)
- Xolder
- call assert_equal(testlen, len(g:Xgetlist()))
- Xnewer
- Xnewer
- call assert_equal(matchlen, len(g:Xgetlist()))
-endfunc
-
-func Test_setqflist_empty_middle()
- call Xlist_empty_middle('c')
- call Xlist_empty_middle('l')
-endfunc
-
-func Xlist_empty_older(cchar)
- call s:setup_commands(a:cchar)
-
- " create three quickfix lists
- Xvimgrep one test_quickfix.vim
- let onelen = len(g:Xgetlist())
- call assert_true(onelen > 0)
- Xvimgrep two test_quickfix.vim
- let twolen = len(g:Xgetlist())
- call assert_true(twolen > 0)
- Xvimgrep three test_quickfix.vim
- let threelen = len(g:Xgetlist())
- call assert_true(threelen > 0)
- Xolder 2
- " make the first list empty, check the others didn't change
- call g:Xsetlist([], 'r')
- call assert_true(len(g:Xgetlist()) == 0)
- Xnewer
- call assert_equal(twolen, len(g:Xgetlist()))
- Xnewer
- call assert_equal(threelen, len(g:Xgetlist()))
-endfunc
-
-func Test_setqflist_empty_older()
- call Xlist_empty_older('c')
- call Xlist_empty_older('l')
-endfunc
-
-func XquickfixSetListWithAct(cchar)
- call s:setup_commands(a:cchar)
-
- let list1 = [{'filename': 'fnameA', 'text': 'A'},
- \ {'filename': 'fnameB', 'text': 'B'}]
- let list2 = [{'filename': 'fnameC', 'text': 'C'},
- \ {'filename': 'fnameD', 'text': 'D'},
- \ {'filename': 'fnameE', 'text': 'E'}]
-
- " {action} is unspecified. Same as specifying ' '.
- new | only
- silent! Xnewer 99
- call g:Xsetlist(list1)
- call g:Xsetlist(list2)
- let li = g:Xgetlist()
- call assert_equal(3, len(li))
- call assert_equal('C', li[0]['text'])
- call assert_equal('D', li[1]['text'])
- call assert_equal('E', li[2]['text'])
- silent! Xolder
- let li = g:Xgetlist()
- call assert_equal(2, len(li))
- call assert_equal('A', li[0]['text'])
- call assert_equal('B', li[1]['text'])
-
- " {action} is specified ' '.
- new | only
- silent! Xnewer 99
- call g:Xsetlist(list1)
- call g:Xsetlist(list2, ' ')
- let li = g:Xgetlist()
- call assert_equal(3, len(li))
- call assert_equal('C', li[0]['text'])
- call assert_equal('D', li[1]['text'])
- call assert_equal('E', li[2]['text'])
- silent! Xolder
- let li = g:Xgetlist()
- call assert_equal(2, len(li))
- call assert_equal('A', li[0]['text'])
- call assert_equal('B', li[1]['text'])
-
- " {action} is specified 'a'.
- new | only
- silent! Xnewer 99
- call g:Xsetlist(list1)
- call g:Xsetlist(list2, 'a')
- let li = g:Xgetlist()
- call assert_equal(5, len(li))
- call assert_equal('A', li[0]['text'])
- call assert_equal('B', li[1]['text'])
- call assert_equal('C', li[2]['text'])
- call assert_equal('D', li[3]['text'])
- call assert_equal('E', li[4]['text'])
-
- " {action} is specified 'r'.
- new | only
- silent! Xnewer 99
- call g:Xsetlist(list1)
- call g:Xsetlist(list2, 'r')
- let li = g:Xgetlist()
- call assert_equal(3, len(li))
- call assert_equal('C', li[0]['text'])
- call assert_equal('D', li[1]['text'])
- call assert_equal('E', li[2]['text'])
-
- " Test for wrong value.
- new | only
- call assert_fails("call g:Xsetlist(0)", 'E714:')
- call assert_fails("call g:Xsetlist(list1, '')", 'E927:')
- call assert_fails("call g:Xsetlist(list1, 'aa')", 'E927:')
- call assert_fails("call g:Xsetlist(list1, ' a')", 'E927:')
- call assert_fails("call g:Xsetlist(list1, 0)", 'E928:')
-endfunc
-
-func Test_setqflist_invalid_nr()
- " The following command used to crash Vim
- eval []->setqflist(' ', {'nr' : $XXX_DOES_NOT_EXIST})
-endfunc
-
-func Test_setqflist_user_sets_buftype()
- call setqflist([{'text': 'foo'}, {'text': 'bar'}])
- set buftype=quickfix
- call setqflist([], 'a')
- enew
-endfunc
-
-func Test_quickfix_set_list_with_act()
- call XquickfixSetListWithAct('c')
- call XquickfixSetListWithAct('l')
-endfunc
-
-func XLongLinesTests(cchar)
- let l = g:Xgetlist()
-
- call assert_equal(4, len(l))
- call assert_equal(1, l[0].lnum)
- call assert_equal(1, l[0].col)
- call assert_equal(1975, len(l[0].text))
- call assert_equal(2, l[1].lnum)
- call assert_equal(1, l[1].col)
- call assert_equal(4070, len(l[1].text))
- call assert_equal(3, l[2].lnum)
- call assert_equal(1, l[2].col)
- call assert_equal(4070, len(l[2].text))
- call assert_equal(4, l[3].lnum)
- call assert_equal(1, l[3].col)
- call assert_equal(10, len(l[3].text))
-
- call g:Xsetlist([], 'r')
-endfunc
-
-func s:long_lines_tests(cchar)
- call s:setup_commands(a:cchar)
-
- let testfile = 'samples/quickfix.txt'
-
- " file
- exe 'Xgetfile' testfile
- call XLongLinesTests(a:cchar)
-
- " list
- Xexpr readfile(testfile)
- call XLongLinesTests(a:cchar)
-
- " string
- Xexpr join(readfile(testfile), "\n")
- call XLongLinesTests(a:cchar)
-
- " buffer
- exe 'edit' testfile
- exe 'Xbuffer' bufnr('%')
- call XLongLinesTests(a:cchar)
-endfunc
-
-func Test_long_lines()
- call s:long_lines_tests('c')
- call s:long_lines_tests('l')
-endfunc
-
-func Test_cgetfile_on_long_lines()
- " Problematic values if the line is longer than 4096 bytes. Then 1024 bytes
- " are read at a time.
- for len in [4078, 4079, 4080, 5102, 5103, 5104, 6126, 6127, 6128, 7150, 7151, 7152]
- let lines =<< trim END
- /tmp/file1:1:1:aaa
- /tmp/file2:1:1:%s
- /tmp/file3:1:1:bbb
- /tmp/file4:1:1:ccc
- END
- let lines[1] = substitute(lines[1], '%s', repeat('x', len), '')
- call writefile(lines, 'Xcqetfile.txt')
- cgetfile Xcqetfile.txt
- call assert_equal(4, getqflist(#{size: v:true}).size, 'with length ' .. len)
- endfor
- call delete('Xcqetfile.txt')
-endfunc
-
-func s:create_test_file(filename)
- let l = []
- for i in range(1, 20)
- call add(l, 'Line' . i)
- endfor
- call writefile(l, a:filename)
-endfunc
-
-func Test_switchbuf()
- call s:create_test_file('Xqftestfile1')
- call s:create_test_file('Xqftestfile2')
- call s:create_test_file('Xqftestfile3')
-
- new | only
- edit Xqftestfile1
- let file1_winid = win_getid()
- new Xqftestfile2
- let file2_winid = win_getid()
- let lines =<< trim END
- Xqftestfile1:5:Line5
- Xqftestfile1:6:Line6
- Xqftestfile2:10:Line10
- Xqftestfile2:11:Line11
- Xqftestfile3:15:Line15
- Xqftestfile3:16:Line16
- END
- cgetexpr lines
-
- new
- let winid = win_getid()
- cfirst | cnext
- call assert_equal(winid, win_getid())
- 2cnext
- call assert_equal(winid, win_getid())
- 2cnext
- call assert_equal(winid, win_getid())
-
- " Test for 'switchbuf' set to search for files in windows in the current
- " tabpage and jump to an existing window (if present)
- set switchbuf=useopen
- enew
- cfirst | cnext
- call assert_equal(file1_winid, win_getid())
- 2cnext
- call assert_equal(file2_winid, win_getid())
- 2cnext
- call assert_equal(file2_winid, win_getid())
-
- " Test for 'switchbuf' set to search for files in tabpages and jump to an
- " existing tabpage (if present)
- enew | only
- set switchbuf=usetab
- tabedit Xqftestfile1
- tabedit Xqftestfile2
- tabedit Xqftestfile3
- tabfirst
- cfirst | cnext
- call assert_equal(2, tabpagenr())
- 2cnext
- call assert_equal(3, tabpagenr())
- 6cnext
- call assert_equal(4, tabpagenr())
- 2cpfile
- call assert_equal(2, tabpagenr())
- 2cnfile
- call assert_equal(4, tabpagenr())
- tabfirst | tabonly | enew
-
- " Test for 'switchbuf' set to open a new window for every file
- set switchbuf=split
- cfirst | cnext
- call assert_equal(1, winnr('$'))
- cnext | cnext
- call assert_equal(2, winnr('$'))
- cnext | cnext
- call assert_equal(3, winnr('$'))
-
- " Test for 'switchbuf' set to open a new tabpage for every file
- set switchbuf=newtab
- enew | only
- cfirst | cnext
- call assert_equal(1, tabpagenr('$'))
- cnext | cnext
- call assert_equal(2, tabpagenr('$'))
- cnext | cnext
- call assert_equal(3, tabpagenr('$'))
- tabfirst | enew | tabonly | only
-
- set switchbuf=uselast
- split
- let last_winid = win_getid()
- copen
- exe "normal 1G\<CR>"
- call assert_equal(last_winid, win_getid())
- enew | only
-
- " With an empty 'switchbuf', jumping to a quickfix entry should open the
- " file in an existing window (if present)
- set switchbuf=
- edit Xqftestfile1
- let file1_winid = win_getid()
- new Xqftestfile2
- let file2_winid = win_getid()
- copen
- exe "normal 1G\<CR>"
- call assert_equal(file1_winid, win_getid())
- copen
- exe "normal 3G\<CR>"
- call assert_equal(file2_winid, win_getid())
- copen | only
- exe "normal 5G\<CR>"
- call assert_equal(2, winnr('$'))
- call assert_equal(1, bufwinnr('Xqftestfile3'))
-
- " If only quickfix window is open in the current tabpage, jumping to an
- " entry with 'switchbuf' set to 'usetab' should search in other tabpages.
- enew | only
- set switchbuf=usetab
- tabedit Xqftestfile1
- tabedit Xqftestfile2
- tabedit Xqftestfile3
- tabfirst
- copen | only
- clast
- call assert_equal(4, tabpagenr())
- tabfirst | tabonly | enew | only
-
- " Jumping to a file that is not present in any of the tabpages and the
- " current tabpage doesn't have any usable windows, should open it in a new
- " window in the current tabpage.
- copen | only
- cfirst
- call assert_equal(1, tabpagenr())
- call assert_equal('Xqftestfile1', @%)
-
- " If opening a file changes 'switchbuf', then the new value should be
- " retained.
- set modeline&vim
- call writefile(["vim: switchbuf=split"], 'Xqftestfile1')
- enew | only
- set switchbuf&vim
- cexpr "Xqftestfile1:1:10"
- call assert_equal('split', &switchbuf)
- call writefile(["vim: switchbuf=usetab"], 'Xqftestfile1')
- enew | only
- set switchbuf=useopen
- cexpr "Xqftestfile1:1:10"
- call assert_equal('usetab', &switchbuf)
- call writefile(["vim: switchbuf&vim"], 'Xqftestfile1')
- enew | only
- set switchbuf=useopen
- cexpr "Xqftestfile1:1:10"
- call assert_equal('uselast', &switchbuf)
-
- call delete('Xqftestfile1')
- call delete('Xqftestfile2')
- call delete('Xqftestfile3')
- set switchbuf&vim
-
- enew | only
-endfunc
-
-func Xadjust_qflnum(cchar)
- call s:setup_commands(a:cchar)
-
- enew | only
-
- let fname = 'Xqftestfile' . a:cchar
- call s:create_test_file(fname)
- exe 'edit ' . fname
-
- Xgetexpr [fname . ':5:Line5',
- \ fname . ':10:Line10',
- \ fname . ':15:Line15',
- \ fname . ':20:Line20']
-
- 6,14delete
- call append(6, ['Buffer', 'Window'])
-
- let l = g:Xgetlist()
- call assert_equal(5, l[0].lnum)
- call assert_equal(6, l[2].lnum)
- call assert_equal(13, l[3].lnum)
-
- " If a file doesn't have any quickfix entries, then deleting lines in the
- " file should not update the quickfix list
- call g:Xsetlist([], 'f')
- 1,2delete
- call assert_equal([], g:Xgetlist())
-
- enew!
- call delete(fname)
-endfunc
-
-func Test_adjust_lnum()
- call setloclist(0, [])
- call Xadjust_qflnum('c')
- call setqflist([])
- call Xadjust_qflnum('l')
-endfunc
-
-" Tests for the :grep/:lgrep and :grepadd/:lgrepadd commands
-func s:test_xgrep(cchar)
- call s:setup_commands(a:cchar)
-
- " The following lines are used for the grep test. Don't remove.
- " Grep_Test_Text: Match 1
- " Grep_Test_Text: Match 2
- " GrepAdd_Test_Text: Match 1
- " GrepAdd_Test_Text: Match 2
- enew! | only
- set makeef&vim
- silent Xgrep Grep_Test_Text: test_quickfix.vim
- call assert_true(len(g:Xgetlist()) == 5)
- Xopen
- call assert_true(w:quickfix_title =~ '^:grep')
- Xclose
- enew
- set makeef=Temp_File_##
- silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
- call assert_true(len(g:Xgetlist()) == 9)
-
- " Try with 'grepprg' set to 'internal'
- set grepprg=internal
- silent Xgrep Grep_Test_Text: test_quickfix.vim
- silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
- call assert_true(len(g:Xgetlist()) == 9)
- set grepprg&vim
-
- call writefile(['Vim'], 'XtestTempFile')
- set makeef=XtestTempFile
- silent Xgrep Grep_Test_Text: test_quickfix.vim
- call assert_equal(5, len(g:Xgetlist()))
- call assert_false(filereadable('XtestTempFile'))
- set makeef&vim
-endfunc
-
-func Test_grep()
- if !has('unix')
- " The grepprg may not be set on non-Unix systems
- return
- endif
-
- call s:test_xgrep('c')
- call s:test_xgrep('l')
-endfunc
-
-func Test_two_windows()
- " Use one 'errorformat' for two windows. Add an expression to each of them,
- " make sure they each keep their own state.
- set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
- call mkdir('Xone/a', 'p')
- call mkdir('Xtwo/a', 'p')
- let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
- call writefile(lines, 'Xone/a/one.txt')
- call writefile(lines, 'Xtwo/a/two.txt')
-
- new one
- let one_id = win_getid()
- lexpr ""
- new two
- let two_id = win_getid()
- lexpr ""
-
- laddexpr "Entering dir 'Xtwo/a'"
- call win_gotoid(one_id)
- laddexpr "Entering dir 'Xone/a'"
- call win_gotoid(two_id)
- laddexpr 'two.txt:5:two two two'
- call win_gotoid(one_id)
- laddexpr 'one.txt:3:one one one'
-
- let loc_one = getloclist(one_id)
- call assert_equal('Xone/a/one.txt', bufname(loc_one[1].bufnr))
- call assert_equal(3, loc_one[1].lnum)
-
- let loc_two = getloclist(two_id)
- call assert_equal('Xtwo/a/two.txt', bufname(loc_two[1].bufnr))
- call assert_equal(5, loc_two[1].lnum)
-
- call win_gotoid(one_id)
- bwipe!
- call win_gotoid(two_id)
- bwipe!
- call delete('Xone', 'rf')
- call delete('Xtwo', 'rf')
-endfunc
-
-func XbottomTests(cchar)
- call s:setup_commands(a:cchar)
-
- " Calling lbottom without any errors should fail
- if a:cchar == 'l'
- call assert_fails('lbottom', 'E776:')
- endif
-
- call g:Xsetlist([{'filename': 'foo', 'lnum': 42}])
- Xopen
- let wid = win_getid()
- call assert_equal(1, line('.'))
- wincmd w
- call g:Xsetlist([{'filename': 'var', 'lnum': 24}], 'a')
- Xbottom
- call win_gotoid(wid)
- call assert_equal(2, line('.'))
- Xclose
-endfunc
-
-" Tests for the :cbottom and :lbottom commands
-func Test_cbottom()
- call XbottomTests('c')
- call XbottomTests('l')
-endfunc
-
-func HistoryTest(cchar)
- call s:setup_commands(a:cchar)
-
- " clear all lists after the first one, then replace the first one.
- call g:Xsetlist([])
- call assert_fails('Xolder 99', 'E380:')
- let entry = {'filename': 'foo', 'lnum': 42}
- call g:Xsetlist([entry], 'r')
- call g:Xsetlist([entry, entry])
- call g:Xsetlist([entry, entry, entry])
- let res = split(execute(a:cchar . 'hist'), "\n")
- call assert_equal(3, len(res))
- let common = 'errors :set' . (a:cchar == 'c' ? 'qf' : 'loc') . 'list()'
- call assert_equal(' error list 1 of 3; 1 ' . common, res[0])
- call assert_equal(' error list 2 of 3; 2 ' . common, res[1])
- call assert_equal('> error list 3 of 3; 3 ' . common, res[2])
-
- " Test for changing the quickfix lists
- call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
- exe '1' . a:cchar . 'hist'
- call assert_equal(1, g:Xgetlist({'nr' : 0}).nr)
- exe '3' . a:cchar . 'hist'
- call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
- call assert_fails('-2' . a:cchar . 'hist', 'E16:')
- call assert_fails('4' . a:cchar . 'hist', 'E16:')
-
- call g:Xsetlist([], 'f')
- let l = split(execute(a:cchar . 'hist'), "\n")
- call assert_equal('No entries', l[0])
- if a:cchar == 'c'
- call assert_fails('4chist', 'E16:')
- else
- call assert_fails('4lhist', 'E776:')
- endif
-
- " An empty list should still show the stack history
- call g:Xsetlist([])
- let res = split(execute(a:cchar . 'hist'), "\n")
- call assert_equal('> error list 1 of 1; 0 ' . common, res[0])
-
- call g:Xsetlist([], 'f')
-endfunc
-
-func Test_history()
- call HistoryTest('c')
- call HistoryTest('l')
-endfunc
-
-func Test_duplicate_buf()
- " make sure we can get the highest buffer number
- edit DoesNotExist
- edit DoesNotExist2
- let last_buffer = bufnr("$")
-
- " make sure only one buffer is created
- call writefile(['this one', 'that one'], 'Xgrepthis')
- vimgrep one Xgrepthis
- vimgrep one Xgrepthis
- call assert_equal(last_buffer + 1, bufnr("$"))
-
- call delete('Xgrepthis')
-endfunc
-
-" Quickfix/Location list set/get properties tests
-func Xproperty_tests(cchar)
- call s:setup_commands(a:cchar)
-
- " Error cases
- call assert_fails('call g:Xgetlist(99)', 'E715:')
- call assert_fails('call g:Xsetlist(99)', 'E714:')
- call assert_fails('call g:Xsetlist([], "a", [])', 'E715:')
-
- " Set and get the title
- call g:Xsetlist([])
- Xopen
- wincmd p
- call g:Xsetlist([{'filename':'foo', 'lnum':27}])
- let s = g:Xsetlist([], 'a', {'title' : 'Sample'})
- call assert_equal(0, s)
- let d = g:Xgetlist({"title":1})
- call assert_equal('Sample', d.title)
- " Try setting title to a non-string value
- call assert_equal(-1, g:Xsetlist([], 'a', {'title' : ['Test']}))
- call assert_equal('Sample', g:Xgetlist({"title":1}).title)
-
- Xopen
- call assert_equal('Sample', w:quickfix_title)
- Xclose
-
- " Tests for action argument
- silent! Xolder 999
- let qfnr = g:Xgetlist({'all':1}).nr
- call g:Xsetlist([], 'r', {'title' : 'N1'})
- call assert_equal('N1', g:Xgetlist({'all':1}).title)
- call g:Xsetlist([], ' ', {'title' : 'N2'})
- call assert_equal(qfnr + 1, g:Xgetlist({'all':1}).nr)
-
- let res = g:Xgetlist({'nr': 0})
- call assert_equal(qfnr + 1, res.nr)
- call assert_equal(['nr'], keys(res))
-
- call g:Xsetlist([], ' ', {'title' : 'N3'})
- call assert_equal('N2', g:Xgetlist({'nr':2, 'title':1}).title)
-
- " Changing the title of an earlier quickfix list
- call g:Xsetlist([], 'r', {'title' : 'NewTitle', 'nr' : 2})
- call assert_equal('NewTitle', g:Xgetlist({'nr':2, 'title':1}).title)
-
- " Changing the title of an invalid quickfix list
- call assert_equal(-1, g:Xsetlist([], ' ',
- \ {'title' : 'SomeTitle', 'nr' : 99}))
- call assert_equal(-1, g:Xsetlist([], ' ',
- \ {'title' : 'SomeTitle', 'nr' : 'abc'}))
-
- if a:cchar == 'c'
- copen
- call assert_equal({'winid':win_getid()}, getqflist({'winid':1}))
- cclose
- endif
-
- " Invalid arguments
- call assert_fails('call g:Xgetlist([])', 'E715')
- call assert_fails('call g:Xsetlist([], "a", [])', 'E715')
- let s = g:Xsetlist([], 'a', {'abc':1})
- call assert_equal(-1, s)
-
- call assert_equal({}, g:Xgetlist({'abc':1}))
- call assert_equal('', g:Xgetlist({'nr':99, 'title':1}).title)
- call assert_equal('', g:Xgetlist({'nr':[], 'title':1}).title)
-
- if a:cchar == 'l'
- call assert_equal({}, getloclist(99, {'title': 1}))
- endif
-
- " Context related tests
- let s = g:Xsetlist([], 'a', {'context':[1,2,3]})
- call assert_equal(0, s)
- call test_garbagecollect_now()
- let d = g:Xgetlist({'context':1})
- call assert_equal([1,2,3], d.context)
- call g:Xsetlist([], 'a', {'context':{'color':'green'}})
- let d = g:Xgetlist({'context':1})
- call assert_equal({'color':'green'}, d.context)
- call g:Xsetlist([], 'a', {'context':"Context info"})
- let d = g:Xgetlist({'context':1})
- call assert_equal("Context info", d.context)
- call g:Xsetlist([], 'a', {'context':246})
- let d = g:Xgetlist({'context':1})
- call assert_equal(246, d.context)
- " set other Vim data types as context
- call g:Xsetlist([], 'a', {'context' : v:_null_blob})
- call g:Xsetlist([], 'a', {'context' : ''})
- call test_garbagecollect_now()
- if a:cchar == 'l'
- " Test for copying context across two different location lists
- new | only
- let w1_id = win_getid()
- let l = [1]
- call setloclist(0, [], 'a', {'context':l})
- new
- let w2_id = win_getid()
- call add(l, 2)
- call assert_equal([1, 2], getloclist(w1_id, {'context':1}).context)
- call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
- unlet! l
- call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
- only
- call setloclist(0, [], 'f')
- call assert_equal('', getloclist(0, {'context':1}).context)
- endif
-
- " Test for changing the context of previous quickfix lists
- call g:Xsetlist([], 'f')
- Xexpr "One"
- Xexpr "Two"
- Xexpr "Three"
- call g:Xsetlist([], 'r', {'context' : [1], 'nr' : 1})
- call g:Xsetlist([], 'a', {'context' : [2], 'nr' : 2})
- " Also, check for setting the context using quickfix list number zero.
- call g:Xsetlist([], 'r', {'context' : [3], 'nr' : 0})
- call test_garbagecollect_now()
- let l = g:Xgetlist({'nr' : 1, 'context' : 1})
- call assert_equal([1], l.context)
- let l = g:Xgetlist({'nr' : 2, 'context' : 1})
- call assert_equal([2], l.context)
- let l = g:Xgetlist({'nr' : 3, 'context' : 1})
- call assert_equal([3], l.context)
-
- " Test for changing the context through reference and for garbage
- " collection of quickfix context
- let l = ["red"]
- call g:Xsetlist([], ' ', {'context' : l})
- call add(l, "blue")
- let x = g:Xgetlist({'context' : 1})
- call add(x.context, "green")
- call assert_equal(["red", "blue", "green"], l)
- call assert_equal(["red", "blue", "green"], x.context)
- unlet l
- call test_garbagecollect_now()
- let m = g:Xgetlist({'context' : 1})
- call assert_equal(["red", "blue", "green"], m.context)
-
- " Test for setting/getting items
- Xexpr ""
- let qfprev = g:Xgetlist({'nr':0})
- let s = g:Xsetlist([], ' ', {'title':'Green',
- \ 'items' : [{'filename':'F1', 'lnum':10}]})
- call assert_equal(0, s)
- let qfcur = g:Xgetlist({'nr':0})
- call assert_true(qfcur.nr == qfprev.nr + 1)
- let l = g:Xgetlist({'items':1})
- call assert_equal('F1', bufname(l.items[0].bufnr))
- call assert_equal(10, l.items[0].lnum)
- call g:Xsetlist([], 'a', {'items' : [{'filename':'F2', 'lnum':20},
- \ {'filename':'F2', 'lnum':30}]})
- let l = g:Xgetlist({'items':1})
- call assert_equal('F2', bufname(l.items[2].bufnr))
- call assert_equal(30, l.items[2].lnum)
- call g:Xsetlist([], 'r', {'items' : [{'filename':'F3', 'lnum':40}]})
- let l = g:Xgetlist({'items':1})
- call assert_equal('F3', bufname(l.items[0].bufnr))
- call assert_equal(40, l.items[0].lnum)
- call g:Xsetlist([], 'r', {'items' : []})
- let l = g:Xgetlist({'items':1})
- call assert_equal(0, len(l.items))
-
- call g:Xsetlist([], 'r', {'title' : 'TestTitle'})
- call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
- call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
- call assert_equal('TestTitle', g:Xgetlist({'title' : 1}).title)
-
- " Test for getting id of window associated with a location list window
- if a:cchar == 'l'
- only
- call assert_equal(0, g:Xgetlist({'all' : 1}).filewinid)
- let wid = win_getid()
- Xopen
- call assert_equal(wid, g:Xgetlist({'filewinid' : 1}).filewinid)
- wincmd w
- call assert_equal(0, g:Xgetlist({'filewinid' : 1}).filewinid)
- only
- endif
-
- " The following used to crash Vim with address sanitizer
- call g:Xsetlist([], 'f')
- call g:Xsetlist([], 'a', {'items' : [{'filename':'F1', 'lnum':10}]})
- call assert_equal(10, g:Xgetlist({'items':1}).items[0].lnum)
-
- " Try setting the items using a string
- call assert_equal(-1, g:Xsetlist([], ' ', {'items' : 'Test'}))
-
- " Save and restore the quickfix stack
- call g:Xsetlist([], 'f')
- call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
- Xexpr "File1:10:Line1"
- Xexpr "File2:20:Line2"
- Xexpr "File3:30:Line3"
- let last_qf = g:Xgetlist({'nr':'$'}).nr
- call assert_equal(3, last_qf)
- let qstack = []
- for i in range(1, last_qf)
- let qstack = add(qstack, g:Xgetlist({'nr':i, 'all':1}))
- endfor
- call g:Xsetlist([], 'f')
- for i in range(len(qstack))
- call g:Xsetlist([], ' ', qstack[i])
- endfor
- call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
- call assert_equal(10, g:Xgetlist({'nr':1, 'items':1}).items[0].lnum)
- call assert_equal(20, g:Xgetlist({'nr':2, 'items':1}).items[0].lnum)
- call assert_equal(30, g:Xgetlist({'nr':3, 'items':1}).items[0].lnum)
- call g:Xsetlist([], 'f')
-
- " Swap two quickfix lists
- Xexpr "File1:10:Line10"
- Xexpr "File2:20:Line20"
- Xexpr "File3:30:Line30"
- call g:Xsetlist([], 'r', {'nr':1,'title':'Colors','context':['Colors']})
- call g:Xsetlist([], 'r', {'nr':2,'title':'Fruits','context':['Fruits']})
- let l1=g:Xgetlist({'nr':1,'all':1})
- let l2=g:Xgetlist({'nr':2,'all':1})
- let save_id = l1.id
- let l1.id=l2.id
- let l2.id=save_id
- call g:Xsetlist([], 'r', l1)
- call g:Xsetlist([], 'r', l2)
- let newl1=g:Xgetlist({'nr':1,'all':1})
- let newl2=g:Xgetlist({'nr':2,'all':1})
- call assert_equal('Fruits', newl1.title)
- call assert_equal(['Fruits'], newl1.context)
- call assert_equal('Line20', newl1.items[0].text)
- call assert_equal('Colors', newl2.title)
- call assert_equal(['Colors'], newl2.context)
- call assert_equal('Line10', newl2.items[0].text)
- call g:Xsetlist([], 'f')
-
- " Cannot specify both a non-empty list argument and a dict argument
- call assert_fails("call g:Xsetlist([{}], ' ', {})", 'E475:')
-endfunc
-
-func Test_qf_property()
- call Xproperty_tests('c')
- call Xproperty_tests('l')
-endfunc
-
-" Test for setting the current index in the location/quickfix list
-func Xtest_setqfidx(cchar)
- call s:setup_commands(a:cchar)
-
- Xgetexpr "F1:10:1:Line1\nF2:20:2:Line2\nF3:30:3:Line3"
- Xgetexpr "F4:10:1:Line1\nF5:20:2:Line2\nF6:30:3:Line3"
- Xgetexpr "F7:10:1:Line1\nF8:20:2:Line2\nF9:30:3:Line3"
-
- call g:Xsetlist([], 'a', {'nr' : 3, 'idx' : 2})
- call g:Xsetlist([], 'a', {'nr' : 2, 'idx' : 2})
- call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 3})
- Xolder 2
- Xopen
- call assert_equal(3, line('.'))
- Xnewer
- call assert_equal(2, line('.'))
- Xnewer
- call assert_equal(2, line('.'))
- " Update the current index with the quickfix window open
- wincmd w
- call g:Xsetlist([], 'a', {'nr' : 3, 'idx' : 3})
- Xopen
- call assert_equal(3, line('.'))
- Xclose
-
- " Set the current index to the last entry
- call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : '$'})
- call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
- " A large value should set the index to the last index
- call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 1})
- call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 999})
- call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
- " Invalid index values
- call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : -1})
- call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
- call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 0})
- call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
- call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 'xx'})
- call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
- call assert_fails("call g:Xsetlist([], 'a', {'nr':1, 'idx':[]})", 'E745:')
-
- call g:Xsetlist([], 'f')
- new | only
-endfunc
-
-func Test_setqfidx()
- call Xtest_setqfidx('c')
- call Xtest_setqfidx('l')
-endfunc
-
-" Tests for the QuickFixCmdPre/QuickFixCmdPost autocommands
-func QfAutoCmdHandler(loc, cmd)
- call add(g:acmds, a:loc . a:cmd)
-endfunc
-
-func Test_Autocmd()
- autocmd QuickFixCmdPre * call QfAutoCmdHandler('pre', expand('<amatch>'))
- autocmd QuickFixCmdPost * call QfAutoCmdHandler('post', expand('<amatch>'))
-
- let g:acmds = []
- cexpr "F1:10:Line 10"
- caddexpr "F1:20:Line 20"
- cgetexpr "F1:30:Line 30"
- cexpr ""
- caddexpr ""
- cgetexpr ""
- silent! cexpr non_existing_func()
- silent! caddexpr non_existing_func()
- silent! cgetexpr non_existing_func()
- let l =<< trim END
- precexpr
- postcexpr
- precaddexpr
- postcaddexpr
- precgetexpr
- postcgetexpr
- precexpr
- postcexpr
- precaddexpr
- postcaddexpr
- precgetexpr
- postcgetexpr
- precexpr
- precaddexpr
- precgetexpr
- END
- call assert_equal(l, g:acmds)
-
- let g:acmds = []
- enew! | call append(0, "F2:10:Line 10")
- cbuffer!
- enew! | call append(0, "F2:20:Line 20")
- cgetbuffer
- enew! | call append(0, "F2:30:Line 30")
- caddbuffer
-
- new
- let bnum = bufnr('%')
- bunload
- exe 'silent! cbuffer! ' . bnum
- exe 'silent! cgetbuffer ' . bnum
- exe 'silent! caddbuffer ' . bnum
- enew!
- let l =<< trim END
- precbuffer
- postcbuffer
- precgetbuffer
- postcgetbuffer
- precaddbuffer
- postcaddbuffer
- precbuffer
- precgetbuffer
- precaddbuffer
- END
- call assert_equal(l, g:acmds)
-
- call writefile(['Xtest:1:Line1'], 'Xtest')
- call writefile([], 'Xempty')
- let g:acmds = []
- cfile Xtest
- caddfile Xtest
- cgetfile Xtest
- cfile Xempty
- caddfile Xempty
- cgetfile Xempty
- silent! cfile do_not_exist
- silent! caddfile do_not_exist
- silent! cgetfile do_not_exist
- let l =<< trim END
- precfile
- postcfile
- precaddfile
- postcaddfile
- precgetfile
- postcgetfile
- precfile
- postcfile
- precaddfile
- postcaddfile
- precgetfile
- postcgetfile
- precfile
- postcfile
- precaddfile
- postcaddfile
- precgetfile
- postcgetfile
- END
- call assert_equal(l, g:acmds)
-
- let g:acmds = []
- helpgrep quickfix
- silent! helpgrep non_existing_help_topic
- vimgrep test Xtest
- vimgrepadd test Xtest
- silent! vimgrep non_existing_test Xtest
- silent! vimgrepadd non_existing_test Xtest
- set makeprg=
- silent! make
- set makeprg&
- let l =<< trim END
- prehelpgrep
- posthelpgrep
- prehelpgrep
- posthelpgrep
- previmgrep
- postvimgrep
- previmgrepadd
- postvimgrepadd
- previmgrep
- postvimgrep
- previmgrepadd
- postvimgrepadd
- premake
- postmake
- END
- call assert_equal(l, g:acmds)
-
- if has('unix')
- " Run this test only on Unix-like systems. The grepprg may not be set on
- " non-Unix systems.
- " The following lines are used for the grep test. Don't remove.
- " Grep_Autocmd_Text: Match 1
- " GrepAdd_Autocmd_Text: Match 2
- let g:acmds = []
- silent grep Grep_Autocmd_Text test_quickfix.vim
- silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
- silent grep abc123def Xtest
- silent grepadd abc123def Xtest
- set grepprg=internal
- silent grep Grep_Autocmd_Text test_quickfix.vim
- silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
- silent lgrep Grep_Autocmd_Text test_quickfix.vim
- silent lgrepadd GrepAdd_Autocmd_Text test_quickfix.vim
- set grepprg&vim
- let l =<< trim END
- pregrep
- postgrep
- pregrepadd
- postgrepadd
- pregrep
- postgrep
- pregrepadd
- postgrepadd
- pregrep
- postgrep
- pregrepadd
- postgrepadd
- prelgrep
- postlgrep
- prelgrepadd
- postlgrepadd
- END
- call assert_equal(l, g:acmds)
- endif
-
- call delete('Xtest')
- call delete('Xempty')
- au! QuickFixCmdPre
- au! QuickFixCmdPost
-endfunc
-
-func Test_Autocmd_Exception()
- set efm=%m
- lgetexpr '?'
-
- try
- call DoesNotExit()
- catch
- lgetexpr '1'
- finally
- lgetexpr '1'
- endtry
-
- call assert_equal('1', getloclist(0)[0].text)
-
- set efm&vim
-endfunc
-
-func Test_caddbuffer_wrong()
- " This used to cause a memory access in freed memory.
- let save_efm = &efm
- set efm=%EEEE%m,%WWWW,%+CCCC%>%#,%GGGG%.#
- cgetexpr ['WWWW', 'EEEE', 'CCCC']
- let &efm = save_efm
- caddbuffer
- bwipe!
-endfunc
-
-func Test_caddexpr_wrong()
- " This used to cause a memory access in freed memory.
- cbuffer
- cbuffer
- copen
- let save_efm = &efm
- set efm=%
- call assert_fails('caddexpr ""', 'E376:')
- let &efm = save_efm
-endfunc
-
-func Test_dirstack_cleanup()
- " This used to cause a memory access in freed memory.
- let save_efm = &efm
- lexpr '0'
- lopen
- fun X(c)
- let save_efm=&efm
- set efm=%D%f
- if a:c == 'c'
- caddexpr '::'
- else
- laddexpr ':0:0'
- endif
- let &efm=save_efm
- endfun
- call X('c')
- call X('l')
- call setqflist([], 'r')
- caddbuffer
- let &efm = save_efm
-endfunc
-
-" Tests for jumping to entries from the location list window and quickfix
-" window
-func Test_cwindow_jump()
- set efm=%f%%%l%%%m
- lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
- lopen | only
- lfirst
- call assert_true(winnr('$') == 2)
- call assert_true(winnr() == 1)
- " Location list for the new window should be set
- call assert_true(getloclist(0)[2].text == 'Line 30')
-
- " Open a scratch buffer
- " Open a new window and create a location list
- " Open the location list window and close the other window
- " Jump to an entry.
- " Should create a new window and jump to the entry. The scratch buffer
- " should not be used.
- enew | only
- set buftype=nofile
- below new
- lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
- lopen
- 2wincmd c
- lnext
- call assert_true(winnr('$') == 3)
- call assert_true(winnr() == 2)
-
- " Open two windows with two different location lists
- " Open the location list window and close the previous window
- " Jump to an entry in the location list window
- " Should open the file in the first window and not set the location list.
- enew | only
- lgetexpr ["F1%5%Line 5"]
- below new
- lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
- lopen
- 2wincmd c
- lnext
- call assert_true(winnr() == 1)
- call assert_true(getloclist(0)[0].text == 'Line 5')
-
- enew | only
- cgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
- copen
- cnext
- call assert_true(winnr('$') == 2)
- call assert_true(winnr() == 1)
-
- " open the quickfix buffer in two windows and jump to an entry. Should open
- " the file in the first quickfix window.
- enew | only
- copen
- let bnum = bufnr('')
- exe 'sbuffer ' . bnum
- wincmd b
- cfirst
- call assert_equal(2, winnr())
- call assert_equal('F1', @%)
- enew | only
- exe 'sb' bnum
- exe 'botright sb' bnum
- wincmd t
- clast
- call assert_equal(2, winnr())
- call assert_equal('quickfix', getwinvar(1, '&buftype'))
- call assert_equal('quickfix', getwinvar(3, '&buftype'))
-
- " Jumping to a file from the location list window should find a usable
- " window by wrapping around the window list.
- enew | only
- call setloclist(0, [], 'f')
- new | new
- lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
- lopen
- 1close
- call assert_equal(0, getloclist(3, {'id' : 0}).id)
- lnext
- call assert_equal(3, winnr())
- call assert_equal(getloclist(1, {'id' : 0}).id, getloclist(3, {'id' : 0}).id)
-
- enew | only
- set efm&vim
-endfunc
-
-func Test_cwindow_highlight()
- CheckScreendump
-
- let lines =<< trim END
- call setline(1, ['some', 'text', 'with', 'matches'])
- write XCwindow
- vimgrep e XCwindow
- redraw
- cwindow 4
- END
- call writefile(lines, 'XtestCwindow')
- let buf = RunVimInTerminal('-S XtestCwindow', #{rows: 12})
- call VerifyScreenDump(buf, 'Test_quickfix_cwindow_1', {})
-
- call term_sendkeys(buf, ":cnext\<CR>")
- call VerifyScreenDump(buf, 'Test_quickfix_cwindow_2', {})
-
- " clean up
- call StopVimInTerminal(buf)
- call delete('XtestCwindow')
- call delete('XCwindow')
-endfunc
-
-func XvimgrepTests(cchar)
- call s:setup_commands(a:cchar)
-
- let lines =<< trim END
- Editor:VIM vim
- Editor:Emacs EmAcS
- Editor:Notepad NOTEPAD
- END
- call writefile(lines, 'Xtestfile1')
- call writefile(['Linux', 'macOS', 'MS-Windows'], 'Xtestfile2')
-
- " Error cases
- call assert_fails('Xvimgrep /abc *', 'E682:')
-
- let @/=''
- call assert_fails('Xvimgrep // *', 'E35:')
-
- call assert_fails('Xvimgrep abc', 'E683:')
- call assert_fails('Xvimgrep a1b2c3 Xtestfile1', 'E480:')
- call assert_fails('Xvimgrep pat Xa1b2c3', 'E480:')
-
- Xexpr ""
- Xvimgrepadd Notepad Xtestfile1
- Xvimgrepadd macOS Xtestfile2
- let l = g:Xgetlist()
- call assert_equal(2, len(l))
- call assert_equal('Editor:Notepad NOTEPAD', l[0].text)
-
- 10Xvimgrep #\cvim#g Xtestfile?
- let l = g:Xgetlist()
- call assert_equal(2, len(l))
- call assert_equal(8, l[0].col)
- call assert_equal(11, l[0].end_col)
- call assert_equal(12, l[1].col)
- call assert_equal(15, l[1].end_col)
-
- 1Xvimgrep ?Editor? Xtestfile*
- let l = g:Xgetlist()
- call assert_equal(1, len(l))
- call assert_equal('Editor:VIM vim', l[0].text)
-
- edit +3 Xtestfile2
- Xvimgrep +\cemacs+j Xtestfile1
- let l = g:Xgetlist()
- call assert_equal('Xtestfile2', @%)
- call assert_equal('Editor:Emacs EmAcS', l[0].text)
-
- " Test for unloading a buffer after vimgrep searched the buffer
- %bwipe
- Xvimgrep /Editor/j Xtestfile*
- call assert_equal(0, getbufinfo('Xtestfile1')[0].loaded)
- call assert_equal([], getbufinfo('Xtestfile2'))
-
- " Test for opening the dummy buffer used by vimgrep in a window. The new
- " window should be closed
- %bw!
- augroup QF_Test
- au!
- autocmd BufReadPre * exe "sb " .. expand("<abuf>")
- augroup END
- call assert_fails("Xvimgrep /sublime/ Xtestfile1", 'E480:')
- call assert_equal(1, winnr('$'))
- augroup QF_Test
- au!
- augroup END
-
- call delete('Xtestfile1')
- call delete('Xtestfile2')
-endfunc
-
-" Tests for the :vimgrep command
-func Test_vimgrep()
- call XvimgrepTests('c')
- call XvimgrepTests('l')
-endfunc
-
-func Test_vimgrep_wildcards_expanded_once()
- new X[id-01] file.txt
- call setline(1, 'some text to search for')
- vimgrep text %
- bwipe!
-endfunc
-
-" Test for incsearch highlighting of the :vimgrep pattern
-" This test used to cause "E315: ml_get: invalid lnum" errors.
-func Test_vimgrep_incsearch()
- CheckFunction test_override
- enew
- set incsearch
- call test_override("char_avail", 1)
-
- call feedkeys(":2vimgrep assert test_quickfix.vim test_cdo.vim\<CR>", "ntx")
- let l = getqflist()
- call assert_equal(2, len(l))
-
- call test_override("ALL", 0)
- set noincsearch
-endfunc
-
-" Test vimgrep with the last search pattern not set
-func Test_vimgrep_with_no_last_search_pat()
- let lines =<< trim [SCRIPT]
- call assert_fails('vimgrep // *', 'E35:')
- call writefile(v:errors, 'Xresult')
- qall!
- [SCRIPT]
- call writefile(lines, 'Xscript')
- if RunVim([], [], '--clean -S Xscript')
- call assert_equal([], readfile('Xresult'))
- endif
- call delete('Xscript')
- call delete('Xresult')
-endfunc
-
-" Test vimgrep without swap file
-func Test_vimgrep_without_swap_file()
- let lines =<< trim [SCRIPT]
- vimgrep grep test_c*
- call writefile(['done'], 'Xresult')
- qall!
- [SCRIPT]
- call writefile(lines, 'Xscript')
- if RunVim([], [], '--clean -n -S Xscript Xscript')
- call assert_equal(['done'], readfile('Xresult'))
- endif
- call delete('Xscript')
- call delete('Xresult')
-endfunc
-
-func Test_vimgrep_existing_swapfile()
- call writefile(['match apple with apple'], 'Xapple')
- call writefile(['swapfile'], '.Xapple.swp')
- let g:foundSwap = 0
- let g:ignoreSwapExists = 1
- augroup grep
- au SwapExists * let foundSwap = 1 | let v:swapchoice = 'e'
- augroup END
- vimgrep apple Xapple
- call assert_equal(1, g:foundSwap)
- call assert_match('.Xapple.swo', swapname(''))
-
- call delete('Xapple')
- call delete('Xapple.swp')
- augroup grep
- au! SwapExists
- augroup END
- unlet g:ignoreSwapExists
-endfunc
-
-func XfreeTests(cchar)
- call s:setup_commands(a:cchar)
-
- enew | only
-
- " Deleting the quickfix stack should work even When the current list is
- " somewhere in the middle of the stack
- Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
- Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
- Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
- Xolder
- call g:Xsetlist([], 'f')
- call assert_equal(0, len(g:Xgetlist()))
-
- " After deleting the stack, adding a new list should create a stack with a
- " single list.
- Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
- call assert_equal(1, g:Xgetlist({'all':1}).nr)
-
- " Deleting the stack from a quickfix window should update/clear the
- " quickfix/location list window.
- Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
- Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
- Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
- Xolder
- Xwindow
- call g:Xsetlist([], 'f')
- call assert_equal(2, winnr('$'))
- call assert_equal(1, line('$'))
- Xclose
-
- " Deleting the stack from a non-quickfix window should update/clear the
- " quickfix/location list window.
- Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
- Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
- Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
- Xolder
- Xwindow
- wincmd p
- call g:Xsetlist([], 'f')
- call assert_equal(0, len(g:Xgetlist()))
- wincmd p
- call assert_equal(2, winnr('$'))
- call assert_equal(1, line('$'))
-
- " After deleting the location list stack, if the location list window is
- " opened, then a new location list should be created. So opening the
- " location list window again should not create a new window.
- if a:cchar == 'l'
- lexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
- wincmd p
- lopen
- call assert_equal(2, winnr('$'))
- endif
- Xclose
-endfunc
-
-" Tests for the quickfix free functionality
-func Test_qf_free()
- call XfreeTests('c')
- call XfreeTests('l')
-endfunc
-
-" Test for buffer overflow when parsing lines and adding new entries to
-" the quickfix list.
-func Test_bufoverflow()
- set efm=%f:%l:%m
- cgetexpr ['File1:100:' . repeat('x', 1025)]
-
- set efm=%+GCompiler:\ %.%#,%f:%l:%m
- cgetexpr ['Compiler: ' . repeat('a', 1015), 'File1:10:Hello World']
-
- set efm=%DEntering\ directory\ %f,%f:%l:%m
- cgetexpr ['Entering directory ' . repeat('a', 1006),
- \ 'File1:10:Hello World']
- set efm&vim
-endfunc
-
-" Tests for getting the quickfix stack size
-func XsizeTests(cchar)
- call s:setup_commands(a:cchar)
-
- call g:Xsetlist([], 'f')
- call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
- call assert_equal('', g:Xgetlist({'nr':'$', 'all':1}).title)
- call assert_equal(0, g:Xgetlist({'nr':0}).nr)
-
- Xexpr "File1:10:Line1"
- Xexpr "File2:20:Line2"
- Xexpr "File3:30:Line3"
- Xolder | Xolder
- call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
- call g:Xsetlist([], 'f')
-
- Xexpr "File1:10:Line1"
- Xexpr "File2:20:Line2"
- Xexpr "File3:30:Line3"
- Xolder | Xolder
- call g:Xsetlist([], 'a', {'nr':'$', 'title':'Compiler'})
- call assert_equal('Compiler', g:Xgetlist({'nr':3, 'all':1}).title)
-endfunc
-
-func Test_Qf_Size()
- call XsizeTests('c')
- call XsizeTests('l')
-endfunc
-
-func Test_cclose_from_copen()
- augroup QF_Test
- au!
- au FileType qf :call assert_fails(':cclose', 'E788')
- augroup END
- copen
- augroup QF_Test
- au!
- augroup END
- augroup! QF_Test
-endfunc
-
-func Test_cclose_in_autocmd()
- " Problem is only triggered if "starting" is zero, so that the OptionSet
- " event will be triggered.
- " call test_override('starting', 1)
- augroup QF_Test
- au!
- au FileType qf :call assert_fails(':cclose', 'E788')
- augroup END
- copen
- augroup QF_Test
- au!
- augroup END
- augroup! QF_Test
- " call test_override('starting', 0)
-endfunc
-
-" Check that ":file" without an argument is possible even when "curbuf->b_ro_locked"
-" is set.
-func Test_file_from_copen()
- " Works without argument.
- augroup QF_Test
- au!
- au FileType qf file
- augroup END
- copen
-
- augroup QF_Test
- au!
- augroup END
- cclose
-
- " Fails with argument.
- augroup QF_Test
- au!
- au FileType qf call assert_fails(':file foo', 'E788')
- augroup END
- copen
- augroup QF_Test
- au!
- augroup END
- cclose
-
- augroup! QF_Test
-endfunc
-
-func Test_resize_from_copen()
- augroup QF_Test
- au!
- au FileType qf resize 5
- augroup END
- try
- " This should succeed without any exception. No other buffers are
- " involved in the autocmd.
- copen
- finally
- augroup QF_Test
- au!
- augroup END
- augroup! QF_Test
- endtry
-endfunc
-
-func Test_filetype_autocmd()
- " this changes the location list while it is in use to fill a buffer
- lexpr ''
- lopen
- augroup FT_loclist
- au FileType * call setloclist(0, [], 'f')
- augroup END
- silent! lolder
- lexpr ''
-
- augroup FT_loclist
- au! FileType
- augroup END
-endfunc
-
-func Test_vimgrep_with_textlock()
- new
-
- " Simple way to execute something with "textlock" set.
- " Check that vimgrep without jumping can be executed.
- au InsertCharPre * vimgrep /RunTheTest/j runtest.vim
- normal ax
- let qflist = getqflist()
- call assert_true(len(qflist) > 0)
- call assert_match('RunTheTest', qflist[0].text)
- call setqflist([], 'r')
- au! InsertCharPre
-
- " Check that vimgrepadd without jumping can be executed.
- au InsertCharPre * vimgrepadd /RunTheTest/j runtest.vim
- normal ax
- let qflist = getqflist()
- call assert_true(len(qflist) > 0)
- call assert_match('RunTheTest', qflist[0].text)
- call setqflist([], 'r')
- au! InsertCharPre
-
- " Check that lvimgrep without jumping can be executed.
- au InsertCharPre * lvimgrep /RunTheTest/j runtest.vim
- normal ax
- let qflist = getloclist(0)
- call assert_true(len(qflist) > 0)
- call assert_match('RunTheTest', qflist[0].text)
- call setloclist(0, [], 'r')
- au! InsertCharPre
-
- " Check that lvimgrepadd without jumping can be executed.
- au InsertCharPre * lvimgrepadd /RunTheTest/j runtest.vim
- normal ax
- let qflist = getloclist(0)
- call assert_true(len(qflist) > 0)
- call assert_match('RunTheTest', qflist[0].text)
- call setloclist(0, [], 'r')
- au! InsertCharPre
-
- " trying to jump will give an error
- au InsertCharPre * vimgrep /RunTheTest/ runtest.vim
- call assert_fails('normal ax', 'E565:')
- au! InsertCharPre
-
- au InsertCharPre * vimgrepadd /RunTheTest/ runtest.vim
- call assert_fails('normal ax', 'E565:')
- au! InsertCharPre
-
- au InsertCharPre * lvimgrep /RunTheTest/ runtest.vim
- call assert_fails('normal ax', 'E565:')
- au! InsertCharPre
-
- au InsertCharPre * lvimgrepadd /RunTheTest/ runtest.vim
- call assert_fails('normal ax', 'E565:')
- au! InsertCharPre
-
- bwipe!
-endfunc
-
-" Tests for the quickfix buffer b:changedtick variable
-func Xchangedtick_tests(cchar)
- call s:setup_commands(a:cchar)
-
- new | only
-
- Xexpr "" | Xexpr "" | Xexpr ""
-
- Xopen
- Xolder
- Xolder
- Xaddexpr "F1:10:Line10"
- Xaddexpr "F2:20:Line20"
- call g:Xsetlist([{"filename":"F3", "lnum":30, "text":"Line30"}], 'a')
- call g:Xsetlist([], 'f')
- call assert_equal(8, getbufvar('%', 'changedtick'))
- Xclose
-endfunc
-
-func Test_changedtick()
- call Xchangedtick_tests('c')
- call Xchangedtick_tests('l')
-endfunc
-
-" Tests for parsing an expression using setqflist()
-func Xsetexpr_tests(cchar)
- call s:setup_commands(a:cchar)
-
- let t = ["File1:10:Line10", "File1:20:Line20"]
- call g:Xsetlist([], ' ', {'lines' : t})
- call g:Xsetlist([], 'a', {'lines' : ["File1:30:Line30"]})
-
- let l = g:Xgetlist()
- call assert_equal(3, len(l))
- call assert_equal(20, l[1].lnum)
- call assert_equal('Line30', l[2].text)
- call g:Xsetlist([], 'r', {'lines' : ["File2:5:Line5"]})
- let l = g:Xgetlist()
- call assert_equal(1, len(l))
- call assert_equal('Line5', l[0].text)
- call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : 10}))
- call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : "F1:10:L10"}))
-
- call g:Xsetlist([], 'f')
- " Add entries to multiple lists
- call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:10:Line10"]})
- call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:20:Line20"]})
- call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:15:Line15"]})
- call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:25:Line25"]})
- call assert_equal('Line15', g:Xgetlist({'nr':1, 'items':1}).items[1].text)
- call assert_equal('Line25', g:Xgetlist({'nr':2, 'items':1}).items[1].text)
-
- " Adding entries using a custom efm
- set efm&
- call g:Xsetlist([], ' ', {'efm' : '%f#%l#%m',
- \ 'lines' : ["F1#10#L10", "F2#20#L20"]})
- call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
- call g:Xsetlist([], 'a', {'efm' : '%f#%l#%m', 'lines' : ["F3:30:L30"]})
- call assert_equal('F3:30:L30', g:Xgetlist({'items':1}).items[2].text)
- call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
- call assert_equal(-1, g:Xsetlist([], 'a', {'efm' : [],
- \ 'lines' : ['F1:10:L10']}))
-endfunc
-
-func Test_setexpr()
- call Xsetexpr_tests('c')
- call Xsetexpr_tests('l')
-endfunc
-
-" Tests for per quickfix/location list directory stack
-func Xmultidirstack_tests(cchar)
- call s:setup_commands(a:cchar)
-
- call g:Xsetlist([], 'f')
- Xexpr "" | Xexpr ""
-
- call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["Entering dir 'Xone/a'"]})
- call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["Entering dir 'Xtwo/a'"]})
- call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["one.txt:3:one one one"]})
- call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["two.txt:5:two two two"]})
-
- let l1 = g:Xgetlist({'nr':1, 'items':1})
- let l2 = g:Xgetlist({'nr':2, 'items':1})
- call assert_equal('Xone/a/one.txt', bufname(l1.items[1].bufnr))
- call assert_equal(3, l1.items[1].lnum)
- call assert_equal('Xtwo/a/two.txt', bufname(l2.items[1].bufnr))
- call assert_equal(5, l2.items[1].lnum)
-endfunc
-
-func Test_multidirstack()
- call mkdir('Xone/a', 'p')
- call mkdir('Xtwo/a', 'p')
- let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
- call writefile(lines, 'Xone/a/one.txt')
- call writefile(lines, 'Xtwo/a/two.txt')
- let save_efm = &efm
- set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
-
- call Xmultidirstack_tests('c')
- call Xmultidirstack_tests('l')
-
- let &efm = save_efm
- call delete('Xone', 'rf')
- call delete('Xtwo', 'rf')
-endfunc
-
-" Tests for per quickfix/location list file stack
-func Xmultifilestack_tests(cchar)
- call s:setup_commands(a:cchar)
-
- call g:Xsetlist([], 'f')
- Xexpr "" | Xexpr ""
-
- call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["[one.txt]"]})
- call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["[two.txt]"]})
- call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["(3,5) one one one"]})
- call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["(5,9) two two two"]})
-
- let l1 = g:Xgetlist({'nr':1, 'items':1})
- let l2 = g:Xgetlist({'nr':2, 'items':1})
- call assert_equal('one.txt', bufname(l1.items[1].bufnr))
- call assert_equal(3, l1.items[1].lnum)
- call assert_equal('two.txt', bufname(l2.items[1].bufnr))
- call assert_equal(5, l2.items[1].lnum)
-
- " Test for start of a new error line in the same line where a previous
- " error line ends with a file stack.
- let efm_val = 'Error\ l%l\ in\ %f,'
- let efm_val .= '%-P%>(%f%r,Error\ l%l\ in\ %m,%-Q)%r'
- let lines =<< trim END
- (one.txt
- Error l4 in one.txt
- ) (two.txt
- Error l6 in two.txt
- )
- Error l8 in one.txt
- END
- let l = g:Xgetlist({'lines': lines, 'efm' : efm_val})
- call assert_equal(3, len(l.items))
- call assert_equal('one.txt', bufname(l.items[0].bufnr))
- call assert_equal(4, l.items[0].lnum)
- call assert_equal('one.txt', l.items[0].text)
- call assert_equal('two.txt', bufname(l.items[1].bufnr))
- call assert_equal(6, l.items[1].lnum)
- call assert_equal('two.txt', l.items[1].text)
- call assert_equal('one.txt', bufname(l.items[2].bufnr))
- call assert_equal(8, l.items[2].lnum)
- call assert_equal('', l.items[2].text)
-endfunc
-
-func Test_multifilestack()
- let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
- call writefile(lines, 'one.txt')
- call writefile(lines, 'two.txt')
- let save_efm = &efm
- set efm=%+P[%f],(%l\\,%c)\ %m,%-Q
-
- call Xmultifilestack_tests('c')
- call Xmultifilestack_tests('l')
-
- let &efm = save_efm
- call delete('one.txt')
- call delete('two.txt')
-endfunc
-
-" Tests for per buffer 'efm' setting
-func Test_perbuf_efm()
- call writefile(["File1-10-Line10"], 'one.txt')
- call writefile(["File2#20#Line20"], 'two.txt')
- set efm=%f#%l#%m
- new | only
- new
- setlocal efm=%f-%l-%m
- cfile one.txt
- wincmd w
- caddfile two.txt
-
- let l = getqflist()
- call assert_equal(10, l[0].lnum)
- call assert_equal('Line20', l[1].text)
-
- set efm&
- new | only
- call delete('one.txt')
- call delete('two.txt')
-endfunc
-
-" Open multiple help windows using ":lhelpgrep
-" This test used to crash Vim
-func Test_Multi_LL_Help()
- new | only
- lhelpgrep window
- lopen
- e#
- lhelpgrep buffer
- call assert_equal(3, winnr('$'))
- call assert_true(len(getloclist(1)) != 0)
- call assert_true(len(getloclist(2)) != 0)
- new | only
-endfunc
-
-" Tests for adding new quickfix lists using setqflist()
-func XaddQf_tests(cchar)
- call s:setup_commands(a:cchar)
-
- " Create a new list using ' ' for action
- call g:Xsetlist([], 'f')
- call g:Xsetlist([], ' ', {'title' : 'Test1'})
- let l = g:Xgetlist({'nr' : '$', 'all' : 1})
- call assert_equal(1, l.nr)
- call assert_equal('Test1', l.title)
-
- " Create a new list using ' ' for action and '$' for 'nr'
- call g:Xsetlist([], 'f')
- call g:Xsetlist([], ' ', {'title' : 'Test2', 'nr' : '$'})
- let l = g:Xgetlist({'nr' : '$', 'all' : 1})
- call assert_equal(1, l.nr)
- call assert_equal('Test2', l.title)
-
- " Create a new list using 'a' for action
- call g:Xsetlist([], 'f')
- call g:Xsetlist([], 'a', {'title' : 'Test3'})
- let l = g:Xgetlist({'nr' : '$', 'all' : 1})
- call assert_equal(1, l.nr)
- call assert_equal('Test3', l.title)
-
- " Create a new list using 'a' for action and '$' for 'nr'
- call g:Xsetlist([], 'f')
- call g:Xsetlist([], 'a', {'title' : 'Test3', 'nr' : '$'})
- call g:Xsetlist([], 'a', {'title' : 'Test4'})
- let l = g:Xgetlist({'nr' : '$', 'all' : 1})
- call assert_equal(1, l.nr)
- call assert_equal('Test4', l.title)
-
- " Adding a quickfix list should remove all the lists following the current
- " list.
- Xexpr "" | Xexpr "" | Xexpr ""
- silent! 10Xolder
- call g:Xsetlist([], ' ', {'title' : 'Test5'})
- let l = g:Xgetlist({'nr' : '$', 'all' : 1})
- call assert_equal(2, l.nr)
- call assert_equal('Test5', l.title)
-
- " Add a quickfix list using '$' as the list number.
- let lastqf = g:Xgetlist({'nr':'$'}).nr
- silent! 99Xolder
- call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test6'})
- let l = g:Xgetlist({'nr' : '$', 'all' : 1})
- call assert_equal(lastqf + 1, l.nr)
- call assert_equal('Test6', l.title)
-
- " Add a quickfix list using 'nr' set to one more than the quickfix
- " list size.
- let lastqf = g:Xgetlist({'nr':'$'}).nr
- silent! 99Xolder
- call g:Xsetlist([], ' ', {'nr' : lastqf + 1, 'title' : 'Test7'})
- let l = g:Xgetlist({'nr' : '$', 'all' : 1})
- call assert_equal(lastqf + 1, l.nr)
- call assert_equal('Test7', l.title)
-
- " Add a quickfix list to a stack with 10 lists using 'nr' set to '$'
- exe repeat('Xexpr "" |', 9) . 'Xexpr ""'
- silent! 99Xolder
- call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test8'})
- let l = g:Xgetlist({'nr' : '$', 'all' : 1})
- call assert_equal(10, l.nr)
- call assert_equal('Test8', l.title)
-
- " Add a quickfix list using 'nr' set to a value greater than 10
- call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 12, 'title' : 'Test9'}))
-
- " Try adding a quickfix list with 'nr' set to a value greater than the
- " quickfix list size but less than 10.
- call g:Xsetlist([], 'f')
- Xexpr "" | Xexpr "" | Xexpr ""
- silent! 99Xolder
- call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 8, 'title' : 'Test10'}))
-
- " Add a quickfix list using 'nr' set to a some string or list
- call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : [1,2], 'title' : 'Test11'}))
-endfunc
-
-func Test_add_qf()
- call XaddQf_tests('c')
- call XaddQf_tests('l')
-endfunc
-
-" Test for getting the quickfix list items from some text without modifying
-" the quickfix stack
-func XgetListFromLines(cchar)
- call s:setup_commands(a:cchar)
- call g:Xsetlist([], 'f')
-
- let l = g:Xgetlist({'lines' : ["File2:20:Line20", "File2:30:Line30"]}).items
- call assert_equal(2, len(l))
- call assert_equal(30, l[1].lnum)
-
- call assert_equal({}, g:Xgetlist({'lines' : 10}))
- call assert_equal({}, g:Xgetlist({'lines' : 'File1:10:Line10'}))
- call assert_equal([], g:Xgetlist({'lines' : []}).items)
- call assert_equal([], g:Xgetlist({'lines' : [10, 20]}).items)
-
- " Parse text using a custom efm
- set efm&
- let l = g:Xgetlist({'lines':['File3#30#Line30'], 'efm' : '%f#%l#%m'}).items
- call assert_equal('Line30', l[0].text)
- let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : '%f-%l-%m'}).items
- call assert_equal('File3:30:Line30', l[0].text)
- let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : [1,2]})
- call assert_equal({}, l)
- call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':'%2'})", 'E376:')
- call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':''})", 'E378:')
-
- " Make sure that the quickfix stack is not modified
- call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
-endfunc
-
-func Test_get_list_from_lines()
- call XgetListFromLines('c')
- call XgetListFromLines('l')
-endfunc
-
-" Tests for the quickfix list id
-func Xqfid_tests(cchar)
- call s:setup_commands(a:cchar)
-
- call g:Xsetlist([], 'f')
- call assert_equal(0, g:Xgetlist({'id':0}).id)
- Xexpr ''
- let start_id = g:Xgetlist({'id' : 0}).id
- Xexpr '' | Xexpr ''
- Xolder
- call assert_equal(start_id, g:Xgetlist({'id':0, 'nr':1}).id)
- call assert_equal(start_id + 1, g:Xgetlist({'id':0, 'nr':0}).id)
- call assert_equal(start_id + 2, g:Xgetlist({'id':0, 'nr':'$'}).id)
- call assert_equal(0, g:Xgetlist({'id':0, 'nr':99}).id)
- call assert_equal(2, g:Xgetlist({'id':start_id + 1, 'nr':0}).nr)
- call assert_equal(0, g:Xgetlist({'id':99, 'nr':0}).id)
- call assert_equal(0, g:Xgetlist({'id':"abc", 'nr':0}).id)
-
- call g:Xsetlist([], 'a', {'id':start_id, 'context':[1,2]})
- call assert_equal([1,2], g:Xgetlist({'nr':1, 'context':1}).context)
- call g:Xsetlist([], 'a', {'id':start_id+1, 'lines':['F1:10:L10']})
- call assert_equal('L10', g:Xgetlist({'nr':2, 'items':1}).items[0].text)
- call assert_equal(-1, g:Xsetlist([], 'a', {'id':999, 'title':'Vim'}))
- call assert_equal(-1, g:Xsetlist([], 'a', {'id':'abc', 'title':'Vim'}))
-
- let qfid = g:Xgetlist({'id':0, 'nr':0})
- call g:Xsetlist([], 'f')
- call assert_equal(0, g:Xgetlist({'id':qfid, 'nr':0}).id)
-endfunc
-
-func Test_qf_id()
- call Xqfid_tests('c')
- call Xqfid_tests('l')
-endfunc
-
-func Xqfjump_tests(cchar)
- call s:setup_commands(a:cchar)
-
- call writefile(["Line1\tFoo", "Line2"], 'F1')
- call writefile(["Line1\tBar", "Line2"], 'F2')
- call writefile(["Line1\tBaz", "Line2"], 'F3')
-
- call g:Xsetlist([], 'f')
-
- " Tests for
- " Jumping to a line using a pattern
- " Jumping to a column greater than the last column in a line
- " Jumping to a line greater than the last line in the file
- let l = []
- for i in range(1, 7)
- call add(l, {})
- endfor
- let l[0].filename='F1'
- let l[0].pattern='Line1'
- let l[1].filename='F2'
- let l[1].pattern='Line1'
- let l[2].filename='F3'
- let l[2].pattern='Line1'
- let l[3].filename='F3'
- let l[3].lnum=1
- let l[3].col=9
- let l[3].vcol=1
- let l[4].filename='F3'
- let l[4].lnum=99
- let l[5].filename='F3'
- let l[5].lnum=1
- let l[5].col=99
- let l[5].vcol=1
- let l[6].filename='F3'
- let l[6].pattern='abcxyz'
-
- call g:Xsetlist([], ' ', {'items' : l})
- Xopen | only
- 2Xnext
- call assert_equal(3, g:Xgetlist({'idx' : 0}).idx)
- call assert_equal('F3', @%)
- Xnext
- call assert_equal(7, col('.'))
- Xnext
- call assert_equal(2, line('.'))
- Xnext
- call assert_equal(9, col('.'))
- 2
- Xnext
- call assert_equal(2, line('.'))
-
- if a:cchar == 'l'
- " When jumping to a location list entry in the location list window and
- " no usable windows are available, then a new window should be opened.
- enew! | new | only
- call g:Xsetlist([], 'f')
- setlocal buftype=nofile
- new
- let lines =<< trim END
- F1:1:1:Line1
- F1:2:2:Line2
- F2:1:1:Line1
- F2:2:2:Line2
- F3:1:1:Line1
- F3:2:2:Line2
- END
- call g:Xsetlist([], ' ', {'lines': lines})
- Xopen
- let winid = win_getid()
- wincmd p
- close
- call win_gotoid(winid)
- Xnext
- call assert_equal(3, winnr('$'))
- call assert_equal(1, winnr())
- call assert_equal(2, line('.'))
-
- " When jumping to an entry in the location list window and the window
- " associated with the location list is not present and a window containing
- " the file is already present, then that window should be used.
- close
- belowright new
- call g:Xsetlist([], 'f')
- edit F3
- call win_gotoid(winid)
- Xlast
- call assert_equal(3, winnr())
- call assert_equal(6, g:Xgetlist({'size' : 1}).size)
- call assert_equal(winid, g:Xgetlist({'winid' : 1}).winid)
- endif
-
- " Cleanup
- enew!
- new | only
-
- call delete('F1')
- call delete('F2')
- call delete('F3')
-endfunc
-
-func Test_qfjump()
- call Xqfjump_tests('c')
- call Xqfjump_tests('l')
-endfunc
-
-" Tests for the getqflist() and getloclist() functions when the list is not
-" present or is empty
-func Xgetlist_empty_tests(cchar)
- call s:setup_commands(a:cchar)
-
- " Empty quickfix stack
- call g:Xsetlist([], 'f')
- call assert_equal('', g:Xgetlist({'context' : 0}).context)
- call assert_equal(0, g:Xgetlist({'id' : 0}).id)
- call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
- call assert_equal([], g:Xgetlist({'items' : 0}).items)
- call assert_equal(0, g:Xgetlist({'nr' : 0}).nr)
- call assert_equal(0, g:Xgetlist({'size' : 0}).size)
- call assert_equal('', g:Xgetlist({'title' : 0}).title)
- call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
- call assert_equal(0, g:Xgetlist({'changedtick' : 0}).changedtick)
- if a:cchar == 'c'
- call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
- \ 'items' : [], 'nr' : 0, 'size' : 0, 'qfbufnr' : 0,
- \ 'title' : '', 'winid' : 0, 'changedtick': 0,
- \ 'quickfixtextfunc' : ''}, g:Xgetlist({'all' : 0}))
- else
- call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
- \ 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '',
- \ 'winid' : 0, 'changedtick': 0, 'filewinid' : 0,
- \ 'qfbufnr' : 0, 'quickfixtextfunc' : ''},
- \ g:Xgetlist({'all' : 0}))
- endif
-
- " Quickfix window with empty stack
- silent! Xopen
- let qfwinid = (a:cchar == 'c') ? win_getid() : 0
- let qfbufnr = (a:cchar == 'c') ? bufnr('') : 0
- call assert_equal(qfwinid, g:Xgetlist({'winid' : 0}).winid)
- Xclose
-
- " Empty quickfix list
- Xexpr ""
- call assert_equal('', g:Xgetlist({'context' : 0}).context)
- call assert_notequal(0, g:Xgetlist({'id' : 0}).id)
- call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
- call assert_equal([], g:Xgetlist({'items' : 0}).items)
- call assert_notequal(0, g:Xgetlist({'nr' : 0}).nr)
- call assert_equal(0, g:Xgetlist({'size' : 0}).size)
- call assert_notequal('', g:Xgetlist({'title' : 0}).title)
- call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
- call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
-
- let qfid = g:Xgetlist({'id' : 0}).id
- call g:Xsetlist([], 'f')
-
- " Non-existing quickfix identifier
- call assert_equal('', g:Xgetlist({'id' : qfid, 'context' : 0}).context)
- call assert_equal(0, g:Xgetlist({'id' : qfid}).id)
- call assert_equal(0, g:Xgetlist({'id' : qfid, 'idx' : 0}).idx)
- call assert_equal([], g:Xgetlist({'id' : qfid, 'items' : 0}).items)
- call assert_equal(0, g:Xgetlist({'id' : qfid, 'nr' : 0}).nr)
- call assert_equal(0, g:Xgetlist({'id' : qfid, 'size' : 0}).size)
- call assert_equal('', g:Xgetlist({'id' : qfid, 'title' : 0}).title)
- call assert_equal(0, g:Xgetlist({'id' : qfid, 'winid' : 0}).winid)
- call assert_equal(0, g:Xgetlist({'id' : qfid, 'changedtick' : 0}).changedtick)
- if a:cchar == 'c'
- call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
- \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
- \ 'qfbufnr' : qfbufnr, 'quickfixtextfunc' : '',
- \ 'changedtick' : 0}, g:Xgetlist({'id' : qfid, 'all' : 0}))
- else
- call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
- \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
- \ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0,
- \ 'quickfixtextfunc' : ''},
- \ g:Xgetlist({'id' : qfid, 'all' : 0}))
- endif
-
- " Non-existing quickfix list number
- call assert_equal('', g:Xgetlist({'nr' : 5, 'context' : 0}).context)
- call assert_equal(0, g:Xgetlist({'nr' : 5}).nr)
- call assert_equal(0, g:Xgetlist({'nr' : 5, 'idx' : 0}).idx)
- call assert_equal([], g:Xgetlist({'nr' : 5, 'items' : 0}).items)
- call assert_equal(0, g:Xgetlist({'nr' : 5, 'id' : 0}).id)
- call assert_equal(0, g:Xgetlist({'nr' : 5, 'size' : 0}).size)
- call assert_equal('', g:Xgetlist({'nr' : 5, 'title' : 0}).title)
- call assert_equal(0, g:Xgetlist({'nr' : 5, 'winid' : 0}).winid)
- call assert_equal(0, g:Xgetlist({'nr' : 5, 'changedtick' : 0}).changedtick)
- if a:cchar == 'c'
- call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
- \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
- \ 'changedtick' : 0, 'qfbufnr' : qfbufnr,
- \ 'quickfixtextfunc' : ''}, g:Xgetlist({'nr' : 5, 'all' : 0}))
- else
- call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
- \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
- \ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0,
- \ 'quickfixtextfunc' : ''}, g:Xgetlist({'nr' : 5, 'all' : 0}))
- endif
-endfunc
-
-func Test_empty_list_quickfixtextfunc()
- " This was crashing. Can only reproduce by running it in a separate Vim
- " instance.
- let lines =<< trim END
- func s:Func(o)
- cgetexpr '0'
- endfunc
- cope
- let &quickfixtextfunc = 's:Func'
- cgetfile [ex
- END
- call writefile(lines, 'Xquickfixtextfunc')
- call RunVim([], [], '-e -s -S Xquickfixtextfunc -c qa')
- call delete('Xquickfixtextfunc')
-endfunc
-
-func Test_getqflist()
- call Xgetlist_empty_tests('c')
- call Xgetlist_empty_tests('l')
-endfunc
-
-
-func Test_getqflist_invalid_nr()
- " The following commands used to crash Vim
- cexpr ""
- call getqflist({'nr' : $XXX_DOES_NOT_EXIST_XXX})
-
- " Cleanup
- call setqflist([], 'r')
-endfunc
-
-" Tests for the quickfix/location list changedtick
-func Xqftick_tests(cchar)
- call s:setup_commands(a:cchar)
-
- call g:Xsetlist([], 'f')
-
- Xexpr "F1:10:Line10"
- let qfid = g:Xgetlist({'id' : 0}).id
- call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
- Xaddexpr "F2:20:Line20\nF2:21:Line21"
- call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
- call g:Xsetlist([], 'a', {'lines' : ["F3:30:Line30", "F3:31:Line31"]})
- call assert_equal(3, g:Xgetlist({'changedtick' : 0}).changedtick)
- call g:Xsetlist([], 'r', {'lines' : ["F4:40:Line40"]})
- call assert_equal(4, g:Xgetlist({'changedtick' : 0}).changedtick)
- call g:Xsetlist([], 'a', {'title' : 'New Title'})
- call assert_equal(5, g:Xgetlist({'changedtick' : 0}).changedtick)
-
- enew!
- call append(0, ["F5:50:L50", "F6:60:L60"])
- Xaddbuffer
- call assert_equal(6, g:Xgetlist({'changedtick' : 0}).changedtick)
- enew!
-
- call g:Xsetlist([], 'a', {'context' : {'bus' : 'pci'}})
- call assert_equal(7, g:Xgetlist({'changedtick' : 0}).changedtick)
- call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
- \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'a')
- call assert_equal(8, g:Xgetlist({'changedtick' : 0}).changedtick)
- call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
- \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], ' ')
- call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
- call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
- \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'r')
- call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
-
- if isdirectory("Xone")
- call delete("Xone", 'rf')
- endif
- call writefile(["F8:80:L80", "F8:81:L81"], "Xone")
- Xfile Xone
- call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
- Xaddfile Xone
- call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
-
- " Test case for updating a non-current quickfix list
- call g:Xsetlist([], 'f')
- Xexpr "F1:1:L1"
- Xexpr "F2:2:L2"
- call g:Xsetlist([], 'a', {'nr' : 1, "lines" : ["F10:10:L10"]})
- call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
- call assert_equal(2, g:Xgetlist({'nr' : 1, 'changedtick' : 0}).changedtick)
-
- call delete("Xone")
-endfunc
-
-func Test_qf_tick()
- call Xqftick_tests('c')
- call Xqftick_tests('l')
-endfunc
-
-" Test helpgrep with lang specifier
-func Xtest_helpgrep_with_lang_specifier(cchar)
- call s:setup_commands(a:cchar)
- Xhelpgrep Vim@en
- call assert_equal('help', &filetype)
- call assert_notequal(0, g:Xgetlist({'nr' : '$'}).nr)
- new | only
-endfunc
-
-func Test_helpgrep_with_lang_specifier()
- call Xtest_helpgrep_with_lang_specifier('c')
- call Xtest_helpgrep_with_lang_specifier('l')
-endfunc
-
-" The following test used to crash Vim.
-" Open the location list window and close the regular window associated with
-" the location list. When the garbage collection runs now, it incorrectly
-" marks the location list context as not in use and frees the context.
-func Test_ll_window_ctx()
- call setloclist(0, [], 'f')
- call setloclist(0, [], 'a', {'context' : []})
- lopen | only
- call test_garbagecollect_now()
- echo getloclist(0, {'context' : 1}).context
- enew | only
-endfunc
-
-" The following test used to crash vim
-func Test_lfile_crash()
- sp Xtest
- au QuickFixCmdPre * bw
- call assert_fails('lfile', 'E40')
- au! QuickFixCmdPre
-endfunc
-
-" The following test used to crash vim
-func Test_lbuffer_crash()
- sv Xtest
- augroup QF_Test
- au!
- au QuickFixCmdPre,QuickFixCmdPost,BufEnter,BufLeave * bw
- augroup END
- lbuffer
- augroup QF_Test
- au!
- augroup END
-endfunc
-
-" The following test used to crash vim
-func Test_lexpr_crash()
- augroup QF_Test
- au!
- au QuickFixCmdPre,QuickFixCmdPost,BufEnter,BufLeave * call setloclist(0, [], 'f')
- augroup END
- lexpr ""
- augroup QF_Test
- au!
- augroup END
-
- enew | only
- augroup QF_Test
- au!
- au BufNew * call setloclist(0, [], 'f')
- augroup END
- lexpr 'x:1:x'
- augroup QF_Test
- au!
- augroup END
-
- enew | only
- lexpr ''
- lopen
- augroup QF_Test
- au!
- au FileType * call setloclist(0, [], 'f')
- augroup END
- lexpr ''
- augroup QF_Test
- au!
- augroup END
-endfunc
-
-" The following test used to crash Vim
-func Test_lvimgrep_crash()
- sv Xtest
- augroup QF_Test
- au!
- au QuickFixCmdPre,QuickFixCmdPost,BufEnter,BufLeave * call setloclist(0, [], 'f')
- augroup END
- lvimgrep quickfix test_quickfix.vim
- augroup QF_Test
- au!
- augroup END
-
- new | only
- augroup QF_Test
- au!
- au BufEnter * call setloclist(0, [], 'r')
- augroup END
- call assert_fails('lvimgrep Test_lvimgrep_crash *', 'E926:')
- augroup QF_Test
- au!
- augroup END
-
- enew | only
-endfunc
-
-func Test_lvimgrep_crash2()
- au BufNewFile x sfind
- call assert_fails('lvimgrep x x', 'E471:')
- call assert_fails('lvimgrep x x x', 'E471:')
-
- au! BufNewFile
-endfunc
-
-" Test for the position of the quickfix and location list window
-func Test_qfwin_pos()
- " Open two windows
- new | only
- new
- cexpr ['F1:10:L10']
- copen
- " Quickfix window should be the bottom most window
- call assert_equal(3, winnr())
- close
- " Open at the very top
- wincmd t
- topleft copen
- call assert_equal(1, winnr())
- close
- " open left of the current window
- wincmd t
- below new
- leftabove copen
- call assert_equal(2, winnr())
- close
- " open right of the current window
- rightbelow copen
- call assert_equal(3, winnr())
- close
-endfunc
-
-" Tests for quickfix/location lists changed by autocommands when
-" :vimgrep/:lvimgrep commands are running.
-func Test_vimgrep_autocmd()
- call setqflist([], 'f')
- call writefile(['stars'], 'Xtest1.txt')
- call writefile(['stars'], 'Xtest2.txt')
-
- " Test 1:
- " When searching for a pattern using :vimgrep, if the quickfix list is
- " changed by an autocmd, the results should be added to the correct quickfix
- " list.
- autocmd BufRead Xtest2.txt cexpr '' | cexpr ''
- silent vimgrep stars Xtest*.txt
- call assert_equal(1, getqflist({'nr' : 0}).nr)
- call assert_equal(3, getqflist({'nr' : '$'}).nr)
- call assert_equal('Xtest2.txt', bufname(getqflist()[1].bufnr))
- au! BufRead Xtest2.txt
-
- " Test 2:
- " When searching for a pattern using :vimgrep, if the quickfix list is
- " freed, then a error should be given.
- silent! %bwipe!
- call setqflist([], 'f')
- autocmd BufRead Xtest2.txt for i in range(10) | cexpr '' | endfor
- call assert_fails('vimgrep stars Xtest*.txt', 'E925:')
- au! BufRead Xtest2.txt
-
- " Test 3:
- " When searching for a pattern using :lvimgrep, if the location list is
- " freed, then the command should error out.
- silent! %bwipe!
- let g:save_winid = win_getid()
- autocmd BufRead Xtest2.txt call setloclist(g:save_winid, [], 'f')
- call assert_fails('lvimgrep stars Xtest*.txt', 'E926:')
- au! BufRead Xtest2.txt
-
- call delete('Xtest1.txt')
- call delete('Xtest2.txt')
- call setqflist([], 'f')
-endfunc
-
-" Test for an autocmd changing the current directory when running vimgrep
-func Xvimgrep_autocmd_cd(cchar)
- call s:setup_commands(a:cchar)
-
- %bwipe
- let save_cwd = getcwd()
-
- augroup QF_Test
- au!
- autocmd BufRead * silent cd %:p:h
- augroup END
-
- 10Xvimgrep /vim/ Xdir/**
- let l = g:Xgetlist()
- call assert_equal('f1.txt', bufname(l[0].bufnr))
- call assert_equal('f2.txt', fnamemodify(bufname(l[2].bufnr), ':t'))
-
- augroup QF_Test
- au!
- augroup END
-
- exe 'cd ' . save_cwd
-endfunc
-
-func Test_vimgrep_autocmd_cd()
- call mkdir('Xdir/a', 'p')
- call mkdir('Xdir/b', 'p')
- call writefile(['a_L1_vim', 'a_L2_vim'], 'Xdir/a/f1.txt')
- call writefile(['b_L1_vim', 'b_L2_vim'], 'Xdir/b/f2.txt')
- call Xvimgrep_autocmd_cd('c')
- call Xvimgrep_autocmd_cd('l')
- %bwipe
- call delete('Xdir', 'rf')
-endfunc
-
-" The following test used to crash Vim
-func Test_lhelpgrep_autocmd()
- lhelpgrep quickfix
- augroup QF_Test
- au!
- autocmd QuickFixCmdPost * call setloclist(0, [], 'f')
- augroup END
- lhelpgrep buffer
- call assert_equal('help', &filetype)
- call assert_equal(0, getloclist(0, {'nr' : '$'}).nr)
- lhelpgrep tabpage
- call assert_equal('help', &filetype)
- call assert_equal(1, getloclist(0, {'nr' : '$'}).nr)
- augroup QF_Test
- au!
- augroup END
-
- new | only
- augroup QF_Test
- au!
- au BufEnter * call setqflist([], 'f')
- augroup END
- call assert_fails('helpgrep quickfix', 'E925:')
- " run the test with a help window already open
- help
- wincmd w
- call assert_fails('helpgrep quickfix', 'E925:')
- augroup QF_Test
- au!
- augroup END
-
- new | only
- augroup QF_Test
- au!
- au BufEnter * call setqflist([], 'r')
- augroup END
- call assert_fails('helpgrep quickfix', 'E925:')
- augroup QF_Test
- au!
- augroup END
-
- new | only
- augroup QF_Test
- au!
- au BufEnter * call setloclist(0, [], 'r')
- augroup END
- call assert_fails('lhelpgrep quickfix', 'E926:')
- augroup QF_Test
- au!
- augroup END
-
- " Replace the contents of a help window location list when it is still in
- " use.
- new | only
- lhelpgrep quickfix
- wincmd w
- augroup QF_Test
- au!
- autocmd WinEnter * call setloclist(0, [], 'r')
- augroup END
- call assert_fails('lhelpgrep win_getid', 'E926:')
- augroup QF_Test
- au!
- augroup END
-
- %bw!
-endfunc
-
-" The following test used to crash Vim
-func Test_lhelpgrep_autocmd_free_loclist()
- %bw!
- lhelpgrep quickfix
- wincmd w
- augroup QF_Test
- au!
- autocmd WinEnter * call setloclist(0, [], 'f')
- augroup END
- lhelpgrep win_getid
- wincmd w
- wincmd w
- wincmd w
- augroup QF_Test
- au!
- augroup END
- %bw!
-endfunc
-
-" Test for shortening/simplifying the file name when opening the
-" quickfix window or when displaying the quickfix list
-func Test_shorten_fname()
- if !has('unix')
- return
- endif
- %bwipe
- " Create a quickfix list with a absolute path filename
- let fname = getcwd() . '/test_quickfix.vim'
- call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
- call assert_equal(fname, bufname('test_quickfix.vim'))
- " Opening the quickfix window should simplify the file path
- cwindow
- call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
- cclose
- %bwipe
- " Create a quickfix list with a absolute path filename
- call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
- call assert_equal(fname, bufname('test_quickfix.vim'))
- " Displaying the quickfix list should simplify the file path
- silent! clist
- call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
- " Add a few entries for the same file with different paths and check whether
- " the buffer name is shortened
- %bwipe
- call setqflist([], 'f')
- call setqflist([{'filename' : 'test_quickfix.vim', 'lnum' : 10},
- \ {'filename' : '../testdir/test_quickfix.vim', 'lnum' : 20},
- \ {'filename' : fname, 'lnum' : 30}], ' ')
- copen
- call assert_equal(['test_quickfix.vim|10| ',
- \ 'test_quickfix.vim|20| ',
- \ 'test_quickfix.vim|30| '], getline(1, '$'))
- cclose
-endfunc
-
-" Quickfix title tests
-" In the below tests, 'exe "cmd"' is used to invoke the quickfix commands.
-" Otherwise due to indentation, the title is set with spaces at the beginning
-" of the command.
-func Test_qftitle()
- call writefile(["F1:1:Line1"], 'Xerr')
-
- " :cexpr
- exe "cexpr readfile('Xerr')"
- call assert_equal(":cexpr readfile('Xerr')", getqflist({'title' : 1}).title)
-
- " :cgetexpr
- exe "cgetexpr readfile('Xerr')"
- call assert_equal(":cgetexpr readfile('Xerr')",
- \ getqflist({'title' : 1}).title)
-
- " :caddexpr
- call setqflist([], 'f')
- exe "caddexpr readfile('Xerr')"
- call assert_equal(":caddexpr readfile('Xerr')",
- \ getqflist({'title' : 1}).title)
-
- " :cbuffer
- new Xerr
- exe "cbuffer"
- call assert_equal(':cbuffer (Xerr)', getqflist({'title' : 1}).title)
-
- " :cgetbuffer
- edit Xerr
- exe "cgetbuffer"
- call assert_equal(':cgetbuffer (Xerr)', getqflist({'title' : 1}).title)
-
- " :caddbuffer
- call setqflist([], 'f')
- edit Xerr
- exe "caddbuffer"
- call assert_equal(':caddbuffer (Xerr)', getqflist({'title' : 1}).title)
-
- " :cfile
- exe "cfile Xerr"
- call assert_equal(':cfile Xerr', getqflist({'title' : 1}).title)
-
- " :cgetfile
- exe "cgetfile Xerr"
- call assert_equal(':cgetfile Xerr', getqflist({'title' : 1}).title)
-
- " :caddfile
- call setqflist([], 'f')
- exe "caddfile Xerr"
- call assert_equal(':caddfile Xerr', getqflist({'title' : 1}).title)
-
- " :grep
- set grepprg=internal
- exe "grep F1 Xerr"
- call assert_equal(':grep F1 Xerr', getqflist({'title' : 1}).title)
-
- " :grepadd
- call setqflist([], 'f')
- exe "grepadd F1 Xerr"
- call assert_equal(':grepadd F1 Xerr', getqflist({'title' : 1}).title)
- set grepprg&vim
-
- " :vimgrep
- exe "vimgrep F1 Xerr"
- call assert_equal(':vimgrep F1 Xerr', getqflist({'title' : 1}).title)
-
- " :vimgrepadd
- call setqflist([], 'f')
- exe "vimgrepadd F1 Xerr"
- call assert_equal(':vimgrepadd F1 Xerr', getqflist({'title' : 1}).title)
-
- call setqflist(['F1:10:L10'], ' ')
- call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
-
- call setqflist([], 'f')
- call setqflist(['F1:10:L10'], 'a')
- call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
-
- call setqflist([], 'f')
- call setqflist(['F1:10:L10'], 'r')
- call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
-
- close
- call delete('Xerr')
-
- call setqflist([], ' ', {'title' : 'Errors'})
- copen
- call assert_equal('Errors', w:quickfix_title)
- call setqflist([], 'r', {'items' : [{'filename' : 'a.c', 'lnum' : 10}]})
- call assert_equal('Errors', w:quickfix_title)
- cclose
-
- " Switching to another quickfix list in one tab page should update the
- " quickfix window title and statusline in all the other tab pages also
- call setqflist([], 'f')
- %bw!
- cgetexpr ['file_one:1:1: error in the first quickfix list']
- call setqflist([], 'a', {'title': 'first quickfix list'})
- cgetexpr ['file_two:2:1: error in the second quickfix list']
- call setqflist([], 'a', {'title': 'second quickfix list'})
- copen
- wincmd t
- tabnew two
- copen
- wincmd t
- colder
- call assert_equal('first quickfix list', gettabwinvar(1, 2, 'quickfix_title'))
- call assert_equal('first quickfix list', gettabwinvar(2, 2, 'quickfix_title'))
- call assert_equal(1, tabpagewinnr(1))
- call assert_equal(1, tabpagewinnr(2))
- tabnew
- call setqflist([], 'a', {'title': 'new quickfix title'})
- call assert_equal('new quickfix title', gettabwinvar(1, 2, 'quickfix_title'))
- call assert_equal('new quickfix title', gettabwinvar(2, 2, 'quickfix_title'))
- %bw!
-endfunc
-
-func Test_lbuffer_with_bwipe()
- new
- new
- augroup nasty
- au QuickFixCmdPre,QuickFixCmdPost,BufEnter,BufLeave * bwipe
- augroup END
- lbuffer
- augroup nasty
- au!
- augroup END
-endfunc
-
-" Test for an autocmd freeing the quickfix/location list when cexpr/lexpr is
-" running
-func Xexpr_acmd_freelist(cchar)
- call s:setup_commands(a:cchar)
-
- " This was using freed memory (but with what events?)
- augroup nasty
- au QuickFixCmdPre,QuickFixCmdPost,BufEnter,BufLeave * call g:Xsetlist([], 'f')
- augroup END
- Xexpr "x"
- augroup nasty
- au!
- augroup END
-endfunc
-
-func Test_cexpr_acmd_freelist()
- call Xexpr_acmd_freelist('c')
- call Xexpr_acmd_freelist('l')
-endfunc
-
-" Test for commands that create a new quickfix/location list and jump to the
-" first error automatically.
-func Xjumpto_first_error_test(cchar)
- call s:setup_commands(a:cchar)
-
- call s:create_test_file('Xtestfile1')
- call s:create_test_file('Xtestfile2')
- let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4']
-
- " Test for cexpr/lexpr
- enew
- Xexpr l
- call assert_equal('Xtestfile1', @%)
- call assert_equal(2, line('.'))
-
- " Test for cfile/lfile
- enew
- call writefile(l, 'Xerr')
- Xfile Xerr
- call assert_equal('Xtestfile1', @%)
- call assert_equal(2, line('.'))
-
- " Test for cbuffer/lbuffer
- edit Xerr
- Xbuffer
- call assert_equal('Xtestfile1', @%)
- call assert_equal(2, line('.'))
-
- call delete('Xerr')
- call delete('Xtestfile1')
- call delete('Xtestfile2')
-endfunc
-
-func Test_jumpto_first_error()
- call Xjumpto_first_error_test('c')
- call Xjumpto_first_error_test('l')
-endfunc
-
-" Test for a quickfix autocmd changing the quickfix/location list before
-" jumping to the first error in the new list.
-func Xautocmd_changelist(cchar)
- call s:setup_commands(a:cchar)
-
- " Test for cfile/lfile
- call s:create_test_file('Xtestfile1')
- call s:create_test_file('Xtestfile2')
- Xexpr 'Xtestfile1:2:Line2'
- autocmd QuickFixCmdPost * Xolder
- call writefile(['Xtestfile2:4:Line4'], 'Xerr')
- Xfile Xerr
- call assert_equal('Xtestfile2', @%)
- call assert_equal(4, line('.'))
- autocmd! QuickFixCmdPost
-
- " Test for cbuffer/lbuffer
- call g:Xsetlist([], 'f')
- Xexpr 'Xtestfile1:2:Line2'
- autocmd QuickFixCmdPost * Xolder
- call writefile(['Xtestfile2:4:Line4'], 'Xerr')
- edit Xerr
- Xbuffer
- call assert_equal('Xtestfile2', @%)
- call assert_equal(4, line('.'))
- autocmd! QuickFixCmdPost
-
- " Test for cexpr/lexpr
- call g:Xsetlist([], 'f')
- Xexpr 'Xtestfile1:2:Line2'
- autocmd QuickFixCmdPost * Xolder
- Xexpr 'Xtestfile2:4:Line4'
- call assert_equal('Xtestfile2', @%)
- call assert_equal(4, line('.'))
- autocmd! QuickFixCmdPost
-
- " The grepprg may not be set on non-Unix systems
- if has('unix')
- " Test for grep/lgrep
- call g:Xsetlist([], 'f')
- Xexpr 'Xtestfile1:2:Line2'
- autocmd QuickFixCmdPost * Xolder
- silent Xgrep Line5 Xtestfile2
- call assert_equal('Xtestfile2', @%)
- call assert_equal(5, line('.'))
- autocmd! QuickFixCmdPost
- endif
-
- " Test for vimgrep/lvimgrep
- call g:Xsetlist([], 'f')
- Xexpr 'Xtestfile1:2:Line2'
- autocmd QuickFixCmdPost * Xolder
- silent Xvimgrep Line5 Xtestfile2
- call assert_equal('Xtestfile2', @%)
- call assert_equal(5, line('.'))
- autocmd! QuickFixCmdPost
-
- " Test for autocommands clearing the quickfix list before jumping to the
- " first error. This should not result in an error
- autocmd QuickFixCmdPost * call g:Xsetlist([], 'r')
- let v:errmsg = ''
- " Test for cfile/lfile
- Xfile Xerr
- call assert_true(v:errmsg !~# 'E42:')
- " Test for cbuffer/lbuffer
- edit Xerr
- Xbuffer
- call assert_true(v:errmsg !~# 'E42:')
- " Test for cexpr/lexpr
- Xexpr 'Xtestfile2:4:Line4'
- call assert_true(v:errmsg !~# 'E42:')
- " Test for grep/lgrep
- " The grepprg may not be set on non-Unix systems
- if has('unix')
- silent Xgrep Line5 Xtestfile2
- call assert_true(v:errmsg !~# 'E42:')
- endif
- " Test for vimgrep/lvimgrep
- call assert_fails('silent Xvimgrep Line5 Xtestfile2', 'E480:')
- autocmd! QuickFixCmdPost
-
- call delete('Xerr')
- call delete('Xtestfile1')
- call delete('Xtestfile2')
-endfunc
-
-func Test_autocmd_changelist()
- call Xautocmd_changelist('c')
- call Xautocmd_changelist('l')
-endfunc
-
-" Tests for the ':filter /pat/ clist' command
-func Test_filter_clist()
- cexpr ['Xfile1:10:10:Line 10', 'Xfile2:15:15:Line 15']
- call assert_equal([' 2 Xfile2:15 col 15: Line 15'],
- \ split(execute('filter /Line 15/ clist'), "\n"))
- call assert_equal([' 1 Xfile1:10 col 10: Line 10'],
- \ split(execute('filter /Xfile1/ clist'), "\n"))
- call assert_equal([], split(execute('filter /abc/ clist'), "\n"))
-
- call setqflist([{'module' : 'abc', 'pattern' : 'pat1'},
- \ {'module' : 'pqr', 'pattern' : 'pat2'}], ' ')
- call assert_equal([' 2 pqr:pat2: '],
- \ split(execute('filter /pqr/ clist'), "\n"))
- call assert_equal([' 1 abc:pat1: '],
- \ split(execute('filter /pat1/ clist'), "\n"))
-endfunc
-
-" Tests for the "CTRL-W <CR>" command.
-func Xview_result_split_tests(cchar)
- call s:setup_commands(a:cchar)
-
- " Test that "CTRL-W <CR>" in a qf/ll window fails with empty list.
- call g:Xsetlist([])
- Xopen
- let l:win_count = winnr('$')
- call assert_fails('execute "normal! \<C-W>\<CR>"', 'E42')
- call assert_equal(l:win_count, winnr('$'))
- Xclose
-endfunc
-
-func Test_view_result_split()
- call Xview_result_split_tests('c')
- call Xview_result_split_tests('l')
-endfunc
-
-" Test that :cc sets curswant
-func Test_curswant()
- helpgrep quickfix
- normal! llll
- 1cc
- call assert_equal(getcurpos()[4], virtcol('.'))
- cclose | helpclose
-endfunc
-
-" Test for opening a file from the quickfix window using CTRL-W <Enter>
-" doesn't leave an empty buffer around.
-func Test_splitview()
- call s:create_test_file('Xtestfile1')
- call s:create_test_file('Xtestfile2')
- new | only
- let last_bufnr = bufnr('Test_sv_1', 1)
- let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4']
- cgetexpr l
- copen
- let numbufs = len(getbufinfo())
- exe "normal \<C-W>\<CR>"
- copen
- exe "normal j\<C-W>\<CR>"
- " Make sure new empty buffers are not created
- call assert_equal(numbufs, len(getbufinfo()))
- " Creating a new buffer should use the next available buffer number
- call assert_equal(last_bufnr + 4, bufnr("Test_sv_2", 1))
- bwipe Test_sv_1
- bwipe Test_sv_2
- new | only
-
- " When split opening files from location list window, make sure that two
- " windows doesn't refer to the same location list
- lgetexpr l
- let locid = getloclist(0, {'id' : 0}).id
- lopen
- exe "normal \<C-W>\<CR>"
- call assert_notequal(locid, getloclist(0, {'id' : 0}).id)
- call assert_equal(0, getloclist(0, {'winid' : 0}).winid)
- new | only
-
- " When split opening files from a helpgrep location list window, a new help
- " window should be opened with a copy of the location list.
- lhelpgrep window
- let locid = getloclist(0, {'id' : 0}).id
- lwindow
- exe "normal j\<C-W>\<CR>"
- call assert_notequal(locid, getloclist(0, {'id' : 0}).id)
- call assert_equal(0, getloclist(0, {'winid' : 0}).winid)
- new | only
-
- " Using :split or :vsplit from a quickfix window should behave like a :new
- " or a :vnew command
- copen
- split
- call assert_equal(3, winnr('$'))
- let l = getwininfo()
- call assert_equal([0, 0, 1], [l[0].quickfix, l[1].quickfix, l[2].quickfix])
- close
- copen
- vsplit
- let l = getwininfo()
- call assert_equal([0, 0, 1], [l[0].quickfix, l[1].quickfix, l[2].quickfix])
- new | only
-
- call delete('Xtestfile1')
- call delete('Xtestfile2')
-endfunc
-
-" Test for parsing entries using visual screen column
-func Test_viscol()
- enew
- call writefile(["Col1\tCol2\tCol3"], 'Xfile1')
- edit Xfile1
-
- " Use byte offset for column number
- set efm&
- cexpr "Xfile1:1:5:XX\nXfile1:1:9:YY\nXfile1:1:20:ZZ"
- call assert_equal([5, 8], [col('.'), virtcol('.')])
- cnext
- call assert_equal([9, 12], [col('.'), virtcol('.')])
- cnext
- call assert_equal([14, 20], [col('.'), virtcol('.')])
-
- " Use screen column offset for column number
- set efm=%f:%l:%v:%m
- cexpr "Xfile1:1:8:XX\nXfile1:1:12:YY\nXfile1:1:20:ZZ"
- call assert_equal([5, 8], [col('.'), virtcol('.')])
- cnext
- call assert_equal([9, 12], [col('.'), virtcol('.')])
- cnext
- call assert_equal([14, 20], [col('.'), virtcol('.')])
- cexpr "Xfile1:1:6:XX\nXfile1:1:15:YY\nXfile1:1:24:ZZ"
- call assert_equal([5, 8], [col('.'), virtcol('.')])
- cnext
- call assert_equal([10, 16], [col('.'), virtcol('.')])
- cnext
- call assert_equal([14, 20], [col('.'), virtcol('.')])
-
- enew
- call writefile(["Col1\täü\töß\tCol4"], 'Xfile1')
-
- " Use byte offset for column number
- set efm&
- cexpr "Xfile1:1:8:XX\nXfile1:1:11:YY\nXfile1:1:16:ZZ"
- call assert_equal([8, 10], [col('.'), virtcol('.')])
- cnext
- call assert_equal([11, 17], [col('.'), virtcol('.')])
- cnext
- call assert_equal([16, 25], [col('.'), virtcol('.')])
-
- " Use screen column offset for column number
- set efm=%f:%l:%v:%m
- cexpr "Xfile1:1:10:XX\nXfile1:1:17:YY\nXfile1:1:25:ZZ"
- call assert_equal([8, 10], [col('.'), virtcol('.')])
- cnext
- call assert_equal([11, 17], [col('.'), virtcol('.')])
- cnext
- call assert_equal([16, 25], [col('.'), virtcol('.')])
-
- " Use screen column number with a multi-line error message
- enew
- call writefile(["à test"], 'Xfile1')
- set efm=%E===\ %f\ ===,%C%l:%v,%Z%m
- cexpr ["=== Xfile1 ===", "1:3", "errormsg"]
- call assert_equal('Xfile1', @%)
- call assert_equal([0, 1, 4, 0], getpos('.'))
-
- " Repeat previous test with byte offset %c: ensure that fix to issue #7145
- " does not break this
- set efm=%E===\ %f\ ===,%C%l:%c,%Z%m
- cexpr ["=== Xfile1 ===", "1:3", "errormsg"]
- call assert_equal('Xfile1', @%)
- call assert_equal([0, 1, 3, 0], getpos('.'))
-
- enew | only
- set efm&
- call delete('Xfile1')
-endfunc
-
-" Test for the quickfix window buffer
-func Xqfbuf_test(cchar)
- call s:setup_commands(a:cchar)
-
- " Quickfix buffer should be reused across closing and opening a quickfix
- " window
- Xexpr "F1:10:Line10"
- Xopen
- let qfbnum = bufnr('')
- Xclose
- " Even after the quickfix window is closed, the buffer should be loaded
- call assert_true(bufloaded(qfbnum))
- call assert_true(qfbnum, g:Xgetlist({'qfbufnr' : 0}).qfbufnr)
- Xopen
- " Buffer should be reused when opening the window again
- call assert_equal(qfbnum, bufnr(''))
- Xclose
-
- " When quickfix buffer is wiped out, getqflist() should return 0
- %bw!
- Xexpr ""
- Xopen
- bw!
- call assert_equal(0, g:Xgetlist({'qfbufnr': 0}).qfbufnr)
-
- if a:cchar == 'l'
- %bwipe
- " For a location list, when both the file window and the location list
- " window for the list are closed, then the buffer should be freed.
- new | only
- lexpr "F1:10:Line10"
- let wid = win_getid()
- lopen
- let qfbnum = bufnr('')
- call assert_match(qfbnum . ' %a- "\[Location List]"', execute('ls'))
- close
- " When the location list window is closed, the buffer name should not
- " change to 'Quickfix List'
- call assert_match(qfbnum . 'u h- "\[Location List]"', execute('ls!'))
- call assert_true(bufloaded(qfbnum))
-
- " After deleting a location list buffer using ":bdelete", opening the
- " location list window should mark the buffer as a location list buffer.
- exe "bdelete " . qfbnum
- lopen
- call assert_equal("quickfix", &buftype)
- call assert_equal(1, getwininfo(win_getid(winnr()))[0].loclist)
- call assert_equal(wid, getloclist(0, {'filewinid' : 0}).filewinid)
- call assert_false(&swapfile)
- lclose
-
- " When the location list is cleared for the window, the buffer should be
- " removed
- call setloclist(0, [], 'f')
- call assert_false(bufexists(qfbnum))
- call assert_equal(0, getloclist(0, {'qfbufnr' : 0}).qfbufnr)
-
- " When the location list is freed with the location list window open, the
- " location list buffer should not be lost. It should be reused when the
- " location list is again populated.
- lexpr "F1:10:Line10"
- lopen
- let wid = win_getid()
- let qfbnum = bufnr('')
- wincmd p
- call setloclist(0, [], 'f')
- lexpr "F1:10:Line10"
- lopen
- call assert_equal(wid, win_getid())
- call assert_equal(qfbnum, bufnr(''))
- lclose
-
- " When the window with the location list is closed, the buffer should be
- " removed
- new | only
- call assert_false(bufexists(qfbnum))
- endif
-endfunc
-
-func Test_qfbuf()
- call Xqfbuf_test('c')
- call Xqfbuf_test('l')
-endfunc
-
-" If there is an autocmd to use only one window, then opening the location
-" list window used to crash Vim.
-func Test_winonly_autocmd()
- call s:create_test_file('Xtest1')
- " Autocmd to show only one Vim window at a time
- autocmd WinEnter * only
- new
- " Load the location list
- lexpr "Xtest1:5:Line5\nXtest1:10:Line10\nXtest1:15:Line15"
- let loclistid = getloclist(0, {'id' : 0}).id
- " Open the location list window. Only this window will be shown and the file
- " window is closed.
- lopen
- call assert_equal(loclistid, getloclist(0, {'id' : 0}).id)
- " Jump to an entry in the location list and make sure that the cursor is
- " positioned correctly.
- ll 3
- call assert_equal(loclistid, getloclist(0, {'id' : 0}).id)
- call assert_equal('Xtest1', @%)
- call assert_equal(15, line('.'))
- " Cleanup
- autocmd! WinEnter
- new | only
- call delete('Xtest1')
-endfunc
-
-" Test to make sure that an empty quickfix buffer is not reused for loading
-" a normal buffer.
-func Test_empty_qfbuf()
- enew | only
- call writefile(["Test"], 'Xfile1')
- call setqflist([], 'f')
- copen | only
- let qfbuf = bufnr('')
- edit Xfile1
- call assert_notequal(qfbuf, bufnr(''))
- enew
- call delete('Xfile1')
-endfunc
-
-" Test for the :cbelow, :cabove, :lbelow and :labove commands.
-" And for the :cafter, :cbefore, :lafter and :lbefore commands.
-func Xtest_below(cchar)
- call s:setup_commands(a:cchar)
-
- " No quickfix/location list
- call assert_fails('Xbelow', 'E42:')
- call assert_fails('Xabove', 'E42:')
- call assert_fails('Xbefore', 'E42:')
- call assert_fails('Xafter', 'E42:')
-
- " Empty quickfix/location list
- call g:Xsetlist([])
- call assert_fails('Xbelow', 'E42:')
- call assert_fails('Xabove', 'E42:')
- call assert_fails('Xbefore', 'E42:')
- call assert_fails('Xafter', 'E42:')
-
- call s:create_test_file('X1')
- call s:create_test_file('X2')
- call s:create_test_file('X3')
- call s:create_test_file('X4')
-
- " Invalid entries
- edit X1
- call g:Xsetlist(["E1", "E2"])
- call assert_fails('Xbelow', 'E42:')
- call assert_fails('Xabove', 'E42:')
- call assert_fails('3Xbelow', 'E42:')
- call assert_fails('4Xabove', 'E42:')
- call assert_fails('Xbefore', 'E42:')
- call assert_fails('Xafter', 'E42:')
- call assert_fails('3Xbefore', 'E42:')
- call assert_fails('4Xafter', 'E42:')
-
- " Test the commands with various arguments
- Xexpr ["X1:5:3:L5", "X2:5:2:L5", "X2:10:3:L10", "X2:15:4:L15", "X3:3:5:L3"]
- edit +7 X2
- Xabove
- call assert_equal(['X2', 5], [@%, line('.')])
- call assert_fails('Xabove', 'E553:')
- normal 7G
- Xbefore
- call assert_equal(['X2', 5, 2], [@%, line('.'), col('.')])
- call assert_fails('Xbefore', 'E553:')
-
- normal 2j
- Xbelow
- call assert_equal(['X2', 10], [@%, line('.')])
- normal 7G
- Xafter
- call assert_equal(['X2', 10, 3], [@%, line('.'), col('.')])
-
- " Last error in this file
- Xbelow 99
- call assert_equal(['X2', 15], [@%, line('.')])
- call assert_fails('Xbelow', 'E553:')
- normal gg
- Xafter 99
- call assert_equal(['X2', 15, 4], [@%, line('.'), col('.')])
- call assert_fails('Xafter', 'E553:')
-
- " First error in this file
- Xabove 99
- call assert_equal(['X2', 5], [@%, line('.')])
- call assert_fails('Xabove', 'E553:')
- normal G
- Xbefore 99
- call assert_equal(['X2', 5, 2], [@%, line('.'), col('.')])
- call assert_fails('Xbefore', 'E553:')
-
- normal gg
- Xbelow 2
- call assert_equal(['X2', 10], [@%, line('.')])
- normal gg
- Xafter 2
- call assert_equal(['X2', 10, 3], [@%, line('.'), col('.')])
-
- normal G
- Xabove 2
- call assert_equal(['X2', 10], [@%, line('.')])
- normal G
- Xbefore 2
- call assert_equal(['X2', 10, 3], [@%, line('.'), col('.')])
-
- edit X4
- call assert_fails('Xabove', 'E42:')
- call assert_fails('Xbelow', 'E42:')
- call assert_fails('Xbefore', 'E42:')
- call assert_fails('Xafter', 'E42:')
- if a:cchar == 'l'
- " If a buffer has location list entries from some other window but not
- " from the current window, then the commands should fail.
- edit X1 | split | call setloclist(0, [], 'f')
- call assert_fails('Xabove', 'E776:')
- call assert_fails('Xbelow', 'E776:')
- call assert_fails('Xbefore', 'E776:')
- call assert_fails('Xafter', 'E776:')
- close
- endif
-
- " Test for lines with multiple quickfix entries
- let lines =<< trim END
- X1:5:L5
- X2:5:1:L5_1
- X2:5:2:L5_2
- X2:5:3:L5_3
- X2:10:1:L10_1
- X2:10:2:L10_2
- X2:10:3:L10_3
- X2:15:1:L15_1
- X2:15:2:L15_2
- X2:15:3:L15_3
- X3:3:L3
- END
- Xexpr lines
- edit +1 X2
- Xbelow 2
- call assert_equal(['X2', 10, 1], [@%, line('.'), col('.')])
- normal 1G
- Xafter 2
- call assert_equal(['X2', 5, 2], [@%, line('.'), col('.')])
-
- normal gg
- Xbelow 99
- call assert_equal(['X2', 15, 1], [@%, line('.'), col('.')])
- normal gg
- Xafter 99
- call assert_equal(['X2', 15, 3], [@%, line('.'), col('.')])
-
- normal G
- Xabove 2
- call assert_equal(['X2', 10, 1], [@%, line('.'), col('.')])
- normal G
- Xbefore 2
- call assert_equal(['X2', 15, 2], [@%, line('.'), col('.')])
-
- normal G
- Xabove 99
- call assert_equal(['X2', 5, 1], [@%, line('.'), col('.')])
- normal G
- Xbefore 99
- call assert_equal(['X2', 5, 1], [@%, line('.'), col('.')])
-
- normal 10G
- Xabove
- call assert_equal(['X2', 5, 1], [@%, line('.'), col('.')])
- normal 10G$
- 2Xbefore
- call assert_equal(['X2', 10, 2], [@%, line('.'), col('.')])
-
- normal 10G
- Xbelow
- call assert_equal(['X2', 15, 1], [@%, line('.'), col('.')])
- normal 9G
- 5Xafter
- call assert_equal(['X2', 15, 2], [@%, line('.'), col('.')])
-
- " Invalid range
- if a:cchar == 'c'
- call assert_fails('-2cbelow', 'E16:')
- call assert_fails('-2cafter', 'E16:')
- else
- call assert_fails('-2lbelow', 'E16:')
- call assert_fails('-2lafter', 'E16:')
- endif
-
- call delete('X1')
- call delete('X2')
- call delete('X3')
- call delete('X4')
-endfunc
-
-func Test_cbelow()
- call Xtest_below('c')
- call Xtest_below('l')
-endfunc
-
-func Test_quickfix_count()
- let commands =<< trim END
- cNext
- cNfile
- cabove
- cbelow
- cfirst
- clast
- cnewer
- cnext
- cnfile
- colder
- cprevious
- crewind
- lNext
- lNfile
- labove
- lbelow
- lfirst
- llast
- lnewer
- lnext
- lnfile
- lolder
- lprevious
- lrewind
- END
- for cmd in commands
- call assert_fails('-1' .. cmd, 'E16:')
- call assert_fails('.' .. cmd, 'E16:')
- call assert_fails('%' .. cmd, 'E16:')
- call assert_fails('$' .. cmd, 'E16:')
- endfor
-endfunc
-
-" Test for aborting quickfix commands using QuickFixCmdPre
-func Xtest_qfcmd_abort(cchar)
- call s:setup_commands(a:cchar)
-
- call g:Xsetlist([], 'f')
-
- " cexpr/lexpr
- let e = ''
- try
- Xexpr ["F1:10:Line10", "F2:20:Line20"]
- catch /.*/
- let e = v:exception
- endtry
- call assert_equal('AbortCmd', e)
- call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
-
- " cfile/lfile
- call writefile(["F1:10:Line10", "F2:20:Line20"], 'Xfile1')
- let e = ''
- try
- Xfile Xfile1
- catch /.*/
- let e = v:exception
- endtry
- call assert_equal('AbortCmd', e)
- call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
- call delete('Xfile1')
-
- " cgetbuffer/lgetbuffer
- enew!
- call append(0, ["F1:10:Line10", "F2:20:Line20"])
- let e = ''
- try
- Xgetbuffer
- catch /.*/
- let e = v:exception
- endtry
- call assert_equal('AbortCmd', e)
- call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
- enew!
-
- " vimgrep/lvimgrep
- let e = ''
- try
- Xvimgrep /func/ test_quickfix.vim
- catch /.*/
- let e = v:exception
- endtry
- call assert_equal('AbortCmd', e)
- call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
-
- " helpgrep/lhelpgrep
- let e = ''
- try
- Xhelpgrep quickfix
- catch /.*/
- let e = v:exception
- endtry
- call assert_equal('AbortCmd', e)
- call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
-
- " grep/lgrep
- if has('unix')
- let e = ''
- try
- silent Xgrep func test_quickfix.vim
- catch /.*/
- let e = v:exception
- endtry
- call assert_equal('AbortCmd', e)
- call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
- endif
-endfunc
-
-func Test_qfcmd_abort()
- augroup QF_Test
- au!
- autocmd QuickFixCmdPre * throw "AbortCmd"
- augroup END
-
- call Xtest_qfcmd_abort('c')
- call Xtest_qfcmd_abort('l')
-
- augroup QF_Test
- au!
- augroup END
-endfunc
-
-" Test for using a file in one of the parent directories.
-func Test_search_in_dirstack()
- call mkdir('Xtestdir/a/b/c', 'p')
- let save_cwd = getcwd()
- call writefile(["X1_L1", "X1_L2"], 'Xtestdir/Xfile1')
- call writefile(["X2_L1", "X2_L2"], 'Xtestdir/a/Xfile2')
- call writefile(["X3_L1", "X3_L2"], 'Xtestdir/a/b/Xfile3')
- call writefile(["X4_L1", "X4_L2"], 'Xtestdir/a/b/c/Xfile4')
-
- let lines = "Entering dir Xtestdir\n" .
- \ "Entering dir a\n" .
- \ "Entering dir b\n" .
- \ "Xfile2:2:X2_L2\n" .
- \ "Leaving dir a\n" .
- \ "Xfile1:2:X1_L2\n" .
- \ "Xfile3:1:X3_L1\n" .
- \ "Entering dir c\n" .
- \ "Xfile4:2:X4_L2\n" .
- \ "Leaving dir c\n"
- set efm=%DEntering\ dir\ %f,%XLeaving\ dir\ %f,%f:%l:%m
- cexpr lines .. "Leaving dir Xtestdir|\n" | let next = 1
- call assert_equal(11, getqflist({'size' : 0}).size)
- call assert_equal(4, getqflist({'idx' : 0}).idx)
- call assert_equal('X2_L2', getline('.'))
- call assert_equal(1, next)
- cnext
- call assert_equal(6, getqflist({'idx' : 0}).idx)
- call assert_equal('X1_L2', getline('.'))
- cnext
- call assert_equal(7, getqflist({'idx' : 0}).idx)
- call assert_equal(1, line('$'))
- call assert_equal('', getline(1))
- cnext
- call assert_equal(9, getqflist({'idx' : 0}).idx)
- call assert_equal(1, line('$'))
- call assert_equal('', getline(1))
-
- set efm&
- exe 'cd ' . save_cwd
- call delete('Xtestdir', 'rf')
-endfunc
-
-" Test for :cquit
-func Test_cquit()
- " Exit Vim with a non-zero value
- if RunVim([], ["cquit 7"], '')
- call assert_equal(7, v:shell_error)
- endif
-
- if RunVim([], ["50cquit"], '')
- call assert_equal(50, v:shell_error)
- endif
-
- " Exit Vim with default value
- if RunVim([], ["cquit"], '')
- call assert_equal(1, v:shell_error)
- endif
-
- " Exit Vim with zero value
- if RunVim([], ["cquit 0"], '')
- call assert_equal(0, v:shell_error)
- endif
-
- " Exit Vim with negative value
- call assert_fails('-3cquit', 'E16:')
-endfunc
-
-" Running :lhelpgrep command more than once in a help window, doesn't jump to
-" the help topic
-func Test_lhelpgrep_from_help_window()
- call mkdir('Xtestdir/doc', 'p')
- call writefile(['window'], 'Xtestdir/doc/a.txt')
- call writefile(['buffer'], 'Xtestdir/doc/b.txt')
- let save_rtp = &rtp
- let &rtp = 'Xtestdir'
- lhelpgrep window
- lhelpgrep buffer
- call assert_equal('b.txt', fnamemodify(@%, ":p:t"))
- lhelpgrep window
- call assert_equal('a.txt', fnamemodify(@%, ":p:t"))
- let &rtp = save_rtp
- call delete('Xtestdir', 'rf')
- new | only!
-endfunc
-
-" Test for the crash fixed by 7.3.715
-func Test_setloclist_crash()
- %bw!
- let g:BufNum = bufnr()
- augroup QF_Test
- au!
- au BufUnload * call setloclist(0, [{'bufnr':g:BufNum, 'lnum':1, 'col':1, 'text': 'tango down'}])
- augroup END
-
- try
- lvimgrep /.*/ *.mak
- catch /E926:/
- endtry
- call assert_equal('tango down', getloclist(0, {'items' : 0}).items[0].text)
- call assert_equal(1, getloclist(0, {'size' : 0}).size)
-
- augroup QF_Test
- au!
- augroup END
- unlet g:BufNum
- %bw!
-endfunc
-
-" Test for adding an invalid entry with the quickfix window open and making
-" sure that the window contents are not changed
-func Test_add_invalid_entry_with_qf_window()
- call setqflist([], 'f')
- cexpr "Xfile1:10:aa"
- copen
- call setqflist(['bb'], 'a')
- call assert_equal(1, line('$'))
- call assert_equal(['Xfile1|10| aa'], getline(1, '$'))
- call assert_equal([{'lnum': 10 , 'end_lnum': 0 , 'bufnr': bufnr('Xfile1') , 'col': 0 , 'end_col': 0 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , getqflist())
-
- call setqflist([{'lnum': 10 , 'bufnr': bufnr('Xfile1') , 'col': 0 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , 'r')
- call assert_equal(1 , line('$'))
- call assert_equal(['Xfile1|10| aa'] , getline(1 , '$'))
- call assert_equal([{'lnum': 10 , 'end_lnum': 0 , 'bufnr': bufnr('Xfile1') , 'col': 0 , 'end_col': 0 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , getqflist())
-
- call setqflist([{'lnum': 10 , 'end_lnum': 0 , 'bufnr': bufnr('Xfile1') , 'col': 0 , 'end_col': 0 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , 'r')
- call assert_equal(1 , line('$'))
- call assert_equal(['Xfile1|10| aa'] , getline(1 , '$'))
- call assert_equal([{'lnum': 10 , 'end_lnum': 0 , 'bufnr': bufnr('Xfile1') , 'col': 0 , 'end_col': 0 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , getqflist())
-
- call setqflist([{'lnum': 10 , 'end_lnum': -123 , 'bufnr': bufnr('Xfile1') , 'col': 0 , 'end_col': -456 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , 'r')
- call assert_equal(1 , line('$'))
- call assert_equal(['Xfile1|10| aa'] , getline(1 , '$'))
- call assert_equal([{'lnum': 10 , 'end_lnum': -123 , 'bufnr': bufnr('Xfile1') , 'col': 0 , 'end_col': -456 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , getqflist())
-
- call setqflist([{'lnum': 10 , 'end_lnum': -123 , 'bufnr': bufnr('Xfile1') , 'col': 666 , 'end_col': 0 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , 'r')
- call assert_equal(1 , line('$'))
- call assert_equal(['Xfile1|10 col 666| aa'] , getline(1 , '$'))
- call assert_equal([{'lnum': 10 , 'end_lnum': -123 , 'bufnr': bufnr('Xfile1') , 'col': 666 , 'end_col': 0 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , getqflist())
-
- call setqflist([{'lnum': 10 , 'end_lnum': -123 , 'bufnr': bufnr('Xfile1') , 'col': 666 , 'end_col': -456 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , 'r')
- call assert_equal(1 , line('$'))
- call assert_equal(['Xfile1|10 col 666| aa'] , getline(1 , '$'))
- call assert_equal([{'lnum': 10 , 'end_lnum': -123 , 'bufnr': bufnr('Xfile1') , 'col': 666 , 'end_col': -456 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , getqflist())
-
- call setqflist([{'lnum': 10 , 'end_lnum': -123 , 'bufnr': bufnr('Xfile1') , 'col': 666 , 'end_col': 222 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , 'r')
- call assert_equal(1 , line('$'))
- call assert_equal(['Xfile1|10 col 666-222| aa'] , getline(1 , '$'))
- call assert_equal([{'lnum': 10 , 'end_lnum': -123 , 'bufnr': bufnr('Xfile1') , 'col': 666 , 'end_col': 222 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , getqflist())
-
- call setqflist([{'lnum': 10 , 'end_lnum': 6 , 'bufnr': bufnr('Xfile1') , 'col': 666 , 'end_col': 222 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , 'r')
- call assert_equal(1 , line('$'))
- call assert_equal(['Xfile1|10-6 col 666-222| aa'] , getline(1 , '$'))
- call assert_equal([{'lnum': 10 , 'end_lnum': 6 , 'bufnr': bufnr('Xfile1') , 'col': 666 , 'end_col': 222 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , getqflist())
- cclose
-endfunc
-
-" Test for very weird problem: autocommand causes a failure, resulting opening
-" the quickfix window to fail. This still splits the window, but otherwise
-" should not mess up buffers.
-func Test_quickfix_window_fails_to_open()
- CheckScreendump
-
- let lines =<< trim END
- anything
- try
- anything
- endtry
- END
- call writefile(lines, 'XquickfixFails')
-
- let lines =<< trim END
- split XquickfixFails
- silent vimgrep anything %
- normal o
- au BufLeave * ++once source XquickfixFails
- " This will trigger the autocommand, which causes an error, what follows
- " is aborted but the window was already split.
- silent! cwindow
- END
- call writefile(lines, 'XtestWinFails')
- let buf = RunVimInTerminal('-S XtestWinFails', #{rows: 13})
- call VerifyScreenDump(buf, 'Test_quickfix_window_fails', {})
-
- " clean up
- call term_sendkeys(buf, ":bwipe!\<CR>")
- call term_wait(buf)
- call StopVimInTerminal(buf)
- call delete('XtestWinFails')
- call delete('XquickfixFails')
-endfunc
-
-" Test for updating the quickfix buffer whenever the associated quickfix list
-" is changed.
-func Xqfbuf_update(cchar)
- call s:setup_commands(a:cchar)
-
- Xexpr "F1:1:line1"
- Xopen
- call assert_equal(['F1|1| line1'], getline(1, '$'))
- call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
-
- " Test setqflist() using the 'lines' key in 'what'
- " add a new entry
- call g:Xsetlist([], 'a', {'lines' : ['F2:2: line2']})
- call assert_equal(['F1|1| line1', 'F2|2| line2'], getline(1, '$'))
- call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
- " replace all the entries with a single entry
- call g:Xsetlist([], 'r', {'lines' : ['F3:3: line3']})
- call assert_equal(['F3|3| line3'], getline(1, '$'))
- call assert_equal(3, g:Xgetlist({'changedtick' : 0}).changedtick)
- " remove all the entries
- call g:Xsetlist([], 'r', {'lines' : []})
- call assert_equal([''], getline(1, '$'))
- call assert_equal(4, g:Xgetlist({'changedtick' : 0}).changedtick)
- " add a new list
- call g:Xsetlist([], ' ', {'lines' : ['F4:4: line4']})
- call assert_equal(['F4|4| line4'], getline(1, '$'))
- call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
-
- " Test setqflist() using the 'items' key in 'what'
- " add a new entry
- call g:Xsetlist([], 'a', {'items' : [{'filename' : 'F5', 'lnum' : 5, 'text' : 'line5'}]})
- call assert_equal(['F4|4| line4', 'F5|5| line5'], getline(1, '$'))
- call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
- " replace all the entries with a single entry
- call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F6', 'lnum' : 6, 'text' : 'line6'}]})
- call assert_equal(['F6|6| line6'], getline(1, '$'))
- call assert_equal(3, g:Xgetlist({'changedtick' : 0}).changedtick)
- " remove all the entries
- call g:Xsetlist([], 'r', {'items' : []})
- call assert_equal([''], getline(1, '$'))
- call assert_equal(4, g:Xgetlist({'changedtick' : 0}).changedtick)
- " add a new list
- call g:Xsetlist([], ' ', {'items' : [{'filename' : 'F7', 'lnum' : 7, 'text' : 'line7'}]})
- call assert_equal(['F7|7| line7'], getline(1, '$'))
- call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
-
- call g:Xsetlist([], ' ', {})
- call assert_equal([''], getline(1, '$'))
- call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
-
- Xclose
-endfunc
-
-func Test_qfbuf_update()
- call Xqfbuf_update('c')
- call Xqfbuf_update('l')
-endfunc
-
-" Test for the :vimgrep 'f' flag (fuzzy match)
-func Xvimgrep_fuzzy_match(cchar)
- call s:setup_commands(a:cchar)
-
- Xvimgrep /three one/f Xfile*
- let l = g:Xgetlist()
- call assert_equal(2, len(l))
- call assert_equal(['Xfile1', 1, 9, 'one two three'],
- \ [bufname(l[0].bufnr), l[0].lnum, l[0].col, l[0].text])
- call assert_equal(['Xfile2', 2, 1, 'three one two'],
- \ [bufname(l[1].bufnr), l[1].lnum, l[1].col, l[1].text])
-
- Xvimgrep /the/f Xfile*
- let l = g:Xgetlist()
- call assert_equal(3, len(l))
- call assert_equal(['Xfile1', 1, 9, 'one two three'],
- \ [bufname(l[0].bufnr), l[0].lnum, l[0].col, l[0].text])
- call assert_equal(['Xfile2', 2, 1, 'three one two'],
- \ [bufname(l[1].bufnr), l[1].lnum, l[1].col, l[1].text])
- call assert_equal(['Xfile2', 4, 4, 'aaathreeaaa'],
- \ [bufname(l[2].bufnr), l[2].lnum, l[2].col, l[2].text])
-
- Xvimgrep /aaa/fg Xfile*
- let l = g:Xgetlist()
- call assert_equal(4, len(l))
- call assert_equal(['Xfile1', 2, 1, 'aaaaaa'],
- \ [bufname(l[0].bufnr), l[0].lnum, l[0].col, l[0].text])
- call assert_equal(['Xfile1', 2, 4, 'aaaaaa'],
- \ [bufname(l[1].bufnr), l[1].lnum, l[1].col, l[1].text])
- call assert_equal(['Xfile2', 4, 1, 'aaathreeaaa'],
- \ [bufname(l[2].bufnr), l[2].lnum, l[2].col, l[2].text])
- call assert_equal(['Xfile2', 4, 9, 'aaathreeaaa'],
- \ [bufname(l[3].bufnr), l[3].lnum, l[3].col, l[3].text])
-
- call assert_fails('Xvimgrep /xyz/fg Xfile*', 'E480:')
-endfunc
-
-func Test_vimgrep_fuzzy_match()
- call writefile(['one two three', 'aaaaaa'], 'Xfile1')
- call writefile(['one', 'three one two', 'two', 'aaathreeaaa'], 'Xfile2')
- call Xvimgrep_fuzzy_match('c')
- call Xvimgrep_fuzzy_match('l')
- call delete('Xfile1')
- call delete('Xfile2')
-endfunc
-
-" Test for getting a specific item from a quickfix list
-func Xtest_getqflist_by_idx(cchar)
- call s:setup_commands(a:cchar)
- " Empty list
- call assert_equal([], g:Xgetlist({'idx' : 1, 'items' : 0}).items)
- Xexpr ['F1:10:L10', 'F1:20:L20']
- let l = g:Xgetlist({'idx' : 2, 'items' : 0}).items
- call assert_equal(bufnr('F1'), l[0].bufnr)
- call assert_equal(20, l[0].lnum)
- call assert_equal('L20', l[0].text)
- call assert_equal([], g:Xgetlist({'idx' : -1, 'items' : 0}).items)
- call assert_equal([], g:Xgetlist({'idx' : 3, 'items' : 0}).items)
- call assert_equal({}, g:Xgetlist(#{idx: "abc"}))
- %bwipe!
-endfunc
-
-func Test_getqflist_by_idx()
- call Xtest_getqflist_by_idx('c')
- call Xtest_getqflist_by_idx('l')
-endfunc
-
-" Test for the 'quickfixtextfunc' setting
-func Tqfexpr(info)
- if a:info.quickfix
- let qfl = getqflist({'id' : a:info.id, 'items' : 1}).items
- else
- let qfl = getloclist(a:info.winid, {'id' : a:info.id, 'items' : 1}).items
- endif
-
-
- let l = []
- for idx in range(a:info.start_idx - 1, a:info.end_idx - 1)
- let e = qfl[idx]
- let s = ''
- if e.bufnr != 0
- let bname = bufname(e.bufnr)
- let s ..= fnamemodify(bname, ':.')
- endif
- let s ..= '-'
- let s ..= 'L' .. string(e.lnum) .. 'C' .. string(e.col) .. '-'
- let s ..= e.text
- call add(l, s)
- endfor
-
- return l
-endfunc
-
-func Xtest_qftextfunc(cchar)
- call s:setup_commands(a:cchar)
-
- set efm=%f:%l:%c:%m
- set quickfixtextfunc=Tqfexpr
- call assert_equal('Tqfexpr', &quickfixtextfunc)
- call assert_equal('',
- \ g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc)
- call g:Xsetlist([
- \ { 'filename': 'F1', 'lnum': 10, 'col': 2,
- \ 'end_col': 7, 'text': 'green'},
- \ { 'filename': 'F1', 'lnum': 20, 'end_lnum': 25, 'col': 4,
- \ 'end_col': 8, 'text': 'blue'},
- \ ])
-
- Xwindow
- call assert_equal('F1-L10C2-green', getline(1))
- call assert_equal('F1-L20C4-blue', getline(2))
- Xclose
- set quickfixtextfunc&vim
- Xwindow
- call assert_equal('F1|10 col 2-7| green', getline(1))
- call assert_equal('F1|20-25 col 4-8| blue', getline(2))
- Xclose
-
- set efm=%f:%l:%c:%m
- set quickfixtextfunc=Tqfexpr
- " Update the list with only the cwindow
- Xwindow
- only
- call g:Xsetlist([
- \ { 'filename': 'F2', 'lnum': 20, 'col': 2,
- \ 'end_col': 7, 'text': 'red'}
- \ ])
- call assert_equal(['F2-L20C2-red'], getline(1, '$'))
- new
- Xclose
- set efm&
- set quickfixtextfunc&
-
- " Test for per list 'quickfixtextfunc' setting
- func PerQfText(info)
- if a:info.quickfix
- let qfl = getqflist({'id' : a:info.id, 'items' : 1}).items
- else
- let qfl = getloclist(a:info.winid, {'id' : a:info.id, 'items' : 1}).items
- endif
- if empty(qfl)
- return []
- endif
- let l = []
- for idx in range(a:info.start_idx - 1, a:info.end_idx - 1)
- call add(l, 'Line ' .. qfl[idx].lnum .. ', Col ' .. qfl[idx].col)
- endfor
- return l
- endfunc
- set quickfixtextfunc=Tqfexpr
- call g:Xsetlist([], ' ', {'quickfixtextfunc' : "PerQfText"})
- Xaddexpr ['F1:10:2:green', 'F1:20:4:blue']
- Xwindow
- call assert_equal('Line 10, Col 2', getline(1))
- call assert_equal('Line 20, Col 4', getline(2))
- Xclose
- call assert_equal(function('PerQfText'),
- \ g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc)
- " Add entries to the list when the quickfix buffer is hidden
- Xaddexpr ['F1:30:6:red']
- Xwindow
- call assert_equal('Line 30, Col 6', getline(3))
- Xclose
- call g:Xsetlist([], 'r', {'quickfixtextfunc' : ''})
- call assert_equal('', g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc)
- set quickfixtextfunc&
- delfunc PerQfText
-
- " Non-existing function
- set quickfixtextfunc=Tabc
- call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E117:')
- call assert_fails("Xwindow", 'E117:')
- Xclose
- set quickfixtextfunc&
-
- " set option to a non-function
- set quickfixtextfunc=[10,\ 20]
- call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E117:')
- call assert_fails("Xwindow", 'E117:')
- Xclose
- set quickfixtextfunc&
-
- " set option to a function with different set of arguments
- func Xqftext(a, b, c)
- return a:a .. a:b .. a:c
- endfunc
- set quickfixtextfunc=Xqftext
- call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E119:')
- call assert_fails("Xwindow", 'E119:')
- Xclose
-
- " set option to a function that returns a list with non-strings
- func Xqftext2(d)
- return ['one', [], 'two']
- endfunc
- set quickfixtextfunc=Xqftext2
- call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue', 'F1:30:6:red']",
- \ 'E730:')
- call assert_fails('Xwindow', 'E730:')
- call assert_equal(['one', 'F1|20 col 4| blue', 'F1|30 col 6| red'],
- \ getline(1, '$'))
- Xclose
-
- set quickfixtextfunc&
- delfunc Xqftext
- delfunc Xqftext2
-
- " set the global option to a lambda function
- set quickfixtextfunc={d\ ->\ map(g:Xgetlist({'id'\ :\ d.id,\ 'items'\ :\ 1}).items[d.start_idx-1:d.end_idx-1],\ 'v:val.text')}
- Xexpr ['F1:10:2:green', 'F1:20:4:blue']
- Xwindow
- call assert_equal(['green', 'blue'], getline(1, '$'))
- Xclose
- call assert_equal("{d -> map(g:Xgetlist({'id' : d.id, 'items' : 1}).items[d.start_idx-1:d.end_idx-1], 'v:val.text')}", &quickfixtextfunc)
- set quickfixtextfunc&
-
- " use a lambda function that returns an empty list
- set quickfixtextfunc={d\ ->\ []}
- Xexpr ['F1:10:2:green', 'F1:20:4:blue']
- Xwindow
- call assert_equal(['F1|10 col 2| green', 'F1|20 col 4| blue'],
- \ getline(1, '$'))
- Xclose
- set quickfixtextfunc&
-
- " use a lambda function that returns a list with empty strings
- set quickfixtextfunc={d\ ->\ ['',\ '']}
- Xexpr ['F1:10:2:green', 'F1:20:4:blue']
- Xwindow
- call assert_equal(['F1|10 col 2| green', 'F1|20 col 4| blue'],
- \ getline(1, '$'))
- Xclose
- set quickfixtextfunc&
-
- " set the per-quickfix list text function to a lambda function
- call g:Xsetlist([], ' ',
- \ {'quickfixtextfunc' :
- \ {d -> map(g:Xgetlist({'id' : d.id, 'items' : 1}).items[d.start_idx-1:d.end_idx-1],
- \ "'Line ' .. v:val.lnum .. ', Col ' .. v:val.col")}})
- Xaddexpr ['F1:10:2:green', 'F1:20:4:blue']
- Xwindow
- call assert_equal('Line 10, Col 2', getline(1))
- call assert_equal('Line 20, Col 4', getline(2))
- Xclose
- call assert_match("function('<lambda>\\d\\+')", string(g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc))
- call g:Xsetlist([], 'f')
-endfunc
-
-func Test_qftextfunc()
- call Xtest_qftextfunc('c')
- call Xtest_qftextfunc('l')
-endfunc
-
-func Test_qftextfunc_callback()
- let lines =<< trim END
- set efm=%f:%l:%c:%m
-
- #" Test for using a function name
- LET &qftf = 'g:Tqfexpr'
- cexpr "F0:0:0:L0"
- copen
- call assert_equal('F0-L0C0-L0', getline(1))
- cclose
-
- #" Test for using a function()
- set qftf=function('g:Tqfexpr')
- cexpr "F1:1:1:L1"
- copen
- call assert_equal('F1-L1C1-L1', getline(1))
- cclose
-
- #" Using a funcref variable to set 'quickfixtextfunc'
- VAR Fn = function('g:Tqfexpr')
- LET &qftf = Fn
- cexpr "F2:2:2:L2"
- copen
- call assert_equal('F2-L2C2-L2', getline(1))
- cclose
-
- #" Using string(funcref_variable) to set 'quickfixtextfunc'
- LET Fn = function('g:Tqfexpr')
- LET &qftf = string(Fn)
- cexpr "F3:3:3:L3"
- copen
- call assert_equal('F3-L3C3-L3', getline(1))
- cclose
-
- #" Test for using a funcref()
- set qftf=funcref('g:Tqfexpr')
- cexpr "F4:4:4:L4"
- copen
- call assert_equal('F4-L4C4-L4', getline(1))
- cclose
-
- #" Using a funcref variable to set 'quickfixtextfunc'
- LET Fn = funcref('g:Tqfexpr')
- LET &qftf = Fn
- cexpr "F5:5:5:L5"
- copen
- call assert_equal('F5-L5C5-L5', getline(1))
- cclose
-
- #" Using a string(funcref_variable) to set 'quickfixtextfunc'
- LET Fn = funcref('g:Tqfexpr')
- LET &qftf = string(Fn)
- cexpr "F5:5:5:L5"
- copen
- call assert_equal('F5-L5C5-L5', getline(1))
- cclose
-
- #" Test for using a lambda function with set
- VAR optval = "LSTART a LMIDDLE Tqfexpr(a) LEND"
- LET optval = substitute(optval, ' ', '\\ ', 'g')
- exe "set qftf=" .. optval
- cexpr "F6:6:6:L6"
- copen
- call assert_equal('F6-L6C6-L6', getline(1))
- cclose
-
- #" Set 'quickfixtextfunc' to a lambda expression
- LET &qftf = LSTART a LMIDDLE Tqfexpr(a) LEND
- cexpr "F7:7:7:L7"
- copen
- call assert_equal('F7-L7C7-L7', getline(1))
- cclose
-
- #" Set 'quickfixtextfunc' to string(lambda_expression)
- LET &qftf = "LSTART a LMIDDLE Tqfexpr(a) LEND"
- cexpr "F8:8:8:L8"
- copen
- call assert_equal('F8-L8C8-L8', getline(1))
- cclose
-
- #" Set 'quickfixtextfunc' to a variable with a lambda expression
- VAR Lambda = LSTART a LMIDDLE Tqfexpr(a) LEND
- LET &qftf = Lambda
- cexpr "F9:9:9:L9"
- copen
- call assert_equal('F9-L9C9-L9', getline(1))
- cclose
-
- #" Set 'quickfixtextfunc' to a string(variable with a lambda expression)
- LET Lambda = LSTART a LMIDDLE Tqfexpr(a) LEND
- LET &qftf = string(Lambda)
- cexpr "F9:9:9:L9"
- copen
- call assert_equal('F9-L9C9-L9', getline(1))
- cclose
- END
- call CheckLegacyAndVim9Success(lines)
-
- " Test for using a script-local function name
- func s:TqfFunc2(info)
- let g:TqfFunc2Args = [a:info.start_idx, a:info.end_idx]
- return ''
- endfunc
- let g:TqfFunc2Args = []
- set quickfixtextfunc=s:TqfFunc2
- cexpr "F10:10:10:L10"
- cclose
- call assert_equal([1, 1], g:TqfFunc2Args)
-
- let &quickfixtextfunc = 's:TqfFunc2'
- cexpr "F11:11:11:L11"
- cclose
- call assert_equal([1, 1], g:TqfFunc2Args)
- delfunc s:TqfFunc2
-
- " set 'quickfixtextfunc' to a partial with dict. This used to cause a crash.
- func SetQftfFunc()
- let params = {'qftf': function('g:DictQftfFunc')}
- let &quickfixtextfunc = params.qftf
- endfunc
- func g:DictQftfFunc(_) dict
- endfunc
- call SetQftfFunc()
- new
- call SetQftfFunc()
- bw
- call test_garbagecollect_now()
- new
- set qftf=
- wincmd w
- set qftf=
- :%bw!
-
- " set per-quickfix list 'quickfixtextfunc' to a partial with dict. This used
- " to cause a crash.
- let &qftf = ''
- func SetLocalQftfFunc()
- let params = {'qftf': function('g:DictQftfFunc')}
- call setqflist([], 'a', {'quickfixtextfunc' : params.qftf})
- endfunc
- call SetLocalQftfFunc()
- call test_garbagecollect_now()
- call setqflist([], 'a', {'quickfixtextfunc' : ''})
- delfunc g:DictQftfFunc
- delfunc SetQftfFunc
- delfunc SetLocalQftfFunc
- set efm&
-endfunc
-
-" Test for updating a location list for some other window and check that
-" 'qftextfunc' uses the correct location list.
-func Test_qftextfunc_other_loclist()
- %bw!
- call setloclist(0, [], 'f')
-
- " create a window and a location list for it and open the location list
- " window
- lexpr ['F1:10:12:one', 'F1:20:14:two']
- let w1_id = win_getid()
- call setloclist(0, [], ' ',
- \ {'lines': ['F1:10:12:one', 'F1:20:14:two'],
- \ 'quickfixtextfunc':
- \ {d -> map(getloclist(d.winid, {'id' : d.id,
- \ 'items' : 1}).items[d.start_idx-1:d.end_idx-1],
- \ "'Line ' .. v:val.lnum .. ', Col ' .. v:val.col")}})
- lwindow
- let w2_id = win_getid()
-
- " create another window and a location list for it and open the location
- " list window
- topleft new
- let w3_id = win_getid()
- call setloclist(0, [], ' ',
- \ {'lines': ['F2:30:32:eleven', 'F2:40:34:twelve'],
- \ 'quickfixtextfunc':
- \ {d -> map(getloclist(d.winid, {'id' : d.id,
- \ 'items' : 1}).items[d.start_idx-1:d.end_idx-1],
- \ "'Ligne ' .. v:val.lnum .. ', Colonne ' .. v:val.col")}})
- lwindow
- let w4_id = win_getid()
-
- topleft new
- lexpr ['F3:50:52:green', 'F3:60:54:blue']
- let w5_id = win_getid()
-
- " change the location list for some other window
- call setloclist(0, [], 'r', {'lines': ['F3:55:56:aaa', 'F3:57:58:bbb']})
- call setloclist(w1_id, [], 'r', {'lines': ['F1:62:63:bbb', 'F1:64:65:ccc']})
- call setloclist(w3_id, [], 'r', {'lines': ['F2:76:77:ddd', 'F2:78:79:eee']})
- call assert_equal(['Line 62, Col 63', 'Line 64, Col 65'],
- \ getbufline(winbufnr(w2_id), 1, '$'))
- call assert_equal(['Ligne 76, Colonne 77', 'Ligne 78, Colonne 79'],
- \ getbufline(winbufnr(w4_id), 1, '$'))
- call setloclist(w2_id, [], 'r', {'lines': ['F1:32:33:fff', 'F1:34:35:ggg']})
- call setloclist(w4_id, [], 'r', {'lines': ['F2:46:47:hhh', 'F2:48:49:jjj']})
- call assert_equal(['Line 32, Col 33', 'Line 34, Col 35'],
- \ getbufline(winbufnr(w2_id), 1, '$'))
- call assert_equal(['Ligne 46, Colonne 47', 'Ligne 48, Colonne 49'],
- \ getbufline(winbufnr(w4_id), 1, '$'))
-
- call win_gotoid(w5_id)
- lwindow
- call assert_equal(['F3|55 col 56| aaa', 'F3|57 col 58| bbb'],
- \ getline(1, '$'))
- %bw!
-endfunc
-
-func Test_locationlist_open_in_newtab()
- call s:create_test_file('Xqftestfile1')
- call s:create_test_file('Xqftestfile2')
- call s:create_test_file('Xqftestfile3')
-
- %bwipe!
-
- let lines =<< trim END
- Xqftestfile1:5:Line5
- Xqftestfile2:10:Line10
- Xqftestfile3:16:Line16
- END
- lgetexpr lines
-
- silent! llast
- call assert_equal(1, tabpagenr('$'))
- call assert_equal('Xqftestfile3', bufname())
-
- set switchbuf=newtab
-
- silent! lfirst
- call assert_equal(2, tabpagenr('$'))
- call assert_equal('Xqftestfile1', bufname())
-
- silent! lnext
- call assert_equal(3, tabpagenr('$'))
- call assert_equal('Xqftestfile2', bufname())
-
- call delete('Xqftestfile1')
- call delete('Xqftestfile2')
- call delete('Xqftestfile3')
- set switchbuf&vim
-
- %bwipe!
-endfunc
-
-" Test for win_gettype() in quickfix and location list windows
-func Test_win_gettype()
- copen
- call assert_equal("quickfix", win_gettype())
- let wid = win_getid()
- wincmd p
- call assert_equal("quickfix", win_gettype(wid))
- cclose
- lexpr ''
- lopen
- call assert_equal("loclist", win_gettype())
- let wid = win_getid()
- wincmd p
- call assert_equal("loclist", win_gettype(wid))
- lclose
-endfunc
-
-fun Test_vimgrep_nomatch()
- call XexprTests('c')
- call g:Xsetlist([{'lnum':10,'text':'Line1'}])
- copen
- if has("win32")
- call assert_fails('vimgrep foo *.zzz', 'E479:')
- let expected = [{'lnum': 10, 'bufnr': 0, 'end_lnum': 0, 'pattern': '', 'valid': 0, 'vcol': 0, 'nr': 0, 'module': '', 'type': '', 'end_col': 0, 'col': 0, 'text': 'Line1'}]
- else
- call assert_fails('vimgrep foo *.zzz', 'E480:')
- let expected = []
- endif
- call assert_equal(expected, getqflist())
- cclose
-endfunc
-
-" Test for opening the quickfix window in two tab pages and then closing one
-" of the quickfix windows. This should not make the quickfix buffer unlisted.
-" (github issue #9300).
-func Test_two_qf_windows()
- cexpr "F1:1:line1"
- copen
- tabnew
- copen
- call assert_true(&buflisted)
- cclose
- tabfirst
- call assert_true(&buflisted)
- let bnum = bufnr()
- cclose
- " if all the quickfix windows are closed, then buffer should be unlisted.
- call assert_false(buflisted(bnum))
- %bw!
-
- " Repeat the test for a location list
- lexpr "F2:2:line2"
- lopen
- let bnum = bufnr()
- tabnew
- exe "buffer" bnum
- tabfirst
- lclose
- tablast
- call assert_true(buflisted(bnum))
- tabclose
- lopen
- call assert_true(buflisted(bnum))
- lclose
- call assert_false(buflisted(bnum))
- %bw!
-endfunc
-
-" Weird sequence of commands that caused entering a wiped-out buffer
-func Test_lopen_bwipe()
- func R()
- silent! tab lopen
- e x
- silent! lfile
- endfunc
-
- cal R()
- cal R()
- cal R()
- bw!
- delfunc R
-endfunc
-
-" Another sequence of commands that caused all buffers to be wiped out
-func Test_lopen_bwipe_all()
- let lines =<< trim END
- func R()
- silent! tab lopen
- e foo
- silent! lfile
- endfunc
- cal R()
- exe "norm \<C-W>\<C-V>0"
- cal R()
- bwipe
-
- call writefile(['done'], 'Xresult')
- qall!
- END
- call writefile(lines, 'Xscript')
- if RunVim([], [], '-u NONE -n -X -Z -e -m -s -S Xscript')
- call assert_equal(['done'], readfile('Xresult'))
- endif
-
- call delete('Xscript')
- call delete('Xresult')
-endfunc
-
-" Test for calling setqflist() function recursively
-func Test_recursive_setqflist()
- augroup QF_Test
- au!
- autocmd BufWinEnter quickfix call setqflist([], 'r')
- augroup END
-
- copen
- call assert_fails("call setqflist([], 'a')", 'E952:')
-
- augroup QF_Test
- au!
- augroup END
- %bw!
-endfunc
-
-" Test for failure to create a new window when selecting a file from the
-" quickfix window
-func Test_cwindow_newwin_fails()
- cgetexpr ["Xfile1:10:L10", "Xfile1:20:L20"]
- cwindow
- only
- let qf_wid = win_getid()
- " create the maximum number of scratch windows
- let hor_win_count = (&lines - 1)/2
- let hor_split_count = hor_win_count - 1
- for s in range(1, hor_split_count) | new | set buftype=nofile | endfor
- call win_gotoid(qf_wid)
- call assert_fails('exe "normal \<CR>"', 'E36:')
- %bw!
-endfunc
-
-" Test for updating the location list when only the location list window is
-" present and the corresponding file window is closed.
-func Test_loclist_update_with_llwin_only()
- %bw!
- new
- wincmd w
- lexpr ["Xfile1:1:Line1"]
- lopen
- wincmd p
- close
- call setloclist(2, [], 'r', {'lines': ["Xtest2:2:Line2"]})
- call assert_equal(['Xtest2|2| Line2'], getbufline(winbufnr(2), 1, '$'))
- %bw!
-endfunc
-
-" Test for getting the quickfix list after a buffer with an error is wiped out
-func Test_getqflist_wiped_out_buffer()
- %bw!
- cexpr ["Xtest1:34:Wiped out"]
- let bnum = bufnr('Xtest1')
- call assert_equal(bnum, getqflist()[0].bufnr)
- bw Xtest1
- call assert_equal(0, getqflist()[0].bufnr)
- %bw!
-endfunc
-
-" Test for the status message that is displayed when opening a new quickfix
-" list
-func Test_qflist_statusmsg()
- cexpr "1\n2"
- cexpr "1\n2\n3\ntest_quickfix.vim:1:msg"
- call assert_equal('(4 of 4): msg', v:statusmsg)
- call setqflist([], 'f')
- %bw!
-
- " When creating a new quickfix list, if an autocmd changes the quickfix list
- " in the stack, then an error message should be displayed.
- augroup QF_Test
- au!
- au BufEnter test_quickfix.vim colder
- augroup END
- cexpr "1\n2"
- call assert_fails('cexpr "1\n2\n3\ntest_quickfix.vim:1:msg"', 'E925:')
- call setqflist([], 'f')
- augroup QF_Test
- au!
- augroup END
- %bw!
-
- augroup QF_Test
- au!
- au BufEnter test_quickfix.vim caddexpr "4"
- augroup END
- call assert_fails('cexpr "1\n2\n3\ntest_quickfix.vim:1:msg"', 'E925:')
- call setqflist([], 'f')
- augroup QF_Test
- au!
- augroup END
- %bw!
-endfunc
-
-func Test_quickfixtextfunc_recursive()
- func s:QFTfunc(o)
- cgete '0'
- endfunc
- copen
- let &quickfixtextfunc = 's:QFTfunc'
- cex ""
-
- let &quickfixtextfunc = ''
- cclose
-endfunc
-
-" Test for replacing the location list from an autocmd. This used to cause a
-" read from freed memory.
-func Test_loclist_replace_autocmd()
- %bw!
- call setloclist(0, [], 'f')
- let s:bufnr = bufnr()
- cal setloclist(0, [{'0': 0, '': ''}])
- au BufEnter * cal setloclist(1, [{'t': ''}, {'bufnr': s:bufnr}], 'r')
- lopen
- try
- exe "norm j\<CR>"
- catch
- endtry
- lnext
- %bw!
- call setloclist(0, [], 'f')
-endfunc
-
-func s:QfTf(_)
-endfunc
-
-func Test_setqflist_cb_arg()
- " This was changing the callback name in the dictionary.
- let d = #{quickfixtextfunc: 's:QfTf'}
- call setqflist([], 'a', d)
- call assert_equal('s:QfTf', d.quickfixtextfunc)
-
- call setqflist([], 'f')
-endfunc
-
-
-" vim: shiftwidth=2 sts=2 expandtab