blob: 960dd7116f50b01176d2672c58a1b57b2b12d39f [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
Bram Moolenaar73e28dc2022-09-17 21:08:33 +010099 var float1: float = 3.4
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200100 var Funky1: func
101 var Funky2: func = function('len')
102 var Party2: func = funcref('g:Test_syntax')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200103
104 g:newvar = 'new' #comment
105 assert_equal('new', g:newvar)
106
107 assert_equal('yes', g:existing)
108 g:existing = 'no'
109 assert_equal('no', g:existing)
110
111 v:char = 'abc'
112 assert_equal('abc', v:char)
113
114 $ENVVAR = 'foobar'
115 assert_equal('foobar', $ENVVAR)
116 $ENVVAR = ''
117
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200118 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200119 vim9script
120 $ENVVAR = 'barfoo'
121 assert_equal('barfoo', $ENVVAR)
122 $ENVVAR = ''
123 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000124 v9.CheckScriptSuccess(lines)
Bram Moolenaar971caf52020-09-21 22:21:42 +0200125
Bram Moolenaara749a422022-02-12 19:52:25 +0000126 appendToMe ..= 'yyy'
127 assert_equal('xxxyyy', appendToMe)
128 addToMe += 222
129 assert_equal(333, addToMe)
130 newVar = 'new'
131 assert_equal('new', newVar)
Bram Moolenaar971caf52020-09-21 22:21:42 +0200132
133 set ts=7
Bram Moolenaardd1f4262020-12-31 17:41:01 +0100134 var ts: number = &ts
135 assert_equal(7, ts)
Bram Moolenaar971caf52020-09-21 22:21:42 +0200136 &ts += 1
137 assert_equal(8, &ts)
138 &ts -= 3
139 assert_equal(5, &ts)
140 &ts *= 2
141 assert_equal(10, &ts)
142 &ts /= 3
143 assert_equal(3, &ts)
144 set ts=10
145 &ts %= 4
146 assert_equal(2, &ts)
147
zeertzjq4c7cb372023-06-14 16:39:54 +0100148 assert_fails('&ts /= 0', ['E1154:', 'E1154:'])
149 assert_fails('&ts %= 0', ['E1154:', 'E1154:'])
150 assert_fails('&ts /= []', ['E745:', 'E745:'])
151 assert_fails('&ts %= []', ['E745:', 'E745:'])
152 assert_equal(2, &ts)
153
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100154 var f100: float = 100.0
155 f100 /= 5
156 assert_equal(20.0, f100)
Bram Moolenaar971caf52020-09-21 22:21:42 +0200157
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100158 var f200: float = 200.0
159 f200 /= 5.0
160 assert_equal(40.0, f200)
Bram Moolenaar971caf52020-09-21 22:21:42 +0200161
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100162 v9.CheckDefFailure(['var nr: number = 200', 'nr /= 5.0'], 'E1012:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200163
164 lines =<< trim END
165 &ts = 6
166 &ts += 3
167 assert_equal(9, &ts)
168
169 &l:ts = 6
170 assert_equal(6, &ts)
171 &l:ts += 2
172 assert_equal(8, &ts)
173
174 &g:ts = 6
175 assert_equal(6, &g:ts)
176 &g:ts += 2
177 assert_equal(8, &g:ts)
Bram Moolenaar0ea04402021-01-04 13:37:54 +0100178
179 &number = true
180 assert_equal(true, &number)
181 &number = 0
182 assert_equal(false, &number)
183 &number = 1
184 assert_equal(true, &number)
185 &number = false
186 assert_equal(false, &number)
Bram Moolenaar971caf52020-09-21 22:21:42 +0200187 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000188 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar971caf52020-09-21 22:21:42 +0200189
Bram Moolenaar62aec932022-01-29 21:45:34 +0000190 v9.CheckDefFailure(['&notex += 3'], 'E113:')
191 v9.CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
192 v9.CheckDefFailure(['&ts = [7]'], 'E1012:')
193 v9.CheckDefExecFailure(['&ts = g:alist'], 'E1012: Type mismatch; expected number but got list<number>')
194 v9.CheckDefFailure(['&ts = "xx"'], 'E1012:')
195 v9.CheckDefExecFailure(['&ts = g:astring'], 'E1012: Type mismatch; expected number but got string')
196 v9.CheckDefFailure(['&path += 3'], 'E1012:')
197 v9.CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200198 # test freeing ISN_STOREOPT
Bram Moolenaar62aec932022-01-29 21:45:34 +0000199 v9.CheckDefFailure(['&ts = 3', 'var asdf'], 'E1022:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200200 &ts = 8
201
202 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200203 var save_TI = &t_TI
Bram Moolenaar971caf52020-09-21 22:21:42 +0200204 &t_TI = ''
205 assert_equal('', &t_TI)
206 &t_TI = 'xxx'
207 assert_equal('xxx', &t_TI)
208 &t_TI = save_TI
209 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000210 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar971caf52020-09-21 22:21:42 +0200211
Bram Moolenaar62aec932022-01-29 21:45:34 +0000212 v9.CheckDefFailure(['&t_TI = 123'], 'E1012:')
213 v9.CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200214
Bram Moolenaar62aec932022-01-29 21:45:34 +0000215 v9.CheckDefFailure(['var s:var = 123'], 'E1101:')
216 v9.CheckDefFailure(['var s:var: number'], 'E1101:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200217
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100218 v9.CheckDefAndScriptFailure(['var $VAR: number'], ['E1016:', 'E475:'])
219
Bram Moolenaar971caf52020-09-21 22:21:42 +0200220 lines =<< trim END
221 vim9script
222 def SomeFunc()
223 s:var = 123
224 enddef
225 defcompile
226 END
Bram Moolenaarafa048f2022-02-22 20:43:36 +0000227 v9.CheckScriptFailure(lines, 'E1268:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200228
229 g:inc_counter += 1
230 assert_equal(2, g:inc_counter)
231
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100232 var f: float
233 f += 1
234 assert_equal(1.0, f)
Bram Moolenaar7bf9a072021-08-02 21:55:15 +0200235
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()
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100253 var lines =<< trim END
254 var f: float
255 f += 2
256 f -= 1
257 assert_equal(1.0, f)
258 ++f
259 --f
260 assert_equal(1.0, f)
261 END
262 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaaraf647e72021-08-05 19:01:17 +0200263enddef
264
Bram Moolenaarf5d52c92021-07-31 22:51:10 +0200265let g:someNumber = 43
266
267def Test_assign_concat()
268 var lines =<< trim END
269 var s = '-'
270 s ..= 99
271 s ..= true
272 s ..= '-'
273 s ..= v:null
274 s ..= g:someNumber
275 assert_equal('-99true-null43', s)
276 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000277 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf5d52c92021-07-31 22:51:10 +0200278
279 lines =<< trim END
280 var s = '-'
281 s ..= [1, 2]
282 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000283 v9.CheckDefAndScriptFailure(lines, ['E1105: Cannot convert list to string', 'E734: Wrong variable type for .='], 2)
Bram Moolenaarf5d52c92021-07-31 22:51:10 +0200284 lines =<< trim END
285 var s = '-'
286 s ..= {a: 2}
287 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000288 v9.CheckDefAndScriptFailure(lines, ['E1105: Cannot convert dict to string', 'E734: Wrong variable type for .='], 2)
Bram Moolenaar22ebd172022-04-01 15:26:58 +0100289
290 lines =<< trim END
291 var ls: list<string> = []
292 ls[-1] ..= 'foo'
293 END
Bram Moolenaarec892232022-05-06 17:53:06 +0100294 v9.CheckDefExecAndScriptFailure(lines, 'E684: List index out of range: -1', 2)
Bram Moolenaarf5d52c92021-07-31 22:51:10 +0200295enddef
296
Bram Moolenaar13e45d12021-06-26 13:28:35 +0200297def Test_assign_register()
298 var lines =<< trim END
299 @c = 'areg'
300 @c ..= 'add'
301 assert_equal('aregadd', @c)
302
303 @@ = 'some text'
304 assert_equal('some text', getreg('"'))
305 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000306 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar13e45d12021-06-26 13:28:35 +0200307
Bram Moolenaar62aec932022-01-29 21:45:34 +0000308 v9.CheckDefFailure(['@a += "more"'], 'E1051:')
309 v9.CheckDefFailure(['@a += 123'], 'E1012:')
Bram Moolenaar13e45d12021-06-26 13:28:35 +0200310enddef
311
Bram Moolenaard0edaf92021-05-28 21:06:08 +0200312def Test_reserved_name()
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000313 var more_names = ['null_job', 'null_channel']
314 if !has('job')
315 more_names = []
316 endif
317
318 for name in ['true',
319 'false',
Bram Moolenaarce723f32023-06-10 19:00:12 +0100320 'this',
321 'super',
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000322 'null',
323 'null_blob',
324 'null_dict',
325 'null_function',
326 'null_list',
327 'null_partial',
328 'null_string',
Yegappan Lakshmanan8daae6f2025-04-05 16:00:22 +0200329 'null_object',
330 'null_class',
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000331 ] + 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
Bram Moolenaarce723f32023-06-10 19:00:12 +0100335
336 var lines =<< trim END
337 vim9script
338 def Foo(super: bool)
339 echo 'something'
340 enddef
341 defcompile
342 END
343 v9.CheckScriptFailure(lines, 'E1034:')
Bram Moolenaard0edaf92021-05-28 21:06:08 +0200344enddef
345
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000346def Test_null_values()
347 var lines =<< trim END
348 var b: blob = null_blob
349 var dn: dict<number> = null_dict
350 var ds: dict<string> = null_dict
351 var ln: list<number> = null_list
352 var ls: list<string> = null_list
353 var Ff: func(string): string = null_function
354 var Fp: func(number): number = null_partial
355 var s: string = null_string
356 if has('job')
357 var j: job = null_job
358 var c: channel = null_channel
359 endif
Bram Moolenaar56b84b12022-03-09 19:46:48 +0000360
361 var d: dict<func> = {a: function('tr'), b: null_function}
Bram Moolenaarbadf04f2022-03-12 21:28:22 +0000362
363 var bl: list<blob> = [0z12, null_blob]
364 var dnl: list<dict<number>> = [{a: 1}, null_dict]
365 var dsl: list<dict<string>> = [{a: 'x'}, null_dict]
366 var lnl: list<list<number>> = [[1], null_list]
367 var lsl: list<list<string>> = [['x'], null_list]
368 def Len(v: string): number
369 return len(v)
370 enddef
371 var Ffl: list<func(string): number> = [Len, null_function]
372 var Fpl: list<func(string): number> = [Len, null_partial]
373 var sl: list<string> = ['x', null_string]
374 if has('job')
375 var jl: list<job> = [null_job]
376 var cl: list<channel> = [null_channel]
377 endif
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000378 END
379 v9.CheckDefAndScriptSuccess(lines)
380enddef
381
Bram Moolenaarce93d162023-01-30 21:12:34 +0000382def Test_type_with_extra_white()
383 var lines =<< trim END
384 const x : number = 3
385 END
zeertzjq67fe77d2025-04-20 10:21:18 +0200386 v9.CheckDefExecAndScriptFailure(lines, 'E1059:')
Bram Moolenaarce93d162023-01-30 21:12:34 +0000387enddef
388
Bram Moolenaar56b84b12022-03-09 19:46:48 +0000389def Test_keep_type_after_assigning_null()
390 var lines =<< trim END
391 var b: blob
392 b = null_blob
393 b = 'text'
394 END
395 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected blob but got string')
396
397 lines =<< trim END
398 var l: list<number>
399 l = null_list
400 l = ['text']
401 END
402 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected list<number> but got list<string>')
403
404 lines =<< trim END
405 var d: dict<string>
406 d = null_dict
407 d = {a: 1, b: 2}
408 END
409 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected dict<string> but got dict<number>')
410enddef
411
Bram Moolenaaraa1959b2021-04-15 22:13:39 +0200412def Test_skipped_assignment()
413 var lines =<< trim END
414 for x in []
415 var i: number = 1
416 while false
417 i += 1
418 endwhile
419 endfor
420 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000421 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaaraa1959b2021-04-15 22:13:39 +0200422enddef
423
Bram Moolenaar7824fc82021-11-26 17:36:51 +0000424def Test_assign_keep_type()
425 var lines =<< trim END
426 vim9script
427 var l: list<number> = [123]
428 l = [123]
429 l->add('string')
430 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000431 v9.CheckScriptFailure(lines, 'E1012:', 4)
Bram Moolenaar7824fc82021-11-26 17:36:51 +0000432enddef
433
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100434def Test_assign_unpack()
435 var lines =<< trim END
436 var v1: number
437 var v2: number
438 [v1, v2] = [1, 2]
439 assert_equal(1, v1)
440 assert_equal(2, v2)
Bram Moolenaarf93bbd02021-04-10 22:35:43 +0200441
442 [v1, _, v2, _] = [1, 99, 2, 77]
443 assert_equal(1, v1)
444 assert_equal(2, v2)
445
446 [v1, v2; _] = [1, 2, 3, 4, 5]
447 assert_equal(1, v1)
448 assert_equal(2, v2)
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200449
Bram Moolenaarbc510062022-02-14 21:19:04 +0000450 var _x: number
451 [_x, v2] = [6, 7]
452 assert_equal(6, _x)
453 assert_equal(7, v2)
454
Bram Moolenaar4d5dfe22021-06-26 13:59:29 +0200455 var reslist = []
456 for text in ['aaa {bbb} ccc', 'ddd {eee} fff']
457 var before: string
458 var middle: string
459 var after: string
460 [_, before, middle, after; _] = text->matchlist('\(.\{-\}\){\(.\{-\}\)}\(.*\)')
461 reslist->add(before)->add(middle)->add(after)
462 endfor
463 assert_equal(['aaa ', 'bbb', ' ccc', 'ddd ', 'eee', ' fff'], reslist)
464
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200465 var a = 1
466 var b = 3
467 [a, b] += [2, 4]
468 assert_equal(3, a)
469 assert_equal(7, b)
470
471 [a, b] -= [1, 2]
472 assert_equal(2, a)
473 assert_equal(5, b)
474
475 [a, b] *= [3, 2]
476 assert_equal(6, a)
477 assert_equal(10, b)
478
479 [a, b] /= [2, 4]
480 assert_equal(3, a)
481 assert_equal(2, b)
482
483 [a, b] = [17, 15]
484 [a, b] %= [5, 3]
485 assert_equal(2, a)
486 assert_equal(0, b)
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100487 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000488 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100489
490 lines =<< trim END
491 var v1: number
492 var v2: number
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000493 [v1, v2] = [1, 2, 3]
494 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000495 v9.CheckDefFailure(lines, 'E1093: Expected 2 items but got 3', 3)
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000496
497 lines =<< trim END
498 var v1: number
499 var v2: number
500 [v1, v2] = [1]
501 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000502 v9.CheckDefFailure(lines, 'E1093: Expected 2 items but got 1', 3)
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000503
504 lines =<< trim END
505 var v1: number
506 var v2: number
507 [v1, v2; _] = [1]
508 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000509 v9.CheckDefFailure(lines, 'E1093: Expected 2 items but got 1', 3)
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000510
511 lines =<< trim END
512 var v1: number
513 var v2: number
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100514 [v1, v2] =
515 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000516 v9.CheckDefFailure(lines, 'E1097:', 5)
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100517
518 lines =<< trim END
519 var v1: number
520 var v2: number
521 [v1, v2] = xxx
522 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000523 v9.CheckDefFailure(lines, 'E1001:', 3)
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100524
525 lines =<< trim END
526 var v1: number
527 var v2: number
528 [v1, v2] = popup_clear()
529 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000530 v9.CheckDefFailure(lines, 'E1031:', 3)
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100531
532 lines =<< trim END
Bram Moolenaar3862ea32021-01-01 21:05:55 +0100533 [v1, v2] = [1, 2]
534 END
zeertzjq67fe77d2025-04-20 10:21:18 +0200535 v9.CheckDefFailure(lines, 'E1089:', 1)
536 v9.CheckScriptFailure(['vim9script'] + lines, 'E1089:', 2)
Bram Moolenaar3862ea32021-01-01 21:05:55 +0100537
538 lines =<< trim END
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100539 var v1: number
540 var v2: number
541 [v1, v2] = ''
542 END
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +0100543 v9.CheckDefFailure(lines, 'E1535: List or Tuple required', 3)
Bram Moolenaarf785aa12021-02-11 21:19:34 +0100544
545 lines =<< trim END
546 g:values = [false, 0]
547 var x: bool
548 var y: string
549 [x, y] = g:values
550 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000551 v9.CheckDefExecAndScriptFailure(lines, 'E1163: Variable 2: type mismatch, expected string but got number')
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200552
553 lines =<< trim END
554 var x: number
555 var y: number
556 var z: string
557 [x, y, z] = [1, 2, 3]
558 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000559 v9.CheckDefAndScriptFailure(lines, 'E1163: Variable 3: type mismatch, expected string but got number')
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200560
561 lines =<< trim END
562 var x: number
563 var y: string
564 var z: string
565 [x, y, z] = [1, '2', 3]
566 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000567 v9.CheckDefExecAndScriptFailure(lines, 'E1163: Variable 3: type mismatch, expected string but got number')
Bram Moolenaar8ff16e02020-12-07 21:49:52 +0100568enddef
569
Bram Moolenaar7f764942020-12-02 15:11:18 +0100570def Test_assign_linebreak()
571 var nr: number
572 nr =
573 123
574 assert_equal(123, nr)
575
576 var n2: number
577 [nr, n2] =
578 [12, 34]
579 assert_equal(12, nr)
580 assert_equal(34, n2)
581
Bram Moolenaar62aec932022-01-29 21:45:34 +0000582 v9.CheckDefFailure(["var x = #"], 'E1097:', 3)
Bram Moolenaar77709b12021-04-03 21:01:01 +0200583
584 var lines =<< trim END
585 var x: list<string> = ['a']
586 var y: list<number> = x
587 ->copy()
588 ->copy()
589 END
Bram Moolenaar381692b2022-02-02 20:01:27 +0000590 v9.CheckDefExecFailure(lines, 'E1012:', 4)
Bram Moolenaar6977dba2021-07-04 22:48:12 +0200591
592 lines =<< trim END
593 var x: any
594 x.key = 1
595 + 2
596 + 3
597 + 4
598 + 5
599 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000600 v9.CheckDefExecAndScriptFailure(lines, ['E1148:', 'E1203:'], 2)
Bram Moolenaar7f764942020-12-02 15:11:18 +0100601enddef
602
Bram Moolenaardc234ca2020-11-28 18:52:33 +0100603def Test_assign_index()
604 # list of list
605 var l1: list<number>
606 l1[0] = 123
607 assert_equal([123], l1)
608
609 var l2: list<list<number>>
610 l2[0] = []
611 l2[0][0] = 123
612 assert_equal([[123]], l2)
613
614 var l3: list<list<list<number>>>
615 l3[0] = []
616 l3[0][0] = []
617 l3[0][0][0] = 123
618 assert_equal([[[123]]], l3)
619
620 var lines =<< trim END
621 var l3: list<list<number>>
622 l3[0] = []
623 l3[0][0] = []
624 END
Yegappan Lakshmanan66897192023-12-05 15:51:50 +0100625 v9.CheckDefFailure(lines, 'E1012: Type mismatch; expected number but got list<any>', 3)
Bram Moolenaardc234ca2020-11-28 18:52:33 +0100626
627 # dict of dict
628 var d1: dict<number>
629 d1.one = 1
630 assert_equal({one: 1}, d1)
631
632 var d2: dict<dict<number>>
633 d2.one = {}
634 d2.one.two = 123
635 assert_equal({one: {two: 123}}, d2)
636
637 var d3: dict<dict<dict<number>>>
638 d3.one = {}
639 d3.one.two = {}
640 d3.one.two.three = 123
641 assert_equal({one: {two: {three: 123}}}, d3)
642
Bram Moolenaare08be092022-02-17 13:08:26 +0000643 # blob
644 var bl: blob = 0z11223344
645 bl[0] = 0x77
646 assert_equal(0z77223344, bl)
647 bl[-2] = 0x66
648 assert_equal(0z77226644, bl)
649
Bram Moolenaar1983f1a2022-02-28 20:55:02 +0000650 lines =<< trim END
651 g:val = '22'
652 var bl = 0z11
653 bl[1] = g:val
654 END
Yegappan Lakshmanan9937d8b2024-05-08 20:24:33 +0200655 v9.CheckDefExecAndScriptFailure(lines, ['E1030: Using a String as a Number: "22"', 'E1012: Type mismatch; expected number but got string'])
Bram Moolenaar1983f1a2022-02-28 20:55:02 +0000656
Bram Moolenaare97976b2021-08-01 13:17:17 +0200657 # should not read the next line when generating "a.b"
658 var a = {}
659 a.b = {}
660 a.b.c = {}
661 ->copy()
662
Bram Moolenaardc234ca2020-11-28 18:52:33 +0100663 lines =<< trim END
664 var d3: dict<dict<number>>
665 d3.one = {}
666 d3.one.two = {}
667 END
Yegappan Lakshmanan66897192023-12-05 15:51:50 +0100668 v9.CheckDefFailure(lines, 'E1012: Type mismatch; expected number but got dict<any>', 3)
Bram Moolenaardc234ca2020-11-28 18:52:33 +0100669
Bram Moolenaaracbae182020-12-13 18:44:43 +0100670 lines =<< trim END
671 var lines: list<string>
672 lines['a'] = 'asdf'
673 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000674 v9.CheckDefFailure(lines, 'E1012:', 2)
Bram Moolenaaracbae182020-12-13 18:44:43 +0100675
676 lines =<< trim END
677 var lines: string
678 lines[9] = 'asdf'
679 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000680 v9.CheckDefFailure(lines, 'E1141:', 2)
Bram Moolenaaracbae182020-12-13 18:44:43 +0100681
Bram Moolenaardc234ca2020-11-28 18:52:33 +0100682 # list of dict
683 var ld: list<dict<number>>
684 ld[0] = {}
685 ld[0].one = 123
686 assert_equal([{one: 123}], ld)
687
688 lines =<< trim END
689 var ld: list<dict<number>>
690 ld[0] = []
691 END
Yegappan Lakshmanan66897192023-12-05 15:51:50 +0100692 v9.CheckDefFailure(lines, 'E1012: Type mismatch; expected dict<number> but got list<any>', 2)
Bram Moolenaardc234ca2020-11-28 18:52:33 +0100693
694 # dict of list
695 var dl: dict<list<number>>
696 dl.one = []
697 dl.one[0] = 123
698 assert_equal({one: [123]}, dl)
699
700 lines =<< trim END
701 var dl: dict<list<number>>
702 dl.one = {}
703 END
Yegappan Lakshmanan66897192023-12-05 15:51:50 +0100704 v9.CheckDefFailure(lines, 'E1012: Type mismatch; expected list<number> but got dict<any>', 2)
Bram Moolenaare08be092022-02-17 13:08:26 +0000705
706 lines =<< trim END
707 g:l = [1, 2]
708 g:l['x'] = 3
709 END
710 v9.CheckDefExecAndScriptFailure(lines, ['E39:', 'E1030:'], 2)
711
712 lines =<< trim END
713 var bl: blob = test_null_blob()
714 bl[1] = 8
715 END
716 v9.CheckDefExecAndScriptFailure(lines, ['E1184:', 'E979:'], 2)
Bram Moolenaarea5c8982022-02-17 14:42:02 +0000717
718 lines =<< trim END
719 g:bl = 'not a blob'
720 g:bl[1 : 2] = 8
721 END
722 v9.CheckDefExecAndScriptFailure(lines, ['E897:', 'E689:'], 2)
Bram Moolenaardc234ca2020-11-28 18:52:33 +0100723enddef
724
Bram Moolenaar38ecd972022-01-15 21:44:44 +0000725def Test_init_in_for_loop()
726 var lines =<< trim END
727 var l: list<number> = []
728 for i in [3, 4]
729 var n: number
730 add(l, n)
731 n = 123
732 endfor
733 assert_equal([0, 0], l)
734 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000735 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar38ecd972022-01-15 21:44:44 +0000736
737 lines =<< trim END
738 var l: list<number> = []
739 for i in [3, 4]
740 var n: number = 0
741 add(l, n)
742 n = 123
743 endfor
744 assert_equal([0, 0], l)
745 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000746 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar38ecd972022-01-15 21:44:44 +0000747
748 lines =<< trim END
749 var l: list<number> = []
750 for i in [3, 4]
751 var n: number = 3
752 add(l, n)
753 n = 123
754 endfor
755 assert_equal([3, 3], l)
756 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000757 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar38ecd972022-01-15 21:44:44 +0000758enddef
759
Bram Moolenaarbc6f2bf2022-05-06 14:29:09 +0100760def Test_redir_is_not_assign()
761 if false
762 redir => res
763 echo var_job
764 redir END
765 endif
766enddef
767
Bram Moolenaar81ed4962020-09-23 15:56:50 +0200768def Test_extend_list()
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +0100769 # using uninitialized list assigns empty list
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200770 var lines =<< trim END
Bram Moolenaar07802042021-09-09 23:01:14 +0200771 var l1: list<number>
772 var l2 = l1
773 assert_true(l1 is l2)
774 l1 += [123]
775 assert_equal([123], l1)
776 assert_true(l1 is l2)
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100777 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000778 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar81ed4962020-09-23 15:56:50 +0200779
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100780 lines =<< trim END
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100781 var list: list<string>
782 extend(list, ['x'])
783 assert_equal(['x'], list)
Bram Moolenaar81ed4962020-09-23 15:56:50 +0200784 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000785 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar1a739232020-10-10 15:37:58 +0200786
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +0100787 # appending to uninitialized list from a function works
Bram Moolenaar1a739232020-10-10 15:37:58 +0200788 lines =<< trim END
789 vim9script
790 var list: list<string>
791 def Func()
792 list += ['a', 'b']
793 enddef
794 Func()
795 assert_equal(['a', 'b'], list)
796 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000797 v9.CheckScriptSuccess(lines)
Bram Moolenaar3beaf9c2020-12-18 17:23:14 +0100798 lines =<< trim END
799 vim9script
800 var list: list<string>
801 def Func()
802 extend(list, ['x', 'b'])
803 enddef
804 Func()
805 assert_equal(['x', 'b'], list)
806 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000807 v9.CheckScriptSuccess(lines)
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100808
Bram Moolenaaraa7d0c22022-04-05 21:40:38 +0100809 # initialized to null, with type, does not default to empty list
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100810 lines =<< trim END
811 vim9script
812 var l: list<string> = test_null_list()
813 extend(l, ['x'])
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100814 END
Bram Moolenaaraa7d0c22022-04-05 21:40:38 +0100815 v9.CheckScriptFailure(lines, 'E1134:', 3)
816
817 # initialized to null, without type, does not default to empty list
818 lines =<< trim END
819 vim9script
820 var l = null_list
821 extend(l, ['x'])
822 END
823 v9.CheckScriptFailure(lines, 'E1134:', 3)
824
825 # assigned null, does not default to empty list
826 lines =<< trim END
827 vim9script
828 var l: list<string>
829 l = null_list
830 extend(l, ['x'])
831 END
832 v9.CheckScriptFailure(lines, 'E1134:', 4)
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100833
834 lines =<< trim END
835 vim9script
836 extend(test_null_list(), ['x'])
837 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000838 v9.CheckScriptFailure(lines, 'E1134:', 2)
Bram Moolenaar078a4612022-01-04 15:17:03 +0000839
840 # using global var has no declared type
841 g:myList = []
842 g:myList->extend([1])
843 g:myList->extend(['x'])
844 assert_equal([1, 'x'], g:myList)
845 unlet g:myList
846
847 # using declared list gives an error
848 lines =<< trim END
849 var l: list<number>
850 g:myList = l
851 g:myList->extend([1])
852 g:myList->extend(['x'])
853 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000854 v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected list<number> but got list<string>', 4)
Bram Moolenaar078a4612022-01-04 15:17:03 +0000855 unlet g:myList
Bram Moolenaar160afdb2022-02-06 17:17:02 +0000856
857 lines =<< trim END
858 vim9script
859 var lds = [1, 2, 3]
860 def Func()
861 echo lds->extend(['x'])
862 enddef
863 defcompile
864 END
865 v9.CheckScriptFailure(lines, 'E1013:')
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100866enddef
867
868def Test_extend_dict()
869 var lines =<< trim END
870 vim9script
871 var d: dict<number>
Bram Moolenaare0de1712020-12-02 17:36:54 +0100872 extend(d, {a: 1})
873 assert_equal({a: 1}, d)
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100874
875 var d2: dict<number>
876 d2['one'] = 1
Bram Moolenaare0de1712020-12-02 17:36:54 +0100877 assert_equal({one: 1}, d2)
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100878 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000879 v9.CheckScriptSuccess(lines)
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100880
881 lines =<< trim END
882 vim9script
883 var d: dict<string> = test_null_dict()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100884 extend(d, {a: 'x'})
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100885 END
Bram Moolenaaraa7d0c22022-04-05 21:40:38 +0100886 v9.CheckScriptFailure(lines, 'E1133:', 3)
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100887
888 lines =<< trim END
889 vim9script
Bram Moolenaare0de1712020-12-02 17:36:54 +0100890 extend(test_null_dict(), {a: 'x'})
Bram Moolenaar348be7e2020-11-04 11:36:35 +0100891 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000892 v9.CheckScriptFailure(lines, 'E1133:', 2)
Bram Moolenaar81ed4962020-09-23 15:56:50 +0200893enddef
894
Bram Moolenaar971caf52020-09-21 22:21:42 +0200895def Test_single_letter_vars()
896 # single letter variables
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200897 var a: number = 123
Bram Moolenaar971caf52020-09-21 22:21:42 +0200898 a = 123
899 assert_equal(123, a)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200900 var b: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200901 b = 123
902 assert_equal(123, b)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200903 var g: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200904 g = 123
905 assert_equal(123, g)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200906 var s: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200907 s = 123
908 assert_equal(123, s)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200909 var t: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200910 t = 123
911 assert_equal(123, t)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200912 var v: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200913 v = 123
914 assert_equal(123, v)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200915 var w: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200916 w = 123
917 assert_equal(123, w)
918enddef
919
920def Test_vim9_single_char_vars()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200921 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200922 vim9script
923
924 # single character variable declarations work
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200925 var a: string
926 var b: number
927 var l: list<any>
928 var s: string
929 var t: number
930 var v: number
931 var w: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200932
933 # script-local variables can be used without s: prefix
934 a = 'script-a'
935 b = 111
936 l = [1, 2, 3]
937 s = 'script-s'
938 t = 222
939 v = 333
940 w = 444
941
942 assert_equal('script-a', a)
943 assert_equal(111, b)
944 assert_equal([1, 2, 3], l)
945 assert_equal('script-s', s)
946 assert_equal(222, t)
947 assert_equal(333, v)
948 assert_equal(444, w)
949 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100950 writefile(lines, 'Xsinglechar', 'D')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200951 source Xsinglechar
Bram Moolenaar971caf52020-09-21 22:21:42 +0200952enddef
953
954def Test_assignment_list()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200955 var list1: list<bool> = [false, true, false]
956 var list2: list<number> = [1, 2, 3]
957 var list3: list<string> = ['sdf', 'asdf']
958 var list4: list<any> = ['yes', true, 1234]
959 var list5: list<blob> = [0z01, 0z02]
Bram Moolenaar971caf52020-09-21 22:21:42 +0200960
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200961 var listS: list<string> = []
962 var listN: list<number> = []
Bram Moolenaar971caf52020-09-21 22:21:42 +0200963
964 assert_equal([1, 2, 3], list2)
965 list2[-1] = 99
966 assert_equal([1, 2, 99], list2)
967 list2[-2] = 88
968 assert_equal([1, 88, 99], list2)
969 list2[-3] = 77
970 assert_equal([77, 88, 99], list2)
971 list2 += [100]
972 assert_equal([77, 88, 99, 100], list2)
973
974 list3 += ['end']
975 assert_equal(['sdf', 'asdf', 'end'], list3)
976
Bram Moolenaar62aec932022-01-29 21:45:34 +0000977 v9.CheckDefExecFailure(['var ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
Bram Moolenaar6296d1e2022-02-17 16:30:11 +0000978 v9.CheckDefExecFailure(['var ll = [1, 2, 3]', 'unlet ll[8 : 9]'], 'E684:')
979 v9.CheckDefExecFailure(['var ll = [1, 2, 3]', 'unlet ll[1 : -9]'], 'E684:')
980 v9.CheckDefExecFailure(['var ll = [1, 2, 3]', 'unlet ll[2 : 1]'], 'E684:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200981
982 # type becomes list<any>
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200983 var somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100984
Bram Moolenaar114dbda2022-01-03 12:28:03 +0000985 # type is list<any> even though initializer is list<number>
986 var anyList: list<any> = [0]
987 assert_equal([0, 'x'], extend(anyList, ['x']))
988
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100989 var lines =<< trim END
990 var d = {dd: test_null_list()}
991 d.dd[0] = 0
992 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000993 v9.CheckDefExecFailure(lines, 'E1147:', 2)
Bram Moolenaar7a40ff02021-07-04 15:54:08 +0200994
995 lines =<< trim END
996 def OneArg(x: bool)
997 enddef
998 def TwoArgs(x: bool, y: bool)
999 enddef
1000 var fl: list<func(bool, bool, bool)> = [OneArg, TwoArgs]
1001 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001002 v9.CheckDefExecAndScriptFailure(lines, 'E1012:', 5)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001003enddef
1004
Bram Moolenaarab36e6a2021-11-30 16:14:49 +00001005def Test_list_declaration()
1006 var [v1, v2] = [1, 2]
1007 v1 += 3
1008 assert_equal(4, v1)
1009 v2 *= 3
1010 assert_equal(6, v2)
1011
1012 var lines =<< trim END
1013 var [v1, v2] = [1]
1014 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001015 v9.CheckDefExecAndScriptFailure(lines, ['E1093: Expected 2 items but got 1', 'E688:'])
Bram Moolenaarab36e6a2021-11-30 16:14:49 +00001016 lines =<< trim END
1017 var testlist = [1]
1018 var [v1, v2] = testlist
1019 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001020 v9.CheckDefExecAndScriptFailure(lines, ['E1093: Expected 2 items but got 1', 'E688:'])
Bram Moolenaarab36e6a2021-11-30 16:14:49 +00001021 lines =<< trim END
1022 var [v1, v2] = [1, 2, 3]
1023 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001024 v9.CheckDefExecAndScriptFailure(lines, ['E1093: Expected 2 items but got 3', 'E687:'])
Bram Moolenaarab36e6a2021-11-30 16:14:49 +00001025 lines =<< trim END
1026 var testlist = [1, 2, 3]
1027 var [v1, v2] = testlist
1028 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001029 v9.CheckDefExecAndScriptFailure(lines, ['E1093: Expected 2 items but got 3', 'E687:'])
Bram Moolenaarab36e6a2021-11-30 16:14:49 +00001030
1031 var [vnr, vstr] = [123, 'text']
1032 vnr += 3
1033 assert_equal(126, vnr)
1034 vstr ..= 'end'
1035 assert_equal('textend', vstr)
1036
1037 var [vnr2: number, vstr2: string] = [123, 'text']
1038 vnr2 += 3
1039 assert_equal(126, vnr2)
1040 vstr2 ..= 'end'
1041 assert_equal('textend', vstr2)
1042
1043 var [vnr3: number; vlist: list<string>] = [123, 'foo', 'bar']
1044 vnr3 += 5
1045 assert_equal(128, vnr3)
1046 assert_equal(['foo', 'bar'], vlist)
1047
1048 lines =<< trim END
1049 var [vnr2: number, vstr2: number] = [123, 'text']
1050 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001051 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 +00001052 lines =<< trim END
1053 var testlist = [234, 'text']
1054 var [vnr2: number, vstr2: number] = testlist
1055 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001056 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 +00001057enddef
1058
Bram Moolenaar97f227d2021-07-04 20:20:52 +02001059def PartFuncBool(b: bool): string
Bram Moolenaarb7480cd2021-07-04 18:28:15 +02001060 return 'done'
1061enddef
1062
1063def Test_assignment_partial()
Bram Moolenaar97f227d2021-07-04 20:20:52 +02001064 var lines =<< trim END
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001065 var Partial: func(): string = function(g:PartFuncBool, [true])
Bram Moolenaar97f227d2021-07-04 20:20:52 +02001066 assert_equal('done', Partial())
1067 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001068 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar22f85d02021-07-04 23:29:30 +02001069
1070 lines =<< trim END
1071 vim9script
1072 def Func(b: bool)
1073 enddef
1074 var Ref: func = function(Func, [true])
1075 assert_equal('func()', typename(Ref))
1076 Ref()
1077 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001078 v9.CheckScriptSuccess(lines)
Bram Moolenaar13789bf2021-12-30 13:29:00 +00001079
1080 lines =<< trim END
1081 vim9script
1082
1083 var nres: any
1084 var sres: any
Bram Moolenaar9a015112021-12-31 14:06:45 +00001085 def Func(nr: number, s = '')
1086 nres = nr
Bram Moolenaar13789bf2021-12-30 13:29:00 +00001087 sres = s
1088 enddef
1089
1090 var n: number
1091 var Ref = function(Func, [n])
1092 Ref('x')
1093 assert_equal(0, nres)
1094 assert_equal('x', sres)
1095 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001096 v9.CheckScriptSuccess(lines)
Bram Moolenaar13789bf2021-12-30 13:29:00 +00001097
1098 lines =<< trim END
1099 vim9script
1100
Bram Moolenaar9a015112021-12-31 14:06:45 +00001101 def Func(nr: number, s = '')
Bram Moolenaar13789bf2021-12-30 13:29:00 +00001102 enddef
1103
1104 var n: number
1105 var Ref = function(Func, [n])
1106 Ref(0)
1107 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001108 v9.CheckScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected string but got number')
Yegappan Lakshmanan7f520212024-04-10 17:18:19 +02001109
1110 lines =<< trim END
1111 var Fn1 = () => {
1112 return 10
1113 }
1114 assert_equal('func(): number', typename(Fn1))
1115 var Fn2 = () => {
1116 return "a"
1117 }
1118 assert_equal('func(): string', typename(Fn2))
1119 var Fn3 = () => {
1120 return {a: [1]}
1121 }
1122 assert_equal('func(): dict<list<number>>', typename(Fn3))
1123 var Fn4 = (...l: list<string>) => {
1124 return []
1125 }
1126 assert_equal('func(...list<string>): list<any>', typename(Fn4))
1127 END
1128 v9.CheckSourceSuccess(['vim9script'] + lines)
1129 v9.CheckSourceSuccess(['def Xfunc()'] + lines + ['enddef', 'defcompile'])
Bram Moolenaarb7480cd2021-07-04 18:28:15 +02001130enddef
1131
Bram Moolenaarf30a14d2021-01-17 21:51:24 +01001132def Test_assignment_list_any_index()
1133 var l: list<number> = [1, 2]
1134 for [x, y, _]
1135 in [[0, 1, ''], [1, 3, '']]
1136 l[x] = l[x] + y
1137 endfor
1138 assert_equal([2, 5], l)
1139enddef
1140
Bram Moolenaar971caf52020-09-21 22:21:42 +02001141def Test_assignment_list_vim9script()
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001142 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +02001143 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001144 var v1: number
1145 var v2: number
1146 var v3: number
Bram Moolenaar971caf52020-09-21 22:21:42 +02001147 [v1, v2, v3] = [1, 2, 3]
1148 assert_equal([1, 2, 3], [v1, v2, v3])
1149 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001150 v9.CheckScriptSuccess(lines)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001151enddef
1152
1153def Test_assignment_dict()
Bram Moolenaare0de1712020-12-02 17:36:54 +01001154 var dict1: dict<bool> = {one: false, two: true}
1155 var dict2: dict<number> = {one: 1, two: 2}
1156 var dict3: dict<string> = {key: 'value'}
1157 var dict4: dict<any> = {one: 1, two: '2'}
1158 var dict5: dict<blob> = {one: 0z01, two: 0z02}
Bram Moolenaar971caf52020-09-21 22:21:42 +02001159
Bram Moolenaar31d99482022-05-26 22:24:43 +01001160 # check the type is OK
1161 var events: dict<string> = v:event
1162
Bram Moolenaar971caf52020-09-21 22:21:42 +02001163 # overwrite
1164 dict3['key'] = 'another'
Bram Moolenaare0de1712020-12-02 17:36:54 +01001165 assert_equal(dict3, {key: 'another'})
Bram Moolenaarfc74d032020-11-16 22:11:49 +01001166 dict3.key = 'yet another'
Bram Moolenaare0de1712020-12-02 17:36:54 +01001167 assert_equal(dict3, {key: 'yet another'})
Bram Moolenaarfc74d032020-11-16 22:11:49 +01001168
Bram Moolenaard24602f2020-12-20 15:20:56 +01001169 # member "any" can also be a dict and assigned to
1170 var anydict: dict<any> = {nest: {}, nr: 0}
1171 anydict.nest['this'] = 123
1172 anydict.nest.that = 456
1173 assert_equal({nest: {this: 123, that: 456}, nr: 0}, anydict)
1174
Bram Moolenaarfc74d032020-11-16 22:11:49 +01001175 var lines =<< trim END
Bram Moolenaard88dc4d2020-12-20 14:49:42 +01001176 var dd = {}
1177 dd.two = 2
1178 assert_equal({two: 2}, dd)
1179 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001180 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4f5e3972020-12-21 17:30:50 +01001181
1182 lines =<< trim END
1183 var d = {dd: {}}
1184 d.dd[0] = 2
1185 d.dd['x'] = 3
1186 d.dd.y = 4
1187 assert_equal({dd: {0: 2, x: 3, y: 4}}, d)
1188 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001189 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaard88dc4d2020-12-20 14:49:42 +01001190
1191 lines =<< trim END
Bram Moolenaar2e17fef2022-03-18 19:44:48 +00001192 var key = 'foo'
1193 g:[key] = 'value'
1194 assert_equal('value', g:foo)
1195 unlet g:foo
1196 END
1197 v9.CheckDefAndScriptSuccess(lines)
1198
1199 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +01001200 var dd = {one: 1}
Bram Moolenaarfc74d032020-11-16 22:11:49 +01001201 dd.one) = 2
1202 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001203 v9.CheckDefFailure(lines, 'E488:', 2)
Bram Moolenaard88dc4d2020-12-20 14:49:42 +01001204
1205 lines =<< trim END
1206 var dd = {one: 1}
1207 var dd.one = 2
1208 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001209 v9.CheckDefAndScriptFailure(lines, 'E1017:', 2)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001210
1211 # empty key can be used
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001212 var dd = {}
Bram Moolenaar971caf52020-09-21 22:21:42 +02001213 dd[""] = 6
Bram Moolenaare0de1712020-12-02 17:36:54 +01001214 assert_equal({['']: 6}, dd)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001215
1216 # type becomes dict<any>
Bram Moolenaare0de1712020-12-02 17:36:54 +01001217 var somedict = rand() > 0 ? {a: 1, b: 2} : {a: 'a', b: 'b'}
Bram Moolenaar971caf52020-09-21 22:21:42 +02001218
Bram Moolenaar114dbda2022-01-03 12:28:03 +00001219 # type is dict<any> even though initializer is dict<number>
1220 var anyDict: dict<any> = {a: 0}
1221 assert_equal({a: 0, b: 'x'}, extend(anyDict, {b: 'x'}))
1222
Bram Moolenaar078a4612022-01-04 15:17:03 +00001223 # using global var, which has no declared type
1224 g:myDict = {}
1225 g:myDict->extend({a: 1})
1226 g:myDict->extend({b: 'x'})
1227 assert_equal({a: 1, b: 'x'}, g:myDict)
1228 unlet g:myDict
1229
1230 # using list with declared type gives an error
1231 lines =<< trim END
1232 var d: dict<number>
1233 g:myDict = d
1234 g:myDict->extend({a: 1})
1235 g:myDict->extend({b: 'x'})
1236 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001237 v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict<number> but got dict<string>', 4)
Bram Moolenaar078a4612022-01-04 15:17:03 +00001238 unlet g:myDict
1239
Bram Moolenaar971caf52020-09-21 22:21:42 +02001240 # assignment to script-local dict
Bram Moolenaarfc74d032020-11-16 22:11:49 +01001241 lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +02001242 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001243 var test: dict<any> = {}
Bram Moolenaar971caf52020-09-21 22:21:42 +02001244 def FillDict(): dict<any>
1245 test['a'] = 43
1246 return 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 Moolenaar971caf52020-09-21 22:21:42 +02001251
1252 lines =<< trim END
1253 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001254 var test: dict<any>
Bram Moolenaar971caf52020-09-21 22:21:42 +02001255 def FillDict(): dict<any>
1256 test['a'] = 43
1257 return test
1258 enddef
1259 FillDict()
Bram Moolenaar3beaf9c2020-12-18 17:23:14 +01001260 assert_equal({a: 43}, test)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001261 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001262 v9.CheckScriptSuccess(lines)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001263
1264 # assignment to global dict
1265 lines =<< trim END
1266 vim9script
1267 g:test = {}
1268 def FillDict(): dict<any>
1269 g:test['a'] = 43
1270 return g:test
1271 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01001272 assert_equal({a: 43}, FillDict())
Bram Moolenaar971caf52020-09-21 22:21:42 +02001273 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001274 v9.CheckScriptSuccess(lines)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001275
1276 # assignment to buffer dict
1277 lines =<< trim END
1278 vim9script
1279 b:test = {}
1280 def FillDict(): dict<any>
1281 b:test['a'] = 43
1282 return b:test
1283 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01001284 assert_equal({a: 43}, FillDict())
Bram Moolenaar971caf52020-09-21 22:21:42 +02001285 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001286 v9.CheckScriptSuccess(lines)
Bram Moolenaar4f5e3972020-12-21 17:30:50 +01001287
1288 lines =<< trim END
1289 var d = {dd: test_null_dict()}
1290 d.dd[0] = 0
1291 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001292 v9.CheckDefExecFailure(lines, 'E1103:', 2)
Bram Moolenaar4f5e3972020-12-21 17:30:50 +01001293
1294 lines =<< trim END
1295 var d = {dd: 'string'}
1296 d.dd[0] = 0
1297 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001298 v9.CheckDefExecFailure(lines, 'E1148:', 2)
Bram Moolenaar3a3b10e2021-06-26 15:00:59 +02001299
1300 lines =<< trim END
1301 var n: any
1302 n.key = 5
1303 END
Ernie Raelf8da3242023-10-11 21:22:12 +02001304 v9.CheckDefExecAndScriptFailure(lines, ['E1148:', 'E1203: Dot not allowed after a number: n.key = 5'], 2)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001305enddef
1306
1307def Test_assignment_local()
1308 # Test in a separated file in order not to the current buffer/window/tab is
1309 # changed.
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001310 var script_lines: list<string> =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +02001311 let b:existing = 'yes'
1312 let w:existing = 'yes'
1313 let t:existing = 'yes'
1314
1315 def Test_assignment_local_internal()
1316 b:newvar = 'new'
1317 assert_equal('new', b:newvar)
1318 assert_equal('yes', b:existing)
1319 b:existing = 'no'
1320 assert_equal('no', b:existing)
1321 b:existing ..= 'NO'
1322 assert_equal('noNO', b:existing)
1323
1324 w:newvar = 'new'
1325 assert_equal('new', w:newvar)
1326 assert_equal('yes', w:existing)
1327 w:existing = 'no'
1328 assert_equal('no', w:existing)
1329 w:existing ..= 'NO'
1330 assert_equal('noNO', w:existing)
1331
1332 t:newvar = 'new'
1333 assert_equal('new', t:newvar)
1334 assert_equal('yes', t:existing)
1335 t:existing = 'no'
1336 assert_equal('no', t:existing)
1337 t:existing ..= 'NO'
1338 assert_equal('noNO', t:existing)
1339 enddef
1340 call Test_assignment_local_internal()
1341 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001342 v9.CheckScriptSuccess(script_lines)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001343enddef
1344
1345def Test_assignment_default()
Bram Moolenaar971caf52020-09-21 22:21:42 +02001346 # Test default values.
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001347 var thebool: bool
Bram Moolenaar971caf52020-09-21 22:21:42 +02001348 assert_equal(v:false, thebool)
1349
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001350 var thenumber: number
Bram Moolenaar971caf52020-09-21 22:21:42 +02001351 assert_equal(0, thenumber)
1352
Bram Moolenaar73e28dc2022-09-17 21:08:33 +01001353 var thefloat: float
1354 assert_equal(0.0, thefloat)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001355
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001356 var thestring: string
Bram Moolenaar971caf52020-09-21 22:21:42 +02001357 assert_equal('', thestring)
1358
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001359 var theblob: blob
Bram Moolenaar971caf52020-09-21 22:21:42 +02001360 assert_equal(0z, theblob)
1361
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001362 var Thefunc: func
Bram Moolenaar971caf52020-09-21 22:21:42 +02001363 assert_equal(test_null_function(), Thefunc)
1364
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001365 var thelist: list<any>
Bram Moolenaar971caf52020-09-21 22:21:42 +02001366 assert_equal([], thelist)
1367
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001368 var thedict: dict<any>
Bram Moolenaar971caf52020-09-21 22:21:42 +02001369 assert_equal({}, thedict)
1370
1371 if has('channel')
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001372 var thejob: job
Bram Moolenaar971caf52020-09-21 22:21:42 +02001373 assert_equal(test_null_job(), thejob)
1374
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001375 var thechannel: channel
Bram Moolenaar971caf52020-09-21 22:21:42 +02001376 assert_equal(test_null_channel(), thechannel)
1377
1378 if has('unix') && executable('cat')
1379 # check with non-null job and channel, types must match
Bram Moolenaare0de1712020-12-02 17:36:54 +01001380 thejob = job_start("cat ", {})
Bram Moolenaar971caf52020-09-21 22:21:42 +02001381 thechannel = job_getchannel(thejob)
1382 job_stop(thejob, 'kill')
1383 endif
1384 endif
1385
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001386 var nr = 1234 | nr = 5678
Bram Moolenaar971caf52020-09-21 22:21:42 +02001387 assert_equal(5678, nr)
1388enddef
1389
Bram Moolenaare08be092022-02-17 13:08:26 +00001390def Test_script_var_default()
1391 var lines =<< trim END
1392 vim9script
1393 var l: list<number>
Bram Moolenaar1983f1a2022-02-28 20:55:02 +00001394 var li = [1, 2]
Bram Moolenaare08be092022-02-17 13:08:26 +00001395 var bl: blob
Bram Moolenaar1983f1a2022-02-28 20:55:02 +00001396 var bli = 0z12
Bram Moolenaare08be092022-02-17 13:08:26 +00001397 var d: dict<number>
Bram Moolenaar1983f1a2022-02-28 20:55:02 +00001398 var di = {'a': 1, 'b': 2}
Bram Moolenaare08be092022-02-17 13:08:26 +00001399 def Echo()
1400 assert_equal([], l)
Bram Moolenaar1983f1a2022-02-28 20:55:02 +00001401 assert_equal([1, 2], li)
Bram Moolenaare08be092022-02-17 13:08:26 +00001402 assert_equal(0z, bl)
Bram Moolenaar1983f1a2022-02-28 20:55:02 +00001403 assert_equal(0z12, bli)
Bram Moolenaare08be092022-02-17 13:08:26 +00001404 assert_equal({}, d)
Bram Moolenaar1983f1a2022-02-28 20:55:02 +00001405 assert_equal({'a': 1, 'b': 2}, di)
Bram Moolenaare08be092022-02-17 13:08:26 +00001406 enddef
Bram Moolenaarea5c8982022-02-17 14:42:02 +00001407 Echo()
Bram Moolenaare08be092022-02-17 13:08:26 +00001408 END
1409 v9.CheckScriptSuccess(lines)
1410enddef
1411
Bram Moolenaara749a422022-02-12 19:52:25 +00001412let s:scriptvar = 'init'
Bram Moolenaar3862ea32021-01-01 21:05:55 +01001413
Bram Moolenaar971caf52020-09-21 22:21:42 +02001414def Test_assignment_var_list()
Bram Moolenaarda7c20c2020-11-30 21:12:19 +01001415 var lines =<< trim END
1416 var v1: string
1417 var v2: string
1418 var vrem: list<string>
1419 [v1] = ['aaa']
1420 assert_equal('aaa', v1)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001421
Bram Moolenaarda7c20c2020-11-30 21:12:19 +01001422 [v1, v2] = ['one', 'two']
1423 assert_equal('one', v1)
1424 assert_equal('two', v2)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001425
Bram Moolenaarda7c20c2020-11-30 21:12:19 +01001426 [v1, v2; vrem] = ['one', 'two']
1427 assert_equal('one', v1)
1428 assert_equal('two', v2)
1429 assert_equal([], vrem)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001430
Bram Moolenaarda7c20c2020-11-30 21:12:19 +01001431 [v1, v2; vrem] = ['one', 'two', 'three']
1432 assert_equal('one', v1)
1433 assert_equal('two', v2)
1434 assert_equal(['three'], vrem)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001435
Bram Moolenaarda7c20c2020-11-30 21:12:19 +01001436 [&ts, &sw] = [3, 4]
1437 assert_equal(3, &ts)
1438 assert_equal(4, &sw)
1439 set ts=8 sw=4
Bram Moolenaar004d9b02020-11-30 21:40:03 +01001440
1441 [@a, @z] = ['aa', 'zz']
1442 assert_equal('aa', @a)
1443 assert_equal('zz', @z)
1444
1445 [$SOME_VAR, $OTHER_VAR] = ['some', 'other']
1446 assert_equal('some', $SOME_VAR)
1447 assert_equal('other', $OTHER_VAR)
1448
Bram Moolenaar3862ea32021-01-01 21:05:55 +01001449 [g:globalvar, b:bufvar, w:winvar, t:tabvar, v:errmsg] =
1450 ['global', 'buf', 'win', 'tab', 'error']
Bram Moolenaar004d9b02020-11-30 21:40:03 +01001451 assert_equal('global', g:globalvar)
Bram Moolenaar004d9b02020-11-30 21:40:03 +01001452 assert_equal('buf', b:bufvar)
1453 assert_equal('win', w:winvar)
1454 assert_equal('tab', t:tabvar)
1455 assert_equal('error', v:errmsg)
1456 unlet g:globalvar
Bram Moolenaarda7c20c2020-11-30 21:12:19 +01001457 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001458 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar3862ea32021-01-01 21:05:55 +01001459
Bram Moolenaara749a422022-02-12 19:52:25 +00001460 [g:globalvar, scriptvar, b:bufvar] = ['global', 'script', 'buf']
Bram Moolenaar3862ea32021-01-01 21:05:55 +01001461 assert_equal('global', g:globalvar)
Bram Moolenaara749a422022-02-12 19:52:25 +00001462 assert_equal('script', scriptvar)
Bram Moolenaar3862ea32021-01-01 21:05:55 +01001463 assert_equal('buf', b:bufvar)
1464
1465 lines =<< trim END
1466 vim9script
Bram Moolenaara749a422022-02-12 19:52:25 +00001467 var scriptvar = 'init'
1468 [g:globalvar, scriptvar, w:winvar] = ['global', 'script', 'win']
Bram Moolenaar3862ea32021-01-01 21:05:55 +01001469 assert_equal('global', g:globalvar)
Bram Moolenaara749a422022-02-12 19:52:25 +00001470 assert_equal('script', scriptvar)
Bram Moolenaar3862ea32021-01-01 21:05:55 +01001471 assert_equal('win', w:winvar)
1472 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001473 v9.CheckScriptSuccess(lines)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001474enddef
1475
Bram Moolenaar2d3ac2e2022-02-03 12:34:05 +00001476def Test_assignment_empty_list()
1477 var lines =<< trim END
1478 var l2: list<any> = []
1479 var l: list<string>
1480 l = l2
1481 END
1482 v9.CheckDefAndScriptSuccess(lines)
1483enddef
1484
Bram Moolenaar971caf52020-09-21 22:21:42 +02001485def Test_assignment_vim9script()
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001486 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +02001487 vim9script
1488 def Func(): list<number>
1489 return [1, 2]
1490 enddef
Bram Moolenaar98309382020-09-27 21:58:45 +02001491 var name1: number
1492 var name2: number
1493 [name1, name2] =
Bram Moolenaar971caf52020-09-21 22:21:42 +02001494 Func()
Bram Moolenaar98309382020-09-27 21:58:45 +02001495 assert_equal(1, name1)
1496 assert_equal(2, name2)
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001497 var ll =
Bram Moolenaar971caf52020-09-21 22:21:42 +02001498 Func()
1499 assert_equal([1, 2], ll)
1500
1501 @/ = 'text'
1502 assert_equal('text', @/)
1503 @0 = 'zero'
1504 assert_equal('zero', @0)
1505 @1 = 'one'
1506 assert_equal('one', @1)
1507 @9 = 'nine'
1508 assert_equal('nine', @9)
1509 @- = 'minus'
1510 assert_equal('minus', @-)
1511 if has('clipboard_working')
1512 @* = 'star'
1513 assert_equal('star', @*)
1514 @+ = 'plus'
1515 assert_equal('plus', @+)
1516 endif
1517
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001518 var a: number = 123
Bram Moolenaar971caf52020-09-21 22:21:42 +02001519 assert_equal(123, a)
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001520 var s: string = 'yes'
Bram Moolenaar971caf52020-09-21 22:21:42 +02001521 assert_equal('yes', s)
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001522 var b: number = 42
Bram Moolenaar971caf52020-09-21 22:21:42 +02001523 assert_equal(42, b)
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001524 var w: number = 43
Bram Moolenaar971caf52020-09-21 22:21:42 +02001525 assert_equal(43, w)
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001526 var t: number = 44
Bram Moolenaar971caf52020-09-21 22:21:42 +02001527 assert_equal(44, t)
Bram Moolenaar7a66a172020-10-16 19:56:12 +02001528
1529 var to_var = 0
1530 to_var = 3
1531 assert_equal(3, to_var)
Bram Moolenaar971caf52020-09-21 22:21:42 +02001532 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001533 v9.CheckScriptSuccess(lines)
Bram Moolenaar06f9c692020-09-27 21:27:40 +02001534
1535 lines =<< trim END
1536 vim9script
1537 var n: number
1538 def Func()
1539 n = 'string'
1540 enddef
1541 defcompile
1542 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001543 v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected number but got string')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001544enddef
1545
1546def Mess(): string
1547 v:foldstart = 123
1548 return 'xxx'
1549enddef
1550
1551def Test_assignment_failure()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001552 v9.CheckDefFailure(['var name=234'], 'E1004:')
1553 v9.CheckDefFailure(['var name =234'], 'E1004:')
1554 v9.CheckDefFailure(['var name= 234'], 'E1004:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001555
Bram Moolenaar62aec932022-01-29 21:45:34 +00001556 v9.CheckScriptFailure(['vim9script', 'var name=234'], 'E1004:')
1557 v9.CheckScriptFailure(['vim9script', 'var name=234'], "before and after '='")
1558 v9.CheckScriptFailure(['vim9script', 'var name =234'], 'E1004:')
1559 v9.CheckScriptFailure(['vim9script', 'var name= 234'], 'E1004:')
1560 v9.CheckScriptFailure(['vim9script', 'var name = 234', 'name+=234'], 'E1004:')
1561 v9.CheckScriptFailure(['vim9script', 'var name = 234', 'name+=234'], "before and after '+='")
1562 v9.CheckScriptFailure(['vim9script', 'var name = "x"', 'name..="y"'], 'E1004:')
1563 v9.CheckScriptFailure(['vim9script', 'var name = "x"', 'name..="y"'], "before and after '..='")
Bram Moolenaar971caf52020-09-21 22:21:42 +02001564
Bram Moolenaar62aec932022-01-29 21:45:34 +00001565 v9.CheckDefFailure(['var true = 1'], 'E1034:')
1566 v9.CheckDefFailure(['var false = 1'], 'E1034:')
1567 v9.CheckDefFailure(['var null = 1'], 'E1034:')
1568 v9.CheckDefFailure(['var this = 1'], 'E1034:')
Bram Moolenaarce723f32023-06-10 19:00:12 +01001569 v9.CheckDefFailure(['var super = 1'], 'E1034:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001570
Bram Moolenaar8b716f52022-02-15 21:17:56 +00001571 v9.CheckDefFailure(['[a; b; c] = g:list'], 'E1001:')
1572 v9.CheckDefFailure(['var [a; b; c] = g:list'], 'E1080:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001573 v9.CheckDefExecFailure(['var a: number',
Bram Moolenaar971caf52020-09-21 22:21:42 +02001574 '[a] = test_null_list()'], 'E1093:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001575 v9.CheckDefExecFailure(['var a: number',
Bram Moolenaar971caf52020-09-21 22:21:42 +02001576 '[a] = []'], 'E1093:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001577 v9.CheckDefExecFailure(['var x: number',
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001578 'var y: number',
Bram Moolenaar971caf52020-09-21 22:21:42 +02001579 '[x, y] = [1]'], 'E1093:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001580 v9.CheckDefExecFailure(['var x: string',
Bram Moolenaar352134b2020-10-17 22:04:08 +02001581 'var y: string',
1582 '[x, y] = ["x"]'], 'E1093:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001583 v9.CheckDefExecFailure(['var x: number',
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001584 'var y: number',
1585 'var z: list<number>',
Bram Moolenaar971caf52020-09-21 22:21:42 +02001586 '[x, y; z] = [1]'], 'E1093:')
1587
Bram Moolenaar62aec932022-01-29 21:45:34 +00001588 v9.CheckDefFailure(['var somevar'], "E1022:")
1589 v9.CheckDefFailure(['var &tabstop = 4'], 'E1052:')
1590 v9.CheckDefFailure(['&g:option = 5'], 'E113:')
1591 v9.CheckScriptFailure(['vim9script', 'var &tabstop = 4'], 'E1052:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001592
Bram Moolenaar62aec932022-01-29 21:45:34 +00001593 v9.CheckDefFailure(['var $VAR = 5'], 'E1016: Cannot declare an environment variable:')
1594 v9.CheckScriptFailure(['vim9script', 'var $ENV = "xxx"'], 'E1016:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001595
1596 if has('dnd')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001597 v9.CheckDefFailure(['var @~ = 5'], 'E1066:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001598 else
Bram Moolenaar62aec932022-01-29 21:45:34 +00001599 v9.CheckDefFailure(['var @~ = 5'], 'E354:')
1600 v9.CheckDefFailure(['@~ = 5'], 'E354:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001601 endif
Bram Moolenaar62aec932022-01-29 21:45:34 +00001602 v9.CheckDefFailure(['var @a = 5'], 'E1066:')
1603 v9.CheckDefFailure(['var @/ = "x"'], 'E1066:')
1604 v9.CheckScriptFailure(['vim9script', 'var @a = "abc"'], 'E1066:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001605
Bram Moolenaar62aec932022-01-29 21:45:34 +00001606 v9.CheckDefFailure(['var g:var = 5'], 'E1016: Cannot declare a global variable:')
1607 v9.CheckDefFailure(['var w:var = 5'], 'E1016: Cannot declare a window variable:')
1608 v9.CheckDefFailure(['var b:var = 5'], 'E1016: Cannot declare a buffer variable:')
1609 v9.CheckDefFailure(['var t:var = 5'], 'E1016: Cannot declare a tab variable:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001610
Bram Moolenaar62aec932022-01-29 21:45:34 +00001611 v9.CheckDefFailure(['var anr = 4', 'anr ..= "text"'], 'E1019:')
1612 v9.CheckDefFailure(['var xnr += 4'], 'E1020:', 1)
1613 v9.CheckScriptFailure(['vim9script', 'var xnr += 4'], 'E1020:')
1614 v9.CheckDefFailure(["var xnr = xnr + 1"], 'E1001:', 1)
1615 v9.CheckScriptFailure(['vim9script', 'var xnr = xnr + 4'], 'E121:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001616
Bram Moolenaara749a422022-02-12 19:52:25 +00001617 v9.CheckScriptFailure(['vim9script', 'def Func()', 'var dummy = notfound', 'enddef', 'defcompile'], 'E1001:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001618
Bram Moolenaar62aec932022-01-29 21:45:34 +00001619 v9.CheckDefFailure(['var name: list<string> = [123]'], 'expected list<string> but got list<number>')
1620 v9.CheckDefFailure(['var name: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001621
Bram Moolenaar62aec932022-01-29 21:45:34 +00001622 v9.CheckDefFailure(['var name: dict<string> = {key: 123}'], 'expected dict<string> but got dict<number>')
1623 v9.CheckDefFailure(['var name: dict<number> = {key: "xx"}'], 'expected dict<number> but got dict<string>')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001624
Bram Moolenaar62aec932022-01-29 21:45:34 +00001625 v9.CheckDefFailure(['var name = feedkeys("0")'], 'E1031:')
1626 v9.CheckDefFailure(['var name: number = feedkeys("0")'], 'expected number but got void')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001627
Bram Moolenaar62aec932022-01-29 21:45:34 +00001628 v9.CheckDefFailure(['var name: dict <number>'], 'E1068:')
Bram Moolenaar62e0e2e2022-08-20 12:07:58 +01001629 v9.CheckDefFailure(['var name: dict<number'], 'E1009: Missing > after type: <number')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001630
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001631 assert_fails('s/^/\=g:Mess()/n', 'E794:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001632 v9.CheckDefFailure(['var name: dict<number'], 'E1009:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001633
Bram Moolenaar62aec932022-01-29 21:45:34 +00001634 v9.CheckDefFailure(['w:foo: number = 10'],
Bram Moolenaar9510d222022-09-11 15:14:05 +01001635 'E1016: Cannot declare a window variable: w:foo')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001636 v9.CheckDefFailure(['t:foo: bool = true'],
Bram Moolenaar9510d222022-09-11 15:14:05 +01001637 'E1016: Cannot declare a tab variable: t:foo')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001638 v9.CheckDefFailure(['b:foo: string = "x"'],
Bram Moolenaar9510d222022-09-11 15:14:05 +01001639 'E1016: Cannot declare a buffer variable: b:foo')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001640 v9.CheckDefFailure(['g:foo: number = 123'],
Bram Moolenaar9510d222022-09-11 15:14:05 +01001641 'E1016: Cannot declare a global variable: g:foo')
1642
1643 v9.CheckScriptFailure(['vim9script', 'w:foo: number = 123'],
1644 'E1304: Cannot use type with this variable: w:foo:')
1645 v9.CheckScriptFailure(['vim9script', 't:foo: number = 123'],
1646 'E1304: Cannot use type with this variable: t:foo:')
1647 v9.CheckScriptFailure(['vim9script', 'b:foo: number = 123'],
1648 'E1304: Cannot use type with this variable: b:foo:')
1649 v9.CheckScriptFailure(['vim9script', 'g:foo: number = 123'],
1650 'E1304: Cannot use type with this variable: g:foo:')
1651
1652 v9.CheckScriptFailure(['vim9script', 'const w:FOO: number = 123'],
1653 'E1304: Cannot use type with this variable: w:FOO:')
1654 v9.CheckScriptFailure(['vim9script', 'const t:FOO: number = 123'],
1655 'E1304: Cannot use type with this variable: t:FOO:')
1656 v9.CheckScriptFailure(['vim9script', 'const b:FOO: number = 123'],
1657 'E1304: Cannot use type with this variable: b:FOO:')
1658 v9.CheckScriptFailure(['vim9script', 'const g:FOO: number = 123'],
1659 'E1304: Cannot use type with this variable: g:FOO:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001660enddef
1661
1662def Test_assign_list()
Bram Moolenaare65081d2021-06-27 15:04:05 +02001663 var lines =<< trim END
1664 var l: list<string> = []
1665 l[0] = 'value'
1666 assert_equal('value', l[0])
Bram Moolenaar971caf52020-09-21 22:21:42 +02001667
Bram Moolenaare65081d2021-06-27 15:04:05 +02001668 l[1] = 'asdf'
1669 assert_equal('value', l[0])
1670 assert_equal('asdf', l[1])
1671 assert_equal('asdf', l[-1])
1672 assert_equal('value', l[-2])
Bram Moolenaar971caf52020-09-21 22:21:42 +02001673
Bram Moolenaare65081d2021-06-27 15:04:05 +02001674 var nrl: list<number> = []
1675 for i in range(5)
1676 nrl[i] = i
1677 endfor
1678 assert_equal([0, 1, 2, 3, 4], nrl)
1679
1680 var ul: list<any>
1681 ul[0] = 1
1682 ul[1] = 2
1683 ul[2] = 3
1684 assert_equal([1, 2, 3], ul)
1685 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001686 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar334a8b42020-10-19 16:07:42 +02001687
Bram Moolenaar1983f1a2022-02-28 20:55:02 +00001688 lines =<< trim END
1689 var l = [1, 2]
1690 g:idx = 'x'
1691 l[g:idx : 1] = [0]
1692 echo l
1693 END
Bram Moolenaar2995e5c2022-03-18 21:41:47 +00001694 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 +00001695
1696 lines =<< trim END
1697 var l = [1, 2]
1698 g:idx = 3
1699 l[g:idx : 1] = [0]
1700 echo l
1701 END
Bram Moolenaarec892232022-05-06 17:53:06 +01001702 v9.CheckDefExecAndScriptFailure(lines, 'E684: List index out of range: 3')
Bram Moolenaar1983f1a2022-02-28 20:55:02 +00001703
1704 lines =<< trim END
1705 var l = [1, 2]
1706 g:idx = 'y'
1707 l[1 : g:idx] = [0]
1708 echo l
1709 END
1710 v9.CheckDefExecAndScriptFailure(lines, ['E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "y"'])
1711
Bram Moolenaar62aec932022-01-29 21:45:34 +00001712 v9.CheckDefFailure(["var l: list<number> = ['', true]"], 'E1012: Type mismatch; expected list<number> but got list<any>', 1)
1713 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 +02001714enddef
1715
1716def Test_assign_dict()
Bram Moolenaarc3689572021-01-01 19:40:02 +01001717 var lines =<< trim END
1718 var d: dict<string> = {}
1719 d['key'] = 'value'
1720 assert_equal('value', d['key'])
Bram Moolenaar971caf52020-09-21 22:21:42 +02001721
Bram Moolenaarc3689572021-01-01 19:40:02 +01001722 d[123] = 'qwerty'
1723 assert_equal('qwerty', d[123])
1724 assert_equal('qwerty', d['123'])
Bram Moolenaar971caf52020-09-21 22:21:42 +02001725
Bram Moolenaarc3689572021-01-01 19:40:02 +01001726 var nrd: dict<number> = {}
1727 for i in range(3)
1728 nrd[i] = i
1729 endfor
1730 assert_equal({0: 0, 1: 1, 2: 2}, nrd)
1731
1732 d.somekey = 'someval'
1733 assert_equal({key: 'value', '123': 'qwerty', somekey: 'someval'}, d)
Bram Moolenaar23e2e112021-08-03 21:16:18 +02001734 unlet d.somekey
1735 assert_equal({key: 'value', '123': 'qwerty'}, d)
Bram Moolenaarc3689572021-01-01 19:40:02 +01001736 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001737 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc3689572021-01-01 19:40:02 +01001738
Bram Moolenaar62aec932022-01-29 21:45:34 +00001739 v9.CheckDefFailure(["var d: dict<number> = {a: '', b: true}"], 'E1012: Type mismatch; expected dict<number> but got dict<any>', 1)
1740 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 +00001741 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 +02001742enddef
1743
Bram Moolenaar04bdd572020-09-23 13:25:32 +02001744def Test_assign_dict_unknown_type()
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001745 var lines =<< trim END
Bram Moolenaar04bdd572020-09-23 13:25:32 +02001746 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001747 var mylist = []
Bram Moolenaare0de1712020-12-02 17:36:54 +01001748 mylist += [{one: 'one'}]
Bram Moolenaar04bdd572020-09-23 13:25:32 +02001749 def Func()
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001750 var dd = mylist[0]
Bram Moolenaar04bdd572020-09-23 13:25:32 +02001751 assert_equal('one', dd.one)
1752 enddef
1753 Func()
1754 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001755 v9.CheckScriptSuccess(lines)
Bram Moolenaar04bdd572020-09-23 13:25:32 +02001756
Bram Moolenaarce2c5442020-11-28 21:21:17 +01001757 lines =<< trim END
1758 vim9script
1759 var mylist = [[]]
Bram Moolenaare0de1712020-12-02 17:36:54 +01001760 mylist[0] += [{one: 'one'}]
Bram Moolenaarce2c5442020-11-28 21:21:17 +01001761 def Func()
1762 var dd = mylist[0][0]
1763 assert_equal('one', dd.one)
1764 enddef
1765 Func()
1766 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001767 v9.CheckScriptSuccess(lines)
Bram Moolenaar04bdd572020-09-23 13:25:32 +02001768enddef
1769
Bram Moolenaarf76ec1e2021-03-03 17:58:16 +01001770def Test_assign_dict_with_op()
1771 var lines =<< trim END
Bram Moolenaarf76ec1e2021-03-03 17:58:16 +01001772 var ds: dict<string> = {a: 'x'}
1773 ds['a'] ..= 'y'
1774 ds.a ..= 'z'
1775 assert_equal('xyz', ds.a)
1776
1777 var dn: dict<number> = {a: 9}
1778 dn['a'] += 2
1779 assert_equal(11, dn.a)
1780 dn.a += 2
1781 assert_equal(13, dn.a)
1782
1783 dn['a'] -= 3
1784 assert_equal(10, dn.a)
1785 dn.a -= 2
1786 assert_equal(8, dn.a)
1787
1788 dn['a'] *= 2
1789 assert_equal(16, dn.a)
1790 dn.a *= 2
1791 assert_equal(32, dn.a)
1792
1793 dn['a'] /= 3
1794 assert_equal(10, dn.a)
1795 dn.a /= 2
1796 assert_equal(5, dn.a)
1797
1798 dn['a'] %= 3
1799 assert_equal(2, dn.a)
1800 dn.a %= 6
1801 assert_equal(2, dn.a)
Bram Moolenaarb9c0cd82021-04-05 20:51:00 +02001802
1803 var dd: dict<dict<list<any>>>
1804 dd.a = {}
1805 dd.a.b = [0]
1806 dd.a.b += [1]
1807 assert_equal({a: {b: [0, 1]}}, dd)
Bram Moolenaar0d351a02021-04-05 21:05:26 +02001808
1809 var dab = {a: ['b']}
1810 dab.a[0] ..= 'c'
1811 assert_equal({a: ['bc']}, dab)
Bram Moolenaarf76ec1e2021-03-03 17:58:16 +01001812 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001813 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare42939a2021-04-05 17:11:17 +02001814enddef
1815
1816def Test_assign_list_with_op()
1817 var lines =<< trim END
1818 var ls: list<string> = ['x']
1819 ls[0] ..= 'y'
1820 assert_equal('xy', ls[0])
1821
1822 var ln: list<number> = [9]
1823 ln[0] += 2
1824 assert_equal(11, ln[0])
1825
1826 ln[0] -= 3
1827 assert_equal(8, ln[0])
1828
1829 ln[0] *= 2
1830 assert_equal(16, ln[0])
1831
1832 ln[0] /= 3
1833 assert_equal(5, ln[0])
1834
1835 ln[0] %= 3
1836 assert_equal(2, ln[0])
1837 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001838 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare42939a2021-04-05 17:11:17 +02001839enddef
1840
1841def Test_assign_with_op_fails()
1842 var lines =<< trim END
1843 var s = 'abc'
1844 s[1] += 'x'
1845 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001846 v9.CheckDefAndScriptFailure(lines, ['E1141:', 'E689:'], 2)
Bram Moolenaare42939a2021-04-05 17:11:17 +02001847
1848 lines =<< trim END
1849 var s = 'abc'
1850 s[1] ..= 'x'
1851 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001852 v9.CheckDefAndScriptFailure(lines, ['E1141:', 'E689:'], 2)
Bram Moolenaarb9c0cd82021-04-05 20:51:00 +02001853
1854 lines =<< trim END
1855 var dd: dict<dict<list<any>>>
1856 dd.a = {}
1857 dd.a.b += [1]
1858 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001859 v9.CheckDefExecAndScriptFailure(lines, 'E716:', 3)
Bram Moolenaarf76ec1e2021-03-03 17:58:16 +01001860enddef
1861
Bram Moolenaar971caf52020-09-21 22:21:42 +02001862def Test_assign_lambda()
1863 # check if assign a lambda to a variable which type is func or any.
Bram Moolenaar30fd8202020-09-26 15:09:30 +02001864 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +02001865 vim9script
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001866 var FuncRef = () => 123
Bram Moolenaar971caf52020-09-21 22:21:42 +02001867 assert_equal(123, FuncRef())
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001868 var FuncRef_Func: func = () => 123
Bram Moolenaar971caf52020-09-21 22:21:42 +02001869 assert_equal(123, FuncRef_Func())
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001870 var FuncRef_Any: any = () => 123
Bram Moolenaar971caf52020-09-21 22:21:42 +02001871 assert_equal(123, FuncRef_Any())
Bram Moolenaar06409502021-02-17 17:00:27 +01001872 var FuncRef_Number: func(): number = () => 321
1873 assert_equal(321, FuncRef_Number())
Bram Moolenaar971caf52020-09-21 22:21:42 +02001874 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001875 v9.CheckScriptSuccess(lines)
Bram Moolenaar328eac22021-01-07 19:23:08 +01001876
1877 lines =<< trim END
1878 var Ref: func(number)
1879 Ref = (j) => !j
1880 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001881 v9.CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected func(number) but got func(any): bool')
Bram Moolenaarc7dac852021-02-17 18:49:11 +01001882
1883 lines =<< trim END
Bram Moolenaar94722c52023-01-28 19:19:03 +00001884 echo filter([1, 2, 3], (_, v: string) => v + 1)
Bram Moolenaarc7dac852021-02-17 18:49:11 +01001885 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001886 v9.CheckDefAndScriptFailure(lines, 'E1051:')
Bram Moolenaar971caf52020-09-21 22:21:42 +02001887enddef
1888
Ernie Rael96952b22023-10-17 18:15:01 +02001889def Test_assign_funcref_args()
1890 # unspecified arguments match everything, including varargs
1891 var lines =<< trim END
1892 vim9script
1893
1894 var FuncUnknown: func: number
1895
1896 FuncUnknown = (v): number => v
1897 assert_equal(5, FuncUnknown(5))
1898
1899 FuncUnknown = (v1, v2): number => v1 + v2
1900 assert_equal(7, FuncUnknown(3, 4))
1901
1902 FuncUnknown = (...v1): number => v1[0] + v1[1] + len(v1) * 1000
1903 assert_equal(4007, FuncUnknown(3, 4, 5, 6))
1904
1905 FuncUnknown = (v: list<any>): number => v[0] + v[1] + len(v) * 1000
1906 assert_equal(5009, FuncUnknown([4, 5, 6, 7, 8]))
1907 END
1908 v9.CheckScriptSuccess(lines)
1909
1910 # varargs must match
1911 lines =<< trim END
1912 vim9script
1913 var FuncAnyVA: func(...any): number
1914 FuncAnyVA = (v): number => v
1915 END
Ernie Rael3ec6c1f2023-10-21 11:45:38 +02001916 v9.CheckScriptFailure(lines, 'E1180: Variable arguments type must be a list: any')
Ernie Rael96952b22023-10-17 18:15:01 +02001917
1918 # varargs must match
1919 lines =<< trim END
1920 vim9script
1921 var FuncAnyVA: func(...any): number
1922 FuncAnyVA = (v1, v2): number => v1 + v2
1923 END
Ernie Rael3ec6c1f2023-10-21 11:45:38 +02001924 v9.CheckScriptFailure(lines, 'E1180: Variable arguments type must be a list: any')
Ernie Rael96952b22023-10-17 18:15:01 +02001925
1926 # varargs must match
1927 lines =<< trim END
1928 vim9script
1929 var FuncAnyVA: func(...any): number
1930 FuncAnyVA = (v1: list<any>): number => 3
1931 END
Ernie Rael3ec6c1f2023-10-21 11:45:38 +02001932 v9.CheckScriptFailure(lines, 'E1180: Variable arguments type must be a list: any')
Ernie Rael96952b22023-10-17 18:15:01 +02001933enddef
1934
1935def Test_assign_funcref_arg_any()
1936 var lines =<< trim END
1937 vim9script
1938 var FuncAnyVA: func(any): number
1939 FuncAnyVA = (v): number => v
1940 END
1941 # TODO: Verify this should succeed.
1942 v9.CheckScriptSuccess(lines)
1943enddef
1944
Bram Moolenaarc0e29012020-09-27 14:22:48 +02001945def Test_heredoc()
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01001946 # simple heredoc
1947 var lines =<< trim END
zeertzjqa93d9cd2023-05-02 16:25:47 +01001948 var text =<< trim TEXT # comment
1949 abc
1950 TEXT
1951 assert_equal(['abc'], text)
Bram Moolenaarc0e29012020-09-27 14:22:48 +02001952 END
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01001953 v9.CheckDefAndScriptSuccess(lines)
1954
1955 # empty heredoc
1956 lines =<< trim END
zeertzjqa93d9cd2023-05-02 16:25:47 +01001957 var text =<< trim TEXT
1958 TEXT
1959 assert_equal([], text)
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01001960 END
1961 v9.CheckDefAndScriptSuccess(lines)
1962
1963 # heredoc with a single empty line
1964 lines =<< trim END
zeertzjqa93d9cd2023-05-02 16:25:47 +01001965 var text =<< trim TEXT
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01001966
zeertzjqa93d9cd2023-05-02 16:25:47 +01001967 TEXT
1968 assert_equal([''], text)
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01001969 END
1970 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc0e29012020-09-27 14:22:48 +02001971
zeertzjqa93d9cd2023-05-02 16:25:47 +01001972 # assign heredoc to variable with type
1973 lines =<< trim END
1974 var text: list<string> =<< trim TEXT
1975 var foo =<< trim FOO
1976 TEXT
1977 assert_equal(['var foo =<< trim FOO'], text)
1978 END
1979 v9.CheckDefAndScriptSuccess(lines)
1980
1981 # extra whitespace before type is allowed
1982 lines =<< trim END
1983 var text: list<string> =<< trim TEXT
1984 var foo =<< trim FOO
1985 TEXT
1986 assert_equal(['var foo =<< trim FOO'], text)
1987 END
1988 v9.CheckDefAndScriptSuccess(lines)
1989
1990 # missing whitespace before type is an error
1991 lines =<< trim END
1992 var text:list<string> =<< trim TEXT
1993 var foo =<< trim FOO
1994 TEXT
1995 assert_equal(['var foo =<< trim FOO'], text)
1996 END
1997 v9.CheckDefAndScriptFailure(lines, 'E1069:')
1998
1999 # assign heredoc to list slice
2000 lines =<< trim END
2001 var text = ['']
2002 text[ : ] =<< trim TEXT
2003 var foo =<< trim FOO
2004 TEXT
2005 assert_equal(['var foo =<< trim FOO'], text)
2006 END
2007 v9.CheckDefAndScriptSuccess(lines)
2008
2009 # assign heredoc to curly braces name in legacy function in Vim9 script
2010 lines =<< trim END
2011 vim9script
2012 func Func()
2013 let foo_3_bar = ['']
2014 let foo_{1 + 2}_bar[ : ] =<< trim TEXT
2015 var foo =<< trim FOO
2016 TEXT
2017 call assert_equal(['var foo =<< trim FOO'], foo_3_bar)
2018 endfunc
2019 Func()
2020 END
2021 v9.CheckScriptSuccess(lines)
2022
zeertzjq9a91d2b2024-04-09 21:47:10 +02002023 # commented out heredoc assignment without space after '#'
2024 lines =<< trim END
2025 vim9script
2026 def Func()
2027 #x =<< trim [CODE]
2028 #[CODE]
2029 enddef
2030 Func()
2031 END
2032 v9.CheckScriptSuccess(lines)
2033
zeertzjq1817ccd2024-04-10 17:37:47 +02002034 # heredoc start should not be recognized in string
2035 lines =<< trim END
2036 vim9script
2037 def Func()
2038 new
2039 @" = 'bar'
2040 ['foo', @"]->setline("]=<<"->count('='))
2041 assert_equal(['foo', 'bar'], getline(1, '$'))
2042 bwipe!
2043 enddef
2044 Func()
2045 END
2046 v9.CheckScriptSuccess(lines)
2047
Bram Moolenaar62aec932022-01-29 21:45:34 +00002048 v9.CheckDefFailure(['var lines =<< trim END X', 'END'], 'E488:')
2049 v9.CheckDefFailure(['var lines =<< trim END " comment', 'END'], 'E488:')
Bram Moolenaar2914a202020-09-27 18:24:03 +02002050
2051 lines =<< trim [END]
2052 def Func()
2053 var&lines =<< trim END
2054 x
2055 x
Bram Moolenaarb5b94802020-12-13 17:50:20 +01002056 enddef
2057 defcompile
2058 [END]
Bram Moolenaar62aec932022-01-29 21:45:34 +00002059 v9.CheckScriptFailure(lines, 'E1145: Missing heredoc end marker: END')
Bram Moolenaarb5b94802020-12-13 17:50:20 +01002060 delfunc! g:Func
2061
2062 lines =<< trim [END]
2063 def Func()
2064 var lines =<< trim END
2065 x
2066 x
Bram Moolenaar2914a202020-09-27 18:24:03 +02002067 x
2068 x
2069 x
2070 x
2071 x
2072 x
2073 enddef
2074 call Func()
2075 [END]
Bram Moolenaar62aec932022-01-29 21:45:34 +00002076 v9.CheckScriptFailure(lines, 'E1145: Missing heredoc end marker: END')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002077 delfunc! g:Func
Bram Moolenaar81530e32021-07-28 21:25:49 +02002078
2079 lines =<< trim END
2080 var lines: number =<< trim STOP
2081 aaa
2082 bbb
2083 STOP
2084 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002085 v9.CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got list<string>', 1)
Bram Moolenaard9876422022-10-12 12:58:54 +01002086
2087 lines =<< trim END
2088 var lines=<< STOP
2089 xxx
2090 STOP
2091 END
2092 v9.CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''=<<'' at "=<< STOP"', 1)
2093 lines =<< trim END
2094 var lines =<<STOP
2095 xxx
2096 STOP
2097 END
2098 v9.CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''=<<'' at "=<<STOP"', 1)
2099 lines =<< trim END
2100 var lines=<<STOP
2101 xxx
2102 STOP
2103 END
2104 v9.CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''=<<'' at "=<<STOP"', 1)
Bram Moolenaarc0e29012020-09-27 14:22:48 +02002105enddef
2106
Bram Moolenaar083966f2020-12-08 11:29:40 +01002107def Test_var_func_call()
Bram Moolenaar55759b52020-09-30 22:59:42 +02002108 var lines =<< trim END
2109 vim9script
2110 func GetValue()
2111 if exists('g:count')
2112 let g:count += 1
2113 else
2114 let g:count = 1
2115 endif
2116 return 'this'
2117 endfunc
Bram Moolenaar94722c52023-01-28 19:19:03 +00002118 var val: string = GetValue()
Bram Moolenaar55759b52020-09-30 22:59:42 +02002119 # env var is always a string
2120 var env = $TERM
2121 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002122 writefile(lines, 'Xfinished', 'D')
Bram Moolenaar55759b52020-09-30 22:59:42 +02002123 source Xfinished
2124 # GetValue() is not called during discovery phase
2125 assert_equal(1, g:count)
2126
2127 unlet g:count
Bram Moolenaar55759b52020-09-30 22:59:42 +02002128enddef
2129
Bram Moolenaar083966f2020-12-08 11:29:40 +01002130def Test_var_missing_type()
Bram Moolenaar55759b52020-09-30 22:59:42 +02002131 var lines =<< trim END
2132 vim9script
2133 var name = g:unknown
2134 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002135 v9.CheckScriptFailure(lines, 'E121:')
Bram Moolenaar55759b52020-09-30 22:59:42 +02002136
2137 lines =<< trim END
2138 vim9script
2139 var nr: number = 123
2140 var name = nr
2141 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002142 v9.CheckScriptSuccess(lines)
Bram Moolenaar55759b52020-09-30 22:59:42 +02002143enddef
2144
Bram Moolenaar083966f2020-12-08 11:29:40 +01002145def Test_var_declaration()
Bram Moolenaar55759b52020-09-30 22:59:42 +02002146 var lines =<< trim END
2147 vim9script
2148 var name: string
2149 g:var_uninit = name
2150 name = 'text'
2151 g:var_test = name
Bram Moolenaara749a422022-02-12 19:52:25 +00002152 # prefixing s: is not allowed
2153 name = 'prefixed'
2154 g:var_prefixed = name
Bram Moolenaar55759b52020-09-30 22:59:42 +02002155
Bram Moolenaar7257af42020-12-08 22:08:51 +01002156 const FOO: number = 123
2157 assert_equal(123, FOO)
Bram Moolenaar89b474d2020-12-22 21:19:39 +01002158 const FOOS = 'foos'
2159 assert_equal('foos', FOOS)
2160 final FLIST = [1]
2161 assert_equal([1], FLIST)
2162 FLIST[0] = 11
2163 assert_equal([11], FLIST)
2164
Bram Moolenaar89b474d2020-12-22 21:19:39 +01002165 const g:FOOS = 'gfoos'
2166 assert_equal('gfoos', g:FOOS)
2167 final g:FLIST = [2]
2168 assert_equal([2], g:FLIST)
2169 g:FLIST[0] = 22
2170 assert_equal([22], g:FLIST)
2171
Bram Moolenaard877a572021-04-01 19:42:48 +02002172 def SetGlobalConst()
2173 const g:globConst = 123
2174 enddef
2175 SetGlobalConst()
2176 assert_equal(123, g:globConst)
2177 assert_true(islocked('g:globConst'))
2178
Bram Moolenaar89b474d2020-12-22 21:19:39 +01002179 const w:FOOS = 'wfoos'
2180 assert_equal('wfoos', w:FOOS)
2181 final w:FLIST = [3]
2182 assert_equal([3], w:FLIST)
2183 w:FLIST[0] = 33
2184 assert_equal([33], w:FLIST)
Bram Moolenaar7257af42020-12-08 22:08:51 +01002185
Bram Moolenaar55759b52020-09-30 22:59:42 +02002186 var s:other: number
2187 other = 1234
2188 g:other_var = other
2189
Bram Moolenaarccc25aa2021-03-26 21:27:52 +01002190 var xyz: string # comment
2191
Bram Moolenaar55759b52020-09-30 22:59:42 +02002192 # type is inferred
Bram Moolenaara749a422022-02-12 19:52:25 +00002193 var dict = {['a']: 222}
Bram Moolenaar55759b52020-09-30 22:59:42 +02002194 def GetDictVal(key: any)
Bram Moolenaara749a422022-02-12 19:52:25 +00002195 g:dict_val = dict[key]
Bram Moolenaar55759b52020-09-30 22:59:42 +02002196 enddef
2197 GetDictVal('a')
Bram Moolenaar08251752021-01-11 21:20:18 +01002198
2199 final adict: dict<string> = {}
2200 def ChangeAdict()
2201 adict.foo = 'foo'
2202 enddef
2203 ChangeAdict()
Bram Moolenaar55759b52020-09-30 22:59:42 +02002204 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002205 v9.CheckScriptSuccess(lines)
Bram Moolenaar55759b52020-09-30 22:59:42 +02002206 assert_equal('', g:var_uninit)
2207 assert_equal('text', g:var_test)
2208 assert_equal('prefixed', g:var_prefixed)
2209 assert_equal(1234, g:other_var)
2210 assert_equal(222, g:dict_val)
2211
2212 unlet g:var_uninit
2213 unlet g:var_test
2214 unlet g:var_prefixed
2215 unlet g:other_var
Bram Moolenaar6e50ec22021-04-03 19:32:44 +02002216 unlet g:globConst
Bram Moolenaar89b474d2020-12-22 21:19:39 +01002217 unlet g:FOOS
2218 unlet g:FLIST
Bram Moolenaar89b474d2020-12-22 21:19:39 +01002219 unlet w:FOOS
2220 unlet w:FLIST
Bram Moolenaar55759b52020-09-30 22:59:42 +02002221enddef
2222
Bram Moolenaar566badc2022-09-18 13:46:08 +01002223def Test_create_list_after_const()
2224 const a = 1
2225 g:ll = []
2226 assert_equal(0, islocked('g:ll'))
2227 unlet g:ll
2228enddef
2229
Bram Moolenaar083966f2020-12-08 11:29:40 +01002230def Test_var_declaration_fails()
Bram Moolenaar55759b52020-09-30 22:59:42 +02002231 var lines =<< trim END
2232 vim9script
2233 final var: string
2234 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002235 v9.CheckScriptFailure(lines, 'E1125:')
Bram Moolenaar55759b52020-09-30 22:59:42 +02002236
2237 lines =<< trim END
2238 vim9script
Bram Moolenaar89b474d2020-12-22 21:19:39 +01002239 const g:constvar = 'string'
2240 g:constvar = 'xx'
2241 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002242 v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaar89b474d2020-12-22 21:19:39 +01002243 unlet g:constvar
2244
2245 lines =<< trim END
2246 vim9script
Bram Moolenaarf5906aa2021-04-02 14:35:15 +02002247 var name = 'one'
2248 lockvar name
2249 def SetLocked()
2250 name = 'two'
2251 enddef
2252 SetLocked()
2253 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002254 v9.CheckScriptFailure(lines, 'E741: Value is locked: name', 1)
Bram Moolenaardcf29ac2021-04-02 14:44:02 +02002255
2256 lines =<< trim END
2257 let s:legacy = 'one'
2258 lockvar s:legacy
2259 def SetLocked()
2260 s:legacy = 'two'
2261 enddef
2262 call SetLocked()
2263 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002264 v9.CheckScriptFailure(lines, 'E741: Value is locked: s:legacy', 1)
Bram Moolenaarf5906aa2021-04-02 14:35:15 +02002265
2266 lines =<< trim END
2267 vim9script
Bram Moolenaard877a572021-04-01 19:42:48 +02002268 def SetGlobalConst()
2269 const g:globConst = 123
2270 enddef
2271 SetGlobalConst()
2272 g:globConst = 234
2273 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002274 v9.CheckScriptFailure(lines, 'E741: Value is locked: g:globConst', 6)
Bram Moolenaard877a572021-04-01 19:42:48 +02002275 unlet g:globConst
2276
2277 lines =<< trim END
2278 vim9script
Bram Moolenaar08251752021-01-11 21:20:18 +01002279 const cdict: dict<string> = {}
2280 def Change()
2281 cdict.foo = 'foo'
2282 enddef
2283 defcompile
2284 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002285 v9.CheckScriptFailure(lines, 'E46:')
Bram Moolenaar08251752021-01-11 21:20:18 +01002286
2287 lines =<< trim END
2288 vim9script
Bram Moolenaar89b474d2020-12-22 21:19:39 +01002289 final w:finalvar = [9]
2290 w:finalvar = [8]
2291 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002292 v9.CheckScriptFailure(lines, 'E1122:')
Bram Moolenaar89b474d2020-12-22 21:19:39 +01002293 unlet w:finalvar
2294
2295 lines =<< trim END
2296 vim9script
Bram Moolenaar55759b52020-09-30 22:59:42 +02002297 const var: string
2298 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002299 v9.CheckScriptFailure(lines, 'E1021:')
Bram Moolenaar55759b52020-09-30 22:59:42 +02002300
2301 lines =<< trim END
2302 vim9script
2303 var 9var: string
2304 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002305 v9.CheckScriptFailure(lines, 'E488:')
Bram Moolenaar7257af42020-12-08 22:08:51 +01002306
Bram Moolenaar62aec932022-01-29 21:45:34 +00002307 v9.CheckDefFailure(['var foo.bar = 2'], 'E1087:')
2308 v9.CheckDefFailure(['var foo[3] = 2'], 'E1087:')
2309 v9.CheckDefFailure(['const foo: number'], 'E1021:')
Bram Moolenaare1d12112022-03-05 11:37:48 +00002310
2311 lines =<< trim END
2312 va foo = 123
2313 END
2314 v9.CheckDefAndScriptFailure(lines, 'E1065:', 1)
Bram Moolenaar31d99482022-05-26 22:24:43 +01002315
2316 lines =<< trim END
2317 var foo: func(number
2318 END
2319 v9.CheckDefAndScriptFailure(lines, 'E110:', 1)
2320
2321 lines =<< trim END
2322 var foo: func(number): func(
2323 END
2324 v9.CheckDefAndScriptFailure(lines, 'E110:', 1)
2325
2326 for type in ['num_ber',
2327 'anys', 'ani',
2328 'bools', 'boel',
2329 'blobs', 'blub',
2330 'channels', 'channol',
2331 'dicts', 'duct',
2332 'floats', 'floot',
2333 'funcs', 'funk',
2334 'jobs', 'jop',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01002335 'lists', 'last',
Bram Moolenaar31d99482022-05-26 22:24:43 +01002336 'numbers', 'numbar',
2337 'strings', 'strung',
2338 'voids', 'viod']
2339 v9.CheckDefAndScriptFailure([$'var foo: {type}'], 'E1010:', 1)
2340 endfor
Bram Moolenaar55759b52020-09-30 22:59:42 +02002341enddef
2342
Bram Moolenaare88c6b72022-02-15 15:37:11 +00002343def Test_var_declaration_inferred()
2344 # check that type is set on the list so that extend() fails
2345 var lines =<< trim END
2346 vim9script
2347 def GetList(): list<number>
2348 var l = [1, 2, 3]
2349 return l
2350 enddef
2351 echo GetList()->extend(['x'])
2352 END
2353 v9.CheckScriptFailure(lines, 'E1013:', 6)
Bram Moolenaar31d99482022-05-26 22:24:43 +01002354
2355 lines =<< trim END
2356 vim9script
2357 def GetNr(): number
2358 return 5
2359 enddef
2360 def TestOne()
2361 var some = [function('len'), GetNr]
2362 g:res = typename(some)
2363 enddef
2364 TestOne()
2365 assert_equal('list<func(): number>', g:res)
2366
2367 def TestTwo()
2368 var some = [function('len'), GetNr]
2369 g:res = typename(some)
2370 enddef
2371 TestTwo()
2372 assert_equal('list<func(): number>', g:res)
2373 unlet g:res
2374
2375 # FIXME: why is the type different?
2376 var first = [function('len'), GetNr]
2377 assert_equal('list<func(...): number>', typename(first))
2378 var second = [GetNr, function('len')]
2379 assert_equal('list<func(...): number>', typename(second))
2380 END
2381 v9.CheckScriptSuccess(lines)
Bram Moolenaare88c6b72022-02-15 15:37:11 +00002382enddef
2383
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002384def Test_script_local_in_legacy()
Bram Moolenaara749a422022-02-12 19:52:25 +00002385 # OK to define script-local later but before compiling
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002386 var lines =<< trim END
2387 def SetLater()
Bram Moolenaara749a422022-02-12 19:52:25 +00002388 legvar = 'two'
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002389 enddef
Bram Moolenaar96cf4ba2021-04-24 14:15:41 +02002390 let s:legvar = 'one'
Bram Moolenaara749a422022-02-12 19:52:25 +00002391 defcompile
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002392 call SetLater()
Bram Moolenaar96cf4ba2021-04-24 14:15:41 +02002393 call assert_equal('two', s:legvar)
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002394 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002395 v9.CheckScriptSuccess(lines)
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002396
2397 # OK to leave out s: prefix when script-local already defined
2398 lines =<< trim END
Bram Moolenaar96cf4ba2021-04-24 14:15:41 +02002399 let s:legvar = 'one'
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002400 def SetNoPrefix()
Bram Moolenaar96cf4ba2021-04-24 14:15:41 +02002401 legvar = 'two'
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002402 enddef
2403 call SetNoPrefix()
Bram Moolenaar96cf4ba2021-04-24 14:15:41 +02002404 call assert_equal('two', s:legvar)
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002405 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002406 v9.CheckScriptSuccess(lines)
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002407
Bram Moolenaara749a422022-02-12 19:52:25 +00002408 # Not OK to leave out s: prefix when script-local defined after compiling
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002409 lines =<< trim END
2410 def SetLaterNoPrefix()
Bram Moolenaar96cf4ba2021-04-24 14:15:41 +02002411 legvar = 'two'
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002412 enddef
2413 defcompile
Bram Moolenaar96cf4ba2021-04-24 14:15:41 +02002414 let s:legvar = 'one'
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002415 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002416 v9.CheckScriptFailure(lines, 'E476:', 1)
Bram Moolenaar47bc9c32021-07-17 21:24:56 +02002417
Bram Moolenaarb18b4962022-09-02 21:55:50 +01002418 edit! Xslfile
Bram Moolenaar47bc9c32021-07-17 21:24:56 +02002419 lines =<< trim END
2420 var edit: bool
2421 legacy edit
2422 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002423 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar643ce6c2021-04-06 21:17:27 +02002424enddef
2425
Bram Moolenaar083966f2020-12-08 11:29:40 +01002426def Test_var_type_check()
Bram Moolenaar55759b52020-09-30 22:59:42 +02002427 var lines =<< trim END
2428 vim9script
2429 var name: string
2430 name = 1234
2431 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002432 v9.CheckScriptFailure(lines, 'E1012:')
Bram Moolenaar55759b52020-09-30 22:59:42 +02002433
2434 lines =<< trim END
2435 vim9script
2436 var name:string
2437 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002438 v9.CheckScriptFailure(lines, 'E1069:')
Bram Moolenaar55759b52020-09-30 22:59:42 +02002439
Bram Moolenaar62aec932022-01-29 21:45:34 +00002440 v9.CheckDefAndScriptFailure(['var n:number = 42'], 'E1069:')
Bram Moolenaar60faf862021-08-23 22:22:45 +02002441
Bram Moolenaar55759b52020-09-30 22:59:42 +02002442 lines =<< trim END
2443 vim9script
2444 var name: asdf
2445 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002446 v9.CheckScriptFailure(lines, 'E1010:')
Bram Moolenaar55759b52020-09-30 22:59:42 +02002447
2448 lines =<< trim END
2449 vim9script
Bram Moolenaara749a422022-02-12 19:52:25 +00002450 var l: list<number>
2451 l = []
Bram Moolenaar55759b52020-09-30 22:59:42 +02002452 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002453 v9.CheckScriptSuccess(lines)
Bram Moolenaar55759b52020-09-30 22:59:42 +02002454
2455 lines =<< trim END
2456 vim9script
Bram Moolenaara749a422022-02-12 19:52:25 +00002457 var d: dict<number>
2458 d = {}
Bram Moolenaar55759b52020-09-30 22:59:42 +02002459 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002460 v9.CheckScriptSuccess(lines)
Bram Moolenaar378697a2021-07-15 19:23:18 +02002461
2462 lines =<< trim END
2463 vim9script
2464 var d = {a: 1, b: [2]}
2465 def Func(b: bool)
2466 var l: list<number> = b ? d.b : [3]
2467 enddef
2468 defcompile
2469 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002470 v9.CheckScriptSuccess(lines)
Bram Moolenaar55759b52020-09-30 22:59:42 +02002471enddef
2472
2473let g:dict_number = #{one: 1, two: 2}
2474
Bram Moolenaar083966f2020-12-08 11:29:40 +01002475def Test_var_list_dict_type()
Bram Moolenaar55759b52020-09-30 22:59:42 +02002476 var ll: list<number>
2477 ll = [1, 2, 2, 3, 3, 3]->uniq()
2478 ll->assert_equal([1, 2, 3])
2479
2480 var dd: dict<number>
2481 dd = g:dict_number
2482 dd->assert_equal(g:dict_number)
2483
2484 var lines =<< trim END
2485 var ll: list<number>
2486 ll = [1, 2, 3]->map('"one"')
2487 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002488 v9.CheckDefExecFailure(lines, 'E1012: Type mismatch; expected list<number> but got list<string>')
Bram Moolenaar55759b52020-09-30 22:59:42 +02002489enddef
2490
Bram Moolenaar083966f2020-12-08 11:29:40 +01002491def Test_cannot_use_let()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002492 v9.CheckDefAndScriptFailure(['let a = 34'], 'E1126:', 1)
Bram Moolenaar083966f2020-12-08 11:29:40 +01002493enddef
2494
Bram Moolenaar55759b52020-09-30 22:59:42 +02002495def Test_unlet()
2496 g:somevar = 'yes'
2497 assert_true(exists('g:somevar'))
2498 unlet g:somevar
2499 assert_false(exists('g:somevar'))
2500 unlet! g:somevar
2501
2502 # also works for script-local variable in legacy Vim script
2503 s:somevar = 'legacy'
2504 assert_true(exists('s:somevar'))
2505 unlet s:somevar
2506 assert_false(exists('s:somevar'))
2507 unlet! s:somevar
2508
Bram Moolenaar83d0cec2022-02-04 21:17:58 +00002509 if 0
2510 unlet g:does_not_exist
2511 endif
2512
2513 v9.CheckDefExecFailure(['unlet v:notfound.key'], 'E1001:')
2514
Bram Moolenaar62aec932022-01-29 21:45:34 +00002515 v9.CheckDefExecFailure([
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002516 'var dd = 111',
2517 'unlet dd',
2518 ], 'E1081:', 2)
2519
Bram Moolenaar752fc692021-01-04 21:57:11 +01002520 # dict unlet
Bram Moolenaarea5c8982022-02-17 14:42:02 +00002521 var dd = {a: 1, b: 2, c: 3, 4: 4}
Bram Moolenaar752fc692021-01-04 21:57:11 +01002522 unlet dd['a']
2523 unlet dd.c
Bram Moolenaarea5c8982022-02-17 14:42:02 +00002524 unlet dd[4]
Bram Moolenaar752fc692021-01-04 21:57:11 +01002525 assert_equal({b: 2}, dd)
2526
Bram Moolenaar6b8c7ba2022-03-20 17:46:06 +00002527 # null key works like empty string
2528 dd = {'': 1, x: 9}
2529 unlet dd[null_string]
2530 assert_equal({x: 9}, dd)
2531
Bram Moolenaar752fc692021-01-04 21:57:11 +01002532 # list unlet
2533 var ll = [1, 2, 3, 4]
2534 unlet ll[1]
2535 unlet ll[-1]
2536 assert_equal([1, 3], ll)
2537
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002538 ll = [1, 2, 3, 4]
2539 unlet ll[0 : 1]
2540 assert_equal([3, 4], ll)
2541
2542 ll = [1, 2, 3, 4]
2543 unlet ll[2 : 8]
2544 assert_equal([1, 2], ll)
2545
2546 ll = [1, 2, 3, 4]
2547 unlet ll[-2 : -1]
2548 assert_equal([1, 2], ll)
2549
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00002550 g:nrdict = {1: 1, 2: 2}
2551 g:idx = 1
2552 unlet g:nrdict[g:idx]
2553 assert_equal({2: 2}, g:nrdict)
2554 unlet g:nrdict
2555 unlet g:idx
2556
Bram Moolenaar62aec932022-01-29 21:45:34 +00002557 v9.CheckDefFailure([
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002558 'var ll = [1, 2]',
2559 'll[1 : 2] = 7',
Bram Moolenaar4f0884d2021-08-11 21:49:23 +02002560 ], 'E1012: Type mismatch; expected list<number> but got number', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002561 v9.CheckDefFailure([
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002562 'var dd = {a: 1}',
2563 'unlet dd["a" : "a"]',
2564 ], 'E1166:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002565 v9.CheckDefExecFailure([
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002566 'unlet g:adict[0 : 1]',
2567 ], 'E1148:', 1)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002568 v9.CheckDefFailure([
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002569 'var ll = [1, 2]',
2570 'unlet ll[0:1]',
2571 ], 'E1004:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002572 v9.CheckDefFailure([
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002573 'var ll = [1, 2]',
2574 'unlet ll[0 :1]',
2575 ], 'E1004:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002576 v9.CheckDefFailure([
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002577 'var ll = [1, 2]',
2578 'unlet ll[0: 1]',
2579 ], 'E1004:', 2)
Bram Moolenaare08be092022-02-17 13:08:26 +00002580
2581 v9.CheckDefExecFailure([
2582 'g:ll = [1, 2]',
2583 'g:idx = "x"',
2584 'unlet g:ll[g:idx]',
2585 ], 'E1029: Expected number but got string', 3)
2586
2587 v9.CheckDefExecFailure([
2588 'g:ll = [1, 2, 3]',
2589 'g:idx = "x"',
2590 'unlet g:ll[g:idx : 2]',
2591 ], 'E1029: Expected number but got string', 3)
2592
2593 v9.CheckDefExecFailure([
2594 'g:ll = [1, 2, 3]',
2595 'g:idx = "x"',
2596 'unlet g:ll[0 : g:idx]',
2597 ], 'E1029: Expected number but got string', 3)
2598
Bram Moolenaar7f2c3412021-11-29 16:01:49 +00002599 # command recognized as assignment when skipping, should not give an error
Bram Moolenaar62aec932022-01-29 21:45:34 +00002600 v9.CheckScriptSuccess([
Bram Moolenaar7f2c3412021-11-29 16:01:49 +00002601 'vim9script',
2602 'for i in []',
2603 " put =''",
2604 'endfor'])
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002605
Bram Moolenaar62aec932022-01-29 21:45:34 +00002606 v9.CheckDefFailure([
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002607 'var ll = [1, 2]',
2608 'unlet ll["x" : 1]',
2609 ], 'E1012:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002610 v9.CheckDefFailure([
Bram Moolenaar5b5ae292021-02-20 17:04:02 +01002611 'var ll = [1, 2]',
2612 'unlet ll[0 : "x"]',
2613 ], 'E1012:', 2)
2614
Bram Moolenaar752fc692021-01-04 21:57:11 +01002615 # list of dict unlet
2616 var dl = [{a: 1, b: 2}, {c: 3}]
2617 unlet dl[0]['b']
2618 assert_equal([{a: 1}, {c: 3}], dl)
2619
Bram Moolenaar62aec932022-01-29 21:45:34 +00002620 v9.CheckDefExecFailure([
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002621 'var ll = test_null_list()',
2622 'unlet ll[0]',
2623 ], 'E684:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002624 v9.CheckDefExecFailure([
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002625 'var ll = [1]',
2626 'unlet ll[2]',
2627 ], 'E684:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002628 v9.CheckDefExecFailure([
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002629 'var ll = [1]',
2630 'unlet ll[g:astring]',
Bram Moolenaarf30a14d2021-01-17 21:51:24 +01002631 ], 'E1012:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002632 v9.CheckDefExecFailure([
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002633 'var dd = test_null_dict()',
2634 'unlet dd["a"]',
2635 ], 'E716:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002636 v9.CheckDefExecFailure([
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002637 'var dd = {a: 1}',
2638 'unlet dd["b"]',
2639 ], 'E716:', 2)
Bram Moolenaar62aec932022-01-29 21:45:34 +00002640 v9.CheckDefExecFailure([
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002641 'var dd = {a: 1}',
2642 'unlet dd[g:alist]',
2643 ], 'E1105:', 2)
Bram Moolenaar752fc692021-01-04 21:57:11 +01002644
Bram Moolenaarea5c8982022-02-17 14:42:02 +00002645 v9.CheckDefExecFailure([
Bram Moolenaar2984ed32022-08-20 14:51:17 +01002646 'g:dd = {"a": 1, 2: 2}',
Bram Moolenaarea5c8982022-02-17 14:42:02 +00002647 'unlet g:dd[0z11]',
2648 ], 'E1029:', 2)
Bram Moolenaar6296d1e2022-02-17 16:30:11 +00002649 v9.CheckDefExecFailure([
Bram Moolenaar2984ed32022-08-20 14:51:17 +01002650 'g:str = "a string"',
Bram Moolenaar6296d1e2022-02-17 16:30:11 +00002651 'unlet g:str[0]',
2652 ], 'E1148: Cannot index a string', 2)
Bram Moolenaarea5c8982022-02-17 14:42:02 +00002653
Bram Moolenaar2ef951d2021-01-03 20:55:26 +01002654 # can compile unlet before variable exists
Bram Moolenaar752fc692021-01-04 21:57:11 +01002655 g:someDict = {key: 'val'}
2656 var k = 'key'
2657 unlet g:someDict[k]
2658 assert_equal({}, g:someDict)
2659 unlet g:someDict
2660 assert_false(exists('g:someDict'))
Bram Moolenaar2ef951d2021-01-03 20:55:26 +01002661
Bram Moolenaar62aec932022-01-29 21:45:34 +00002662 v9.CheckScriptFailure([
Bram Moolenaar55759b52020-09-30 22:59:42 +02002663 'vim9script',
2664 'var svar = 123',
2665 'unlet svar',
2666 ], 'E1081:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002667 v9.CheckScriptFailure([
Bram Moolenaar55759b52020-09-30 22:59:42 +02002668 'vim9script',
2669 'var svar = 123',
2670 'unlet s:svar',
Bram Moolenaara749a422022-02-12 19:52:25 +00002671 ], 'E1268:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002672 v9.CheckScriptFailure([
Bram Moolenaar55759b52020-09-30 22:59:42 +02002673 'vim9script',
2674 'var svar = 123',
2675 'def Func()',
2676 ' unlet svar',
2677 'enddef',
2678 'defcompile',
2679 ], 'E1081:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002680 v9.CheckScriptFailure([
Bram Moolenaar55759b52020-09-30 22:59:42 +02002681 'vim9script',
2682 'var svar = 123',
Bram Moolenaar9aed7292020-12-18 15:38:00 +01002683 'func Func()',
2684 ' unlet s:svar',
2685 'endfunc',
2686 'Func()',
2687 ], 'E1081:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002688 v9.CheckScriptFailure([
Bram Moolenaar9aed7292020-12-18 15:38:00 +01002689 'vim9script',
2690 'var svar = 123',
Bram Moolenaar55759b52020-09-30 22:59:42 +02002691 'def Func()',
2692 ' unlet s:svar',
2693 'enddef',
2694 'defcompile',
2695 ], 'E1081:')
2696
Bram Moolenaar62aec932022-01-29 21:45:34 +00002697 v9.CheckScriptFailure([
Bram Moolenaar71b76852021-12-17 20:15:38 +00002698 'vim9script',
2699 'def Delcount(dict: dict<any>)',
2700 ' unlet dict.count',
2701 'enddef',
2702 'Delcount(v:)',
2703 ], 'E742:')
2704
Bram Moolenaar62aec932022-01-29 21:45:34 +00002705 v9.CheckScriptFailure([
Bram Moolenaar71b76852021-12-17 20:15:38 +00002706 'vim9script',
2707 'def DelChangedtick(dict: dict<any>)',
2708 ' unlet dict.changedtick',
2709 'enddef',
2710 'DelChangedtick(b:)',
2711 ], 'E795:')
2712
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002713 writefile(['vim9script', 'export var svar = 1234'], 'XunletExport.vim', 'D')
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002714 var lines =<< trim END
2715 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002716 import './XunletExport.vim' as exp
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002717 def UnletSvar()
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002718 unlet exp.svar
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002719 enddef
2720 defcompile
2721 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002722 v9.CheckScriptFailure(lines, 'E1260:', 1)
Bram Moolenaar0acbf5a2021-01-05 20:58:25 +01002723
Bram Moolenaar55759b52020-09-30 22:59:42 +02002724 $ENVVAR = 'foobar'
2725 assert_equal('foobar', $ENVVAR)
2726 unlet $ENVVAR
2727 assert_equal('', $ENVVAR)
2728enddef
2729
Bram Moolenaarc5f59fa2021-01-21 12:34:14 +01002730def Test_expr_error_no_assign()
2731 var lines =<< trim END
2732 vim9script
2733 var x = invalid
2734 echo x
2735 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002736 v9.CheckScriptFailureList(lines, ['E121:', 'E121:'])
Bram Moolenaarc5f59fa2021-01-21 12:34:14 +01002737
2738 lines =<< trim END
2739 vim9script
2740 var x = 1 / 0
2741 echo x
2742 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002743 v9.CheckScriptFailure(lines, 'E1154:')
Bram Moolenaarc5f59fa2021-01-21 12:34:14 +01002744
2745 lines =<< trim END
2746 vim9script
2747 var x = 1 % 0
2748 echo x
2749 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002750 v9.CheckScriptFailure(lines, 'E1154:')
Bram Moolenaarccc25aa2021-03-26 21:27:52 +01002751
2752 lines =<< trim END
2753 var x: string 'string'
2754 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002755 v9.CheckDefAndScriptFailure(lines, 'E488:')
Bram Moolenaarc5f59fa2021-01-21 12:34:14 +01002756enddef
2757
2758
Bram Moolenaar17126b12021-01-07 22:03:02 +01002759def Test_assign_command_modifier()
2760 var lines =<< trim END
Bram Moolenaar9e0f8832021-01-09 12:09:22 +01002761 var verbose = 0
2762 verbose = 1
2763 assert_equal(1, verbose)
2764 silent verbose = 2
2765 assert_equal(2, verbose)
2766 silent verbose += 2
2767 assert_equal(4, verbose)
2768 silent verbose -= 1
2769 assert_equal(3, verbose)
Bram Moolenaar17126b12021-01-07 22:03:02 +01002770
Bram Moolenaar9e0f8832021-01-09 12:09:22 +01002771 var topleft = {one: 1}
2772 sandbox topleft.one = 3
2773 assert_equal({one: 3}, topleft)
2774 leftabove topleft[' '] = 4
2775 assert_equal({one: 3, ' ': 4}, topleft)
2776
2777 var x: number
2778 var y: number
2779 silent [x, y] = [1, 2]
2780 assert_equal(1, x)
2781 assert_equal(2, y)
Bram Moolenaar17126b12021-01-07 22:03:02 +01002782 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002783 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar17126b12021-01-07 22:03:02 +01002784enddef
2785
Bram Moolenaar74f4a962021-06-17 21:03:07 +02002786def Test_assign_alt_buf_register()
2787 var lines =<< trim END
2788 edit 'file_b1'
2789 var b1 = bufnr()
2790 edit 'file_b2'
2791 var b2 = bufnr()
2792 assert_equal(b1, bufnr('#'))
2793 @# = b2
2794 assert_equal(b2, bufnr('#'))
2795 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002796 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar74f4a962021-06-17 21:03:07 +02002797enddef
2798
Bram Moolenaar32154662021-03-28 21:14:06 +02002799def Test_script_funcref_case()
2800 var lines =<< trim END
2801 var Len = (s: string): number => len(s) + 1
2802 assert_equal(5, Len('asdf'))
2803 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002804 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar32154662021-03-28 21:14:06 +02002805
2806 lines =<< trim END
2807 var len = (s: string): number => len(s) + 1
2808 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002809 v9.CheckDefAndScriptFailure(lines, 'E704:')
Bram Moolenaar32154662021-03-28 21:14:06 +02002810
2811 lines =<< trim END
2812 vim9script
Bram Moolenaara749a422022-02-12 19:52:25 +00002813 var Len = (s: string): number => len(s) + 2
Bram Moolenaar32154662021-03-28 21:14:06 +02002814 assert_equal(6, Len('asdf'))
2815 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002816 v9.CheckScriptSuccess(lines)
Bram Moolenaar32154662021-03-28 21:14:06 +02002817
2818 lines =<< trim END
2819 vim9script
Bram Moolenaara749a422022-02-12 19:52:25 +00002820 var len = (s: string): number => len(s) + 1
Bram Moolenaar32154662021-03-28 21:14:06 +02002821 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002822 v9.CheckScriptFailure(lines, 'E704:')
Bram Moolenaar32154662021-03-28 21:14:06 +02002823enddef
2824
Bram Moolenaar44a89772021-12-18 12:31:33 +00002825def Test_script_funcref_runtime_type_check()
2826 var lines =<< trim END
2827 vim9script
2828 def FuncWithNumberArg(n: number)
2829 enddef
2830 def Test()
2831 var Ref: func(string) = function(FuncWithNumberArg)
2832 enddef
2833 defcompile
2834 END
2835 # OK at compile time
Bram Moolenaar62aec932022-01-29 21:45:34 +00002836 v9.CheckScriptSuccess(lines)
Bram Moolenaar44a89772021-12-18 12:31:33 +00002837
2838 # Type check fails at runtime
Bram Moolenaar62aec932022-01-29 21:45:34 +00002839 v9.CheckScriptFailure(lines + ['Test()'], 'E1012: Type mismatch; expected func(string) but got func(number)')
Bram Moolenaar44a89772021-12-18 12:31:33 +00002840enddef
2841
Bram Moolenaarbdc0f1c2021-04-24 19:08:24 +02002842def Test_inc_dec()
2843 var lines =<< trim END
2844 var nr = 7
2845 ++nr
Bram Moolenaar730bf302021-04-24 20:43:56 +02002846 assert_equal(8, nr)
Bram Moolenaarbdc0f1c2021-04-24 19:08:24 +02002847 --nr
Bram Moolenaar730bf302021-04-24 20:43:56 +02002848 assert_equal(7, nr)
Bram Moolenaarf3d30842021-06-25 19:29:30 +02002849 ++nr | ++nr
2850 assert_equal(9, nr)
2851 ++nr # comment
2852 assert_equal(10, nr)
Bram Moolenaarbdc0f1c2021-04-24 19:08:24 +02002853
2854 var ll = [1, 2]
2855 --ll[0]
2856 ++ll[1]
Bram Moolenaar730bf302021-04-24 20:43:56 +02002857 assert_equal([0, 3], ll)
2858
2859 g:count = 1
2860 ++g:count
2861 --g:count
2862 assert_equal(1, g:count)
2863 unlet g:count
Bram Moolenaarbdc0f1c2021-04-24 19:08:24 +02002864 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002865 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar22480d12021-06-25 21:31:09 +02002866
2867 lines =<< trim END
2868 var nr = 7
2869 ++ nr
2870 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002871 v9.CheckDefAndScriptFailure(lines, "E1202: No white space allowed after '++': ++ nr")
Bram Moolenaarbdc0f1c2021-04-24 19:08:24 +02002872enddef
2873
Bram Moolenaar327d3ee2021-07-28 19:34:14 +02002874def Test_abort_after_error()
2875 # should abort after strpart() fails, not give another type error
2876 var lines =<< trim END
2877 vim9script
2878 var x: string
2879 x = strpart(1, 2)
2880 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002881 writefile(lines, 'Xtestscript', 'D')
Bram Moolenaar327d3ee2021-07-28 19:34:14 +02002882 var expected = 'E1174: String required for argument 1'
2883 assert_fails('so Xtestscript', [expected, expected], 3)
Bram Moolenaar327d3ee2021-07-28 19:34:14 +02002884enddef
2885
Bram Moolenaarafa048f2022-02-22 20:43:36 +00002886def Test_using_s_var_in_function()
2887 var lines =<< trim END
2888 vim9script
2889 var scriptlevel = 123
2890 def SomeFunc()
2891 echo s:scriptlevel
2892 enddef
2893 SomeFunc()
2894 END
2895 v9.CheckScriptFailure(lines, 'E1268:')
2896
2897 # OK in legacy script
2898 lines =<< trim END
2899 let s:scriptlevel = 123
2900 def s:SomeFunc()
2901 echo s:scriptlevel
2902 enddef
2903 call s:SomeFunc()
2904 END
2905 v9.CheckScriptSuccess(lines)
2906
2907 lines =<< trim END
2908 vim9script
2909 var scriptlevel = 123
2910 def SomeFunc()
2911 s:scriptlevel = 456
2912 enddef
2913 SomeFunc()
2914 END
2915 v9.CheckScriptFailure(lines, 'E1268:')
2916
2917 # OK in legacy script
2918 lines =<< trim END
2919 let s:scriptlevel = 123
2920 def s:SomeFunc()
2921 s:scriptlevel = 456
2922 enddef
2923 call s:SomeFunc()
2924 call assert_equal(456, s:scriptlevel)
2925 END
2926 v9.CheckScriptSuccess(lines)
2927enddef
2928
Yegappan Lakshmananb5a07192023-10-05 20:14:43 +02002929" Test for specifying a type in assignment
2930def Test_type_specification_in_assignment()
2931 # specify type for an existing script local variable without "var"
2932 var lines =<< trim END
2933 vim9script
2934 var n: number = 10
2935 n: number = 20
2936 END
2937 v9.CheckSourceFailure(lines, 'E488: Trailing characters: : number = 20', 3)
2938
2939 # specify type for a non-existing script local variable without "var"
2940 lines =<< trim END
2941 vim9script
2942 MyVar: string = 'abc'
2943 END
2944 v9.CheckSourceFailure(lines, "E492: Not an editor command: MyVar: string = 'abc'", 2)
2945
2946 # specify type for an existing def local variable without "var"
2947 lines =<< trim END
2948 vim9script
2949 def Foo()
2950 var n: number = 10
2951 n: number = 20
2952 enddef
2953 Foo()
2954 END
2955 v9.CheckSourceFailure(lines, 'E488: Trailing characters: : number = 20', 2)
2956
2957 # specify type for a non-existing def local variable without "var"
2958 lines =<< trim END
2959 vim9script
2960 def Foo()
2961 MyVar: string = 'abc'
2962 enddef
2963 Foo()
2964 END
2965 v9.CheckSourceFailure(lines, "E476: Invalid command: MyVar: string = 'abc'", 1)
2966enddef
2967
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002968let g:someVar = 'X'
2969
2970" Test for heredoc with Vim expressions.
2971" This messes up highlighting, keep it near the end.
2972def Test_heredoc_expr()
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01002973 var lines =<< trim CODE
2974 var s = "local"
2975 var a1 = "1"
2976 var a2 = "2"
2977 var a3 = "3"
2978 var a4 = ""
2979 var code =<< trim eval END
LemonBoy2eaef102022-05-06 13:14:50 +01002980 var a = {5 + 10}
2981 var b = {min([10, 6])} + {max([4, 6])}
2982 var c = "{s}"
2983 var d = x{a1}x{a2}x{a3}x{a4}
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01002984 END
2985 assert_equal(['var a = 15', 'var b = 6 + 6', 'var c = "local"', 'var d = x1x2x3x'], code)
2986 CODE
2987 v9.CheckDefAndScriptSuccess(lines)
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002988
Yegappan Lakshmananf01493c2024-04-14 23:21:02 +02002989 # Evaluate a dictionary
2990 lines =<< trim CODE
2991 var d1 = {'a': 10, 'b': [1, 2]}
2992 var code =<< trim eval END
2993 var d2 = {d1}
2994 END
2995 assert_equal(["var d2 = {'a': 10, 'b': [1, 2]}"], code)
2996 CODE
2997 v9.CheckDefAndScriptSuccess(lines)
2998
Yegappan Lakshmananbce51d92024-04-15 19:19:52 +02002999 # Evaluate an empty dictionary
3000 lines =<< trim CODE
3001 var d1 = {}
3002 var code =<< trim eval END
3003 var d2 = {d1}
3004 END
3005 assert_equal(["var d2 = {}"], code)
3006 CODE
3007 v9.CheckDefAndScriptSuccess(lines)
3008
3009 # Evaluate a null dictionary
3010 lines =<< trim CODE
3011 var d1 = test_null_dict()
3012 var code =<< trim eval END
3013 var d2 = {d1}
3014 END
3015 assert_equal(["var d2 = {}"], code)
3016 CODE
3017 v9.CheckDefAndScriptSuccess(lines)
3018
3019 # Evaluate a List
3020 lines =<< trim CODE
3021 var l1 = ['a', 'b', 'c']
3022 var code =<< trim eval END
3023 var l2 = {l1}
3024 END
3025 assert_equal(["var l2 = ['a', 'b', 'c']"], code)
3026 CODE
3027 v9.CheckDefAndScriptSuccess(lines)
3028
3029 # Evaluate an empty List
3030 lines =<< trim CODE
3031 var l1 = []
3032 var code =<< trim eval END
3033 var l2 = {l1}
3034 END
3035 assert_equal(["var l2 = []"], code)
3036 CODE
3037 v9.CheckDefAndScriptSuccess(lines)
3038
3039 # Evaluate a null List
3040 lines =<< trim CODE
3041 var l1 = test_null_list()
3042 var code =<< trim eval END
3043 var l2 = {l1}
3044 END
3045 assert_equal(["var l2 = []"], code)
3046 CODE
3047 v9.CheckDefAndScriptSuccess(lines)
3048
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01003049 lines =<< trim CODE
3050 var code =<< eval trim END
LemonBoy2eaef102022-05-06 13:14:50 +01003051 var s = "{$SOME_ENV_VAR}"
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01003052 END
3053 assert_equal(['var s = "somemore"'], code)
3054 CODE
3055 v9.CheckDefAndScriptSuccess(lines)
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003056
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01003057 lines =<< trim CODE
3058 var code =<< eval END
LemonBoy2eaef102022-05-06 13:14:50 +01003059 var s = "{$SOME_ENV_VAR}"
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01003060 END
3061 assert_equal([' var s = "somemore"'], code)
3062 CODE
3063 v9.CheckDefAndScriptSuccess(lines)
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003064
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01003065 lines =<< trim CODE
3066 var code =<< eval trim END
LemonBoy2eaef102022-05-06 13:14:50 +01003067 let a = {{abc}}
3068 let b = {g:someVar}
3069 let c = {{
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01003070 END
LemonBoy2eaef102022-05-06 13:14:50 +01003071 assert_equal(['let a = {abc}', 'let b = X', 'let c = {'], code)
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01003072 CODE
3073 v9.CheckDefAndScriptSuccess(lines)
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003074
Yegappan Lakshmanan1fc6ea92022-04-21 23:30:15 +01003075 lines =<< trim LINES
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003076 var text =<< eval trim END
LemonBoy2eaef102022-05-06 13:14:50 +01003077 let b = {
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003078 END
3079 LINES
LemonBoy2eaef102022-05-06 13:14:50 +01003080 v9.CheckDefAndScriptFailure(lines, "E1279: Missing '}'")
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003081
3082 lines =<< trim LINES
3083 var text =<< eval trim END
LemonBoy2eaef102022-05-06 13:14:50 +01003084 let b = {abc
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003085 END
3086 LINES
LemonBoy2eaef102022-05-06 13:14:50 +01003087 v9.CheckDefAndScriptFailure(lines, "E1279: Missing '}'")
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003088
3089 lines =<< trim LINES
3090 var text =<< eval trim END
LemonBoy2eaef102022-05-06 13:14:50 +01003091 let b = {}
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003092 END
3093 LINES
LemonBoy2eaef102022-05-06 13:14:50 +01003094 v9.CheckDefAndScriptFailure(lines, 'E15: Invalid expression: "}"')
Yegappan Lakshmanane2038412024-12-14 19:59:24 +01003095
3096 # dangling "}"
3097 lines =<< trim LINES
3098 var text =<< trim eval END
3099 aa}a
3100 END
3101 LINES
3102 v9.CheckDefAndScriptFailure(lines, "E1278: Stray '}' without a matching '{': aa}a")
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003103enddef
3104
Yegappan Lakshmananc229a6a2023-10-26 23:05:07 +02003105" Test for assigning to a multi-dimensional list item.
3106def Test_list_item_assign()
3107 var lines =<< trim END
3108 vim9script
3109
3110 def Foo()
Yegappan Lakshmanan67098162023-11-05 10:07:03 +01003111 var l: list<list<string>> = [['x', 'x', 'x'], ['y', 'y', 'y']]
3112 var z: number = 1
Yegappan Lakshmananc229a6a2023-10-26 23:05:07 +02003113
Yegappan Lakshmanan67098162023-11-05 10:07:03 +01003114 [l[1][2], z] = ['a', 20]
3115 assert_equal([['x', 'x', 'x'], ['y', 'y', 'a']], l)
Yegappan Lakshmananc229a6a2023-10-26 23:05:07 +02003116 enddef
3117 Foo()
3118 END
3119 v9.CheckSourceSuccess(lines)
Yegappan Lakshmanan67098162023-11-05 10:07:03 +01003120
3121 lines =<< trim END
3122 vim9script
3123
3124 var l: list<list<string>> = [['x', 'x', 'x'], ['y', 'y', 'y']]
3125 var z: number = 1
3126
3127 [l[1][2], z] = ['a', 20]
3128 assert_equal([['x', 'x', 'x'], ['y', 'y', 'a']], l)
3129 END
3130 v9.CheckSourceSuccess(lines)
3131enddef
3132
3133" Test for assigning to a multi-dimensional dict item.
3134def Test_dict_item_assign()
3135 # This used to fail with the error "E1105: Cannot convert list to string"
3136 # (Github issue #13485)
3137 var lines =<< trim END
3138 vim9script
3139 def F()
3140 var d: dict<dict<number>> = {a: {b: 0}}
3141
3142 for group in keys(d)
3143 d['a']['b'] += 1
3144 endfor
3145 assert_equal({a: {b: 1}}, d)
3146 enddef
3147 F()
3148 END
3149 v9.CheckSourceSuccess(lines)
3150
3151 # This used to crash Vim
3152 lines =<< trim END
3153 vim9script
3154 def F()
3155 var d: dict<dict<number>> = {a: {b: 0}}
3156 d['a']['b'] += 1
3157 assert_equal({a: {b: 1}}, d)
3158 enddef
3159 F()
3160 END
3161 v9.CheckSourceSuccess(lines)
3162
3163 # Assignment at script level
3164 lines =<< trim END
3165 vim9script
3166 var d: dict<dict<number>> = {a: {b: 0}}
3167
3168 for group in keys(d)
3169 d['a']['b'] += 1
3170 endfor
3171 assert_equal({a: {b: 1}}, d)
3172 END
3173 v9.CheckSourceSuccess(lines)
Yegappan Lakshmananc229a6a2023-10-26 23:05:07 +02003174enddef
3175
Ernie Rael9ed53752023-12-11 17:40:46 +01003176def Test_class_assign()
3177 var lines =<< trim END
3178 vim9script
3179 class C
3180 endclass
3181 class D
3182 endclass
Ernie Rael2025af12023-12-12 16:58:00 +01003183 assert_fails('C = D', 'E1405: Class "D" cannot be used as a value')
Ernie Rael9ed53752023-12-11 17:40:46 +01003184 END
3185 v9.CheckSourceSuccess(lines)
3186enddef
3187
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003188" Test for using various types (dict, list, blob, funcref, class) as variable
3189" in assignments with a different type
3190def Test_type_check()
3191 var lines =<< trim END
3192 vim9script
3193 class A
3194 endclass
Ernie Raelb5011082023-12-18 08:34:41 +01003195 type T = number
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003196 var N: number = 1
3197 var S: string = 'abc'
3198 var d: dict<number> = {}
3199 var l: list<number> = []
3200 var b: blob = 0z10
3201 var Fn: func = function('min')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003202 var o: A = A.new()
3203
3204 # Assign a number
3205 assert_fails('d = N', 'E1012: Type mismatch; expected dict<number> but got number')
3206 assert_fails('l = N', 'E1012: Type mismatch; expected list<number> but got number')
3207 assert_fails('b = N', 'E1012: Type mismatch; expected blob but got number')
3208 assert_fails('Fn = N', 'E1012: Type mismatch; expected func(...): unknown but got number')
Ernie Raele75fde62023-12-21 17:18:54 +01003209 assert_fails('A = N', 'E1405: Class "A" cannot be used as a value')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003210 assert_fails('o = N', 'E1012: Type mismatch; expected object<A> but got number')
Ernie Raele75fde62023-12-21 17:18:54 +01003211 assert_fails('T = N', 'E1403: Type alias "T" cannot be used as a value')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003212
3213 # Use a compound operator with different LHS types
3214 assert_fails('d += N', 'E734: Wrong variable type for +=')
3215 assert_fails('l += N', 'E734: Wrong variable type for +=')
3216 assert_fails('b += N', 'E734: Wrong variable type for +=')
3217 assert_fails('Fn += N', 'E734: Wrong variable type for +=')
Ernie Raele75fde62023-12-21 17:18:54 +01003218 assert_fails('A += N', 'E1405: Class "A" cannot be used as a value')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003219 assert_fails('o += N', 'E734: Wrong variable type for +=')
Ernie Raele75fde62023-12-21 17:18:54 +01003220 assert_fails('T += N', 'E1403: Type alias "T" cannot be used as a value')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003221
3222 # Assign to a number variable
3223 assert_fails('N = d', 'E1012: Type mismatch; expected number but got dict<number>')
3224 assert_fails('N = l', 'E1012: Type mismatch; expected number but got list<number>')
3225 assert_fails('N = b', 'E1012: Type mismatch; expected number but got blob')
3226 assert_fails('N = Fn', 'E1012: Type mismatch; expected number but got func([unknown]): number')
Ernie Rael2025af12023-12-12 16:58:00 +01003227 assert_fails('N = A', 'E1405: Class "A" cannot be used as a value')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003228 assert_fails('N = o', 'E1012: Type mismatch; expected number but got object<A>')
Ernie Raelb5011082023-12-18 08:34:41 +01003229 assert_fails('N = T', 'E1403: Type alias "T" cannot be used as a value')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003230
3231 # Use a compound operator with different RHS types
3232 assert_fails('N += d', 'E734: Wrong variable type for +=')
3233 assert_fails('N += l', 'E734: Wrong variable type for +=')
3234 assert_fails('N += b', 'E974: Using a Blob as a Number')
3235 assert_fails('N += Fn', 'E734: Wrong variable type for +=')
Ernie Rael2025af12023-12-12 16:58:00 +01003236 assert_fails('N += A', 'E1405: Class "A" cannot be used as a value')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003237 assert_fails('N += o', 'E1320: Using an Object as a Number')
Ernie Raelb5011082023-12-18 08:34:41 +01003238 assert_fails('N += T', 'E1403: Type alias "T" cannot be used as a value')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003239
3240 # Initialize multiple variables using []
3241 assert_fails('var [X1: number, Y: number] = [1, d]', 'E1012: Type mismatch; expected number but got dict<number>')
3242 assert_fails('var [X2: number, Y: number] = [1, l]', 'E1012: Type mismatch; expected number but got list<number>')
3243 assert_fails('var [X3: number, Y: number] = [1, b]', 'E1012: Type mismatch; expected number but got blob')
3244 assert_fails('var [X4: number, Y: number] = [1, Fn]', 'E1012: Type mismatch; expected number but got func([unknown]): number')
Ernie Rael2025af12023-12-12 16:58:00 +01003245 assert_fails('var [X7: number, Y: number] = [1, A]', 'E1405: Class "A" cannot be used as a value')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003246 assert_fails('var [X8: number, Y: number] = [1, o]', 'E1012: Type mismatch; expected number but got object<A>')
Ernie Raelb5011082023-12-18 08:34:41 +01003247 assert_fails('var [X8: number, Y: number] = [1, T]', 'E1403: Type alias "T" cannot be used as a value')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003248
3249 # String concatenation with various LHS types
3250 assert_fails('S ..= d', 'E734: Wrong variable type for .=')
3251 assert_fails('S ..= l', 'E734: Wrong variable type for .=')
3252 assert_fails('S ..= b', 'E976: Using a Blob as a String')
3253 assert_fails('S ..= Fn', 'E734: Wrong variable type for .=')
Ernie Rael2025af12023-12-12 16:58:00 +01003254 assert_fails('S ..= A', 'E1405: Class "A" cannot be used as a value')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003255 assert_fails('S ..= o', 'E1324: Using an Object as a String')
Ernie Raelb5011082023-12-18 08:34:41 +01003256 assert_fails('S ..= T', 'E1403: Type alias "T" cannot be used as a value')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003257
3258 # String concatenation with various RHS types
3259 assert_fails('d ..= S', 'E734: Wrong variable type for .=')
3260 assert_fails('l ..= S', 'E734: Wrong variable type for .=')
3261 assert_fails('b ..= S', 'E734: Wrong variable type for .=')
3262 assert_fails('Fn ..= S', 'E734: Wrong variable type for .=')
Ernie Raele75fde62023-12-21 17:18:54 +01003263 assert_fails('A ..= S', 'E1405: Class "A" cannot be used as a value')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003264 assert_fails('o ..= S', 'E734: Wrong variable type for .=')
Ernie Raele75fde62023-12-21 17:18:54 +01003265 assert_fails('T ..= S', 'E1403: Type alias "T" cannot be used as a value')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003266 END
3267 v9.CheckSourceSuccess(lines)
Yegappan Lakshmanan3ee25962023-12-04 20:31:14 +01003268
3269 if has('channel')
3270 lines =<< trim END
3271 vim9script
3272 var N: number = 1
3273 var S: string = 'abc'
3274 var j: job = test_null_job()
3275 var ch: channel = test_null_channel()
3276 assert_fails('j = N', 'E1012: Type mismatch; expected job but got number')
3277 assert_fails('ch = N', 'E1012: Type mismatch; expected channel but got number')
3278 assert_fails('j += N', 'E734: Wrong variable type for +=')
3279 assert_fails('ch += N', 'E734: Wrong variable type for +=')
3280 assert_fails('N = j', 'E1012: Type mismatch; expected number but got job')
3281 assert_fails('N = ch', 'E1012: Type mismatch; expected number but got channel')
3282 assert_fails('N += j', 'E910: Using a Job as a Number')
3283 assert_fails('N += ch', 'E913: Using a Channel as a Number')
3284 assert_fails('var [X5: number, Y: number] = [1, j]', 'E1012: Type mismatch; expected number but got job')
3285 assert_fails('var [X6: number, Y: number] = [1, ch]', 'E1012: Type mismatch; expected number but got channel')
3286 assert_fails('S ..= j', 'E908: Using an invalid value as a String: job')
3287 assert_fails('S ..= ch', 'E908: Using an invalid value as a String: channel')
3288 assert_fails('j ..= S', 'E734: Wrong variable type for .=')
3289 assert_fails('ch ..= S', 'E734: Wrong variable type for .=')
3290 END
3291 v9.CheckSourceSuccess(lines)
3292 endif
Ernie Rael5e133152023-12-19 22:15:27 +01003293
3294 lines =<< trim END
3295 vim9script
3296 class A
3297 endclass
3298
3299 def F()
3300 A += 3
3301 enddef
3302 F()
3303 END
3304 v9.CheckScriptFailure(lines, 'E1405: Class "A" cannot be used as a value')
3305
3306 lines =<< trim END
3307 vim9script
3308 class A
3309 endclass
3310
3311 var o = A.new()
3312 def F()
3313 o += 4
3314 enddef
3315 F()
3316 END
3317 v9.CheckScriptFailure(lines, 'E1411: Missing dot after object "o"')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003318enddef
3319
3320" Test for checking the argument type of a def function
3321def Test_func_argtype_check()
3322 var lines =<< trim END
3323 vim9script
3324
3325 # Passing different types as argument to a function expecting a number
3326 def IntArg(n: number)
3327 enddef
3328
3329 class A
3330 endclass
3331 var N: number = 1
3332 var S: string = 'abc'
3333 var d: dict<number> = {}
3334 var l: list<number> = []
3335 var b: blob = 0z10
3336 var Fn: func = function('min')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003337 var o: A = A.new()
3338
3339 assert_fails('IntArg(d)', 'E1013: Argument 1: type mismatch, expected number but got dict<number>')
3340 assert_fails('IntArg(l)', 'E1013: Argument 1: type mismatch, expected number but got list<number>')
3341 assert_fails('IntArg(b)', 'E1013: Argument 1: type mismatch, expected number but got blob')
3342 assert_fails('IntArg(Fn)', 'E1013: Argument 1: type mismatch, expected number but got func([unknown]): number')
Yegappan Lakshmanan3ee25962023-12-04 20:31:14 +01003343 if has('channel')
3344 var j: job = test_null_job()
3345 var ch: channel = test_null_channel()
3346 assert_fails('IntArg(j)', 'E1013: Argument 1: type mismatch, expected number but got job')
3347 assert_fails('IntArg(ch)', 'E1013: Argument 1: type mismatch, expected number but got channel')
3348 endif
Ernie Raelb077b582023-12-14 20:11:44 +01003349 assert_fails('IntArg(A)', 'E1405: Class "A" cannot be used as a value')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003350 assert_fails('IntArg(o)', 'E1013: Argument 1: type mismatch, expected number but got object<A>')
3351
3352 # Passing a number to functions accepting different argument types
3353 def DictArg(_: dict<number>)
3354 enddef
3355 assert_fails('DictArg(N)', 'E1013: Argument 1: type mismatch, expected dict<number> but got number')
3356
3357 def ListArg(_: list<number>)
3358 enddef
3359 assert_fails('ListArg(N)', 'E1013: Argument 1: type mismatch, expected list<number> but got number')
3360
3361 def BlobArg(_: blob)
3362 enddef
3363 assert_fails('BlobArg(N)', 'E1013: Argument 1: type mismatch, expected blob but got number')
3364
3365 def FuncArg(Fn_arg: func)
3366 enddef
3367 assert_fails('FuncArg(N)', 'E1013: Argument 1: type mismatch, expected func(...): unknown but got number')
3368
Yegappan Lakshmanan3ee25962023-12-04 20:31:14 +01003369 if has('channel')
3370 def JobArg(_: job)
3371 enddef
3372 assert_fails('JobArg(N)', 'E1013: Argument 1: type mismatch, expected job but got number')
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003373
Yegappan Lakshmanan3ee25962023-12-04 20:31:14 +01003374 def ChannelArg(_: channel)
3375 enddef
3376 assert_fails('ChannelArg(N)', 'E1013: Argument 1: type mismatch, expected channel but got number')
3377 endif
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003378
3379 def ObjectArg(_: A)
3380 enddef
3381 assert_fails('ObjectArg(N)', 'E1013: Argument 1: type mismatch, expected object<A> but got number')
3382 END
3383 v9.CheckSourceSuccess(lines)
3384
3385 # Calling a function expecting a number type with different argument types
3386 # from another function
3387 var pre_lines =<< trim END
3388 vim9script
3389 class A
3390 endclass
3391 def IntArg(n: number)
3392 enddef
3393 def Foo()
3394 END
3395 var post_lines =<< trim END
3396 enddef
3397 defcompile
3398 END
3399 lines = pre_lines + ['var d: dict<number> = {}', 'IntArg(d)'] + post_lines
3400 v9.CheckSourceFailure(lines, 'E1013: Argument 1: type mismatch, expected number but got dict<number>', 2)
3401 lines = pre_lines + ['var l: list<number> = []', 'IntArg(l)'] + post_lines
3402 v9.CheckSourceFailure(lines, 'E1013: Argument 1: type mismatch, expected number but got list<number>', 2)
3403 lines = pre_lines + ['var b: blob = 0z12', 'IntArg(b)'] + post_lines
3404 v9.CheckSourceFailure(lines, 'E1013: Argument 1: type mismatch, expected number but got blob', 2)
3405 lines = pre_lines + ['var Fn: func = function("min")', 'IntArg(Fn)'] + post_lines
3406 v9.CheckSourceFailure(lines, 'E1013: Argument 1: type mismatch, expected number but got func(...): unknown', 2)
Yegappan Lakshmanan3ee25962023-12-04 20:31:14 +01003407 if has('channel')
3408 lines = pre_lines + ['var j: job = test_null_job()', 'IntArg(j)'] + post_lines
3409 v9.CheckSourceFailure(lines, 'E1013: Argument 1: type mismatch, expected number but got job', 2)
3410 lines = pre_lines + ['var ch: channel = test_null_channel()', 'IntArg(ch)'] + post_lines
3411 v9.CheckSourceFailure(lines, 'E1013: Argument 1: type mismatch, expected number but got channel', 2)
3412 endif
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003413 lines = pre_lines + ['IntArg(A)'] + post_lines
Ernie Raelb077b582023-12-14 20:11:44 +01003414 v9.CheckSourceFailure(lines, 'E1405: Class "A" cannot be used as a value', 1)
Yegappan Lakshmanan1fc47c22023-11-08 21:02:48 +01003415 lines = pre_lines + ['var o: A = A.new()', 'IntArg(o)'] + post_lines
3416 v9.CheckSourceFailure(lines, 'E1013: Argument 1: type mismatch, expected number but got object<A>', 2)
3417enddef
3418
3419" Test for checking the return type of a def function
3420def Test_func_rettype_check()
3421 var lines =<< trim END
3422 vim9script
3423 def Fn(): dict<number>
3424 return 10
3425 enddef
3426 defcompile
3427 END
3428 v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected dict<number> but got number', 1)
3429
3430 lines =<< trim END
3431 vim9script
3432 def Fn(): list<number>
3433 return 10
3434 enddef
3435 defcompile
3436 END
3437 v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected list<number> but got number', 1)
3438
3439 lines =<< trim END
3440 vim9script
3441 def Fn(): blob
3442 return 10
3443 enddef
3444 defcompile
3445 END
3446 v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected blob but got number', 1)
3447
3448 lines =<< trim END
3449 vim9script
3450 def Fn(): func
3451 return 10
3452 enddef
3453 defcompile
3454 END
3455 v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected func(...): unknown but got number', 1)
3456
3457 lines =<< trim END
3458 vim9script
3459 def Fn(): job
3460 return 10
3461 enddef
3462 defcompile
3463 END
3464 v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected job but got number', 1)
3465
3466 lines =<< trim END
3467 vim9script
3468 def Fn(): channel
3469 return 10
3470 enddef
3471 defcompile
3472 END
3473 v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected channel but got number', 1)
3474
3475 lines =<< trim END
3476 vim9script
3477 class A
3478 endclass
3479 def Fn(): A
3480 return 10
3481 enddef
3482 defcompile
3483 END
3484 v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected object<A> but got number', 1)
3485enddef
3486
Yegappan Lakshmanand3351852023-12-08 21:41:23 +01003487" Test for assigning different types of value to a variable of type "any"
3488def Test_assign_to_any()
3489 for [typestr, val] in [
3490 ["'bool'", 'true'],
3491 ["'number'", '100'],
3492 ["'float'", '1.1'],
3493 ["'string'", '"abc"'],
3494 ["'blob'", '0z10'],
3495 ["'list<number>'", '[1, 2, 3]'],
3496 ["'dict<number>'", '{a: 1}'],
3497 ]
3498 var lines =<< trim eval END
3499 vim9script
3500 var x: any = {val}
3501 assert_equal({typestr}, typename(x))
3502 x = [{{a: 1}}, {{b: 2}}]
3503 assert_equal('list<dict<number>>', typename(x))
3504 def Foo(xarg: any, s: string)
3505 assert_equal(s, typename(xarg))
3506 enddef
3507 Foo({val}, {typestr})
3508 END
3509 v9.CheckSourceSuccess(lines)
3510 endfor
3511enddef
3512
Ernie Raelfa831102023-12-14 20:06:39 +01003513def Test_assign_type_to_list_dict()
3514 var lines =<< trim END
3515 vim9script
3516 class C
3517 endclass
3518
3519 var x = [C]
3520 END
3521 v9.CheckScriptFailure(lines, 'E1405: Class "C" cannot be used as a value')
3522
3523 lines =<< trim END
3524 vim9script
3525 class C
3526 endclass
3527 type T = C
3528
3529 def F()
3530 var x = [3, T, C]
3531 enddef
3532 F()
3533 END
3534 v9.CheckScriptFailure(lines, 'E1405: Class "C" cannot be used as a value')
3535
3536 lines =<< trim END
3537 vim9script
3538 type T = number
3539
3540 def F()
3541 var x = [3, T]
3542 enddef
3543 F()
3544 END
3545 v9.CheckScriptFailure(lines, 'E1407: Cannot use a Typealias as a variable or value')
3546
3547 lines =<< trim END
3548 vim9script
3549 class C
3550 endclass
3551
3552 var x = {e: C}
3553 END
3554 v9.CheckScriptFailure(lines, 'E1405: Class "C" cannot be used as a value')
3555
3556 lines =<< trim END
3557 vim9script
3558 class C
3559 endclass
3560
3561 def F()
3562 var x = {e: C}
3563 enddef
3564 F()
3565 END
3566 v9.CheckScriptFailure(lines, 'E1405: Class "C" cannot be used as a value')
3567
3568 lines =<< trim END
3569 vim9script
3570 type T = number
3571
3572 def F()
3573 var x = {e: T}
3574 enddef
3575 F()
3576 END
3577 v9.CheckScriptFailure(lines, 'E1407: Cannot use a Typealias as a variable or value')
3578
3579 lines =<< trim END
3580 vim9script
3581 class C
3582 endclass
3583
3584 def F()
3585 var x = {e: [C]}
3586 enddef
3587 F()
3588 END
3589 v9.CheckScriptFailure(lines, 'E1405: Class "C" cannot be used as a value')
3590
3591 lines =<< trim END
3592 vim9script
3593 type T = number
3594
3595 def F()
3596 var x = {e: [T]}
3597 enddef
3598 F()
3599 END
3600 v9.CheckScriptFailure(lines, 'E1407: Cannot use a Typealias as a variable or value')
3601enddef
3602
Yegappan Lakshmanan1af35632024-02-06 11:03:36 +01003603" Test for modifying a final variable using a compound operator
3604def Test_final_var_modification_with_compound_op()
3605 var lines =<< trim END
3606 vim9script
3607
3608 final i: number = 1000
3609 assert_fails('i += 2', 'E46: Cannot change read-only variable "i"')
3610 assert_fails('i -= 2', 'E46: Cannot change read-only variable "i"')
3611 assert_fails('i *= 2', 'E46: Cannot change read-only variable "i"')
3612 assert_fails('i /= 2', 'E46: Cannot change read-only variable "i"')
3613 assert_fails('i %= 2', 'E46: Cannot change read-only variable "i"')
3614 assert_equal(1000, i)
3615
3616 final f: float = 1000.0
3617 assert_fails('f += 2', 'E46: Cannot change read-only variable "f"')
3618 assert_fails('f -= 2', 'E46: Cannot change read-only variable "f"')
3619 assert_fails('f *= 2', 'E46: Cannot change read-only variable "f"')
3620 assert_fails('f /= 2', 'E46: Cannot change read-only variable "f"')
3621 assert_equal(1000.0, f)
3622
3623 final s: string = 'abc'
3624 assert_fails('s ..= "y"', 'E46: Cannot change read-only variable "s"')
3625 assert_equal('abc', s)
3626 END
3627 v9.CheckScriptSuccess(lines)
3628enddef
3629
3630" Test for modifying a final variable with a List value
3631def Test_final_var_with_list_value()
3632 var lines =<< trim END
3633 vim9script
3634
3635 final listA: list<string> = []
3636 var listB = listA
3637
3638 listB->add('a')
3639 assert_true(listA is listB)
3640 assert_equal(['a'], listA)
3641 assert_equal(['a'], listB)
3642
3643 listB += ['b']
3644 assert_true(listA is listB)
3645 assert_equal(['a', 'b'], listA)
3646 assert_equal(['a', 'b'], listB)
3647
3648 listA->add('c')
3649 assert_true(listA is listB)
3650 assert_equal(['a', 'b', 'c'], listA)
3651 assert_equal(['a', 'b', 'c'], listB)
3652
3653 listA += ['d']
3654 assert_true(listA is listB)
3655 assert_equal(['a', 'b', 'c', 'd'], listA)
3656 assert_equal(['a', 'b', 'c', 'd'], listB)
3657 END
3658 v9.CheckScriptSuccess(lines)
3659enddef
3660
3661" Test for modifying a final variable with a List value using "+=" from a legacy
3662" function.
3663func Test_final_var_with_list_value_legacy()
3664 vim9cmd final g:TestVar = ['a']
3665 vim9cmd g:TestVar += ['b']
3666 call assert_equal(['a', 'b'], g:TestVar)
3667endfunc
3668
3669" Test for modifying a final variable with a Blob value
3670def Test_final_var_with_blob_value()
3671 var lines =<< trim END
3672 vim9script
3673
3674 final blobA: blob = 0z10
3675 var blobB = blobA
3676
3677 blobB->add(32)
3678 assert_true(blobA is blobB)
3679 assert_equal(0z1020, blobA)
3680 assert_equal(0z1020, blobB)
3681
3682 blobB += 0z30
3683 assert_true(blobA is blobB)
3684 assert_equal(0z102030, blobA)
3685 assert_equal(0z102030, blobB)
3686
3687 blobA->add(64)
3688 assert_true(blobA is blobB)
3689 assert_equal(0z10203040, blobA)
3690 assert_equal(0z10203040, blobB)
3691
3692 blobA += 0z50
3693 assert_true(blobA is blobB)
3694 assert_equal(0z1020304050, blobA)
3695 assert_equal(0z1020304050, blobB)
3696 END
3697 v9.CheckScriptSuccess(lines)
3698enddef
3699
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02003700" Test for overwriting a script-local function using the s: dictionary
3701def Test_override_script_local_func()
3702 var lines =<< trim END
3703 vim9script
3704 def MyFunc()
3705 enddef
3706 var d: dict<any> = s:
3707 d.MyFunc = function('min')
3708 END
3709 v9.CheckScriptFailure(lines, 'E705: Variable name conflicts with existing function: MyFunc', 5)
3710enddef
3711
Yegappan Lakshmanan92195ae2024-12-22 14:44:35 +01003712" Test for doing a type check at runtime for a list member type
3713def Test_nested_type_check()
3714 var lines =<< trim END
3715 var d = {a: [10], b: [20]}
3716 var l = d->items()
3717 l[0][1][0] = 'abc'
3718 END
3719 v9.CheckSourceDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string')
3720
3721 lines =<< trim END
3722 vim9script
3723 var d = {a: [10], b: [20]}
3724 var l = d->items()
3725 l[0][1][0] = 30
3726 assert_equal([['a', [30]], ['b', [20]]], l)
3727 END
3728 v9.CheckScriptSuccess(lines)
3729
3730 lines =<< trim END
3731 vim9script
3732 def Foo()
3733 var d = {a: [10], b: [20]}
3734 var l = d->items()
3735 l[0][1][0] = 30
3736 assert_equal([['a', [30]], ['b', [20]]], l)
3737 enddef
3738 Foo()
3739 END
3740 v9.CheckScriptSuccess(lines)
3741
3742 # Test for modifying a List item added using add() with a different type.
3743 lines =<< trim END
3744 vim9script
3745
3746 var l: list<list<any>> = [['a']]
3747 var v = [[10]]
3748 l[0]->add(v)
3749 l[0][1][0] = [{x: 20}]
3750 END
3751 v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected list<number> but got list<dict<number>>', 6)
3752enddef
3753
Bram Moolenaar971caf52020-09-21 22:21:42 +02003754" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker