xref: /vim-8.2.3635/src/testdir/vim9.vim (revision 88c89c77)
1cfe435d7SBram Moolenaar" Utility functions for testing vim9 script
2cfe435d7SBram Moolenaar
32d870f8dSBram Moolenaar" Use a different file name for each run.
42d870f8dSBram Moolenaarlet s:sequence = 1
52d870f8dSBram Moolenaar
62d870f8dSBram Moolenaar" Check that "lines" inside a ":def" function has no error.
73e06a1e2SBram Moolenaarfunc CheckDefSuccess(lines)
8090728adSBram Moolenaar  let cwd = getcwd()
9090728adSBram Moolenaar  let fname = 'XdefSuccess' .. s:sequence
102d870f8dSBram Moolenaar  let s:sequence += 1
112d870f8dSBram Moolenaar  call writefile(['def Func()'] + a:lines + ['enddef', 'defcompile'], fname)
12090728adSBram Moolenaar  try
132d870f8dSBram Moolenaar    exe 'so ' .. fname
143e06a1e2SBram Moolenaar    call Func()
15090728adSBram Moolenaar  finally
16090728adSBram Moolenaar    call chdir(cwd)
172d870f8dSBram Moolenaar    call delete(fname)
18*88c89c77SBram Moolenaar    delfunc! Func
19090728adSBram Moolenaar  endtry
203e06a1e2SBram Moolenaarendfunc
213e06a1e2SBram Moolenaar
22cfe435d7SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message.
231d634542SBram Moolenaar" If "lnum" is given check that the error is reported for this line.
243affe7a6SBram Moolenaar" Add a line before and after to make it less likely that the line number is
253affe7a6SBram Moolenaar" accidentally correct.
263affe7a6SBram Moolenaarfunc CheckDefFailure(lines, error, lnum = -3)
27090728adSBram Moolenaar  let cwd = getcwd()
28090728adSBram Moolenaar  let fname = 'XdefFailure' .. s:sequence
292d870f8dSBram Moolenaar  let s:sequence += 1
30090728adSBram Moolenaar  call writefile(['def Func()', '# comment'] + a:lines + ['#comment', 'enddef', 'defcompile'], fname)
31090728adSBram Moolenaar  try
32090728adSBram Moolenaar    call assert_fails('so ' .. fname, a:error, a:lines, a:lnum + 1)
33090728adSBram Moolenaar  finally
34090728adSBram Moolenaar    call chdir(cwd)
35090728adSBram Moolenaar    call delete(fname)
36090728adSBram Moolenaar    delfunc! Func
37090728adSBram Moolenaar  endtry
38cfe435d7SBram Moolenaarendfunc
39cfe435d7SBram Moolenaar
40015f4267SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message when executed.
411d634542SBram Moolenaar" If "lnum" is given check that the error is reported for this line.
423affe7a6SBram Moolenaar" Add a line before and after to make it less likely that the line number is
433affe7a6SBram Moolenaar" accidentally correct.
443affe7a6SBram Moolenaarfunc CheckDefExecFailure(lines, error, lnum = -3)
45090728adSBram Moolenaar  let cwd = getcwd()
46090728adSBram Moolenaar  let fname = 'XdefExecFailure' .. s:sequence
472d870f8dSBram Moolenaar  let s:sequence += 1
482d870f8dSBram Moolenaar  call writefile(['def Func()', '# comment'] + a:lines + ['#comment', 'enddef'], fname)
49090728adSBram Moolenaar  try
502d870f8dSBram Moolenaar    exe 'so ' .. fname
513affe7a6SBram Moolenaar    call assert_fails('call Func()', a:error, a:lines, a:lnum + 1)
52090728adSBram Moolenaar  finally
53090728adSBram Moolenaar    call chdir(cwd)
542d870f8dSBram Moolenaar    call delete(fname)
55090728adSBram Moolenaar    delfunc! Func
56090728adSBram Moolenaar  endtry
57015f4267SBram Moolenaarendfunc
58015f4267SBram Moolenaar
593affe7a6SBram Moolenaardef CheckScriptFailure(lines: list<string>, error: string, lnum = -3)
60090728adSBram Moolenaar  var cwd = getcwd()
61090728adSBram Moolenaar  var fname = 'XScriptFailure' .. s:sequence
622d870f8dSBram Moolenaar  s:sequence += 1
632d870f8dSBram Moolenaar  writefile(lines, fname)
64090728adSBram Moolenaar  try
652d870f8dSBram Moolenaar    assert_fails('so ' .. fname, error, lines, lnum)
66090728adSBram Moolenaar  finally
67090728adSBram Moolenaar    chdir(cwd)
682d870f8dSBram Moolenaar    delete(fname)
69090728adSBram Moolenaar  endtry
70cfe435d7SBram Moolenaarenddef
71cfe435d7SBram Moolenaar
72c5f59fabSBram Moolenaardef CheckScriptFailureList(lines: list<string>, errors: list<string>, lnum = -3)
73c5f59fabSBram Moolenaar  var cwd = getcwd()
74c5f59fabSBram Moolenaar  var fname = 'XScriptFailure' .. s:sequence
75c5f59fabSBram Moolenaar  s:sequence += 1
76c5f59fabSBram Moolenaar  writefile(lines, fname)
77c5f59fabSBram Moolenaar  try
78c5f59fabSBram Moolenaar    assert_fails('so ' .. fname, errors, lines, lnum)
79c5f59fabSBram Moolenaar  finally
80c5f59fabSBram Moolenaar    chdir(cwd)
81c5f59fabSBram Moolenaar    delete(fname)
82c5f59fabSBram Moolenaar  endtry
83c5f59fabSBram Moolenaarenddef
84c5f59fabSBram Moolenaar
85cfe435d7SBram Moolenaardef CheckScriptSuccess(lines: list<string>)
86090728adSBram Moolenaar  var cwd = getcwd()
87090728adSBram Moolenaar  var fname = 'XScriptSuccess' .. s:sequence
882d870f8dSBram Moolenaar  s:sequence += 1
892d870f8dSBram Moolenaar  writefile(lines, fname)
90090728adSBram Moolenaar  try
912d870f8dSBram Moolenaar    exe 'so ' .. fname
92090728adSBram Moolenaar  finally
93090728adSBram Moolenaar    chdir(cwd)
942d870f8dSBram Moolenaar    delete(fname)
95090728adSBram Moolenaar  endtry
96cfe435d7SBram Moolenaarenddef
977cb6fc29SBram Moolenaar
982e800955SBram Moolenaardef CheckDefAndScriptSuccess(lines: list<string>)
992e800955SBram Moolenaar  CheckDefSuccess(lines)
1002e800955SBram Moolenaar  CheckScriptSuccess(['vim9script'] + lines)
1012e800955SBram Moolenaarenddef
1022e800955SBram Moolenaar
1032d870f8dSBram Moolenaar" Check that a command fails with the same error when used in a :def function
1042d870f8dSBram Moolenaar" and when used in Vim9 script.
105ba7c0d7bSBram Moolenaardef CheckDefAndScriptFailure(lines: list<string>, error: string, lnum = -3)
1067cb6fc29SBram Moolenaar  CheckDefFailure(lines, error, lnum)
1077cb6fc29SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, error, lnum + 1)
1087cb6fc29SBram Moolenaarenddef
10913106605SBram Moolenaar
1103e9c0b96SBram Moolenaar" As CheckDefAndScriptFailure() but with two different expected errors.
11190193e61SBram Moolenaardef CheckDefAndScriptFailure2(
11290193e61SBram Moolenaar  	lines: list<string>,
11390193e61SBram Moolenaar	errorDef: string,
11490193e61SBram Moolenaar	errorScript: string,
11590193e61SBram Moolenaar	lnum = -3)
11690193e61SBram Moolenaar  CheckDefFailure(lines, errorDef, lnum)
11790193e61SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, errorScript, lnum + 1)
11890193e61SBram Moolenaarenddef
11990193e61SBram Moolenaar
1202d870f8dSBram Moolenaar" Check that a command fails with the same error  when executed in a :def
1212d870f8dSBram Moolenaar" function and when used in Vim9 script.
12213106605SBram Moolenaardef CheckDefExecAndScriptFailure(lines: list<string>, error: string, lnum = -3)
12313106605SBram Moolenaar  CheckDefExecFailure(lines, error, lnum)
12413106605SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, error, lnum + 1)
12513106605SBram Moolenaarenddef
12690193e61SBram Moolenaar
12790193e61SBram Moolenaar" As CheckDefExecAndScriptFailure() but with two different expected errors.
12890193e61SBram Moolenaardef CheckDefExecAndScriptFailure2(
12990193e61SBram Moolenaar  	lines: list<string>,
13090193e61SBram Moolenaar	errorDef: string,
13190193e61SBram Moolenaar	errorScript: string,
13290193e61SBram Moolenaar	lnum = -3)
13390193e61SBram Moolenaar  CheckDefExecFailure(lines, errorDef, lnum)
13490193e61SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, errorScript, lnum + 1)
13590193e61SBram Moolenaarenddef
13668452177SBram Moolenaar
13768452177SBram Moolenaar
13868452177SBram Moolenaar" Check that "lines" inside a legacy function has no error.
13968452177SBram Moolenaarfunc CheckLegacySuccess(lines)
14068452177SBram Moolenaar  let cwd = getcwd()
14168452177SBram Moolenaar  let fname = 'XlegacySuccess' .. s:sequence
14268452177SBram Moolenaar  let s:sequence += 1
14368452177SBram Moolenaar  call writefile(['func Func()'] + a:lines + ['endfunc'], fname)
14468452177SBram Moolenaar  try
14568452177SBram Moolenaar    exe 'so ' .. fname
14668452177SBram Moolenaar    call Func()
14768452177SBram Moolenaar  finally
1480e3ff191SBram Moolenaar    delfunc! Func
1490e3ff191SBram Moolenaar    call chdir(cwd)
1500e3ff191SBram Moolenaar    call delete(fname)
1510e3ff191SBram Moolenaar  endtry
1520e3ff191SBram Moolenaarendfunc
1530e3ff191SBram Moolenaar
1540e3ff191SBram Moolenaar" Check that "lines" inside a legacy function results in the expected error
1550e3ff191SBram Moolenaarfunc CheckLegacyFailure(lines, error)
1560e3ff191SBram Moolenaar  let cwd = getcwd()
1570e3ff191SBram Moolenaar  let fname = 'XlegacyFails' .. s:sequence
1580e3ff191SBram Moolenaar  let s:sequence += 1
1590e3ff191SBram Moolenaar  call writefile(['func Func()'] + a:lines + ['endfunc', 'call Func()'], fname)
1600e3ff191SBram Moolenaar  try
1610e3ff191SBram Moolenaar    call assert_fails('so ' .. fname, a:error)
1620e3ff191SBram Moolenaar  finally
1630e3ff191SBram Moolenaar    delfunc! Func
16468452177SBram Moolenaar    call chdir(cwd)
16568452177SBram Moolenaar    call delete(fname)
16668452177SBram Moolenaar  endtry
16768452177SBram Moolenaarendfunc
16868452177SBram Moolenaar
1693e9c0b96SBram Moolenaar" Execute "lines" in a legacy function, translated as in
1703e9c0b96SBram Moolenaar" CheckLegacyAndVim9Success()
1713e9c0b96SBram Moolenaardef CheckTransLegacySuccess(lines: list<string>)
17268452177SBram Moolenaar  var legacylines = lines->mapnew((_, v) =>
17368452177SBram Moolenaar  				v->substitute('\<VAR\>', 'let', 'g')
17468452177SBram Moolenaar		           	 ->substitute('\<LET\>', 'let', 'g')
175ef982575SBram Moolenaar		           	 ->substitute('\<LSTART\>', '{', 'g')
176ef982575SBram Moolenaar		           	 ->substitute('\<LMIDDLE\>', '->', 'g')
177ef982575SBram Moolenaar				 ->substitute('\<LEND\>', '}', 'g')
17868452177SBram Moolenaar		           	 ->substitute('#"', ' "', 'g'))
17968452177SBram Moolenaar  CheckLegacySuccess(legacylines)
1803e9c0b96SBram Moolenaarenddef
18168452177SBram Moolenaar
1823e9c0b96SBram Moolenaar" Execute "lines" in a :def function, translated as in
1833e9c0b96SBram Moolenaar" CheckLegacyAndVim9Success()
1843e9c0b96SBram Moolenaardef CheckTransDefSuccess(lines: list<string>)
18568452177SBram Moolenaar  var vim9lines = lines->mapnew((_, v) =>
18668452177SBram Moolenaar  				v->substitute('\<VAR\>', 'var', 'g')
187ef982575SBram Moolenaar		           	 ->substitute('\<LET ', '', 'g')
188ef982575SBram Moolenaar		           	 ->substitute('\<LSTART\>', '(', 'g')
189ef982575SBram Moolenaar		           	 ->substitute('\<LMIDDLE\>', ') =>', 'g')
190ef982575SBram Moolenaar				 ->substitute(' *\<LEND\> *', '', 'g'))
19168452177SBram Moolenaar  CheckDefSuccess(vim9lines)
1923e9c0b96SBram Moolenaarenddef
1933e9c0b96SBram Moolenaar
1943e9c0b96SBram Moolenaar" Execute "lines" in a Vim9 script, translated as in
1953e9c0b96SBram Moolenaar" CheckLegacyAndVim9Success()
1963e9c0b96SBram Moolenaardef CheckTransVim9Success(lines: list<string>)
1973e9c0b96SBram Moolenaar  var vim9lines = lines->mapnew((_, v) =>
1983e9c0b96SBram Moolenaar  				v->substitute('\<VAR\>', 'var', 'g')
199ef982575SBram Moolenaar		           	 ->substitute('\<LET ', '', 'g')
200ef982575SBram Moolenaar		           	 ->substitute('\<LSTART\>', '(', 'g')
201ef982575SBram Moolenaar		           	 ->substitute('\<LMIDDLE\>', ') =>', 'g')
202ef982575SBram Moolenaar				 ->substitute(' *\<LEND\> *', '', 'g'))
20368452177SBram Moolenaar  CheckScriptSuccess(['vim9script'] + vim9lines)
20468452177SBram Moolenaarenddef
2050e3ff191SBram Moolenaar
2060e3ff191SBram Moolenaar" Execute "lines" in a legacy function, :def function and Vim9 script.
2070e3ff191SBram Moolenaar" Use 'VAR' for a declaration.
2080e3ff191SBram Moolenaar" Use 'LET' for an assignment
2090e3ff191SBram Moolenaar" Use ' #"' for a comment
210ef982575SBram Moolenaar" Use LSTART arg LMIDDLE expr LEND for lambda
2113e9c0b96SBram Moolenaardef CheckLegacyAndVim9Success(lines: list<string>)
2123e9c0b96SBram Moolenaar  CheckTransLegacySuccess(lines)
2133e9c0b96SBram Moolenaar  CheckTransDefSuccess(lines)
2143e9c0b96SBram Moolenaar  CheckTransVim9Success(lines)
2153e9c0b96SBram Moolenaarenddef
2163e9c0b96SBram Moolenaar
2173e9c0b96SBram Moolenaar" Execute "lines" in a legacy function, :def function and Vim9 script.
2183e9c0b96SBram Moolenaar" Use 'VAR' for a declaration.
2193e9c0b96SBram Moolenaar" Use 'LET' for an assignment
2203e9c0b96SBram Moolenaar" Use ' #"' for a comment
2210e3ff191SBram Moolenaardef CheckLegacyAndVim9Failure(lines: list<string>, error: any)
2220e3ff191SBram Moolenaar  var legacyError: string
2230e3ff191SBram Moolenaar  var defError: string
2240e3ff191SBram Moolenaar  var scriptError: string
2250e3ff191SBram Moolenaar
2260e3ff191SBram Moolenaar  if type(error) == type('string')
2270e3ff191SBram Moolenaar    legacyError = error
2280e3ff191SBram Moolenaar    defError = error
2290e3ff191SBram Moolenaar    scriptError = error
2300e3ff191SBram Moolenaar  else
2310e3ff191SBram Moolenaar    legacyError = error[0]
2320e3ff191SBram Moolenaar    defError = error[1]
2330e3ff191SBram Moolenaar    scriptError = error[2]
2340e3ff191SBram Moolenaar  endif
2350e3ff191SBram Moolenaar
2360e3ff191SBram Moolenaar  var legacylines = lines->mapnew((_, v) =>
2370e3ff191SBram Moolenaar  				v->substitute('\<VAR\>', 'let', 'g')
2380e3ff191SBram Moolenaar		           	 ->substitute('\<LET\>', 'let', 'g')
2390e3ff191SBram Moolenaar		           	 ->substitute('#"', ' "', 'g'))
2400e3ff191SBram Moolenaar  CheckLegacyFailure(legacylines, legacyError)
2410e3ff191SBram Moolenaar
2420e3ff191SBram Moolenaar  var vim9lines = lines->mapnew((_, v) =>
2430e3ff191SBram Moolenaar  				v->substitute('\<VAR\>', 'var', 'g')
2440e3ff191SBram Moolenaar		           	 ->substitute('\<LET ', '', 'g'))
2450e3ff191SBram Moolenaar  CheckDefExecFailure(vim9lines, defError)
2460e3ff191SBram Moolenaar  CheckScriptFailure(['vim9script'] + vim9lines, scriptError)
2470e3ff191SBram Moolenaarenddef
248