comparison src/testdir/test_vim9_script.vim @ 22351:4c488004edbc v8.2.1724

patch 8.2.1724: Vim9: assignment tests spread out Commit: https://github.com/vim/vim/commit/971caf53b81b7d1b6fb0bdf32990632975d54631 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Sep 21 22:21:42 2020 +0200 patch 8.2.1724: Vim9: assignment tests spread out Problem: Vim9: assignment tests spread out. Solution: Create new test file for assignment tests.
author Bram Moolenaar <Bram@vim.org>
date Mon, 21 Sep 2020 22:30:03 +0200
parents 9f5a84baa464
children 6fe9536694ff
comparison
equal deleted inserted replaced
22350:416fa143fa2d 22351:4c488004edbc
3 source check.vim 3 source check.vim
4 source term_util.vim 4 source term_util.vim
5 source view_util.vim 5 source view_util.vim
6 source vim9.vim 6 source vim9.vim
7 source shared.vim 7 source shared.vim
8
9 def Test_syntax()
10 let var = 234
11 let other: list<string> = ['asdf']
12 enddef
13 8
14 def Test_range_only() 9 def Test_range_only()
15 new 10 new
16 setline(1, ['blah', 'Blah']) 11 setline(1, ['blah', 'Blah'])
17 :/Blah/ 12 :/Blah/
28 list 23 list
29 assert_equal('three$', Screenline(&lines)) 24 assert_equal('three$', Screenline(&lines))
30 bwipe! 25 bwipe!
31 enddef 26 enddef
32 27
33 let s:appendToMe = 'xxx'
34 let s:addToMe = 111
35 let g:existing = 'yes'
36 let g:inc_counter = 1
37 let $SOME_ENV_VAR = 'some'
38 let g:alist = [7] 28 let g:alist = [7]
39 let g:astring = 'text' 29 let g:astring = 'text'
40 let g:anumber = 123 30 let g:anumber = 123
41
42 def Test_assignment_bool()
43 let bool1: bool = true
44 assert_equal(v:true, bool1)
45 let bool2: bool = false
46 assert_equal(v:false, bool2)
47
48 let bool3: bool = 0
49 assert_equal(false, bool3)
50 let bool4: bool = 1
51 assert_equal(true, bool4)
52
53 let bool5: bool = 'yes' && 'no'
54 assert_equal(true, bool5)
55 let bool6: bool = [] && 99
56 assert_equal(false, bool6)
57 let bool7: bool = [] || #{a: 1} && 99
58 assert_equal(true, bool7)
59
60 let lines =<< trim END
61 vim9script
62 def GetFlag(): bool
63 let flag: bool = 1
64 return flag
65 enddef
66 let flag: bool = GetFlag()
67 assert_equal(true, flag)
68 flag = 0
69 assert_equal(false, flag)
70 flag = 1
71 assert_equal(true, flag)
72 flag = 99 || 123
73 assert_equal(true, flag)
74 flag = 'yes' && []
75 assert_equal(false, flag)
76 END
77 CheckScriptSuccess(lines)
78 CheckDefAndScriptFailure(['let x: bool = 2'], 'E1012:')
79 CheckDefAndScriptFailure(['let x: bool = -1'], 'E1012:')
80 CheckDefAndScriptFailure(['let x: bool = [1]'], 'E1012:')
81 CheckDefAndScriptFailure(['let x: bool = {}'], 'E1012:')
82 CheckDefAndScriptFailure(['let x: bool = "x"'], 'E1012:')
83 enddef
84
85 def Test_assignment()
86 CheckDefFailure(['let x:string'], 'E1069:')
87 CheckDefFailure(['let x:string = "x"'], 'E1069:')
88 CheckDefFailure(['let a:string = "x"'], 'E1069:')
89 CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:')
90
91 let nr: number = 1234
92 CheckDefFailure(['let nr: number = "asdf"'], 'E1012:')
93
94 let a: number = 6 #comment
95 assert_equal(6, a)
96
97 if has('channel')
98 let chan1: channel
99 let job1: job
100 let job2: job = job_start('willfail')
101 endif
102 if has('float')
103 let float1: float = 3.4
104 endif
105 let Funky1: func
106 let Funky2: func = function('len')
107 let Party2: func = funcref('g:Test_syntax')
108
109 g:newvar = 'new' #comment
110 assert_equal('new', g:newvar)
111
112 assert_equal('yes', g:existing)
113 g:existing = 'no'
114 assert_equal('no', g:existing)
115
116 v:char = 'abc'
117 assert_equal('abc', v:char)
118
119 $ENVVAR = 'foobar'
120 assert_equal('foobar', $ENVVAR)
121 $ENVVAR = ''
122
123 let lines =<< trim END
124 vim9script
125 $ENVVAR = 'barfoo'
126 assert_equal('barfoo', $ENVVAR)
127 $ENVVAR = ''
128 END
129 CheckScriptSuccess(lines)
130
131 s:appendToMe ..= 'yyy'
132 assert_equal('xxxyyy', s:appendToMe)
133 s:addToMe += 222
134 assert_equal(333, s:addToMe)
135 s:newVar = 'new'
136 assert_equal('new', s:newVar)
137
138 set ts=7
139 &ts += 1
140 assert_equal(8, &ts)
141 &ts -= 3
142 assert_equal(5, &ts)
143 &ts *= 2
144 assert_equal(10, &ts)
145 &ts /= 3
146 assert_equal(3, &ts)
147 set ts=10
148 &ts %= 4
149 assert_equal(2, &ts)
150
151 if has('float')
152 let f100: float = 100.0
153 f100 /= 5
154 assert_equal(20.0, f100)
155
156 let f200: float = 200.0
157 f200 /= 5.0
158 assert_equal(40.0, f200)
159
160 CheckDefFailure(['let nr: number = 200', 'nr /= 5.0'], 'E1012:')
161 endif
162
163 lines =<< trim END
164 &ts = 6
165 &ts += 3
166 assert_equal(9, &ts)
167
168 &l:ts = 6
169 assert_equal(6, &ts)
170 &l:ts += 2
171 assert_equal(8, &ts)
172
173 &g:ts = 6
174 assert_equal(6, &g:ts)
175 &g:ts += 2
176 assert_equal(8, &g:ts)
177 END
178 CheckDefAndScriptSuccess(lines)
179
180 CheckDefFailure(['&notex += 3'], 'E113:')
181 CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
182 CheckDefFailure(['&ts = [7]'], 'E1012:')
183 CheckDefExecFailure(['&ts = g:alist'], 'E1012: Type mismatch; expected number but got list<number>')
184 CheckDefFailure(['&ts = "xx"'], 'E1012:')
185 CheckDefExecFailure(['&ts = g:astring'], 'E1012: Type mismatch; expected number but got string')
186 CheckDefFailure(['&path += 3'], 'E1012:')
187 CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
188 # test freeing ISN_STOREOPT
189 CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
190 &ts = 8
191
192 lines =<< trim END
193 let save_TI = &t_TI
194 &t_TI = ''
195 assert_equal('', &t_TI)
196 &t_TI = 'xxx'
197 assert_equal('xxx', &t_TI)
198 &t_TI = save_TI
199 END
200 CheckDefAndScriptSuccess(lines)
201
202 CheckDefFailure(['&t_TI = 123'], 'E1012:')
203 CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
204
205 CheckDefFailure(['let s:var = 123'], 'E1101:')
206 CheckDefFailure(['let s:var: number'], 'E1101:')
207
208 lines =<< trim END
209 vim9script
210 def SomeFunc()
211 s:var = 123
212 enddef
213 defcompile
214 END
215 CheckScriptFailure(lines, 'E1089:')
216
217 g:inc_counter += 1
218 assert_equal(2, g:inc_counter)
219
220 $SOME_ENV_VAR ..= 'more'
221 assert_equal('somemore', $SOME_ENV_VAR)
222 CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
223 CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
224
225 lines =<< trim END
226 @c = 'areg'
227 @c ..= 'add'
228 assert_equal('aregadd', @c)
229 END
230 CheckDefAndScriptSuccess(lines)
231
232 CheckDefFailure(['@a += "more"'], 'E1051:')
233 CheckDefFailure(['@a += 123'], 'E1012:')
234
235 v:errmsg = 'none'
236 v:errmsg ..= 'again'
237 assert_equal('noneagain', v:errmsg)
238 CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
239 CheckDefFailure(['v:errmsg += 123'], 'E1012:')
240
241 # single letter variables
242 a = 123
243 assert_equal(123, a)
244 let b: number
245 b = 123
246 assert_equal(123, b)
247 let g: number
248 g = 123
249 assert_equal(123, g)
250 let s: number
251 s = 123
252 assert_equal(123, s)
253 let t: number
254 t = 123
255 assert_equal(123, t)
256 let v: number
257 v = 123
258 assert_equal(123, v)
259 let w: number
260 w = 123
261 assert_equal(123, w)
262
263
264 # this should not leak
265 if 0
266 let text =<< trim END
267 some text
268 END
269 endif
270 enddef
271
272 def Test_vim9_single_char_vars()
273 let lines =<< trim END
274 vim9script
275
276 # single character variable declarations work
277 let a: string
278 let b: number
279 let l: list<any>
280 let s: string
281 let t: number
282 let v: number
283 let w: number
284
285 # script-local variables can be used without s: prefix
286 a = 'script-a'
287 b = 111
288 l = [1, 2, 3]
289 s = 'script-s'
290 t = 222
291 v = 333
292 w = 444
293
294 assert_equal('script-a', a)
295 assert_equal(111, b)
296 assert_equal([1, 2, 3], l)
297 assert_equal('script-s', s)
298 assert_equal(222, t)
299 assert_equal(333, v)
300 assert_equal(444, w)
301 END
302 writefile(lines, 'Xsinglechar')
303 source Xsinglechar
304 delete('Xsinglechar')
305 enddef
306
307 def Test_assignment_list()
308 let list1: list<bool> = [false, true, false]
309 let list2: list<number> = [1, 2, 3]
310 let list3: list<string> = ['sdf', 'asdf']
311 let list4: list<any> = ['yes', true, 1234]
312 let list5: list<blob> = [0z01, 0z02]
313
314 let listS: list<string> = []
315 let listN: list<number> = []
316
317 assert_equal([1, 2, 3], list2)
318 list2[-1] = 99
319 assert_equal([1, 2, 99], list2)
320 list2[-2] = 88
321 assert_equal([1, 88, 99], list2)
322 list2[-3] = 77
323 assert_equal([77, 88, 99], list2)
324 list2 += [100]
325 assert_equal([77, 88, 99, 100], list2)
326
327 list3 += ['end']
328 assert_equal(['sdf', 'asdf', 'end'], list3)
329
330 CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
331 CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
332
333 # type becomes list<any>
334 let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
335 enddef
336
337 def Test_assignment_list_vim9script()
338 let lines =<< trim END
339 vim9script
340 let v1: number
341 let v2: number
342 let v3: number
343 [v1, v2, v3] = [1, 2, 3]
344 assert_equal([1, 2, 3], [v1, v2, v3])
345 END
346 CheckScriptSuccess(lines)
347 enddef
348
349 def Test_assignment_dict()
350 let dict1: dict<bool> = #{one: false, two: true}
351 let dict2: dict<number> = #{one: 1, two: 2}
352 let dict3: dict<string> = #{key: 'value'}
353 let dict4: dict<any> = #{one: 1, two: '2'}
354 let dict5: dict<blob> = #{one: 0z01, two: 0z02}
355
356 # overwrite
357 dict3['key'] = 'another'
358
359 # empty key can be used
360 let dd = {}
361 dd[""] = 6
362 assert_equal({'': 6}, dd)
363
364 # type becomes dict<any>
365 let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
366
367 # assignment to script-local dict
368 let lines =<< trim END
369 vim9script
370 let test: dict<any> = {}
371 def FillDict(): dict<any>
372 test['a'] = 43
373 return test
374 enddef
375 assert_equal(#{a: 43}, FillDict())
376 END
377 CheckScriptSuccess(lines)
378
379 lines =<< trim END
380 vim9script
381 let test: dict<any>
382 def FillDict(): dict<any>
383 test['a'] = 43
384 return test
385 enddef
386 FillDict()
387 END
388 CheckScriptFailure(lines, 'E1103:')
389
390 # assignment to global dict
391 lines =<< trim END
392 vim9script
393 g:test = {}
394 def FillDict(): dict<any>
395 g:test['a'] = 43
396 return g:test
397 enddef
398 assert_equal(#{a: 43}, FillDict())
399 END
400 CheckScriptSuccess(lines)
401
402 # assignment to buffer dict
403 lines =<< trim END
404 vim9script
405 b:test = {}
406 def FillDict(): dict<any>
407 b:test['a'] = 43
408 return b:test
409 enddef
410 assert_equal(#{a: 43}, FillDict())
411 END
412 CheckScriptSuccess(lines)
413 enddef
414
415 def Test_assignment_local()
416 # Test in a separated file in order not to the current buffer/window/tab is
417 # changed.
418 let script_lines: list<string> =<< trim END
419 let b:existing = 'yes'
420 let w:existing = 'yes'
421 let t:existing = 'yes'
422
423 def Test_assignment_local_internal()
424 b:newvar = 'new'
425 assert_equal('new', b:newvar)
426 assert_equal('yes', b:existing)
427 b:existing = 'no'
428 assert_equal('no', b:existing)
429 b:existing ..= 'NO'
430 assert_equal('noNO', b:existing)
431
432 w:newvar = 'new'
433 assert_equal('new', w:newvar)
434 assert_equal('yes', w:existing)
435 w:existing = 'no'
436 assert_equal('no', w:existing)
437 w:existing ..= 'NO'
438 assert_equal('noNO', w:existing)
439
440 t:newvar = 'new'
441 assert_equal('new', t:newvar)
442 assert_equal('yes', t:existing)
443 t:existing = 'no'
444 assert_equal('no', t:existing)
445 t:existing ..= 'NO'
446 assert_equal('noNO', t:existing)
447 enddef
448 call Test_assignment_local_internal()
449 END
450 CheckScriptSuccess(script_lines)
451 enddef
452
453 def Test_assignment_default()
454
455 # Test default values.
456 let thebool: bool
457 assert_equal(v:false, thebool)
458
459 let thenumber: number
460 assert_equal(0, thenumber)
461
462 if has('float')
463 let thefloat: float
464 assert_equal(0.0, thefloat)
465 endif
466
467 let thestring: string
468 assert_equal('', thestring)
469
470 let theblob: blob
471 assert_equal(0z, theblob)
472
473 let Thefunc: func
474 assert_equal(test_null_function(), Thefunc)
475
476 let thelist: list<any>
477 assert_equal([], thelist)
478
479 let thedict: dict<any>
480 assert_equal({}, thedict)
481
482 if has('channel')
483 let thejob: job
484 assert_equal(test_null_job(), thejob)
485
486 let thechannel: channel
487 assert_equal(test_null_channel(), thechannel)
488
489 if has('unix') && executable('cat')
490 # check with non-null job and channel, types must match
491 thejob = job_start("cat ", #{})
492 thechannel = job_getchannel(thejob)
493 job_stop(thejob, 'kill')
494 endif
495 endif
496
497 let nr = 1234 | nr = 5678
498 assert_equal(5678, nr)
499 enddef
500
501 def Test_assignment_var_list()
502 let v1: string
503 let v2: string
504 let vrem: list<string>
505 [v1] = ['aaa']
506 assert_equal('aaa', v1)
507
508 [v1, v2] = ['one', 'two']
509 assert_equal('one', v1)
510 assert_equal('two', v2)
511
512 [v1, v2; vrem] = ['one', 'two']
513 assert_equal('one', v1)
514 assert_equal('two', v2)
515 assert_equal([], vrem)
516
517 [v1, v2; vrem] = ['one', 'two', 'three']
518 assert_equal('one', v1)
519 assert_equal('two', v2)
520 assert_equal(['three'], vrem)
521
522 [&ts, &sw] = [3, 4]
523 assert_equal(3, &ts)
524 assert_equal(4, &sw)
525 set ts=8 sw=4
526 enddef
527
528 def Test_assignment_vim9script()
529 let lines =<< trim END
530 vim9script
531 def Func(): list<number>
532 return [1, 2]
533 enddef
534 let var1: number
535 let var2: number
536 [var1, var2] =
537 Func()
538 assert_equal(1, var1)
539 assert_equal(2, var2)
540 let ll =
541 Func()
542 assert_equal([1, 2], ll)
543
544 @/ = 'text'
545 assert_equal('text', @/)
546 @0 = 'zero'
547 assert_equal('zero', @0)
548 @1 = 'one'
549 assert_equal('one', @1)
550 @9 = 'nine'
551 assert_equal('nine', @9)
552 @- = 'minus'
553 assert_equal('minus', @-)
554 if has('clipboard_working')
555 @* = 'star'
556 assert_equal('star', @*)
557 @+ = 'plus'
558 assert_equal('plus', @+)
559 endif
560
561 let a: number = 123
562 assert_equal(123, a)
563 let s: string = 'yes'
564 assert_equal('yes', s)
565 let b: number = 42
566 assert_equal(42, b)
567 let w: number = 43
568 assert_equal(43, w)
569 let t: number = 44
570 assert_equal(44, t)
571 END
572 CheckScriptSuccess(lines)
573 enddef
574
575 def Mess(): string
576 v:foldstart = 123
577 return 'xxx'
578 enddef
579
580 def Test_assignment_failure()
581 CheckDefFailure(['let var=234'], 'E1004:')
582 CheckDefFailure(['let var =234'], 'E1004:')
583 CheckDefFailure(['let var= 234'], 'E1004:')
584
585 CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
586 CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
587 CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
588 CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
589 CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
590 CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
591 CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
592 CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
593
594 CheckDefFailure(['let true = 1'], 'E1034:')
595 CheckDefFailure(['let false = 1'], 'E1034:')
596
597 CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
598 CheckDefExecFailure(['let a: number',
599 '[a] = test_null_list()'], 'E1093:')
600 CheckDefExecFailure(['let a: number',
601 '[a] = []'], 'E1093:')
602 CheckDefExecFailure(['let x: number',
603 'let y: number',
604 '[x, y] = [1]'], 'E1093:')
605 CheckDefExecFailure(['let x: number',
606 'let y: number',
607 'let z: list<number>',
608 '[x, y; z] = [1]'], 'E1093:')
609
610 CheckDefFailure(['let somevar'], "E1022:")
611 CheckDefFailure(['let &tabstop = 4'], 'E1052:')
612 CheckDefFailure(['&g:option = 5'], 'E113:')
613 CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
614
615 CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
616 CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
617
618 if has('dnd')
619 CheckDefFailure(['let @~ = 5'], 'E1066:')
620 else
621 CheckDefFailure(['let @~ = 5'], 'E354:')
622 CheckDefFailure(['@~ = 5'], 'E354:')
623 endif
624 CheckDefFailure(['let @a = 5'], 'E1066:')
625 CheckDefFailure(['let @/ = "x"'], 'E1066:')
626 CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
627
628 CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
629 CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
630 CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
631 CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
632
633 CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
634 CheckDefFailure(['let xnr += 4'], 'E1020:', 1)
635 CheckScriptFailure(['vim9script', 'let xnr += 4'], 'E1020:')
636 CheckDefFailure(["let xnr = xnr + 1"], 'E1001:', 1)
637 CheckScriptFailure(['vim9script', 'let xnr = xnr + 4'], 'E121:')
638
639 CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
640
641 CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
642 CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
643
644 CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
645 CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
646
647 CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
648 CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
649
650 CheckDefFailure(['let var: dict <number>'], 'E1068:')
651 CheckDefFailure(['let var: dict<number'], 'E1009:')
652
653 assert_fails('s/^/\=Mess()/n', 'E794:')
654 CheckDefFailure(['let var: dict<number'], 'E1009:')
655
656 CheckDefFailure(['w:foo: number = 10'],
657 'E488: Trailing characters: : number = 1')
658 CheckDefFailure(['t:foo: bool = true'],
659 'E488: Trailing characters: : bool = true')
660 CheckDefFailure(['b:foo: string = "x"'],
661 'E488: Trailing characters: : string = "x"')
662 CheckDefFailure(['g:foo: number = 123'],
663 'E488: Trailing characters: : number = 123')
664 enddef
665 31
666 def Test_unlet() 32 def Test_unlet()
667 g:somevar = 'yes' 33 g:somevar = 'yes'
668 assert_true(exists('g:somevar')) 34 assert_true(exists('g:somevar'))
669 unlet g:somevar 35 unlet g:somevar