123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661 |
- " Tests for the :source command.
- source check.vim
- source view_util.vim
- func Test_source_autocmd()
- call writefile([
- \ 'let did_source = 1',
- \ ], 'Xsourced')
- au SourcePre *source* let did_source_pre = 1
- au SourcePost *source* let did_source_post = 1
- source Xsourced
- call assert_equal(g:did_source, 1)
- call assert_equal(g:did_source_pre, 1)
- call assert_equal(g:did_source_post, 1)
- call delete('Xsourced')
- au! SourcePre
- au! SourcePost
- unlet g:did_source
- unlet g:did_source_pre
- unlet g:did_source_post
- endfunc
- func Test_source_cmd()
- au SourceCmd *source* let did_source = expand('<afile>')
- au SourcePre *source* let did_source_pre = 2
- au SourcePost *source* let did_source_post = 2
- source Xsourced
- call assert_equal(g:did_source, 'Xsourced')
- call assert_false(exists('g:did_source_pre'))
- call assert_equal(g:did_source_post, 2)
- au! SourceCmd
- au! SourcePre
- au! SourcePost
- endfunc
- func Test_source_sandbox()
- new
- call writefile(["Ohello\<Esc>"], 'Xsourcehello')
- source! Xsourcehello | echo
- call assert_equal('hello', getline(1))
- call assert_fails('sandbox source! Xsourcehello', 'E48:')
- bwipe!
- call delete('Xsourcehello')
- endfunc
- " When deleting a file and immediately creating a new one the inode may be
- " recycled. Vim should not recognize it as the same script.
- func Test_different_script()
- call writefile(['let s:var = "asdf"'], 'XoneScript', 'D')
- source XoneScript
- call writefile(['let g:var = s:var'], 'XtwoScript', 'D')
- call assert_fails('source XtwoScript', 'E121:')
- endfunc
- " When sourcing a Vim script, shebang should be ignored.
- func Test_source_ignore_shebang()
- call writefile(['#!./xyzabc', 'let g:val=369'], 'Xsisfile.vim', 'D')
- source Xsisfile.vim
- call assert_equal(g:val, 369)
- endfunc
- " Test for expanding <sfile> in a autocmd and for <slnum> and <sflnum>
- func Test_source_autocmd_sfile()
- let code =<< trim [CODE]
- let g:SfileName = ''
- augroup sfiletest
- au!
- autocmd User UserAutoCmd let g:Sfile = '<sfile>:t'
- augroup END
- doautocmd User UserAutoCmd
- let g:Slnum = expand('<slnum>')
- let g:Sflnum = expand('<sflnum>')
- augroup! sfiletest
- [CODE]
- call writefile(code, 'Xscript.vim')
- source Xscript.vim
- call assert_equal('Xscript.vim', g:Sfile)
- call assert_equal('7', g:Slnum)
- call assert_equal('8', g:Sflnum)
- call delete('Xscript.vim')
- endfunc
- func Test_source_error()
- call assert_fails('scriptencoding utf-8', 'E167:')
- call assert_fails('finish', 'E168:')
- " call assert_fails('scriptversion 2', 'E984:')
- call assert_fails('source!', 'E471:')
- new
- call setline(1, ['', '', '', ''])
- call assert_fails('1,3source Xscript.vim', 'E481:')
- call assert_fails('1,3source! Xscript.vim', 'E481:')
- bw!
- endfunc
- " Test for sourcing a script recursively
- func Test_nested_script()
- CheckRunVimInTerminal
- call writefile([':source! Xscript.vim', ''], 'Xscript.vim')
- let buf = RunVimInTerminal('', {'rows': 6})
- call term_wait(buf)
- call term_sendkeys(buf, ":set noruler\n")
- call term_sendkeys(buf, ":source! Xscript.vim\n")
- call term_wait(buf)
- call WaitForAssert({-> assert_match('E22: Scripts nested too deep\s*', term_getline(buf, 6))})
- call delete('Xscript.vim')
- call StopVimInTerminal(buf)
- endfunc
- " Test for sourcing a script from the current buffer
- func Test_source_buffer()
- new
- " Source a simple script
- let lines =<< trim END
- let a = "Test"
- let b = 20
- let c = [1.1]
- END
- call setline(1, lines)
- source
- call assert_equal(['Test', 20, [1.1]], [g:a, g:b, g:c])
- " Source a range of lines in the current buffer
- %d _
- let lines =<< trim END
- let a = 10
- let a += 20
- let a += 30
- let a += 40
- END
- call setline(1, lines)
- .source
- call assert_equal(10, g:a)
- 3source
- call assert_equal(40, g:a)
- 2,3source
- call assert_equal(90, g:a)
- " Make sure the script line number is correct when sourcing a range of
- " lines.
- %d _
- let lines =<< trim END
- Line 1
- Line 2
- func Xtestfunc()
- return expand("<sflnum>")
- endfunc
- Line 3
- Line 4
- END
- call setline(1, lines)
- 3,5source
- call assert_equal('4', Xtestfunc())
- delfunc Xtestfunc
- " Source a script with line continuation lines
- %d _
- let lines =<< trim END
- let m = [
- \ 1,
- \ 2,
- \ ]
- call add(m, 3)
- END
- call setline(1, lines)
- source
- call assert_equal([1, 2, 3], g:m)
- " Source a script with line continuation lines and a comment
- %d _
- let lines =<< trim END
- let m = [
- "\ first entry
- \ 'a',
- "\ second entry
- \ 'b',
- \ ]
- " third entry
- call add(m, 'c')
- END
- call setline(1, lines)
- source
- call assert_equal(['a', 'b', 'c'], g:m)
- " Source an incomplete line continuation line
- %d _
- let lines =<< trim END
- let k = [
- \
- END
- call setline(1, lines)
- call assert_fails('source', 'E697:')
- " Source a function with a for loop
- %d _
- let lines =<< trim END
- let m = []
- " test function
- func! Xtest()
- for i in range(5, 7)
- call add(g:m, i)
- endfor
- endfunc
- call Xtest()
- END
- call setline(1, lines)
- source
- call assert_equal([5, 6, 7], g:m)
- " Source an empty buffer
- %d _
- source
- " test for script local functions and variables
- let lines =<< trim END
- let s:var1 = 10
- func s:F1()
- let s:var1 += 1
- return s:var1
- endfunc
- func s:F2()
- endfunc
- let g:ScriptID = expand("<SID>")
- END
- call setline(1, lines)
- source
- call assert_true(g:ScriptID != '')
- call assert_true(exists('*' .. g:ScriptID .. 'F1'))
- call assert_true(exists('*' .. g:ScriptID .. 'F2'))
- call assert_equal(11, call(g:ScriptID .. 'F1', []))
- " the same script ID should be used even if the buffer is sourced more than
- " once
- %d _
- let lines =<< trim END
- let g:ScriptID = expand("<SID>")
- let g:Count += 1
- END
- call setline(1, lines)
- let g:Count = 0
- source
- call assert_true(g:ScriptID != '')
- let scid = g:ScriptID
- source
- call assert_equal(scid, g:ScriptID)
- call assert_equal(2, g:Count)
- source
- call assert_equal(scid, g:ScriptID)
- call assert_equal(3, g:Count)
- " test for the script line number
- %d _
- let lines =<< trim END
- " comment
- let g:Slnum1 = expand("<slnum>")
- let i = 1 +
- \ 2 +
- "\ comment
- \ 3
- let g:Slnum2 = expand("<slnum>")
- END
- call setline(1, lines)
- source
- call assert_equal('2', g:Slnum1)
- call assert_equal('7', g:Slnum2)
- " test for retaining the same script number across source calls
- let lines =<< trim END
- let g:ScriptID1 = expand("<SID>")
- let g:Slnum1 = expand("<slnum>")
- let l =<< trim END
- let g:Slnum2 = expand("<slnum>")
- let g:ScriptID2 = expand("<SID>")
- END
- new
- call setline(1, l)
- source
- bw!
- let g:ScriptID3 = expand("<SID>")
- let g:Slnum3 = expand("<slnum>")
- END
- call writefile(lines, 'Xscript')
- source Xscript
- call assert_true(g:ScriptID1 != g:ScriptID2)
- call assert_equal(g:ScriptID1, g:ScriptID3)
- call assert_equal('2', g:Slnum1)
- call assert_equal('1', g:Slnum2)
- call assert_equal('12', g:Slnum3)
- call delete('Xscript')
- " test for sourcing a heredoc
- %d _
- let lines =<< trim END
- let a = 1
- let heredoc =<< trim DATA
- red
- green
- blue
- DATA
- let b = 2
- END
- call setline(1, lines)
- source
- call assert_equal(['red', ' green', 'blue'], g:heredoc)
- " test for a while and for statement
- %d _
- let lines =<< trim END
- let a = 0
- let b = 1
- while b <= 10
- let a += 10
- let b += 1
- endwhile
- for i in range(5)
- let a += 10
- endfor
- END
- call setline(1, lines)
- source
- call assert_equal(150, g:a)
- " test for sourcing the same buffer multiple times after changing a function
- %d _
- let lines =<< trim END
- func Xtestfunc()
- return "one"
- endfunc
- END
- call setline(1, lines)
- source
- call assert_equal("one", Xtestfunc())
- call setline(2, ' return "two"')
- source
- call assert_equal("two", Xtestfunc())
- call setline(2, ' return "three"')
- source
- call assert_equal("three", Xtestfunc())
- delfunc Xtestfunc
- " test for using try/catch
- %d _
- let lines =<< trim END
- let Trace = '1'
- try
- let a1 = b1
- catch
- let Trace ..= '2'
- finally
- let Trace ..= '3'
- endtry
- END
- call setline(1, lines)
- source
- call assert_equal("123", g:Trace)
- " test with the finish command
- %d _
- let lines =<< trim END
- let g:Color = 'blue'
- finish
- let g:Color = 'green'
- END
- call setline(1, lines)
- source
- call assert_equal('blue', g:Color)
- " Test for the SourcePre and SourcePost autocmds
- augroup Xtest
- au!
- au SourcePre * let g:XsourcePre=4
- \ | let g:XsourcePreFile = expand("<afile>")
- au SourcePost * let g:XsourcePost=6
- \ | let g:XsourcePostFile = expand("<afile>")
- augroup END
- %d _
- let lines =<< trim END
- let a = 1
- END
- call setline(1, lines)
- source
- call assert_equal(4, g:XsourcePre)
- call assert_equal(6, g:XsourcePost)
- call assert_equal(':source buffer=' .. bufnr(), g:XsourcePreFile)
- call assert_equal(':source buffer=' .. bufnr(), g:XsourcePostFile)
- augroup Xtest
- au!
- augroup END
- augroup! Xtest
- %bw!
- endfunc
- " Test for sourcing a Vim9 script from the current buffer
- func Test_source_buffer_vim9()
- throw 'Skipped: Vim9 script is N/A'
- new
- " test for sourcing a Vim9 script
- %d _
- let lines =<< trim END
- vim9script
- # check dict
- var x: number = 10
- def g:Xtestfunc(): number
- return x
- enddef
- END
- call setline(1, lines)
- source
- call assert_equal(10, Xtestfunc())
- " test for sourcing a Vim9 script with line continuation
- %d _
- let lines =<< trim END
- vim9script
- g:Str1 = "hello "
- .. "world"
- .. ", how are you?"
- g:Colors = [
- 'red',
- # comment
- 'blue'
- ]
- g:Dict = {
- a: 22,
- # comment
- b: 33
- }
- # calling a function with line continuation
- def Sum(...values: list<number>): number
- var sum: number = 0
- for v in values
- sum += v
- endfor
- return sum
- enddef
- g:Total1 = Sum(10,
- 20,
- 30)
- var i: number = 0
- while i < 10
- # while loop
- i +=
- 1
- endwhile
- g:Count1 = i
- # for loop
- g:Count2 = 0
- for j in range(10, 20)
- g:Count2 +=
- i
- endfor
- g:Total2 = 10 +
- 20 -
- 5
- g:Result1 = g:Total2 > 1
- ? 'red'
- : 'blue'
- g:Str2 = 'x'
- ->repeat(10)
- ->trim()
- ->strpart(4)
- g:Result2 = g:Dict
- .a
- augroup Test
- au!
- au BufNewFile Xfile g:readFile = 1
- | g:readExtra = 2
- augroup END
- g:readFile = 0
- g:readExtra = 0
- new Xfile
- bwipe!
- augroup Test
- au!
- augroup END
- END
- call setline(1, lines)
- source
- call assert_equal("hello world, how are you?", g:Str1)
- call assert_equal(['red', 'blue'], g:Colors)
- call assert_equal(#{a: 22, b: 33}, g:Dict)
- call assert_equal(60, g:Total1)
- call assert_equal(10, g:Count1)
- call assert_equal(110, g:Count2)
- call assert_equal(25, g:Total2)
- call assert_equal('red', g:Result1)
- call assert_equal('xxxxxx', g:Str2)
- call assert_equal(22, g:Result2)
- call assert_equal(1, g:readFile)
- call assert_equal(2, g:readExtra)
- " test for sourcing the same buffer multiple times after changing a function
- %d _
- let lines =<< trim END
- vim9script
- def g:Xtestfunc(): string
- return "one"
- enddef
- END
- call setline(1, lines)
- source
- call assert_equal("one", Xtestfunc())
- call setline(3, ' return "two"')
- source
- call assert_equal("two", Xtestfunc())
- call setline(3, ' return "three"')
- source
- call assert_equal("three", Xtestfunc())
- delfunc Xtestfunc
- " Test for sourcing a range of lines. Make sure the script line number is
- " correct.
- %d _
- let lines =<< trim END
- Line 1
- Line 2
- vim9script
- def g:Xtestfunc(): string
- return expand("<sflnum>")
- enddef
- Line 3
- Line 4
- END
- call setline(1, lines)
- 3,6source
- call assert_equal('5', Xtestfunc())
- delfunc Xtestfunc
- " test for sourcing a heredoc
- %d _
- let lines =<< trim END
- vim9script
- var a = 1
- g:heredoc =<< trim DATA
- red
- green
- blue
- DATA
- var b = 2
- END
- call setline(1, lines)
- source
- call assert_equal(['red', ' green', 'blue'], g:heredoc)
- " test for using the :vim9cmd modifier
- %d _
- let lines =<< trim END
- first line
- g:Math = {
- pi: 3.12,
- e: 2.71828
- }
- g:Editors = [
- 'vim',
- # comment
- 'nano'
- ]
- last line
- END
- call setline(1, lines)
- vim9cmd :2,10source
- call assert_equal(#{pi: 3.12, e: 2.71828}, g:Math)
- call assert_equal(['vim', 'nano'], g:Editors)
- " test for using try/catch
- %d _
- let lines =<< trim END
- vim9script
- g:Trace = '1'
- try
- a1 = b1
- catch
- g:Trace ..= '2'
- finally
- g:Trace ..= '3'
- endtry
- END
- call setline(1, lines)
- source
- call assert_equal('123', g:Trace)
- " test with the finish command
- %d _
- let lines =<< trim END
- vim9script
- g:Color = 'red'
- finish
- g:Color = 'blue'
- END
- call setline(1, lines)
- source
- call assert_equal('red', g:Color)
- " test for ++clear argument to clear all the functions/variables
- %d _
- let lines =<< trim END
- g:ScriptVarFound = exists("color")
- g:MyFuncFound = exists('*Myfunc')
- if g:MyFuncFound
- finish
- endif
- var color = 'blue'
- def Myfunc()
- enddef
- END
- call setline(1, lines)
- vim9cmd source
- call assert_false(g:MyFuncFound)
- call assert_false(g:ScriptVarFound)
- vim9cmd source
- call assert_true(g:MyFuncFound)
- call assert_true(g:ScriptVarFound)
- vim9cmd source ++clear
- call assert_false(g:MyFuncFound)
- call assert_false(g:ScriptVarFound)
- vim9cmd source ++clear
- call assert_false(g:MyFuncFound)
- call assert_false(g:ScriptVarFound)
- call assert_fails('vim9cmd source ++clearx', 'E475:')
- call assert_fails('vim9cmd source ++abcde', 'E484:')
- %bw!
- endfunc
- func Test_source_buffer_long_line()
- " This was reading past the end of the line.
- new
- norm300gr0
- so
- bwipe!
- let lines =<< trim END
- new
- norm 10a0000000000ø00000000000
- norm i0000000000000000000
- silent! so
- END
- call writefile(lines, 'Xtest.vim')
- source Xtest.vim
- bwipe!
- call delete('Xtest.vim')
- endfunc
- " vim: shiftwidth=2 sts=2 expandtab
|