blob: df5fc7fe609f22425e6b1b8b7778c0796bcdedb0 [file] [log] [blame]
Bram Moolenaar971caf52020-09-21 22:21:42 +02001" Test Vim9 assignments
2
3source check.vim
Bram Moolenaar62aec932022-01-29 21:45:34 +00004import './vim9.vim' as v9
Bram Moolenaarc653e4a2022-01-05 10:16:30 +00005source term_util.vim
Bram Moolenaar971caf52020-09-21 22:21:42 +02006
7let s:appendToMe = 'xxx'
8let s:addToMe = 111
Bram Moolenaara749a422022-02-12 19:52:25 +00009let s:newVar = ''
Bram Moolenaar971caf52020-09-21 22:21:42 +020010let g:existing = 'yes'
11let g:inc_counter = 1
12let $SOME_ENV_VAR = 'some'
13let g:alist = [7]
Bram Moolenaar5b5ae292021-02-20 17:04:02 +010014let g:adict = #{a: 1}
Bram Moolenaar971caf52020-09-21 22:21:42 +020015let g:astring = 'text'
16
17def Test_assignment_bool()
Bram Moolenaar30fd8202020-09-26 15:09:30 +020018 var bool1: bool = true
Bram Moolenaar971caf52020-09-21 22:21:42 +020019 assert_equal(v:true, bool1)
Bram Moolenaar30fd8202020-09-26 15:09:30 +020020 var bool2: bool = false
Bram Moolenaar971caf52020-09-21 22:21:42 +020021 assert_equal(v:false, bool2)
22
Bram Moolenaar30fd8202020-09-26 15:09:30 +020023 var bool3: bool = 0
Bram Moolenaar971caf52020-09-21 22:21:42 +020024 assert_equal(false, bool3)
Bram Moolenaar30fd8202020-09-26 15:09:30 +020025 var bool4: bool = 1
Bram Moolenaar971caf52020-09-21 22:21:42 +020026 assert_equal(true, bool4)
27
Bram Moolenaar2bb26582020-10-03 22:52:39 +020028 var bool5: bool = 1 && true
Bram Moolenaar971caf52020-09-21 22:21:42 +020029 assert_equal(true, bool5)
Bram Moolenaar2bb26582020-10-03 22:52:39 +020030 var bool6: bool = 0 && 1
Bram Moolenaar971caf52020-09-21 22:21:42 +020031 assert_equal(false, bool6)
Bram Moolenaar2bb26582020-10-03 22:52:39 +020032 var bool7: bool = 0 || 1 && true
Bram Moolenaar971caf52020-09-21 22:21:42 +020033 assert_equal(true, bool7)
34
Bram Moolenaar30fd8202020-09-26 15:09:30 +020035 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +020036 vim9script
37 def GetFlag(): bool
Bram Moolenaar30fd8202020-09-26 15:09:30 +020038 var flag: bool = 1
Bram Moolenaar971caf52020-09-21 22:21:42 +020039 return flag
40 enddef
Bram Moolenaar30fd8202020-09-26 15:09:30 +020041 var flag: bool = GetFlag()
Bram Moolenaar971caf52020-09-21 22:21:42 +020042 assert_equal(true, flag)
43 flag = 0
44 assert_equal(false, flag)
45 flag = 1
46 assert_equal(true, flag)
Bram Moolenaar2bb26582020-10-03 22:52:39 +020047 flag = 1 || true
Bram Moolenaar971caf52020-09-21 22:21:42 +020048 assert_equal(true, flag)
Bram Moolenaar2bb26582020-10-03 22:52:39 +020049 flag = 1 && false
Bram Moolenaar971caf52020-09-21 22:21:42 +020050 assert_equal(false, flag)
Bram Moolenaardd1f4262020-12-31 17:41:01 +010051
52 var cp: bool = &cp
53 var fen: bool = &l:fen
Bram Moolenaar971caf52020-09-21 22:21:42 +020054 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000055 v9.CheckScriptSuccess(lines)
56 v9.CheckDefAndScriptFailure(['var x: bool = 2'], 'E1012:')
57 v9.CheckDefAndScriptFailure(['var x: bool = -1'], 'E1012:')
58 v9.CheckDefAndScriptFailure(['var x: bool = [1]'], 'E1012:')
59 v9.CheckDefAndScriptFailure(['var x: bool = {}'], 'E1012:')
60 v9.CheckDefAndScriptFailure(['var x: bool = "x"'], 'E1012:')
Bram Moolenaar9a562c12021-01-23 13:39:14 +010061
Bram Moolenaar62aec932022-01-29 21:45:34 +000062 v9.CheckDefAndScriptFailure(['var x: bool = "x"', '', 'eval 0'], 'E1012:', 1)
Bram Moolenaar971caf52020-09-21 22:21:42 +020063enddef
64
65def Test_syntax()
Bram Moolenaar98309382020-09-27 21:58:45 +020066 var name = 234
Bram Moolenaar30fd8202020-09-26 15:09:30 +020067 var other: list<string> = ['asdf']
Bram Moolenaar971caf52020-09-21 22:21:42 +020068enddef
69
70def Test_assignment()
Bram Moolenaar62aec932022-01-29 21:45:34 +000071 v9.CheckDefFailure(['var x:string'], 'E1069:')
72 v9.CheckDefFailure(['var x:string = "x"'], 'E1069:')
73 v9.CheckDefFailure(['var a:string = "x"'], 'E1069:')
74 v9.CheckDefFailure(['var lambda = () => "lambda"'], 'E704:')
75 v9.CheckScriptFailure(['var x = "x"'], 'E1124:')
Bram Moolenaar971caf52020-09-21 22:21:42 +020076
Bram Moolenaar3f327882021-03-17 20:56:38 +010077 # lower case name is OK for a list
78 var lambdaLines =<< trim END
Bram Moolenaar848fadd2022-01-30 15:28:30 +000079 var lambdaList: list<func> = [g:Test_syntax]
Bram Moolenaar3f327882021-03-17 20:56:38 +010080 lambdaList[0] = () => "lambda"
81 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000082 v9.CheckDefAndScriptSuccess(lambdaLines)
Bram Moolenaar3f327882021-03-17 20:56:38 +010083
Bram Moolenaar30fd8202020-09-26 15:09:30 +020084 var nr: number = 1234
Bram Moolenaar62aec932022-01-29 21:45:34 +000085 v9.CheckDefFailure(['var nr: number = "asdf"'], 'E1012:')
Bram Moolenaar971caf52020-09-21 22:21:42 +020086
Bram Moolenaar30fd8202020-09-26 15:09:30 +020087 var a: number = 6 #comment
Bram Moolenaar971caf52020-09-21 22:21:42 +020088 assert_equal(6, a)
89
90 if has('channel')
Bram Moolenaar30fd8202020-09-26 15:09:30 +020091 var chan1: channel
Bram Moolenaar218450a2020-10-17 18:51:52 +020092 assert_equal('fail', ch_status(chan1))
93
Bram Moolenaar30fd8202020-09-26 15:09:30 +020094 var job1: job
Bram Moolenaar218450a2020-10-17 18:51:52 +020095 assert_equal('fail', job_status(job1))
96
Bram Moolenaarfc8aa6d2020-10-12 20:31:26 +020097 # calling job_start() is in test_vim9_fails.vim, it causes leak reports
Bram Moolenaar971caf52020-09-21 22:21:42 +020098 endif
99 if has('float')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200100 var float1: float = 3.4
Bram Moolenaar971caf52020-09-21 22:21:42 +0200101 endif
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200102 var Funky1: func
103 var Funky2: func = function('len')
104 var Party2: func = funcref('g:Test_syntax')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200105
106 g:newvar = 'new' #comment
107 assert_equal('new', g:newvar)
108
109 assert_equal('yes', g:existing)
110 g:existing = 'no'
111 assert_equal('no', g:existing)
112
113 v:char = 'abc'
114 assert_equal('abc', v:char)
115
116 $ENVVAR = 'foobar'
117 assert_equal('foobar', $ENVVAR)
118 $ENVVAR = ''
119
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200120 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200121 vim9script
122 $ENVVAR = 'barfoo'
123 assert_equal('barfoo', $ENVVAR)
124 $ENVVAR = ''
125 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000126 v9.CheckScriptSuccess(lines)
Bram Moolenaar971caf52020-09-21 22:21:42 +0200127
Bram Moolenaara749a422022-02-12 19:52:25 +0000128 appendToMe ..= 'yyy'
129 assert_equal('xxxyyy', appendToMe)
130 addToMe += 222
131 assert_equal(333, addToMe)
132 newVar = 'new'
133 assert_equal('new', newVar)
Bram Moolenaar971caf52020-09-21 22:21:42 +0200134
135 set ts=7
Bram Moolenaardd1f4262020-12-31 17:41:01 +0100136 var ts: number = &ts
137 assert_equal(7, ts)
Bram Moolenaar971caf52020-09-21 22:21:42 +0200138 &ts += 1
139 assert_equal(8, &ts)
140 &ts -= 3
141 assert_equal(5, &ts)
142 &ts *= 2
143 assert_equal(10, &ts)
144 &ts /= 3
145 assert_equal(3, &ts)
146 set ts=10
147 &ts %= 4
148 assert_equal(2, &ts)
149
150 if has('float')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200151 var f100: float = 100.0
Bram Moolenaar971caf52020-09-21 22:21:42 +0200152 f100 /= 5
153 assert_equal(20.0, f100)
154
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200155 var f200: float = 200.0
Bram Moolenaar971caf52020-09-21 22:21:42 +0200156 f200 /= 5.0
157 assert_equal(40.0, f200)
158
Bram Moolenaar62aec932022-01-29 21:45:34 +0000159 v9.CheckDefFailure(['var nr: number = 200', 'nr /= 5.0'], 'E1012:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200160 endif
161
162 lines =<< trim END
163 &ts = 6
164 &ts += 3
165 assert_equal(9, &ts)
166
167 &l:ts = 6
168 assert_equal(6, &ts)
169 &l:ts += 2
170 assert_equal(8, &ts)
171
172 &g:ts = 6
173 assert_equal(6, &g:ts)
174 &g:ts += 2
175 assert_equal(8, &g:ts)
Bram Moolenaar0ea04402021-01-04 13:37:54 +0100176
177 &number = true
178 assert_equal(true, &number)
179 &number = 0
180 assert_equal(false, &number)
181 &number = 1
182 assert_equal(true, &number)
183 &number = false
184 assert_equal(false, &number)
Bram Moolenaar971caf52020-09-21 22:21:42 +0200185 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000186 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar971caf52020-09-21 22:21:42 +0200187
Bram Moolenaar62aec932022-01-29 21:45:34 +0000188 v9.CheckDefFailure(['&notex += 3'], 'E113:')
189 v9.CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
190 v9.CheckDefFailure(['&ts = [7]'], 'E1012:')
191 v9.CheckDefExecFailure(['&ts = g:alist'], 'E1012: Type mismatch; expected number but got list<number>')
192 v9.CheckDefFailure(['&ts = "xx"'], 'E1012:')
193 v9.CheckDefExecFailure(['&ts = g:astring'], 'E1012: Type mismatch; expected number but got string')
194 v9.CheckDefFailure(['&path += 3'], 'E1012:')
195 v9.CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200196 # test freeing ISN_STOREOPT
Bram Moolenaar62aec932022-01-29 21:45:34 +0000197 v9.CheckDefFailure(['&ts = 3', 'var asdf'], 'E1022:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200198 &ts = 8
199
200 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200201 var save_TI = &t_TI
Bram Moolenaar971caf52020-09-21 22:21:42 +0200202 &t_TI = ''
203 assert_equal('', &t_TI)
204 &t_TI = 'xxx'
205 assert_equal('xxx', &t_TI)
206 &t_TI = save_TI
207 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000208 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar971caf52020-09-21 22:21:42 +0200209
Bram Moolenaar62aec932022-01-29 21:45:34 +0000210 v9.CheckDefFailure(['&t_TI = 123'], 'E1012:')
211 v9.CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200212
Bram Moolenaar62aec932022-01-29 21:45:34 +0000213 v9.CheckDefFailure(['var s:var = 123'], 'E1101:')
214 v9.CheckDefFailure(['var s:var: number'], 'E1101:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200215
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100216 v9.CheckDefAndScriptFailure(['var $VAR: number'], ['E1016:', 'E475:'])
217
Bram Moolenaar971caf52020-09-21 22:21:42 +0200218 lines =<< trim END
219 vim9script
220 def SomeFunc()
221 s:var = 123
222 enddef
223 defcompile
224 END
Bram Moolenaarafa048f2022-02-22 20:43:36 +0000225 v9.CheckScriptFailure(lines, 'E1268:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200226
227 g:inc_counter += 1
228 assert_equal(2, g:inc_counter)
229
Bram Moolenaar7bf9a072021-08-02 21:55:15 +0200230 if has('float')
231 var f: float
232 f += 1
233 assert_equal(1.0, f)
234 endif
235
Bram Moolenaar971caf52020-09-21 22:21:42 +0200236 $SOME_ENV_VAR ..= 'more'
237 assert_equal('somemore', $SOME_ENV_VAR)
Bram Moolenaar62aec932022-01-29 21:45:34 +0000238 v9.CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
239 v9.CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200240
Bram Moolenaar971caf52020-09-21 22:21:42 +0200241 v:errmsg = 'none'
242 v:errmsg ..= 'again'
243 assert_equal('noneagain', v:errmsg)
Bram Moolenaar62aec932022-01-29 21:45:34 +0000244 v9.CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
245 v9.CheckDefFailure(['v:errmsg += 123'], 'E1012:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200246
Bram Moolenaarfc8aa6d2020-10-12 20:31:26 +0200247 var text =<< trim END
248 some text
249 END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200250enddef
251
Bram Moolenaaraf647e72021-08-05 19:01:17 +0200252def Test_float_and_number()
253 if !has('float')
254 MissingFeature float
255 else
256 var lines =<< trim END
257 var f: float
258 f += 2
259 f -= 1
260 assert_equal(1.0, f)
261 ++f
262 --f
263 assert_equal(1.0, f)
264 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000265 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaaraf647e72021-08-05 19:01:17 +0200266 endif
267enddef
268
Bram Moolenaarf5d52c92021-07-31 22:51:10 +0200269let g:someNumber = 43
270
271def Test_assign_concat()
272 var lines =<< trim END
273 var s = '-'
274 s ..= 99
275 s ..= true
276 s ..= '-'
277 s ..= v:null
278 s ..= g:someNumber
279 assert_equal('-99true-null43', s)
280 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000281 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf5d52c92021-07-31 22:51:10 +0200282
283 lines =<< trim END
284 var s = '-'
285 s ..= [1, 2]
286 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000287 v9.CheckDefAndScriptFailure(lines, ['E1105: Cannot convert list to string', 'E734: Wrong variable type for .='], 2)
Bram Moolenaarf5d52c92021-07-31 22:51:10 +0200288 lines =<< trim END
289 var s = '-'
290 s ..= {a: 2}
291 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000292 v9.CheckDefAndScriptFailure(lines, ['E1105: Cannot convert dict to string', 'E734: Wrong variable type for .='], 2)
Bram Moolenaar22ebd172022-04-01 15:26:58 +0100293
294 lines =<< trim END
295 var ls: list<string> = []
296 ls[-1] ..= 'foo'
297 END
Bram Moolenaarec892232022-05-06 17:53:06 +0100298 v9.CheckDefExecAndScriptFailure(lines, 'E684: List index out of range: -1', 2)
Bram Moolenaarf5d52c92021-07-31 22:51:10 +0200299enddef
300
Bram Moolenaar13e45d12021-06-26 13:28:35 +0200301def Test_assign_register()
302 var lines =<< trim END
303 @c = 'areg'
304 @c ..= 'add'
305 assert_equal('aregadd', @c)
306
307 @@ = 'some text'
308 assert_equal('some text', getreg('"'))
309 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000310 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar13e45d12021-06-26 13:28:35 +0200311
Bram Moolenaar62aec932022-01-29 21:45:34 +0000312 v9.CheckDefFailure(['@a += "more"'], 'E1051:')
313 v9.CheckDefFailure(['@a += 123'], 'E1012:')
Bram Moolenaar13e45d12021-06-26 13:28:35 +0200314enddef
315
Bram Moolenaard0edaf92021-05-28 21:06:08 +0200316def Test_reserved_name()
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000317 var more_names = ['null_job', 'null_channel']
318 if !has('job')
319 more_names = []
320 endif
321
322 for name in ['true',
323 'false',
324 'null',
325 'null_blob',
326 'null_dict',
327 'null_function',
328 'null_list',
329 'null_partial',
330 'null_string',
331 ] + more_names
Bram Moolenaar62aec932022-01-29 21:45:34 +0000332 v9.CheckDefExecAndScriptFailure(['var ' .. name .. ' = 0'], 'E1034:')
333 v9.CheckDefExecAndScriptFailure(['var ' .. name .. ': bool'], 'E1034:')
Bram Moolenaard0edaf92021-05-28 21:06:08 +0200334 endfor
335enddef
336
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000337def Test_null_values()
338 var lines =<< trim END
339 var b: blob = null_blob
340 var dn: dict<number> = null_dict
341 var ds: dict<string> = null_dict
342 var ln: list<number> = null_list
343 var ls: list<string> = null_list
344 var Ff: func(string): string = null_function
345 var Fp: func(number): number = null_partial
346 var s: string = null_string
347 if has('job')
348 var j: job = null_job
349 var c: channel = null_channel
350 endif
Bram Moolenaar56b84b12022-03-09 19:46:48 +0000351
352 var d: dict<func> = {a: function('tr'), b: null_function}
Bram Moolenaarbadf04f2022-03-12 21:28:22 +0000353
354 var bl: list<blob> = [0z12, null_blob]
355 var dnl: list<dict<number>> = [{a: 1}, null_dict]
356 var dsl: list<dict<string>> = [{a: 'x'}, null_dict]
357 var lnl: list<list<number>> = [[1], null_list]
358 var lsl: list<list<string>> = [['x'], null_list]
359 def Len(v: string): number
360 return len(v)
361 enddef
362 var Ffl: list<func(string): number> = [Len, null_function]
363 var Fpl: list<func(string): number> = [Len, null_partial]
364 var sl: list<string> = ['x', null_string]
365 if has('job')
366 var jl: list<job> = [null_job]
367 var cl: list<channel> = [null_channel]
368 endif
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000369 END
370 v9.CheckDefAndScriptSuccess(lines)
371enddef
372
Bram Moolenaar56b84b12022-03-09 19:46:48 +0000373def Test_keep_type_after_assigning_null()
374 var lines =<< trim END
375 var b: blob
376 b = null_blob
377 b = 'text'
378 END
379 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected blob but got string')
380
381 lines =<< trim END
382 var l: list<number>
383 l = null_list
384 l = ['text']
385 END
386 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected list<number> but got list<string>')
387
388 lines =<< trim END
389 var d: dict<string>
390 d = null_dict
391 d = {a: 1, b: 2}
392 END
393 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected dict<string> but got dict<number>')
394enddef
395
Bram Moolenaaraa1959b2021-04-15 22:13:39 +0200396def Test_skipped_assignment()
397 var lines =<< trim END
398 for x in []
399 var i: number = 1
400 while false
401 i += 1
402 endwhile
403 endfor
404 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000405 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaaraa1959b2021-04-15 22:13:39 +0200406enddef
407
Bram Moolenaar7824fc82021-11-26 17:36:51 +0000408def Test_assign_keep_type()
409 var lines =<< trim END
410 vim9script
411 var l: list<number> = [123]
412 l = [123]
413 l->add('string')
414 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000415 v9.CheckScriptFailure(lines, 'E1012:', 4)
Bram Moolenaar7824fc82021-11-26 17:36:51 +0000416enddef
417
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100418def Test_assign_unpack()
419 var lines =<< trim END
420 var v1: number
421 var v2: number
422 [v1, v2] = [1, 2]
423 assert_equal(1, v1)
424 assert_equal(2, v2)
Bram Moolenaarf93bbd02021-04-10 22:35:43 +0200425
426 [v1, _, v2, _] = [1, 99, 2, 77]
427 assert_equal(1, v1)
428 assert_equal(2, v2)
429
430 [v1, v2; _] = [1, 2, 3, 4, 5]
431 assert_equal(1, v1)
432 assert_equal(2, v2)
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200433
Bram Moolenaarbc510062022-02-14 21:19:04 +0000434 var _x: number
435 [_x, v2] = [6, 7]
436 assert_equal(6, _x)
437 assert_equal(7, v2)
438
Bram Moolenaar4d5dfe22021-06-26 13:59:29 +0200439 var reslist = []
440 for text in ['aaa {bbb} ccc', 'ddd {eee} fff']
441 var before: string
442 var middle: string
443 var after: string
444 [_, before, middle, after; _] = text->matchlist('\(.\{-\}\){\(.\{-\}\)}\(.*\)')
445 reslist->add(before)->add(middle)->add(after)
446 endfor
447 assert_equal(['aaa ', 'bbb', ' ccc', 'ddd ', 'eee', ' fff'], reslist)
448
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200449 var a = 1
450 var b = 3
451 [a, b] += [2, 4]
452 assert_equal(3, a)
453 assert_equal(7, b)
454
455 [a, b] -= [1, 2]
456 assert_equal(2, a)
457 assert_equal(5, b)
458
459 [a, b] *= [3, 2]
460 assert_equal(6, a)
461 assert_equal(10, b)
462
463 [a, b] /= [2, 4]
464 assert_equal(3, a)
465 assert_equal(2, b)
466
467 [a, b] = [17, 15]
468 [a, b] %= [5, 3]
469 assert_equal(2, a)
470 assert_equal(0, b)
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100471 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000472 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100473
474 lines =<< trim END
475 var v1: number
476 var v2: number
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000477 [v1, v2] = [1, 2, 3]
478 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000479 v9.CheckDefFailure(lines, 'E1093: Expected 2 items but got 3', 3)
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000480
481 lines =<< trim END
482 var v1: number
483 var v2: number
484 [v1, v2] = [1]
485 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000486 v9.CheckDefFailure(lines, 'E1093: Expected 2 items but got 1', 3)
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000487
488 lines =<< trim END
489 var v1: number
490 var v2: number
491 [v1, v2; _] = [1]
492 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000493 v9.CheckDefFailure(lines, 'E1093: Expected 2 items but got 1', 3)
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000494
495 lines =<< trim END
496 var v1: number
497 var v2: number
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100498 [v1, v2] =
499 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000500 v9.CheckDefFailure(lines, 'E1097:', 5)
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100501
502 lines =<< trim END
503 var v1: number
504 var v2: number
505 [v1, v2] = xxx
506 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000507 v9.CheckDefFailure(lines, 'E1001:', 3)
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100508
509 lines =<< trim END
510 var v1: number
511 var v2: number
512 [v1, v2] = popup_clear()
513 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000514 v9.CheckDefFailure(lines, 'E1031:', 3)
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100515
516 lines =<< trim END
Bram Moolenaar3862ea32021-01-01 21:05:55 +0100517 [v1, v2] = [1, 2]
518 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000519 v9.CheckDefFailure(lines, 'E1089', 1)
520 v9.CheckScriptFailure(['vim9script'] + lines, 'E1089', 2)
Bram Moolenaar3862ea32021-01-01 21:05:55 +0100521
522 lines =<< trim END
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100523 var v1: number
524 var v2: number
525 [v1, v2] = ''
526 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000527 v9.CheckDefFailure(lines, 'E1012: Type mismatch; expected list<any> but got string', 3)
Bram Moolenaarf785aa12021-02-11 21:19:34 +0100528
529 lines =<< trim END
530 g:values = [false, 0]
531 var x: bool
532 var y: string
533 [x, y] = g:values
534 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000535 v9.CheckDefExecAndScriptFailure(lines, 'E1163: Variable 2: type mismatch, expected string but got number')
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200536
537 lines =<< trim END
538 var x: number
539 var y: number
540 var z: string
541 [x, y, z] = [1, 2, 3]
542 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000543 v9.CheckDefAndScriptFailure(lines, 'E1163: Variable 3: type mismatch, expected string but got number')
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200544
545 lines =<< trim END
546 var x: number
547 var y: string
548 var z: string
549 [x, y, z] = [1, '2', 3]
550 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000551 v9.CheckDefExecAndScriptFailure(lines, 'E1163: Variable 3: type mismatch, expected string but got number')
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100552enddef
553
Bram Moolenaar7f764942020-12-02 15:11:18 +0100554def Test_assign_linebreak()
555 var nr: number
556 nr =
557 123
558 assert_equal(123, nr)
559
560 var n2: number
561 [nr, n2] =
562 [12, 34]
563 assert_equal(12, nr)
564 assert_equal(34, n2)
565
Bram Moolenaar62aec932022-01-29 21:45:34 +0000566 v9.CheckDefFailure(["var x = #"], 'E1097:', 3)
Bram Moolenaar77709b12021-04-03 21:01:01 +0200567
568 var lines =<< trim END
569 var x: list<string> = ['a']
570 var y: list<number> = x
571 ->copy()
572 ->copy()
573 END
Bram Moolenaar381692b2022-02-02 20:01:27 +0000574 v9.CheckDefExecFailure(lines, 'E1012:', 4)
Bram Moolenaar6977dba2021-07-04 22:48:12 +0200575
576 lines =<< trim END
577 var x: any
578 x.key = 1
579 + 2
580 + 3
581 + 4
582 + 5
583 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000584 v9.CheckDefExecAndScriptFailure(lines, ['E1148:', 'E1203:'], 2)
Bram Moolenaar7f764942020-12-02 15:11:18 +0100585enddef
586
Bram Moolenaardc234ca2020-11-28 18:52:33 +0100587def Test_assign_index()
588 # list of list
589 var l1: list<number>
590 l1[0] = 123
591 assert_equal([123], l1)
592
593 var l2: list<list<number>>
594 l2[0] = []
595 l2[0][0] = 123
596 assert_equal([[123]], l2)
597
598 var l3: list<list<list<number>>>
599 l3[0] = []
600 l3[0][0] = []
601 l3[0][0][0] = 123
602 assert_equal([[[123]]], l3)
603
604 var lines =<< trim END
605 var l3: list<list<number>>
606 l3[0] = []
607 l3[0][0] = []
608 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000609 v9.CheckDefFailure(lines, 'E1012: Type mismatch; expected number but got list<unknown>', 3)
Bram Moolenaardc234ca2020-11-28 18:52:33 +0100610
611 # dict of dict
612 var d1: dict<number>
613 d1.one = 1
614 assert_equal({one: 1}, d1)
615
616 var d2: dict<dict<number>>
617 d2.one = {}
618 d2.one.two = 123
619 assert_equal({one: {two: 123}}, d2)
620
621 var d3: dict<dict<dict<number>>>
622 d3.one = {}
623 d3.one.two = {}
624 d3.one.two.three = 123
625 assert_equal({one: {two: {three: 123}}}, d3)
626
Bram Moolenaare08be092022-02-17 13:08:26 +0000627 # blob
628 var bl: blob = 0z11223344
629 bl[0] = 0x77
630 assert_equal(0z77223344, bl)
631 bl[-2] = 0x66
632 assert_equal(0z77226644, bl)
633
Bram Moolenaar1983f1a2022-02-28 20:55:02 +0000634 lines =<< trim END
635 g:val = '22'
636 var bl = 0z11
637 bl[1] = g:val
638 END
639 v9.CheckDefExecAndScriptFailure(lines, 'E1030: Using a String as a Number: "22"')
640
Bram Moolenaare97976b2021-08-01 13:17:17 +0200641 # should not read the next line when generating "a.b"
642 var a = {}
643 a.b = {}
644 a.b.c = {}
645 ->copy()
646
Bram Moolenaardc234ca2020-11-28 18:52:33 +0100647 lines =<< trim END
648 var d3: dict<dict<number>>
649 d3.one = {}
650 d3.one.two = {}
651 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000652 v9.CheckDefFailure(lines, 'E1012: Type mismatch; expected number but got dict<unknown>', 3)
Bram Moolenaardc234ca2020-11-28 18:52:33 +0100653
Bram Moolenaaracbae182020-12-13 18:44:43 +0100654 lines =<< trim END
655 var lines: list<string>
656 lines['a'] = 'asdf'
657 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000658 v9.CheckDefFailure(lines, 'E1012:', 2)
Bram Moolenaaracbae182020-12-13 18:44:43 +0100659
660 lines =<< trim END
661 var lines: string
662 lines[9] = 'asdf'
663 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000664 v9.CheckDefFailure(lines, 'E1141:', 2)
Bram Moolenaaracbae182020-12-13 18:44:43 +0100665
Bram Moolenaardc234ca2020-11-28 18:52:33 +0100666 # list of dict
667 var ld: list<dict<number>>
668 ld[0] = {}
669 ld[0].one = 123
670 assert_equal([{one: 123}], ld)
671
672 lines =<< trim END
673 var ld: list<dict<number>>
674 ld[0] = []
675 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000676 v9.CheckDefFailure(lines, 'E1012: Type mismatch; expected dict<number> but got list<unknown>', 2)
Bram Moolenaardc234ca2020-11-28 18:52:33 +0100677
678 # dict of list
679 var dl: dict<list<number>>
680 dl.one = []
681 dl.one[0] = 123
682 assert_equal({one: [123]}, dl)
683
684 lines =<< trim END
685 var dl: dict<list<number>>
686 dl.one = {}
687 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000688 v9.CheckDefFailure(lines, 'E1012: Type mismatch; expected list<number> but got dict<unknown>', 2)
Bram Moolenaare08be092022-02-17 13:08:26 +0000689
690 lines =<< trim END
691 g:l = [1, 2]
692 g:l['x'] = 3
693 END
694 v9.CheckDefExecAndScriptFailure(lines, ['E39:', 'E1030:'], 2)
695
696 lines =<< trim END
697 var bl: blob = test_null_blob()
698 bl[1] = 8
699 END
700 v9.CheckDefExecAndScriptFailure(lines, ['E1184:', 'E979:'], 2)
Bram Moolenaarea5c8982022-02-17 14:42:02 +0000701
702 lines =<< trim END
703 g:bl = 'not a blob'
704 g:bl[1 : 2] = 8
705 END
706 v9.CheckDefExecAndScriptFailure(lines, ['E897:', 'E689:'], 2)
Bram Moolenaardc234ca2020-11-28 18:52:33 +0100707enddef
708
Bram Moolenaar38ecd972022-01-15 21:44:44 +0000709def Test_init_in_for_loop()
710 var lines =<< trim END
711 var l: list<number> = []
712 for i in [3, 4]
713 var n: number
714 add(l, n)
715 n = 123
716 endfor
717 assert_equal([0, 0], l)
718 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000719 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar38ecd972022-01-15 21:44:44 +0000720
721 lines =<< trim END
722 var l: list<number> = []
723 for i in [3, 4]
724 var n: number = 0
725 add(l, n)
726 n = 123
727 endfor
728 assert_equal([0, 0], l)
729 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000730 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar38ecd972022-01-15 21:44:44 +0000731
732 lines =<< trim END
733 var l: list<number> = []
734 for i in [3, 4]
735 var n: number = 3
736 add(l, n)
737 n = 123
738 endfor
739 assert_equal([3, 3], l)
740 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000741 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar38ecd972022-01-15 21:44:44 +0000742enddef
743
Bram Moolenaarbc6f2bf2022-05-06 14:29:09 +0100744def Test_redir_is_not_assign()
745 if false
746 redir => res
747 echo var_job
748 redir END
749 endif
750enddef
751
Bram Moolenaar81ed4962020-09-23 15:56:50 +0200752def Test_extend_list()
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +0100753 # using uninitialized list assigns empty list
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200754 var lines =<< trim END
Bram Moolenaar07802042021-09-09 23:01:14 +0200755 var l1: list<number>
756 var l2 = l1
757 assert_true(l1 is l2)
758 l1 += [123]
759 assert_equal([123], l1)
760 assert_true(l1 is l2)
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100761 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000762 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar81ed4962020-09-23 15:56:50 +0200763
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100764 lines =<< trim END
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100765 var list: list<string>
766 extend(list, ['x'])
767 assert_equal(['x'], list)
Bram Moolenaar81ed4962020-09-23 15:56:50 +0200768 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000769 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar1a739232020-10-10 15:37:58 +0200770
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +0100771 # appending to uninitialized list from a function works
Bram Moolenaar1a739232020-10-10 15:37:58 +0200772 lines =<< trim END
773 vim9script
774 var list: list<string>
775 def Func()
776 list += ['a', 'b']
777 enddef
778 Func()
779 assert_equal(['a', 'b'], list)
780 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000781 v9.CheckScriptSuccess(lines)
Bram Moolenaar3beaf9c2020-12-18 17:23:14 +0100782 lines =<< trim END
783 vim9script
784 var list: list<string>
785 def Func()
786 extend(list, ['x', 'b'])
787 enddef
788 Func()
789 assert_equal(['x', 'b'], list)
790 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000791 v9.CheckScriptSuccess(lines)
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100792
Bram Moolenaaraa7d0c22022-04-05 21:40:38 +0100793 # initialized to null, with type, does not default to empty list
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100794 lines =<< trim END
795 vim9script
796 var l: list<string> = test_null_list()
797 extend(l, ['x'])
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100798 END
Bram Moolenaaraa7d0c22022-04-05 21:40:38 +0100799 v9.CheckScriptFailure(lines, 'E1134:', 3)
800
801 # initialized to null, without type, does not default to empty list
802 lines =<< trim END
803 vim9script
804 var l = null_list
805 extend(l, ['x'])
806 END
807 v9.CheckScriptFailure(lines, 'E1134:', 3)
808
809 # assigned null, does not default to empty list
810 lines =<< trim END
811 vim9script
812 var l: list<string>
813 l = null_list
814 extend(l, ['x'])
815 END
816 v9.CheckScriptFailure(lines, 'E1134:', 4)
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100817
818 lines =<< trim END
819 vim9script
820 extend(test_null_list(), ['x'])
821 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000822 v9.CheckScriptFailure(lines, 'E1134:', 2)
Bram Moolenaar078a4612022-01-04 15:17:03 +0000823
824 # using global var has no declared type
825 g:myList = []
826 g:myList->extend([1])
827 g:myList->extend(['x'])
828 assert_equal([1, 'x'], g:myList)
829 unlet g:myList
830
831 # using declared list gives an error
832 lines =<< trim END
833 var l: list<number>
834 g:myList = l
835 g:myList->extend([1])
836 g:myList->extend(['x'])
837 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000838 v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected list<number> but got list<string>', 4)
Bram Moolenaar078a4612022-01-04 15:17:03 +0000839 unlet g:myList
Bram Moolenaar160afdb2022-02-06 17:17:02 +0000840
841 lines =<< trim END
842 vim9script
843 var lds = [1, 2, 3]
844 def Func()
845 echo lds->extend(['x'])
846 enddef
847 defcompile
848 END
849 v9.CheckScriptFailure(lines, 'E1013:')
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100850enddef
851
852def Test_extend_dict()
853 var lines =<< trim END
854 vim9script
855 var d: dict<number>
Bram Moolenaare0de1712020-12-02 17:36:54 +0100856 extend(d, {a: 1})
857 assert_equal({a: 1}, d)
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100858
859 var d2: dict<number>
860 d2['one'] = 1
Bram Moolenaare0de1712020-12-02 17:36:54 +0100861 assert_equal({one: 1}, d2)
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100862 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000863 v9.CheckScriptSuccess(lines)
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100864
865 lines =<< trim END
866 vim9script
867 var d: dict<string> = test_null_dict()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100868 extend(d, {a: 'x'})
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100869 END
Bram Moolenaaraa7d0c22022-04-05 21:40:38 +0100870 v9.CheckScriptFailure(lines, 'E1133:', 3)
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100871
872 lines =<< trim END
873 vim9script
Bram Moolenaare0de1712020-12-02 17:36:54 +0100874 extend(test_null_dict(), {a: 'x'})
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100875 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000876 v9.CheckScriptFailure(lines, 'E1133:', 2)
Bram Moolenaar81ed4962020-09-23 15:56:50 +0200877enddef
878
Bram Moolenaar971caf52020-09-21 22:21:42 +0200879def Test_single_letter_vars()
880 # single letter variables
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200881 var a: number = 123
Bram Moolenaar971caf52020-09-21 22:21:42 +0200882 a = 123
883 assert_equal(123, a)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200884 var b: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200885 b = 123
886 assert_equal(123, b)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200887 var g: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200888 g = 123
889 assert_equal(123, g)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200890 var s: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200891 s = 123
892 assert_equal(123, s)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200893 var t: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200894 t = 123
895 assert_equal(123, t)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200896 var v: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200897 v = 123
898 assert_equal(123, v)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200899 var w: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200900 w = 123
901 assert_equal(123, w)
902enddef
903
904def Test_vim9_single_char_vars()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200905 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200906 vim9script
907
908 # single character variable declarations work
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200909 var a: string
910 var b: number
911 var l: list<any>
912 var s: string
913 var t: number
914 var v: number
915 var w: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200916
917 # script-local variables can be used without s: prefix
918 a = 'script-a'
919 b = 111
920 l = [1, 2, 3]
921 s = 'script-s'
922 t = 222
923 v = 333
924 w = 444
925
926 assert_equal('script-a', a)
927 assert_equal(111, b)
928 assert_equal([1, 2, 3], l)
929 assert_equal('script-s', s)
930 assert_equal(222, t)
931 assert_equal(333, v)
932 assert_equal(444, w)
933 END
934 writefile(lines, 'Xsinglechar')
935 source Xsinglechar
936 delete('Xsinglechar')
937enddef
938
939def Test_assignment_list()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200940 var list1: list<bool> = [false, true, false]
941 var list2: list<number> = [1, 2, 3]
942 var list3: list<string> = ['sdf', 'asdf']
943 var list4: list<any> = ['yes', true, 1234]
944 var list5: list<blob> = [0z01, 0z02]
Bram Moolenaar971caf52020-09-21 22:21:42 +0200945
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200946 var listS: list<string> = []
947 var listN: list<number> = []
Bram Moolenaar971caf52020-09-21 22:21:42 +0200948
949 assert_equal([1, 2, 3], list2)
950 list2[-1] = 99
951 assert_equal([1, 2, 99], list2)
952 list2[-2] = 88
953 assert_equal([1, 88, 99], list2)
954 list2[-3] = 77
955 assert_equal([77, 88, 99], list2)
956 list2 += [100]
957 assert_equal([77, 88, 99, 100], list2)
958
959 list3 += ['end']
960 assert_equal(['sdf', 'asdf', 'end'], list3)
961
Bram Moolenaar62aec932022-01-29 21:45:34 +0000962 v9.CheckDefExecFailure(['var ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
Bram Moolenaar6296d1e2022-02-17 16:30:11 +0000963 v9.CheckDefExecFailure(['var ll = [1, 2, 3]', 'unlet ll[8 : 9]'], 'E684:')
964 v9.CheckDefExecFailure(['var ll = [1, 2, 3]', 'unlet ll[1 : -9]'], 'E684:')
965 v9.CheckDefExecFailure(['var ll = [1, 2, 3]', 'unlet ll[2 : 1]'], 'E684:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200966
967 # type becomes list<any>
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200968 var somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100969
Bram Moolenaar114dbda2022-01-03 12:28:03 +0000970 # type is list<any> even though initializer is list<number>
971 var anyList: list<any> = [0]
972 assert_equal([0, 'x'], extend(anyList, ['x']))
973
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100974 var lines =<< trim END
975 var d = {dd: test_null_list()}
976 d.dd[0] = 0
977 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000978 v9.CheckDefExecFailure(lines, 'E1147:', 2)
Bram Moolenaar7a40ff02021-07-04 15:54:08 +0200979
980 lines =<< trim END
981 def OneArg(x: bool)
982 enddef
983 def TwoArgs(x: bool, y: bool)
984 enddef
985 var fl: list<func(bool, bool, bool)> = [OneArg, TwoArgs]
986 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000987 v9.CheckDefExecAndScriptFailure(lines, 'E1012:', 5)
Bram Moolenaar971caf52020-09-21 22:21:42 +0200988enddef
989
Bram Moolenaarab36e6a2021-11-30 16:14:49 +0000990def Test_list_declaration()
991 var [v1, v2] = [1, 2]
992 v1 += 3
993 assert_equal(4, v1)
994 v2 *= 3
995 assert_equal(6, v2)
996
997 var lines =<< trim END
998 var [v1, v2] = [1]
999 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001000 v9.CheckDefExecAndScriptFailure(lines, ['E1093: Expected 2 items but got 1', 'E688:'])
Bram Moolenaarab36e6a2021-11-30 16:14:49 +00001001 lines =<< trim END
1002 var testlist = [1]
1003 var [v1, v2] = testlist
1004 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001005 v9.CheckDefExecAndScriptFailure(lines, ['E1093: Expected 2 items but got 1', 'E688:'])
Bram Moolenaarab36e6a2021-11-30 16:14:49 +00001006 lines =<< trim END
1007 var [v1, v2] = [1, 2, 3]
1008 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001009 v9.CheckDefExecAndScriptFailure(lines, ['E1093: Expected 2 items but got 3', 'E687:'])
Bram Moolenaarab36e6a2021-11-30 16:14:49 +00001010 lines =<< trim END
1011 var testlist = [1, 2, 3]
1012 var [v1, v2] = testlist
1013 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001014 v9.CheckDefExecAndScriptFailure(lines, ['E1093: Expected 2 items but got 3', 'E687:'])
Bram Moolenaarab36e6a2021-11-30 16:14:49 +00001015
1016 var [vnr, vstr] = [123, 'text']
1017 vnr += 3
1018 assert_equal(126, vnr)
1019 vstr ..= 'end'
1020 assert_equal('textend', vstr)
1021
1022 var [vnr2: number, vstr2: string] = [123, 'text']
1023 vnr2 += 3
1024 assert_equal(126, vnr2)
1025 vstr2 ..= 'end'
1026 assert_equal('textend', vstr2)
1027
1028 var [vnr3: number; vlist: list<string>] = [123, 'foo', 'bar']
1029 vnr3 += 5
1030 assert_equal(128, vnr3)
1031 assert_equal(['foo', 'bar'], vlist)
1032
1033 lines =<< trim END
1034 var [vnr2: number, vstr2: number] = [123, 'text']
1035 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001036 v9.CheckDefExecAndScriptFailure(lines, ['E1163: Variable 2: type mismatch, expected number but got string', 'E1012: Type mismatch; expected number but got string'])
Bram Moolenaarab36e6a2021-11-30 16:14:49 +00001037 lines =<< trim END
1038 var testlist = [234, 'text']
1039 var [vnr2: number, vstr2: number] = testlist
1040 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001041 v9.CheckDefExecAndScriptFailure(lines, ['E1163: Variable 2: type mismatch, expected number but got string', 'E1012: Type mismatch; expected number but got string'])
Bram Moolenaarab36e6a2021-11-30 16:14:49 +00001042enddef
1043
Bram Moolenaar97f227d2021-07-04 20:20:52 +02001044def PartFuncBool(b: bool): string
Bram Moolenaarb7480cd2021-07-04 18:28:15 +02001045 return 'done'
1046enddef
1047
1048def Test_assignment_partial()
Bram Moolenaar97f227d2021-07-04 20:20:52 +02001049 var lines =<< trim END
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001050 var Partial: func(): string = function(g:PartFuncBool, [true])
Bram Moolenaar97f227d2021-07-04 20:20:52 +02001051 assert_equal('done', Partial())
1052 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001053 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar22f85d02021-07-04 23:29:30 +02001054
1055 lines =<< trim END
1056 vim9script
1057 def Func(b: bool)
1058 enddef
1059 var Ref: func = function(Func, [true])
1060 assert_equal('func()', typename(Ref))
1061 Ref()
1062 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001063 v9.CheckScriptSuccess(lines)
Bram Moolenaar13789bf2021-12-30 13:29:00 +00001064
1065 lines =<< trim END
1066 vim9script
1067
1068 var nres: any
1069 var sres: any
Bram Moolenaar9a015112021-12-31 14:06:45 +00001070 def Func(nr: number, s = '')
1071 nres = nr
Bram Moolenaar13789bf2021-12-30 13:29:00 +00001072 sres = s
1073 enddef
1074
1075 var n: number
1076 var Ref = function(Func, [n])
1077 Ref('x')
1078 assert_equal(0, nres)
1079 assert_equal('x', sres)
1080 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001081 v9.CheckScriptSuccess(lines)
Bram Moolenaar13789bf2021-12-30 13:29:00 +00001082
1083 lines =<< trim END
1084 vim9script
1085
Bram Moolenaar9a015112021-12-31 14:06:45 +00001086 def Func(nr: number, s = '')
Bram Moolenaar13789bf2021-12-30 13:29:00 +00001087 enddef
1088
1089 var n: number
1090 var Ref = function(Func, [n])
1091 Ref(0)
1092 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001093 v9.CheckScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected string but got number')
Bram Moolenaarb7480cd2021-07-04 18:28:15 +02001094enddef
1095
Bram Moolenaarf30a14d2021-01-17 21:51:24 +01001096def Test_assignment_list_any_index()
1097 var l: list<number> = [1, 2]
1098 for [x, y, _]
1099 in [[0, 1, ''], [1, 3, '']]
1100 l[x] = l[x] + y
1101 endfor
1102 assert_equal([2, 5], l)
1103enddef
1104
Bram Moolenaar971caf52020-09-21 22:21:42 +02001105def Test_assignment_list_vim9script()
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001106 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +02001107 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001108 var v1: number
1109 var v2: number
1110 var v3: number
Bram Moolenaar971caf52020-09-21 22:21:42 +02001111 [v1, v2, v3] = [1, 2, 3]
1112 assert_equal([1, 2, 3], [v1, v2, v3])
1113 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001114 v9.CheckScriptSuccess(lines)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001115enddef
1116
1117def Test_assignment_dict()
Bram Moolenaare0de1712020-12-02 17:36:54 +01001118 var dict1: dict<bool> = {one: false, two: true}
1119 var dict2: dict<number> = {one: 1, two: 2}
1120 var dict3: dict<string> = {key: 'value'}
1121 var dict4: dict<any> = {one: 1, two: '2'}
1122 var dict5: dict<blob> = {one: 0z01, two: 0z02}
Bram Moolenaar971caf52020-09-21 22:21:42 +02001123
Bram Moolenaar31d99482022-05-26 22:24:43 +01001124 # check the type is OK
1125 var events: dict<string> = v:event
1126
Bram Moolenaar971caf52020-09-21 22:21:42 +02001127 # overwrite
1128 dict3['key'] = 'another'
Bram Moolenaare0de1712020-12-02 17:36:54 +01001129 assert_equal(dict3, {key: 'another'})
Bram Moolenaarfc74d032020-11-16 22:11:49 +01001130 dict3.key = 'yet another'
Bram Moolenaare0de1712020-12-02 17:36:54 +01001131 assert_equal(dict3, {key: 'yet another'})
Bram Moolenaarfc74d032020-11-16 22:11:49 +01001132
Bram Moolenaard24602f2020-12-20 15:20:56 +01001133 # member "any" can also be a dict and assigned to
1134 var anydict: dict<any> = {nest: {}, nr: 0}
1135 anydict.nest['this'] = 123
1136 anydict.nest.that = 456
1137 assert_equal({nest: {this: 123, that: 456}, nr: 0}, anydict)
1138
Bram Moolenaarfc74d032020-11-16 22:11:49 +01001139 var lines =<< trim END
Bram Moolenaard88dc4d2020-12-20 14:49:42 +01001140 var dd = {}
1141 dd.two = 2
1142 assert_equal({two: 2}, dd)
1143 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001144 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4f5e3972020-12-21 17:30:50 +01001145
1146 lines =<< trim END
1147 var d = {dd: {}}
1148 d.dd[0] = 2
1149 d.dd['x'] = 3
1150 d.dd.y = 4
1151 assert_equal({dd: {0: 2, x: 3, y: 4}}, d)
1152 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001153 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaard88dc4d2020-12-20 14:49:42 +01001154
1155 lines =<< trim END
Bram Moolenaar2e17fef2022-03-18 19:44:48 +00001156 var key = 'foo'
1157 g:[key] = 'value'
1158 assert_equal('value', g:foo)
1159 unlet g:foo
1160 END
1161 v9.CheckDefAndScriptSuccess(lines)
1162
1163 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +01001164 var dd = {one: 1}
Bram Moolenaarfc74d032020-11-16 22:11:49 +01001165 dd.one) = 2
1166 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001167 v9.CheckDefFailure(lines, 'E488:', 2)
Bram Moolenaard88dc4d2020-12-20 14:49:42 +01001168
1169 lines =<< trim END
1170 var dd = {one: 1}
1171 var dd.one = 2
1172 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001173 v9.CheckDefAndScriptFailure(lines, 'E1017:', 2)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001174
1175 # empty key can be used
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001176 var dd = {}
Bram Moolenaar971caf52020-09-21 22:21:42 +02001177 dd[""] = 6
Bram Moolenaare0de1712020-12-02 17:36:54 +01001178 assert_equal({['']: 6}, dd)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001179
1180 # type becomes dict<any>
Bram Moolenaare0de1712020-12-02 17:36:54 +01001181 var somedict = rand() > 0 ? {a: 1, b: 2} : {a: 'a', b: 'b'}
Bram Moolenaar971caf52020-09-21 22:21:42 +02001182
Bram Moolenaar114dbda2022-01-03 12:28:03 +00001183 # type is dict<any> even though initializer is dict<number>
1184 var anyDict: dict<any> = {a: 0}
1185 assert_equal({a: 0, b: 'x'}, extend(anyDict, {b: 'x'}))
1186
Bram Moolenaar078a4612022-01-04 15:17:03 +00001187 # using global var, which has no declared type
1188 g:myDict = {}
1189 g:myDict->extend({a: 1})
1190 g:myDict->extend({b: 'x'})
1191 assert_equal({a: 1, b: 'x'}, g:myDict)
1192 unlet g:myDict
1193
1194 # using list with declared type gives an error
1195 lines =<< trim END
1196 var d: dict<number>
1197 g:myDict = d
1198 g:myDict->extend({a: 1})
1199 g:myDict->extend({b: 'x'})
1200 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001201 v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict<number> but got dict<string>', 4)
Bram Moolenaar078a4612022-01-04 15:17:03 +00001202 unlet g:myDict
1203
Bram Moolenaar971caf52020-09-21 22:21:42 +02001204 # assignment to script-local dict
Bram Moolenaarfc74d032020-11-16 22:11:49 +01001205 lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +02001206 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001207 var test: dict<any> = {}
Bram Moolenaar971caf52020-09-21 22:21:42 +02001208 def FillDict(): dict<any>
1209 test['a'] = 43
1210 return test
1211 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01001212 assert_equal({a: 43}, FillDict())
Bram Moolenaar971caf52020-09-21 22:21:42 +02001213 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001214 v9.CheckScriptSuccess(lines)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001215
1216 lines =<< trim END
1217 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001218 var test: dict<any>
Bram Moolenaar971caf52020-09-21 22:21:42 +02001219 def FillDict(): dict<any>
1220 test['a'] = 43
1221 return test
1222 enddef
1223 FillDict()
Bram Moolenaar3beaf9c2020-12-18 17:23:14 +01001224 assert_equal({a: 43}, test)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001225 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001226 v9.CheckScriptSuccess(lines)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001227
1228 # assignment to global dict
1229 lines =<< trim END
1230 vim9script
1231 g:test = {}
1232 def FillDict(): dict<any>
1233 g:test['a'] = 43
1234 return g:test
1235 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01001236 assert_equal({a: 43}, FillDict())
Bram Moolenaar971caf52020-09-21 22:21:42 +02001237 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001238 v9.CheckScriptSuccess(lines)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001239
1240 # assignment to buffer dict
1241 lines =<< trim END
1242 vim9script
1243 b:test = {}
1244 def FillDict(): dict<any>
1245 b:test['a'] = 43
1246 return b:test
1247 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01001248 assert_equal({a: 43}, FillDict())
Bram Moolenaar971caf52020-09-21 22:21:42 +02001249 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001250 v9.CheckScriptSuccess(lines)
Bram Moolenaar4f5e3972020-12-21 17:30:50 +01001251
1252 lines =<< trim END
1253 var d = {dd: test_null_dict()}
1254 d.dd[0] = 0
1255 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001256 v9.CheckDefExecFailure(lines, 'E1103:', 2)
Bram Moolenaar4f5e3972020-12-21 17:30:50 +01001257
1258 lines =<< trim END
1259 var d = {dd: 'string'}
1260 d.dd[0] = 0
1261 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001262 v9.CheckDefExecFailure(lines, 'E1148:', 2)
Bram Moolenaar3a3b10e2021-06-26 15:00:59 +02001263
1264 lines =<< trim END
1265 var n: any
1266 n.key = 5
1267 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001268 v9.CheckDefExecAndScriptFailure(lines, ['E1148:', 'E1203: Dot can only be used on a dictionary: n.key = 5'], 2)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001269enddef
1270
1271def Test_assignment_local()
1272 # Test in a separated file in order not to the current buffer/window/tab is
1273 # changed.
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001274 var script_lines: list<string> =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +02001275 let b:existing = 'yes'
1276 let w:existing = 'yes'
1277 let t:existing = 'yes'
1278
1279 def Test_assignment_local_internal()
1280 b:newvar = 'new'
1281 assert_equal('new', b:newvar)
1282 assert_equal('yes', b:existing)
1283 b:existing = 'no'
1284 assert_equal('no', b:existing)
1285 b:existing ..= 'NO'
1286 assert_equal('noNO', b:existing)
1287
1288 w:newvar = 'new'
1289 assert_equal('new', w:newvar)
1290 assert_equal('yes', w:existing)
1291 w:existing = 'no'
1292 assert_equal('no', w:existing)
1293 w:existing ..= 'NO'
1294 assert_equal('noNO', w:existing)
1295
1296 t:newvar = 'new'
1297 assert_equal('new', t:newvar)
1298 assert_equal('yes', t:existing)
1299 t:existing = 'no'
1300 assert_equal('no', t:existing)
1301 t:existing ..= 'NO'
1302 assert_equal('noNO', t:existing)
1303 enddef
1304 call Test_assignment_local_internal()
1305 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001306 v9.CheckScriptSuccess(script_lines)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001307enddef
1308
1309def Test_assignment_default()
Bram Moolenaar971caf52020-09-21 22:21:42 +02001310 # Test default values.
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001311 var thebool: bool
Bram Moolenaar971caf52020-09-21 22:21:42 +02001312 assert_equal(v:false, thebool)
1313
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001314 var thenumber: number
Bram Moolenaar971caf52020-09-21 22:21:42 +02001315 assert_equal(0, thenumber)
1316
1317 if has('float')
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001318 var thefloat: float
Bram Moolenaar971caf52020-09-21 22:21:42 +02001319 assert_equal(0.0, thefloat)
1320 endif
1321
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001322 var thestring: string
Bram Moolenaar971caf52020-09-21 22:21:42 +02001323 assert_equal('', thestring)
1324
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001325 var theblob: blob
Bram Moolenaar971caf52020-09-21 22:21:42 +02001326 assert_equal(0z, theblob)
1327
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001328 var Thefunc: func
Bram Moolenaar971caf52020-09-21 22:21:42 +02001329 assert_equal(test_null_function(), Thefunc)
1330
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001331 var thelist: list<any>
Bram Moolenaar971caf52020-09-21 22:21:42 +02001332 assert_equal([], thelist)
1333
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001334 var thedict: dict<any>
Bram Moolenaar971caf52020-09-21 22:21:42 +02001335 assert_equal({}, thedict)
1336
1337 if has('channel')
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001338 var thejob: job
Bram Moolenaar971caf52020-09-21 22:21:42 +02001339 assert_equal(test_null_job(), thejob)
1340
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001341 var thechannel: channel
Bram Moolenaar971caf52020-09-21 22:21:42 +02001342 assert_equal(test_null_channel(), thechannel)
1343
1344 if has('unix') && executable('cat')
1345 # check with non-null job and channel, types must match
Bram Moolenaare0de1712020-12-02 17:36:54 +01001346 thejob = job_start("cat ", {})
Bram Moolenaar971caf52020-09-21 22:21:42 +02001347 thechannel = job_getchannel(thejob)
1348 job_stop(thejob, 'kill')
1349 endif
1350 endif
1351
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001352 var nr = 1234 | nr = 5678
Bram Moolenaar971caf52020-09-21 22:21:42 +02001353 assert_equal(5678, nr)
1354enddef
1355
Bram Moolenaare08be092022-02-17 13:08:26 +00001356def Test_script_var_default()
1357 var lines =<< trim END
1358 vim9script
1359 var l: list<number>
Bram Moolenaar1983f1a2022-02-28 20:55:02 +00001360 var li = [1, 2]
Bram Moolenaare08be092022-02-17 13:08:26 +00001361 var bl: blob
Bram Moolenaar1983f1a2022-02-28 20:55:02 +00001362 var bli = 0z12
Bram Moolenaare08be092022-02-17 13:08:26 +00001363 var d: dict<number>
Bram Moolenaar1983f1a2022-02-28 20:55:02 +00001364 var di = {'a': 1, 'b': 2}
Bram Moolenaare08be092022-02-17 13:08:26 +00001365 def Echo()
1366 assert_equal([], l)
Bram Moolenaar1983f1a2022-02-28 20:55:02 +00001367 assert_equal([1, 2], li)
Bram Moolenaare08be092022-02-17 13:08:26 +00001368 assert_equal(0z, bl)
Bram Moolenaar1983f1a2022-02-28 20:55:02 +00001369 assert_equal(0z12, bli)
Bram Moolenaare08be092022-02-17 13:08:26 +00001370 assert_equal({}, d)
Bram Moolenaar1983f1a2022-02-28 20:55:02 +00001371 assert_equal({'a': 1, 'b': 2}, di)
Bram Moolenaare08be092022-02-17 13:08:26 +00001372 enddef
Bram Moolenaarea5c8982022-02-17 14:42:02 +00001373 Echo()
Bram Moolenaare08be092022-02-17 13:08:26 +00001374 END
1375 v9.CheckScriptSuccess(lines)
1376enddef
1377
Bram Moolenaara749a422022-02-12 19:52:25 +00001378let s:scriptvar = 'init'
Bram Moolenaar3862ea32021-01-01 21:05:55 +01001379
Bram Moolenaar971caf52020-09-21 22:21:42 +02001380def Test_assignment_var_list()
Bram Moolenaarda7c20c2020-11-30 21:12:19 +01001381 var lines =<< trim END
1382 var v1: string
1383 var v2: string
1384 var vrem: list<string>
1385 [v1] = ['aaa']
1386 assert_equal('aaa', v1)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001387
Bram Moolenaarda7c20c2020-11-30 21:12:19 +01001388 [v1, v2] = ['one', 'two']
1389 assert_equal('one', v1)
1390 assert_equal('two', v2)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001391
Bram Moolenaarda7c20c2020-11-30 21:12:19 +01001392 [v1, v2; vrem] = ['one', 'two']
1393 assert_equal('one', v1)
1394 assert_equal('two', v2)
1395 assert_equal([], vrem)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001396
Bram Moolenaarda7c20c2020-11-30 21:12:19 +01001397 [v1, v2; vrem] = ['one', 'two', 'three']
1398 assert_equal('one', v1)
1399 assert_equal('two', v2)
1400 assert_equal(['three'], vrem)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001401
Bram Moolenaarda7c20c2020-11-30 21:12:19 +01001402 [&ts, &sw] = [3, 4]
1403 assert_equal(3, &ts)
1404 assert_equal(4, &sw)
1405 set ts=8 sw=4
Bram Moolenaar004d9b02020-11-30 21:40:03 +01001406
1407 [@a, @z] = ['aa', 'zz']
1408 assert_equal('aa', @a)
1409 assert_equal('zz', @z)
1410
1411 [$SOME_VAR, $OTHER_VAR] = ['some', 'other']
1412 assert_equal('some', $SOME_VAR)
1413 assert_equal('other', $OTHER_VAR)
1414
Bram Moolenaar3862ea32021-01-01 21:05:55 +01001415 [g:globalvar, b:bufvar, w:winvar, t:tabvar, v:errmsg] =
1416 ['global', 'buf', 'win', 'tab', 'error']
Bram Moolenaar004d9b02020-11-30 21:40:03 +01001417 assert_equal('global', g:globalvar)
Bram Moolenaar004d9b02020-11-30 21:40:03 +01001418 assert_equal('buf', b:bufvar)
1419 assert_equal('win', w:winvar)
1420 assert_equal('tab', t:tabvar)
1421 assert_equal('error', v:errmsg)
1422 unlet g:globalvar
Bram Moolenaarda7c20c2020-11-30 21:12:19 +01001423 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001424 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar3862ea32021-01-01 21:05:55 +01001425
Bram Moolenaara749a422022-02-12 19:52:25 +00001426 [g:globalvar, scriptvar, b:bufvar] = ['global', 'script', 'buf']
Bram Moolenaar3862ea32021-01-01 21:05:55 +01001427 assert_equal('global', g:globalvar)
Bram Moolenaara749a422022-02-12 19:52:25 +00001428 assert_equal('script', scriptvar)
Bram Moolenaar3862ea32021-01-01 21:05:55 +01001429 assert_equal('buf', b:bufvar)
1430
1431 lines =<< trim END
1432 vim9script
Bram Moolenaara749a422022-02-12 19:52:25 +00001433 var scriptvar = 'init'
1434 [g:globalvar, scriptvar, w:winvar] = ['global', 'script', 'win']
Bram Moolenaar3862ea32021-01-01 21:05:55 +01001435 assert_equal('global', g:globalvar)
Bram Moolenaara749a422022-02-12 19:52:25 +00001436 assert_equal('script', scriptvar)
Bram Moolenaar3862ea32021-01-01 21:05:55 +01001437 assert_equal('win', w:winvar)
1438 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001439 v9.CheckScriptSuccess(lines)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001440enddef
1441
Bram Moolenaar2d3ac2e2022-02-03 12:34:05 +00001442def Test_assignment_empty_list()
1443 var lines =<< trim END
1444 var l2: list<any> = []
1445 var l: list<string>
1446 l = l2
1447 END
1448 v9.CheckDefAndScriptSuccess(lines)
1449enddef
1450
Bram Moolenaar971caf52020-09-21 22:21:42 +02001451def Test_assignment_vim9script()
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001452 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +02001453 vim9script
1454 def Func(): list<number>
1455 return [1, 2]
1456 enddef
Bram Moolenaar98309382020-09-27 21:58:45 +02001457 var name1: number
1458 var name2: number
1459 [name1, name2] =
Bram Moolenaar971caf52020-09-21 22:21:42 +02001460 Func()
Bram Moolenaar98309382020-09-27 21:58:45 +02001461 assert_equal(1, name1)
1462 assert_equal(2, name2)
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001463 var ll =
Bram Moolenaar971caf52020-09-21 22:21:42 +02001464 Func()
1465 assert_equal([1, 2], ll)
1466
1467 @/ = 'text'
1468 assert_equal('text', @/)
1469 @0 = 'zero'
1470 assert_equal('zero', @0)
1471 @1 = 'one'
1472 assert_equal('one', @1)
1473 @9 = 'nine'
1474 assert_equal('nine', @9)
1475 @- = 'minus'
1476 assert_equal('minus', @-)
1477 if has('clipboard_working')
1478 @* = 'star'
1479 assert_equal('star', @*)
1480 @+ = 'plus'
1481 assert_equal('plus', @+)
1482 endif
1483
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001484 var a: number = 123
Bram Moolenaar971caf52020-09-21 22:21:42 +02001485 assert_equal(123, a)
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001486 var s: string = 'yes'
Bram Moolenaar971caf52020-09-21 22:21:42 +02001487 assert_equal('yes', s)
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001488 var b: number = 42
Bram Moolenaar971caf52020-09-21 22:21:42 +02001489 assert_equal(42, b)
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001490 var w: number = 43
Bram Moolenaar971caf52020-09-21 22:21:42 +02001491 assert_equal(43, w)
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001492 var t: number = 44
Bram Moolenaar971caf52020-09-21 22:21:42 +02001493 assert_equal(44, t)
Bram Moolenaar7a66a172020-10-16 19:56:12 +02001494
1495 var to_var = 0
1496 to_var = 3
1497 assert_equal(3, to_var)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001498 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001499 v9.CheckScriptSuccess(lines)
Bram Moolenaar06f9c692020-09-27 21:27:40 +02001500
1501 lines =<< trim END
1502 vim9script
1503 var n: number
1504 def Func()
1505 n = 'string'
1506 enddef
1507 defcompile
1508 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001509 v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected number but got string')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001510enddef
1511
1512def Mess(): string
1513 v:foldstart = 123
1514 return 'xxx'
1515enddef
1516
1517def Test_assignment_failure()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001518 v9.CheckDefFailure(['var name=234'], 'E1004:')
1519 v9.CheckDefFailure(['var name =234'], 'E1004:')
1520 v9.CheckDefFailure(['var name= 234'], 'E1004:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001521
Bram Moolenaar62aec932022-01-29 21:45:34 +00001522 v9.CheckScriptFailure(['vim9script', 'var name=234'], 'E1004:')
1523 v9.CheckScriptFailure(['vim9script', 'var name=234'], "before and after '='")
1524 v9.CheckScriptFailure(['vim9script', 'var name =234'], 'E1004:')
1525 v9.CheckScriptFailure(['vim9script', 'var name= 234'], 'E1004:')
1526 v9.CheckScriptFailure(['vim9script', 'var name = 234', 'name+=234'], 'E1004:')
1527 v9.CheckScriptFailure(['vim9script', 'var name = 234', 'name+=234'], "before and after '+='")
1528 v9.CheckScriptFailure(['vim9script', 'var name = "x"', 'name..="y"'], 'E1004:')
1529 v9.CheckScriptFailure(['vim9script', 'var name = "x"', 'name..="y"'], "before and after '..='")
Bram Moolenaar971caf52020-09-21 22:21:42 +02001530
Bram Moolenaar62aec932022-01-29 21:45:34 +00001531 v9.CheckDefFailure(['var true = 1'], 'E1034:')
1532 v9.CheckDefFailure(['var false = 1'], 'E1034:')
1533 v9.CheckDefFailure(['var null = 1'], 'E1034:')
1534 v9.CheckDefFailure(['var this = 1'], 'E1034:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001535
Bram Moolenaar8b716f52022-02-15 21:17:56 +00001536 v9.CheckDefFailure(['[a; b; c] = g:list'], 'E1001:')
1537 v9.CheckDefFailure(['var [a; b; c] = g:list'], 'E1080:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001538 v9.CheckDefExecFailure(['var a: number',
Bram Moolenaar971caf52020-09-21 22:21:42 +02001539 '[a] = test_null_list()'], 'E1093:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001540 v9.CheckDefExecFailure(['var a: number',
Bram Moolenaar971caf52020-09-21 22:21:42 +02001541 '[a] = []'], 'E1093:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001542 v9.CheckDefExecFailure(['var x: number',
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001543 'var y: number',
Bram Moolenaar971caf52020-09-21 22:21:42 +02001544 '[x, y] = [1]'], 'E1093:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001545 v9.CheckDefExecFailure(['var x: string',
Bram Moolenaar352134b2020-10-17 22:04:08 +02001546 'var y: string',
1547 '[x, y] = ["x"]'], 'E1093:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001548 v9.CheckDefExecFailure(['var x: number',
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001549 'var y: number',
1550 'var z: list<number>',
Bram Moolenaar971caf52020-09-21 22:21:42 +02001551 '[x, y; z] = [1]'], 'E1093:')
1552
Bram Moolenaar62aec932022-01-29 21:45:34 +00001553 v9.CheckDefFailure(['var somevar'], "E1022:")
1554 v9.CheckDefFailure(['var &tabstop = 4'], 'E1052:')
1555 v9.CheckDefFailure(['&g:option = 5'], 'E113:')
1556 v9.CheckScriptFailure(['vim9script', 'var &tabstop = 4'], 'E1052:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001557
Bram Moolenaar62aec932022-01-29 21:45:34 +00001558 v9.CheckDefFailure(['var $VAR = 5'], 'E1016: Cannot declare an environment variable:')
1559 v9.CheckScriptFailure(['vim9script', 'var $ENV = "xxx"'], 'E1016:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001560
1561 if has('dnd')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001562 v9.CheckDefFailure(['var @~ = 5'], 'E1066:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001563 else
Bram Moolenaar62aec932022-01-29 21:45:34 +00001564 v9.CheckDefFailure(['var @~ = 5'], 'E354:')
1565 v9.CheckDefFailure(['@~ = 5'], 'E354:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001566 endif
Bram Moolenaar62aec932022-01-29 21:45:34 +00001567 v9.CheckDefFailure(['var @a = 5'], 'E1066:')
1568 v9.CheckDefFailure(['var @/ = "x"'], 'E1066:')
1569 v9.CheckScriptFailure(['vim9script', 'var @a = "abc"'], 'E1066:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001570
Bram Moolenaar62aec932022-01-29 21:45:34 +00001571 v9.CheckDefFailure(['var g:var = 5'], 'E1016: Cannot declare a global variable:')
1572 v9.CheckDefFailure(['var w:var = 5'], 'E1016: Cannot declare a window variable:')
1573 v9.CheckDefFailure(['var b:var = 5'], 'E1016: Cannot declare a buffer variable:')
1574 v9.CheckDefFailure(['var t:var = 5'], 'E1016: Cannot declare a tab variable:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001575
Bram Moolenaar62aec932022-01-29 21:45:34 +00001576 v9.CheckDefFailure(['var anr = 4', 'anr ..= "text"'], 'E1019:')
1577 v9.CheckDefFailure(['var xnr += 4'], 'E1020:', 1)
1578 v9.CheckScriptFailure(['vim9script', 'var xnr += 4'], 'E1020:')
1579 v9.CheckDefFailure(["var xnr = xnr + 1"], 'E1001:', 1)
1580 v9.CheckScriptFailure(['vim9script', 'var xnr = xnr + 4'], 'E121:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001581
Bram Moolenaara749a422022-02-12 19:52:25 +00001582 v9.CheckScriptFailure(['vim9script', 'def Func()', 'var dummy = notfound', 'enddef', 'defcompile'], 'E1001:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001583
Bram Moolenaar62aec932022-01-29 21:45:34 +00001584 v9.CheckDefFailure(['var name: list<string> = [123]'], 'expected list<string> but got list<number>')
1585 v9.CheckDefFailure(['var name: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001586
Bram Moolenaar62aec932022-01-29 21:45:34 +00001587 v9.CheckDefFailure(['var name: dict<string> = {key: 123}'], 'expected dict<string> but got dict<number>')
1588 v9.CheckDefFailure(['var name: dict<number> = {key: "xx"}'], 'expected dict<number> but got dict<string>')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001589
Bram Moolenaar62aec932022-01-29 21:45:34 +00001590 v9.CheckDefFailure(['var name = feedkeys("0")'], 'E1031:')
1591 v9.CheckDefFailure(['var name: number = feedkeys("0")'], 'expected number but got void')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001592
Bram Moolenaar62aec932022-01-29 21:45:34 +00001593 v9.CheckDefFailure(['var name: dict <number>'], 'E1068:')
Bram Moolenaar62e0e2e2022-08-20 12:07:58 +01001594 v9.CheckDefFailure(['var name: dict<number'], 'E1009: Missing > after type: <number')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001595
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001596 assert_fails('s/^/\=g:Mess()/n', 'E794:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001597 v9.CheckDefFailure(['var name: dict<number'], 'E1009:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001598
Bram Moolenaar62aec932022-01-29 21:45:34 +00001599 v9.CheckDefFailure(['w:foo: number = 10'],
Bram Moolenaar971caf52020-09-21 22:21:42 +02001600 'E488: Trailing characters: : number = 1')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001601 v9.CheckDefFailure(['t:foo: bool = true'],
Bram Moolenaar971caf52020-09-21 22:21:42 +02001602 'E488: Trailing characters: : bool = true')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001603 v9.CheckDefFailure(['b:foo: string = "x"'],
Bram Moolenaar971caf52020-09-21 22:21:42 +02001604 'E488: Trailing characters: : string = "x"')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001605 v9.CheckDefFailure(['g:foo: number = 123'],
Bram Moolenaar971caf52020-09-21 22:21:42 +02001606 'E488: Trailing characters: : number = 123')
1607enddef
1608
1609def Test_assign_list()
Bram Moolenaare65081d2021-06-27 15:04:05 +02001610 var lines =<< trim END
1611 var l: list<string> = []
1612 l[0] = 'value'
1613 assert_equal('value', l[0])
Bram Moolenaar971caf52020-09-21 22:21:42 +02001614
Bram Moolenaare65081d2021-06-27 15:04:05 +02001615 l[1] = 'asdf'
1616 assert_equal('value', l[0])
1617 assert_equal('asdf', l[1])
1618 assert_equal('asdf', l[-1])
1619 assert_equal('value', l[-2])
Bram Moolenaar971caf52020-09-21 22:21:42 +02001620
Bram Moolenaare65081d2021-06-27 15:04:05 +02001621 var nrl: list<number> = []
1622 for i in range(5)
1623 nrl[i] = i
1624 endfor
1625 assert_equal([0, 1, 2, 3, 4], nrl)
1626
1627 var ul: list<any>
1628 ul[0] = 1
1629 ul[1] = 2
1630 ul[2] = 3
1631 assert_equal([1, 2, 3], ul)
1632 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001633 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar334a8b42020-10-19 16:07:42 +02001634
Bram Moolenaar1983f1a2022-02-28 20:55:02 +00001635 lines =<< trim END
1636 var l = [1, 2]
1637 g:idx = 'x'
1638 l[g:idx : 1] = [0]
1639 echo l
1640 END
Bram Moolenaar2995e5c2022-03-18 21:41:47 +00001641 v9.CheckDefExecAndScriptFailure(lines, ['E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "x"'])
Bram Moolenaar1983f1a2022-02-28 20:55:02 +00001642
1643 lines =<< trim END
1644 var l = [1, 2]
1645 g:idx = 3
1646 l[g:idx : 1] = [0]
1647 echo l
1648 END
Bram Moolenaarec892232022-05-06 17:53:06 +01001649 v9.CheckDefExecAndScriptFailure(lines, 'E684: List index out of range: 3')
Bram Moolenaar1983f1a2022-02-28 20:55:02 +00001650
1651 lines =<< trim END
1652 var l = [1, 2]
1653 g:idx = 'y'
1654 l[1 : g:idx] = [0]
1655 echo l
1656 END
1657 v9.CheckDefExecAndScriptFailure(lines, ['E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "y"'])
1658
Bram Moolenaar62aec932022-01-29 21:45:34 +00001659 v9.CheckDefFailure(["var l: list<number> = ['', true]"], 'E1012: Type mismatch; expected list<number> but got list<any>', 1)
1660 v9.CheckDefFailure(["var l: list<list<number>> = [['', true]]"], 'E1012: Type mismatch; expected list<list<number>> but got list<list<any>>', 1)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001661enddef
1662
1663def Test_assign_dict()
Bram Moolenaarc3689572021-01-01 19:40:02 +01001664 var lines =<< trim END
1665 var d: dict<string> = {}
1666 d['key'] = 'value'
1667 assert_equal('value', d['key'])
Bram Moolenaar971caf52020-09-21 22:21:42 +02001668
Bram Moolenaarc3689572021-01-01 19:40:02 +01001669 d[123] = 'qwerty'
1670 assert_equal('qwerty', d[123])
1671 assert_equal('qwerty', d['123'])
Bram Moolenaar971caf52020-09-21 22:21:42 +02001672
Bram Moolenaarc3689572021-01-01 19:40:02 +01001673 var nrd: dict<number> = {}
1674 for i in range(3)
1675 nrd[i] = i
1676 endfor
1677 assert_equal({0: 0, 1: 1, 2: 2}, nrd)
1678
1679 d.somekey = 'someval'
1680 assert_equal({key: 'value', '123': 'qwerty', somekey: 'someval'}, d)
Bram Moolenaar23e2e112021-08-03 21:16:18 +02001681 unlet d.somekey
1682 assert_equal({key: 'value', '123': 'qwerty'}, d)
Bram Moolenaarc3689572021-01-01 19:40:02 +01001683 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001684 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc3689572021-01-01 19:40:02 +01001685
Bram Moolenaar62aec932022-01-29 21:45:34 +00001686 v9.CheckDefFailure(["var d: dict<number> = {a: '', b: true}"], 'E1012: Type mismatch; expected dict<number> but got dict<any>', 1)
1687 v9.CheckDefFailure(["var d: dict<dict<number>> = {x: {a: '', b: true}}"], 'E1012: Type mismatch; expected dict<dict<number>> but got dict<dict<any>>', 1)
Bram Moolenaarbc510062022-02-14 21:19:04 +00001688 v9.CheckDefFailure(["var d = {x: 1}", "d[1 : 2] = {y: 2}"], 'E1165: Cannot use a range with an assignment: d[1 : 2] =', 2)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001689enddef
1690
Bram Moolenaar04bdd572020-09-23 13:25:32 +02001691def Test_assign_dict_unknown_type()
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001692 var lines =<< trim END
Bram Moolenaar04bdd572020-09-23 13:25:32 +02001693 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001694 var mylist = []
Bram Moolenaare0de1712020-12-02 17:36:54 +01001695 mylist += [{one: 'one'}]
Bram Moolenaar04bdd572020-09-23 13:25:32 +02001696 def Func()
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001697 var dd = mylist[0]
Bram Moolenaar04bdd572020-09-23 13:25:32 +02001698 assert_equal('one', dd.one)
1699 enddef
1700 Func()
1701 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001702 v9.CheckScriptSuccess(lines)
Bram Moolenaar04bdd572020-09-23 13:25:32 +02001703
Bram Moolenaarce2c5442020-11-28 21:21:17 +01001704 lines =<< trim END
1705 vim9script
1706 var mylist = [[]]
Bram Moolenaare0de1712020-12-02 17:36:54 +01001707 mylist[0] += [{one: 'one'}]
Bram Moolenaarce2c5442020-11-28 21:21:17 +01001708 def Func()
1709 var dd = mylist[0][0]
1710 assert_equal('one', dd.one)
1711 enddef
1712 Func()
1713 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001714 v9.CheckScriptSuccess(lines)
Bram Moolenaar04bdd572020-09-23 13:25:32 +02001715enddef
1716
Bram Moolenaarf76ec1e2021-03-03 17:58:16 +01001717def Test_assign_dict_with_op()
1718 var lines =<< trim END
Bram Moolenaarf76ec1e2021-03-03 17:58:16 +01001719 var ds: dict<string> = {a: 'x'}
1720 ds['a'] ..= 'y'
1721 ds.a ..= 'z'
1722 assert_equal('xyz', ds.a)
1723
1724 var dn: dict<number> = {a: 9}
1725 dn['a'] += 2
1726 assert_equal(11, dn.a)
1727 dn.a += 2
1728 assert_equal(13, dn.a)
1729
1730 dn['a'] -= 3
1731 assert_equal(10, dn.a)
1732 dn.a -= 2
1733 assert_equal(8, dn.a)
1734
1735 dn['a'] *= 2
1736 assert_equal(16, dn.a)
1737 dn.a *= 2
1738 assert_equal(32, dn.a)
1739
1740 dn['a'] /= 3
1741 assert_equal(10, dn.a)
1742 dn.a /= 2
1743 assert_equal(5, dn.a)
1744
1745 dn['a'] %= 3
1746 assert_equal(2, dn.a)
1747 dn.a %= 6
1748 assert_equal(2, dn.a)
Bram Moolenaarb9c0cd82021-04-05 20:51:00 +02001749
1750 var dd: dict<dict<list<any>>>
1751 dd.a = {}
1752 dd.a.b = [0]
1753 dd.a.b += [1]
1754 assert_equal({a: {b: [0, 1]}}, dd)
Bram Moolenaar0d351a02021-04-05 21:05:26 +02001755
1756 var dab = {a: ['b']}
1757 dab.a[0] ..= 'c'
1758 assert_equal({a: ['bc']}, dab)
Bram Moolenaarf76ec1e2021-03-03 17:58:16 +01001759 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001760 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare42939a2021-04-05 17:11:17 +02001761enddef
1762
1763def Test_assign_list_with_op()
1764 var lines =<< trim END
1765 var ls: list<string> = ['x']
1766 ls[0] ..= 'y'
1767 assert_equal('xy', ls[0])
1768
1769 var ln: list<number> = [9]
1770 ln[0] += 2
1771 assert_equal(11, ln[0])
1772
1773 ln[0] -= 3
1774 assert_equal(8, ln[0])
1775
1776 ln[0] *= 2
1777 assert_equal(16, ln[0])
1778
1779 ln[0] /= 3
1780 assert_equal(5, ln[0])
1781
1782 ln[0] %= 3
1783 assert_equal(2, ln[0])
1784 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001785 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare42939a2021-04-05 17:11:17 +02001786enddef
1787
1788def Test_assign_with_op_fails()
1789 var lines =<< trim END
1790 var s = 'abc'
1791 s[1] += 'x'
1792 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001793 v9.CheckDefAndScriptFailure(lines, ['E1141:', 'E689:'], 2)
Bram Moolenaare42939a2021-04-05 17:11:17 +02001794
1795 lines =<< trim END
1796 var s = 'abc'
1797 s[1] ..= 'x'
1798 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001799 v9.CheckDefAndScriptFailure(lines, ['E1141:', 'E689:'], 2)
Bram Moolenaarb9c0cd82021-04-05 20:51:00 +02001800
1801 lines =<< trim END
1802 var dd: dict<dict<list<any>>>
1803 dd.a = {}
1804 dd.a.b += [1]
1805 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001806 v9.CheckDefExecAndScriptFailure(lines, 'E716:', 3)
Bram Moolenaarf76ec1e2021-03-03 17:58:16 +01001807enddef
1808
Bram Moolenaar971caf52020-09-21 22:21:42 +02001809def Test_assign_lambda()
1810 # check if assign a lambda to a variable which type is func or any.
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001811 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +02001812 vim9script
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001813 var FuncRef = () => 123
Bram Moolenaar971caf52020-09-21 22:21:42 +02001814 assert_equal(123, FuncRef())
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001815 var FuncRef_Func: func = () => 123
Bram Moolenaar971caf52020-09-21 22:21:42 +02001816 assert_equal(123, FuncRef_Func())
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001817 var FuncRef_Any: any = () => 123
Bram Moolenaar971caf52020-09-21 22:21:42 +02001818 assert_equal(123, FuncRef_Any())
Bram Moolenaar06409502021-02-17 17:00:27 +01001819 var FuncRef_Number: func(): number = () => 321
1820 assert_equal(321, FuncRef_Number())
Bram Moolenaar971caf52020-09-21 22:21:42 +02001821 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001822 v9.CheckScriptSuccess(lines)
Bram Moolenaar328eac22021-01-07 19:23:08 +01001823
1824 lines =<< trim END
1825 var Ref: func(number)
1826 Ref = (j) => !j
1827 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001828 v9.CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected func(number) but got func(any): bool')
Bram Moolenaarc7dac852021-02-17 18:49:11 +01001829
1830 lines =<< trim END
1831 echo filter([1, 2, 3], (_, v: string) => v + 1)
1832 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001833 v9.CheckDefAndScriptFailure(lines, 'E1051:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001834enddef
1835
Bram Moolenaarc0e29012020-09-27 14:22:48 +02001836def Test_heredoc()
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01001837 # simple heredoc
1838 var lines =<< trim END
1839 var text =<< trim TEXT # comment
1840 abc
1841 TEXT
1842 assert_equal(['abc'], text)
Bram Moolenaarc0e29012020-09-27 14:22:48 +02001843 END
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01001844 v9.CheckDefAndScriptSuccess(lines)
1845
1846 # empty heredoc
1847 lines =<< trim END
1848 var text =<< trim TEXT
1849 TEXT
1850 assert_equal([], text)
1851 END
1852 v9.CheckDefAndScriptSuccess(lines)
1853
1854 # heredoc with a single empty line
1855 lines =<< trim END
1856 var text =<< trim TEXT
1857
1858 TEXT
1859 assert_equal([''], text)
1860 END
1861 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc0e29012020-09-27 14:22:48 +02001862
Bram Moolenaar62aec932022-01-29 21:45:34 +00001863 v9.CheckDefFailure(['var lines =<< trim END X', 'END'], 'E488:')
1864 v9.CheckDefFailure(['var lines =<< trim END " comment', 'END'], 'E488:')
Bram Moolenaar2914a202020-09-27 18:24:03 +02001865
1866 lines =<< trim [END]
1867 def Func()
1868 var&lines =<< trim END
1869 x
1870 x
Bram Moolenaarb5b94802020-12-13 17:50:20 +01001871 enddef
1872 defcompile
1873 [END]
Bram Moolenaar62aec932022-01-29 21:45:34 +00001874 v9.CheckScriptFailure(lines, 'E1145: Missing heredoc end marker: END')
Bram Moolenaarb5b94802020-12-13 17:50:20 +01001875 delfunc! g:Func
1876
1877 lines =<< trim [END]
1878 def Func()
1879 var lines =<< trim END
1880 x
1881 x
Bram Moolenaar2914a202020-09-27 18:24:03 +02001882 x
1883 x
1884 x
1885 x
1886 x
1887 x
1888 enddef
1889 call Func()
1890 [END]
Bram Moolenaar62aec932022-01-29 21:45:34 +00001891 v9.CheckScriptFailure(lines, 'E1145: Missing heredoc end marker: END')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01001892 delfunc! g:Func
Bram Moolenaar81530e32021-07-28 21:25:49 +02001893
1894 lines =<< trim END
1895 var lines: number =<< trim STOP
1896 aaa
1897 bbb
1898 STOP
1899 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001900 v9.CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got list<string>', 1)
Bram Moolenaarc0e29012020-09-27 14:22:48 +02001901enddef
1902
Bram Moolenaar083966f2020-12-08 11:29:40 +01001903def Test_var_func_call()
Bram Moolenaar55759b52020-09-30 22:59:42 +02001904 var lines =<< trim END
1905 vim9script
1906 func GetValue()
1907 if exists('g:count')
1908 let g:count += 1
1909 else
1910 let g:count = 1
1911 endif
1912 return 'this'
1913 endfunc
1914 var val: string = GetValue()
1915 # env var is always a string
1916 var env = $TERM
1917 END
1918 writefile(lines, 'Xfinished')
1919 source Xfinished
1920 # GetValue() is not called during discovery phase
1921 assert_equal(1, g:count)
1922
1923 unlet g:count
1924 delete('Xfinished')
1925enddef
1926
Bram Moolenaar083966f2020-12-08 11:29:40 +01001927def Test_var_missing_type()
Bram Moolenaar55759b52020-09-30 22:59:42 +02001928 var lines =<< trim END
1929 vim9script
1930 var name = g:unknown
1931 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001932 v9.CheckScriptFailure(lines, 'E121:')
Bram Moolenaar55759b52020-09-30 22:59:42 +02001933
1934 lines =<< trim END
1935 vim9script
1936 var nr: number = 123
1937 var name = nr
1938 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001939 v9.CheckScriptSuccess(lines)
Bram Moolenaar55759b52020-09-30 22:59:42 +02001940enddef
1941
Bram Moolenaar083966f2020-12-08 11:29:40 +01001942def Test_var_declaration()
Bram Moolenaar55759b52020-09-30 22:59:42 +02001943 var lines =<< trim END
1944 vim9script
1945 var name: string
1946 g:var_uninit = name
1947 name = 'text'
1948 g:var_test = name
Bram Moolenaara749a422022-02-12 19:52:25 +00001949 # prefixing s: is not allowed
1950 name = 'prefixed'
1951 g:var_prefixed = name
Bram Moolenaar55759b52020-09-30 22:59:42 +02001952
Bram Moolenaar7257af42020-12-08 22:08:51 +01001953 const FOO: number = 123
1954 assert_equal(123, FOO)
Bram Moolenaar89b474d2020-12-22 21:19:39 +01001955 const FOOS = 'foos'
1956 assert_equal('foos', FOOS)
1957 final FLIST = [1]
1958 assert_equal([1], FLIST)
1959 FLIST[0] = 11
1960 assert_equal([11], FLIST)
1961
1962 const g:FOO: number = 321
1963 assert_equal(321, g:FOO)
1964 const g:FOOS = 'gfoos'
1965 assert_equal('gfoos', g:FOOS)
1966 final g:FLIST = [2]
1967 assert_equal([2], g:FLIST)
1968 g:FLIST[0] = 22
1969 assert_equal([22], g:FLIST)
1970
Bram Moolenaard877a572021-04-01 19:42:48 +02001971 def SetGlobalConst()
1972 const g:globConst = 123
1973 enddef
1974 SetGlobalConst()
1975 assert_equal(123, g:globConst)
1976 assert_true(islocked('g:globConst'))
1977
Bram Moolenaar89b474d2020-12-22 21:19:39 +01001978 const w:FOO: number = 46
1979 assert_equal(46, w:FOO)
1980 const w:FOOS = 'wfoos'
1981 assert_equal('wfoos', w:FOOS)
1982 final w:FLIST = [3]
1983 assert_equal([3], w:FLIST)
1984 w:FLIST[0] = 33
1985 assert_equal([33], w:FLIST)
Bram Moolenaar7257af42020-12-08 22:08:51 +01001986
Bram Moolenaar55759b52020-09-30 22:59:42 +02001987 var s:other: number
1988 other = 1234
1989 g:other_var = other
1990
Bram Moolenaarccc25aa2021-03-26 21:27:52 +01001991 var xyz: string # comment
1992
Bram Moolenaar55759b52020-09-30 22:59:42 +02001993 # type is inferred
Bram Moolenaara749a422022-02-12 19:52:25 +00001994 var dict = {['a']: 222}
Bram Moolenaar55759b52020-09-30 22:59:42 +02001995 def GetDictVal(key: any)
Bram Moolenaara749a422022-02-12 19:52:25 +00001996 g:dict_val = dict[key]
Bram Moolenaar55759b52020-09-30 22:59:42 +02001997 enddef
1998 GetDictVal('a')
Bram Moolenaar08251752021-01-11 21:20:18 +01001999
2000 final adict: dict<string> = {}
2001 def ChangeAdict()
2002 adict.foo = 'foo'
2003 enddef
2004 ChangeAdict()
Bram Moolenaar55759b52020-09-30 22:59:42 +02002005 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002006 v9.CheckScriptSuccess(lines)
Bram Moolenaar55759b52020-09-30 22:59:42 +02002007 assert_equal('', g:var_uninit)
2008 assert_equal('text', g:var_test)
2009 assert_equal('prefixed', g:var_prefixed)
2010 assert_equal(1234, g:other_var)
2011 assert_equal(222, g:dict_val)
2012
2013 unlet g:var_uninit
2014 unlet g:var_test
2015 unlet g:var_prefixed
2016 unlet g:other_var
Bram Moolenaar6e50ec22021-04-03 19:32:44 +02002017 unlet g:globConst
Bram Moolenaar89b474d2020-12-22 21:19:39 +01002018 unlet g:FOO
2019 unlet g:FOOS
2020 unlet g:FLIST
2021 unlet w:FOO
2022 unlet w:FOOS
2023 unlet w:FLIST
Bram Moolenaar55759b52020-09-30 22:59:42 +02002024enddef
2025
Bram Moolenaar083966f2020-12-08 11:29:40 +01002026def Test_var_declaration_fails()
Bram Moolenaar55759b52020-09-30 22:59:42 +02002027 var lines =<< trim END
2028 vim9script
2029 final var: string
2030 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002031 v9.CheckScriptFailure(lines, 'E1125:')
Bram Moolenaar55759b52020-09-30 22:59:42 +02002032
2033 lines =<< trim END
2034 vim9script
Bram Moolenaar89b474d2020-12-22 21:19:39 +01002035 const g:constvar = 'string'
2036 g:constvar = 'xx'
2037 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002038 v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaar89b474d2020-12-22 21:19:39 +01002039 unlet g:constvar
2040
2041 lines =<< trim END
2042 vim9script
Bram Moolenaarf5906aa2021-04-02 14:35:15 +02002043 var name = 'one'
2044 lockvar name
2045 def SetLocked()
2046 name = 'two'
2047 enddef
2048 SetLocked()
2049 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002050 v9.CheckScriptFailure(lines, 'E741: Value is locked: name', 1)
Bram Moolenaardcf29ac2021-04-02 14:44:02 +02002051
2052 lines =<< trim END
2053 let s:legacy = 'one'
2054 lockvar s:legacy
2055 def SetLocked()
2056 s:legacy = 'two'
2057 enddef
2058 call SetLocked()
2059 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002060 v9.CheckScriptFailure(lines, 'E741: Value is locked: s:legacy', 1)
Bram Moolenaarf5906aa2021-04-02 14:35:15 +02002061
2062 lines =<< trim END
2063 vim9script
Bram Moolenaard877a572021-04-01 19:42:48 +02002064 def SetGlobalConst()
2065 const g:globConst = 123
2066 enddef
2067 SetGlobalConst()
2068 g:globConst = 234
2069 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002070 v9.CheckScriptFailure(lines, 'E741: Value is locked: g:globConst', 6)
Bram Moolenaard877a572021-04-01 19:42:48 +02002071 unlet g:globConst
2072
2073 lines =<< trim END
2074 vim9script
Bram Moolenaar08251752021-01-11 21:20:18 +01002075 const cdict: dict<string> = {}
2076 def Change()
2077 cdict.foo = 'foo'
2078 enddef
2079 defcompile
2080 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002081 v9.CheckScriptFailure(lines, 'E46:')
Bram Moolenaar08251752021-01-11 21:20:18 +01002082
2083 lines =<< trim END
2084 vim9script
Bram Moolenaar89b474d2020-12-22 21:19:39 +01002085 final w:finalvar = [9]
2086 w:finalvar = [8]
2087 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002088 v9.CheckScriptFailure(lines, 'E1122:')
Bram Moolenaar89b474d2020-12-22 21:19:39 +01002089 unlet w:finalvar
2090
2091 lines =<< trim END
2092 vim9script
Bram Moolenaar55759b52020-09-30 22:59:42 +02002093 const var: string
2094 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002095 v9.CheckScriptFailure(lines, 'E1021:')
Bram Moolenaar55759b52020-09-30 22:59:42 +02002096
2097 lines =<< trim END
2098 vim9script
2099 var 9var: string
2100 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002101 v9.CheckScriptFailure(lines, 'E488:')
Bram Moolenaar7257af42020-12-08 22:08:51 +01002102
Bram Moolenaar62aec932022-01-29 21:45:34 +00002103 v9.CheckDefFailure(['var foo.bar = 2'], 'E1087:')
2104 v9.CheckDefFailure(['var foo[3] = 2'], 'E1087:')
2105 v9.CheckDefFailure(['const foo: number'], 'E1021:')
Bram Moolenaare1d12112022-03-05 11:37:48 +00002106
2107 lines =<< trim END
2108 va foo = 123
2109 END
2110 v9.CheckDefAndScriptFailure(lines, 'E1065:', 1)
Bram Moolenaar31d99482022-05-26 22:24:43 +01002111
2112 lines =<< trim END
2113 var foo: func(number
2114 END
2115 v9.CheckDefAndScriptFailure(lines, 'E110:', 1)
2116
2117 lines =<< trim END
2118 var foo: func(number): func(
2119 END
2120 v9.CheckDefAndScriptFailure(lines, 'E110:', 1)
2121
2122 for type in ['num_ber',
2123 'anys', 'ani',
2124 'bools', 'boel',
2125 'blobs', 'blub',
2126 'channels', 'channol',
2127 'dicts', 'duct',
2128 'floats', 'floot',
2129 'funcs', 'funk',
2130 'jobs', 'jop',
2131 'lists', 'last'
2132 'numbers', 'numbar',
2133 'strings', 'strung',
2134 'voids', 'viod']
2135 v9.CheckDefAndScriptFailure([$'var foo: {type}'], 'E1010:', 1)
2136 endfor
Bram Moolenaar55759b52020-09-30 22:59:42 +02002137enddef
2138
Bram Moolenaare88c6b72022-02-15 15:37:11 +00002139def Test_var_declaration_inferred()
2140 # check that type is set on the list so that extend() fails
2141 var lines =<< trim END
2142 vim9script
2143 def GetList(): list<number>
2144 var l = [1, 2, 3]
2145 return l
2146 enddef
2147 echo GetList()->extend(['x'])
2148 END
2149 v9.CheckScriptFailure(lines, 'E1013:', 6)
Bram Moolenaar31d99482022-05-26 22:24:43 +01002150
2151 lines =<< trim END
2152 vim9script
2153 def GetNr(): number
2154 return 5
2155 enddef
2156 def TestOne()
2157 var some = [function('len'), GetNr]
2158 g:res = typename(some)
2159 enddef
2160 TestOne()
2161 assert_equal('list<func(): number>', g:res)
2162
2163 def TestTwo()
2164 var some = [function('len'), GetNr]
2165 g:res = typename(some)
2166 enddef
2167 TestTwo()
2168 assert_equal('list<func(): number>', g:res)
2169 unlet g:res
2170
2171 # FIXME: why is the type different?
2172 var first = [function('len'), GetNr]
2173 assert_equal('list<func(...): number>', typename(first))
2174 var second = [GetNr, function('len')]
2175 assert_equal('list<func(...): number>', typename(second))
2176 END
2177 v9.CheckScriptSuccess(lines)
Bram Moolenaare88c6b72022-02-15 15:37:11 +00002178enddef
2179
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002180def Test_script_local_in_legacy()
Bram Moolenaara749a422022-02-12 19:52:25 +00002181 # OK to define script-local later but before compiling
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002182 var lines =<< trim END
2183 def SetLater()
Bram Moolenaara749a422022-02-12 19:52:25 +00002184 legvar = 'two'
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002185 enddef
Bram Moolenaar96cf4ba2021-04-24 14:15:41 +02002186 let s:legvar = 'one'
Bram Moolenaara749a422022-02-12 19:52:25 +00002187 defcompile
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002188 call SetLater()
Bram Moolenaar96cf4ba2021-04-24 14:15:41 +02002189 call assert_equal('two', s:legvar)
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002190 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002191 v9.CheckScriptSuccess(lines)
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002192
2193 # OK to leave out s: prefix when script-local already defined
2194 lines =<< trim END
Bram Moolenaar96cf4ba2021-04-24 14:15:41 +02002195 let s:legvar = 'one'
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002196 def SetNoPrefix()
Bram Moolenaar96cf4ba2021-04-24 14:15:41 +02002197 legvar = 'two'
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002198 enddef
2199 call SetNoPrefix()
Bram Moolenaar96cf4ba2021-04-24 14:15:41 +02002200 call assert_equal('two', s:legvar)
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002201 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002202 v9.CheckScriptSuccess(lines)
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002203
Bram Moolenaara749a422022-02-12 19:52:25 +00002204 # Not OK to leave out s: prefix when script-local defined after compiling
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002205 lines =<< trim END
2206 def SetLaterNoPrefix()
Bram Moolenaar96cf4ba2021-04-24 14:15:41 +02002207 legvar = 'two'
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002208 enddef
2209 defcompile
Bram Moolenaar96cf4ba2021-04-24 14:15:41 +02002210 let s:legvar = 'one'
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002211 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002212 v9.CheckScriptFailure(lines, 'E476:', 1)
Bram Moolenaar47bc9c32021-07-17 21:24:56 +02002213
2214 edit! Xfile
2215 lines =<< trim END
2216 var edit: bool
2217 legacy edit
2218 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002219 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002220enddef
2221
Bram Moolenaar083966f2020-12-08 11:29:40 +01002222def Test_var_type_check()
Bram Moolenaar55759b52020-09-30 22:59:42 +02002223 var lines =<< trim END
2224 vim9script
2225 var name: string
2226 name = 1234
2227 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002228 v9.CheckScriptFailure(lines, 'E1012:')
Bram Moolenaar55759b52020-09-30 22:59:42 +02002229
2230 lines =<< trim END
2231 vim9script
2232 var name:string
2233 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002234 v9.CheckScriptFailure(lines, 'E1069:')
Bram Moolenaar55759b52020-09-30 22:59:42 +02002235
Bram Moolenaar62aec932022-01-29 21:45:34 +00002236 v9.CheckDefAndScriptFailure(['var n:number = 42'], 'E1069:')
Bram Moolenaar60faf862021-08-23 22:22:45 +02002237
Bram Moolenaar55759b52020-09-30 22:59:42 +02002238 lines =<< trim END
2239 vim9script
2240 var name: asdf
2241 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002242 v9.CheckScriptFailure(lines, 'E1010:')
Bram Moolenaar55759b52020-09-30 22:59:42 +02002243
2244 lines =<< trim END
2245 vim9script
Bram Moolenaara749a422022-02-12 19:52:25 +00002246 var l: list<number>
2247 l = []
Bram Moolenaar55759b52020-09-30 22:59:42 +02002248 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002249 v9.CheckScriptSuccess(lines)
Bram Moolenaar55759b52020-09-30 22:59:42 +02002250
2251 lines =<< trim END
2252 vim9script
Bram Moolenaara749a422022-02-12 19:52:25 +00002253 var d: dict<number>
2254 d = {}
Bram Moolenaar55759b52020-09-30 22:59:42 +02002255 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002256 v9.CheckScriptSuccess(lines)
Bram Moolenaar378697a2021-07-15 19:23:18 +02002257
2258 lines =<< trim END
2259 vim9script
2260 var d = {a: 1, b: [2]}
2261 def Func(b: bool)
2262 var l: list<number> = b ? d.b : [3]
2263 enddef
2264 defcompile
2265 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002266 v9.CheckScriptSuccess(lines)
Bram Moolenaar55759b52020-09-30 22:59:42 +02002267enddef
2268
2269let g:dict_number = #{one: 1, two: 2}
2270
Bram Moolenaar083966f2020-12-08 11:29:40 +01002271def Test_var_list_dict_type()
Bram Moolenaar55759b52020-09-30 22:59:42 +02002272 var ll: list<number>
2273 ll = [1, 2, 2, 3, 3, 3]->uniq()
2274 ll->assert_equal([1, 2, 3])
2275
2276 var dd: dict<number>
2277 dd = g:dict_number
2278 dd->assert_equal(g:dict_number)
2279
2280 var lines =<< trim END
2281 var ll: list<number>
2282 ll = [1, 2, 3]->map('"one"')
2283 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002284 v9.CheckDefExecFailure(lines, 'E1012: Type mismatch; expected list<number> but got list<string>')
Bram Moolenaar55759b52020-09-30 22:59:42 +02002285enddef
2286
Bram Moolenaar083966f2020-12-08 11:29:40 +01002287def Test_cannot_use_let()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002288 v9.CheckDefAndScriptFailure(['let a = 34'], 'E1126:', 1)
Bram Moolenaar083966f2020-12-08 11:29:40 +01002289enddef
2290
Bram Moolenaar55759b52020-09-30 22:59:42 +02002291def Test_unlet()
2292 g:somevar = 'yes'
2293 assert_true(exists('g:somevar'))
2294 unlet g:somevar
2295 assert_false(exists('g:somevar'))
2296 unlet! g:somevar
2297
2298 # also works for script-local variable in legacy Vim script
2299 s:somevar = 'legacy'
2300 assert_true(exists('s:somevar'))
2301 unlet s:somevar
2302 assert_false(exists('s:somevar'))
2303 unlet! s:somevar
2304
Bram Moolenaar83d0cec2022-02-04 21:17:58 +00002305 if 0
2306 unlet g:does_not_exist
2307 endif
2308
2309 v9.CheckDefExecFailure(['unlet v:notfound.key'], 'E1001:')
2310
Bram Moolenaar62aec932022-01-29 21:45:34 +00002311 v9.CheckDefExecFailure([
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002312 'var dd = 111',
2313 'unlet dd',
2314 ], 'E1081:', 2)
2315
Bram Moolenaar752fc692021-01-04 21:57:11 +01002316 # dict unlet
Bram Moolenaarea5c8982022-02-17 14:42:02 +00002317 var dd = {a: 1, b: 2, c: 3, 4: 4}
Bram Moolenaar752fc692021-01-04 21:57:11 +01002318 unlet dd['a']
2319 unlet dd.c
Bram Moolenaarea5c8982022-02-17 14:42:02 +00002320 unlet dd[4]
Bram Moolenaar752fc692021-01-04 21:57:11 +01002321 assert_equal({b: 2}, dd)
2322
Bram Moolenaar6b8c7ba2022-03-20 17:46:06 +00002323 # null key works like empty string
2324 dd = {'': 1, x: 9}
2325 unlet dd[null_string]
2326 assert_equal({x: 9}, dd)
2327
Bram Moolenaar752fc692021-01-04 21:57:11 +01002328 # list unlet
2329 var ll = [1, 2, 3, 4]
2330 unlet ll[1]
2331 unlet ll[-1]
2332 assert_equal([1, 3], ll)
2333
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002334 ll = [1, 2, 3, 4]
2335 unlet ll[0 : 1]
2336 assert_equal([3, 4], ll)
2337
2338 ll = [1, 2, 3, 4]
2339 unlet ll[2 : 8]
2340 assert_equal([1, 2], ll)
2341
2342 ll = [1, 2, 3, 4]
2343 unlet ll[-2 : -1]
2344 assert_equal([1, 2], ll)
2345
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00002346 g:nrdict = {1: 1, 2: 2}
2347 g:idx = 1
2348 unlet g:nrdict[g:idx]
2349 assert_equal({2: 2}, g:nrdict)
2350 unlet g:nrdict
2351 unlet g:idx
2352
Bram Moolenaar62aec932022-01-29 21:45:34 +00002353 v9.CheckDefFailure([
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002354 'var ll = [1, 2]',
2355 'll[1 : 2] = 7',
Bram Moolenaar4f0884d2021-08-11 21:49:23 +02002356 ], 'E1012: Type mismatch; expected list<number> but got number', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002357 v9.CheckDefFailure([
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002358 'var dd = {a: 1}',
2359 'unlet dd["a" : "a"]',
2360 ], 'E1166:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002361 v9.CheckDefExecFailure([
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002362 'unlet g:adict[0 : 1]',
2363 ], 'E1148:', 1)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002364 v9.CheckDefFailure([
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002365 'var ll = [1, 2]',
2366 'unlet ll[0:1]',
2367 ], 'E1004:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002368 v9.CheckDefFailure([
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002369 'var ll = [1, 2]',
2370 'unlet ll[0 :1]',
2371 ], 'E1004:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002372 v9.CheckDefFailure([
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002373 'var ll = [1, 2]',
2374 'unlet ll[0: 1]',
2375 ], 'E1004:', 2)
Bram Moolenaare08be092022-02-17 13:08:26 +00002376
2377 v9.CheckDefExecFailure([
2378 'g:ll = [1, 2]',
2379 'g:idx = "x"',
2380 'unlet g:ll[g:idx]',
2381 ], 'E1029: Expected number but got string', 3)
2382
2383 v9.CheckDefExecFailure([
2384 'g:ll = [1, 2, 3]',
2385 'g:idx = "x"',
2386 'unlet g:ll[g:idx : 2]',
2387 ], 'E1029: Expected number but got string', 3)
2388
2389 v9.CheckDefExecFailure([
2390 'g:ll = [1, 2, 3]',
2391 'g:idx = "x"',
2392 'unlet g:ll[0 : g:idx]',
2393 ], 'E1029: Expected number but got string', 3)
2394
Bram Moolenaar7f2c3412021-11-29 16:01:49 +00002395 # command recognized as assignment when skipping, should not give an error
Bram Moolenaar62aec932022-01-29 21:45:34 +00002396 v9.CheckScriptSuccess([
Bram Moolenaar7f2c3412021-11-29 16:01:49 +00002397 'vim9script',
2398 'for i in []',
2399 " put =''",
2400 'endfor'])
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002401
Bram Moolenaar62aec932022-01-29 21:45:34 +00002402 v9.CheckDefFailure([
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002403 'var ll = [1, 2]',
2404 'unlet ll["x" : 1]',
2405 ], 'E1012:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002406 v9.CheckDefFailure([
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002407 'var ll = [1, 2]',
2408 'unlet ll[0 : "x"]',
2409 ], 'E1012:', 2)
2410
Bram Moolenaar752fc692021-01-04 21:57:11 +01002411 # list of dict unlet
2412 var dl = [{a: 1, b: 2}, {c: 3}]
2413 unlet dl[0]['b']
2414 assert_equal([{a: 1}, {c: 3}], dl)
2415
Bram Moolenaar62aec932022-01-29 21:45:34 +00002416 v9.CheckDefExecFailure([
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002417 'var ll = test_null_list()',
2418 'unlet ll[0]',
2419 ], 'E684:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002420 v9.CheckDefExecFailure([
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002421 'var ll = [1]',
2422 'unlet ll[2]',
2423 ], 'E684:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002424 v9.CheckDefExecFailure([
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002425 'var ll = [1]',
2426 'unlet ll[g:astring]',
Bram Moolenaarf30a14d2021-01-17 21:51:24 +01002427 ], 'E1012:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002428 v9.CheckDefExecFailure([
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002429 'var dd = test_null_dict()',
2430 'unlet dd["a"]',
2431 ], 'E716:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002432 v9.CheckDefExecFailure([
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002433 'var dd = {a: 1}',
2434 'unlet dd["b"]',
2435 ], 'E716:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002436 v9.CheckDefExecFailure([
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002437 'var dd = {a: 1}',
2438 'unlet dd[g:alist]',
2439 ], 'E1105:', 2)
Bram Moolenaar752fc692021-01-04 21:57:11 +01002440
Bram Moolenaarea5c8982022-02-17 14:42:02 +00002441 v9.CheckDefExecFailure([
2442 'g:dd = {"a": 1, 2: 2}'
2443 'unlet g:dd[0z11]',
2444 ], 'E1029:', 2)
Bram Moolenaar6296d1e2022-02-17 16:30:11 +00002445 v9.CheckDefExecFailure([
2446 'g:str = "a string"'
2447 'unlet g:str[0]',
2448 ], 'E1148: Cannot index a string', 2)
Bram Moolenaarea5c8982022-02-17 14:42:02 +00002449
Bram Moolenaar2ef951d2021-01-03 20:55:26 +01002450 # can compile unlet before variable exists
Bram Moolenaar752fc692021-01-04 21:57:11 +01002451 g:someDict = {key: 'val'}
2452 var k = 'key'
2453 unlet g:someDict[k]
2454 assert_equal({}, g:someDict)
2455 unlet g:someDict
2456 assert_false(exists('g:someDict'))
Bram Moolenaar2ef951d2021-01-03 20:55:26 +01002457
Bram Moolenaar62aec932022-01-29 21:45:34 +00002458 v9.CheckScriptFailure([
Bram Moolenaar55759b52020-09-30 22:59:42 +02002459 'vim9script',
2460 'var svar = 123',
2461 'unlet svar',
2462 ], 'E1081:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002463 v9.CheckScriptFailure([
Bram Moolenaar55759b52020-09-30 22:59:42 +02002464 'vim9script',
2465 'var svar = 123',
2466 'unlet s:svar',
Bram Moolenaara749a422022-02-12 19:52:25 +00002467 ], 'E1268:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002468 v9.CheckScriptFailure([
Bram Moolenaar55759b52020-09-30 22:59:42 +02002469 'vim9script',
2470 'var svar = 123',
2471 'def Func()',
2472 ' unlet svar',
2473 'enddef',
2474 'defcompile',
2475 ], 'E1081:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002476 v9.CheckScriptFailure([
Bram Moolenaar55759b52020-09-30 22:59:42 +02002477 'vim9script',
2478 'var svar = 123',
Bram Moolenaar9aed7292020-12-18 15:38:00 +01002479 'func Func()',
2480 ' unlet s:svar',
2481 'endfunc',
2482 'Func()',
2483 ], 'E1081:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002484 v9.CheckScriptFailure([
Bram Moolenaar9aed7292020-12-18 15:38:00 +01002485 'vim9script',
2486 'var svar = 123',
Bram Moolenaar55759b52020-09-30 22:59:42 +02002487 'def Func()',
2488 ' unlet s:svar',
2489 'enddef',
2490 'defcompile',
2491 ], 'E1081:')
2492
Bram Moolenaar62aec932022-01-29 21:45:34 +00002493 v9.CheckScriptFailure([
Bram Moolenaar71b76852021-12-17 20:15:38 +00002494 'vim9script',
2495 'def Delcount(dict: dict<any>)',
2496 ' unlet dict.count',
2497 'enddef',
2498 'Delcount(v:)',
2499 ], 'E742:')
2500
Bram Moolenaar62aec932022-01-29 21:45:34 +00002501 v9.CheckScriptFailure([
Bram Moolenaar71b76852021-12-17 20:15:38 +00002502 'vim9script',
2503 'def DelChangedtick(dict: dict<any>)',
2504 ' unlet dict.changedtick',
2505 'enddef',
2506 'DelChangedtick(b:)',
2507 ], 'E795:')
2508
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002509 writefile(['vim9script', 'export var svar = 1234'], 'XunletExport.vim')
2510 var lines =<< trim END
2511 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002512 import './XunletExport.vim' as exp
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002513 def UnletSvar()
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002514 unlet exp.svar
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002515 enddef
2516 defcompile
2517 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002518 v9.CheckScriptFailure(lines, 'E1260:', 1)
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002519 delete('XunletExport.vim')
2520
Bram Moolenaar55759b52020-09-30 22:59:42 +02002521 $ENVVAR = 'foobar'
2522 assert_equal('foobar', $ENVVAR)
2523 unlet $ENVVAR
2524 assert_equal('', $ENVVAR)
2525enddef
2526
Bram Moolenaarc5f59fa2021-01-21 12:34:14 +01002527def Test_expr_error_no_assign()
2528 var lines =<< trim END
2529 vim9script
2530 var x = invalid
2531 echo x
2532 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002533 v9.CheckScriptFailureList(lines, ['E121:', 'E121:'])
Bram Moolenaarc5f59fa2021-01-21 12:34:14 +01002534
2535 lines =<< trim END
2536 vim9script
2537 var x = 1 / 0
2538 echo x
2539 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002540 v9.CheckScriptFailure(lines, 'E1154:')
Bram Moolenaarc5f59fa2021-01-21 12:34:14 +01002541
2542 lines =<< trim END
2543 vim9script
2544 var x = 1 % 0
2545 echo x
2546 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002547 v9.CheckScriptFailure(lines, 'E1154:')
Bram Moolenaarccc25aa2021-03-26 21:27:52 +01002548
2549 lines =<< trim END
2550 var x: string 'string'
2551 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002552 v9.CheckDefAndScriptFailure(lines, 'E488:')
Bram Moolenaarc5f59fa2021-01-21 12:34:14 +01002553enddef
2554
2555
Bram Moolenaar17126b12021-01-07 22:03:02 +01002556def Test_assign_command_modifier()
2557 var lines =<< trim END
Bram Moolenaar9e0f8832021-01-09 12:09:22 +01002558 var verbose = 0
2559 verbose = 1
2560 assert_equal(1, verbose)
2561 silent verbose = 2
2562 assert_equal(2, verbose)
2563 silent verbose += 2
2564 assert_equal(4, verbose)
2565 silent verbose -= 1
2566 assert_equal(3, verbose)
Bram Moolenaar17126b12021-01-07 22:03:02 +01002567
Bram Moolenaar9e0f8832021-01-09 12:09:22 +01002568 var topleft = {one: 1}
2569 sandbox topleft.one = 3
2570 assert_equal({one: 3}, topleft)
2571 leftabove topleft[' '] = 4
2572 assert_equal({one: 3, ' ': 4}, topleft)
2573
2574 var x: number
2575 var y: number
2576 silent [x, y] = [1, 2]
2577 assert_equal(1, x)
2578 assert_equal(2, y)
Bram Moolenaar17126b12021-01-07 22:03:02 +01002579 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002580 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar17126b12021-01-07 22:03:02 +01002581enddef
2582
Bram Moolenaar74f4a962021-06-17 21:03:07 +02002583def Test_assign_alt_buf_register()
2584 var lines =<< trim END
2585 edit 'file_b1'
2586 var b1 = bufnr()
2587 edit 'file_b2'
2588 var b2 = bufnr()
2589 assert_equal(b1, bufnr('#'))
2590 @# = b2
2591 assert_equal(b2, bufnr('#'))
2592 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002593 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar74f4a962021-06-17 21:03:07 +02002594enddef
2595
Bram Moolenaar32154662021-03-28 21:14:06 +02002596def Test_script_funcref_case()
2597 var lines =<< trim END
2598 var Len = (s: string): number => len(s) + 1
2599 assert_equal(5, Len('asdf'))
2600 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002601 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar32154662021-03-28 21:14:06 +02002602
2603 lines =<< trim END
2604 var len = (s: string): number => len(s) + 1
2605 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002606 v9.CheckDefAndScriptFailure(lines, 'E704:')
Bram Moolenaar32154662021-03-28 21:14:06 +02002607
2608 lines =<< trim END
2609 vim9script
Bram Moolenaara749a422022-02-12 19:52:25 +00002610 var Len = (s: string): number => len(s) + 2
Bram Moolenaar32154662021-03-28 21:14:06 +02002611 assert_equal(6, Len('asdf'))
2612 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002613 v9.CheckScriptSuccess(lines)
Bram Moolenaar32154662021-03-28 21:14:06 +02002614
2615 lines =<< trim END
2616 vim9script
Bram Moolenaara749a422022-02-12 19:52:25 +00002617 var len = (s: string): number => len(s) + 1
Bram Moolenaar32154662021-03-28 21:14:06 +02002618 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002619 v9.CheckScriptFailure(lines, 'E704:')
Bram Moolenaar32154662021-03-28 21:14:06 +02002620enddef
2621
Bram Moolenaar44a89772021-12-18 12:31:33 +00002622def Test_script_funcref_runtime_type_check()
2623 var lines =<< trim END
2624 vim9script
2625 def FuncWithNumberArg(n: number)
2626 enddef
2627 def Test()
2628 var Ref: func(string) = function(FuncWithNumberArg)
2629 enddef
2630 defcompile
2631 END
2632 # OK at compile time
Bram Moolenaar62aec932022-01-29 21:45:34 +00002633 v9.CheckScriptSuccess(lines)
Bram Moolenaar44a89772021-12-18 12:31:33 +00002634
2635 # Type check fails at runtime
Bram Moolenaar62aec932022-01-29 21:45:34 +00002636 v9.CheckScriptFailure(lines + ['Test()'], 'E1012: Type mismatch; expected func(string) but got func(number)')
Bram Moolenaar44a89772021-12-18 12:31:33 +00002637enddef
2638
Bram Moolenaarbdc0f1c2021-04-24 19:08:24 +02002639def Test_inc_dec()
2640 var lines =<< trim END
2641 var nr = 7
2642 ++nr
Bram Moolenaar730bf302021-04-24 20:43:56 +02002643 assert_equal(8, nr)
Bram Moolenaarbdc0f1c2021-04-24 19:08:24 +02002644 --nr
Bram Moolenaar730bf302021-04-24 20:43:56 +02002645 assert_equal(7, nr)
Bram Moolenaarf3d30842021-06-25 19:29:30 +02002646 ++nr | ++nr
2647 assert_equal(9, nr)
2648 ++nr # comment
2649 assert_equal(10, nr)
Bram Moolenaarbdc0f1c2021-04-24 19:08:24 +02002650
2651 var ll = [1, 2]
2652 --ll[0]
2653 ++ll[1]
Bram Moolenaar730bf302021-04-24 20:43:56 +02002654 assert_equal([0, 3], ll)
2655
2656 g:count = 1
2657 ++g:count
2658 --g:count
2659 assert_equal(1, g:count)
2660 unlet g:count
Bram Moolenaarbdc0f1c2021-04-24 19:08:24 +02002661 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002662 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar22480d12021-06-25 21:31:09 +02002663
2664 lines =<< trim END
2665 var nr = 7
2666 ++ nr
2667 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002668 v9.CheckDefAndScriptFailure(lines, "E1202: No white space allowed after '++': ++ nr")
Bram Moolenaarbdc0f1c2021-04-24 19:08:24 +02002669enddef
2670
Bram Moolenaar327d3ee2021-07-28 19:34:14 +02002671def Test_abort_after_error()
2672 # should abort after strpart() fails, not give another type error
2673 var lines =<< trim END
2674 vim9script
2675 var x: string
2676 x = strpart(1, 2)
2677 END
2678 writefile(lines, 'Xtestscript')
2679 var expected = 'E1174: String required for argument 1'
2680 assert_fails('so Xtestscript', [expected, expected], 3)
2681
2682 delete('Xtestscript')
2683enddef
2684
Bram Moolenaarafa048f2022-02-22 20:43:36 +00002685def Test_using_s_var_in_function()
2686 var lines =<< trim END
2687 vim9script
2688 var scriptlevel = 123
2689 def SomeFunc()
2690 echo s:scriptlevel
2691 enddef
2692 SomeFunc()
2693 END
2694 v9.CheckScriptFailure(lines, 'E1268:')
2695
2696 # OK in legacy script
2697 lines =<< trim END
2698 let s:scriptlevel = 123
2699 def s:SomeFunc()
2700 echo s:scriptlevel
2701 enddef
2702 call s:SomeFunc()
2703 END
2704 v9.CheckScriptSuccess(lines)
2705
2706 lines =<< trim END
2707 vim9script
2708 var scriptlevel = 123
2709 def SomeFunc()
2710 s:scriptlevel = 456
2711 enddef
2712 SomeFunc()
2713 END
2714 v9.CheckScriptFailure(lines, 'E1268:')
2715
2716 # OK in legacy script
2717 lines =<< trim END
2718 let s:scriptlevel = 123
2719 def s:SomeFunc()
2720 s:scriptlevel = 456
2721 enddef
2722 call s:SomeFunc()
2723 call assert_equal(456, s:scriptlevel)
2724 END
2725 v9.CheckScriptSuccess(lines)
2726enddef
2727
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002728let g:someVar = 'X'
2729
2730" Test for heredoc with Vim expressions.
2731" This messes up highlighting, keep it near the end.
2732def Test_heredoc_expr()
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01002733 var lines =<< trim CODE
2734 var s = "local"
2735 var a1 = "1"
2736 var a2 = "2"
2737 var a3 = "3"
2738 var a4 = ""
2739 var code =<< trim eval END
LemonBoy2eaef102022-05-06 13:14:50 +01002740 var a = {5 + 10}
2741 var b = {min([10, 6])} + {max([4, 6])}
2742 var c = "{s}"
2743 var d = x{a1}x{a2}x{a3}x{a4}
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01002744 END
2745 assert_equal(['var a = 15', 'var b = 6 + 6', 'var c = "local"', 'var d = x1x2x3x'], code)
2746 CODE
2747 v9.CheckDefAndScriptSuccess(lines)
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002748
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01002749 lines =<< trim CODE
2750 var code =<< eval trim END
LemonBoy2eaef102022-05-06 13:14:50 +01002751 var s = "{$SOME_ENV_VAR}"
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01002752 END
2753 assert_equal(['var s = "somemore"'], code)
2754 CODE
2755 v9.CheckDefAndScriptSuccess(lines)
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002756
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01002757 lines =<< trim CODE
2758 var code =<< eval END
LemonBoy2eaef102022-05-06 13:14:50 +01002759 var s = "{$SOME_ENV_VAR}"
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01002760 END
2761 assert_equal([' var s = "somemore"'], code)
2762 CODE
2763 v9.CheckDefAndScriptSuccess(lines)
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002764
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01002765 lines =<< trim CODE
2766 var code =<< eval trim END
LemonBoy2eaef102022-05-06 13:14:50 +01002767 let a = {{abc}}
2768 let b = {g:someVar}
2769 let c = {{
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01002770 END
LemonBoy2eaef102022-05-06 13:14:50 +01002771 assert_equal(['let a = {abc}', 'let b = X', 'let c = {'], code)
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01002772 CODE
2773 v9.CheckDefAndScriptSuccess(lines)
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002774
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01002775 lines =<< trim LINES
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002776 var text =<< eval trim END
LemonBoy2eaef102022-05-06 13:14:50 +01002777 let b = {
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002778 END
2779 LINES
LemonBoy2eaef102022-05-06 13:14:50 +01002780 v9.CheckDefAndScriptFailure(lines, "E1279: Missing '}'")
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002781
2782 lines =<< trim LINES
2783 var text =<< eval trim END
LemonBoy2eaef102022-05-06 13:14:50 +01002784 let b = {abc
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002785 END
2786 LINES
LemonBoy2eaef102022-05-06 13:14:50 +01002787 v9.CheckDefAndScriptFailure(lines, "E1279: Missing '}'")
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002788
2789 lines =<< trim LINES
2790 var text =<< eval trim END
LemonBoy2eaef102022-05-06 13:14:50 +01002791 let b = {}
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002792 END
2793 LINES
LemonBoy2eaef102022-05-06 13:14:50 +01002794 v9.CheckDefAndScriptFailure(lines, 'E15: Invalid expression: "}"')
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002795enddef
2796
Bram Moolenaar971caf52020-09-21 22:21:42 +02002797" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker