blob: cb6e385a7e15f5c084dcb4907d832808c1c82140 [file] [log] [blame]
Bram Moolenaarcfe435d2020-04-25 20:02:55 +02001" Utility functions for testing vim9 script
2
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003" Use a different file name for each run.
4let s:sequence = 1
5
6" Check that "lines" inside a ":def" function has no error.
Bram Moolenaar3e06a1e2020-08-10 21:57:54 +02007func CheckDefSuccess(lines)
Bram Moolenaar090728a2020-12-20 15:43:31 +01008 let cwd = getcwd()
9 let fname = 'XdefSuccess' .. s:sequence
Bram Moolenaar2d870f82020-12-05 13:41:01 +010010 let s:sequence += 1
11 call writefile(['def Func()'] + a:lines + ['enddef', 'defcompile'], fname)
Bram Moolenaar090728a2020-12-20 15:43:31 +010012 try
13 exe 'so ' .. fname
14 call Func()
Bram Moolenaar090728a2020-12-20 15:43:31 +010015 finally
16 call chdir(cwd)
17 call delete(fname)
Bram Moolenaar88c89c72021-08-14 14:01:05 +020018 delfunc! Func
Bram Moolenaar090728a2020-12-20 15:43:31 +010019 endtry
Bram Moolenaar3e06a1e2020-08-10 21:57:54 +020020endfunc
21
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020022" Check that "lines" inside ":def" results in an "error" message.
Bram Moolenaar1d634542020-08-18 13:41:50 +020023" If "lnum" is given check that the error is reported for this line.
Bram Moolenaar3affe7a2020-08-18 20:34:13 +020024" Add a line before and after to make it less likely that the line number is
25" accidentally correct.
26func CheckDefFailure(lines, error, lnum = -3)
Bram Moolenaar090728a2020-12-20 15:43:31 +010027 let cwd = getcwd()
28 let fname = 'XdefFailure' .. s:sequence
Bram Moolenaar2d870f82020-12-05 13:41:01 +010029 let s:sequence += 1
Bram Moolenaar090728a2020-12-20 15:43:31 +010030 call writefile(['def Func()', '# comment'] + a:lines + ['#comment', 'enddef', 'defcompile'], fname)
31 try
32 call assert_fails('so ' .. fname, a:error, a:lines, a:lnum + 1)
33 finally
34 call chdir(cwd)
35 call delete(fname)
36 delfunc! Func
37 endtry
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020038endfunc
39
Bram Moolenaar015f4262020-05-05 21:25:22 +020040" Check that "lines" inside ":def" results in an "error" message when executed.
Bram Moolenaar1d634542020-08-18 13:41:50 +020041" If "lnum" is given check that the error is reported for this line.
Bram Moolenaar3affe7a2020-08-18 20:34:13 +020042" Add a line before and after to make it less likely that the line number is
43" accidentally correct.
44func CheckDefExecFailure(lines, error, lnum = -3)
Bram Moolenaar090728a2020-12-20 15:43:31 +010045 let cwd = getcwd()
46 let fname = 'XdefExecFailure' .. s:sequence
Bram Moolenaar2d870f82020-12-05 13:41:01 +010047 let s:sequence += 1
48 call writefile(['def Func()', '# comment'] + a:lines + ['#comment', 'enddef'], fname)
Bram Moolenaar090728a2020-12-20 15:43:31 +010049 try
50 exe 'so ' .. fname
51 call assert_fails('call Func()', a:error, a:lines, a:lnum + 1)
52 finally
53 call chdir(cwd)
54 call delete(fname)
55 delfunc! Func
56 endtry
Bram Moolenaar015f4262020-05-05 21:25:22 +020057endfunc
58
Bram Moolenaar3affe7a2020-08-18 20:34:13 +020059def CheckScriptFailure(lines: list<string>, error: string, lnum = -3)
Bram Moolenaar090728a2020-12-20 15:43:31 +010060 var cwd = getcwd()
61 var fname = 'XScriptFailure' .. s:sequence
Bram Moolenaar2d870f82020-12-05 13:41:01 +010062 s:sequence += 1
63 writefile(lines, fname)
Bram Moolenaar090728a2020-12-20 15:43:31 +010064 try
65 assert_fails('so ' .. fname, error, lines, lnum)
66 finally
67 chdir(cwd)
68 delete(fname)
69 endtry
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020070enddef
71
Bram Moolenaarc5f59fa2021-01-21 12:34:14 +010072def CheckScriptFailureList(lines: list<string>, errors: list<string>, lnum = -3)
73 var cwd = getcwd()
74 var fname = 'XScriptFailure' .. s:sequence
75 s:sequence += 1
76 writefile(lines, fname)
77 try
78 assert_fails('so ' .. fname, errors, lines, lnum)
79 finally
80 chdir(cwd)
81 delete(fname)
82 endtry
83enddef
84
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020085def CheckScriptSuccess(lines: list<string>)
Bram Moolenaar090728a2020-12-20 15:43:31 +010086 var cwd = getcwd()
87 var fname = 'XScriptSuccess' .. s:sequence
Bram Moolenaar2d870f82020-12-05 13:41:01 +010088 s:sequence += 1
89 writefile(lines, fname)
Bram Moolenaar090728a2020-12-20 15:43:31 +010090 try
91 exe 'so ' .. fname
92 finally
93 chdir(cwd)
94 delete(fname)
95 endtry
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020096enddef
Bram Moolenaar7cb6fc22020-08-21 22:36:47 +020097
Bram Moolenaar2e800952020-08-23 19:34:48 +020098def CheckDefAndScriptSuccess(lines: list<string>)
99 CheckDefSuccess(lines)
100 CheckScriptSuccess(['vim9script'] + lines)
101enddef
102
Bram Moolenaar86b3ab42021-12-19 18:33:23 +0000103" Check that a command fails when used in a :def function and when used in
104" Vim9 script.
105" When "error" is a string, both with the same error.
106" When "error" is a list, the :def function fails with "error[0]" , the script
107" fails with "error[1]".
108def CheckDefAndScriptFailure(lines: list<string>, error: any, lnum = -3)
109 var errorDef: string
110 var errorScript: string
111 if type(error) == v:t_string
112 errorDef = error
113 errorScript = error
114 elseif type(error) == v:t_list && len(error) == 2
115 errorDef = error[0]
116 errorScript = error[1]
117 else
118 echoerr 'error argument must be a string or a list with two items'
119 return
120 endif
Bram Moolenaar90193e62021-04-04 20:49:50 +0200121 CheckDefFailure(lines, errorDef, lnum)
122 CheckScriptFailure(['vim9script'] + lines, errorScript, lnum + 1)
123enddef
124
Bram Moolenaar86b3ab42021-12-19 18:33:23 +0000125" Check that a command fails when executed in a :def function and when used in
126" Vim9 script.
127" When "error" is a string, both with the same error.
128" When "error" is a list, the :def function fails with "error[0]" , the script
129" fails with "error[1]".
130def CheckDefExecAndScriptFailure(lines: list<string>, error: any, lnum = -3)
131 var errorDef: string
132 var errorScript: string
133 if type(error) == v:t_string
134 errorDef = error
135 errorScript = error
136 elseif type(error) == v:t_list && len(error) == 2
137 errorDef = error[0]
138 errorScript = error[1]
139 else
140 echoerr 'error argument must be a string or a list with two items'
141 return
142 endif
Bram Moolenaar90193e62021-04-04 20:49:50 +0200143 CheckDefExecFailure(lines, errorDef, lnum)
144 CheckScriptFailure(['vim9script'] + lines, errorScript, lnum + 1)
145enddef
Bram Moolenaar68452172021-04-12 21:21:02 +0200146
147
148" Check that "lines" inside a legacy function has no error.
149func CheckLegacySuccess(lines)
150 let cwd = getcwd()
151 let fname = 'XlegacySuccess' .. s:sequence
152 let s:sequence += 1
153 call writefile(['func Func()'] + a:lines + ['endfunc'], fname)
154 try
155 exe 'so ' .. fname
156 call Func()
Bram Moolenaar68452172021-04-12 21:21:02 +0200157 finally
Bram Moolenaar0e3ff192021-04-14 20:35:23 +0200158 delfunc! Func
159 call chdir(cwd)
160 call delete(fname)
161 endtry
162endfunc
163
164" Check that "lines" inside a legacy function results in the expected error
165func CheckLegacyFailure(lines, error)
166 let cwd = getcwd()
167 let fname = 'XlegacyFails' .. s:sequence
168 let s:sequence += 1
169 call writefile(['func Func()'] + a:lines + ['endfunc', 'call Func()'], fname)
170 try
171 call assert_fails('so ' .. fname, a:error)
172 finally
173 delfunc! Func
Bram Moolenaar68452172021-04-12 21:21:02 +0200174 call chdir(cwd)
175 call delete(fname)
176 endtry
177endfunc
178
Bram Moolenaar3e9c0b92021-08-12 10:39:10 +0200179" Execute "lines" in a legacy function, translated as in
180" CheckLegacyAndVim9Success()
181def CheckTransLegacySuccess(lines: list<string>)
Bram Moolenaar68452172021-04-12 21:21:02 +0200182 var legacylines = lines->mapnew((_, v) =>
183 v->substitute('\<VAR\>', 'let', 'g')
184 ->substitute('\<LET\>', 'let', 'g')
Bram Moolenaaref982572021-08-12 19:27:57 +0200185 ->substitute('\<LSTART\>', '{', 'g')
186 ->substitute('\<LMIDDLE\>', '->', 'g')
187 ->substitute('\<LEND\>', '}', 'g')
Bram Moolenaar68452172021-04-12 21:21:02 +0200188 ->substitute('#"', ' "', 'g'))
189 CheckLegacySuccess(legacylines)
Bram Moolenaar3e9c0b92021-08-12 10:39:10 +0200190enddef
Bram Moolenaar68452172021-04-12 21:21:02 +0200191
Bram Moolenaar3e9c0b92021-08-12 10:39:10 +0200192" Execute "lines" in a :def function, translated as in
193" CheckLegacyAndVim9Success()
194def CheckTransDefSuccess(lines: list<string>)
Bram Moolenaar68452172021-04-12 21:21:02 +0200195 var vim9lines = lines->mapnew((_, v) =>
196 v->substitute('\<VAR\>', 'var', 'g')
Bram Moolenaaref982572021-08-12 19:27:57 +0200197 ->substitute('\<LET ', '', 'g')
198 ->substitute('\<LSTART\>', '(', 'g')
199 ->substitute('\<LMIDDLE\>', ') =>', 'g')
200 ->substitute(' *\<LEND\> *', '', 'g'))
Bram Moolenaar68452172021-04-12 21:21:02 +0200201 CheckDefSuccess(vim9lines)
Bram Moolenaar3e9c0b92021-08-12 10:39:10 +0200202enddef
203
204" Execute "lines" in a Vim9 script, translated as in
205" CheckLegacyAndVim9Success()
206def CheckTransVim9Success(lines: list<string>)
207 var vim9lines = lines->mapnew((_, v) =>
208 v->substitute('\<VAR\>', 'var', 'g')
Bram Moolenaaref982572021-08-12 19:27:57 +0200209 ->substitute('\<LET ', '', 'g')
210 ->substitute('\<LSTART\>', '(', 'g')
211 ->substitute('\<LMIDDLE\>', ') =>', 'g')
212 ->substitute(' *\<LEND\> *', '', 'g'))
Bram Moolenaar68452172021-04-12 21:21:02 +0200213 CheckScriptSuccess(['vim9script'] + vim9lines)
214enddef
Bram Moolenaar0e3ff192021-04-14 20:35:23 +0200215
216" Execute "lines" in a legacy function, :def function and Vim9 script.
217" Use 'VAR' for a declaration.
218" Use 'LET' for an assignment
219" Use ' #"' for a comment
Bram Moolenaaref982572021-08-12 19:27:57 +0200220" Use LSTART arg LMIDDLE expr LEND for lambda
Bram Moolenaar3e9c0b92021-08-12 10:39:10 +0200221def CheckLegacyAndVim9Success(lines: list<string>)
222 CheckTransLegacySuccess(lines)
223 CheckTransDefSuccess(lines)
224 CheckTransVim9Success(lines)
225enddef
226
227" Execute "lines" in a legacy function, :def function and Vim9 script.
228" Use 'VAR' for a declaration.
229" Use 'LET' for an assignment
230" Use ' #"' for a comment
Bram Moolenaar0e3ff192021-04-14 20:35:23 +0200231def CheckLegacyAndVim9Failure(lines: list<string>, error: any)
232 var legacyError: string
233 var defError: string
234 var scriptError: string
235
236 if type(error) == type('string')
237 legacyError = error
238 defError = error
239 scriptError = error
240 else
241 legacyError = error[0]
242 defError = error[1]
243 scriptError = error[2]
244 endif
245
246 var legacylines = lines->mapnew((_, v) =>
247 v->substitute('\<VAR\>', 'let', 'g')
248 ->substitute('\<LET\>', 'let', 'g')
249 ->substitute('#"', ' "', 'g'))
250 CheckLegacyFailure(legacylines, legacyError)
251
252 var vim9lines = lines->mapnew((_, v) =>
253 v->substitute('\<VAR\>', 'var', 'g')
254 ->substitute('\<LET ', '', 'g'))
255 CheckDefExecFailure(vim9lines, defError)
256 CheckScriptFailure(['vim9script'] + vim9lines, scriptError)
257enddef