blob: eddc8c5f3431baa94911683fa7b4bb7fdc7229cc [file] [log] [blame]
Bram Moolenaar971caf52020-09-21 22:21:42 +02001" Test Vim9 assignments
2
3source check.vim
4source vim9.vim
5
6let s:appendToMe = 'xxx'
7let s:addToMe = 111
8let g:existing = 'yes'
9let g:inc_counter = 1
10let $SOME_ENV_VAR = 'some'
11let g:alist = [7]
12let g:astring = 'text'
13
14def Test_assignment_bool()
Bram Moolenaar30fd8202020-09-26 15:09:30 +020015 var bool1: bool = true
Bram Moolenaar971caf52020-09-21 22:21:42 +020016 assert_equal(v:true, bool1)
Bram Moolenaar30fd8202020-09-26 15:09:30 +020017 var bool2: bool = false
Bram Moolenaar971caf52020-09-21 22:21:42 +020018 assert_equal(v:false, bool2)
19
Bram Moolenaar30fd8202020-09-26 15:09:30 +020020 var bool3: bool = 0
Bram Moolenaar971caf52020-09-21 22:21:42 +020021 assert_equal(false, bool3)
Bram Moolenaar30fd8202020-09-26 15:09:30 +020022 var bool4: bool = 1
Bram Moolenaar971caf52020-09-21 22:21:42 +020023 assert_equal(true, bool4)
24
Bram Moolenaar30fd8202020-09-26 15:09:30 +020025 var bool5: bool = 'yes' && 'no'
Bram Moolenaar971caf52020-09-21 22:21:42 +020026 assert_equal(true, bool5)
Bram Moolenaar30fd8202020-09-26 15:09:30 +020027 var bool6: bool = [] && 99
Bram Moolenaar971caf52020-09-21 22:21:42 +020028 assert_equal(false, bool6)
Bram Moolenaar30fd8202020-09-26 15:09:30 +020029 var bool7: bool = [] || #{a: 1} && 99
Bram Moolenaar971caf52020-09-21 22:21:42 +020030 assert_equal(true, bool7)
31
Bram Moolenaar30fd8202020-09-26 15:09:30 +020032 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +020033 vim9script
34 def GetFlag(): bool
Bram Moolenaar30fd8202020-09-26 15:09:30 +020035 var flag: bool = 1
Bram Moolenaar971caf52020-09-21 22:21:42 +020036 return flag
37 enddef
Bram Moolenaar30fd8202020-09-26 15:09:30 +020038 var flag: bool = GetFlag()
Bram Moolenaar971caf52020-09-21 22:21:42 +020039 assert_equal(true, flag)
40 flag = 0
41 assert_equal(false, flag)
42 flag = 1
43 assert_equal(true, flag)
44 flag = 99 || 123
45 assert_equal(true, flag)
46 flag = 'yes' && []
47 assert_equal(false, flag)
48 END
49 CheckScriptSuccess(lines)
Bram Moolenaar30fd8202020-09-26 15:09:30 +020050 CheckDefAndScriptFailure(['var x: bool = 2'], 'E1012:')
51 CheckDefAndScriptFailure(['var x: bool = -1'], 'E1012:')
52 CheckDefAndScriptFailure(['var x: bool = [1]'], 'E1012:')
53 CheckDefAndScriptFailure(['var x: bool = {}'], 'E1012:')
54 CheckDefAndScriptFailure(['var x: bool = "x"'], 'E1012:')
Bram Moolenaar971caf52020-09-21 22:21:42 +020055enddef
56
57def Test_syntax()
Bram Moolenaar30fd8202020-09-26 15:09:30 +020058 var var = 234
59 var other: list<string> = ['asdf']
Bram Moolenaar971caf52020-09-21 22:21:42 +020060enddef
61
62def Test_assignment()
Bram Moolenaar30fd8202020-09-26 15:09:30 +020063 CheckDefFailure(['var x:string'], 'E1069:')
64 CheckDefFailure(['var x:string = "x"'], 'E1069:')
65 CheckDefFailure(['var a:string = "x"'], 'E1069:')
66 CheckDefFailure(['var lambda = {-> "lambda"}'], 'E704:')
67 CheckScriptFailure(['var x = "x"'], 'E1124:')
Bram Moolenaar971caf52020-09-21 22:21:42 +020068
Bram Moolenaar30fd8202020-09-26 15:09:30 +020069 var nr: number = 1234
70 CheckDefFailure(['var nr: number = "asdf"'], 'E1012:')
Bram Moolenaar971caf52020-09-21 22:21:42 +020071
Bram Moolenaar30fd8202020-09-26 15:09:30 +020072 var a: number = 6 #comment
Bram Moolenaar971caf52020-09-21 22:21:42 +020073 assert_equal(6, a)
74
75 if has('channel')
Bram Moolenaar30fd8202020-09-26 15:09:30 +020076 var chan1: channel
77 var job1: job
78 var job2: job = job_start('willfail')
Bram Moolenaar971caf52020-09-21 22:21:42 +020079 endif
80 if has('float')
Bram Moolenaar30fd8202020-09-26 15:09:30 +020081 var float1: float = 3.4
Bram Moolenaar971caf52020-09-21 22:21:42 +020082 endif
Bram Moolenaar30fd8202020-09-26 15:09:30 +020083 var Funky1: func
84 var Funky2: func = function('len')
85 var Party2: func = funcref('g:Test_syntax')
Bram Moolenaar971caf52020-09-21 22:21:42 +020086
87 g:newvar = 'new' #comment
88 assert_equal('new', g:newvar)
89
90 assert_equal('yes', g:existing)
91 g:existing = 'no'
92 assert_equal('no', g:existing)
93
94 v:char = 'abc'
95 assert_equal('abc', v:char)
96
97 $ENVVAR = 'foobar'
98 assert_equal('foobar', $ENVVAR)
99 $ENVVAR = ''
100
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200101 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200102 vim9script
103 $ENVVAR = 'barfoo'
104 assert_equal('barfoo', $ENVVAR)
105 $ENVVAR = ''
106 END
107 CheckScriptSuccess(lines)
108
109 s:appendToMe ..= 'yyy'
110 assert_equal('xxxyyy', s:appendToMe)
111 s:addToMe += 222
112 assert_equal(333, s:addToMe)
113 s:newVar = 'new'
114 assert_equal('new', s:newVar)
115
116 set ts=7
117 &ts += 1
118 assert_equal(8, &ts)
119 &ts -= 3
120 assert_equal(5, &ts)
121 &ts *= 2
122 assert_equal(10, &ts)
123 &ts /= 3
124 assert_equal(3, &ts)
125 set ts=10
126 &ts %= 4
127 assert_equal(2, &ts)
128
129 if has('float')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200130 var f100: float = 100.0
Bram Moolenaar971caf52020-09-21 22:21:42 +0200131 f100 /= 5
132 assert_equal(20.0, f100)
133
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200134 var f200: float = 200.0
Bram Moolenaar971caf52020-09-21 22:21:42 +0200135 f200 /= 5.0
136 assert_equal(40.0, f200)
137
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200138 CheckDefFailure(['var nr: number = 200', 'nr /= 5.0'], 'E1012:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200139 endif
140
141 lines =<< trim END
142 &ts = 6
143 &ts += 3
144 assert_equal(9, &ts)
145
146 &l:ts = 6
147 assert_equal(6, &ts)
148 &l:ts += 2
149 assert_equal(8, &ts)
150
151 &g:ts = 6
152 assert_equal(6, &g:ts)
153 &g:ts += 2
154 assert_equal(8, &g:ts)
155 END
156 CheckDefAndScriptSuccess(lines)
157
158 CheckDefFailure(['&notex += 3'], 'E113:')
159 CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
160 CheckDefFailure(['&ts = [7]'], 'E1012:')
161 CheckDefExecFailure(['&ts = g:alist'], 'E1012: Type mismatch; expected number but got list<number>')
162 CheckDefFailure(['&ts = "xx"'], 'E1012:')
163 CheckDefExecFailure(['&ts = g:astring'], 'E1012: Type mismatch; expected number but got string')
164 CheckDefFailure(['&path += 3'], 'E1012:')
165 CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
166 # test freeing ISN_STOREOPT
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200167 CheckDefFailure(['&ts = 3', 'var asdf'], 'E1022:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200168 &ts = 8
169
170 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200171 var save_TI = &t_TI
Bram Moolenaar971caf52020-09-21 22:21:42 +0200172 &t_TI = ''
173 assert_equal('', &t_TI)
174 &t_TI = 'xxx'
175 assert_equal('xxx', &t_TI)
176 &t_TI = save_TI
177 END
178 CheckDefAndScriptSuccess(lines)
179
180 CheckDefFailure(['&t_TI = 123'], 'E1012:')
181 CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
182
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200183 CheckDefFailure(['var s:var = 123'], 'E1101:')
184 CheckDefFailure(['var s:var: number'], 'E1101:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200185
186 lines =<< trim END
187 vim9script
188 def SomeFunc()
189 s:var = 123
190 enddef
191 defcompile
192 END
193 CheckScriptFailure(lines, 'E1089:')
194
195 g:inc_counter += 1
196 assert_equal(2, g:inc_counter)
197
198 $SOME_ENV_VAR ..= 'more'
199 assert_equal('somemore', $SOME_ENV_VAR)
200 CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
201 CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
202
203 lines =<< trim END
204 @c = 'areg'
205 @c ..= 'add'
206 assert_equal('aregadd', @c)
207 END
208 CheckDefAndScriptSuccess(lines)
209
210 CheckDefFailure(['@a += "more"'], 'E1051:')
211 CheckDefFailure(['@a += 123'], 'E1012:')
212
213 v:errmsg = 'none'
214 v:errmsg ..= 'again'
215 assert_equal('noneagain', v:errmsg)
216 CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
217 CheckDefFailure(['v:errmsg += 123'], 'E1012:')
218
219 # this should not leak
220 if 0
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200221 var text =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200222 some text
223 END
224 endif
225enddef
226
Bram Moolenaar81ed4962020-09-23 15:56:50 +0200227def Test_extend_list()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200228 var lines =<< trim END
Bram Moolenaar81ed4962020-09-23 15:56:50 +0200229 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200230 var l: list<number>
Bram Moolenaar81ed4962020-09-23 15:56:50 +0200231 l += [123]
232 assert_equal([123], l)
233
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200234 var d: dict<number>
Bram Moolenaar81ed4962020-09-23 15:56:50 +0200235 d['one'] = 1
236 assert_equal(#{one: 1}, d)
237 END
238 CheckScriptSuccess(lines)
239enddef
240
Bram Moolenaar971caf52020-09-21 22:21:42 +0200241def Test_single_letter_vars()
242 # single letter variables
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200243 var a: number = 123
Bram Moolenaar971caf52020-09-21 22:21:42 +0200244 a = 123
245 assert_equal(123, a)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200246 var b: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200247 b = 123
248 assert_equal(123, b)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200249 var g: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200250 g = 123
251 assert_equal(123, g)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200252 var s: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200253 s = 123
254 assert_equal(123, s)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200255 var t: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200256 t = 123
257 assert_equal(123, t)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200258 var v: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200259 v = 123
260 assert_equal(123, v)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200261 var w: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200262 w = 123
263 assert_equal(123, w)
264enddef
265
266def Test_vim9_single_char_vars()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200267 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200268 vim9script
269
270 # single character variable declarations work
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200271 var a: string
272 var b: number
273 var l: list<any>
274 var s: string
275 var t: number
276 var v: number
277 var w: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200278
279 # script-local variables can be used without s: prefix
280 a = 'script-a'
281 b = 111
282 l = [1, 2, 3]
283 s = 'script-s'
284 t = 222
285 v = 333
286 w = 444
287
288 assert_equal('script-a', a)
289 assert_equal(111, b)
290 assert_equal([1, 2, 3], l)
291 assert_equal('script-s', s)
292 assert_equal(222, t)
293 assert_equal(333, v)
294 assert_equal(444, w)
295 END
296 writefile(lines, 'Xsinglechar')
297 source Xsinglechar
298 delete('Xsinglechar')
299enddef
300
301def Test_assignment_list()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200302 var list1: list<bool> = [false, true, false]
303 var list2: list<number> = [1, 2, 3]
304 var list3: list<string> = ['sdf', 'asdf']
305 var list4: list<any> = ['yes', true, 1234]
306 var list5: list<blob> = [0z01, 0z02]
Bram Moolenaar971caf52020-09-21 22:21:42 +0200307
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200308 var listS: list<string> = []
309 var listN: list<number> = []
Bram Moolenaar971caf52020-09-21 22:21:42 +0200310
311 assert_equal([1, 2, 3], list2)
312 list2[-1] = 99
313 assert_equal([1, 2, 99], list2)
314 list2[-2] = 88
315 assert_equal([1, 88, 99], list2)
316 list2[-3] = 77
317 assert_equal([77, 88, 99], list2)
318 list2 += [100]
319 assert_equal([77, 88, 99, 100], list2)
320
321 list3 += ['end']
322 assert_equal(['sdf', 'asdf', 'end'], list3)
323
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200324 CheckDefExecFailure(['var ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
325 CheckDefExecFailure(['var [v1, v2] = [1, 2]'], 'E1092:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200326
327 # type becomes list<any>
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200328 var somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
Bram Moolenaar971caf52020-09-21 22:21:42 +0200329enddef
330
331def Test_assignment_list_vim9script()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200332 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200333 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200334 var v1: number
335 var v2: number
336 var v3: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200337 [v1, v2, v3] = [1, 2, 3]
338 assert_equal([1, 2, 3], [v1, v2, v3])
339 END
340 CheckScriptSuccess(lines)
341enddef
342
343def Test_assignment_dict()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200344 var dict1: dict<bool> = #{one: false, two: true}
345 var dict2: dict<number> = #{one: 1, two: 2}
346 var dict3: dict<string> = #{key: 'value'}
347 var dict4: dict<any> = #{one: 1, two: '2'}
348 var dict5: dict<blob> = #{one: 0z01, two: 0z02}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200349
350 # overwrite
351 dict3['key'] = 'another'
352
353 # empty key can be used
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200354 var dd = {}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200355 dd[""] = 6
356 assert_equal({'': 6}, dd)
357
358 # type becomes dict<any>
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200359 var somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200360
361 # assignment to script-local dict
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200362 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200363 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200364 var test: dict<any> = {}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200365 def FillDict(): dict<any>
366 test['a'] = 43
367 return test
368 enddef
369 assert_equal(#{a: 43}, FillDict())
370 END
371 CheckScriptSuccess(lines)
372
373 lines =<< trim END
374 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200375 var test: dict<any>
Bram Moolenaar971caf52020-09-21 22:21:42 +0200376 def FillDict(): dict<any>
377 test['a'] = 43
378 return test
379 enddef
380 FillDict()
381 END
382 CheckScriptFailure(lines, 'E1103:')
383
384 # assignment to global dict
385 lines =<< trim END
386 vim9script
387 g:test = {}
388 def FillDict(): dict<any>
389 g:test['a'] = 43
390 return g:test
391 enddef
392 assert_equal(#{a: 43}, FillDict())
393 END
394 CheckScriptSuccess(lines)
395
396 # assignment to buffer dict
397 lines =<< trim END
398 vim9script
399 b:test = {}
400 def FillDict(): dict<any>
401 b:test['a'] = 43
402 return b:test
403 enddef
404 assert_equal(#{a: 43}, FillDict())
405 END
406 CheckScriptSuccess(lines)
407enddef
408
409def Test_assignment_local()
410 # Test in a separated file in order not to the current buffer/window/tab is
411 # changed.
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200412 var script_lines: list<string> =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200413 let b:existing = 'yes'
414 let w:existing = 'yes'
415 let t:existing = 'yes'
416
417 def Test_assignment_local_internal()
418 b:newvar = 'new'
419 assert_equal('new', b:newvar)
420 assert_equal('yes', b:existing)
421 b:existing = 'no'
422 assert_equal('no', b:existing)
423 b:existing ..= 'NO'
424 assert_equal('noNO', b:existing)
425
426 w:newvar = 'new'
427 assert_equal('new', w:newvar)
428 assert_equal('yes', w:existing)
429 w:existing = 'no'
430 assert_equal('no', w:existing)
431 w:existing ..= 'NO'
432 assert_equal('noNO', w:existing)
433
434 t:newvar = 'new'
435 assert_equal('new', t:newvar)
436 assert_equal('yes', t:existing)
437 t:existing = 'no'
438 assert_equal('no', t:existing)
439 t:existing ..= 'NO'
440 assert_equal('noNO', t:existing)
441 enddef
442 call Test_assignment_local_internal()
443 END
444 CheckScriptSuccess(script_lines)
445enddef
446
447def Test_assignment_default()
448
449 # Test default values.
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200450 var thebool: bool
Bram Moolenaar971caf52020-09-21 22:21:42 +0200451 assert_equal(v:false, thebool)
452
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200453 var thenumber: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200454 assert_equal(0, thenumber)
455
456 if has('float')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200457 var thefloat: float
Bram Moolenaar971caf52020-09-21 22:21:42 +0200458 assert_equal(0.0, thefloat)
459 endif
460
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200461 var thestring: string
Bram Moolenaar971caf52020-09-21 22:21:42 +0200462 assert_equal('', thestring)
463
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200464 var theblob: blob
Bram Moolenaar971caf52020-09-21 22:21:42 +0200465 assert_equal(0z, theblob)
466
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200467 var Thefunc: func
Bram Moolenaar971caf52020-09-21 22:21:42 +0200468 assert_equal(test_null_function(), Thefunc)
469
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200470 var thelist: list<any>
Bram Moolenaar971caf52020-09-21 22:21:42 +0200471 assert_equal([], thelist)
472
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200473 var thedict: dict<any>
Bram Moolenaar971caf52020-09-21 22:21:42 +0200474 assert_equal({}, thedict)
475
476 if has('channel')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200477 var thejob: job
Bram Moolenaar971caf52020-09-21 22:21:42 +0200478 assert_equal(test_null_job(), thejob)
479
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200480 var thechannel: channel
Bram Moolenaar971caf52020-09-21 22:21:42 +0200481 assert_equal(test_null_channel(), thechannel)
482
483 if has('unix') && executable('cat')
484 # check with non-null job and channel, types must match
485 thejob = job_start("cat ", #{})
486 thechannel = job_getchannel(thejob)
487 job_stop(thejob, 'kill')
488 endif
489 endif
490
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200491 var nr = 1234 | nr = 5678
Bram Moolenaar971caf52020-09-21 22:21:42 +0200492 assert_equal(5678, nr)
493enddef
494
495def Test_assignment_var_list()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200496 var v1: string
497 var v2: string
498 var vrem: list<string>
Bram Moolenaar971caf52020-09-21 22:21:42 +0200499 [v1] = ['aaa']
500 assert_equal('aaa', v1)
501
502 [v1, v2] = ['one', 'two']
503 assert_equal('one', v1)
504 assert_equal('two', v2)
505
506 [v1, v2; vrem] = ['one', 'two']
507 assert_equal('one', v1)
508 assert_equal('two', v2)
509 assert_equal([], vrem)
510
511 [v1, v2; vrem] = ['one', 'two', 'three']
512 assert_equal('one', v1)
513 assert_equal('two', v2)
514 assert_equal(['three'], vrem)
515
516 [&ts, &sw] = [3, 4]
517 assert_equal(3, &ts)
518 assert_equal(4, &sw)
519 set ts=8 sw=4
520enddef
521
522def Test_assignment_vim9script()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200523 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200524 vim9script
525 def Func(): list<number>
526 return [1, 2]
527 enddef
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200528 var var1: number
529 var var2: number
Bram Moolenaar971caf52020-09-21 22:21:42 +0200530 [var1, var2] =
531 Func()
532 assert_equal(1, var1)
533 assert_equal(2, var2)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200534 var ll =
Bram Moolenaar971caf52020-09-21 22:21:42 +0200535 Func()
536 assert_equal([1, 2], ll)
537
538 @/ = 'text'
539 assert_equal('text', @/)
540 @0 = 'zero'
541 assert_equal('zero', @0)
542 @1 = 'one'
543 assert_equal('one', @1)
544 @9 = 'nine'
545 assert_equal('nine', @9)
546 @- = 'minus'
547 assert_equal('minus', @-)
548 if has('clipboard_working')
549 @* = 'star'
550 assert_equal('star', @*)
551 @+ = 'plus'
552 assert_equal('plus', @+)
553 endif
554
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200555 var a: number = 123
Bram Moolenaar971caf52020-09-21 22:21:42 +0200556 assert_equal(123, a)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200557 var s: string = 'yes'
Bram Moolenaar971caf52020-09-21 22:21:42 +0200558 assert_equal('yes', s)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200559 var b: number = 42
Bram Moolenaar971caf52020-09-21 22:21:42 +0200560 assert_equal(42, b)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200561 var w: number = 43
Bram Moolenaar971caf52020-09-21 22:21:42 +0200562 assert_equal(43, w)
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200563 var t: number = 44
Bram Moolenaar971caf52020-09-21 22:21:42 +0200564 assert_equal(44, t)
565 END
566 CheckScriptSuccess(lines)
567enddef
568
569def Mess(): string
570 v:foldstart = 123
571 return 'xxx'
572enddef
573
574def Test_assignment_failure()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200575 CheckDefFailure(['var var=234'], 'E1004:')
576 CheckDefFailure(['var var =234'], 'E1004:')
577 CheckDefFailure(['var var= 234'], 'E1004:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200578
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200579 CheckScriptFailure(['vim9script', 'var var=234'], 'E1004:')
580 CheckScriptFailure(['vim9script', 'var var=234'], "before and after '='")
581 CheckScriptFailure(['vim9script', 'var var =234'], 'E1004:')
582 CheckScriptFailure(['vim9script', 'var var= 234'], 'E1004:')
583 CheckScriptFailure(['vim9script', 'var var = 234', 'var+=234'], 'E1004:')
584 CheckScriptFailure(['vim9script', 'var var = 234', 'var+=234'], "before and after '+='")
585 CheckScriptFailure(['vim9script', 'var var = "x"', 'var..="y"'], 'E1004:')
586 CheckScriptFailure(['vim9script', 'var var = "x"', 'var..="y"'], "before and after '..='")
Bram Moolenaar971caf52020-09-21 22:21:42 +0200587
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200588 CheckDefFailure(['var true = 1'], 'E1034:')
589 CheckDefFailure(['var false = 1'], 'E1034:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200590
591 CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200592 CheckDefExecFailure(['var a: number',
Bram Moolenaar971caf52020-09-21 22:21:42 +0200593 '[a] = test_null_list()'], 'E1093:')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200594 CheckDefExecFailure(['var a: number',
Bram Moolenaar971caf52020-09-21 22:21:42 +0200595 '[a] = []'], 'E1093:')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200596 CheckDefExecFailure(['var x: number',
597 'var y: number',
Bram Moolenaar971caf52020-09-21 22:21:42 +0200598 '[x, y] = [1]'], 'E1093:')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200599 CheckDefExecFailure(['var x: number',
600 'var y: number',
601 'var z: list<number>',
Bram Moolenaar971caf52020-09-21 22:21:42 +0200602 '[x, y; z] = [1]'], 'E1093:')
603
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200604 CheckDefFailure(['var somevar'], "E1022:")
605 CheckDefFailure(['var &tabstop = 4'], 'E1052:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200606 CheckDefFailure(['&g:option = 5'], 'E113:')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200607 CheckScriptFailure(['vim9script', 'var &tabstop = 4'], 'E1052:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200608
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200609 CheckDefFailure(['var $VAR = 5'], 'E1016: Cannot declare an environment variable:')
610 CheckScriptFailure(['vim9script', 'var $ENV = "xxx"'], 'E1016:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200611
612 if has('dnd')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200613 CheckDefFailure(['var @~ = 5'], 'E1066:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200614 else
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200615 CheckDefFailure(['var @~ = 5'], 'E354:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200616 CheckDefFailure(['@~ = 5'], 'E354:')
617 endif
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200618 CheckDefFailure(['var @a = 5'], 'E1066:')
619 CheckDefFailure(['var @/ = "x"'], 'E1066:')
620 CheckScriptFailure(['vim9script', 'var @a = "abc"'], 'E1066:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200621
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200622 CheckDefFailure(['var g:var = 5'], 'E1016: Cannot declare a global variable:')
623 CheckDefFailure(['var w:var = 5'], 'E1016: Cannot declare a window variable:')
624 CheckDefFailure(['var b:var = 5'], 'E1016: Cannot declare a buffer variable:')
625 CheckDefFailure(['var t:var = 5'], 'E1016: Cannot declare a tab variable:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200626
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200627 CheckDefFailure(['var anr = 4', 'anr ..= "text"'], 'E1019:')
628 CheckDefFailure(['var xnr += 4'], 'E1020:', 1)
629 CheckScriptFailure(['vim9script', 'var xnr += 4'], 'E1020:')
630 CheckDefFailure(["var xnr = xnr + 1"], 'E1001:', 1)
631 CheckScriptFailure(['vim9script', 'var xnr = xnr + 4'], 'E121:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200632
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200633 CheckScriptFailure(['vim9script', 'def Func()', 'var dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200634
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200635 CheckDefFailure(['var var: list<string> = [123]'], 'expected list<string> but got list<number>')
636 CheckDefFailure(['var var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200637
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200638 CheckDefFailure(['var var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
639 CheckDefFailure(['var var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200640
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200641 CheckDefFailure(['var var = feedkeys("0")'], 'E1031:')
642 CheckDefFailure(['var var: number = feedkeys("0")'], 'expected number but got void')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200643
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200644 CheckDefFailure(['var var: dict <number>'], 'E1068:')
645 CheckDefFailure(['var var: dict<number'], 'E1009:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200646
647 assert_fails('s/^/\=Mess()/n', 'E794:')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200648 CheckDefFailure(['var var: dict<number'], 'E1009:')
Bram Moolenaar971caf52020-09-21 22:21:42 +0200649
650 CheckDefFailure(['w:foo: number = 10'],
651 'E488: Trailing characters: : number = 1')
652 CheckDefFailure(['t:foo: bool = true'],
653 'E488: Trailing characters: : bool = true')
654 CheckDefFailure(['b:foo: string = "x"'],
655 'E488: Trailing characters: : string = "x"')
656 CheckDefFailure(['g:foo: number = 123'],
657 'E488: Trailing characters: : number = 123')
658enddef
659
660def Test_assign_list()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200661 var l: list<string> = []
Bram Moolenaar971caf52020-09-21 22:21:42 +0200662 l[0] = 'value'
663 assert_equal('value', l[0])
664
665 l[1] = 'asdf'
666 assert_equal('value', l[0])
667 assert_equal('asdf', l[1])
668 assert_equal('asdf', l[-1])
669 assert_equal('value', l[-2])
670
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200671 var nrl: list<number> = []
Bram Moolenaar971caf52020-09-21 22:21:42 +0200672 for i in range(5)
673 nrl[i] = i
674 endfor
675 assert_equal([0, 1, 2, 3, 4], nrl)
676enddef
677
678def Test_assign_dict()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200679 var d: dict<string> = {}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200680 d['key'] = 'value'
681 assert_equal('value', d['key'])
682
683 d[123] = 'qwerty'
684 assert_equal('qwerty', d[123])
685 assert_equal('qwerty', d['123'])
686
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200687 var nrd: dict<number> = {}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200688 for i in range(3)
689 nrd[i] = i
690 endfor
691 assert_equal({'0': 0, '1': 1, '2': 2}, nrd)
692enddef
693
Bram Moolenaar04bdd572020-09-23 13:25:32 +0200694def Test_assign_dict_unknown_type()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200695 var lines =<< trim END
Bram Moolenaar04bdd572020-09-23 13:25:32 +0200696 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200697 var mylist = []
Bram Moolenaar04bdd572020-09-23 13:25:32 +0200698 mylist += [#{one: 'one'}]
699 def Func()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200700 var dd = mylist[0]
Bram Moolenaar04bdd572020-09-23 13:25:32 +0200701 assert_equal('one', dd.one)
702 enddef
703 Func()
704 END
705 CheckScriptSuccess(lines)
706
707 # doesn't work yet
708 #lines =<< trim END
709 # vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200710 # var mylist = [[]]
Bram Moolenaar04bdd572020-09-23 13:25:32 +0200711 # mylist[0] += [#{one: 'one'}]
712 # def Func()
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200713 # var dd = mylist[0][0]
Bram Moolenaar04bdd572020-09-23 13:25:32 +0200714 # assert_equal('one', dd.one)
715 # enddef
716 # Func()
717 #END
718 #CheckScriptSuccess(lines)
719enddef
720
Bram Moolenaar971caf52020-09-21 22:21:42 +0200721def Test_assign_lambda()
722 # check if assign a lambda to a variable which type is func or any.
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200723 var lines =<< trim END
Bram Moolenaar971caf52020-09-21 22:21:42 +0200724 vim9script
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200725 var FuncRef = {->123}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200726 assert_equal(123, FuncRef())
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200727 var FuncRef_Func: func = {->123}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200728 assert_equal(123, FuncRef_Func())
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200729 var FuncRef_Any: any = {->123}
Bram Moolenaar971caf52020-09-21 22:21:42 +0200730 assert_equal(123, FuncRef_Any())
731 END
732 CheckScriptSuccess(lines)
733enddef
734
Bram Moolenaarc0e29012020-09-27 14:22:48 +0200735def Test_heredoc()
736 var lines =<< trim END # comment
737 text
738 END
739 assert_equal(['text'], lines)
740
741 CheckDefFailure(['var lines =<< trim END X', 'END'], 'E488:')
742 CheckDefFailure(['var lines =<< trim END " comment', 'END'], 'E488:')
Bram Moolenaar2914a202020-09-27 18:24:03 +0200743
744 lines =<< trim [END]
745 def Func()
746 var&lines =<< trim END
747 x
748 x
749 x
750 x
751 x
752 x
753 x
754 x
755 enddef
756 call Func()
757 [END]
758 CheckScriptFailure(lines, 'E990:')
Bram Moolenaarc0e29012020-09-27 14:22:48 +0200759enddef
760
Bram Moolenaar971caf52020-09-21 22:21:42 +0200761" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker