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