1" Tests for Vim9 script expressions
2
3source check.vim
4source vim9.vim
5
6let g:cond = v:false
7def FuncOne(arg: number): string
8  return 'yes'
9enddef
10def FuncTwo(arg: number): number
11  return 123
12enddef
13
14" test cond ? expr : expr
15def Test_expr1_trinary()
16  var lines =<< trim END
17      assert_equal('one', true ? 'one' : 'two')
18      assert_equal('one', 1 ?
19                            'one' :
20                            'two')
21      if has('float')
22        assert_equal('one', !!0.1 ? 'one' : 'two')
23      endif
24      assert_equal('one', !!'x' ? 'one' : 'two')
25      assert_equal('one', !!'x'
26                            ? 'one'
27                            : 'two')
28      assert_equal('one', !!0z1234 ? 'one' : 'two')
29      assert_equal('one', !![0] ? 'one' : 'two')
30      assert_equal('one', !!{x: 0} ? 'one' : 'two')
31      var name = 1
32      assert_equal('one', name ? 'one' : 'two')
33
34      assert_equal('two', false ? 'one' : 'two')
35      assert_equal('two', 0 ? 'one' : 'two')
36      if has('float')
37        assert_equal('two', !!0.0 ? 'one' : 'two')
38      endif
39      assert_equal('two', !!'' ? 'one' : 'two')
40      assert_equal('two', !!0z ? 'one' : 'two')
41      assert_equal('two', !![] ? 'one' : 'two')
42      assert_equal('two', !!{} ? 'one' : 'two')
43      name = 0
44      assert_equal('two', name ? 'one' : 'two')
45
46      # with constant condition expression is not evaluated
47      assert_equal('one', 1 ? 'one' : xxx)
48
49      var Some: func = function('len')
50      var Other: func = function('winnr')
51      var Res: func = g:atrue ? Some : Other
52      assert_equal(function('len'), Res)
53
54      var RetOne: func(string): number = function('len')
55      var RetTwo: func(string): number = function('winnr')
56      var RetThat: func = g:atrue ? RetOne : RetTwo
57      assert_equal(function('len'), RetThat)
58
59      var X = FuncOne
60      var Y = FuncTwo
61      var Z = g:cond ? FuncOne : FuncTwo
62      assert_equal(123, Z(3))
63  END
64  CheckDefAndScriptSuccess(lines)
65enddef
66
67def Test_expr1_trinary_vimscript()
68  # check line continuation
69  var lines =<< trim END
70      vim9script
71      var name = 1
72      		? 'yes'
73		: 'no'
74      assert_equal('yes', name)
75  END
76  CheckScriptSuccess(lines)
77
78  lines =<< trim END
79      vim9script
80      var name = v:false
81      		? 'yes'
82		: 'no'
83      assert_equal('no', name)
84  END
85  CheckScriptSuccess(lines)
86
87  lines =<< trim END
88      vim9script
89      var name = v:false ?
90      		'yes' :
91		'no'
92      assert_equal('no', name)
93  END
94  CheckScriptSuccess(lines)
95
96  lines =<< trim END
97      vim9script
98      var name = v:false ?  # comment
99      		'yes' :
100                # comment
101		'no' # comment
102      assert_equal('no', name)
103  END
104  CheckScriptSuccess(lines)
105
106  # check white space
107  lines =<< trim END
108      vim9script
109      var name = v:true?1:2
110  END
111  CheckScriptFailure(lines, 'E1004:', 2)
112  lines =<< trim END
113      vim9script
114      var name = v:true? 1 : 2
115  END
116  CheckScriptFailure(lines, 'E1004:', 2)
117  lines =<< trim END
118      vim9script
119      var name = v:true ?1 : 2
120  END
121  CheckScriptFailure(lines, 'E1004:', 2)
122  lines =<< trim END
123      vim9script
124      var name = v:true ? 1: 2
125  END
126  CheckScriptFailure(lines, 'E1004:', 2)
127  lines =<< trim END
128      vim9script
129      var name = v:true ? 1 :2
130  END
131  CheckScriptFailure(lines, 'E1004:', 2)
132
133  lines =<< trim END
134      vim9script
135      var name = 'x' ? 1 : 2
136  END
137  CheckScriptFailure(lines, 'E1135:', 2)
138
139  lines =<< trim END
140      vim9script
141      var name = [] ? 1 : 2
142  END
143  CheckScriptFailure(lines, 'E745:', 2)
144
145  lines =<< trim END
146      vim9script
147      var name = {} ? 1 : 2
148  END
149  CheckScriptFailure(lines, 'E728:', 2)
150
151  # check after failure eval_flags is reset
152  lines =<< trim END
153      vim9script
154      try
155        eval('0 ? 1: 2')
156      catch
157      endtry
158      assert_equal(v:true, eval(string(v:true)))
159  END
160  CheckScriptSuccess(lines)
161
162  lines =<< trim END
163      vim9script
164      try
165        eval('0 ? 1 :2')
166      catch
167      endtry
168      assert_equal(v:true, eval(string(v:true)))
169  END
170  CheckScriptSuccess(lines)
171enddef
172
173func Test_expr1_trinary_fails()
174  call CheckDefFailure(["var x = 1 ? 'one'"], "Missing ':' after '?'", 1)
175
176  let msg = "White space required before and after '?'"
177  call CheckDefFailure(["var x = 1? 'one' : 'two'"], msg, 1)
178  call CheckDefFailure(["var x = 1 ?'one' : 'two'"], msg, 1)
179  call CheckDefFailure(["var x = 1?'one' : 'two'"], msg, 1)
180
181  let msg = "White space required before and after ':'"
182  call CheckDefFailure(["var x = 1 ? 'one': 'two'"], msg, 1)
183  call CheckDefFailure(["var x = 1 ? 'one' :'two'"], msg, 1)
184  call CheckDefFailure(["var x = 1 ? 'one':'two'"], msg, 1)
185
186  call CheckDefFailure(["var x = 'x' ? 'one' : 'two'"], 'E1135:', 1)
187  call CheckDefFailure(["var x = 0z1234 ? 'one' : 'two'"], 'E974:', 1)
188  call CheckDefExecFailure(["var x = [] ? 'one' : 'two'"], 'E745:', 1)
189  call CheckDefExecFailure(["var x = {} ? 'one' : 'two'"], 'E728:', 1)
190
191  call CheckDefExecFailure(["var x = false ? "], 'E1097:', 2)
192  call CheckDefExecFailure(["var x = false ? 'one' : "], 'E1097:', 2)
193
194  call CheckDefExecFailure(["var x = true ? xxx : 'foo'"], 'E1001:', 1)
195  call CheckDefExecFailure(["var x = false ? 'foo' : xxx"], 'E1001:', 1)
196
197  if has('float')
198    call CheckDefFailure(["var x = 0.1 ? 'one' : 'two'"], 'E805:', 1)
199  endif
200
201  " missing argument detected even when common type is used
202  call CheckDefFailure([
203	\ 'var X = FuncOne',
204	\ 'var Y = FuncTwo',
205	\ 'var Z = g:cond ? FuncOne : FuncTwo',
206	\ 'Z()'], 'E119:', 4)
207endfunc
208
209def Test_expr1_falsy()
210  var lines =<< trim END
211      assert_equal(v:true, v:true ?? 456)
212      assert_equal(123, 123 ?? 456)
213      assert_equal('yes', 'yes' ?? 456)
214      assert_equal([1], [1] ?? 456)
215      assert_equal({one: 1}, {one: 1} ?? 456)
216      if has('float')
217        assert_equal(0.1, 0.1 ?? 456)
218      endif
219
220      assert_equal(456, v:false ?? 456)
221      assert_equal(456, 0 ?? 456)
222      assert_equal(456, '' ?? 456)
223      assert_equal(456, [] ?? 456)
224      assert_equal(456, {} ?? 456)
225      if has('float')
226        assert_equal(456, 0.0 ?? 456)
227      endif
228  END
229  CheckDefAndScriptSuccess(lines)
230
231  var msg = "White space required before and after '??'"
232  call CheckDefFailure(["var x = 1?? 'one' : 'two'"], msg, 1)
233  call CheckDefFailure(["var x = 1 ??'one' : 'two'"], msg, 1)
234  call CheckDefFailure(["var x = 1??'one' : 'two'"], msg, 1)
235enddef
236
237def Record(val: any): any
238  g:vals->add(val)
239  return val
240enddef
241
242" test ||
243def Test_expr2()
244  var lines =<< trim END
245      assert_equal(true, 1 || 0)
246      assert_equal(true, 0 ||
247                        0 ||
248                        1)
249      assert_equal(true, 0 ||
250			0 ||
251			!!7)
252      assert_equal(false, 0 || 0)
253      assert_equal(false, 0
254                        || 0)
255      assert_equal(false, 0 || false)
256
257      g:vals = []
258      assert_equal(true, Record(1) || Record(3))
259      assert_equal([1], g:vals)
260
261      g:vals = []
262      assert_equal(true, Record(0) || Record(1))
263      assert_equal([0, 1], g:vals)
264
265      g:vals = []
266      assert_equal(true, Record(0) || Record(true))
267      assert_equal([0, true], g:vals)
268
269      g:vals = []
270      assert_equal(true, Record(0)
271                          || Record(1)
272                          || Record(0))
273      assert_equal([0, 1], g:vals)
274
275      g:vals = []
276      assert_equal(true, Record(0)
277			  || Record(true)
278			  || Record(0))
279      assert_equal([0, true], g:vals)
280
281      g:vals = []
282      assert_equal(true, Record(true) || Record(false))
283      assert_equal([true], g:vals)
284
285      g:vals = []
286      assert_equal(false, Record(0) || Record(false) || Record(0))
287      assert_equal([0, false, 0], g:vals)
288  END
289  CheckDefAndScriptSuccess(lines)
290enddef
291
292def Test_expr2_vimscript()
293  # check line continuation
294  var lines =<< trim END
295      vim9script
296      var name = 0
297      		|| 1
298      assert_equal(true, name)
299  END
300  CheckScriptSuccess(lines)
301
302  lines =<< trim END
303      vim9script
304      var name = v:false
305      		|| v:true
306      		|| v:false
307      assert_equal(v:true, name)
308  END
309  CheckScriptSuccess(lines)
310
311  lines =<< trim END
312      vim9script
313      var name = v:false ||
314      		v:true ||
315		v:false
316      assert_equal(v:true, name)
317  END
318  CheckScriptSuccess(lines)
319
320  lines =<< trim END
321      vim9script
322      var name = v:false || # comment
323                # comment
324      		v:true ||
325                # comment
326		v:false # comment
327      assert_equal(v:true, name)
328  END
329  CheckScriptSuccess(lines)
330
331  # check white space
332  lines =<< trim END
333      vim9script
334      var name = v:true||v:true
335  END
336  CheckScriptFailure(lines, 'E1004:', 2)
337  lines =<< trim END
338      vim9script
339      var name = v:true ||v:true
340  END
341  CheckScriptFailure(lines, 'E1004:', 2)
342  lines =<< trim END
343      vim9script
344      var name = v:true|| v:true
345  END
346  CheckScriptFailure(lines, 'E1004:', 2)
347enddef
348
349def Test_expr2_fails()
350  var msg = "White space required before and after '||'"
351  call CheckDefFailure(["var x = 1||2"], msg, 1)
352  call CheckDefFailure(["var x = 1 ||2"], msg, 1)
353  call CheckDefFailure(["var x = 1|| 2"], msg, 1)
354
355  call CheckDefFailure(["var x = false || "], 'E1097:', 2)
356
357  call CheckDefFailure(["var x = 1 || xxx"], 'E1001:', 1)
358  call CheckDefFailure(["var x = [] || false"], 'E1012:', 1)
359  call CheckDefFailure(["if 'yes' || 0", 'echo 0', 'endif'], 'E1012: Type mismatch; expected bool but got string', 1)
360
361  # TODO: should fail at compile time
362  call CheckDefExecFailure(["var x = 3 || 7"], 'E1023:', 1)
363  call CheckScriptFailure(["vim9script", "var x = 3 || 7"], 'E1023:', 2)
364  call CheckScriptFailure(["vim9script", "var x = [] || false"], 'E745:', 2)
365enddef
366
367" test &&
368def Test_expr3()
369  var lines =<< trim END
370      assert_equal(false, 1 && 0)
371      assert_equal(false, 0 &&
372                    0 &&
373                    1)
374      assert_equal(true, 1
375                        && true
376                        && 1)
377      assert_equal(false, 0 && 0)
378      assert_equal(false, 0 && false)
379      assert_equal(true, 1 && true)
380
381      g:vals = []
382      assert_equal(true, Record(true) && Record(1))
383      assert_equal([true, 1], g:vals)
384
385      g:vals = []
386      assert_equal(true, Record(1) && Record(true))
387      assert_equal([1, true], g:vals)
388
389      g:vals = []
390      assert_equal(false, Record(0) && Record(1))
391      assert_equal([0], g:vals)
392
393      g:vals = []
394      assert_equal(false, Record(0) && Record(1) && Record(0))
395      assert_equal([0], g:vals)
396
397      g:vals = []
398      assert_equal(false, Record(0) && Record(4) && Record(0))
399      assert_equal([0], g:vals)
400
401      g:vals = []
402      assert_equal(false, Record(1) && Record(true) && Record(0))
403      assert_equal([1, true, 0], g:vals)
404  END
405  CheckDefAndScriptSuccess(lines)
406enddef
407
408def Test_expr3_vimscript()
409  # check line continuation
410  var lines =<< trim END
411      vim9script
412      var name = 0
413      		&& 1
414      assert_equal(false, name)
415  END
416  CheckScriptSuccess(lines)
417
418  lines =<< trim END
419      vim9script
420      var name = v:true
421      		&& v:true
422      		&& v:true
423      assert_equal(v:true, name)
424  END
425  CheckScriptSuccess(lines)
426
427  lines =<< trim END
428      vim9script
429      var name = v:true &&
430      		v:true &&
431      		v:true
432      assert_equal(v:true, name)
433  END
434  CheckScriptSuccess(lines)
435
436  lines =<< trim END
437      vim9script
438      var name = v:true &&  # comment
439                # comment
440      		v:true &&
441                # comment
442      		v:true
443      assert_equal(v:true, name)
444  END
445  CheckScriptSuccess(lines)
446
447  # check white space
448  lines =<< trim END
449      vim9script
450      var name = v:true&&v:true
451  END
452  CheckScriptFailure(lines, 'E1004:', 2)
453  lines =<< trim END
454      vim9script
455      var name = v:true &&v:true
456  END
457  CheckScriptFailure(lines, 'E1004:', 2)
458  lines =<< trim END
459      vim9script
460      var name = v:true&& v:true
461  END
462  CheckScriptFailure(lines, 'E1004:', 2)
463enddef
464
465func Test_expr3_fails()
466  let msg = "White space required before and after '&&'"
467  call CheckDefFailure(["var x = 1&&2"], msg, 1)
468  call CheckDefFailure(["var x = 1 &&2"], msg, 1)
469  call CheckDefFailure(["var x = 1&& 2"], msg, 1)
470
471  call CheckDefFailure(["if 'yes' && 0", 'echo 0', 'endif'], 'E1012: Type mismatch; expected bool but got string', 1)
472
473  call CheckDefExecFailure(['assert_equal(false, Record(1) && Record(4) && Record(0))'], 'E1023: Using a Number as a Bool: 4', 1)
474endfunc
475
476" global variables to use for tests with the "any" type
477let atrue = v:true
478let afalse = v:false
479let anone = v:none
480let anull = v:null
481let anint = 10
482let theone = 1
483let thefour = 4
484if has('float')
485  let afloat = 0.1
486endif
487let astring = 'asdf'
488let ablob = 0z01ab
489let alist = [2, 3, 4]
490let adict = #{aaa: 2, bbb: 8}
491
492" test == comperator
493def Test_expr4_equal()
494  var lines =<< trim END
495      var trueVar = true
496      var falseVar = false
497      assert_equal(true, true == true)
498      assert_equal(false, true ==
499                            false)
500      assert_equal(true, true
501                            == trueVar)
502      assert_equal(false, true == falseVar)
503      assert_equal(true, true == g:atrue)
504      assert_equal(false, g:atrue == false)
505
506      assert_equal(true, v:none == v:none)
507      assert_equal(false, v:none == v:null)
508      assert_equal(true, g:anone == v:none)
509      assert_equal(false, v:none == g:anull)
510
511      var nr0 = 0
512      var nr61 = 61
513      assert_equal(false, 2 == 0)
514      assert_equal(false, 2 == nr0)
515      assert_equal(true, 61 == 61)
516      assert_equal(true, 61 == nr61)
517      assert_equal(true, g:anint == 10)
518      assert_equal(false, 61 == g:anint)
519
520      if has('float')
521        var ff = 0.3
522        assert_equal(true, ff == 0.3)
523        assert_equal(false, 0.4 == ff)
524        assert_equal(true, 0.1 == g:afloat)
525        assert_equal(false, g:afloat == 0.3)
526
527        ff = 3.0
528        assert_equal(true, ff == 3)
529        assert_equal(true, 3 == ff)
530        ff = 3.1
531        assert_equal(false, ff == 3)
532        assert_equal(false, 3 == ff)
533      endif
534
535      assert_equal(true, 'abc' == 'abc')
536      assert_equal(false, 'xyz' == 'abc')
537      assert_equal(true, g:astring == 'asdf')
538      assert_equal(false, 'xyz' == g:astring)
539
540      assert_equal(false, 'abc' == 'aBc')
541      assert_equal(false, 'abc' ==# 'aBc')
542      assert_equal(true, 'abc' ==? 'aBc')
543
544      assert_equal(false, 'abc' == 'ABC')
545      set ignorecase
546      assert_equal(false, 'abc' == 'ABC')
547      assert_equal(false, 'abc' ==# 'ABC')
548      assert_equal(true, 'abc' ==? 'ABC')
549      set noignorecase
550
551      var bb = 0z3f
552      assert_equal(true, 0z3f == bb)
553      assert_equal(false, bb == 0z4f)
554      assert_equal(true, g:ablob == 0z01ab)
555      assert_equal(false, 0z3f == g:ablob)
556
557      assert_equal(true, [1, 2, 3] == [1, 2, 3])
558      assert_equal(false, [1, 2, 3] == [2, 3, 1])
559      assert_equal(true, [2, 3, 4] == g:alist)
560      assert_equal(false, g:alist == [2, 3, 1])
561      assert_equal(false, [1, 2, 3] == [])
562      assert_equal(false, [1, 2, 3] == ['1', '2', '3'])
563
564      assert_equal(true, {one: 1, two: 2} == {one: 1, two: 2})
565      assert_equal(false, {one: 1, two: 2} == {one: 2, two: 2})
566      assert_equal(false, {one: 1, two: 2} == {two: 2})
567      assert_equal(false, {one: 1, two: 2} == {})
568      assert_equal(true, g:adict == {bbb: 8, aaa: 2})
569      assert_equal(false, {ccc: 9, aaa: 2} == g:adict)
570
571      assert_equal(true, function('g:Test_expr4_equal') == function('g:Test_expr4_equal'))
572      assert_equal(false, function('g:Test_expr4_equal') == function('g:Test_expr4_is'))
573
574      assert_equal(true, function('g:Test_expr4_equal', [123]) == function('g:Test_expr4_equal', [123]))
575      assert_equal(false, function('g:Test_expr4_equal', [123]) == function('g:Test_expr4_is', [123]))
576      assert_equal(false, function('g:Test_expr4_equal', [123]) == function('g:Test_expr4_equal', [999]))
577
578      # TODO: this unexpectedly sometimes fails on Appveyor
579      if !has('win32')
580        var OneFunc: func
581        var TwoFunc: func
582        OneFunc = function('len')
583        TwoFunc = function('len')
584        assert_equal(true, OneFunc('abc') == TwoFunc('123'))
585      endif
586  END
587  CheckDefAndScriptSuccess(lines)
588
589  CheckDefFailure(["var x = 'a' == xxx"], 'E1001:', 1)
590  CheckDefFailure(["var x = 'a' == "], 'E1097:', 2)
591
592  CheckDefExecFailure(['var items: any', 'eval 1', 'eval 2', 'if items == []', 'endif'], 'E691:', 4)
593enddef
594
595" test != comperator
596def Test_expr4_notequal()
597  var lines =<< trim END
598      var trueVar = true
599      var falseVar = false
600      assert_equal(false, true != true)
601      assert_equal(true, true !=
602                            false)
603      assert_equal(false, true
604                            != trueVar)
605      assert_equal(true, true != falseVar)
606      assert_equal(false, true != g:atrue)
607      assert_equal(true, g:atrue != false)
608
609      assert_equal(false, v:none != v:none)
610      assert_equal(true, v:none != v:null)
611      assert_equal(false, g:anone != v:none)
612      assert_equal(true, v:none != g:anull)
613
614      var nr55 = 55
615      var nr0 = 55
616      assert_equal(true, 2 != 0)
617      assert_equal(true, 2 != nr0)
618      assert_equal(false, 55 != 55)
619      assert_equal(false, 55 != nr55)
620      assert_equal(false, g:anint != 10)
621      assert_equal(true, 61 != g:anint)
622
623      if has('float')
624        var ff = 0.3
625        assert_equal(false, 0.3 != ff)
626        assert_equal(true, 0.4 != ff)
627        assert_equal(false, 0.1 != g:afloat)
628        assert_equal(true, g:afloat != 0.3)
629
630        ff = 3.0
631        assert_equal(false, ff != 3)
632        assert_equal(false, 3 != ff)
633        ff = 3.1
634        assert_equal(true, ff != 3)
635        assert_equal(true, 3 != ff)
636      endif
637
638      assert_equal(false, 'abc' != 'abc')
639      assert_equal(true, 'xyz' != 'abc')
640      assert_equal(false, g:astring != 'asdf')
641      assert_equal(true, 'xyz' != g:astring)
642
643      assert_equal(true, 'abc' != 'ABC')
644      set ignorecase
645      assert_equal(true, 'abc' != 'ABC')
646      assert_equal(true, 'abc' !=# 'ABC')
647      assert_equal(false, 'abc' !=? 'ABC')
648      set noignorecase
649
650      var bb = 0z3f
651      assert_equal(false, 0z3f != bb)
652      assert_equal(true, bb != 0z4f)
653      assert_equal(false, g:ablob != 0z01ab)
654      assert_equal(true, 0z3f != g:ablob)
655
656      assert_equal(false, [1, 2, 3] != [1, 2, 3])
657      assert_equal(true, [1, 2, 3] != [2, 3, 1])
658      assert_equal(false, [2, 3, 4] != g:alist)
659      assert_equal(true, g:alist != [2, 3, 1])
660      assert_equal(true, [1, 2, 3] != [])
661      assert_equal(true, [1, 2, 3] != ['1', '2', '3'])
662
663      assert_equal(false, {one: 1, two: 2} != {one: 1, two: 2})
664      assert_equal(true, {one: 1, two: 2} != {one: 2, two: 2})
665      assert_equal(true, {one: 1, two: 2} != {two: 2})
666      assert_equal(true, {one: 1, two: 2} != {})
667      assert_equal(false, g:adict != {bbb: 8, aaa: 2})
668      assert_equal(true, {ccc: 9, aaa: 2} != g:adict)
669
670      assert_equal(false, function('g:Test_expr4_equal') != function('g:Test_expr4_equal'))
671      assert_equal(true, function('g:Test_expr4_equal') != function('g:Test_expr4_is'))
672
673      assert_equal(false, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_equal', [123]))
674      assert_equal(true, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_is', [123]))
675      assert_equal(true, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_equal', [999]))
676  END
677  CheckDefAndScriptSuccess(lines)
678enddef
679
680" test > comperator
681def Test_expr4_greater()
682  var lines =<< trim END
683      assert_true(2 > 0)
684      assert_true(2 >
685                    1)
686      assert_false(2 > 2)
687      assert_false(2 > 3)
688      var nr2 = 2
689      assert_true(nr2 > 0)
690      assert_true(nr2 >
691                    1)
692      assert_false(nr2 > 2)
693      assert_false(nr2
694                        > 3)
695      if has('float')
696        var ff = 2.0
697        assert_true(ff > 0.0)
698        assert_true(ff > 1.0)
699        assert_false(ff > 2.0)
700        assert_false(ff > 3.0)
701      endif
702  END
703  CheckDefAndScriptSuccess(lines)
704enddef
705
706" test >= comperator
707def Test_expr4_greaterequal()
708  var lines =<< trim END
709      assert_true(2 >= 0)
710      assert_true(2 >=
711                            2)
712      assert_false(2 >= 3)
713      var nr2 = 2
714      assert_true(nr2 >= 0)
715      assert_true(nr2 >= 2)
716      assert_false(nr2 >= 3)
717      if has('float')
718        var ff = 2.0
719        assert_true(ff >= 0.0)
720        assert_true(ff >= 2.0)
721        assert_false(ff >= 3.0)
722      endif
723  END
724  CheckDefAndScriptSuccess(lines)
725enddef
726
727" test < comperator
728def Test_expr4_smaller()
729  var lines =<< trim END
730      assert_false(2 < 0)
731      assert_false(2 <
732                            2)
733      assert_true(2
734                    < 3)
735      var nr2 = 2
736      assert_false(nr2 < 0)
737      assert_false(nr2 < 2)
738      assert_true(nr2 < 3)
739      if has('float')
740        var ff = 2.0
741        assert_false(ff < 0.0)
742        assert_false(ff < 2.0)
743        assert_true(ff < 3.0)
744      endif
745  END
746  CheckDefAndScriptSuccess(lines)
747enddef
748
749" test <= comperator
750def Test_expr4_smallerequal()
751  var lines =<< trim END
752      assert_false(2 <= 0)
753      assert_false(2 <=
754                            1)
755      assert_true(2
756                    <= 2)
757      assert_true(2 <= 3)
758      var nr2 = 2
759      assert_false(nr2 <= 0)
760      assert_false(nr2 <= 1)
761      assert_true(nr2 <= 2)
762      assert_true(nr2 <= 3)
763      if has('float')
764        var ff = 2.0
765        assert_false(ff <= 0.0)
766        assert_false(ff <= 1.0)
767        assert_true(ff <= 2.0)
768        assert_true(ff <= 3.0)
769      endif
770  END
771  CheckDefAndScriptSuccess(lines)
772enddef
773
774" test =~ comperator
775def Test_expr4_match()
776  var lines =<< trim END
777      assert_equal(false, '2' =~ '0')
778      assert_equal(false, ''
779                             =~ '0')
780      assert_equal(true, '2' =~
781                            '[0-9]')
782      set ignorecase
783      assert_equal(false, 'abc' =~ 'ABC')
784      assert_equal(false, 'abc' =~# 'ABC')
785      assert_equal(true, 'abc' =~? 'ABC')
786      set noignorecase
787  END
788  CheckDefAndScriptSuccess(lines)
789enddef
790
791" test !~ comperator
792def Test_expr4_nomatch()
793  var lines =<< trim END
794      assert_equal(true, '2' !~ '0')
795      assert_equal(true, ''
796                            !~ '0')
797      assert_equal(false, '2' !~
798                            '[0-9]')
799  END
800  CheckDefAndScriptSuccess(lines)
801enddef
802
803" test is comperator
804def Test_expr4_is()
805  var lines =<< trim END
806      var mylist = [2]
807      assert_false(mylist is [2])
808      var other = mylist
809      assert_true(mylist is
810                    other)
811
812      var myblob = 0z1234
813      assert_false(myblob
814                            is 0z1234)
815      var otherblob = myblob
816      assert_true(myblob is otherblob)
817  END
818  CheckDefAndScriptSuccess(lines)
819enddef
820
821" test isnot comperator
822def Test_expr4_isnot()
823  var lines =<< trim END
824      var mylist = [2]
825      assert_true('2' isnot '0')
826      assert_true(mylist isnot [2])
827      var other = mylist
828      assert_false(mylist isnot
829                            other)
830
831      var myblob = 0z1234
832      assert_true(myblob
833                    isnot 0z1234)
834      var otherblob = myblob
835      assert_false(myblob isnot otherblob)
836  END
837  CheckDefAndScriptSuccess(lines)
838enddef
839
840def RetVoid()
841  var x = 1
842enddef
843
844def Test_expr4_vim9script()
845  # check line continuation
846  var lines =<< trim END
847      vim9script
848      var name = 0
849      		< 1
850      assert_equal(true, name)
851  END
852  CheckScriptSuccess(lines)
853
854  lines =<< trim END
855      vim9script
856      var name = 123
857                # comment
858      		!= 123
859      assert_equal(false, name)
860  END
861  CheckScriptSuccess(lines)
862
863  lines =<< trim END
864      vim9script
865      var name = 123 ==
866      			123
867      assert_equal(true, name)
868  END
869  CheckScriptSuccess(lines)
870
871  lines =<< trim END
872      vim9script
873      var list = [1, 2, 3]
874      var name = list
875      		is list
876      assert_equal(true, name)
877  END
878  CheckScriptSuccess(lines)
879
880  lines =<< trim END
881      vim9script
882      var list = [1, 2, 3]
883      var name = list # comment
884                 # comment
885      		is list
886      assert_equal(true, name)
887  END
888  CheckScriptSuccess(lines)
889
890  lines =<< trim END
891      vim9script
892      var myblob = 0z1234
893      var name = myblob
894      		isnot 0z11
895      assert_equal(true, name)
896  END
897  CheckScriptSuccess(lines)
898
899  # spot check mismatching types
900  lines =<< trim END
901      vim9script
902      echo '' == 0
903  END
904  CheckScriptFailure(lines, 'E1072:', 2)
905
906  lines =<< trim END
907      vim9script
908      echo v:true > v:false
909  END
910  CheckScriptFailure(lines, 'Cannot compare bool with bool', 2)
911
912  lines =<< trim END
913      vim9script
914      echo 123 is 123
915  END
916  CheckScriptFailure(lines, 'Cannot use "is" with number', 2)
917
918  # check missing white space
919  lines =<< trim END
920    vim9script
921    echo 2>3
922  END
923  CheckScriptFailure(lines, 'E1004:', 2)
924  lines =<< trim END
925    vim9script
926    echo 2 >3
927  END
928  CheckScriptFailure(lines, 'E1004:', 2)
929  lines =<< trim END
930    vim9script
931    echo 2> 3
932  END
933  CheckScriptFailure(lines, 'E1004:', 2)
934  lines =<< trim END
935    vim9script
936    echo 2!=3
937  END
938  CheckScriptFailure(lines, 'E1004:', 2)
939  lines =<< trim END
940    vim9script
941    echo 2 !=3
942  END
943  CheckScriptFailure(lines, 'E1004:', 2)
944  lines =<< trim END
945    vim9script
946    echo 2!= 3
947  END
948  CheckScriptFailure(lines, 'E1004:', 2)
949
950  lines =<< trim END
951    vim9script
952    echo len('xxx') == 3
953  END
954  CheckScriptSuccess(lines)
955
956  lines =<< trim END
957    vim9script
958    var line = 'abc'
959    echo line[1] =~ '\w'
960  END
961  CheckScriptSuccess(lines)
962enddef
963
964func Test_expr4_fails()
965  let msg = "White space required before and after '>'"
966  call CheckDefFailure(["var x = 1>2"], msg, 1)
967  call CheckDefFailure(["var x = 1 >2"], msg, 1)
968  call CheckDefFailure(["var x = 1> 2"], msg, 1)
969
970  let msg = "White space required before and after '=='"
971  call CheckDefFailure(["var x = 1==2"], msg, 1)
972  call CheckDefFailure(["var x = 1 ==2"], msg, 1)
973  call CheckDefFailure(["var x = 1== 2"], msg, 1)
974
975  let msg = "White space required before and after 'is'"
976  call CheckDefFailure(["var x = '1'is'2'"], msg, 1)
977  call CheckDefFailure(["var x = '1' is'2'"], msg, 1)
978  call CheckDefFailure(["var x = '1'is '2'"], msg, 1)
979
980  let msg = "White space required before and after 'isnot'"
981  call CheckDefFailure(["var x = '1'isnot'2'"], msg, 1)
982  call CheckDefFailure(["var x = '1' isnot'2'"], msg, 1)
983  call CheckDefFailure(["var x = '1'isnot '2'"], msg, 1)
984
985  call CheckDefFailure(["var x = 1 is# 2"], 'E15:', 1)
986  call CheckDefFailure(["var x = 1 is? 2"], 'E15:', 1)
987  call CheckDefFailure(["var x = 1 isnot# 2"], 'E15:', 1)
988  call CheckDefFailure(["var x = 1 isnot? 2"], 'E15:', 1)
989
990  call CheckDefFailure(["var x = 1 == '2'"], 'Cannot compare number with string', 1)
991  call CheckDefFailure(["var x = '1' == 2"], 'Cannot compare string with number', 1)
992  call CheckDefFailure(["var x = 1 == RetVoid()"], 'Cannot compare number with void', 1)
993  call CheckDefFailure(["var x = RetVoid() == 1"], 'Cannot compare void with number', 1)
994
995  call CheckDefFailure(["var x = true > false"], 'Cannot compare bool with bool', 1)
996  call CheckDefFailure(["var x = true >= false"], 'Cannot compare bool with bool', 1)
997  call CheckDefFailure(["var x = true < false"], 'Cannot compare bool with bool', 1)
998  call CheckDefFailure(["var x = true <= false"], 'Cannot compare bool with bool', 1)
999  call CheckDefFailure(["var x = true =~ false"], 'Cannot compare bool with bool', 1)
1000  call CheckDefFailure(["var x = true !~ false"], 'Cannot compare bool with bool', 1)
1001  call CheckDefFailure(["var x = true is false"], 'Cannot use "is" with bool', 1)
1002  call CheckDefFailure(["var x = true isnot false"], 'Cannot use "isnot" with bool', 1)
1003
1004  call CheckDefFailure(["var x = v:none is v:null"], 'Cannot use "is" with special', 1)
1005  call CheckDefFailure(["var x = v:none isnot v:null"], 'Cannot use "isnot" with special', 1)
1006  call CheckDefFailure(["var x = 123 is 123"], 'Cannot use "is" with number', 1)
1007  call CheckDefFailure(["var x = 123 isnot 123"], 'Cannot use "isnot" with number', 1)
1008  if has('float')
1009    call CheckDefFailure(["var x = 1.3 is 1.3"], 'Cannot use "is" with float', 1)
1010    call CheckDefFailure(["var x = 1.3 isnot 1.3"], 'Cannot use "isnot" with float', 1)
1011  endif
1012
1013  call CheckDefFailure(["var x = 0za1 > 0z34"], 'Cannot compare blob with blob', 1)
1014  call CheckDefFailure(["var x = 0za1 >= 0z34"], 'Cannot compare blob with blob', 1)
1015  call CheckDefFailure(["var x = 0za1 < 0z34"], 'Cannot compare blob with blob', 1)
1016  call CheckDefFailure(["var x = 0za1 <= 0z34"], 'Cannot compare blob with blob', 1)
1017  call CheckDefFailure(["var x = 0za1 =~ 0z34"], 'Cannot compare blob with blob', 1)
1018  call CheckDefFailure(["var x = 0za1 !~ 0z34"], 'Cannot compare blob with blob', 1)
1019
1020  call CheckDefFailure(["var x = [13] > [88]"], 'Cannot compare list with list', 1)
1021  call CheckDefFailure(["var x = [13] >= [88]"], 'Cannot compare list with list', 1)
1022  call CheckDefFailure(["var x = [13] < [88]"], 'Cannot compare list with list', 1)
1023  call CheckDefFailure(["var x = [13] <= [88]"], 'Cannot compare list with list', 1)
1024  call CheckDefFailure(["var x = [13] =~ [88]"], 'Cannot compare list with list', 1)
1025  call CheckDefFailure(["var x = [13] !~ [88]"], 'Cannot compare list with list', 1)
1026
1027  call CheckDefFailure(['var j: job', 'var chan: channel', 'var r = j == chan'], 'Cannot compare job with channel', 3)
1028  call CheckDefFailure(['var j: job', 'var x: list<any>', 'var r = j == x'], 'Cannot compare job with list', 3)
1029  call CheckDefFailure(['var j: job', 'var Xx: func', 'var r = j == Xx'], 'Cannot compare job with func', 3)
1030  call CheckDefFailure(['var j: job', 'var Xx: func', 'var r = j == Xx'], 'Cannot compare job with func', 3)
1031endfunc
1032
1033" test addition, subtraction, concatenation
1034def Test_expr5()
1035  var lines =<< trim END
1036      assert_equal(66, 60 + 6)
1037      assert_equal(70, 60 +
1038                            g:anint)
1039      assert_equal(9, g:thefour
1040                            + 5)
1041      assert_equal(14, g:thefour + g:anint)
1042      assert_equal([1, 2, 3, 4], [1] + g:alist)
1043
1044      assert_equal(54, 60 - 6)
1045      assert_equal(50, 60 -
1046                        g:anint)
1047      assert_equal(-1, g:thefour
1048                            - 5)
1049      assert_equal(-6, g:thefour - g:anint)
1050
1051      assert_equal('hello', 'hel' .. 'lo')
1052      assert_equal('hello 123', 'hello ' ..
1053                                            123)
1054      assert_equal('hello 123', 'hello '
1055                                    ..  123)
1056      assert_equal('123 hello', 123 .. ' hello')
1057      assert_equal('123456', 123 .. 456)
1058
1059      assert_equal('av:true', 'a' .. true)
1060      assert_equal('av:false', 'a' .. false)
1061      assert_equal('av:null', 'a' .. v:null)
1062      assert_equal('av:none', 'a' .. v:none)
1063      if has('float')
1064        assert_equal('a0.123', 'a' .. 0.123)
1065      endif
1066
1067      assert_equal([1, 2, 3, 4], [1, 2] + [3, 4])
1068      assert_equal(0z11223344, 0z1122 + 0z3344)
1069      assert_equal(0z112201ab, 0z1122
1070                                    + g:ablob)
1071      assert_equal(0z01ab3344, g:ablob + 0z3344)
1072      assert_equal(0z01ab01ab, g:ablob + g:ablob)
1073
1074      # concatenate non-constant to constant
1075      var save_path = &path
1076      &path = 'b'
1077      assert_equal('ab', 'a' .. &path)
1078      &path = save_path
1079
1080      @b = 'b'
1081      assert_equal('ab', 'a' .. @b)
1082
1083      $ENVVAR = 'env'
1084      assert_equal('aenv', 'a' .. $ENVVAR)
1085  END
1086  CheckDefAndScriptSuccess(lines)
1087enddef
1088
1089def Test_expr5_vim9script()
1090  # check line continuation
1091  var lines =<< trim END
1092      vim9script
1093      var name = 11
1094      		+ 77
1095		- 22
1096      assert_equal(66, name)
1097  END
1098  CheckScriptSuccess(lines)
1099
1100  lines =<< trim END
1101      vim9script
1102      var name = 11 +
1103		  77 -
1104		  22
1105      assert_equal(66, name)
1106  END
1107  CheckScriptSuccess(lines)
1108
1109  lines =<< trim END
1110      vim9script
1111      var name = 11 +  # comment
1112		  77 -
1113                  # comment
1114		  22
1115      assert_equal(66, name)
1116  END
1117  CheckScriptSuccess(lines)
1118
1119  lines =<< trim END
1120      vim9script
1121      var name = 'one'
1122      		.. 'two'
1123      assert_equal('onetwo', name)
1124  END
1125  CheckScriptSuccess(lines)
1126
1127  lines =<< trim END
1128      vim9script
1129      echo 'abc' is# 'abc'
1130  END
1131  CheckScriptFailure(lines, 'E15:', 2)
1132
1133  lines =<< trim END
1134      vim9script
1135      echo {} - 22
1136  END
1137  CheckScriptFailure(lines, 'E728:', 2)
1138
1139  lines =<< trim END
1140      vim9script
1141      echo [] - 33
1142  END
1143  CheckScriptFailure(lines, 'E745:', 2)
1144
1145  lines =<< trim END
1146      vim9script
1147      echo 0z1234 - 44
1148  END
1149  CheckScriptFailure(lines, 'E974:', 2)
1150
1151  lines =<< trim END
1152      vim9script
1153      echo 'abc' is? 'abc'
1154  END
1155  CheckScriptFailure(lines, 'E15:', 2)
1156
1157  lines =<< trim END
1158      vim9script
1159      echo 'abc' isnot# 'abc'
1160  END
1161  CheckScriptFailure(lines, 'E15:', 2)
1162
1163  lines =<< trim END
1164      vim9script
1165      echo 'abc' isnot? 'abc'
1166  END
1167  CheckScriptFailure(lines, 'E15:', 2)
1168
1169  # check white space
1170  lines =<< trim END
1171      vim9script
1172      echo 5+6
1173  END
1174  CheckScriptFailure(lines, 'E1004:', 2)
1175  lines =<< trim END
1176      vim9script
1177      echo 5 +6
1178  END
1179  CheckScriptFailure(lines, 'E1004:', 2)
1180  lines =<< trim END
1181      vim9script
1182      echo 5+ 6
1183  END
1184  CheckScriptFailure(lines, 'E1004:', 2)
1185
1186  lines =<< trim END
1187      vim9script
1188      echo 'a'..'b'
1189  END
1190  CheckScriptFailure(lines, 'E1004:', 2)
1191  lines =<< trim END
1192      vim9script
1193      echo 'a' ..'b'
1194  END
1195  CheckScriptFailure(lines, 'E1004:', 2)
1196  lines =<< trim END
1197      vim9script
1198      echo 'a'.. 'b'
1199  END
1200  CheckScriptFailure(lines, 'E1004:', 2)
1201
1202  # check invalid string concatenation
1203  lines =<< trim END
1204      vim9script
1205      echo 'a' .. [1]
1206  END
1207  CheckScriptFailure(lines, 'E730:', 2)
1208  lines =<< trim END
1209      vim9script
1210      echo 'a' .. {a: 1}
1211  END
1212  CheckScriptFailure(lines, 'E731:', 2)
1213  lines =<< trim END
1214      vim9script
1215      echo 'a' .. test_void()
1216  END
1217  CheckScriptFailure(lines, 'E908:', 2)
1218  lines =<< trim END
1219      vim9script
1220      echo 'a' .. 0z33
1221  END
1222  CheckScriptFailure(lines, 'E976:', 2)
1223  lines =<< trim END
1224      vim9script
1225      echo 'a' .. function('len')
1226  END
1227  CheckScriptFailure(lines, 'E729:', 2)
1228enddef
1229
1230def Test_expr5_vim9script_channel()
1231  if !has('channel')
1232    MissingFeature 'float'
1233  else
1234    var lines =<< trim END
1235        vim9script
1236        echo 'a' .. test_null_job()
1237    END
1238    CheckScriptFailure(lines, 'E908:', 2)
1239    lines =<< trim END
1240        vim9script
1241        echo 'a' .. test_null_channel()
1242    END
1243    CheckScriptFailure(lines, 'E908:', 2)
1244  endif
1245enddef
1246
1247def Test_expr5_float()
1248  if !has('float')
1249    MissingFeature 'float'
1250  else
1251    var lines =<< trim END
1252        assert_equal(66.0, 60.0 + 6.0)
1253        assert_equal(66.0, 60.0 + 6)
1254        assert_equal(66.0, 60 +
1255                             6.0)
1256        assert_equal(5.1, g:afloat
1257                            + 5)
1258        assert_equal(8.1, 8 + g:afloat)
1259        assert_equal(10.1, g:anint + g:afloat)
1260        assert_equal(10.1, g:afloat + g:anint)
1261
1262        assert_equal(54.0, 60.0 - 6.0)
1263        assert_equal(54.0, 60.0
1264                                - 6)
1265        assert_equal(54.0, 60 - 6.0)
1266        assert_equal(-4.9, g:afloat - 5)
1267        assert_equal(7.9, 8 - g:afloat)
1268        assert_equal(9.9, g:anint - g:afloat)
1269        assert_equal(-9.9, g:afloat - g:anint)
1270    END
1271    CheckDefAndScriptSuccess(lines)
1272  endif
1273enddef
1274
1275func Test_expr5_fails()
1276  let msg = "White space required before and after '+'"
1277  call CheckDefFailure(["var x = 1+2"], msg, 1)
1278  call CheckDefFailure(["var x = 1 +2"], msg, 1)
1279  call CheckDefFailure(["var x = 1+ 2"], msg, 1)
1280
1281  let msg = "White space required before and after '-'"
1282  call CheckDefFailure(["var x = 1-2"], msg, 1)
1283  call CheckDefFailure(["var x = 1 -2"], msg, 1)
1284  call CheckDefFailure(["var x = 1- 2"], msg, 1)
1285
1286  let msg = "White space required before and after '..'"
1287  call CheckDefFailure(["var x = '1'..'2'"], msg, 1)
1288  call CheckDefFailure(["var x = '1' ..'2'"], msg, 1)
1289  call CheckDefFailure(["var x = '1'.. '2'"], msg, 1)
1290
1291  call CheckDefFailure(["var x = 0z1122 + 33"], 'E1051:', 1)
1292  call CheckDefFailure(["var x = 0z1122 + [3]"], 'E1051:', 1)
1293  call CheckDefFailure(["var x = 0z1122 + 'asd'"], 'E1051:', 1)
1294  call CheckDefFailure(["var x = 33 + 0z1122"], 'E1051:', 1)
1295  call CheckDefFailure(["var x = [3] + 0z1122"], 'E1051:', 1)
1296  call CheckDefFailure(["var x = 'asdf' + 0z1122"], 'E1051:', 1)
1297  call CheckDefFailure(["var x = 6 + xxx"], 'E1001:', 1)
1298
1299  call CheckDefFailure(["var x = 'a' .. [1]"], 'E1105:', 1)
1300  call CheckDefFailure(["var x = 'a' .. {a: 1}"], 'E1105:', 1)
1301  call CheckDefFailure(["var x = 'a' .. test_void()"], 'E1105:', 1)
1302  call CheckDefFailure(["var x = 'a' .. 0z32"], 'E1105:', 1)
1303  call CheckDefFailure(["var x = 'a' .. function('len')"], 'E1105:', 1)
1304  call CheckDefFailure(["var x = 'a' .. function('len', ['a'])"], 'E1105:', 1)
1305
1306  call CheckScriptFailure(['vim9script', 'var x = 1 + v:none'], 'E611:', 2)
1307  call CheckScriptFailure(['vim9script', 'var x = 1 + v:null'], 'E611:', 2)
1308  call CheckScriptFailure(['vim9script', 'var x = 1 + v:true'], 'E1138:', 2)
1309  call CheckScriptFailure(['vim9script', 'var x = 1 + v:false'], 'E1138:', 2)
1310  call CheckScriptFailure(['vim9script', 'var x = 1 + true'], 'E1138:', 2)
1311  call CheckScriptFailure(['vim9script', 'var x = 1 + false'], 'E1138:', 2)
1312endfunc
1313
1314func Test_expr5_fails_channel()
1315  CheckFeature channel
1316  call CheckDefFailure(["var x = 'a' .. test_null_job()"], 'E1105:', 1)
1317  call CheckDefFailure(["var x = 'a' .. test_null_channel()"], 'E1105:', 1)
1318endfunc
1319
1320" test multiply, divide, modulo
1321def Test_expr6()
1322  var lines =<< trim END
1323      assert_equal(36, 6 * 6)
1324      assert_equal(24, 6 *
1325                            g:thefour)
1326      assert_equal(24, g:thefour
1327                            * 6)
1328      assert_equal(40, g:anint * g:thefour)
1329
1330      assert_equal(10, 60 / 6)
1331      assert_equal(6, 60 /
1332                            g:anint)
1333      assert_equal(1, g:anint / 6)
1334      assert_equal(2, g:anint
1335                            / g:thefour)
1336
1337      assert_equal(5, 11 % 6)
1338      assert_equal(4, g:anint % 6)
1339      assert_equal(3, 13 %
1340                            g:anint)
1341      assert_equal(2, g:anint
1342                            % g:thefour)
1343
1344      assert_equal(4, 6 * 4 / 6)
1345
1346      var x = [2]
1347      var y = [3]
1348      assert_equal(5, x[0] + y[0])
1349      assert_equal(6, x[0] * y[0])
1350      if has('float')
1351        var xf = [2.0]
1352        var yf = [3.0]
1353        assert_equal(5.0, xf[0]
1354                            + yf[0])
1355        assert_equal(6.0, xf[0]
1356                            * yf[0])
1357      endif
1358  END
1359  CheckDefAndScriptSuccess(lines)
1360
1361  CheckDefFailure(["var x = 6 * xxx"], 'E1001:', 1)
1362  CheckDefFailure(["var d = 6 * "], 'E1097:', 2)
1363enddef
1364
1365def Test_expr6_vim9script()
1366  # check line continuation
1367  var lines =<< trim END
1368      vim9script
1369      var name = 11
1370      		* 22
1371		/ 3
1372      assert_equal(80, name)
1373  END
1374  CheckScriptSuccess(lines)
1375
1376  lines =<< trim END
1377      vim9script
1378      var name = 25
1379      		% 10
1380      assert_equal(5, name)
1381  END
1382  CheckScriptSuccess(lines)
1383
1384  lines =<< trim END
1385      vim9script
1386      var name = 25
1387                # comment
1388
1389                # comment
1390      		% 10
1391      assert_equal(5, name)
1392  END
1393  CheckScriptSuccess(lines)
1394
1395  lines =<< trim END
1396      vim9script
1397      var name = 11 *
1398      		22 /
1399		3
1400      assert_equal(80, name)
1401  END
1402  CheckScriptSuccess(lines)
1403
1404  # check white space
1405  lines =<< trim END
1406      vim9script
1407      echo 5*6
1408  END
1409  CheckScriptFailure(lines, 'E1004:', 2)
1410  lines =<< trim END
1411      vim9script
1412      echo 5 *6
1413  END
1414  CheckScriptFailure(lines, 'E1004:', 2)
1415  lines =<< trim END
1416      vim9script
1417      echo 5* 6
1418  END
1419  CheckScriptFailure(lines, 'E1004:', 2)
1420enddef
1421
1422def Test_expr6_float()
1423  if !has('float')
1424    MissingFeature 'float'
1425  else
1426    var lines =<< trim END
1427        assert_equal(36.0, 6.0 * 6)
1428        assert_equal(36.0, 6 *
1429                               6.0)
1430        assert_equal(36.0, 6.0 * 6.0)
1431        assert_equal(1.0, g:afloat * g:anint)
1432
1433        assert_equal(10.0, 60 / 6.0)
1434        assert_equal(10.0, 60.0 /
1435                            6)
1436        assert_equal(10.0, 60.0 / 6.0)
1437        assert_equal(0.01, g:afloat / g:anint)
1438
1439        assert_equal(4.0, 6.0 * 4 / 6)
1440        assert_equal(4.0, 6 *
1441                            4.0 /
1442                            6)
1443        assert_equal(4.0, 6 * 4 / 6.0)
1444        assert_equal(4.0, 6.0 * 4.0 / 6)
1445        assert_equal(4.0, 6 * 4.0 / 6.0)
1446        assert_equal(4.0, 6.0 * 4 / 6.0)
1447        assert_equal(4.0, 6.0 * 4.0 / 6.0)
1448
1449        assert_equal(4.0, 6.0 * 4.0 / 6.0)
1450    END
1451    CheckDefAndScriptSuccess(lines)
1452  endif
1453enddef
1454
1455func Test_expr6_fails()
1456  let msg = "White space required before and after '*'"
1457  call CheckDefFailure(["var x = 1*2"], msg, 1)
1458  call CheckDefFailure(["var x = 1 *2"], msg, 1)
1459  call CheckDefFailure(["var x = 1* 2"], msg, 1)
1460
1461  let msg = "White space required before and after '/'"
1462  call CheckDefFailure(["var x = 1/2"], msg, 1)
1463  call CheckDefFailure(["var x = 1 /2"], msg, 1)
1464  call CheckDefFailure(["var x = 1/ 2"], msg, 1)
1465
1466  let msg = "White space required before and after '%'"
1467  call CheckDefFailure(["var x = 1%2"], msg, 1)
1468  call CheckDefFailure(["var x = 1 %2"], msg, 1)
1469  call CheckDefFailure(["var x = 1% 2"], msg, 1)
1470
1471  call CheckDefFailure(["var x = '1' * '2'"], 'E1036:', 1)
1472  call CheckDefFailure(["var x = '1' / '2'"], 'E1036:', 1)
1473  call CheckDefFailure(["var x = '1' % '2'"], 'E1035:', 1)
1474
1475  call CheckDefFailure(["var x = 0z01 * 0z12"], 'E1036:', 1)
1476  call CheckDefFailure(["var x = 0z01 / 0z12"], 'E1036:', 1)
1477  call CheckDefFailure(["var x = 0z01 % 0z12"], 'E1035:', 1)
1478
1479  call CheckDefFailure(["var x = [1] * [2]"], 'E1036:', 1)
1480  call CheckDefFailure(["var x = [1] / [2]"], 'E1036:', 1)
1481  call CheckDefFailure(["var x = [1] % [2]"], 'E1035:', 1)
1482
1483  call CheckDefFailure(["var x = {one: 1} * {two: 2}"], 'E1036:', 1)
1484  call CheckDefFailure(["var x = {one: 1} / {two: 2}"], 'E1036:', 1)
1485  call CheckDefFailure(["var x = {one: 1} % {two: 2}"], 'E1035:', 1)
1486
1487  call CheckDefFailure(["var x = 0xff[1]"], 'E1107:', 1)
1488  if has('float')
1489    call CheckDefFailure(["var x = 0.7[1]"], 'E1107:', 1)
1490  endif
1491endfunc
1492
1493func Test_expr6_float_fails()
1494  CheckFeature float
1495  call CheckDefFailure(["var x = 1.0 % 2"], 'E1035:', 1)
1496endfunc
1497
1498" define here to use old style parsing
1499if has('float')
1500  let g:float_zero = 0.0
1501  let g:float_neg = -9.8
1502  let g:float_big = 9.9e99
1503endif
1504let g:blob_empty = 0z
1505let g:blob_one = 0z01
1506let g:blob_long = 0z0102.0304
1507
1508let g:string_empty = ''
1509let g:string_short = 'x'
1510let g:string_long = 'abcdefghijklm'
1511let g:string_special = "ab\ncd\ref\ekk"
1512
1513let g:special_true = v:true
1514let g:special_false = v:false
1515let g:special_null = v:null
1516let g:special_none = v:none
1517
1518let g:list_empty = []
1519let g:list_mixed = [1, 'b', v:false]
1520
1521let g:dict_empty = {}
1522let g:dict_one = #{one: 1}
1523
1524let $TESTVAR = 'testvar'
1525
1526" type casts
1527def Test_expr7t()
1528  var ls: list<string> = ['a', <string>g:string_empty]
1529  var ln: list<number> = [<number>g:anint, <number>g:thefour]
1530  var nr = <number>234
1531  assert_equal(234, nr)
1532
1533  CheckDefFailure(["var x = <nr>123"], 'E1010:', 1)
1534  CheckDefFailure(["var x = <number>"], 'E1097:', 2)
1535  CheckDefFailure(["var x = <number >123"], 'E1068:', 1)
1536  CheckDefFailure(["var x = <number 123"], 'E1104:', 1)
1537enddef
1538
1539" test low level expression
1540def Test_expr7_number()
1541  # number constant
1542  var lines =<< trim END
1543      assert_equal(0, 0)
1544      assert_equal(654, 0654)
1545
1546      assert_equal(6, 0x6)
1547      assert_equal(15, 0xf)
1548      assert_equal(255, 0xff)
1549  END
1550  CheckDefAndScriptSuccess(lines)
1551enddef
1552
1553def Test_expr7_float()
1554  # float constant
1555  if !has('float')
1556    MissingFeature 'float'
1557  else
1558    var lines =<< trim END
1559        assert_equal(g:float_zero, .0)
1560        assert_equal(g:float_zero, 0.0)
1561        assert_equal(g:float_neg, -9.8)
1562        assert_equal(g:float_big, 9.9e99)
1563    END
1564    CheckDefAndScriptSuccess(lines)
1565  endif
1566enddef
1567
1568def Test_expr7_blob()
1569  # blob constant
1570  var lines =<< trim END
1571      assert_equal(g:blob_empty, 0z)
1572      assert_equal(g:blob_one, 0z01)
1573      assert_equal(g:blob_long, 0z0102.0304)
1574  END
1575  CheckDefAndScriptSuccess(lines)
1576
1577  CheckDefFailure(["var x = 0z123"], 'E973:', 1)
1578enddef
1579
1580def Test_expr7_string()
1581  # string constant
1582  var lines =<< trim END
1583      assert_equal(g:string_empty, '')
1584      assert_equal(g:string_empty, "")
1585      assert_equal(g:string_short, 'x')
1586      assert_equal(g:string_short, "x")
1587      assert_equal(g:string_long, 'abcdefghijklm')
1588      assert_equal(g:string_long, "abcdefghijklm")
1589      assert_equal(g:string_special, "ab\ncd\ref\ekk")
1590  END
1591  CheckDefAndScriptSuccess(lines)
1592
1593  CheckDefFailure(['var x = "abc'], 'E114:', 1)
1594  CheckDefFailure(["var x = 'abc"], 'E115:', 1)
1595enddef
1596
1597def Test_expr7_vimvar()
1598  var old: list<string> = v:oldfiles
1599  var compl: dict<any> = v:completed_item
1600
1601  CheckDefFailure(["var old: list<number> = v:oldfiles"], 'E1012: Type mismatch; expected list<number> but got list<string>', 1)
1602  new
1603  exec "normal! afoo fo\<C-N>\<Esc>"
1604  CheckDefExecFailure(["var old: dict<number> = v:completed_item"], 'E1012: Type mismatch; expected dict<number> but got dict<string>', 1)
1605  bwipe!
1606enddef
1607
1608def Test_expr7_special()
1609  # special constant
1610  var lines =<< trim END
1611      assert_equal(g:special_true, true)
1612      assert_equal(g:special_false, false)
1613      assert_equal(g:special_true, v:true)
1614      assert_equal(g:special_false, v:false)
1615      assert_equal(v:true, true)
1616      assert_equal(v:false, false)
1617
1618      assert_equal(true, !false)
1619      assert_equal(false, !true)
1620      assert_equal(true, !0)
1621      assert_equal(false, !1)
1622      assert_equal(false, !!false)
1623      assert_equal(true, !!true)
1624      assert_equal(false, !!0)
1625      assert_equal(true, !!1)
1626
1627      var t = true
1628      var f = false
1629      assert_equal(true, t)
1630      assert_equal(false, f)
1631
1632      assert_equal(g:special_null, v:null)
1633      assert_equal(g:special_none, v:none)
1634  END
1635  CheckDefAndScriptSuccess(lines)
1636
1637  CheckDefFailure(['v:true = true'], 'E46:', 1)
1638  CheckDefFailure(['v:true = false'], 'E46:', 1)
1639  CheckDefFailure(['v:false = true'], 'E46:', 1)
1640  CheckDefFailure(['v:null = 11'], 'E46:', 1)
1641  CheckDefFailure(['v:none = 22'], 'E46:', 1)
1642enddef
1643
1644def Test_expr7_list()
1645  # list
1646  var lines =<< trim END
1647      assert_equal(g:list_empty, [])
1648      assert_equal(g:list_empty, [  ])
1649
1650      var numbers: list<number> = [1, 2, 3]
1651      numbers = [1]
1652      numbers = []
1653
1654      var strings: list<string> = ['a', 'b', 'c']
1655      strings = ['x']
1656      strings = []
1657
1658      var mixed: list<any> = [1, 'b', false,]
1659      assert_equal(g:list_mixed, mixed)
1660      assert_equal('b', mixed[1])
1661
1662      echo [1,
1663            2] [3,
1664                    4]
1665
1666      var llstring: list<list<string>> = [['text'], []]
1667      llstring = [[], ['text']]
1668      llstring = [[], []]
1669  END
1670  CheckDefAndScriptSuccess(lines)
1671
1672  var rangelist: list<number> = range(3)
1673  g:rangelist = range(3)
1674  CheckDefExecFailure(["var x: list<string> = g:rangelist"], 'E1012: Type mismatch; expected list<string> but got list<number>', 1)
1675
1676  CheckDefFailure(["var x = 1234[3]"], 'E1107:', 1)
1677  CheckDefExecFailure(["var x = g:anint[3]"], 'E1062:', 1)
1678
1679  CheckDefFailure(["var x = g:list_mixed[xxx]"], 'E1001:', 1)
1680
1681  CheckDefFailure(["var x = [1,2,3]"], 'E1069:', 1)
1682  CheckDefFailure(["var x = [1 ,2, 3]"], 'E1068:', 1)
1683
1684  CheckDefExecFailure(["echo 1", "var x = [][0]", "echo 3"], 'E684:', 2)
1685
1686  CheckDefExecFailure(["var x = g:list_mixed['xx']"], 'E1012:', 1)
1687  CheckDefFailure(["var x = g:list_mixed["], 'E1097:', 2)
1688  CheckDefFailure(["var x = g:list_mixed[0"], 'E1097:', 2)
1689  CheckDefExecFailure(["var x = g:list_empty[3]"], 'E684:', 1)
1690  CheckDefExecFailure(["var l: list<number> = [234, 'x']"], 'E1012:', 1)
1691  CheckDefExecFailure(["var l: list<number> = ['x', 234]"], 'E1012:', 1)
1692  CheckDefExecFailure(["var l: list<string> = [234, 'x']"], 'E1012:', 1)
1693  CheckDefExecFailure(["var l: list<string> = ['x', 123]"], 'E1012:', 1)
1694
1695  lines =<< trim END
1696      vim9script
1697      var datalist: list<string>
1698      def Main()
1699        datalist += ['x'.
1700      enddef
1701      Main()
1702  END
1703  CheckScriptFailure(lines, 'E1127:')
1704enddef
1705
1706def Test_expr7_list_vim9script()
1707  var lines =<< trim END
1708      vim9script
1709      var l = [
1710		11,
1711		22,
1712		]
1713      assert_equal([11, 22], l)
1714
1715      echo [1,
1716	    2] [3,
1717		    4]
1718
1719      echo [1, # comment
1720            # comment
1721	    2] [3,
1722            # comment
1723		    4]
1724  END
1725  CheckScriptSuccess(lines)
1726
1727  lines =<< trim END
1728      vim9script
1729      var l = [11,
1730		22]
1731      assert_equal([11, 22], l)
1732  END
1733  CheckScriptSuccess(lines)
1734
1735  lines =<< trim END
1736      vim9script
1737      var l = [11,22]
1738  END
1739  CheckScriptFailure(lines, 'E1069:', 2)
1740
1741  lines =<< trim END
1742      vim9script
1743      var l = [11 , 22]
1744  END
1745  CheckScriptFailure(lines, 'E1068:', 2)
1746
1747  lines =<< trim END
1748    vim9script
1749    var l: list<number> = [234, 'x']
1750  END
1751  CheckScriptFailure(lines, 'E1012:', 2)
1752  lines =<< trim END
1753    vim9script
1754    var l: list<number> = ['x', 234]
1755  END
1756  CheckScriptFailure(lines, 'E1012:', 2)
1757  lines =<< trim END
1758    vim9script
1759    var l: list<string> = ['x', 234]
1760  END
1761  CheckScriptFailure(lines, 'E1012:', 2)
1762  lines =<< trim END
1763    vim9script
1764    var l: list<string> = [234, 'x']
1765  END
1766  CheckScriptFailure(lines, 'E1012:', 2)
1767
1768  lines =<< trim END
1769      vim9script
1770      def Failing()
1771        job_stop()
1772      enddef
1773      var list = [Failing]
1774  END
1775  if has('channel')
1776    CheckScriptFailure(lines, 'E119:', 1)
1777  else
1778    CheckScriptFailure(lines, 'E117:', 1)
1779  endif
1780enddef
1781
1782def LambdaWithComments(): func
1783  return {x ->
1784            # some comment
1785            x == 1
1786            # some comment
1787            ||
1788            x == 2
1789        }
1790enddef
1791
1792def LambdaUsingArg(x: number): func
1793  return {->
1794            # some comment
1795            x == 1
1796            # some comment
1797            ||
1798            x == 2
1799        }
1800enddef
1801
1802def Test_expr7_lambda()
1803  var lines =<< trim END
1804      var La = { -> 'result'}
1805      assert_equal('result', La())
1806      assert_equal([1, 3, 5], [1, 2, 3]->map({key, val -> key + val}))
1807
1808      # line continuation inside lambda with "cond ? expr : expr" works
1809      var ll = range(3)
1810      map(ll, {k, v -> v % 2 ? {
1811                ['111']: 111 } : {}
1812            })
1813      assert_equal([{}, {111: 111}, {}], ll)
1814
1815      ll = range(3)
1816      map(ll, {k, v -> v == 8 || v
1817                    == 9
1818                    || v % 2 ? 111 : 222
1819            })
1820      assert_equal([222, 111, 222], ll)
1821
1822      ll = range(3)
1823      map(ll, {k, v -> v != 8 && v
1824                    != 9
1825                    && v % 2 == 0 ? 111 : 222
1826            })
1827      assert_equal([111, 222, 111], ll)
1828
1829      var dl = [{key: 0}, {key: 22}]->filter({ _, v -> v['key'] })
1830      assert_equal([{key: 22}], dl)
1831
1832      dl = [{key: 12}, {['foo']: 34}]
1833      assert_equal([{key: 12}], filter(dl,
1834            {_, v -> has_key(v, 'key') ? v['key'] == 12 : 0}))
1835
1836      assert_equal(false, LambdaWithComments()(0))
1837      assert_equal(true, LambdaWithComments()(1))
1838      assert_equal(true, LambdaWithComments()(2))
1839      assert_equal(false, LambdaWithComments()(3))
1840
1841      assert_equal(false, LambdaUsingArg(0)())
1842      assert_equal(true, LambdaUsingArg(1)())
1843
1844      var res = map([1, 2, 3], {i: number, v: number -> i + v})
1845      assert_equal([1, 3, 5], res)
1846  END
1847  CheckDefAndScriptSuccess(lines)
1848
1849  CheckDefFailure(["filter([1, 2], {k,v -> 1})"], 'E1069:', 1)
1850  # error is in first line of the lambda
1851  CheckDefFailure(["var L = {a -> a + b}"], 'E1001:', 0)
1852
1853  assert_equal('xxxyyy', 'xxx'->{a, b -> a .. b}('yyy'))
1854
1855  CheckDefExecFailure(["var s = 'asdf'->{a -> a}('x')"],
1856        'E1106: One argument too many')
1857  CheckDefExecFailure(["var s = 'asdf'->{a -> a}('x', 'y')"],
1858        'E1106: 2 arguments too many')
1859  CheckDefFailure(["echo 'asdf'->{a -> a}(x)"], 'E1001:', 1)
1860
1861  CheckDefSuccess(['var Fx = {a -> {k1: 0,', ' k2: 1}}'])
1862  CheckDefFailure(['var Fx = {a -> {k1: 0', ' k2: 1}}'], 'E722:', 2)
1863  CheckDefFailure(['var Fx = {a -> {k1: 0,', ' k2 1}}'], 'E720:', 2)
1864
1865  CheckDefSuccess(['var Fx = {a -> [0,', ' 1]}'])
1866  CheckDefFailure(['var Fx = {a -> [0', ' 1]}'], 'E696:', 2)
1867enddef
1868
1869def Test_expr7_lambda_vim9script()
1870  var lines =<< trim END
1871      vim9script
1872      var v = 10->{a ->
1873	    a
1874	      + 2
1875	  }()
1876      assert_equal(12, v)
1877  END
1878  CheckScriptSuccess(lines)
1879
1880  # nested lambda with line breaks
1881  lines =<< trim END
1882      vim9script
1883      search('"', 'cW', 0, 0, {->
1884	synstack('.', col('.'))
1885	->map({_, v -> synIDattr(v, 'name')})->len()})
1886  END
1887  CheckScriptSuccess(lines)
1888enddef
1889
1890def Test_epxr7_funcref()
1891  var lines =<< trim END
1892      def RetNumber(): number
1893        return 123
1894      enddef
1895      var FuncRef = RetNumber
1896      assert_equal(123, FuncRef())
1897  END
1898  CheckDefAndScriptSuccess(lines)
1899enddef
1900
1901let g:test_space_dict = {'': 'empty', ' ': 'space'}
1902let g:test_hash_dict = #{one: 1, two: 2}
1903
1904def Test_expr7_dict()
1905  # dictionary
1906  var lines =<< trim END
1907      assert_equal(g:dict_empty, {})
1908      assert_equal(g:dict_empty, {  })
1909      assert_equal(g:dict_one, {['one']: 1})
1910      var key = 'one'
1911      var val = 1
1912      assert_equal(g:dict_one, {[key]: val})
1913
1914      var numbers: dict<number> = {a: 1, b: 2, c: 3}
1915      numbers = {a: 1}
1916      numbers = {}
1917
1918      var strings: dict<string> = {a: 'a', b: 'b', c: 'c'}
1919      strings = {a: 'x'}
1920      strings = {}
1921
1922      var dash = {xx-x: 8}
1923      assert_equal({['xx-x']: 8}, dash)
1924
1925      var dnr = {8: 8}
1926      assert_equal({['8']: 8}, dnr)
1927
1928      var mixed: dict<any> = {a: 'a', b: 42}
1929      mixed = {a: 'x'}
1930      mixed = {a: 234}
1931      mixed = {}
1932
1933      var dictlist: dict<list<string>> = {absent: [], present: ['hi']}
1934      dictlist = {absent: ['hi'], present: []}
1935      dictlist = {absent: [], present: []}
1936
1937      var dictdict: dict<dict<string>> = {one: {a: 'text'}, two: {}}
1938      dictdict = {one: {}, two: {a: 'text'}}
1939      dictdict = {one: {}, two: {}}
1940
1941      assert_equal({['']: 0}, {[matchstr('string', 'wont match')]: 0})
1942
1943      assert_equal(g:test_space_dict, {['']: 'empty', [' ']: 'space'})
1944      assert_equal(g:test_hash_dict, {one: 1, two: 2})
1945
1946      assert_equal({['a a']: 1, ['b/c']: 2}, {'a a': 1, "b/c": 2})
1947  END
1948  CheckDefAndScriptSuccess(lines)
1949
1950  # legacy syntax doesn't work
1951  CheckDefFailure(["var x = #{key: 8}"], 'E1097:', 2)
1952  CheckDefFailure(["var x = 'a' .. #{a: 1}"], 'E1097:', 2)
1953
1954  CheckDefFailure(["var x = {a:8}"], 'E1069:', 1)
1955  CheckDefFailure(["var x = {a : 8}"], 'E1059:', 1)
1956  CheckDefFailure(["var x = {a :8}"], 'E1059:', 1)
1957  CheckDefFailure(["var x = {a: 8 , b: 9}"], 'E1068:', 1)
1958  CheckDefFailure(["var x = {a: 1,b: 2}"], 'E1069:', 1)
1959
1960  CheckDefFailure(["var x = {xxx}"], 'E720:', 1)
1961  CheckDefFailure(["var x = {xxx: 1", "var y = 2"], 'E722:', 2)
1962  CheckDefFailure(["var x = {xxx: 1,"], 'E723:', 2)
1963  CheckDefFailure(["var x = {['a']: xxx}"], 'E1001:', 1)
1964  CheckDefFailure(["var x = {a: 1, a: 2}"], 'E721:', 1)
1965  CheckDefExecFailure(["var x = g:anint.member"], 'E715:', 1)
1966  CheckDefExecFailure(["var x = g:dict_empty.member"], 'E716:', 1)
1967
1968  CheckDefExecFailure(['var x: dict<number> = {a: 234, b: "1"}'], 'E1012:', 1)
1969  CheckDefExecFailure(['var x: dict<number> = {a: "x", b: 134}'], 'E1012:', 1)
1970  CheckDefExecFailure(['var x: dict<string> = {a: 234, b: "1"}'], 'E1012:', 1)
1971  CheckDefExecFailure(['var x: dict<string> = {a: "x", b: 134}'], 'E1012:', 1)
1972
1973  CheckDefFailure(['var x = ({'], 'E723:', 2)
1974  CheckDefExecFailure(['{}[getftype("")]'], 'E716: Key not present in Dictionary: ""', 1)
1975enddef
1976
1977def Test_expr7_dict_vim9script()
1978  var lines =<< trim END
1979      vim9script
1980      var d = {
1981		['one']:
1982		   1,
1983		['two']: 2,
1984		   }
1985      assert_equal({one: 1, two: 2}, d)
1986
1987      d = {  # comment
1988		['one']:
1989                # comment
1990
1991		   1,
1992                # comment
1993                # comment
1994		['two']: 2,
1995		   }
1996      assert_equal({one: 1, two: 2}, d)
1997  END
1998  CheckScriptSuccess(lines)
1999
2000  lines =<< trim END
2001      vim9script
2002      var d = { ["one"]: "one", ["two"]: "two", }
2003      assert_equal({one: 'one', two: 'two'}, d)
2004  END
2005  CheckScriptSuccess(lines)
2006
2007  lines =<< trim END
2008      vim9script
2009      var d = {one: 1,
2010		two: 2,
2011	       }
2012      assert_equal({one: 1, two: 2}, d)
2013  END
2014  CheckScriptSuccess(lines)
2015
2016  lines =<< trim END
2017      vim9script
2018      var d = {one:1, two: 2}
2019  END
2020  CheckScriptFailure(lines, 'E1069:', 2)
2021
2022  lines =<< trim END
2023      vim9script
2024      var d = {one: 1,two: 2}
2025  END
2026  CheckScriptFailure(lines, 'E1069:', 2)
2027
2028  lines =<< trim END
2029      vim9script
2030      var d = {one : 1}
2031  END
2032  CheckScriptFailure(lines, 'E1059:', 2)
2033
2034  lines =<< trim END
2035      vim9script
2036      var d = {one:1}
2037  END
2038  CheckScriptFailure(lines, 'E1069:', 2)
2039
2040  lines =<< trim END
2041      vim9script
2042      var d = {one: 1 , two: 2}
2043  END
2044  CheckScriptFailure(lines, 'E1068:', 2)
2045
2046  lines =<< trim END
2047    vim9script
2048    var l: dict<number> = {a: 234, b: 'x'}
2049  END
2050  CheckScriptFailure(lines, 'E1012:', 2)
2051  lines =<< trim END
2052    vim9script
2053    var l: dict<number> = {a: 'x', b: 234}
2054  END
2055  CheckScriptFailure(lines, 'E1012:', 2)
2056  lines =<< trim END
2057    vim9script
2058    var l: dict<string> = {a: 'x', b: 234}
2059  END
2060  CheckScriptFailure(lines, 'E1012:', 2)
2061  lines =<< trim END
2062    vim9script
2063    var l: dict<string> = {a: 234, b: 'x'}
2064  END
2065  CheckScriptFailure(lines, 'E1012:', 2)
2066
2067  lines =<< trim END
2068    vim9script
2069    var d = {['a']: 234, ['b': 'x'}
2070  END
2071  CheckScriptFailure(lines, 'E1139:', 2)
2072  lines =<< trim END
2073    vim9script
2074    def Func()
2075      var d = {['a']: 234, ['b': 'x'}
2076    enddef
2077    defcompile
2078  END
2079  CheckScriptFailure(lines, 'E1139:', 1)
2080  lines =<< trim END
2081    vim9script
2082    var d = {'a':
2083  END
2084  CheckScriptFailure(lines, 'E15:', 2)
2085  lines =<< trim END
2086    vim9script
2087    def Func()
2088      var d = {'a':
2089    enddef
2090    defcompile
2091  END
2092  CheckScriptFailure(lines, 'E723:', 1)
2093
2094  lines =<< trim END
2095      vim9script
2096      def Failing()
2097        job_stop()
2098      enddef
2099      var dict = {name: Failing}
2100  END
2101  if has('channel')
2102    CheckScriptFailure(lines, 'E119:', 1)
2103  else
2104    CheckScriptFailure(lines, 'E117:', 1)
2105  endif
2106enddef
2107
2108let g:oneString = 'one'
2109
2110def Test_expr_member()
2111  assert_equal(1, g:dict_one.one)
2112  var d: dict<number> = g:dict_one
2113  assert_equal(1, d['one'])
2114  assert_equal(1, d[
2115		  'one'
2116		  ])
2117  assert_equal(1, d
2118  	.one)
2119  d = {1: 1, _: 2}
2120  assert_equal(1, d
2121  	.1)
2122  assert_equal(2, d
2123  	._)
2124
2125  # getting the one member should clear the dict after getting the item
2126  assert_equal('one', {one: 'one'}.one)
2127  assert_equal('one', {one: 'one'}[g:oneString])
2128
2129  CheckDefFailure(["var x = g:dict_one.#$!"], 'E1002:', 1)
2130  CheckDefExecFailure(["var d: dict<any>", "echo d['a']"], 'E716:', 2)
2131  CheckDefExecFailure(["var d: dict<number>", "d = g:list_empty"], 'E1012: Type mismatch; expected dict<number> but got list<unknown>', 2)
2132enddef
2133
2134def Test_expr7_any_index_slice()
2135  var lines =<< trim END
2136    # getting the one member should clear the list only after getting the item
2137    assert_equal('bbb', ['aaa', 'bbb', 'ccc'][1])
2138
2139    # string is permissive, index out of range accepted
2140    g:teststring = 'abcdef'
2141    assert_equal('b', g:teststring[1])
2142    assert_equal('', g:teststring[-1])
2143    assert_equal('', g:teststring[99])
2144
2145    assert_equal('b', g:teststring[1:1])
2146    assert_equal('bcdef', g:teststring[1:])
2147    assert_equal('abcd', g:teststring[:3])
2148    assert_equal('cdef', g:teststring[-4:])
2149    assert_equal('abcdef', g:teststring[-9:])
2150    assert_equal('abcd', g:teststring[:-3])
2151    assert_equal('', g:teststring[:-9])
2152
2153    # blob index cannot be out of range
2154    g:testblob = 0z01ab
2155    assert_equal(0x01, g:testblob[0])
2156    assert_equal(0xab, g:testblob[1])
2157    assert_equal(0xab, g:testblob[-1])
2158    assert_equal(0x01, g:testblob[-2])
2159
2160    # blob slice accepts out of range
2161    assert_equal(0z01ab, g:testblob[0:1])
2162    assert_equal(0z01, g:testblob[0:0])
2163    assert_equal(0z01, g:testblob[-2:-2])
2164    assert_equal(0zab, g:testblob[1:1])
2165    assert_equal(0zab, g:testblob[-1:-1])
2166    assert_equal(0z, g:testblob[2:2])
2167    assert_equal(0z, g:testblob[0:-3])
2168
2169    # list index cannot be out of range
2170    g:testlist = [0, 1, 2, 3]
2171    assert_equal(0, g:testlist[0])
2172    assert_equal(1, g:testlist[1])
2173    assert_equal(3, g:testlist[3])
2174    assert_equal(3, g:testlist[-1])
2175    assert_equal(0, g:testlist[-4])
2176    assert_equal(1, g:testlist[g:theone])
2177
2178    # list slice accepts out of range
2179    assert_equal([0], g:testlist[0:0])
2180    assert_equal([3], g:testlist[3:3])
2181    assert_equal([0, 1], g:testlist[0:1])
2182    assert_equal([0, 1, 2, 3], g:testlist[0:3])
2183    assert_equal([0, 1, 2, 3], g:testlist[0:9])
2184    assert_equal([], g:testlist[-1:1])
2185    assert_equal([1], g:testlist[-3:1])
2186    assert_equal([0, 1], g:testlist[-4:1])
2187    assert_equal([0, 1], g:testlist[-9:1])
2188    assert_equal([1, 2, 3], g:testlist[1:-1])
2189    assert_equal([1], g:testlist[1:-3])
2190    assert_equal([], g:testlist[1:-4])
2191    assert_equal([], g:testlist[1:-9])
2192
2193    g:testdict = {a: 1, b: 2}
2194    assert_equal(1, g:testdict['a'])
2195    assert_equal(2, g:testdict['b'])
2196  END
2197
2198  CheckDefSuccess(lines)
2199  CheckScriptSuccess(['vim9script'] + lines)
2200
2201  CheckDefExecFailure(['echo g:testblob[2]'], 'E979:', 1)
2202  CheckScriptFailure(['vim9script', 'echo g:testblob[2]'], 'E979:', 2)
2203  CheckDefExecFailure(['echo g:testblob[-3]'], 'E979:', 1)
2204  CheckScriptFailure(['vim9script', 'echo g:testblob[-3]'], 'E979:', 2)
2205
2206  CheckDefExecFailure(['echo g:testlist[4]'], 'E684:', 1)
2207  CheckScriptFailure(['vim9script', 'echo g:testlist[4]'], 'E684:', 2)
2208  CheckDefExecFailure(['echo g:testlist[-5]'], 'E684:', 1)
2209  CheckScriptFailure(['vim9script', 'echo g:testlist[-5]'], 'E684:', 2)
2210
2211  CheckDefExecFailure(['echo g:testdict["a":"b"]'], 'E719:', 1)
2212  CheckScriptFailure(['vim9script', 'echo g:testdict["a":"b"]'], 'E719:', 2)
2213  CheckDefExecFailure(['echo g:testdict[1]'], 'E716:', 1)
2214  CheckScriptFailure(['vim9script', 'echo g:testdict[1]'], 'E716:', 2)
2215
2216  unlet g:teststring
2217  unlet g:testblob
2218  unlet g:testlist
2219enddef
2220
2221def Test_expr_member_vim9script()
2222  var lines =<< trim END
2223      vim9script
2224      var d = {one:
2225      		'one',
2226		two: 'two',
2227		1: 1,
2228		_: 2}
2229      assert_equal('one', d.one)
2230      assert_equal('one', d
2231                            .one)
2232      assert_equal(1, d
2233                            .1)
2234      assert_equal(2, d
2235                            ._)
2236      assert_equal('one', d[
2237			    'one'
2238			    ])
2239  END
2240  CheckScriptSuccess(lines)
2241
2242  lines =<< trim END
2243      vim9script
2244      var l = [1,
2245		  2,
2246		  3, 4
2247		  ]
2248      assert_equal(2, l[
2249			    1
2250			    ])
2251      assert_equal([2, 3], l[1 : 2])
2252      assert_equal([1, 2, 3], l[
2253				:
2254				2
2255				])
2256      assert_equal([3, 4], l[
2257				2
2258				:
2259				])
2260  END
2261  CheckScriptSuccess(lines)
2262enddef
2263
2264def Test_expr7_option()
2265  # option
2266  set ts=11
2267  assert_equal(11, &ts)
2268  &ts = 9
2269  assert_equal(9, &ts)
2270  set ts=8
2271  set grepprg=some\ text
2272  assert_equal('some text', &grepprg)
2273  &grepprg = test_null_string()
2274  assert_equal('', &grepprg)
2275  set grepprg&
2276enddef
2277
2278def Test_expr7_environment()
2279  # environment variable
2280  assert_equal('testvar', $TESTVAR)
2281  assert_equal('', $ASDF_ASD_XXX)
2282
2283  CheckDefFailure(["var x = $$$"], 'E1002:', 1)
2284enddef
2285
2286def Test_expr7_register()
2287  @a = 'register a'
2288  assert_equal('register a', @a)
2289
2290  var fname = expand('%')
2291  assert_equal(fname, @%)
2292
2293  feedkeys(":echo 'some'\<CR>", "xt")
2294  assert_equal("echo 'some'", @:)
2295
2296  normal axyz
2297  assert_equal("xyz", @.)
2298  CheckDefFailure(["@. = 'yes'"], 'E354:', 1)
2299
2300  @/ = 'slash'
2301  assert_equal('slash', @/)
2302
2303  @= = 'equal'
2304  assert_equal('equal', @=)
2305enddef
2306
2307def Test_expr7_namespace()
2308  g:some_var = 'some'
2309  assert_equal('some', get(g:, 'some_var'))
2310  assert_equal('some', get(g:, 'some_var', 'xxx'))
2311  assert_equal('xxx', get(g:, 'no_var', 'xxx'))
2312  unlet g:some_var
2313
2314  b:some_var = 'some'
2315  assert_equal('some', get(b:, 'some_var'))
2316  assert_equal('some', get(b:, 'some_var', 'xxx'))
2317  assert_equal('xxx', get(b:, 'no_var', 'xxx'))
2318  unlet b:some_var
2319
2320  w:some_var = 'some'
2321  assert_equal('some', get(w:, 'some_var'))
2322  assert_equal('some', get(w:, 'some_var', 'xxx'))
2323  assert_equal('xxx', get(w:, 'no_var', 'xxx'))
2324  unlet w:some_var
2325
2326  t:some_var = 'some'
2327  assert_equal('some', get(t:, 'some_var'))
2328  assert_equal('some', get(t:, 'some_var', 'xxx'))
2329  assert_equal('xxx', get(t:, 'no_var', 'xxx'))
2330  unlet t:some_var
2331enddef
2332
2333def Test_expr7_parens()
2334  # (expr)
2335  assert_equal(4, (6 * 4) / 6)
2336  assert_equal(0, 6 * ( 4 / 6 ))
2337
2338  assert_equal(6, +6)
2339  assert_equal(-6, -6)
2340  assert_equal(6, --6)
2341  assert_equal(6, -+-6)
2342  assert_equal(-6, ---6)
2343  assert_equal(false, !-3)
2344  assert_equal(true, !+-+0)
2345enddef
2346
2347def Test_expr7_parens_vim9script()
2348  var lines =<< trim END
2349      vim9script
2350      var s = (
2351		'one'
2352		..
2353		'two'
2354		)
2355      assert_equal('onetwo', s)
2356  END
2357  CheckScriptSuccess(lines)
2358enddef
2359
2360def Test_expr7_negate_add()
2361  assert_equal(-99, -99)
2362  assert_equal(-99, - 99)
2363  assert_equal(99, --99)
2364  assert_equal(99, -- 99)
2365  assert_equal(99, - - 99)
2366  assert_equal(99, +99)
2367  assert_equal(-99, -+99)
2368  assert_equal(-99, -+ 99)
2369  assert_equal(-99, - +99)
2370  assert_equal(-99, - + 99)
2371  assert_equal(-99, +-99)
2372  assert_equal(-99, + -99)
2373  assert_equal(-99, + - 99)
2374
2375  var nr = 88
2376  assert_equal(-88, -nr)
2377  assert_equal(-88, - nr)
2378  assert_equal(-88, - +nr)
2379  assert_equal(88, -- nr)
2380  assert_equal(88, + nr)
2381  assert_equal(88, --+ nr)
2382  assert_equal(88, - - nr)
2383enddef
2384
2385def Echo(arg: any): string
2386  return arg
2387enddef
2388
2389def s:Echo4Arg(arg: any): string
2390  return arg
2391enddef
2392
2393def Test_expr7_call()
2394  var lines =<< trim END
2395      assert_equal('yes', 'yes'->Echo())
2396      assert_equal(true, !range(5)->empty())
2397      assert_equal([0, 1, 2], --3->range())
2398  END
2399  CheckDefAndScriptSuccess(lines)
2400
2401  assert_equal('yes', 'yes'
2402                        ->s:Echo4Arg())
2403
2404  CheckDefFailure(["var x = 'yes'->Echo"], 'E107:', 1)
2405  CheckScriptFailure([
2406   "vim9script",
2407   "var x = substitute ('x', 'x', 'x', 'x')"
2408   ], 'E121:', 2)
2409  CheckDefFailure(["var Ref = function('len' [1, 2])"], 'E1123:', 1)
2410
2411  var auto_lines =<< trim END
2412      def g:some#func(): string
2413	return 'found'
2414      enddef
2415  END
2416  mkdir('Xruntime/autoload', 'p')
2417  writefile(auto_lines, 'Xruntime/autoload/some.vim')
2418  var save_rtp = &rtp
2419  &rtp = getcwd() .. '/Xruntime,' .. &rtp
2420  assert_equal('found', g:some#func())
2421  assert_equal('found', some#func())
2422
2423  &rtp = save_rtp
2424  delete('Xruntime', 'rf')
2425enddef
2426
2427
2428def Test_expr7_not()
2429  var lines =<< trim END
2430      assert_equal(true, !'')
2431      assert_equal(true, ![])
2432      assert_equal(false, !'asdf')
2433      assert_equal(false, ![2])
2434      assert_equal(true, !!'asdf')
2435      assert_equal(true, !![2])
2436
2437      assert_equal(true, ! false)
2438      assert_equal(true, !! true)
2439      assert_equal(true, ! ! true)
2440      assert_equal(true, !!! false)
2441      assert_equal(true, ! ! ! false)
2442
2443      g:true = true
2444      g:false = false
2445      assert_equal(true, ! g:false)
2446      assert_equal(true, !! g:true)
2447      assert_equal(true, ! ! g:true)
2448      assert_equal(true, !!! g:false)
2449      assert_equal(true, ! ! ! g:false)
2450      unlet g:true
2451      unlet g:false
2452
2453      assert_equal(true, !test_null_partial())
2454      assert_equal(false, !{-> 'yes'})
2455
2456      assert_equal(true, !test_null_dict())
2457      assert_equal(true, !{})
2458      assert_equal(false, !{yes: 'no'})
2459
2460      if has('channel')
2461	assert_equal(true, !test_null_job())
2462	assert_equal(true, !test_null_channel())
2463      endif
2464
2465      assert_equal(true, !test_null_blob())
2466      assert_equal(true, !0z)
2467      assert_equal(false, !0z01)
2468
2469      assert_equal(true, !test_void())
2470      assert_equal(true, !test_unknown())
2471
2472      assert_equal(false, ![1, 2, 3]->reverse())
2473      assert_equal(true, ![]->reverse())
2474  END
2475  CheckDefAndScriptSuccess(lines)
2476enddef
2477
2478func Test_expr7_fails()
2479  call CheckDefFailure(["var x = (12"], "E110:", 1)
2480
2481  call CheckDefFailure(["var x = -'xx'"], "E1030:", 1)
2482  call CheckDefFailure(["var x = +'xx'"], "E1030:", 1)
2483  call CheckDefFailure(["var x = -0z12"], "E974:", 1)
2484  call CheckDefExecFailure(["var x = -[8]"], "E39:", 1)
2485  call CheckDefExecFailure(["var x = -{a: 1}"], "E39:", 1)
2486
2487  call CheckDefFailure(["var x = @"], "E1002:", 1)
2488  call CheckDefFailure(["var x = @<"], "E354:", 1)
2489
2490  call CheckDefFailure(["var x = [1, 2"], "E697:", 2)
2491  call CheckDefFailure(["var x = [notfound]"], "E1001:", 1)
2492
2493  call CheckDefFailure(["var x = { -> 123) }"], "E451:", 1)
2494  call CheckDefFailure(["var x = 123->{x -> x + 5) }"], "E451:", 1)
2495
2496  call CheckDefFailure(["var x = &notexist"], 'E113:', 1)
2497  call CheckDefFailure(["&grepprg = [343]"], 'E1012:', 1)
2498
2499  call CheckDefExecFailure(["echo s:doesnt_exist"], 'E121:', 1)
2500  call CheckDefExecFailure(["echo g:doesnt_exist"], 'E121:', 1)
2501
2502  call CheckDefFailure(["echo a:somevar"], 'E1075:', 1)
2503  call CheckDefFailure(["echo l:somevar"], 'E1075:', 1)
2504  call CheckDefFailure(["echo x:somevar"], 'E1075:', 1)
2505
2506  call CheckDefExecFailure(["var x = +g:astring"], 'E1030:', 1)
2507  call CheckDefExecFailure(["var x = +g:ablob"], 'E974:', 1)
2508  call CheckDefExecFailure(["var x = +g:alist"], 'E745:', 1)
2509  call CheckDefExecFailure(["var x = +g:adict"], 'E728:', 1)
2510
2511  call CheckDefFailure(["var x = ''", "var y = x.memb"], 'E715:', 2)
2512
2513  call CheckDefFailure(["'yes'->", "Echo()"], 'E488: Trailing characters: ->', 1)
2514
2515  call CheckDefExecFailure(["[1, 2->len()"], 'E697:', 2)
2516  call CheckDefExecFailure(["{a: 1->len()"], 'E451:', 1)
2517  call CheckDefExecFailure(["{['a']: 1->len()"], 'E723:', 2)
2518endfunc
2519
2520let g:Funcrefs = [function('add')]
2521
2522func CallMe(arg)
2523  return a:arg
2524endfunc
2525
2526func CallMe2(one, two)
2527  return a:one .. a:two
2528endfunc
2529
2530def Test_expr7_trailing()
2531  # user function call
2532  assert_equal(123, g:CallMe(123))
2533  assert_equal(123, g:CallMe(  123))
2534  assert_equal(123, g:CallMe(123  ))
2535  assert_equal('yesno', g:CallMe2('yes', 'no'))
2536  assert_equal('yesno', g:CallMe2( 'yes', 'no' ))
2537  assert_equal('nothing', g:CallMe('nothing'))
2538
2539  # partial call
2540  var Part = function('g:CallMe')
2541  assert_equal('yes', Part('yes'))
2542
2543  # funcref call, using list index
2544  var l = []
2545  g:Funcrefs[0](l, 2)
2546  assert_equal([2], l)
2547
2548  # method call
2549  l = [2, 5, 6]
2550  l->map({k, v -> k + v})
2551  assert_equal([2, 6, 8], l)
2552
2553  # lambda method call
2554  l = [2, 5]
2555  l->{l -> add(l, 8)}()
2556  assert_equal([2, 5, 8], l)
2557
2558  # dict member
2559  var d = {key: 123}
2560  assert_equal(123, d.key)
2561enddef
2562
2563def Test_expr7_string_subscript()
2564  var lines =<< trim END
2565    var text = 'abcdef'
2566    assert_equal('', text[-1])
2567    assert_equal('a', text[0])
2568    assert_equal('e', text[4])
2569    assert_equal('f', text[5])
2570    assert_equal('', text[6])
2571
2572    text = 'ábçdëf'
2573    assert_equal('', text[-999])
2574    assert_equal('', text[-1])
2575    assert_equal('á', text[0])
2576    assert_equal('b', text[1])
2577    assert_equal('ç', text[2])
2578    assert_equal('d', text[3])
2579    assert_equal('ë', text[4])
2580    assert_equal('f', text[5])
2581    assert_equal('', text[6])
2582    assert_equal('', text[999])
2583
2584    assert_equal('ábçdëf', text[0:-1])
2585    assert_equal('ábçdëf', text[0 :-1])
2586    assert_equal('ábçdëf', text[0: -1])
2587    assert_equal('ábçdëf', text[0 : -1])
2588    assert_equal('ábçdëf', text[0
2589                  :-1])
2590    assert_equal('ábçdëf', text[0:
2591                  -1])
2592    assert_equal('ábçdëf', text[0 : -1
2593                  ])
2594    assert_equal('bçdëf', text[1:-1])
2595    assert_equal('çdëf', text[2:-1])
2596    assert_equal('dëf', text[3:-1])
2597    assert_equal('ëf', text[4:-1])
2598    assert_equal('f', text[5:-1])
2599    assert_equal('', text[6:-1])
2600    assert_equal('', text[999:-1])
2601
2602    assert_equal('ábçd', text[:3])
2603    assert_equal('bçdëf', text[1:])
2604    assert_equal('ábçdëf', text[:])
2605  END
2606  CheckDefSuccess(lines)
2607  CheckScriptSuccess(['vim9script'] + lines)
2608
2609  lines =<< trim END
2610      var d = 'asdf'[1:
2611  END
2612  CheckDefFailure(lines, 'E1097:', 2)
2613  lines =<< trim END
2614      var d = 'asdf'[1:xxx]
2615  END
2616  CheckDefFailure(lines, 'E1001:', 1)
2617  lines =<< trim END
2618      var d = 'asdf'[1:2
2619  END
2620  CheckDefFailure(lines, 'E1097:', 2)
2621  lines =<< trim END
2622      var d = 'asdf'[1:2
2623      echo d
2624  END
2625  CheckDefFailure(lines, 'E111:', 2)
2626  lines =<< trim END
2627      var d = 'asdf'['1']
2628      echo d
2629  END
2630  CheckDefFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2631  lines =<< trim END
2632      var d = 'asdf'['1':2]
2633      echo d
2634  END
2635  CheckDefFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2636  lines =<< trim END
2637      var d = 'asdf'[1:'2']
2638      echo d
2639  END
2640  CheckDefFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2641enddef
2642
2643def Test_expr7_list_subscript()
2644  var lines =<< trim END
2645    var list = [0, 1, 2, 3, 4]
2646    assert_equal(0, list[0])
2647    assert_equal(4, list[4])
2648    assert_equal(4, list[-1])
2649    assert_equal(0, list[-5])
2650
2651    assert_equal([0, 1, 2, 3, 4], list[0:4])
2652    assert_equal([0, 1, 2, 3, 4], list[:])
2653    assert_equal([1, 2, 3, 4], list[1:])
2654    assert_equal([2, 3, 4], list[2:-1])
2655    assert_equal([4], list[4:-1])
2656    assert_equal([], list[5:-1])
2657    assert_equal([], list[999:-1])
2658    assert_equal([1, 2, 3, 4], list[g:theone:g:thefour])
2659
2660    assert_equal([0, 1, 2, 3], list[0:3])
2661    assert_equal([0], list[0:0])
2662    assert_equal([0, 1, 2, 3, 4], list[0:-1])
2663    assert_equal([0, 1, 2], list[0:-3])
2664    assert_equal([0], list[0:-5])
2665    assert_equal([], list[0:-6])
2666    assert_equal([], list[0:-99])
2667  END
2668  CheckDefSuccess(lines)
2669  CheckScriptSuccess(['vim9script'] + lines)
2670
2671  lines = ['var l = [0, 1, 2]', 'echo l[g:astring : g:theone]']
2672  CheckDefExecFailure(lines, 'E1012:')
2673  CheckScriptFailure(['vim9script'] + lines, 'E1030:', 3)
2674enddef
2675
2676def Test_expr7_dict_subscript()
2677  var lines =<< trim END
2678      vim9script
2679      var l = [{lnum: 2}, {lnum: 1}]
2680      var res = l[0].lnum > l[1].lnum
2681      assert_true(res)
2682  END
2683  CheckScriptSuccess(lines)
2684enddef
2685
2686def Test_expr7_subscript_linebreak()
2687  var range = range(
2688  		3)
2689  var l = range
2690	->map('string(v:key)')
2691  assert_equal(['0', '1', '2'], l)
2692
2693  l = range
2694  	->map('string(v:key)')
2695  assert_equal(['0', '1', '2'], l)
2696
2697  l = range # comment
2698  	->map('string(v:key)')
2699  assert_equal(['0', '1', '2'], l)
2700
2701  l = range
2702
2703  	->map('string(v:key)')
2704  assert_equal(['0', '1', '2'], l)
2705
2706  l = range
2707	# comment
2708  	->map('string(v:key)')
2709  assert_equal(['0', '1', '2'], l)
2710
2711  assert_equal('1', l[
2712	1])
2713
2714  var d = {one: 33}
2715  assert_equal(33, d.
2716	one)
2717enddef
2718
2719def Test_expr7_method_call()
2720  new
2721  setline(1, ['first', 'last'])
2722  'second'->append(1)
2723  "third"->append(2)
2724  assert_equal(['first', 'second', 'third', 'last'], getline(1, '$'))
2725  bwipe!
2726
2727  var bufnr = bufnr()
2728  var loclist = [{bufnr: bufnr, lnum: 42, col: 17, text: 'wrong'}]
2729  loclist->setloclist(0)
2730  assert_equal([{bufnr: bufnr,
2731  		lnum: 42,
2732		col: 17,
2733		text: 'wrong',
2734		pattern: '',
2735		valid: 1,
2736		vcol: 0,
2737		nr: 0,
2738		type: '',
2739		module: ''}
2740		], getloclist(0))
2741
2742  var result: bool = get({n: 0}, 'n', 0)
2743  assert_equal(false, result)
2744enddef
2745
2746func Test_expr7_trailing_fails()
2747  call CheckDefFailure(['var l = [2]', 'l->{l -> add(l, 8)}'], 'E107:', 2)
2748  call CheckDefFailure(['var l = [2]', 'l->{l -> add(l, 8)} ()'], 'E274:', 2)
2749endfunc
2750
2751func Test_expr_fails()
2752  call CheckDefFailure(["var x = '1'is2"], 'E488:', 1)
2753  call CheckDefFailure(["var x = '1'isnot2"], 'E488:', 1)
2754
2755  call CheckDefFailure(["CallMe ('yes')"], 'E476:', 1)
2756  call CheckScriptFailure(["CallMe ('yes')"], 'E492:', 1)
2757  call CheckDefAndScriptFailure(["CallMe2('yes','no')"], 'E1069:', 1)
2758  call CheckDefFailure(["CallMe2('yes' , 'no')"], 'E1068:', 1)
2759
2760  call CheckDefFailure(["v:nosuch += 3"], 'E1001:', 1)
2761  call CheckDefFailure(["var v:statusmsg = ''"], 'E1016: Cannot declare a v: variable:', 1)
2762  call CheckDefFailure(["var asdf = v:nosuch"], 'E1001:', 1)
2763
2764  call CheckDefFailure(["echo len('asdf'"], 'E110:', 2)
2765  call CheckDefFailure(["echo Func0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789()"], 'E1011:', 1)
2766  call CheckDefFailure(["echo doesnotexist()"], 'E117:', 1)
2767endfunc
2768
2769" vim: shiftwidth=2 sts=2 expandtab
2770