aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/functional/api/vim_spec.lua30
-rw-r--r--test/functional/core/exit_spec.lua18
-rw-r--r--test/functional/editor/mark_spec.lua27
-rw-r--r--test/functional/ex_cmds/source_spec.lua20
-rw-r--r--test/functional/ex_cmds/verbose_spec.lua2
-rw-r--r--test/functional/legacy/assert_spec.lua8
-rw-r--r--test/functional/lua/commands_spec.lua3
-rw-r--r--test/functional/lua/vim_spec.lua2
-rw-r--r--test/old/testdir/test_source.vim550
9 files changed, 622 insertions, 38 deletions
diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua
index 3aa9ba49d5..b5fcd88f71 100644
--- a/test/functional/api/vim_spec.lua
+++ b/test/functional/api/vim_spec.lua
@@ -140,7 +140,7 @@ describe('API', function()
it(':verbose set {option}?', function()
api.nvim_exec2('set nowrap', { output = false })
eq(
- { output = 'nowrap\n\tLast set from anonymous :source' },
+ { output = 'nowrap\n\tLast set from anonymous :source line 1' },
api.nvim_exec2('verbose set wrap?', { output = true })
)
@@ -153,7 +153,7 @@ describe('API', function()
{ output = false }
)
eq(
- { output = 'nowrap\n\tLast set from anonymous :source (script id 1)' },
+ { output = 'nowrap\n\tLast set from anonymous :source (script id 1) line 2' },
api.nvim_exec2('verbose set wrap?', { output = true })
)
end)
@@ -296,16 +296,21 @@ describe('API', function()
eq('ñxx', api.nvim_get_current_line())
end)
+ it('can use :finish', function()
+ api.nvim_exec2('let g:var = 123\nfinish\nlet g:var = 456', {})
+ eq(123, api.nvim_get_var('var'))
+ end)
+
it('execution error', function()
eq(
- 'nvim_exec2(): Vim:E492: Not an editor command: bogus_command',
+ 'nvim_exec2(), line 1: Vim:E492: Not an editor command: bogus_command',
pcall_err(request, 'nvim_exec2', 'bogus_command', {})
)
eq('', api.nvim_eval('v:errmsg')) -- v:errmsg was not updated.
eq('', eval('v:exception'))
eq(
- 'nvim_exec2(): Vim(buffer):E86: Buffer 23487 does not exist',
+ 'nvim_exec2(), line 1: Vim(buffer):E86: Buffer 23487 does not exist',
pcall_err(request, 'nvim_exec2', 'buffer 23487', {})
)
eq('', eval('v:errmsg')) -- v:errmsg was not updated.
@@ -338,17 +343,28 @@ describe('API', function()
write_file(sourcing_fname, 'call nvim_exec2("source ' .. fname .. '", {"output": v:false})\n')
api.nvim_exec2('set verbose=2', { output = false })
local traceback_output = dedent([[
- line 0: sourcing "%s"
- line 0: sourcing "%s"
+ sourcing "nvim_exec2()"
+ line 1: sourcing "nvim_exec2() called at nvim_exec2():1"
+ line 1: sourcing "%s"
+ line 1: sourcing "nvim_exec2() called at %s:1"
+ line 1: sourcing "%s"
hello
finished sourcing %s
continuing in nvim_exec2() called at %s:1
+ finished sourcing nvim_exec2() called at %s:1
+ continuing in %s
finished sourcing %s
- continuing in nvim_exec2() called at nvim_exec2():0]]):format(
+ continuing in nvim_exec2() called at nvim_exec2():1
+ finished sourcing nvim_exec2() called at nvim_exec2():1
+ continuing in nvim_exec2()
+ finished sourcing nvim_exec2()]]):format(
+ sourcing_fname,
sourcing_fname,
fname,
fname,
sourcing_fname,
+ sourcing_fname,
+ sourcing_fname,
sourcing_fname
)
eq(
diff --git a/test/functional/core/exit_spec.lua b/test/functional/core/exit_spec.lua
index 65f6bc28a6..aafad4c8a5 100644
--- a/test/functional/core/exit_spec.lua
+++ b/test/functional/core/exit_spec.lua
@@ -97,14 +97,26 @@ describe(':cquit', function()
end)
it('exits with redir msg for multiple exit codes after :cquit 1 2', function()
- test_cq('cquit 1 2', nil, 'nvim_exec2(): Vim(cquit):E488: Trailing characters: 2: cquit 1 2')
+ test_cq(
+ 'cquit 1 2',
+ nil,
+ 'nvim_exec2(), line 1: Vim(cquit):E488: Trailing characters: 2: cquit 1 2'
+ )
end)
it('exits with redir msg for non-number exit code after :cquit X', function()
- test_cq('cquit X', nil, 'nvim_exec2(): Vim(cquit):E488: Trailing characters: X: cquit X')
+ test_cq(
+ 'cquit X',
+ nil,
+ 'nvim_exec2(), line 1: Vim(cquit):E488: Trailing characters: X: cquit X'
+ )
end)
it('exits with redir msg for negative exit code after :cquit -1', function()
- test_cq('cquit -1', nil, 'nvim_exec2(): Vim(cquit):E488: Trailing characters: -1: cquit -1')
+ test_cq(
+ 'cquit -1',
+ nil,
+ 'nvim_exec2(), line 1: Vim(cquit):E488: Trailing characters: -1: cquit -1'
+ )
end)
end)
diff --git a/test/functional/editor/mark_spec.lua b/test/functional/editor/mark_spec.lua
index 08f90b088d..91bd2f4bbd 100644
--- a/test/functional/editor/mark_spec.lua
+++ b/test/functional/editor/mark_spec.lua
@@ -42,59 +42,62 @@ describe('named marks', function()
it('errors when set out of range with :mark', function()
command('edit ' .. file1)
local err = pcall_err(n.exec_capture, '1000mark x')
- eq('nvim_exec2(): Vim(mark):E16: Invalid range: 1000mark x', err)
+ eq('nvim_exec2(), line 1: Vim(mark):E16: Invalid range: 1000mark x', err)
end)
it('errors when set out of range with :k', function()
command('edit ' .. file1)
local err = pcall_err(n.exec_capture, '1000kx')
- eq('nvim_exec2(): Vim(k):E16: Invalid range: 1000kx', err)
+ eq('nvim_exec2(), line 1: Vim(k):E16: Invalid range: 1000kx', err)
end)
it('errors on unknown mark name with :mark', function()
command('edit ' .. file1)
local err = pcall_err(n.exec_capture, 'mark #')
- eq('nvim_exec2(): Vim(mark):E191: Argument must be a letter or forward/backward quote', err)
+ eq(
+ 'nvim_exec2(), line 1: Vim(mark):E191: Argument must be a letter or forward/backward quote',
+ err
+ )
end)
it("errors on unknown mark name with '", function()
command('edit ' .. file1)
local err = pcall_err(n.exec_capture, "normal! '#")
- eq('nvim_exec2(): Vim(normal):E78: Unknown mark', err)
+ eq('nvim_exec2(), line 1: Vim(normal):E78: Unknown mark', err)
end)
it('errors on unknown mark name with `', function()
command('edit ' .. file1)
local err = pcall_err(n.exec_capture, 'normal! `#')
- eq('nvim_exec2(): Vim(normal):E78: Unknown mark', err)
+ eq('nvim_exec2(), line 1: Vim(normal):E78: Unknown mark', err)
end)
it("errors when moving to a mark that is not set with '", function()
command('edit ' .. file1)
local err = pcall_err(n.exec_capture, "normal! 'z")
- eq('nvim_exec2(): Vim(normal):E20: Mark not set', err)
+ eq('nvim_exec2(), line 1: Vim(normal):E20: Mark not set', err)
err = pcall_err(n.exec_capture, "normal! '.")
- eq('nvim_exec2(): Vim(normal):E20: Mark not set', err)
+ eq('nvim_exec2(), line 1: Vim(normal):E20: Mark not set', err)
end)
it('errors when moving to a mark that is not set with `', function()
command('edit ' .. file1)
local err = pcall_err(n.exec_capture, 'normal! `z')
- eq('nvim_exec2(): Vim(normal):E20: Mark not set', err)
+ eq('nvim_exec2(), line 1: Vim(normal):E20: Mark not set', err)
err = pcall_err(n.exec_capture, 'normal! `>')
- eq('nvim_exec2(): Vim(normal):E20: Mark not set', err)
+ eq('nvim_exec2(), line 1: Vim(normal):E20: Mark not set', err)
end)
it("errors when moving to a global mark that is not set with '", function()
command('edit ' .. file1)
local err = pcall_err(n.exec_capture, "normal! 'Z")
- eq('nvim_exec2(): Vim(normal):E20: Mark not set', err)
+ eq('nvim_exec2(), line 1: Vim(normal):E20: Mark not set', err)
end)
it('errors when moving to a global mark that is not set with `', function()
command('edit ' .. file1)
local err = pcall_err(n.exec_capture, 'normal! `Z')
- eq('nvim_exec2(): Vim(normal):E20: Mark not set', err)
+ eq('nvim_exec2(), line 1: Vim(normal):E20: Mark not set', err)
end)
it("can move to them using '", function()
@@ -169,7 +172,7 @@ describe('named marks', function()
command('next')
command('bw! ' .. file1)
local err = pcall_err(n.exec_capture, "normal! 'A")
- eq('nvim_exec2(): Vim(normal):E92: Buffer 1 not found', err)
+ eq('nvim_exec2(), line 1: Vim(normal):E92: Buffer 1 not found', err)
os.remove(file1)
end)
diff --git a/test/functional/ex_cmds/source_spec.lua b/test/functional/ex_cmds/source_spec.lua
index 8a15aa04d1..4548e51624 100644
--- a/test/functional/ex_cmds/source_spec.lua
+++ b/test/functional/ex_cmds/source_spec.lua
@@ -101,16 +101,14 @@ describe(':source', function()
\ k: "v"
"\ (o_o)
\ }
- let c = expand("<SID>")->empty()
+ let c = expand("<SID>")
let s:s = 0zbeef.cafe
let d = s:s]])
command('source')
eq('2', exec_capture('echo a'))
eq("{'k': 'v'}", exec_capture('echo b'))
-
- -- Script items are created only on script var access
- eq('1', exec_capture('echo c'))
+ eq('<SNR>1_', exec_capture('echo c'))
eq('0zBEEFCAFE', exec_capture('echo d'))
exec('set cpoptions+=C')
@@ -136,6 +134,10 @@ describe(':source', function()
feed_command(':source')
eq('3', exec_capture('echo a'))
+ -- Source last line only
+ feed_command(':$source')
+ eq('Vim(echo):E117: Unknown function: s:C', exc_exec('echo D()'))
+
-- Source from 2nd line to end of file
feed('ggjVG')
feed_command(':source')
@@ -143,9 +145,9 @@ describe(':source', function()
eq("{'K': 'V'}", exec_capture('echo b'))
eq('<SNR>1_C()', exec_capture('echo D()'))
- -- Source last line only
+ -- Source last line after the lines that define s:C() have been sourced
feed_command(':$source')
- eq('Vim(echo):E117: Unknown function: s:C', exc_exec('echo D()'))
+ eq('<SNR>1_C()', exec_capture('echo D()'))
exec('set cpoptions+=C')
eq("Vim(let):E723: Missing end of Dictionary '}': ", exc_exec("'<,'>source"))
@@ -248,9 +250,9 @@ describe(':source', function()
eq(12, eval('g:c'))
eq(' \\ 1\n "\\ 2', exec_lua('return _G.a'))
- eq(':source (no file)', api.nvim_get_var('sfile_value'))
- eq(':source (no file)', api.nvim_get_var('stack_value'))
- eq(':source (no file)', api.nvim_get_var('script_value'))
+ eq(':source buffer=1', api.nvim_get_var('sfile_value'))
+ eq(':source buffer=1', api.nvim_get_var('stack_value'))
+ eq(':source buffer=1', api.nvim_get_var('script_value'))
end)
end
diff --git a/test/functional/ex_cmds/verbose_spec.lua b/test/functional/ex_cmds/verbose_spec.lua
index 0187baf4ac..faddab1e42 100644
--- a/test/functional/ex_cmds/verbose_spec.lua
+++ b/test/functional/ex_cmds/verbose_spec.lua
@@ -256,7 +256,7 @@ TestHL2 xxx guibg=Green
local result = exec_capture(':verbose set tw?')
local loc = get_last_set_location(40)
if loc == 'Lua (run Nvim with -V1 for more details)' then
- loc = 'anonymous :source (script id 1)'
+ loc = 'anonymous :source (script id 1) line 5'
end
eq(
string.format(
diff --git a/test/functional/legacy/assert_spec.lua b/test/functional/legacy/assert_spec.lua
index 47eea5e7d5..9863d146b1 100644
--- a/test/functional/legacy/assert_spec.lua
+++ b/test/functional/legacy/assert_spec.lua
@@ -148,10 +148,10 @@ describe('assert function:', function()
call assert_true('', 'file two')
]])
expected_errors({
- 'nvim_exec2(): equal assertion failed: Expected 1 but got 100',
- "nvim_exec2(): true assertion failed: Expected False but got 'true'",
- "nvim_exec2(): false assertion failed: Expected True but got 'false'",
- "nvim_exec2(): file two: Expected True but got ''",
+ 'nvim_exec2() line 1: equal assertion failed: Expected 1 but got 100',
+ "nvim_exec2() line 2: true assertion failed: Expected False but got 'true'",
+ "nvim_exec2() line 3: false assertion failed: Expected True but got 'false'",
+ "nvim_exec2() line 1: file two: Expected True but got ''",
})
end)
end)
diff --git a/test/functional/lua/commands_spec.lua b/test/functional/lua/commands_spec.lua
index 1fd01cfd5a..fb55611198 100644
--- a/test/functional/lua/commands_spec.lua
+++ b/test/functional/lua/commands_spec.lua
@@ -207,7 +207,8 @@ describe(':lua', function()
-- ":{range}lua" fails on invalid Lua code.
eq(
- [[:{range}lua: Vim(lua):E5107: Error loading lua [string ":{range}lua"]:0: '=' expected near '<eof>']],
+ [[:{range}lua buffer=1: Vim(lua):E5107: Error loading lua ]]
+ .. [[[string ":{range}lua buffer=1"]:0: '=' expected near '<eof>']],
pcall_err(command, '1lua')
)
diff --git a/test/functional/lua/vim_spec.lua b/test/functional/lua/vim_spec.lua
index 8e22644339..c31ce3c678 100644
--- a/test/functional/lua/vim_spec.lua
+++ b/test/functional/lua/vim_spec.lua
@@ -3956,7 +3956,7 @@ stack traceback:
it('failure modes', function()
matches(
- 'nvim_exec2%(%): Vim:E492: Not an editor command: fooooo',
+ 'nvim_exec2%(%), line 1: Vim:E492: Not an editor command: fooooo',
pcall_err(exec_lua, [[vim.api.nvim_win_call(0, function() vim.cmd 'fooooo' end)]])
)
eq(
diff --git a/test/old/testdir/test_source.vim b/test/old/testdir/test_source.vim
index 01c08b183c..10b00d3784 100644
--- a/test/old/testdir/test_source.vim
+++ b/test/old/testdir/test_source.vim
@@ -92,6 +92,12 @@ 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
@@ -108,4 +114,548 @@ func Test_nested_script()
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