blob: 5d6dec110679ee4315af8e4d8d8ebf0b842e020f [file] [log] [blame]
Bram Moolenaar971caf52020-09-21 22:21:42 +02001" Test Vim9 assignments
2
3source check.vim
4source vim9.vim
5
Bram Moolenaarac564082020-09-27 19:05:33 +02006" TODO: remove later
7let v:disallow_let = 1
8
Bram Moolenaar971caf52020-09-21 22:21:42 +02009let s:appendToMe = 'xxx'
10let s:addToMe = 111
11let g:existing = 'yes'
12let g:inc_counter = 1
13let $SOME_ENV_VAR = 'some'
14let g:alist = [7]
15let 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 Moolenaar30fd8202020-09-26 15:09:30 +020028 var bool5: bool = 'yes' && 'no'
Bram Moolenaar971caf52020-09-21 22:21:42 +020029 assert_equal(true, bool5)
Bram Moolenaar30fd8202020-09-26 15:09:30 +020030 var bool6: bool = [] && 99
Bram Moolenaar971caf52020-09-21 22:21:42 +020031 assert_equal(false, bool6)
Bram Moolenaar30fd8202020-09-26 15:09:30 +020032 var bool7: bool = [] || #{a: 1} && 99
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)
47 flag = 99 || 123
48 assert_equal(true, flag)
49 flag = 'yes' && []
50 assert_equal(false, flag)
51 END
52 CheckScriptSuccess(lines)
Bram Moolenaar30fd8202020-09-26 15:09:30 +020053 CheckDefAndScriptFailure(['var x: bool = 2'], 'E1012:')
54 CheckDefAndScriptFailure(['var x: bool = -1'], 'E1012:')
55 CheckDefAndScriptFailure(['var x: bool = [1]'], 'E1012:')
56 CheckDefAndScriptFailure(['var x: bool = {}'], 'E1012:')
57 CheckDefAndScriptFailure(['var x: bool = "x"'], 'E1012:')
Bram Moolenaar971caf52020-09-21 22:21:42 +020058enddef
59
60def Test_syntax()
Bram Moolenaar30fd8202020-09-26 15:09:30 +020061 var var = 234
62 var other: list<string> = ['asdf']
Bram Moolenaar971caf52020-09-21 22:21:42 +020063enddef
64
65def Test_assignment()
Bram Moolenaar30fd8202020-09-26 15:09:30 +020066 CheckDefFailure(['var x:string'], 'E1069:')
67 CheckDefFailure(['var x:string = "x"'], 'E1069:')
68 CheckDefFailure(['var a:string = "x"'], 'E1069:')
69 CheckDefFailure(['var lambda = {-> "lambda"}'], 'E704:')
70 CheckScriptFailure(['var x = "x"'], 'E1124:')
Bram Moolenaar971caf52020-09-21 22:21:42 +020071
Bram Moolenaar30fd8202020-09-26 15:09:30 +020072 var nr: number = 1234
73 CheckDefFailure(['var nr: number = "asdf"'], 'E1012:')
Bram Moolenaar971caf52020-09-21 22:21:42 +020074
Bram Moolenaar30fd8202020-09-26 15:09:30 +020075 var a: number = 6 #comment
Bram Moolenaar971caf52020-09-21 22:21:42 +020076 assert_equal(6, a)
77
78 if has('channel')
Bram Moolenaar30fd8202020-09-26 15:09:30 +020079 var chan1: channel
80 var job1: job
81 var job2: job = job_start('willfail')
Bram Moolenaar971caf52020-09-21 22:21:42 +020082 endif
83 if has('float')
Bram Moolenaar30fd8202020-09-26 15:09:30 +020084 var float1: float = 3.4
Bram Moolenaar971caf52020-09-21 22:21:42 +020085 endif
Bram Moolenaar30fd8202020-09-26 15:09:30 +020086 var Funky1: func
87 var Funky2: func = function('len')
88 var Party2: func = funcref('g:Test_syntax')
Bram Moolenaar971caf52020-09-21 22:21:42 +020089
90 g:newvar = 'new' #comment
91 assert_equal('new', g:newvar)
92
93 assert_equal('yes', g:existing)
94 g:existing = 'no'
95 assert_equal('no', g:existing)
96
97 v:char = 'abc'
98 assert_equal('abc', v:char)
99
100 $ENVVAR = 'foobar'
101 assert_equal('foobar', $ENVVAR)
102 $ENVVAR = ''
103
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200104 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200105 vim9script
106 $ENVVAR = 'barfoo'
107 assert_equal('barfoo', $ENVVAR)
108 $ENVVAR = ''
109 END
110 CheckScriptSuccess(lines)
111
112 s:appendToMe ..= 'yyy'
113 assert_equal('xxxyyy', s:appendToMe)
114 s:addToMe += 222
115 assert_equal(333, s:addToMe)
116 s:newVar = 'new'
117 assert_equal('new', s:newVar)
118
119 set ts=7
120 &ts += 1
121 assert_equal(8, &ts)
122 &ts -= 3
123 assert_equal(5, &ts)
124 &ts *= 2
125 assert_equal(10, &ts)
126 &ts /= 3
127 assert_equal(3, &ts)
128 set ts=10
129 &ts %= 4
130 assert_equal(2, &ts)
131
132 if has('float')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200133 var f100: float = 100.0
Bram Moolenaar971caf52020-09-21 22:21:42 +0200134 f100 /= 5
135 assert_equal(20.0, f100)
136
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200137 var f200: float = 200.0
Bram Moolenaar971caf52020-09-21 22:21:42 +0200138 f200 /= 5.0
139 assert_equal(40.0, f200)
140
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200141 CheckDefFailure(['var nr: number = 200', 'nr /= 5.0'], 'E1012:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200142 endif
143
144 lines =<< trim END
145 &ts = 6
146 &ts += 3
147 assert_equal(9, &ts)
148
149 &l:ts = 6
150 assert_equal(6, &ts)
151 &l:ts += 2
152 assert_equal(8, &ts)
153
154 &g:ts = 6
155 assert_equal(6, &g:ts)
156 &g:ts += 2
157 assert_equal(8, &g:ts)
158 END
159 CheckDefAndScriptSuccess(lines)
160
161 CheckDefFailure(['&notex += 3'], 'E113:')
162 CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
163 CheckDefFailure(['&ts = [7]'], 'E1012:')
164 CheckDefExecFailure(['&ts = g:alist'], 'E1012: Type mismatch; expected number but got list<number>')
165 CheckDefFailure(['&ts = "xx"'], 'E1012:')
166 CheckDefExecFailure(['&ts = g:astring'], 'E1012: Type mismatch; expected number but got string')
167 CheckDefFailure(['&path += 3'], 'E1012:')
168 CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
169 # test freeing ISN_STOREOPT
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200170 CheckDefFailure(['&ts = 3', 'var asdf'], 'E1022:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200171 &ts = 8
172
173 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200174 var save_TI = &t_TI
Bram Moolenaar971caf52020-09-21 22:21:42 +0200175 &t_TI = ''
176 assert_equal('', &t_TI)
177 &t_TI = 'xxx'
178 assert_equal('xxx', &t_TI)
179 &t_TI = save_TI
180 END
181 CheckDefAndScriptSuccess(lines)
182
183 CheckDefFailure(['&t_TI = 123'], 'E1012:')
184 CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
185
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200186 CheckDefFailure(['var s:var = 123'], 'E1101:')
187 CheckDefFailure(['var s:var: number'], 'E1101:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200188
189 lines =<< trim END
190 vim9script
191 def SomeFunc()
192 s:var = 123
193 enddef
194 defcompile
195 END
196 CheckScriptFailure(lines, 'E1089:')
197
198 g:inc_counter += 1
199 assert_equal(2, g:inc_counter)
200
201 $SOME_ENV_VAR ..= 'more'
202 assert_equal('somemore', $SOME_ENV_VAR)
203 CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
204 CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
205
206 lines =<< trim END
207 @c = 'areg'
208 @c ..= 'add'
209 assert_equal('aregadd', @c)
210 END
211 CheckDefAndScriptSuccess(lines)
212
213 CheckDefFailure(['@a += "more"'], 'E1051:')
214 CheckDefFailure(['@a += 123'], 'E1012:')
215
216 v:errmsg = 'none'
217 v:errmsg ..= 'again'
218 assert_equal('noneagain', v:errmsg)
219 CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
220 CheckDefFailure(['v:errmsg += 123'], 'E1012:')
221
222 # this should not leak
223 if 0
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200224 var text =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200225 some text
226 END
227 endif
228enddef
229
Bram Moolenaar81ed4962020-09-23 15:56:50 +0200230def Test_extend_list()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200231 var lines =<< trim END
Bram Moolenaar81ed4962020-09-23 15:56:50 +0200232 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200233 var l: list<number>
Bram Moolenaar81ed4962020-09-23 15:56:50 +0200234 l += [123]
235 assert_equal([123], l)
236
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200237 var d: dict<number>
Bram Moolenaar81ed4962020-09-23 15:56:50 +0200238 d['one'] = 1
239 assert_equal(#{one: 1}, d)
240 END
241 CheckScriptSuccess(lines)
242enddef
243
Bram Moolenaar971caf52020-09-21 22:21:42 +0200244def Test_single_letter_vars()
245 # single letter variables
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200246 var a: number = 123
Bram Moolenaar971caf52020-09-21 22:21:42 +0200247 a = 123
248 assert_equal(123, a)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200249 var b: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200250 b = 123
251 assert_equal(123, b)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200252 var g: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200253 g = 123
254 assert_equal(123, g)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200255 var s: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200256 s = 123
257 assert_equal(123, s)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200258 var t: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200259 t = 123
260 assert_equal(123, t)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200261 var v: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200262 v = 123
263 assert_equal(123, v)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200264 var w: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200265 w = 123
266 assert_equal(123, w)
267enddef
268
269def Test_vim9_single_char_vars()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200270 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200271 vim9script
272
273 # single character variable declarations work
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200274 var a: string
275 var b: number
276 var l: list<any>
277 var s: string
278 var t: number
279 var v: number
280 var w: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200281
282 # script-local variables can be used without s: prefix
283 a = 'script-a'
284 b = 111
285 l = [1, 2, 3]
286 s = 'script-s'
287 t = 222
288 v = 333
289 w = 444
290
291 assert_equal('script-a', a)
292 assert_equal(111, b)
293 assert_equal([1, 2, 3], l)
294 assert_equal('script-s', s)
295 assert_equal(222, t)
296 assert_equal(333, v)
297 assert_equal(444, w)
298 END
299 writefile(lines, 'Xsinglechar')
300 source Xsinglechar
301 delete('Xsinglechar')
302enddef
303
304def Test_assignment_list()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200305 var list1: list<bool> = [false, true, false]
306 var list2: list<number> = [1, 2, 3]
307 var list3: list<string> = ['sdf', 'asdf']
308 var list4: list<any> = ['yes', true, 1234]
309 var list5: list<blob> = [0z01, 0z02]
Bram Moolenaar971caf52020-09-21 22:21:42 +0200310
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200311 var listS: list<string> = []
312 var listN: list<number> = []
Bram Moolenaar971caf52020-09-21 22:21:42 +0200313
314 assert_equal([1, 2, 3], list2)
315 list2[-1] = 99
316 assert_equal([1, 2, 99], list2)
317 list2[-2] = 88
318 assert_equal([1, 88, 99], list2)
319 list2[-3] = 77
320 assert_equal([77, 88, 99], list2)
321 list2 += [100]
322 assert_equal([77, 88, 99, 100], list2)
323
324 list3 += ['end']
325 assert_equal(['sdf', 'asdf', 'end'], list3)
326
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200327 CheckDefExecFailure(['var ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
328 CheckDefExecFailure(['var [v1, v2] = [1, 2]'], 'E1092:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200329
330 # type becomes list<any>
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200331 var somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
Bram Moolenaar971caf52020-09-21 22:21:42 +0200332enddef
333
334def Test_assignment_list_vim9script()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200335 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200336 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200337 var v1: number
338 var v2: number
339 var v3: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200340 [v1, v2, v3] = [1, 2, 3]
341 assert_equal([1, 2, 3], [v1, v2, v3])
342 END
343 CheckScriptSuccess(lines)
344enddef
345
346def Test_assignment_dict()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200347 var dict1: dict<bool> = #{one: false, two: true}
348 var dict2: dict<number> = #{one: 1, two: 2}
349 var dict3: dict<string> = #{key: 'value'}
350 var dict4: dict<any> = #{one: 1, two: '2'}
351 var dict5: dict<blob> = #{one: 0z01, two: 0z02}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200352
353 # overwrite
354 dict3['key'] = 'another'
355
356 # empty key can be used
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200357 var dd = {}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200358 dd[""] = 6
359 assert_equal({'': 6}, dd)
360
361 # type becomes dict<any>
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200362 var somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200363
364 # assignment to script-local dict
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200365 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200366 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200367 var test: dict<any> = {}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200368 def FillDict(): dict<any>
369 test['a'] = 43
370 return test
371 enddef
372 assert_equal(#{a: 43}, FillDict())
373 END
374 CheckScriptSuccess(lines)
375
376 lines =<< trim END
377 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200378 var test: dict<any>
Bram Moolenaar971caf52020-09-21 22:21:42 +0200379 def FillDict(): dict<any>
380 test['a'] = 43
381 return test
382 enddef
383 FillDict()
384 END
385 CheckScriptFailure(lines, 'E1103:')
386
387 # assignment to global dict
388 lines =<< trim END
389 vim9script
390 g:test = {}
391 def FillDict(): dict<any>
392 g:test['a'] = 43
393 return g:test
394 enddef
395 assert_equal(#{a: 43}, FillDict())
396 END
397 CheckScriptSuccess(lines)
398
399 # assignment to buffer dict
400 lines =<< trim END
401 vim9script
402 b:test = {}
403 def FillDict(): dict<any>
404 b:test['a'] = 43
405 return b:test
406 enddef
407 assert_equal(#{a: 43}, FillDict())
408 END
409 CheckScriptSuccess(lines)
410enddef
411
412def Test_assignment_local()
413 # Test in a separated file in order not to the current buffer/window/tab is
414 # changed.
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200415 var script_lines: list<string> =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200416 let b:existing = 'yes'
417 let w:existing = 'yes'
418 let t:existing = 'yes'
419
420 def Test_assignment_local_internal()
421 b:newvar = 'new'
422 assert_equal('new', b:newvar)
423 assert_equal('yes', b:existing)
424 b:existing = 'no'
425 assert_equal('no', b:existing)
426 b:existing ..= 'NO'
427 assert_equal('noNO', b:existing)
428
429 w:newvar = 'new'
430 assert_equal('new', w:newvar)
431 assert_equal('yes', w:existing)
432 w:existing = 'no'
433 assert_equal('no', w:existing)
434 w:existing ..= 'NO'
435 assert_equal('noNO', w:existing)
436
437 t:newvar = 'new'
438 assert_equal('new', t:newvar)
439 assert_equal('yes', t:existing)
440 t:existing = 'no'
441 assert_equal('no', t:existing)
442 t:existing ..= 'NO'
443 assert_equal('noNO', t:existing)
444 enddef
445 call Test_assignment_local_internal()
446 END
447 CheckScriptSuccess(script_lines)
448enddef
449
450def Test_assignment_default()
451
452 # Test default values.
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200453 var thebool: bool
Bram Moolenaar971caf52020-09-21 22:21:42 +0200454 assert_equal(v:false, thebool)
455
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200456 var thenumber: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200457 assert_equal(0, thenumber)
458
459 if has('float')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200460 var thefloat: float
Bram Moolenaar971caf52020-09-21 22:21:42 +0200461 assert_equal(0.0, thefloat)
462 endif
463
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200464 var thestring: string
Bram Moolenaar971caf52020-09-21 22:21:42 +0200465 assert_equal('', thestring)
466
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200467 var theblob: blob
Bram Moolenaar971caf52020-09-21 22:21:42 +0200468 assert_equal(0z, theblob)
469
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200470 var Thefunc: func
Bram Moolenaar971caf52020-09-21 22:21:42 +0200471 assert_equal(test_null_function(), Thefunc)
472
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200473 var thelist: list<any>
Bram Moolenaar971caf52020-09-21 22:21:42 +0200474 assert_equal([], thelist)
475
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200476 var thedict: dict<any>
Bram Moolenaar971caf52020-09-21 22:21:42 +0200477 assert_equal({}, thedict)
478
479 if has('channel')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200480 var thejob: job
Bram Moolenaar971caf52020-09-21 22:21:42 +0200481 assert_equal(test_null_job(), thejob)
482
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200483 var thechannel: channel
Bram Moolenaar971caf52020-09-21 22:21:42 +0200484 assert_equal(test_null_channel(), thechannel)
485
486 if has('unix') && executable('cat')
487 # check with non-null job and channel, types must match
488 thejob = job_start("cat ", #{})
489 thechannel = job_getchannel(thejob)
490 job_stop(thejob, 'kill')
491 endif
492 endif
493
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200494 var nr = 1234 | nr = 5678
Bram Moolenaar971caf52020-09-21 22:21:42 +0200495 assert_equal(5678, nr)
496enddef
497
498def Test_assignment_var_list()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200499 var v1: string
500 var v2: string
501 var vrem: list<string>
Bram Moolenaar971caf52020-09-21 22:21:42 +0200502 [v1] = ['aaa']
503 assert_equal('aaa', v1)
504
505 [v1, v2] = ['one', 'two']
506 assert_equal('one', v1)
507 assert_equal('two', v2)
508
509 [v1, v2; vrem] = ['one', 'two']
510 assert_equal('one', v1)
511 assert_equal('two', v2)
512 assert_equal([], vrem)
513
514 [v1, v2; vrem] = ['one', 'two', 'three']
515 assert_equal('one', v1)
516 assert_equal('two', v2)
517 assert_equal(['three'], vrem)
518
519 [&ts, &sw] = [3, 4]
520 assert_equal(3, &ts)
521 assert_equal(4, &sw)
522 set ts=8 sw=4
523enddef
524
525def Test_assignment_vim9script()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200526 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200527 vim9script
528 def Func(): list<number>
529 return [1, 2]
530 enddef
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200531 var var1: number
532 var var2: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200533 [var1, var2] =
534 Func()
535 assert_equal(1, var1)
536 assert_equal(2, var2)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200537 var ll =
Bram Moolenaar971caf52020-09-21 22:21:42 +0200538 Func()
539 assert_equal([1, 2], ll)
540
541 @/ = 'text'
542 assert_equal('text', @/)
543 @0 = 'zero'
544 assert_equal('zero', @0)
545 @1 = 'one'
546 assert_equal('one', @1)
547 @9 = 'nine'
548 assert_equal('nine', @9)
549 @- = 'minus'
550 assert_equal('minus', @-)
551 if has('clipboard_working')
552 @* = 'star'
553 assert_equal('star', @*)
554 @+ = 'plus'
555 assert_equal('plus', @+)
556 endif
557
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200558 var a: number = 123
Bram Moolenaar971caf52020-09-21 22:21:42 +0200559 assert_equal(123, a)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200560 var s: string = 'yes'
Bram Moolenaar971caf52020-09-21 22:21:42 +0200561 assert_equal('yes', s)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200562 var b: number = 42
Bram Moolenaar971caf52020-09-21 22:21:42 +0200563 assert_equal(42, b)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200564 var w: number = 43
Bram Moolenaar971caf52020-09-21 22:21:42 +0200565 assert_equal(43, w)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200566 var t: number = 44
Bram Moolenaar971caf52020-09-21 22:21:42 +0200567 assert_equal(44, t)
568 END
569 CheckScriptSuccess(lines)
570enddef
571
572def Mess(): string
573 v:foldstart = 123
574 return 'xxx'
575enddef
576
577def Test_assignment_failure()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200578 CheckDefFailure(['var var=234'], 'E1004:')
579 CheckDefFailure(['var var =234'], 'E1004:')
580 CheckDefFailure(['var var= 234'], 'E1004:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200581
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200582 CheckScriptFailure(['vim9script', 'var var=234'], 'E1004:')
583 CheckScriptFailure(['vim9script', 'var var=234'], "before and after '='")
584 CheckScriptFailure(['vim9script', 'var var =234'], 'E1004:')
585 CheckScriptFailure(['vim9script', 'var var= 234'], 'E1004:')
586 CheckScriptFailure(['vim9script', 'var var = 234', 'var+=234'], 'E1004:')
587 CheckScriptFailure(['vim9script', 'var var = 234', 'var+=234'], "before and after '+='")
588 CheckScriptFailure(['vim9script', 'var var = "x"', 'var..="y"'], 'E1004:')
589 CheckScriptFailure(['vim9script', 'var var = "x"', 'var..="y"'], "before and after '..='")
Bram Moolenaar971caf52020-09-21 22:21:42 +0200590
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200591 CheckDefFailure(['var true = 1'], 'E1034:')
592 CheckDefFailure(['var false = 1'], 'E1034:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200593
594 CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200595 CheckDefExecFailure(['var a: number',
Bram Moolenaar971caf52020-09-21 22:21:42 +0200596 '[a] = test_null_list()'], 'E1093:')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200597 CheckDefExecFailure(['var a: number',
Bram Moolenaar971caf52020-09-21 22:21:42 +0200598 '[a] = []'], 'E1093:')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200599 CheckDefExecFailure(['var x: number',
600 'var y: number',
Bram Moolenaar971caf52020-09-21 22:21:42 +0200601 '[x, y] = [1]'], 'E1093:')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200602 CheckDefExecFailure(['var x: number',
603 'var y: number',
604 'var z: list<number>',
Bram Moolenaar971caf52020-09-21 22:21:42 +0200605 '[x, y; z] = [1]'], 'E1093:')
606
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200607 CheckDefFailure(['var somevar'], "E1022:")
608 CheckDefFailure(['var &tabstop = 4'], 'E1052:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200609 CheckDefFailure(['&g:option = 5'], 'E113:')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200610 CheckScriptFailure(['vim9script', 'var &tabstop = 4'], 'E1052:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200611
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200612 CheckDefFailure(['var $VAR = 5'], 'E1016: Cannot declare an environment variable:')
613 CheckScriptFailure(['vim9script', 'var $ENV = "xxx"'], 'E1016:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200614
615 if has('dnd')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200616 CheckDefFailure(['var @~ = 5'], 'E1066:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200617 else
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200618 CheckDefFailure(['var @~ = 5'], 'E354:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200619 CheckDefFailure(['@~ = 5'], 'E354:')
620 endif
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200621 CheckDefFailure(['var @a = 5'], 'E1066:')
622 CheckDefFailure(['var @/ = "x"'], 'E1066:')
623 CheckScriptFailure(['vim9script', 'var @a = "abc"'], 'E1066:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200624
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200625 CheckDefFailure(['var g:var = 5'], 'E1016: Cannot declare a global variable:')
626 CheckDefFailure(['var w:var = 5'], 'E1016: Cannot declare a window variable:')
627 CheckDefFailure(['var b:var = 5'], 'E1016: Cannot declare a buffer variable:')
628 CheckDefFailure(['var t:var = 5'], 'E1016: Cannot declare a tab variable:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200629
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200630 CheckDefFailure(['var anr = 4', 'anr ..= "text"'], 'E1019:')
631 CheckDefFailure(['var xnr += 4'], 'E1020:', 1)
632 CheckScriptFailure(['vim9script', 'var xnr += 4'], 'E1020:')
633 CheckDefFailure(["var xnr = xnr + 1"], 'E1001:', 1)
634 CheckScriptFailure(['vim9script', 'var xnr = xnr + 4'], 'E121:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200635
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200636 CheckScriptFailure(['vim9script', 'def Func()', 'var dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200637
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200638 CheckDefFailure(['var var: list<string> = [123]'], 'expected list<string> but got list<number>')
639 CheckDefFailure(['var var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200640
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200641 CheckDefFailure(['var var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
642 CheckDefFailure(['var var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200643
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200644 CheckDefFailure(['var var = feedkeys("0")'], 'E1031:')
645 CheckDefFailure(['var var: number = feedkeys("0")'], 'expected number but got void')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200646
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200647 CheckDefFailure(['var var: dict <number>'], 'E1068:')
648 CheckDefFailure(['var var: dict<number'], 'E1009:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200649
650 assert_fails('s/^/\=Mess()/n', 'E794:')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200651 CheckDefFailure(['var var: dict<number'], 'E1009:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200652
653 CheckDefFailure(['w:foo: number = 10'],
654 'E488: Trailing characters: : number = 1')
655 CheckDefFailure(['t:foo: bool = true'],
656 'E488: Trailing characters: : bool = true')
657 CheckDefFailure(['b:foo: string = "x"'],
658 'E488: Trailing characters: : string = "x"')
659 CheckDefFailure(['g:foo: number = 123'],
660 'E488: Trailing characters: : number = 123')
661enddef
662
663def Test_assign_list()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200664 var l: list<string> = []
Bram Moolenaar971caf52020-09-21 22:21:42 +0200665 l[0] = 'value'
666 assert_equal('value', l[0])
667
668 l[1] = 'asdf'
669 assert_equal('value', l[0])
670 assert_equal('asdf', l[1])
671 assert_equal('asdf', l[-1])
672 assert_equal('value', l[-2])
673
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200674 var nrl: list<number> = []
Bram Moolenaar971caf52020-09-21 22:21:42 +0200675 for i in range(5)
676 nrl[i] = i
677 endfor
678 assert_equal([0, 1, 2, 3, 4], nrl)
679enddef
680
681def Test_assign_dict()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200682 var d: dict<string> = {}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200683 d['key'] = 'value'
684 assert_equal('value', d['key'])
685
686 d[123] = 'qwerty'
687 assert_equal('qwerty', d[123])
688 assert_equal('qwerty', d['123'])
689
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200690 var nrd: dict<number> = {}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200691 for i in range(3)
692 nrd[i] = i
693 endfor
694 assert_equal({'0': 0, '1': 1, '2': 2}, nrd)
695enddef
696
Bram Moolenaar04bdd572020-09-23 13:25:32 +0200697def Test_assign_dict_unknown_type()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200698 var lines =<< trim END
Bram Moolenaar04bdd572020-09-23 13:25:32 +0200699 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200700 var mylist = []
Bram Moolenaar04bdd572020-09-23 13:25:32 +0200701 mylist += [#{one: 'one'}]
702 def Func()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200703 var dd = mylist[0]
Bram Moolenaar04bdd572020-09-23 13:25:32 +0200704 assert_equal('one', dd.one)
705 enddef
706 Func()
707 END
708 CheckScriptSuccess(lines)
709
710 # doesn't work yet
711 #lines =<< trim END
712 # vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200713 # var mylist = [[]]
Bram Moolenaar04bdd572020-09-23 13:25:32 +0200714 # mylist[0] += [#{one: 'one'}]
715 # def Func()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200716 # var dd = mylist[0][0]
Bram Moolenaar04bdd572020-09-23 13:25:32 +0200717 # assert_equal('one', dd.one)
718 # enddef
719 # Func()
720 #END
721 #CheckScriptSuccess(lines)
722enddef
723
Bram Moolenaar971caf52020-09-21 22:21:42 +0200724def Test_assign_lambda()
725 # check if assign a lambda to a variable which type is func or any.
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200726 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200727 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200728 var FuncRef = {->123}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200729 assert_equal(123, FuncRef())
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200730 var FuncRef_Func: func = {->123}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200731 assert_equal(123, FuncRef_Func())
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200732 var FuncRef_Any: any = {->123}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200733 assert_equal(123, FuncRef_Any())
734 END
735 CheckScriptSuccess(lines)
736enddef
737
Bram Moolenaarc0e29012020-09-27 14:22:48 +0200738def Test_heredoc()
739 var lines =<< trim END # comment
740 text
741 END
742 assert_equal(['text'], lines)
743
744 CheckDefFailure(['var lines =<< trim END X', 'END'], 'E488:')
745 CheckDefFailure(['var lines =<< trim END " comment', 'END'], 'E488:')
Bram Moolenaar2914a202020-09-27 18:24:03 +0200746
747 lines =<< trim [END]
748 def Func()
749 var&lines =<< trim END
750 x
751 x
752 x
753 x
754 x
755 x
756 x
757 x
758 enddef
759 call Func()
760 [END]
761 CheckScriptFailure(lines, 'E990:')
Bram Moolenaarc0e29012020-09-27 14:22:48 +0200762enddef
763
Bram Moolenaar971caf52020-09-21 22:21:42 +0200764" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker