18a7d6542SBram Moolenaar" Tests for Vim9 script expressions
28a7d6542SBram Moolenaar
38a7d6542SBram Moolenaarsource check.vim
4cfe435d7SBram Moolenaarsource vim9.vim
58a7d6542SBram Moolenaar
6c7db5778SBram Moolenaarlet g:cond = v:false
7c7db5778SBram Moolenaardef FuncOne(arg: number): string
8c7db5778SBram Moolenaar  return 'yes'
9c7db5778SBram Moolenaarenddef
10c7db5778SBram Moolenaardef FuncTwo(arg: number): number
11c7db5778SBram Moolenaar  return 123
12c7db5778SBram Moolenaarenddef
13c7db5778SBram Moolenaar
148a7d6542SBram Moolenaar" test cond ? expr : expr
1592f26c25SBram Moolenaardef Test_expr1_trinary()
16659bb227SBram Moolenaar  var lines =<< trim END
178a7d6542SBram Moolenaar      assert_equal('one', true ? 'one' : 'two')
189c7e6dd6SBram Moolenaar      assert_equal('one', 1 ?
199c7e6dd6SBram Moolenaar                            'one' :
209c7e6dd6SBram Moolenaar                            'two')
215feabe00SBram Moolenaar      if has('float')
2213106605SBram Moolenaar        assert_equal('one', !!0.1 ? 'one' : 'two')
235feabe00SBram Moolenaar      endif
2413106605SBram Moolenaar      assert_equal('one', !!'x' ? 'one' : 'two')
2513106605SBram Moolenaar      assert_equal('one', !!'x'
2667fbdfefSBram Moolenaar                            ? 'one'
2767fbdfefSBram Moolenaar                            : 'two')
2813106605SBram Moolenaar      assert_equal('one', !!0z1234 ? 'one' : 'two')
2913106605SBram Moolenaar      assert_equal('one', !![0] ? 'one' : 'two')
30e0de171eSBram Moolenaar      assert_equal('one', !!{x: 0} ? 'one' : 'two')
3137ce6d3aSBram Moolenaar      var name = 1
3237ce6d3aSBram Moolenaar      assert_equal('one', name ? 'one' : 'two')
338a7d6542SBram Moolenaar
348a7d6542SBram Moolenaar      assert_equal('two', false ? 'one' : 'two')
358a7d6542SBram Moolenaar      assert_equal('two', 0 ? 'one' : 'two')
367f829cabSBram Moolenaar      if has('float')
3713106605SBram Moolenaar        assert_equal('two', !!0.0 ? 'one' : 'two')
387f829cabSBram Moolenaar      endif
3913106605SBram Moolenaar      assert_equal('two', !!'' ? 'one' : 'two')
4013106605SBram Moolenaar      assert_equal('two', !!0z ? 'one' : 'two')
4113106605SBram Moolenaar      assert_equal('two', !![] ? 'one' : 'two')
4213106605SBram Moolenaar      assert_equal('two', !!{} ? 'one' : 'two')
4337ce6d3aSBram Moolenaar      name = 0
4437ce6d3aSBram Moolenaar      assert_equal('two', name ? 'one' : 'two')
45939b5db4SBram Moolenaar
465afd081cSBram Moolenaar      echo ['a'] + (1 ? ['b'] : ['c']
475afd081cSBram Moolenaar                )
485afd081cSBram Moolenaar      echo ['a'] + (1 ? ['b'] : ['c'] # comment
495afd081cSBram Moolenaar                )
505afd081cSBram Moolenaar
51749639ecSBram Moolenaar      # with constant condition expression is not evaluated
52749639ecSBram Moolenaar      assert_equal('one', 1 ? 'one' : xxx)
53749639ecSBram Moolenaar
5437ce6d3aSBram Moolenaar      var Some: func = function('len')
5537ce6d3aSBram Moolenaar      var Other: func = function('winnr')
5637ce6d3aSBram Moolenaar      var Res: func = g:atrue ? Some : Other
57939b5db4SBram Moolenaar      assert_equal(function('len'), Res)
58939b5db4SBram Moolenaar
5937ce6d3aSBram Moolenaar      var RetOne: func(string): number = function('len')
607a40ff00SBram Moolenaar      var RetTwo: func(string): number = function('charcol')
6137ce6d3aSBram Moolenaar      var RetThat: func = g:atrue ? RetOne : RetTwo
62939b5db4SBram Moolenaar      assert_equal(function('len'), RetThat)
63c7db5778SBram Moolenaar
6437ce6d3aSBram Moolenaar      var X = FuncOne
6537ce6d3aSBram Moolenaar      var Y = FuncTwo
6637ce6d3aSBram Moolenaar      var Z = g:cond ? FuncOne : FuncTwo
67c7db5778SBram Moolenaar      assert_equal(123, Z(3))
68659bb227SBram Moolenaar  END
69659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
708a7d6542SBram Moolenaarenddef
718a7d6542SBram Moolenaar
7292f26c25SBram Moolenaardef Test_expr1_trinary_vimscript()
73fdac71c5SBram Moolenaar  # check line continuation
7437ce6d3aSBram Moolenaar  var lines =<< trim END
759830938eSBram Moolenaar      var name = 1
76793648fbSBram Moolenaar      		? 'yes'
77793648fbSBram Moolenaar		: 'no'
789830938eSBram Moolenaar      assert_equal('yes', name)
79793648fbSBram Moolenaar  END
8090193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
81793648fbSBram Moolenaar
82793648fbSBram Moolenaar  lines =<< trim END
839830938eSBram Moolenaar      var name = v:false
84793648fbSBram Moolenaar      		? 'yes'
85793648fbSBram Moolenaar		: 'no'
869830938eSBram Moolenaar      assert_equal('no', name)
87793648fbSBram Moolenaar  END
8890193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
899215f012SBram Moolenaar
909215f012SBram Moolenaar  lines =<< trim END
919830938eSBram Moolenaar      var name = v:false ?
929215f012SBram Moolenaar      		'yes' :
939215f012SBram Moolenaar		'no'
949830938eSBram Moolenaar      assert_equal('no', name)
959215f012SBram Moolenaar  END
9690193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
97fdac71c5SBram Moolenaar
9893be1644SBram Moolenaar  lines =<< trim END
9993be1644SBram Moolenaar      var name = v:false ?  # comment
10093be1644SBram Moolenaar      		'yes' :
10193be1644SBram Moolenaar                # comment
10293be1644SBram Moolenaar		'no' # comment
10393be1644SBram Moolenaar      assert_equal('no', name)
10493be1644SBram Moolenaar  END
10590193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
10693be1644SBram Moolenaar
107fdac71c5SBram Moolenaar  # check white space
108fdac71c5SBram Moolenaar  lines =<< trim END
1099830938eSBram Moolenaar      var name = v:true?1:2
110fdac71c5SBram Moolenaar  END
11190193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''?'' at "?1:2"', 1)
11269e44552SBram Moolenaar
11313106605SBram Moolenaar  lines =<< trim END
11490193e61SBram Moolenaar      var name = v:true? 1 : 2
11590193e61SBram Moolenaar  END
11690193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
11790193e61SBram Moolenaar
11890193e61SBram Moolenaar  lines =<< trim END
11990193e61SBram Moolenaar      var name = v:true ?1 : 2
12090193e61SBram Moolenaar  END
12190193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
12290193e61SBram Moolenaar
12390193e61SBram Moolenaar  lines =<< trim END
12490193e61SBram Moolenaar      var name = v:true ? 1: 2
12590193e61SBram Moolenaar  END
12690193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004: White space required before and after '':'' at ": 2"', 1)
12790193e61SBram Moolenaar
12890193e61SBram Moolenaar  lines =<< trim END
12990193e61SBram Moolenaar      var name = v:true ? 1 :2
13090193e61SBram Moolenaar  END
13190193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
13290193e61SBram Moolenaar
13390193e61SBram Moolenaar  lines =<< trim END
13413106605SBram Moolenaar      var name = 'x' ? 1 : 2
13513106605SBram Moolenaar  END
13690193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1135:', 1)
13713106605SBram Moolenaar
13813106605SBram Moolenaar  lines =<< trim END
13913106605SBram Moolenaar      var name = [] ? 1 : 2
14013106605SBram Moolenaar  END
14190193e61SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E745:', 1)
14213106605SBram Moolenaar
14313106605SBram Moolenaar  lines =<< trim END
14413106605SBram Moolenaar      var name = {} ? 1 : 2
14513106605SBram Moolenaar  END
14690193e61SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E728:', 1)
14713106605SBram Moolenaar
14869e44552SBram Moolenaar  # check after failure eval_flags is reset
14969e44552SBram Moolenaar  lines =<< trim END
15069e44552SBram Moolenaar      try
151d2c61705SBram Moolenaar        eval('0 ? 1: 2')
15269e44552SBram Moolenaar      catch
15369e44552SBram Moolenaar      endtry
15469e44552SBram Moolenaar      assert_equal(v:true, eval(string(v:true)))
15569e44552SBram Moolenaar  END
15690193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
15769e44552SBram Moolenaar
15869e44552SBram Moolenaar  lines =<< trim END
15969e44552SBram Moolenaar      try
160d2c61705SBram Moolenaar        eval('0 ? 1 :2')
16169e44552SBram Moolenaar      catch
16269e44552SBram Moolenaar      endtry
16369e44552SBram Moolenaar      assert_equal(v:true, eval(string(v:true)))
16469e44552SBram Moolenaar  END
16590193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
166793648fbSBram Moolenaarenddef
167793648fbSBram Moolenaar
16892f26c25SBram Moolenaarfunc Test_expr1_trinary_fails()
16990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 ? 'one'"], "Missing ':' after '?'", 1)
1708a7d6542SBram Moolenaar
1717707228aSBram Moolenaar  let msg = "White space required before and after '?'"
17290193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1? 'one' : 'two'"], msg, 1)
17390193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 ?'one' : 'two'"], msg, 1)
17490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1?'one' : 'two'"], msg, 1)
1754ac198c6Smityu  let lines =<< trim END
1764ac198c6Smityu    var x = 1
1774ac198c6Smityu     ?'one' : 'two'
1784ac198c6Smityu     # comment
1794ac198c6Smityu  END
1804ac198c6Smityu  call CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''?'' at "?''one'' : ''two''"', 2)
1818a7d6542SBram Moolenaar
1827707228aSBram Moolenaar  let msg = "White space required before and after ':'"
18390193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 ? 'one': 'two'"], msg, 1)
18490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 ? 'one' :'two'"], msg, 1)
18590193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 ? 'one':'two'"], msg, 1)
1864ac198c6Smityu  let lines =<< trim END
1874ac198c6Smityu    var x = 1 ? 'one'
1884ac198c6Smityu          :'two'
1894ac198c6Smityu          # Comment
1904ac198c6Smityu  END
1914ac198c6Smityu  call CheckDefAndScriptFailure(lines, 'E1004: White space required before and after '':'' at ":''two''"', 2)
192c7db5778SBram Moolenaar
19390193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 'x' ? 'one' : 'two'"], 'E1135:', 1)
19490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 0z1234 ? 'one' : 'two'"], 'E974:', 1)
19590193e61SBram Moolenaar  call CheckDefExecAndScriptFailure(["var x = [] ? 'one' : 'two'"], 'E745:', 1)
19690193e61SBram Moolenaar  call CheckDefExecAndScriptFailure(["var x = {} ? 'one' : 'two'"], 'E728:', 1)
19713106605SBram Moolenaar
1988ff16e01SBram Moolenaar  call CheckDefExecFailure(["var x = false ? "], 'E1097:', 3)
19990193e61SBram Moolenaar  call CheckScriptFailure(['vim9script', "var x = false ? "], 'E15:', 2)
2008ff16e01SBram Moolenaar  call CheckDefExecFailure(["var x = false ? 'one' : "], 'E1097:', 3)
20190193e61SBram Moolenaar  call CheckScriptFailure(['vim9script', "var x = false ? 'one' : "], 'E15:', 2)
202918a4249SBram Moolenaar
20390193e61SBram Moolenaar  call CheckDefExecAndScriptFailure2(["var x = true ? xxx : 'foo'"], 'E1001:', 'E121:', 1)
20490193e61SBram Moolenaar  call CheckDefExecAndScriptFailure2(["var x = false ? 'foo' : xxx"], 'E1001:', 'E121:', 1)
205918a4249SBram Moolenaar
20613106605SBram Moolenaar  if has('float')
20790193e61SBram Moolenaar    call CheckDefAndScriptFailure(["var x = 0.1 ? 'one' : 'two'"], 'E805:', 1)
20813106605SBram Moolenaar  endif
20913106605SBram Moolenaar
210c7db5778SBram Moolenaar  " missing argument detected even when common type is used
21190193e61SBram Moolenaar  call CheckDefAndScriptFailure([
21237ce6d3aSBram Moolenaar	\ 'var X = FuncOne',
21337ce6d3aSBram Moolenaar	\ 'var Y = FuncTwo',
21437ce6d3aSBram Moolenaar	\ 'var Z = g:cond ? FuncOne : FuncTwo',
2153affe7a6SBram Moolenaar	\ 'Z()'], 'E119:', 4)
2168a7d6542SBram Moolenaarendfunc
2178a7d6542SBram Moolenaar
21892f26c25SBram Moolenaardef Test_expr1_falsy()
21992f26c25SBram Moolenaar  var lines =<< trim END
22092f26c25SBram Moolenaar      assert_equal(v:true, v:true ?? 456)
22192f26c25SBram Moolenaar      assert_equal(123, 123 ?? 456)
22292f26c25SBram Moolenaar      assert_equal('yes', 'yes' ?? 456)
22392f26c25SBram Moolenaar      assert_equal([1], [1] ?? 456)
224e0de171eSBram Moolenaar      assert_equal({one: 1}, {one: 1} ?? 456)
22592f26c25SBram Moolenaar      if has('float')
22692f26c25SBram Moolenaar        assert_equal(0.1, 0.1 ?? 456)
22792f26c25SBram Moolenaar      endif
22892f26c25SBram Moolenaar
22992f26c25SBram Moolenaar      assert_equal(456, v:false ?? 456)
23092f26c25SBram Moolenaar      assert_equal(456, 0 ?? 456)
23192f26c25SBram Moolenaar      assert_equal(456, '' ?? 456)
23292f26c25SBram Moolenaar      assert_equal(456, [] ?? 456)
23392f26c25SBram Moolenaar      assert_equal(456, {} ?? 456)
23492f26c25SBram Moolenaar      if has('float')
23592f26c25SBram Moolenaar        assert_equal(456, 0.0 ?? 456)
23692f26c25SBram Moolenaar      endif
23792f26c25SBram Moolenaar  END
23892f26c25SBram Moolenaar  CheckDefAndScriptSuccess(lines)
23992f26c25SBram Moolenaar
24092f26c25SBram Moolenaar  var msg = "White space required before and after '??'"
24190193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1?? 'one' : 'two'"], msg, 1)
24290193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 ??'one' : 'two'"], msg, 1)
24390193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1??'one' : 'two'"], msg, 1)
2444ac198c6Smityu  lines =<< trim END
2454ac198c6Smityu    var x = 1
2464ac198c6Smityu      ??'one' : 'two'
2474ac198c6Smityu      #comment
2484ac198c6Smityu  END
2494ac198c6Smityu  CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''??'' at "??''one'' : ''two''"', 2)
25092f26c25SBram Moolenaarenddef
25192f26c25SBram Moolenaar
2528a7d6542SBram Moolenaardef Record(val: any): any
2538a7d6542SBram Moolenaar  g:vals->add(val)
2548a7d6542SBram Moolenaar  return val
2558a7d6542SBram Moolenaarenddef
2568a7d6542SBram Moolenaar
2578a7d6542SBram Moolenaar" test ||
2588a7d6542SBram Moolenaardef Test_expr2()
259659bb227SBram Moolenaar  var lines =<< trim END
2602bb2658bSBram Moolenaar      assert_equal(true, 1 || 0)
2612bb2658bSBram Moolenaar      assert_equal(true, 0 ||
2629c7e6dd6SBram Moolenaar                        0 ||
2632bb2658bSBram Moolenaar                        1)
264659bb227SBram Moolenaar      assert_equal(true, 0 ||
265659bb227SBram Moolenaar			0 ||
266659bb227SBram Moolenaar			!!7)
2672bb2658bSBram Moolenaar      assert_equal(false, 0 || 0)
2682bb2658bSBram Moolenaar      assert_equal(false, 0
26967fbdfefSBram Moolenaar                        || 0)
2702bb2658bSBram Moolenaar      assert_equal(false, 0 || false)
2718a7d6542SBram Moolenaar
2728a7d6542SBram Moolenaar      g:vals = []
2732bb2658bSBram Moolenaar      assert_equal(true, Record(1) || Record(3))
2742bb2658bSBram Moolenaar      assert_equal([1], g:vals)
2758a7d6542SBram Moolenaar
2768a7d6542SBram Moolenaar      g:vals = []
2772bb2658bSBram Moolenaar      assert_equal(true, Record(0) || Record(1))
2782bb2658bSBram Moolenaar      assert_equal([0, 1], g:vals)
2798a7d6542SBram Moolenaar
2808a7d6542SBram Moolenaar      g:vals = []
281659bb227SBram Moolenaar      assert_equal(true, Record(0) || Record(true))
282659bb227SBram Moolenaar      assert_equal([0, true], g:vals)
283659bb227SBram Moolenaar
284659bb227SBram Moolenaar      g:vals = []
2852bb2658bSBram Moolenaar      assert_equal(true, Record(0)
2862bb2658bSBram Moolenaar                          || Record(1)
28767fbdfefSBram Moolenaar                          || Record(0))
2882bb2658bSBram Moolenaar      assert_equal([0, 1], g:vals)
2898a7d6542SBram Moolenaar
2908a7d6542SBram Moolenaar      g:vals = []
291659bb227SBram Moolenaar      assert_equal(true, Record(0)
292659bb227SBram Moolenaar			  || Record(true)
293659bb227SBram Moolenaar			  || Record(0))
294659bb227SBram Moolenaar      assert_equal([0, true], g:vals)
295659bb227SBram Moolenaar
296659bb227SBram Moolenaar      g:vals = []
297659bb227SBram Moolenaar      assert_equal(true, Record(true) || Record(false))
298659bb227SBram Moolenaar      assert_equal([true], g:vals)
299659bb227SBram Moolenaar
300659bb227SBram Moolenaar      g:vals = []
3012bb2658bSBram Moolenaar      assert_equal(false, Record(0) || Record(false) || Record(0))
3022bb2658bSBram Moolenaar      assert_equal([0, false, 0], g:vals)
303af8ea0d0SBram Moolenaar
304af8ea0d0SBram Moolenaar      g:vals = []
305af8ea0d0SBram Moolenaar      var x = 1
306af8ea0d0SBram Moolenaar      if x || true
307af8ea0d0SBram Moolenaar        g:vals = [1]
308af8ea0d0SBram Moolenaar      endif
309af8ea0d0SBram Moolenaar      assert_equal([1], g:vals)
310af8ea0d0SBram Moolenaar
311af8ea0d0SBram Moolenaar      g:vals = []
312af8ea0d0SBram Moolenaar      x = 3
313af8ea0d0SBram Moolenaar      if true || x
314af8ea0d0SBram Moolenaar        g:vals = [1]
315af8ea0d0SBram Moolenaar      endif
316af8ea0d0SBram Moolenaar      assert_equal([1], g:vals)
317659bb227SBram Moolenaar  END
318659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3198a7d6542SBram Moolenaarenddef
3208a7d6542SBram Moolenaar
321be7ee488SBram Moolenaardef Test_expr2_vimscript()
322f5be8cdbSBram Moolenaar  # check line continuation
32337ce6d3aSBram Moolenaar  var lines =<< trim END
3249830938eSBram Moolenaar      var name = 0
325be7ee488SBram Moolenaar      		|| 1
3262bb2658bSBram Moolenaar      assert_equal(true, name)
327be7ee488SBram Moolenaar  END
32890193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
329be7ee488SBram Moolenaar
330be7ee488SBram Moolenaar  lines =<< trim END
3319830938eSBram Moolenaar      var name = v:false
332be7ee488SBram Moolenaar      		|| v:true
333be7ee488SBram Moolenaar      		|| v:false
3349830938eSBram Moolenaar      assert_equal(v:true, name)
335be7ee488SBram Moolenaar  END
33690193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3379215f012SBram Moolenaar
3389215f012SBram Moolenaar  lines =<< trim END
3399830938eSBram Moolenaar      var name = v:false ||
3409215f012SBram Moolenaar      		v:true ||
3419215f012SBram Moolenaar		v:false
3429830938eSBram Moolenaar      assert_equal(v:true, name)
3438c34ea54SBram Moolenaar  END
34490193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3458c34ea54SBram Moolenaar
34693be1644SBram Moolenaar  lines =<< trim END
34793be1644SBram Moolenaar      var name = v:false || # comment
34893be1644SBram Moolenaar                # comment
34993be1644SBram Moolenaar      		v:true ||
35093be1644SBram Moolenaar                # comment
35193be1644SBram Moolenaar		v:false # comment
35293be1644SBram Moolenaar      assert_equal(v:true, name)
35393be1644SBram Moolenaar  END
35490193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
35593be1644SBram Moolenaar
3563c1c9fd9SBram Moolenaar  # check white space
3573c1c9fd9SBram Moolenaar  lines =<< trim END
3589830938eSBram Moolenaar      var name = v:true||v:true
3593c1c9fd9SBram Moolenaar  END
36090193e61SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1004: White space required before and after ''||'' at "||v:true"', 1)
36190193e61SBram Moolenaar
3623c1c9fd9SBram Moolenaar  lines =<< trim END
3639830938eSBram Moolenaar      var name = v:true ||v:true
3643c1c9fd9SBram Moolenaar  END
36590193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
36690193e61SBram Moolenaar
3673c1c9fd9SBram Moolenaar  lines =<< trim END
3689830938eSBram Moolenaar      var name = v:true|| v:true
3693c1c9fd9SBram Moolenaar  END
37090193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
371be7ee488SBram Moolenaarenddef
372be7ee488SBram Moolenaar
3732bb2658bSBram Moolenaardef Test_expr2_fails()
3742bb2658bSBram Moolenaar  var msg = "White space required before and after '||'"
37590193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1||2"], msg, 1)
37690193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 ||2"], msg, 1)
37790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1|| 2"], msg, 1)
378a8c17704SBram Moolenaar
3798ff16e01SBram Moolenaar  call CheckDefFailure(["var x = false || "], 'E1097:', 3)
38090193e61SBram Moolenaar  call CheckScriptFailure(['vim9script', "var x = false || "], 'E15:', 2)
381918a4249SBram Moolenaar
38290193e61SBram Moolenaar  # script does not fail, the second expression is skipped
38337ce6d3aSBram Moolenaar  call CheckDefFailure(["var x = 1 || xxx"], 'E1001:', 1)
38490193e61SBram Moolenaar
38590193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = [] || false"], 'E1012:', 'E745:', 1)
38690193e61SBram Moolenaar
38790193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["if 'yes' || 0", 'echo 0', 'endif'], 'E1012: Type mismatch; expected bool but got string', 'E1135: Using a String as a Bool', 1)
3882bb2658bSBram Moolenaar
3892bb2658bSBram Moolenaar  # TODO: should fail at compile time
39090193e61SBram Moolenaar  call CheckDefExecAndScriptFailure(["var x = 3 || 7"], 'E1023:', 1)
39190193e61SBram Moolenaar
392af8ea0d0SBram Moolenaar  call CheckDefAndScriptFailure(["if 3"], 'E1023:', 1)
393af8ea0d0SBram Moolenaar  call CheckDefExecAndScriptFailure(['var x = 3', 'if x', 'endif'], 'E1023:', 2)
394af8ea0d0SBram Moolenaar
39590193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = [] || false"], 'E1012: Type mismatch; expected bool but got list<unknown>', 'E745:', 1)
39690193e61SBram Moolenaar
3974ac198c6Smityu  var lines =<< trim END
3984ac198c6Smityu    vim9script
3994ac198c6Smityu    echo false
4004ac198c6Smityu      ||true
4014ac198c6Smityu    # comment
4024ac198c6Smityu  END
4034ac198c6Smityu  CheckScriptFailure(lines, 'E1004: White space required before and after ''||'' at "||true"', 3)
4049e60e899SBram Moolenaar
4059e60e899SBram Moolenaar  lines =<< trim END
4069e60e899SBram Moolenaar      var x = false
4079e60e899SBram Moolenaar              || false
4089e60e899SBram Moolenaar              || a.b
4099e60e899SBram Moolenaar  END
4109e60e899SBram Moolenaar  CheckDefFailure(lines, 'E1001:', 3)
4112bb2658bSBram Moolenaarenddef
4128a7d6542SBram Moolenaar
4138a7d6542SBram Moolenaar" test &&
4148a7d6542SBram Moolenaardef Test_expr3()
415659bb227SBram Moolenaar  var lines =<< trim END
4162bb2658bSBram Moolenaar      assert_equal(false, 1 && 0)
4172bb2658bSBram Moolenaar      assert_equal(false, 0 &&
4189c7e6dd6SBram Moolenaar                    0 &&
4192bb2658bSBram Moolenaar                    1)
4202bb2658bSBram Moolenaar      assert_equal(true, 1
4212bb2658bSBram Moolenaar                        && true
4222bb2658bSBram Moolenaar                        && 1)
4232bb2658bSBram Moolenaar      assert_equal(false, 0 && 0)
4242bb2658bSBram Moolenaar      assert_equal(false, 0 && false)
4252bb2658bSBram Moolenaar      assert_equal(true, 1 && true)
4268a7d6542SBram Moolenaar
4278a7d6542SBram Moolenaar      g:vals = []
4282bb2658bSBram Moolenaar      assert_equal(true, Record(true) && Record(1))
4292bb2658bSBram Moolenaar      assert_equal([true, 1], g:vals)
4308a7d6542SBram Moolenaar
4318a7d6542SBram Moolenaar      g:vals = []
432659bb227SBram Moolenaar      assert_equal(true, Record(1) && Record(true))
433659bb227SBram Moolenaar      assert_equal([1, true], g:vals)
434659bb227SBram Moolenaar
435659bb227SBram Moolenaar      g:vals = []
4362bb2658bSBram Moolenaar      assert_equal(false, Record(0) && Record(1))
4378a7d6542SBram Moolenaar      assert_equal([0], g:vals)
4388a7d6542SBram Moolenaar
4398a7d6542SBram Moolenaar      g:vals = []
440659bb227SBram Moolenaar      assert_equal(false, Record(0) && Record(1) && Record(0))
441659bb227SBram Moolenaar      assert_equal([0], g:vals)
442659bb227SBram Moolenaar
443659bb227SBram Moolenaar      g:vals = []
4442bb2658bSBram Moolenaar      assert_equal(false, Record(0) && Record(4) && Record(0))
4458a7d6542SBram Moolenaar      assert_equal([0], g:vals)
4468a7d6542SBram Moolenaar
4478a7d6542SBram Moolenaar      g:vals = []
4482bb2658bSBram Moolenaar      assert_equal(false, Record(1) && Record(true) && Record(0))
4492bb2658bSBram Moolenaar      assert_equal([1, true, 0], g:vals)
450659bb227SBram Moolenaar  END
451659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
4528a7d6542SBram Moolenaarenddef
4538a7d6542SBram Moolenaar
454be7ee488SBram Moolenaardef Test_expr3_vimscript()
455f5be8cdbSBram Moolenaar  # check line continuation
45637ce6d3aSBram Moolenaar  var lines =<< trim END
4579830938eSBram Moolenaar      var name = 0
458be7ee488SBram Moolenaar      		&& 1
4592bb2658bSBram Moolenaar      assert_equal(false, name)
460be7ee488SBram Moolenaar  END
46190193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
462be7ee488SBram Moolenaar
463be7ee488SBram Moolenaar  lines =<< trim END
4649830938eSBram Moolenaar      var name = v:true
465be7ee488SBram Moolenaar      		&& v:true
466be7ee488SBram Moolenaar      		&& v:true
4679830938eSBram Moolenaar      assert_equal(v:true, name)
468be7ee488SBram Moolenaar  END
46990193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
4709215f012SBram Moolenaar
4719215f012SBram Moolenaar  lines =<< trim END
4729830938eSBram Moolenaar      var name = v:true &&
4739215f012SBram Moolenaar      		v:true &&
4749215f012SBram Moolenaar      		v:true
4759830938eSBram Moolenaar      assert_equal(v:true, name)
4768c34ea54SBram Moolenaar  END
47790193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
4788c34ea54SBram Moolenaar
47993be1644SBram Moolenaar  lines =<< trim END
48093be1644SBram Moolenaar      var name = v:true &&  # comment
48193be1644SBram Moolenaar                # comment
48293be1644SBram Moolenaar      		v:true &&
48393be1644SBram Moolenaar                # comment
48493be1644SBram Moolenaar      		v:true
48593be1644SBram Moolenaar      assert_equal(v:true, name)
48693be1644SBram Moolenaar  END
48790193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
48893be1644SBram Moolenaar
4893c1c9fd9SBram Moolenaar  # check white space
4903c1c9fd9SBram Moolenaar  lines =<< trim END
4919830938eSBram Moolenaar      var name = v:true&&v:true
4923c1c9fd9SBram Moolenaar  END
49390193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
49490193e61SBram Moolenaar
4953c1c9fd9SBram Moolenaar  lines =<< trim END
4969830938eSBram Moolenaar      var name = v:true &&v:true
4973c1c9fd9SBram Moolenaar  END
49890193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''&&'' at "&&v:true"', 1)
49990193e61SBram Moolenaar
5003c1c9fd9SBram Moolenaar  lines =<< trim END
5019830938eSBram Moolenaar      var name = v:true&& v:true
5023c1c9fd9SBram Moolenaar  END
50390193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
504be7ee488SBram Moolenaarenddef
505be7ee488SBram Moolenaar
506a7511c0fSBram Moolenaardef Test_expr3_fails()
507a7511c0fSBram Moolenaar  var msg = "White space required before and after '&&'"
50890193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = 1&&2"], msg, 1)
50990193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = 1 &&2"], msg, 1)
51090193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = 1&& 2"], msg, 1)
5114ac198c6Smityu  var lines =<< trim END
5124ac198c6Smityu    var x = 1
5134ac198c6Smityu      &&2
5144ac198c6Smityu    # comment
5154ac198c6Smityu  END
5164ac198c6Smityu  CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''&&'' at "&&2"', 2)
517ea2d407fSBram Moolenaar
51890193e61SBram Moolenaar  g:vals = []
51990193e61SBram Moolenaar  CheckDefAndScriptFailure2(["if 'yes' && 0", 'echo 0', 'endif'], 'E1012: Type mismatch; expected bool but got string', 'E1135: Using a String as a Bool', 1)
520659bb227SBram Moolenaar
52190193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['assert_equal(false, Record(1) && Record(4) && Record(0))'], 'E1023: Using a Number as a Bool: 4', 1)
522a7511c0fSBram Moolenaar
5234ac198c6Smityu  lines =<< trim END
524a7511c0fSBram Moolenaar      if 3
525a7511c0fSBram Moolenaar          && true
526a7511c0fSBram Moolenaar      endif
527a7511c0fSBram Moolenaar  END
52890193e61SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1023:', 1)
529a7511c0fSBram Moolenaar
530a7511c0fSBram Moolenaar  lines =<< trim END
531a7511c0fSBram Moolenaar      if 'yes'
532a7511c0fSBram Moolenaar          && true
533a7511c0fSBram Moolenaar      endif
534a7511c0fSBram Moolenaar  END
53590193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1012:', 'E1135: Using a String as a Bool', 1)
536a7511c0fSBram Moolenaarenddef
5378a7d6542SBram Moolenaar
53856acb094SBram Moolenaar" global variables to use for tests with the "any" type
5398a7d6542SBram Moolenaarlet atrue = v:true
5408a7d6542SBram Moolenaarlet afalse = v:false
5418a7d6542SBram Moolenaarlet anone = v:none
5428a7d6542SBram Moolenaarlet anull = v:null
5438a7d6542SBram Moolenaarlet anint = 10
54456acb094SBram Moolenaarlet theone = 1
54556acb094SBram Moolenaarlet thefour = 4
5468a7d6542SBram Moolenaarif has('float')
5478a7d6542SBram Moolenaar  let afloat = 0.1
5488a7d6542SBram Moolenaarendif
5498a7d6542SBram Moolenaarlet astring = 'asdf'
5508a7d6542SBram Moolenaarlet ablob = 0z01ab
5518a7d6542SBram Moolenaarlet alist = [2, 3, 4]
5528a7d6542SBram Moolenaarlet adict = #{aaa: 2, bbb: 8}
5538a7d6542SBram Moolenaar
5548a7d6542SBram Moolenaar" test == comperator
5558a7d6542SBram Moolenaardef Test_expr4_equal()
556659bb227SBram Moolenaar  var lines =<< trim END
55737ce6d3aSBram Moolenaar      var trueVar = true
55837ce6d3aSBram Moolenaar      var falseVar = false
5598a7d6542SBram Moolenaar      assert_equal(true, true == true)
5609c7e6dd6SBram Moolenaar      assert_equal(false, true ==
5619c7e6dd6SBram Moolenaar                            false)
56267fbdfefSBram Moolenaar      assert_equal(true, true
56367fbdfefSBram Moolenaar                            == trueVar)
56466b31016SBram Moolenaar      assert_equal(false, true == falseVar)
5658a7d6542SBram Moolenaar      assert_equal(true, true == g:atrue)
5668a7d6542SBram Moolenaar      assert_equal(false, g:atrue == false)
5678a7d6542SBram Moolenaar
5688a7d6542SBram Moolenaar      assert_equal(true, v:none == v:none)
5698a7d6542SBram Moolenaar      assert_equal(false, v:none == v:null)
5708a7d6542SBram Moolenaar      assert_equal(true, g:anone == v:none)
57167977821SBram Moolenaar      assert_equal(true, null == v:null)
57267977821SBram Moolenaar      assert_equal(true, null == g:anull)
5738a7d6542SBram Moolenaar      assert_equal(false, v:none == g:anull)
5748a7d6542SBram Moolenaar
57537ce6d3aSBram Moolenaar      var nr0 = 0
57637ce6d3aSBram Moolenaar      var nr61 = 61
5778a7d6542SBram Moolenaar      assert_equal(false, 2 == 0)
57866b31016SBram Moolenaar      assert_equal(false, 2 == nr0)
5798a7d6542SBram Moolenaar      assert_equal(true, 61 == 61)
58066b31016SBram Moolenaar      assert_equal(true, 61 == nr61)
5818a7d6542SBram Moolenaar      assert_equal(true, g:anint == 10)
5828a7d6542SBram Moolenaar      assert_equal(false, 61 == g:anint)
5838a7d6542SBram Moolenaar
5848a7d6542SBram Moolenaar      if has('float')
58537ce6d3aSBram Moolenaar        var ff = 0.3
5864aeeb639SBram Moolenaar        assert_equal(true, ff == 0.3)
5874aeeb639SBram Moolenaar        assert_equal(false, 0.4 == ff)
5888a7d6542SBram Moolenaar        assert_equal(true, 0.1 == g:afloat)
5898a7d6542SBram Moolenaar        assert_equal(false, g:afloat == 0.3)
5908a7d6542SBram Moolenaar
5914aeeb639SBram Moolenaar        ff = 3.0
5924aeeb639SBram Moolenaar        assert_equal(true, ff == 3)
5934aeeb639SBram Moolenaar        assert_equal(true, 3 == ff)
5944aeeb639SBram Moolenaar        ff = 3.1
5954aeeb639SBram Moolenaar        assert_equal(false, ff == 3)
5964aeeb639SBram Moolenaar        assert_equal(false, 3 == ff)
5978a7d6542SBram Moolenaar      endif
5988a7d6542SBram Moolenaar
5998a7d6542SBram Moolenaar      assert_equal(true, 'abc' == 'abc')
6008a7d6542SBram Moolenaar      assert_equal(false, 'xyz' == 'abc')
6018a7d6542SBram Moolenaar      assert_equal(true, g:astring == 'asdf')
6028a7d6542SBram Moolenaar      assert_equal(false, 'xyz' == g:astring)
6038a7d6542SBram Moolenaar
6049be61bbbSBram Moolenaar      assert_equal(false, 'abc' == 'aBc')
6059be61bbbSBram Moolenaar      assert_equal(false, 'abc' ==# 'aBc')
6069be61bbbSBram Moolenaar      assert_equal(true, 'abc' ==? 'aBc')
6079be61bbbSBram Moolenaar
6088a7d6542SBram Moolenaar      assert_equal(false, 'abc' == 'ABC')
6098a7d6542SBram Moolenaar      set ignorecase
6108a7d6542SBram Moolenaar      assert_equal(false, 'abc' == 'ABC')
6119be61bbbSBram Moolenaar      assert_equal(false, 'abc' ==# 'ABC')
612659bb227SBram Moolenaar      assert_equal(true, 'abc' ==? 'ABC')
6138a7d6542SBram Moolenaar      set noignorecase
6148a7d6542SBram Moolenaar
61537ce6d3aSBram Moolenaar      var bb = 0z3f
6164aeeb639SBram Moolenaar      assert_equal(true, 0z3f == bb)
6174aeeb639SBram Moolenaar      assert_equal(false, bb == 0z4f)
6188a7d6542SBram Moolenaar      assert_equal(true, g:ablob == 0z01ab)
6198a7d6542SBram Moolenaar      assert_equal(false, 0z3f == g:ablob)
6208a7d6542SBram Moolenaar
6218a7d6542SBram Moolenaar      assert_equal(true, [1, 2, 3] == [1, 2, 3])
6228a7d6542SBram Moolenaar      assert_equal(false, [1, 2, 3] == [2, 3, 1])
6238a7d6542SBram Moolenaar      assert_equal(true, [2, 3, 4] == g:alist)
6248a7d6542SBram Moolenaar      assert_equal(false, g:alist == [2, 3, 1])
6258a7d6542SBram Moolenaar      assert_equal(false, [1, 2, 3] == [])
6268a7d6542SBram Moolenaar      assert_equal(false, [1, 2, 3] == ['1', '2', '3'])
6278a7d6542SBram Moolenaar
628e0de171eSBram Moolenaar      assert_equal(true, {one: 1, two: 2} == {one: 1, two: 2})
629e0de171eSBram Moolenaar      assert_equal(false, {one: 1, two: 2} == {one: 2, two: 2})
630e0de171eSBram Moolenaar      assert_equal(false, {one: 1, two: 2} == {two: 2})
631e0de171eSBram Moolenaar      assert_equal(false, {one: 1, two: 2} == {})
632e0de171eSBram Moolenaar      assert_equal(true, g:adict == {bbb: 8, aaa: 2})
633e0de171eSBram Moolenaar      assert_equal(false, {ccc: 9, aaa: 2} == g:adict)
6348a7d6542SBram Moolenaar
6354c17ad94SBram Moolenaar      assert_equal(true, function('g:Test_expr4_equal') == function('g:Test_expr4_equal'))
6364c17ad94SBram Moolenaar      assert_equal(false, function('g:Test_expr4_equal') == function('g:Test_expr4_is'))
6378a7d6542SBram Moolenaar
6384c17ad94SBram Moolenaar      assert_equal(true, function('g:Test_expr4_equal', [123]) == function('g:Test_expr4_equal', [123]))
6394c17ad94SBram Moolenaar      assert_equal(false, function('g:Test_expr4_equal', [123]) == function('g:Test_expr4_is', [123]))
6404c17ad94SBram Moolenaar      assert_equal(false, function('g:Test_expr4_equal', [123]) == function('g:Test_expr4_equal', [999]))
641a0a9f43aSBram Moolenaar
642a065a141SBram Moolenaar      # TODO: this unexpectedly sometimes fails on Appveyor
643a065a141SBram Moolenaar      if !has('win32')
64437ce6d3aSBram Moolenaar        var OneFunc: func
64537ce6d3aSBram Moolenaar        var TwoFunc: func
646a0a9f43aSBram Moolenaar        OneFunc = function('len')
647a0a9f43aSBram Moolenaar        TwoFunc = function('len')
648a0a9f43aSBram Moolenaar        assert_equal(true, OneFunc('abc') == TwoFunc('123'))
649a065a141SBram Moolenaar      endif
650659bb227SBram Moolenaar  END
651659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
652659bb227SBram Moolenaar
65390193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var x = 'a' == xxx"], 'E1001:', 'E121:', 1)
6548ff16e01SBram Moolenaar  CheckDefFailure(["var x = 'a' == "], 'E1097:', 3)
65590193e61SBram Moolenaar  CheckScriptFailure(['vim9script', "var x = 'a' == "], 'E15:', 2)
656918a4249SBram Moolenaar
657c323527dSBram Moolenaar  CheckDefExecAndScriptFailure2(['var items: any', 'eval 1 + 1', 'eval 2 + 2', 'if items == []', 'endif'], 'E691:', 'E1072:', 4)
658cff40ff9SBram Moolenaar
65990193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['var x: any = "a"', 'echo x == true'], 'E1072: Cannot compare string with bool', 2)
66090193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var x: any = true", 'echo x == ""'], 'E1072: Cannot compare bool with string', 2)
66190193e61SBram Moolenaar  CheckDefExecAndScriptFailure2(["var x: any = 99", 'echo x == true'], 'E1138', 'E1072:', 2)
66290193e61SBram Moolenaar  CheckDefExecAndScriptFailure2(["var x: any = 'a'", 'echo x == 99'], 'E1030:', 'E1072:', 2)
6630c35752dSBram Moolenaarenddef
664cff40ff9SBram Moolenaar
6650c35752dSBram Moolenaardef Test_expr4_wrong_type()
666cff40ff9SBram Moolenaar  for op in ['>', '>=', '<', '<=', '=~', '!~']
66790193e61SBram Moolenaar    CheckDefExecAndScriptFailure([
668cff40ff9SBram Moolenaar        "var a: any = 'a'",
669cff40ff9SBram Moolenaar        'var b: any = true',
670cff40ff9SBram Moolenaar        'echo a ' .. op .. ' b'], 'E1072:', 3)
671cff40ff9SBram Moolenaar  endfor
6720c35752dSBram Moolenaar  for op in ['>', '>=', '<', '<=']
6730c35752dSBram Moolenaar    CheckDefExecAndScriptFailure2([
6740c35752dSBram Moolenaar        "var n: any = 2",
6750c35752dSBram Moolenaar        'echo n ' .. op .. ' "3"'], 'E1030:', 'E1072:', 2)
6760c35752dSBram Moolenaar  endfor
6770c35752dSBram Moolenaar  for op in ['=~', '!~']
6780c35752dSBram Moolenaar    CheckDefExecAndScriptFailure([
6790c35752dSBram Moolenaar        "var n: any = 2",
6800c35752dSBram Moolenaar        'echo n ' .. op .. ' "3"'], 'E1072:', 2)
6810c35752dSBram Moolenaar  endfor
6820c35752dSBram Moolenaar
6830c35752dSBram Moolenaar  CheckDefAndScriptFailure([
6840c35752dSBram Moolenaar      'echo v:none == true'], 'E1072:', 1)
6850c35752dSBram Moolenaar  CheckDefAndScriptFailure([
6860c35752dSBram Moolenaar      'echo false >= true'], 'E1072:', 1)
6870c35752dSBram Moolenaar  CheckDefExecAndScriptFailure([
6880c35752dSBram Moolenaar      "var n: any = v:none",
6890c35752dSBram Moolenaar      'echo n == true'], 'E1072:', 2)
6900c35752dSBram Moolenaar  CheckDefExecAndScriptFailure([
6910c35752dSBram Moolenaar      "var n: any = v:none",
6920c35752dSBram Moolenaar      'echo n < true'], 'E1072:', 2)
6938a7d6542SBram Moolenaarenddef
6948a7d6542SBram Moolenaar
6958a7d6542SBram Moolenaar" test != comperator
6968a7d6542SBram Moolenaardef Test_expr4_notequal()
697659bb227SBram Moolenaar  var lines =<< trim END
69837ce6d3aSBram Moolenaar      var trueVar = true
69937ce6d3aSBram Moolenaar      var falseVar = false
7008a7d6542SBram Moolenaar      assert_equal(false, true != true)
7019c7e6dd6SBram Moolenaar      assert_equal(true, true !=
7029c7e6dd6SBram Moolenaar                            false)
70367fbdfefSBram Moolenaar      assert_equal(false, true
70467fbdfefSBram Moolenaar                            != trueVar)
70566b31016SBram Moolenaar      assert_equal(true, true != falseVar)
7068a7d6542SBram Moolenaar      assert_equal(false, true != g:atrue)
7078a7d6542SBram Moolenaar      assert_equal(true, g:atrue != false)
7088a7d6542SBram Moolenaar
7098a7d6542SBram Moolenaar      assert_equal(false, v:none != v:none)
7108a7d6542SBram Moolenaar      assert_equal(true, v:none != v:null)
7118a7d6542SBram Moolenaar      assert_equal(false, g:anone != v:none)
7128a7d6542SBram Moolenaar      assert_equal(true, v:none != g:anull)
7138a7d6542SBram Moolenaar
71437ce6d3aSBram Moolenaar      var nr55 = 55
71537ce6d3aSBram Moolenaar      var nr0 = 55
7168a7d6542SBram Moolenaar      assert_equal(true, 2 != 0)
71766b31016SBram Moolenaar      assert_equal(true, 2 != nr0)
7188a7d6542SBram Moolenaar      assert_equal(false, 55 != 55)
71966b31016SBram Moolenaar      assert_equal(false, 55 != nr55)
7208a7d6542SBram Moolenaar      assert_equal(false, g:anint != 10)
7218a7d6542SBram Moolenaar      assert_equal(true, 61 != g:anint)
7228a7d6542SBram Moolenaar
7238a7d6542SBram Moolenaar      if has('float')
72437ce6d3aSBram Moolenaar        var ff = 0.3
7254aeeb639SBram Moolenaar        assert_equal(false, 0.3 != ff)
7264aeeb639SBram Moolenaar        assert_equal(true, 0.4 != ff)
7278a7d6542SBram Moolenaar        assert_equal(false, 0.1 != g:afloat)
7288a7d6542SBram Moolenaar        assert_equal(true, g:afloat != 0.3)
7298a7d6542SBram Moolenaar
7304aeeb639SBram Moolenaar        ff = 3.0
7314aeeb639SBram Moolenaar        assert_equal(false, ff != 3)
7324aeeb639SBram Moolenaar        assert_equal(false, 3 != ff)
7334aeeb639SBram Moolenaar        ff = 3.1
7344aeeb639SBram Moolenaar        assert_equal(true, ff != 3)
7354aeeb639SBram Moolenaar        assert_equal(true, 3 != ff)
7368a7d6542SBram Moolenaar      endif
7378a7d6542SBram Moolenaar
7388a7d6542SBram Moolenaar      assert_equal(false, 'abc' != 'abc')
7398a7d6542SBram Moolenaar      assert_equal(true, 'xyz' != 'abc')
7408a7d6542SBram Moolenaar      assert_equal(false, g:astring != 'asdf')
7418a7d6542SBram Moolenaar      assert_equal(true, 'xyz' != g:astring)
7428a7d6542SBram Moolenaar
7438a7d6542SBram Moolenaar      assert_equal(true, 'abc' != 'ABC')
7448a7d6542SBram Moolenaar      set ignorecase
7458a7d6542SBram Moolenaar      assert_equal(true, 'abc' != 'ABC')
746659bb227SBram Moolenaar      assert_equal(true, 'abc' !=# 'ABC')
747659bb227SBram Moolenaar      assert_equal(false, 'abc' !=? 'ABC')
7488a7d6542SBram Moolenaar      set noignorecase
7498a7d6542SBram Moolenaar
75037ce6d3aSBram Moolenaar      var bb = 0z3f
7514aeeb639SBram Moolenaar      assert_equal(false, 0z3f != bb)
7524aeeb639SBram Moolenaar      assert_equal(true, bb != 0z4f)
7538a7d6542SBram Moolenaar      assert_equal(false, g:ablob != 0z01ab)
7548a7d6542SBram Moolenaar      assert_equal(true, 0z3f != g:ablob)
7558a7d6542SBram Moolenaar
7568a7d6542SBram Moolenaar      assert_equal(false, [1, 2, 3] != [1, 2, 3])
7578a7d6542SBram Moolenaar      assert_equal(true, [1, 2, 3] != [2, 3, 1])
7588a7d6542SBram Moolenaar      assert_equal(false, [2, 3, 4] != g:alist)
7598a7d6542SBram Moolenaar      assert_equal(true, g:alist != [2, 3, 1])
7608a7d6542SBram Moolenaar      assert_equal(true, [1, 2, 3] != [])
7618a7d6542SBram Moolenaar      assert_equal(true, [1, 2, 3] != ['1', '2', '3'])
7628a7d6542SBram Moolenaar
763e0de171eSBram Moolenaar      assert_equal(false, {one: 1, two: 2} != {one: 1, two: 2})
764e0de171eSBram Moolenaar      assert_equal(true, {one: 1, two: 2} != {one: 2, two: 2})
765e0de171eSBram Moolenaar      assert_equal(true, {one: 1, two: 2} != {two: 2})
766e0de171eSBram Moolenaar      assert_equal(true, {one: 1, two: 2} != {})
767e0de171eSBram Moolenaar      assert_equal(false, g:adict != {bbb: 8, aaa: 2})
768e0de171eSBram Moolenaar      assert_equal(true, {ccc: 9, aaa: 2} != g:adict)
7698a7d6542SBram Moolenaar
7704c17ad94SBram Moolenaar      assert_equal(false, function('g:Test_expr4_equal') != function('g:Test_expr4_equal'))
7714c17ad94SBram Moolenaar      assert_equal(true, function('g:Test_expr4_equal') != function('g:Test_expr4_is'))
7728a7d6542SBram Moolenaar
7734c17ad94SBram Moolenaar      assert_equal(false, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_equal', [123]))
7744c17ad94SBram Moolenaar      assert_equal(true, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_is', [123]))
7754c17ad94SBram Moolenaar      assert_equal(true, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_equal', [999]))
776659bb227SBram Moolenaar  END
777659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
7788a7d6542SBram Moolenaarenddef
7798a7d6542SBram Moolenaar
7808a7d6542SBram Moolenaar" test > comperator
7818a7d6542SBram Moolenaardef Test_expr4_greater()
782659bb227SBram Moolenaar  var lines =<< trim END
7830062c2d4SBram Moolenaar      assert_true(2 > 0)
7849c7e6dd6SBram Moolenaar      assert_true(2 >
7859c7e6dd6SBram Moolenaar                    1)
7860062c2d4SBram Moolenaar      assert_false(2 > 2)
7870062c2d4SBram Moolenaar      assert_false(2 > 3)
78837ce6d3aSBram Moolenaar      var nr2 = 2
78966b31016SBram Moolenaar      assert_true(nr2 > 0)
79066b31016SBram Moolenaar      assert_true(nr2 >
79166b31016SBram Moolenaar                    1)
79266b31016SBram Moolenaar      assert_false(nr2 > 2)
79367fbdfefSBram Moolenaar      assert_false(nr2
79467fbdfefSBram Moolenaar                        > 3)
7950062c2d4SBram Moolenaar      if has('float')
79637ce6d3aSBram Moolenaar        var ff = 2.0
7974aeeb639SBram Moolenaar        assert_true(ff > 0.0)
7984aeeb639SBram Moolenaar        assert_true(ff > 1.0)
7994aeeb639SBram Moolenaar        assert_false(ff > 2.0)
8004aeeb639SBram Moolenaar        assert_false(ff > 3.0)
8010062c2d4SBram Moolenaar      endif
802659bb227SBram Moolenaar  END
803659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
8048a7d6542SBram Moolenaarenddef
8058a7d6542SBram Moolenaar
8068a7d6542SBram Moolenaar" test >= comperator
8078a7d6542SBram Moolenaardef Test_expr4_greaterequal()
808659bb227SBram Moolenaar  var lines =<< trim END
8090062c2d4SBram Moolenaar      assert_true(2 >= 0)
8109c7e6dd6SBram Moolenaar      assert_true(2 >=
8119c7e6dd6SBram Moolenaar                            2)
8120062c2d4SBram Moolenaar      assert_false(2 >= 3)
81337ce6d3aSBram Moolenaar      var nr2 = 2
81466b31016SBram Moolenaar      assert_true(nr2 >= 0)
81566b31016SBram Moolenaar      assert_true(nr2 >= 2)
81666b31016SBram Moolenaar      assert_false(nr2 >= 3)
8170062c2d4SBram Moolenaar      if has('float')
81837ce6d3aSBram Moolenaar        var ff = 2.0
8194aeeb639SBram Moolenaar        assert_true(ff >= 0.0)
8204aeeb639SBram Moolenaar        assert_true(ff >= 2.0)
8214aeeb639SBram Moolenaar        assert_false(ff >= 3.0)
8220062c2d4SBram Moolenaar      endif
823659bb227SBram Moolenaar  END
824659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
8258a7d6542SBram Moolenaarenddef
8268a7d6542SBram Moolenaar
8278a7d6542SBram Moolenaar" test < comperator
8288a7d6542SBram Moolenaardef Test_expr4_smaller()
829659bb227SBram Moolenaar  var lines =<< trim END
8300062c2d4SBram Moolenaar      assert_false(2 < 0)
8319c7e6dd6SBram Moolenaar      assert_false(2 <
8329c7e6dd6SBram Moolenaar                            2)
83367fbdfefSBram Moolenaar      assert_true(2
83467fbdfefSBram Moolenaar                    < 3)
83537ce6d3aSBram Moolenaar      var nr2 = 2
83666b31016SBram Moolenaar      assert_false(nr2 < 0)
83766b31016SBram Moolenaar      assert_false(nr2 < 2)
83866b31016SBram Moolenaar      assert_true(nr2 < 3)
8390062c2d4SBram Moolenaar      if has('float')
84037ce6d3aSBram Moolenaar        var ff = 2.0
8414aeeb639SBram Moolenaar        assert_false(ff < 0.0)
8424aeeb639SBram Moolenaar        assert_false(ff < 2.0)
8434aeeb639SBram Moolenaar        assert_true(ff < 3.0)
8440062c2d4SBram Moolenaar      endif
845659bb227SBram Moolenaar  END
846659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
8478a7d6542SBram Moolenaarenddef
8488a7d6542SBram Moolenaar
8498a7d6542SBram Moolenaar" test <= comperator
8508a7d6542SBram Moolenaardef Test_expr4_smallerequal()
851659bb227SBram Moolenaar  var lines =<< trim END
8520062c2d4SBram Moolenaar      assert_false(2 <= 0)
8539c7e6dd6SBram Moolenaar      assert_false(2 <=
8549c7e6dd6SBram Moolenaar                            1)
85567fbdfefSBram Moolenaar      assert_true(2
85667fbdfefSBram Moolenaar                    <= 2)
8570062c2d4SBram Moolenaar      assert_true(2 <= 3)
85837ce6d3aSBram Moolenaar      var nr2 = 2
85966b31016SBram Moolenaar      assert_false(nr2 <= 0)
86066b31016SBram Moolenaar      assert_false(nr2 <= 1)
86166b31016SBram Moolenaar      assert_true(nr2 <= 2)
86266b31016SBram Moolenaar      assert_true(nr2 <= 3)
8630062c2d4SBram Moolenaar      if has('float')
86437ce6d3aSBram Moolenaar        var ff = 2.0
8654aeeb639SBram Moolenaar        assert_false(ff <= 0.0)
8664aeeb639SBram Moolenaar        assert_false(ff <= 1.0)
8674aeeb639SBram Moolenaar        assert_true(ff <= 2.0)
8684aeeb639SBram Moolenaar        assert_true(ff <= 3.0)
8690062c2d4SBram Moolenaar      endif
870659bb227SBram Moolenaar  END
871659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
8728a7d6542SBram Moolenaarenddef
8738a7d6542SBram Moolenaar
8748a7d6542SBram Moolenaar" test =~ comperator
8758a7d6542SBram Moolenaardef Test_expr4_match()
876659bb227SBram Moolenaar  var lines =<< trim END
8778a7d6542SBram Moolenaar      assert_equal(false, '2' =~ '0')
87867fbdfefSBram Moolenaar      assert_equal(false, ''
87967fbdfefSBram Moolenaar                             =~ '0')
8809c7e6dd6SBram Moolenaar      assert_equal(true, '2' =~
8819c7e6dd6SBram Moolenaar                            '[0-9]')
882659bb227SBram Moolenaar      set ignorecase
883659bb227SBram Moolenaar      assert_equal(false, 'abc' =~ 'ABC')
884659bb227SBram Moolenaar      assert_equal(false, 'abc' =~# 'ABC')
885659bb227SBram Moolenaar      assert_equal(true, 'abc' =~? 'ABC')
886659bb227SBram Moolenaar      set noignorecase
887659bb227SBram Moolenaar  END
888659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
8898a7d6542SBram Moolenaarenddef
8908a7d6542SBram Moolenaar
8918a7d6542SBram Moolenaar" test !~ comperator
8928a7d6542SBram Moolenaardef Test_expr4_nomatch()
893659bb227SBram Moolenaar  var lines =<< trim END
8948a7d6542SBram Moolenaar      assert_equal(true, '2' !~ '0')
89567fbdfefSBram Moolenaar      assert_equal(true, ''
89667fbdfefSBram Moolenaar                            !~ '0')
8979c7e6dd6SBram Moolenaar      assert_equal(false, '2' !~
8989c7e6dd6SBram Moolenaar                            '[0-9]')
899659bb227SBram Moolenaar  END
900659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
9018a7d6542SBram Moolenaarenddef
9028a7d6542SBram Moolenaar
9038a7d6542SBram Moolenaar" test is comperator
9048a7d6542SBram Moolenaardef Test_expr4_is()
905659bb227SBram Moolenaar  var lines =<< trim END
90637ce6d3aSBram Moolenaar      var mylist = [2]
9070062c2d4SBram Moolenaar      assert_false(mylist is [2])
90837ce6d3aSBram Moolenaar      var other = mylist
9099c7e6dd6SBram Moolenaar      assert_true(mylist is
9109c7e6dd6SBram Moolenaar                    other)
9110062c2d4SBram Moolenaar
91237ce6d3aSBram Moolenaar      var myblob = 0z1234
91367fbdfefSBram Moolenaar      assert_false(myblob
91467fbdfefSBram Moolenaar                            is 0z1234)
91537ce6d3aSBram Moolenaar      var otherblob = myblob
9160062c2d4SBram Moolenaar      assert_true(myblob is otherblob)
917659bb227SBram Moolenaar  END
918659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
9198a7d6542SBram Moolenaarenddef
9208a7d6542SBram Moolenaar
9218a7d6542SBram Moolenaar" test isnot comperator
9228a7d6542SBram Moolenaardef Test_expr4_isnot()
923659bb227SBram Moolenaar  var lines =<< trim END
92437ce6d3aSBram Moolenaar      var mylist = [2]
9250062c2d4SBram Moolenaar      assert_true('2' isnot '0')
9260062c2d4SBram Moolenaar      assert_true(mylist isnot [2])
92737ce6d3aSBram Moolenaar      var other = mylist
9289c7e6dd6SBram Moolenaar      assert_false(mylist isnot
9299c7e6dd6SBram Moolenaar                            other)
9300062c2d4SBram Moolenaar
93137ce6d3aSBram Moolenaar      var myblob = 0z1234
93267fbdfefSBram Moolenaar      assert_true(myblob
93367fbdfefSBram Moolenaar                    isnot 0z1234)
93437ce6d3aSBram Moolenaar      var otherblob = myblob
9350062c2d4SBram Moolenaar      assert_false(myblob isnot otherblob)
936659bb227SBram Moolenaar  END
937659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
9388a7d6542SBram Moolenaarenddef
9398a7d6542SBram Moolenaar
9408a7d6542SBram Moolenaardef RetVoid()
94137ce6d3aSBram Moolenaar  var x = 1
9428a7d6542SBram Moolenaarenddef
9438a7d6542SBram Moolenaar
9448294d499SBram Moolenaardef Test_expr4_vim9script()
945f5be8cdbSBram Moolenaar  # check line continuation
94637ce6d3aSBram Moolenaar  var lines =<< trim END
9479830938eSBram Moolenaar      var name = 0
948e6536aa7SBram Moolenaar      		< 1
9499830938eSBram Moolenaar      assert_equal(true, name)
950e6536aa7SBram Moolenaar  END
95190193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
952e6536aa7SBram Moolenaar
953e6536aa7SBram Moolenaar  lines =<< trim END
9549830938eSBram Moolenaar      var name = 123
95593be1644SBram Moolenaar                # comment
956e6536aa7SBram Moolenaar      		!= 123
9579830938eSBram Moolenaar      assert_equal(false, name)
958e6536aa7SBram Moolenaar  END
95990193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
960e6536aa7SBram Moolenaar
961e6536aa7SBram Moolenaar  lines =<< trim END
9629830938eSBram Moolenaar      var name = 123 ==
9639215f012SBram Moolenaar      			123
9649830938eSBram Moolenaar      assert_equal(true, name)
9659215f012SBram Moolenaar  END
96690193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
9679215f012SBram Moolenaar
9689215f012SBram Moolenaar  lines =<< trim END
96937ce6d3aSBram Moolenaar      var list = [1, 2, 3]
97037ce6d3aSBram Moolenaar      var name = list
971e6536aa7SBram Moolenaar      		is list
97237ce6d3aSBram Moolenaar      assert_equal(true, name)
973e6536aa7SBram Moolenaar  END
97490193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
975e6536aa7SBram Moolenaar
976e6536aa7SBram Moolenaar  lines =<< trim END
97793be1644SBram Moolenaar      var list = [1, 2, 3]
97893be1644SBram Moolenaar      var name = list # comment
97993be1644SBram Moolenaar                 # comment
98093be1644SBram Moolenaar      		is list
98193be1644SBram Moolenaar      assert_equal(true, name)
98293be1644SBram Moolenaar  END
98390193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
98493be1644SBram Moolenaar
98593be1644SBram Moolenaar  lines =<< trim END
98637ce6d3aSBram Moolenaar      var myblob = 0z1234
98737ce6d3aSBram Moolenaar      var name = myblob
988e6536aa7SBram Moolenaar      		isnot 0z11
98937ce6d3aSBram Moolenaar      assert_equal(true, name)
990e6536aa7SBram Moolenaar  END
99190193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
992543e6f34SBram Moolenaar
993f5be8cdbSBram Moolenaar  # spot check mismatching types
994543e6f34SBram Moolenaar  lines =<< trim END
995543e6f34SBram Moolenaar      echo '' == 0
996543e6f34SBram Moolenaar  END
99790193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1072:', 1)
998543e6f34SBram Moolenaar
999543e6f34SBram Moolenaar  lines =<< trim END
1000543e6f34SBram Moolenaar      echo v:true > v:false
1001543e6f34SBram Moolenaar  END
100290193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'Cannot compare bool with bool', 1)
1003543e6f34SBram Moolenaar
1004543e6f34SBram Moolenaar  lines =<< trim END
1005543e6f34SBram Moolenaar      echo 123 is 123
1006543e6f34SBram Moolenaar  END
100790193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'Cannot use "is" with number', 1)
1008c71f36a8SBram Moolenaar
1009ff1cd39cSBram Moolenaar  # check missing white space
1010ff1cd39cSBram Moolenaar  lines =<< trim END
1011ff1cd39cSBram Moolenaar    echo 2>3
1012ff1cd39cSBram Moolenaar  END
101390193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''>'' at ">3"', 1)
10148294d499SBram Moolenaar
10158294d499SBram Moolenaar  lines =<< trim END
101690193e61SBram Moolenaar    echo 2 >3
101790193e61SBram Moolenaar  END
101890193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
101990193e61SBram Moolenaar
102090193e61SBram Moolenaar  lines =<< trim END
102190193e61SBram Moolenaar    echo 2> 3
102290193e61SBram Moolenaar  END
102390193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
102490193e61SBram Moolenaar
102590193e61SBram Moolenaar  lines =<< trim END
102690193e61SBram Moolenaar    echo 2!=3
102790193e61SBram Moolenaar  END
102890193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
102990193e61SBram Moolenaar
103090193e61SBram Moolenaar  lines =<< trim END
103190193e61SBram Moolenaar    echo 2 !=3
103290193e61SBram Moolenaar  END
103390193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''!='' at "!=3"', 1)
103490193e61SBram Moolenaar
103590193e61SBram Moolenaar  lines =<< trim END
103690193e61SBram Moolenaar    echo 2!= 3
103790193e61SBram Moolenaar  END
103890193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
103990193e61SBram Moolenaar
10404ac198c6Smityu  for op in ['==', '>', '>=', '<', '<=', '=~', '!~', 'is', 'isnot']
10414ac198c6Smityu    lines = ["echo 'aaa'", op .. "'bbb'", '# comment']
10424ac198c6Smityu    var msg = printf("E1004: White space required before and after '%s'", op)
10434ac198c6Smityu    CheckDefAndScriptFailure(lines, msg, 2)
10444ac198c6Smityu  endfor
10454ac198c6Smityu
104690193e61SBram Moolenaar  lines =<< trim END
10478294d499SBram Moolenaar    echo len('xxx') == 3
10488294d499SBram Moolenaar  END
104990193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1050f923571eSBram Moolenaar
1051f923571eSBram Moolenaar  lines =<< trim END
105237ce6d3aSBram Moolenaar    var line = 'abc'
1053f923571eSBram Moolenaar    echo line[1] =~ '\w'
1054f923571eSBram Moolenaar  END
105590193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1056e6536aa7SBram Moolenaarenddef
1057e6536aa7SBram Moolenaar
10588a7d6542SBram Moolenaarfunc Test_expr4_fails()
10597707228aSBram Moolenaar  let msg = "White space required before and after '>'"
106090193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1>2"], msg, 1)
106190193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 >2"], msg, 1)
106290193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1> 2"], msg, 1)
10638a7d6542SBram Moolenaar
10647707228aSBram Moolenaar  let msg = "White space required before and after '=='"
106590193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1==2"], msg, 1)
106690193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 ==2"], msg, 1)
106790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1== 2"], msg, 1)
10688a7d6542SBram Moolenaar
10697707228aSBram Moolenaar  let msg = "White space required before and after 'is'"
107090193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1'is'2'"], msg, 1)
107190193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1' is'2'"], msg, 1)
107290193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1'is '2'"], msg, 1)
10738a7d6542SBram Moolenaar
10747707228aSBram Moolenaar  let msg = "White space required before and after 'isnot'"
107590193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1'isnot'2'"], msg, 1)
107690193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1' isnot'2'"], msg, 1)
107790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1'isnot '2'"], msg, 1)
10788a7d6542SBram Moolenaar
107990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 is# 2"], 'E15:', 1)
108090193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 is? 2"], 'E15:', 1)
108190193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 isnot# 2"], 'E15:', 1)
108290193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 isnot? 2"], 'E15:', 1)
10838a7d6542SBram Moolenaar
108490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 == '2'"], 'Cannot compare number with string', 1)
108590193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1' == 2"], 'Cannot compare string with number', 1)
108690193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 == RetVoid()"], 'Cannot compare number with void', 1)
108790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = RetVoid() == 1"], 'Cannot compare void with number', 1)
10888a7d6542SBram Moolenaar
108990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = true > false"], 'Cannot compare bool with bool', 1)
109090193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = true >= false"], 'Cannot compare bool with bool', 1)
109190193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = true < false"], 'Cannot compare bool with bool', 1)
109290193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = true <= false"], 'Cannot compare bool with bool', 1)
109390193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = true =~ false"], 'Cannot compare bool with bool', 1)
109490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = true !~ false"], 'Cannot compare bool with bool', 1)
109590193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = true is false"], 'Cannot use "is" with bool', 1)
109690193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = true isnot false"], 'Cannot use "isnot" with bool', 1)
10978a7d6542SBram Moolenaar
109890193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = v:none is v:null"], 'Cannot use "is" with special', 1)
109990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = v:none isnot v:null"], 'Cannot use "isnot" with special', 1)
110090193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 123 is 123"], 'Cannot use "is" with number', 1)
110190193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 123 isnot 123"], 'Cannot use "isnot" with number', 1)
11028a7d6542SBram Moolenaar  if has('float')
110390193e61SBram Moolenaar    call CheckDefAndScriptFailure(["var x = 1.3 is 1.3"], 'Cannot use "is" with float', 1)
110490193e61SBram Moolenaar    call CheckDefAndScriptFailure(["var x = 1.3 isnot 1.3"], 'Cannot use "isnot" with float', 1)
11058a7d6542SBram Moolenaar  endif
11068a7d6542SBram Moolenaar
110790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 0za1 > 0z34"], 'Cannot compare blob with blob', 1)
110890193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 0za1 >= 0z34"], 'Cannot compare blob with blob', 1)
110990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 0za1 < 0z34"], 'Cannot compare blob with blob', 1)
111090193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 0za1 <= 0z34"], 'Cannot compare blob with blob', 1)
111190193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 0za1 =~ 0z34"], 'Cannot compare blob with blob', 1)
111290193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 0za1 !~ 0z34"], 'Cannot compare blob with blob', 1)
11138a7d6542SBram Moolenaar
111490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = [13] > [88]"], 'Cannot compare list with list', 1)
111590193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = [13] >= [88]"], 'Cannot compare list with list', 1)
111690193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = [13] < [88]"], 'Cannot compare list with list', 1)
111790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = [13] <= [88]"], 'Cannot compare list with list', 1)
111890193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = [13] =~ [88]"], 'Cannot compare list with list', 1)
111990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = [13] !~ [88]"], 'Cannot compare list with list', 1)
11205381c7a1SBram Moolenaar
112190193e61SBram Moolenaar  call CheckDefAndScriptFailure(['var j: job', 'var chan: channel', 'var r = j == chan'], 'Cannot compare job with channel', 3)
112290193e61SBram Moolenaar  call CheckDefAndScriptFailure(['var j: job', 'var x: list<any>', 'var r = j == x'], 'Cannot compare job with list', 3)
112390193e61SBram Moolenaar  call CheckDefAndScriptFailure(['var j: job', 'var Xx: func', 'var r = j == Xx'], 'Cannot compare job with func', 3)
112490193e61SBram Moolenaar  call CheckDefAndScriptFailure(['var j: job', 'var Xx: func', 'var r = j == Xx'], 'Cannot compare job with func', 3)
11258a7d6542SBram Moolenaarendfunc
11268a7d6542SBram Moolenaar
11278a7d6542SBram Moolenaar" test addition, subtraction, concatenation
11288a7d6542SBram Moolenaardef Test_expr5()
1129659bb227SBram Moolenaar  var lines =<< trim END
11308a7d6542SBram Moolenaar      assert_equal(66, 60 + 6)
11319c7e6dd6SBram Moolenaar      assert_equal(70, 60 +
11329c7e6dd6SBram Moolenaar                            g:anint)
113356acb094SBram Moolenaar      assert_equal(9, g:thefour
113467fbdfefSBram Moolenaar                            + 5)
113556acb094SBram Moolenaar      assert_equal(14, g:thefour + g:anint)
1136c785b9a7SBram Moolenaar      assert_equal([1, 2, 3, 4], [1] + g:alist)
11378a7d6542SBram Moolenaar
11388a7d6542SBram Moolenaar      assert_equal(54, 60 - 6)
11399c7e6dd6SBram Moolenaar      assert_equal(50, 60 -
11409c7e6dd6SBram Moolenaar                        g:anint)
114156acb094SBram Moolenaar      assert_equal(-1, g:thefour
114267fbdfefSBram Moolenaar                            - 5)
114356acb094SBram Moolenaar      assert_equal(-6, g:thefour - g:anint)
11448a7d6542SBram Moolenaar
11458a7d6542SBram Moolenaar      assert_equal('hello', 'hel' .. 'lo')
1146f0eefce9SBram Moolenaar      assert_equal('hello 123', 'hello ' ..
1147f0eefce9SBram Moolenaar                                            123)
114867fbdfefSBram Moolenaar      assert_equal('hello 123', 'hello '
114967fbdfefSBram Moolenaar                                    ..  123)
11508a7d6542SBram Moolenaar      assert_equal('123 hello', 123 .. ' hello')
11518a7d6542SBram Moolenaar      assert_equal('123456', 123 .. 456)
11520062c2d4SBram Moolenaar
1153a8b8af19SBram Moolenaar      assert_equal('atrue', 'a' .. true)
1154a8b8af19SBram Moolenaar      assert_equal('afalse', 'a' .. false)
115567977821SBram Moolenaar      assert_equal('anull', 'a' .. v:null)
1156418f1df5SBram Moolenaar      assert_equal('av:none', 'a' .. v:none)
1157418f1df5SBram Moolenaar      if has('float')
1158418f1df5SBram Moolenaar        assert_equal('a0.123', 'a' .. 0.123)
1159418f1df5SBram Moolenaar      endif
1160418f1df5SBram Moolenaar
1161e507ff15SBram Moolenaar      assert_equal(3, 1 + [2, 3, 4][0])
1162e507ff15SBram Moolenaar      assert_equal(5, 2 + {key: 3}['key'])
1163e507ff15SBram Moolenaar
1164a8b8af19SBram Moolenaar      set digraph
1165a8b8af19SBram Moolenaar      assert_equal('val: true', 'val: ' .. &digraph)
1166a8b8af19SBram Moolenaar      set nodigraph
1167a8b8af19SBram Moolenaar      assert_equal('val: false', 'val: ' .. &digraph)
1168a8b8af19SBram Moolenaar
11690062c2d4SBram Moolenaar      assert_equal([1, 2, 3, 4], [1, 2] + [3, 4])
11700062c2d4SBram Moolenaar      assert_equal(0z11223344, 0z1122 + 0z3344)
117167fbdfefSBram Moolenaar      assert_equal(0z112201ab, 0z1122
117267fbdfefSBram Moolenaar                                    + g:ablob)
11730062c2d4SBram Moolenaar      assert_equal(0z01ab3344, g:ablob + 0z3344)
11740062c2d4SBram Moolenaar      assert_equal(0z01ab01ab, g:ablob + g:ablob)
11753fc71285SBram Moolenaar
11763fc71285SBram Moolenaar      # concatenate non-constant to constant
117737ce6d3aSBram Moolenaar      var save_path = &path
11783fc71285SBram Moolenaar      &path = 'b'
11793fc71285SBram Moolenaar      assert_equal('ab', 'a' .. &path)
11803fc71285SBram Moolenaar      &path = save_path
11813fc71285SBram Moolenaar
11823fc71285SBram Moolenaar      @b = 'b'
11833fc71285SBram Moolenaar      assert_equal('ab', 'a' .. @b)
11843fc71285SBram Moolenaar
11853fc71285SBram Moolenaar      $ENVVAR = 'env'
11863fc71285SBram Moolenaar      assert_equal('aenv', 'a' .. $ENVVAR)
1187d62d87d8SBram Moolenaar
1188d62d87d8SBram Moolenaar      assert_equal('val', '' .. {key: 'val'}['key'])
1189659bb227SBram Moolenaar  END
1190659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
11918a7d6542SBram Moolenaarenddef
11928a7d6542SBram Moolenaar
11935409f5d8SBram Moolenaardef Test_expr5_vim9script()
1194696ba231SBram Moolenaar  # check line continuation
119537ce6d3aSBram Moolenaar  var lines =<< trim END
11969830938eSBram Moolenaar      var name = 11
11975409f5d8SBram Moolenaar      		+ 77
11985409f5d8SBram Moolenaar		- 22
11999830938eSBram Moolenaar      assert_equal(66, name)
12005409f5d8SBram Moolenaar  END
120190193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
12025409f5d8SBram Moolenaar
12035409f5d8SBram Moolenaar  lines =<< trim END
12049830938eSBram Moolenaar      var name = 11 +
1205b4caa163SBram Moolenaar		  77 -
1206b4caa163SBram Moolenaar		  22
12079830938eSBram Moolenaar      assert_equal(66, name)
1208b4caa163SBram Moolenaar  END
120990193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1210b4caa163SBram Moolenaar
1211b4caa163SBram Moolenaar  lines =<< trim END
121293be1644SBram Moolenaar      var name = 11 +  # comment
121393be1644SBram Moolenaar		  77 -
121493be1644SBram Moolenaar                  # comment
121593be1644SBram Moolenaar		  22
121693be1644SBram Moolenaar      assert_equal(66, name)
121793be1644SBram Moolenaar  END
121890193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
121993be1644SBram Moolenaar
122093be1644SBram Moolenaar  lines =<< trim END
12219830938eSBram Moolenaar      var name = 'one'
12225409f5d8SBram Moolenaar      		.. 'two'
12239830938eSBram Moolenaar      assert_equal('onetwo', name)
12245409f5d8SBram Moolenaar  END
122590193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1226696ba231SBram Moolenaar
1227696ba231SBram Moolenaar  lines =<< trim END
1228696ba231SBram Moolenaar      echo 'abc' is# 'abc'
1229696ba231SBram Moolenaar  END
123090193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:', 1)
1231696ba231SBram Moolenaar
1232696ba231SBram Moolenaar  lines =<< trim END
1233b07a39deSBram Moolenaar      echo {} - 22
1234b07a39deSBram Moolenaar  END
123590193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1036:', 'E728:', 1)
1236081db1a6SBram Moolenaar
1237081db1a6SBram Moolenaar  lines =<< trim END
1238081db1a6SBram Moolenaar      echo [] - 33
1239081db1a6SBram Moolenaar  END
124090193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1036:', 'E745:', 1)
1241081db1a6SBram Moolenaar
1242081db1a6SBram Moolenaar  lines =<< trim END
1243081db1a6SBram Moolenaar      echo 0z1234 - 44
1244081db1a6SBram Moolenaar  END
124590193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1036', 'E974:', 1)
1246b07a39deSBram Moolenaar
1247b07a39deSBram Moolenaar  lines =<< trim END
1248696ba231SBram Moolenaar      echo 'abc' is? 'abc'
1249696ba231SBram Moolenaar  END
125090193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:', 1)
1251696ba231SBram Moolenaar
1252696ba231SBram Moolenaar  lines =<< trim END
1253696ba231SBram Moolenaar      echo 'abc' isnot# 'abc'
1254696ba231SBram Moolenaar  END
125590193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:', 1)
1256696ba231SBram Moolenaar
1257696ba231SBram Moolenaar  lines =<< trim END
1258696ba231SBram Moolenaar      echo 'abc' isnot? 'abc'
1259696ba231SBram Moolenaar  END
126090193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:', 1)
1261bb1b5e24SBram Moolenaar
1262bb1b5e24SBram Moolenaar  # check white space
1263bb1b5e24SBram Moolenaar  lines =<< trim END
1264bb1b5e24SBram Moolenaar      echo 5+6
1265bb1b5e24SBram Moolenaar  END
126690193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
1267bb1b5e24SBram Moolenaar  lines =<< trim END
1268bb1b5e24SBram Moolenaar      echo 5 +6
1269bb1b5e24SBram Moolenaar  END
127090193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
1271bb1b5e24SBram Moolenaar
1272bb1b5e24SBram Moolenaar  lines =<< trim END
127390193e61SBram Moolenaar      echo 5+ 6
1274bb1b5e24SBram Moolenaar  END
127590193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
127690193e61SBram Moolenaar
1277bb1b5e24SBram Moolenaar  lines =<< trim END
1278bb1b5e24SBram Moolenaar      echo 'a'..'b'
1279bb1b5e24SBram Moolenaar  END
128090193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''..'' at "..''b''"', 1)
128190193e61SBram Moolenaar
1282bb1b5e24SBram Moolenaar  lines =<< trim END
1283bb1b5e24SBram Moolenaar      echo 'a' ..'b'
1284bb1b5e24SBram Moolenaar  END
128590193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
128690193e61SBram Moolenaar
128790193e61SBram Moolenaar  lines =<< trim END
128890193e61SBram Moolenaar      echo 'a'.. 'b'
128990193e61SBram Moolenaar  END
129089dcb4dcSmityu  CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''..'' at ".. ''b''"', 1)
129189dcb4dcSmityu
129289dcb4dcSmityu  lines =<< trim END
129389dcb4dcSmityu      echo 'a'
129489dcb4dcSmityu          ..'b'
129589dcb4dcSmityu      # comment
129689dcb4dcSmityu  END
129789dcb4dcSmityu  CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''..'' at "..''b''"', 2)
1298418f1df5SBram Moolenaar
1299418f1df5SBram Moolenaar  # check invalid string concatenation
1300418f1df5SBram Moolenaar  lines =<< trim END
1301418f1df5SBram Moolenaar      echo 'a' .. [1]
1302418f1df5SBram Moolenaar  END
130390193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1105:', 'E730:', 1)
1304a9749534SBram Moolenaar
1305a9749534SBram Moolenaar  lines =<< trim END
130690193e61SBram Moolenaar      echo 'a' .. {a: 1}
130790193e61SBram Moolenaar  END
130890193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1105:', 'E731:', 1)
130990193e61SBram Moolenaar
131090193e61SBram Moolenaar  lines =<< trim END
131190193e61SBram Moolenaar      echo 'a' .. test_void()
131290193e61SBram Moolenaar  END
131390193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1105:', 'E908:', 1)
131490193e61SBram Moolenaar
131590193e61SBram Moolenaar  lines =<< trim END
131690193e61SBram Moolenaar      echo 'a' .. 0z33
131790193e61SBram Moolenaar  END
131890193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1105:', 'E976:', 1)
131990193e61SBram Moolenaar
132090193e61SBram Moolenaar  lines =<< trim END
132190193e61SBram Moolenaar      echo 'a' .. function('len')
132290193e61SBram Moolenaar  END
132390193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1105:', 'E729:', 1)
132490193e61SBram Moolenaar
132590193e61SBram Moolenaar  lines =<< trim END
1326a9749534SBram Moolenaar      new
1327a9749534SBram Moolenaar      ['']->setline(1)
1328a9749534SBram Moolenaar      /pattern
1329a9749534SBram Moolenaar
1330a9749534SBram Moolenaar      eval 0
1331a9749534SBram Moolenaar      bwipe!
1332a9749534SBram Moolenaar  END
133390193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, "E1004: White space required before and after '/' at \"/pattern", 3)
13344ac198c6Smityu
13354ac198c6Smityu  for op in ['+', '-']
13364ac198c6Smityu    lines = ['var x = 1', op .. '2', '# comment']
13374ac198c6Smityu    var msg = printf("E1004: White space required before and after '%s' at \"%s2\"", op, op)
13384ac198c6Smityu    CheckDefAndScriptFailure(lines, msg, 2)
13394ac198c6Smityu  endfor
134079182385SBram Moolenaarenddef
134179182385SBram Moolenaar
134279182385SBram Moolenaardef Test_expr5_vim9script_channel()
134379182385SBram Moolenaar  if !has('channel')
134479182385SBram Moolenaar    MissingFeature 'float'
134579182385SBram Moolenaar  else
134637ce6d3aSBram Moolenaar    var lines =<< trim END
1347418f1df5SBram Moolenaar        echo 'a' .. test_null_job()
1348418f1df5SBram Moolenaar    END
134990193e61SBram Moolenaar    CheckDefAndScriptFailure2(lines, 'E1105:', 'E908:', 1)
1350418f1df5SBram Moolenaar    lines =<< trim END
1351418f1df5SBram Moolenaar        echo 'a' .. test_null_channel()
1352418f1df5SBram Moolenaar    END
135390193e61SBram Moolenaar    CheckDefAndScriptFailure2(lines, 'E1105:', 'E908:', 1)
135479182385SBram Moolenaar  endif
13555409f5d8SBram Moolenaarenddef
13565409f5d8SBram Moolenaar
13578a7d6542SBram Moolenaardef Test_expr5_float()
13587f829cabSBram Moolenaar  if !has('float')
13597f829cabSBram Moolenaar    MissingFeature 'float'
13607f829cabSBram Moolenaar  else
1361659bb227SBram Moolenaar    var lines =<< trim END
13628a7d6542SBram Moolenaar        assert_equal(66.0, 60.0 + 6.0)
13638a7d6542SBram Moolenaar        assert_equal(66.0, 60.0 + 6)
13649c7e6dd6SBram Moolenaar        assert_equal(66.0, 60 +
13659c7e6dd6SBram Moolenaar                             6.0)
136667fbdfefSBram Moolenaar        assert_equal(5.1, g:afloat
136767fbdfefSBram Moolenaar                            + 5)
13688a7d6542SBram Moolenaar        assert_equal(8.1, 8 + g:afloat)
13698a7d6542SBram Moolenaar        assert_equal(10.1, g:anint + g:afloat)
13708a7d6542SBram Moolenaar        assert_equal(10.1, g:afloat + g:anint)
13718a7d6542SBram Moolenaar
13728a7d6542SBram Moolenaar        assert_equal(54.0, 60.0 - 6.0)
137367fbdfefSBram Moolenaar        assert_equal(54.0, 60.0
137467fbdfefSBram Moolenaar                                - 6)
13758a7d6542SBram Moolenaar        assert_equal(54.0, 60 - 6.0)
13768a7d6542SBram Moolenaar        assert_equal(-4.9, g:afloat - 5)
13778a7d6542SBram Moolenaar        assert_equal(7.9, 8 - g:afloat)
13788a7d6542SBram Moolenaar        assert_equal(9.9, g:anint - g:afloat)
13798a7d6542SBram Moolenaar        assert_equal(-9.9, g:afloat - g:anint)
1380659bb227SBram Moolenaar    END
1381659bb227SBram Moolenaar    CheckDefAndScriptSuccess(lines)
13827f829cabSBram Moolenaar  endif
13838a7d6542SBram Moolenaarenddef
13848a7d6542SBram Moolenaar
13858a7d6542SBram Moolenaarfunc Test_expr5_fails()
13867707228aSBram Moolenaar  let msg = "White space required before and after '+'"
138790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1+2"], msg, 1)
138890193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 +2"], msg, 1)
138990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1+ 2"], msg, 1)
13908a7d6542SBram Moolenaar
13917707228aSBram Moolenaar  let msg = "White space required before and after '-'"
139290193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1-2"], msg, 1)
139390193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 -2"], msg, 1)
139490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1- 2"], msg, 1)
13958a7d6542SBram Moolenaar
13967707228aSBram Moolenaar  let msg = "White space required before and after '..'"
139790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1'..'2'"], msg, 1)
139890193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1' ..'2'"], msg, 1)
139990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1'.. '2'"], msg, 1)
14000062c2d4SBram Moolenaar
140190193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 0z1122 + 33"], 'E1051:', 'E974:', 1)
140290193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 0z1122 + [3]"], 'E1051:', 'E974:', 1)
140390193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 0z1122 + 'asd'"], 'E1051:', 'E974:', 1)
140490193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 33 + 0z1122"], 'E1051:', 'E974:', 1)
140590193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = [3] + 0z1122"], 'E1051:', 'E745:', 1)
140690193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'asdf' + 0z1122"], 'E1051:', 'E1030:', 1)
140790193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 6 + xxx"], 'E1001:', 'E121:', 1)
1408418f1df5SBram Moolenaar
140990193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'a' .. [1]"], 'E1105:', 'E730:', 1)
141090193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'a' .. {a: 1}"], 'E1105:', 'E731:', 1)
141190193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'a' .. test_void()"], 'E1105:', 'E908:', 1)
141290193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'a' .. 0z32"], 'E1105:', 'E976:', 1)
141390193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'a' .. function('len')"], 'E1105:', 'E729:', 1)
141490193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'a' .. function('len', ['a'])"], 'E1105:', 'E729:', 1)
1415d92cc130SBram Moolenaar
141690193e61SBram Moolenaar  call CheckDefAndScriptFailure2(['var x = 1 + v:none'], 'E1051:', 'E611:', 1)
141790193e61SBram Moolenaar  call CheckDefAndScriptFailure2(['var x = 1 + v:null'], 'E1051:', 'E611:', 1)
141890193e61SBram Moolenaar  call CheckDefAndScriptFailure2(['var x = 1 + v:true'], 'E1051:', 'E1138:', 1)
141990193e61SBram Moolenaar  call CheckDefAndScriptFailure2(['var x = 1 + v:false'], 'E1051:', 'E1138:', 1)
142090193e61SBram Moolenaar  call CheckDefAndScriptFailure2(['var x = 1 + true'], 'E1051:', 'E1138:', 1)
142190193e61SBram Moolenaar  call CheckDefAndScriptFailure2(['var x = 1 + false'], 'E1051:', 'E1138:', 1)
142279182385SBram Moolenaarendfunc
142379182385SBram Moolenaar
142479182385SBram Moolenaarfunc Test_expr5_fails_channel()
142579182385SBram Moolenaar  CheckFeature channel
142690193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'a' .. test_null_job()"], 'E1105:', 'E908:', 1)
142790193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'a' .. test_null_channel()"], 'E1105:', 'E908:', 1)
14288a7d6542SBram Moolenaarendfunc
14298a7d6542SBram Moolenaar
1430399ea810SBram Moolenaardef Test_expr5_list_add()
143190193e61SBram Moolenaar  var lines =<< trim END
1432399ea810SBram Moolenaar      # concatenating two lists with same member types is OK
1433399ea810SBram Moolenaar      var d = {}
1434399ea810SBram Moolenaar      for i in ['a'] + ['b']
1435399ea810SBram Moolenaar        d = {[i]: 0}
1436399ea810SBram Moolenaar      endfor
1437399ea810SBram Moolenaar
1438399ea810SBram Moolenaar      # concatenating two lists with different member types results in "any"
14392e5910bfSBram Moolenaar      var dany = {}
14402e5910bfSBram Moolenaar      for i in ['a'] + [12]
14412e5910bfSBram Moolenaar        dany[i] = i
1442399ea810SBram Moolenaar      endfor
14432e5910bfSBram Moolenaar      assert_equal({a: 'a', 12: 12}, dany)
1444d345fb92SBram Moolenaar
1445d345fb92SBram Moolenaar      # result of glob() is "any", runtime type check
1446d345fb92SBram Moolenaar      var sl: list<string> = glob('*.txt', false, true) + ['']
144790193e61SBram Moolenaar  END
144890193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1449399ea810SBram Moolenaarenddef
1450399ea810SBram Moolenaar
14518a7d6542SBram Moolenaar" test multiply, divide, modulo
14528a7d6542SBram Moolenaardef Test_expr6()
1453659bb227SBram Moolenaar  var lines =<< trim END
14548a7d6542SBram Moolenaar      assert_equal(36, 6 * 6)
14559c7e6dd6SBram Moolenaar      assert_equal(24, 6 *
145656acb094SBram Moolenaar                            g:thefour)
145756acb094SBram Moolenaar      assert_equal(24, g:thefour
145867fbdfefSBram Moolenaar                            * 6)
145956acb094SBram Moolenaar      assert_equal(40, g:anint * g:thefour)
14608a7d6542SBram Moolenaar
14618a7d6542SBram Moolenaar      assert_equal(10, 60 / 6)
14629c7e6dd6SBram Moolenaar      assert_equal(6, 60 /
14639c7e6dd6SBram Moolenaar                            g:anint)
14648a7d6542SBram Moolenaar      assert_equal(1, g:anint / 6)
146567fbdfefSBram Moolenaar      assert_equal(2, g:anint
146656acb094SBram Moolenaar                            / g:thefour)
14678a7d6542SBram Moolenaar
14688a7d6542SBram Moolenaar      assert_equal(5, 11 % 6)
14698a7d6542SBram Moolenaar      assert_equal(4, g:anint % 6)
14709c7e6dd6SBram Moolenaar      assert_equal(3, 13 %
14719c7e6dd6SBram Moolenaar                            g:anint)
147267fbdfefSBram Moolenaar      assert_equal(2, g:anint
147356acb094SBram Moolenaar                            % g:thefour)
14748a7d6542SBram Moolenaar
14758a7d6542SBram Moolenaar      assert_equal(4, 6 * 4 / 6)
1476b13af50fSBram Moolenaar
147737ce6d3aSBram Moolenaar      var x = [2]
147837ce6d3aSBram Moolenaar      var y = [3]
1479b13af50fSBram Moolenaar      assert_equal(5, x[0] + y[0])
1480b13af50fSBram Moolenaar      assert_equal(6, x[0] * y[0])
1481b13af50fSBram Moolenaar      if has('float')
148237ce6d3aSBram Moolenaar        var xf = [2.0]
148337ce6d3aSBram Moolenaar        var yf = [3.0]
148467fbdfefSBram Moolenaar        assert_equal(5.0, xf[0]
148567fbdfefSBram Moolenaar                            + yf[0])
148667fbdfefSBram Moolenaar        assert_equal(6.0, xf[0]
148767fbdfefSBram Moolenaar                            * yf[0])
1488b13af50fSBram Moolenaar      endif
1489659bb227SBram Moolenaar  END
1490659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
149192dba36fSBram Moolenaar
149290193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var x = 6 * xxx"], 'E1001:', 'E121:', 1)
14938ff16e01SBram Moolenaar  CheckDefFailure(["var d = 6 * "], 'E1097:', 3)
149490193e61SBram Moolenaar  CheckScriptFailure(['vim9script', "var d = 6 * "], 'E15:', 2)
149599880f96SBram Moolenaar
149699880f96SBram Moolenaar  CheckDefExecAndScriptFailure(['echo 1 / 0'], 'E1154', 1)
149799880f96SBram Moolenaar  CheckDefExecAndScriptFailure(['echo 1 % 0'], 'E1154', 1)
14988a7d6542SBram Moolenaarenddef
14998a7d6542SBram Moolenaar
15005409f5d8SBram Moolenaardef Test_expr6_vim9script()
1501b4caa163SBram Moolenaar  # check line continuation
150237ce6d3aSBram Moolenaar  var lines =<< trim END
15039830938eSBram Moolenaar      var name = 11
15045409f5d8SBram Moolenaar      		* 22
15055409f5d8SBram Moolenaar		/ 3
15069830938eSBram Moolenaar      assert_equal(80, name)
15075409f5d8SBram Moolenaar  END
150890193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
15095409f5d8SBram Moolenaar
15105409f5d8SBram Moolenaar  lines =<< trim END
15119830938eSBram Moolenaar      var name = 25
15125409f5d8SBram Moolenaar      		% 10
15139830938eSBram Moolenaar      assert_equal(5, name)
15145409f5d8SBram Moolenaar  END
151590193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1516b4caa163SBram Moolenaar
1517b4caa163SBram Moolenaar  lines =<< trim END
151893be1644SBram Moolenaar      var name = 25
151993be1644SBram Moolenaar                # comment
152093be1644SBram Moolenaar
152193be1644SBram Moolenaar                # comment
152293be1644SBram Moolenaar      		% 10
152393be1644SBram Moolenaar      assert_equal(5, name)
152493be1644SBram Moolenaar  END
152590193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
152693be1644SBram Moolenaar
152793be1644SBram Moolenaar  lines =<< trim END
15289830938eSBram Moolenaar      var name = 11 *
1529b4caa163SBram Moolenaar      		22 /
1530b4caa163SBram Moolenaar		3
15319830938eSBram Moolenaar      assert_equal(80, name)
1532b4caa163SBram Moolenaar  END
153390193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1534b4caa163SBram Moolenaar
1535b4caa163SBram Moolenaar  # check white space
1536b4caa163SBram Moolenaar  lines =<< trim END
1537b4caa163SBram Moolenaar      echo 5*6
1538b4caa163SBram Moolenaar  END
153990193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
154090193e61SBram Moolenaar
1541b4caa163SBram Moolenaar  lines =<< trim END
1542b4caa163SBram Moolenaar      echo 5 *6
1543b4caa163SBram Moolenaar  END
154490193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
154590193e61SBram Moolenaar
1546b4caa163SBram Moolenaar  lines =<< trim END
1547b4caa163SBram Moolenaar      echo 5* 6
1548b4caa163SBram Moolenaar  END
154990193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
15505409f5d8SBram Moolenaarenddef
15515409f5d8SBram Moolenaar
15528a7d6542SBram Moolenaardef Test_expr6_float()
15537f829cabSBram Moolenaar  if !has('float')
15547f829cabSBram Moolenaar    MissingFeature 'float'
15557f829cabSBram Moolenaar  else
1556659bb227SBram Moolenaar    var lines =<< trim END
15578a7d6542SBram Moolenaar        assert_equal(36.0, 6.0 * 6)
15589c7e6dd6SBram Moolenaar        assert_equal(36.0, 6 *
15599c7e6dd6SBram Moolenaar                               6.0)
15608a7d6542SBram Moolenaar        assert_equal(36.0, 6.0 * 6.0)
15618a7d6542SBram Moolenaar        assert_equal(1.0, g:afloat * g:anint)
15628a7d6542SBram Moolenaar
15638a7d6542SBram Moolenaar        assert_equal(10.0, 60 / 6.0)
15649c7e6dd6SBram Moolenaar        assert_equal(10.0, 60.0 /
15659c7e6dd6SBram Moolenaar                            6)
15668a7d6542SBram Moolenaar        assert_equal(10.0, 60.0 / 6.0)
15678a7d6542SBram Moolenaar        assert_equal(0.01, g:afloat / g:anint)
15688a7d6542SBram Moolenaar
15698a7d6542SBram Moolenaar        assert_equal(4.0, 6.0 * 4 / 6)
15709c7e6dd6SBram Moolenaar        assert_equal(4.0, 6 *
15719c7e6dd6SBram Moolenaar                            4.0 /
15729c7e6dd6SBram Moolenaar                            6)
15738a7d6542SBram Moolenaar        assert_equal(4.0, 6 * 4 / 6.0)
15748a7d6542SBram Moolenaar        assert_equal(4.0, 6.0 * 4.0 / 6)
15758a7d6542SBram Moolenaar        assert_equal(4.0, 6 * 4.0 / 6.0)
15768a7d6542SBram Moolenaar        assert_equal(4.0, 6.0 * 4 / 6.0)
15778a7d6542SBram Moolenaar        assert_equal(4.0, 6.0 * 4.0 / 6.0)
15788a7d6542SBram Moolenaar
15798a7d6542SBram Moolenaar        assert_equal(4.0, 6.0 * 4.0 / 6.0)
1580659bb227SBram Moolenaar    END
1581659bb227SBram Moolenaar    CheckDefAndScriptSuccess(lines)
15827f829cabSBram Moolenaar  endif
15838a7d6542SBram Moolenaarenddef
15848a7d6542SBram Moolenaar
15858a7d6542SBram Moolenaarfunc Test_expr6_fails()
15867707228aSBram Moolenaar  let msg = "White space required before and after '*'"
158790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1*2"], msg, 1)
158890193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 *2"], msg, 1)
158990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1* 2"], msg, 1)
15908a7d6542SBram Moolenaar
15917707228aSBram Moolenaar  let msg = "White space required before and after '/'"
159290193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1/2"], msg, 1)
159390193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 /2"], msg, 1)
159490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1/ 2"], msg, 1)
15958a7d6542SBram Moolenaar
15967707228aSBram Moolenaar  let msg = "White space required before and after '%'"
159790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1%2"], msg, 1)
159890193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 %2"], msg, 1)
159990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1% 2"], msg, 1)
16008a7d6542SBram Moolenaar
160190193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = '1' * '2'"], 'E1036:', 'E1030:', 1)
160290193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = '1' / '2'"], 'E1036:', 'E1030:', 1)
160390193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = '1' % '2'"], 'E1035:', 'E1030:', 1)
16048a7d6542SBram Moolenaar
160590193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 0z01 * 0z12"], 'E1036:', 'E974:', 1)
160690193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 0z01 / 0z12"], 'E1036:', 'E974:', 1)
160790193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 0z01 % 0z12"], 'E1035:', 'E974:', 1)
16088a7d6542SBram Moolenaar
160990193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = [1] * [2]"], 'E1036:', 'E745:', 1)
161090193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = [1] / [2]"], 'E1036:', 'E745:', 1)
161190193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = [1] % [2]"], 'E1035:', 'E745:', 1)
16128a7d6542SBram Moolenaar
161390193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = {one: 1} * {two: 2}"], 'E1036:', 'E728:', 1)
161490193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = {one: 1} / {two: 2}"], 'E1036:', 'E728:', 1)
161590193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = {one: 1} % {two: 2}"], 'E1035:', 'E728:', 1)
16168a7d6542SBram Moolenaar
161790193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 0xff[1]"], 'E1107:', 'E1062:', 1)
1618b13af50fSBram Moolenaar  if has('float')
161990193e61SBram Moolenaar    call CheckDefAndScriptFailure2(["var x = 0.7[1]"], 'E1107:', 'E806:', 1)
1620b13af50fSBram Moolenaar  endif
16214ac198c6Smityu
16224ac198c6Smityu  for op in ['*', '/', '%']
16234ac198c6Smityu    let lines = ['var x = 1', op .. '2', '# comment']
16244ac198c6Smityu    let msg = printf("E1004: White space required before and after '%s' at \"%s2\"", op, op)
16254ac198c6Smityu    call CheckDefAndScriptFailure(lines, msg, 2)
16264ac198c6Smityu  endfor
16278a7d6542SBram Moolenaarendfunc
16288a7d6542SBram Moolenaar
16298a7d6542SBram Moolenaarfunc Test_expr6_float_fails()
16308a7d6542SBram Moolenaar  CheckFeature float
163190193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 1.0 % 2"], 'E1035:', 'E804:', 1)
16328a7d6542SBram Moolenaarendfunc
16338a7d6542SBram Moolenaar
16348a7d6542SBram Moolenaar" define here to use old style parsing
16358a7d6542SBram Moolenaarif has('float')
16368a7d6542SBram Moolenaar  let g:float_zero = 0.0
16378a7d6542SBram Moolenaar  let g:float_neg = -9.8
16388a7d6542SBram Moolenaar  let g:float_big = 9.9e99
16398a7d6542SBram Moolenaarendif
16408a7d6542SBram Moolenaarlet g:blob_empty = 0z
16418a7d6542SBram Moolenaarlet g:blob_one = 0z01
16428a7d6542SBram Moolenaarlet g:blob_long = 0z0102.0304
16438a7d6542SBram Moolenaar
16448a7d6542SBram Moolenaarlet g:string_empty = ''
16458a7d6542SBram Moolenaarlet g:string_short = 'x'
16468a7d6542SBram Moolenaarlet g:string_long = 'abcdefghijklm'
16478a7d6542SBram Moolenaarlet g:string_special = "ab\ncd\ref\ekk"
16488a7d6542SBram Moolenaar
16498a7d6542SBram Moolenaarlet g:special_true = v:true
16508a7d6542SBram Moolenaarlet g:special_false = v:false
16518a7d6542SBram Moolenaarlet g:special_null = v:null
16528a7d6542SBram Moolenaarlet g:special_none = v:none
16538a7d6542SBram Moolenaar
16548a7d6542SBram Moolenaarlet g:list_empty = []
16558a7d6542SBram Moolenaarlet g:list_mixed = [1, 'b', v:false]
16568a7d6542SBram Moolenaar
16578a7d6542SBram Moolenaarlet g:dict_empty = {}
16588a7d6542SBram Moolenaarlet g:dict_one = #{one: 1}
16598a7d6542SBram Moolenaar
16608a7d6542SBram Moolenaarlet $TESTVAR = 'testvar'
16618a7d6542SBram Moolenaar
166264d662d5SBram Moolenaar" type casts
166364d662d5SBram Moolenaardef Test_expr7t()
1664459fbdbfSBram Moolenaar  var lines =<< trim END
166537ce6d3aSBram Moolenaar      var ls: list<string> = ['a', <string>g:string_empty]
166637ce6d3aSBram Moolenaar      var ln: list<number> = [<number>g:anint, <number>g:thefour]
166737ce6d3aSBram Moolenaar      var nr = <number>234
1668d1103587SBram Moolenaar      assert_equal(234, nr)
166934fcb697SYegappan Lakshmanan      var b: bool = <bool>1
167034fcb697SYegappan Lakshmanan      assert_equal(true, b)
1671459fbdbfSBram Moolenaar      var text =
1672459fbdbfSBram Moolenaar            <string>
1673459fbdbfSBram Moolenaar              'text'
1674459fbdbfSBram Moolenaar      if false
1675459fbdbfSBram Moolenaar        text = <number>'xxx'
1676459fbdbfSBram Moolenaar      endif
1677459fbdbfSBram Moolenaar  END
1678459fbdbfSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1679d1103587SBram Moolenaar
1680459fbdbfSBram Moolenaar  CheckDefAndScriptFailure(["var x = <nr>123"], 'E1010:', 1)
16818ff16e01SBram Moolenaar  CheckDefFailure(["var x = <number>"], 'E1097:', 3)
168234fcb697SYegappan Lakshmanan  CheckDefFailure(["var x = <number>string(1)"], 'E1012:', 1)
168390193e61SBram Moolenaar  CheckScriptFailure(['vim9script', "var x = <number>"], 'E15:', 2)
1684459fbdbfSBram Moolenaar  CheckDefAndScriptFailure(["var x = <number >123"], 'E1068:', 1)
1685459fbdbfSBram Moolenaar  CheckDefAndScriptFailure(["var x = <number 123"], 'E1104:', 1)
168664d662d5SBram Moolenaarenddef
168764d662d5SBram Moolenaar
16888a7d6542SBram Moolenaar" test low level expression
16898a7d6542SBram Moolenaardef Test_expr7_number()
1690f5be8cdbSBram Moolenaar  # number constant
1691659bb227SBram Moolenaar  var lines =<< trim END
16928a7d6542SBram Moolenaar      assert_equal(0, 0)
16938a7d6542SBram Moolenaar      assert_equal(654, 0654)
16948a7d6542SBram Moolenaar
16958a7d6542SBram Moolenaar      assert_equal(6, 0x6)
16968a7d6542SBram Moolenaar      assert_equal(15, 0xf)
16978a7d6542SBram Moolenaar      assert_equal(255, 0xff)
1698659bb227SBram Moolenaar  END
1699659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
17008a7d6542SBram Moolenaarenddef
17018a7d6542SBram Moolenaar
17028a7d6542SBram Moolenaardef Test_expr7_float()
1703f5be8cdbSBram Moolenaar  # float constant
17047f829cabSBram Moolenaar  if !has('float')
17057f829cabSBram Moolenaar    MissingFeature 'float'
17067f829cabSBram Moolenaar  else
1707659bb227SBram Moolenaar    var lines =<< trim END
17088a7d6542SBram Moolenaar        assert_equal(g:float_zero, .0)
17098a7d6542SBram Moolenaar        assert_equal(g:float_zero, 0.0)
17108a7d6542SBram Moolenaar        assert_equal(g:float_neg, -9.8)
17118a7d6542SBram Moolenaar        assert_equal(g:float_big, 9.9e99)
1712659bb227SBram Moolenaar    END
1713659bb227SBram Moolenaar    CheckDefAndScriptSuccess(lines)
17148a7d6542SBram Moolenaar  endif
17158a7d6542SBram Moolenaarenddef
17168a7d6542SBram Moolenaar
17178a7d6542SBram Moolenaardef Test_expr7_blob()
1718f5be8cdbSBram Moolenaar  # blob constant
1719659bb227SBram Moolenaar  var lines =<< trim END
17208a7d6542SBram Moolenaar      assert_equal(g:blob_empty, 0z)
17218a7d6542SBram Moolenaar      assert_equal(g:blob_one, 0z01)
17228a7d6542SBram Moolenaar      assert_equal(g:blob_long, 0z0102.0304)
1723cfc3023cSBram Moolenaar
1724cfc3023cSBram Moolenaar      var testblob = 0z010203
1725cfc3023cSBram Moolenaar      assert_equal(0x01, testblob[0])
1726cfc3023cSBram Moolenaar      assert_equal(0x02, testblob[1])
1727cfc3023cSBram Moolenaar      assert_equal(0x03, testblob[-1])
1728cfc3023cSBram Moolenaar      assert_equal(0x02, testblob[-2])
1729cfc3023cSBram Moolenaar
1730cfc3023cSBram Moolenaar      assert_equal(0z01, testblob[0 : 0])
1731cfc3023cSBram Moolenaar      assert_equal(0z0102, testblob[0 : 1])
1732cfc3023cSBram Moolenaar      assert_equal(0z010203, testblob[0 : 2])
1733cfc3023cSBram Moolenaar      assert_equal(0z010203, testblob[0 : ])
1734cfc3023cSBram Moolenaar      assert_equal(0z0203, testblob[1 : ])
1735cfc3023cSBram Moolenaar      assert_equal(0z0203, testblob[1 : 2])
1736cfc3023cSBram Moolenaar      assert_equal(0z0203, testblob[1 : -1])
1737cfc3023cSBram Moolenaar      assert_equal(0z03, testblob[-1 : -1])
1738cfc3023cSBram Moolenaar      assert_equal(0z02, testblob[-2 : -2])
1739cfc3023cSBram Moolenaar
1740cfc3023cSBram Moolenaar      # blob slice accepts out of range
1741cfc3023cSBram Moolenaar      assert_equal(0z, testblob[3 : 3])
1742cfc3023cSBram Moolenaar      assert_equal(0z, testblob[0 : -4])
1743659bb227SBram Moolenaar  END
1744659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
174592dba36fSBram Moolenaar
174690193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = 0z123"], 'E973:', 1)
17478a7d6542SBram Moolenaarenddef
17488a7d6542SBram Moolenaar
17498a7d6542SBram Moolenaardef Test_expr7_string()
1750f5be8cdbSBram Moolenaar  # string constant
1751659bb227SBram Moolenaar  var lines =<< trim END
17528a7d6542SBram Moolenaar      assert_equal(g:string_empty, '')
17538a7d6542SBram Moolenaar      assert_equal(g:string_empty, "")
17548a7d6542SBram Moolenaar      assert_equal(g:string_short, 'x')
17558a7d6542SBram Moolenaar      assert_equal(g:string_short, "x")
17568a7d6542SBram Moolenaar      assert_equal(g:string_long, 'abcdefghijklm')
17578a7d6542SBram Moolenaar      assert_equal(g:string_long, "abcdefghijklm")
17588a7d6542SBram Moolenaar      assert_equal(g:string_special, "ab\ncd\ref\ekk")
1759659bb227SBram Moolenaar  END
1760659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
176192dba36fSBram Moolenaar
176290193e61SBram Moolenaar  CheckDefAndScriptFailure(['var x = "abc'], 'E114:', 1)
176390193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = 'abc"], 'E115:', 1)
17648a7d6542SBram Moolenaarenddef
17658a7d6542SBram Moolenaar
17665da356e0SBram Moolenaardef Test_expr7_vimvar()
176737ce6d3aSBram Moolenaar  var old: list<string> = v:oldfiles
176837ce6d3aSBram Moolenaar  var compl: dict<any> = v:completed_item
17695da356e0SBram Moolenaar
177037ce6d3aSBram Moolenaar  CheckDefFailure(["var old: list<number> = v:oldfiles"], 'E1012: Type mismatch; expected list<number> but got list<string>', 1)
177190193e61SBram Moolenaar  CheckScriptFailure(['vim9script', 'v:oldfiles = ["foo"]', "var old: list<number> = v:oldfiles"], 'E1012: Type mismatch; expected list<number> but got list<string>', 3)
17725e654230SBram Moolenaar  new
17735e654230SBram Moolenaar  exec "normal! afoo fo\<C-N>\<Esc>"
177490193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var old: dict<number> = v:completed_item"], 'E1012: Type mismatch; expected dict<number> but got dict<string>', 1)
17755e654230SBram Moolenaar  bwipe!
17765da356e0SBram Moolenaarenddef
17775da356e0SBram Moolenaar
17788a7d6542SBram Moolenaardef Test_expr7_special()
1779f5be8cdbSBram Moolenaar  # special constant
1780659bb227SBram Moolenaar  var lines =<< trim END
17818a7d6542SBram Moolenaar      assert_equal(g:special_true, true)
17828a7d6542SBram Moolenaar      assert_equal(g:special_false, false)
17835da356e0SBram Moolenaar      assert_equal(g:special_true, v:true)
17845da356e0SBram Moolenaar      assert_equal(g:special_false, v:false)
1785659bb227SBram Moolenaar      assert_equal(v:true, true)
1786659bb227SBram Moolenaar      assert_equal(v:false, false)
17876e4cfffeSBram Moolenaar
17886e4cfffeSBram Moolenaar      assert_equal(true, !false)
17896e4cfffeSBram Moolenaar      assert_equal(false, !true)
17906e4cfffeSBram Moolenaar      assert_equal(true, !0)
17916e4cfffeSBram Moolenaar      assert_equal(false, !1)
17926e4cfffeSBram Moolenaar      assert_equal(false, !!false)
17936e4cfffeSBram Moolenaar      assert_equal(true, !!true)
17946e4cfffeSBram Moolenaar      assert_equal(false, !!0)
17956e4cfffeSBram Moolenaar      assert_equal(true, !!1)
17966e4cfffeSBram Moolenaar
1797659bb227SBram Moolenaar      var t = true
1798659bb227SBram Moolenaar      var f = false
1799659bb227SBram Moolenaar      assert_equal(true, t)
1800659bb227SBram Moolenaar      assert_equal(false, f)
1801659bb227SBram Moolenaar
18028a7d6542SBram Moolenaar      assert_equal(g:special_null, v:null)
180367977821SBram Moolenaar      assert_equal(g:special_null, null)
18048a7d6542SBram Moolenaar      assert_equal(g:special_none, v:none)
1805659bb227SBram Moolenaar  END
1806659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
18075da356e0SBram Moolenaar
180890193e61SBram Moolenaar  CheckDefAndScriptFailure(['v:true = true'], 'E46:', 1)
180990193e61SBram Moolenaar  CheckDefAndScriptFailure(['v:true = false'], 'E46:', 1)
181090193e61SBram Moolenaar  CheckDefAndScriptFailure(['v:false = true'], 'E46:', 1)
181190193e61SBram Moolenaar  CheckDefAndScriptFailure(['v:null = 11'], 'E46:', 1)
181290193e61SBram Moolenaar  CheckDefAndScriptFailure(['v:none = 22'], 'E46:', 1)
18138a7d6542SBram Moolenaarenddef
18148a7d6542SBram Moolenaar
18158a7d6542SBram Moolenaardef Test_expr7_list()
1816f5be8cdbSBram Moolenaar  # list
1817659bb227SBram Moolenaar  var lines =<< trim END
18188a7d6542SBram Moolenaar      assert_equal(g:list_empty, [])
18198a7d6542SBram Moolenaar      assert_equal(g:list_empty, [  ])
1820127542bcSBram Moolenaar
182137ce6d3aSBram Moolenaar      var numbers: list<number> = [1, 2, 3]
1822127542bcSBram Moolenaar      numbers = [1]
1823127542bcSBram Moolenaar      numbers = []
1824127542bcSBram Moolenaar
182537ce6d3aSBram Moolenaar      var strings: list<string> = ['a', 'b', 'c']
1826127542bcSBram Moolenaar      strings = ['x']
1827127542bcSBram Moolenaar      strings = []
1828127542bcSBram Moolenaar
182937ce6d3aSBram Moolenaar      var mixed: list<any> = [1, 'b', false,]
1830127542bcSBram Moolenaar      assert_equal(g:list_mixed, mixed)
183156acb094SBram Moolenaar      assert_equal('b', mixed[1])
18320062c2d4SBram Moolenaar
1833badd8486SBram Moolenaar      echo [1,
1834badd8486SBram Moolenaar            2] [3,
1835badd8486SBram Moolenaar                    4]
1836badd8486SBram Moolenaar
183737ce6d3aSBram Moolenaar      var llstring: list<list<string>> = [['text'], []]
183877b20977SBram Moolenaar      llstring = [[], ['text']]
183977b20977SBram Moolenaar      llstring = [[], []]
1840659bb227SBram Moolenaar  END
1841659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
184277b20977SBram Moolenaar
18435597ba04SBram Moolenaar  var rangelist: list<number> = range(3)
18445597ba04SBram Moolenaar  g:rangelist = range(3)
184590193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var x: list<string> = g:rangelist"], 'E1012: Type mismatch; expected list<string> but got list<number>', 1)
18465597ba04SBram Moolenaar
184790193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var x = 1234[3]"], 'E1107:', 'E1062:', 1)
184890193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var x = g:anint[3]"], 'E1062:', 1)
184956acb094SBram Moolenaar
185090193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var x = g:list_mixed[xxx]"], 'E1001:', 'E121:', 1)
1851db199216SBram Moolenaar
185290193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = [1,2,3]"], 'E1069:', 1)
185390193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = [1 ,2, 3]"], 'E1068:', 1)
1854db199216SBram Moolenaar
185590193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["echo 1", "var x = [][0]", "echo 3"], 'E684:', 2)
18561d634542SBram Moolenaar
185790193e61SBram Moolenaar  CheckDefExecAndScriptFailure2(["var x = g:list_mixed['xx']"], 'E1012:', 'E1030:', 1)
18588ff16e01SBram Moolenaar  CheckDefFailure(["var x = g:list_mixed["], 'E1097:', 3)
185990193e61SBram Moolenaar  CheckScriptFailure(['vim9script', "var x = g:list_mixed["], 'E15:', 2)
18608ff16e01SBram Moolenaar  CheckDefFailure(["var x = g:list_mixed[0"], 'E1097:', 3)
186190193e61SBram Moolenaar  CheckScriptFailure(['vim9script', "var x = g:list_mixed[0"], 'E111:', 2)
186290193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var x = g:list_empty[3]"], 'E684:', 1)
186390193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var l: list<number> = [234, 'x']"], 'E1012:', 1)
186490193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var l: list<number> = ['x', 234]"], 'E1012:', 1)
186590193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var l: list<string> = [234, 'x']"], 'E1012:', 1)
186690193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var l: list<string> = ['x', 123]"], 'E1012:', 1)
1867c1f0066bSBram Moolenaar
1868659bb227SBram Moolenaar  lines =<< trim END
1869c1f0066bSBram Moolenaar      var datalist: list<string>
1870c1f0066bSBram Moolenaar      def Main()
1871c1f0066bSBram Moolenaar        datalist += ['x'.
1872c1f0066bSBram Moolenaar      enddef
1873c1f0066bSBram Moolenaar      Main()
1874c1f0066bSBram Moolenaar  END
187590193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1127:')
1876de4f95b0SBram Moolenaar
1877de4f95b0SBram Moolenaar  lines =<< trim END
1878de4f95b0SBram Moolenaar      var numbers = [1, 2, 3, 4]
1879de4f95b0SBram Moolenaar      var a = 1
1880de4f95b0SBram Moolenaar      var b = 2
1881de4f95b0SBram Moolenaar  END
1882e7a73e07SBram Moolenaar  CheckDefAndScriptFailure(lines + ['echo numbers[1:b]'],
1883e7a73e07SBram Moolenaar      'E1004: White space required before and after '':'' at ":b]"', 4)
1884de4f95b0SBram Moolenaar  CheckDefAndScriptFailure(lines + ['echo numbers[1: b]'], 'E1004:', 4)
1885de4f95b0SBram Moolenaar  CheckDefAndScriptFailure(lines + ['echo numbers[a :b]'], 'E1004:', 4)
18868a7d6542SBram Moolenaarenddef
18878a7d6542SBram Moolenaar
18887147820cSBram Moolenaardef Test_expr7_list_vim9script()
188937ce6d3aSBram Moolenaar  var lines =<< trim END
189037ce6d3aSBram Moolenaar      var l = [
18917147820cSBram Moolenaar		11,
18927147820cSBram Moolenaar		22,
18937147820cSBram Moolenaar		]
18947147820cSBram Moolenaar      assert_equal([11, 22], l)
1895badd8486SBram Moolenaar
1896badd8486SBram Moolenaar      echo [1,
1897badd8486SBram Moolenaar	    2] [3,
1898badd8486SBram Moolenaar		    4]
189993be1644SBram Moolenaar
190093be1644SBram Moolenaar      echo [1, # comment
190193be1644SBram Moolenaar            # comment
190293be1644SBram Moolenaar	    2] [3,
190393be1644SBram Moolenaar            # comment
190493be1644SBram Moolenaar		    4]
19057147820cSBram Moolenaar  END
190690193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
19077147820cSBram Moolenaar
19087147820cSBram Moolenaar  lines =<< trim END
190937ce6d3aSBram Moolenaar      var l = [11,
19107147820cSBram Moolenaar		22]
19117147820cSBram Moolenaar      assert_equal([11, 22], l)
19127147820cSBram Moolenaar  END
191390193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
19148ea9390bSBram Moolenaar
19158ea9390bSBram Moolenaar  lines =<< trim END
191637ce6d3aSBram Moolenaar      var l = [11,22]
19178ea9390bSBram Moolenaar  END
191890193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1069:', 1)
1919db199216SBram Moolenaar
1920db199216SBram Moolenaar  lines =<< trim END
192137ce6d3aSBram Moolenaar      var l = [11 , 22]
1922db199216SBram Moolenaar  END
192390193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1068:', 1)
192441fab3eaSBram Moolenaar
192541fab3eaSBram Moolenaar  lines =<< trim END
192637ce6d3aSBram Moolenaar    var l: list<number> = [234, 'x']
192741fab3eaSBram Moolenaar  END
192890193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012:', 1)
19299c13f762SBram Moolenaar
19309c13f762SBram Moolenaar  lines =<< trim END
193190193e61SBram Moolenaar    var l: list<number> = ['x', 234]
193290193e61SBram Moolenaar  END
193390193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012:', 1)
193490193e61SBram Moolenaar
193590193e61SBram Moolenaar  lines =<< trim END
193690193e61SBram Moolenaar    var l: list<string> = ['x', 234]
193790193e61SBram Moolenaar  END
193890193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012:', 1)
193990193e61SBram Moolenaar
194090193e61SBram Moolenaar  lines =<< trim END
194190193e61SBram Moolenaar    var l: list<string> = [234, 'x']
194290193e61SBram Moolenaar  END
194390193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012:', 1)
194490193e61SBram Moolenaar
194590193e61SBram Moolenaar  lines =<< trim END
19469c13f762SBram Moolenaar      def Failing()
19479c13f762SBram Moolenaar        job_stop()
19489c13f762SBram Moolenaar      enddef
19499c13f762SBram Moolenaar      var list = [Failing]
19509c13f762SBram Moolenaar  END
195146f479c7SBram Moolenaar  if has('channel')
195290193e61SBram Moolenaar    CheckDefAndScriptFailure(lines, 'E119:', 0)
195346f479c7SBram Moolenaar  else
195490193e61SBram Moolenaar    CheckDefAndScriptFailure(lines, 'E117:', 0)
195546f479c7SBram Moolenaar  endif
19567147820cSBram Moolenaarenddef
19577147820cSBram Moolenaar
1958ba60cc45SBram Moolenaardef LambdaWithComments(): func
19592949cfdbSBram Moolenaar  return (x) =>
1960ba60cc45SBram Moolenaar            # some comment
1961ba60cc45SBram Moolenaar            x == 1
1962ba60cc45SBram Moolenaar            # some comment
1963ba60cc45SBram Moolenaar            ||
1964ba60cc45SBram Moolenaar            x == 2
1965ba60cc45SBram Moolenaarenddef
1966ba60cc45SBram Moolenaar
1967fd77748dSBram Moolenaardef LambdaUsingArg(x: number): func
19682949cfdbSBram Moolenaar  return () =>
1969fd77748dSBram Moolenaar            # some comment
1970fd77748dSBram Moolenaar            x == 1
1971fd77748dSBram Moolenaar            # some comment
1972fd77748dSBram Moolenaar            ||
1973fd77748dSBram Moolenaar            x == 2
1974fd77748dSBram Moolenaarenddef
1975fd77748dSBram Moolenaar
19768a7d6542SBram Moolenaardef Test_expr7_lambda()
1977659bb227SBram Moolenaar  var lines =<< trim END
19782949cfdbSBram Moolenaar      var La = () => 'result'
197903717bf6SBram Moolenaar      # comment
19808a7d6542SBram Moolenaar      assert_equal('result', La())
19812949cfdbSBram Moolenaar      assert_equal([1, 3, 5], [1, 2, 3]->map((key, val) => key + val))
1982914e7eaaSBram Moolenaar
1983f5be8cdbSBram Moolenaar      # line continuation inside lambda with "cond ? expr : expr" works
198437ce6d3aSBram Moolenaar      var ll = range(3)
198575ab91ffSBram Moolenaar      var dll = mapnew(ll, (k, v) => v % 2 ? {
1986e0de171eSBram Moolenaar                ['111']: 111 } : {}
19872949cfdbSBram Moolenaar            )
198875ab91ffSBram Moolenaar      assert_equal([{}, {111: 111}, {}], dll)
19898af81d65SBram Moolenaar
199003717bf6SBram Moolenaar      # comment halfway an expression
199103717bf6SBram Moolenaar      var Ref = () => 4
199203717bf6SBram Moolenaar      # comment
199303717bf6SBram Moolenaar      + 6
199403717bf6SBram Moolenaar      assert_equal(10, Ref())
199503717bf6SBram Moolenaar
19968af81d65SBram Moolenaar      ll = range(3)
19972949cfdbSBram Moolenaar      map(ll, (k, v) => v == 8 || v
19988af81d65SBram Moolenaar                    == 9
19998af81d65SBram Moolenaar                    || v % 2 ? 111 : 222
20002949cfdbSBram Moolenaar            )
20018af81d65SBram Moolenaar      assert_equal([222, 111, 222], ll)
20028af81d65SBram Moolenaar
20038af81d65SBram Moolenaar      ll = range(3)
20042949cfdbSBram Moolenaar      map(ll, (k, v) => v != 8 && v
20058af81d65SBram Moolenaar                    != 9
20068af81d65SBram Moolenaar                    && v % 2 == 0 ? 111 : 222
20072949cfdbSBram Moolenaar            )
20088af81d65SBram Moolenaar      assert_equal([111, 222, 111], ll)
20098af81d65SBram Moolenaar
20102949cfdbSBram Moolenaar      var dl = [{key: 0}, {key: 22}]->filter(( _, v) => v['key'] )
2011e0de171eSBram Moolenaar      assert_equal([{key: 22}], dl)
20126802cce4SBram Moolenaar
2013e0de171eSBram Moolenaar      dl = [{key: 12}, {['foo']: 34}]
2014e0de171eSBram Moolenaar      assert_equal([{key: 12}], filter(dl,
20152949cfdbSBram Moolenaar            (_, v) => has_key(v, 'key') ? v['key'] == 12 : 0))
20167892b953SBram Moolenaar
2017ba60cc45SBram Moolenaar      assert_equal(false, LambdaWithComments()(0))
2018ba60cc45SBram Moolenaar      assert_equal(true, LambdaWithComments()(1))
2019ba60cc45SBram Moolenaar      assert_equal(true, LambdaWithComments()(2))
2020ba60cc45SBram Moolenaar      assert_equal(false, LambdaWithComments()(3))
2021ba60cc45SBram Moolenaar
2022fd77748dSBram Moolenaar      assert_equal(false, LambdaUsingArg(0)())
2023fd77748dSBram Moolenaar      assert_equal(true, LambdaUsingArg(1)())
2024c2ca935dSBram Moolenaar
20252949cfdbSBram Moolenaar      var res = map([1, 2, 3], (i: number, v: number) => i + v)
2026c2ca935dSBram Moolenaar      assert_equal([1, 3, 5], res)
2027659bb227SBram Moolenaar  END
2028659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2029fd77748dSBram Moolenaar
203090193e61SBram Moolenaar  CheckDefAndScriptFailure(["var Ref = (a)=>a + 1"], 'E1004:')
203190193e61SBram Moolenaar  CheckDefAndScriptFailure(["var Ref = (a)=> a + 1"], 'E1004: White space required before and after ''=>'' at "=> a + 1"')
203290193e61SBram Moolenaar  CheckDefAndScriptFailure(["var Ref = (a) =>a + 1"], 'E1004:')
2033611728f8SYegappan Lakshmanan  CheckDefAndScriptFailure2(["var Ref = (a) =< a + 1"], 'E1001:', 'E121:')
2034611728f8SYegappan Lakshmanan  CheckDefAndScriptFailure(["var Ref = (a: int) => a + 1"], 'E1010:')
2035611728f8SYegappan Lakshmanan  CheckDefAndScriptFailure(["var Ref = (a): int => a + 1"], 'E1010:')
203627bf7af9SBram Moolenaar
203790193e61SBram Moolenaar  CheckDefAndScriptFailure(["filter([1, 2], (k,v) => 1)"], 'E1069:', 1)
20383affe7a6SBram Moolenaar  # error is in first line of the lambda
203990193e61SBram Moolenaar  CheckDefAndScriptFailure(["var L = (a) => a + b"], 'E1001:', 0)
204079e8db9aSBram Moolenaar
20412949cfdbSBram Moolenaar  assert_equal('xxxyyy', 'xxx'->((a, b) => a .. b)('yyy'))
204279e8db9aSBram Moolenaar
20432949cfdbSBram Moolenaar  CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x')"], 'E118:')
20442949cfdbSBram Moolenaar  CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x', 'y')"], 'E118:')
204590193e61SBram Moolenaar  CheckDefAndScriptFailure2(["echo 'asdf'->((a) => a)(x)"], 'E1001:', 'E121:', 1)
2046a2c026d0SBram Moolenaar
204790193e61SBram Moolenaar  CheckDefAndScriptSuccess(['var Fx = (a) => ({k1: 0,', ' k2: 1})'])
204890193e61SBram Moolenaar  CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0', ' k2: 1})'], 'E722:', 2)
204990193e61SBram Moolenaar  CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0,', ' k2 1})'], 'E720:', 2)
2050a2c026d0SBram Moolenaar
205190193e61SBram Moolenaar  CheckDefAndScriptSuccess(['var Fx = (a) => [0,', ' 1]'])
205290193e61SBram Moolenaar  CheckDefAndScriptFailure(['var Fx = (a) => [0', ' 1]'], 'E696:', 2)
2053bc327cccSBram Moolenaar
2054bc327cccSBram Moolenaar  # no error for existing script variable when checking for lambda
2055bc327cccSBram Moolenaar  lines =<< trim END
2056bc327cccSBram Moolenaar    var name = 0
2057bc327cccSBram Moolenaar    eval (name + 2) / 3
2058bc327cccSBram Moolenaar  END
205990193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
20608a7d6542SBram Moolenaarenddef
20618a7d6542SBram Moolenaar
20627a6eaa06SBram Moolenaardef Test_expr7_lambda_block()
20637a6eaa06SBram Moolenaar  var lines =<< trim END
20647a6eaa06SBram Moolenaar      var Func = (s: string): string => {
20657a6eaa06SBram Moolenaar                      return 'hello ' .. s
20667a6eaa06SBram Moolenaar                    }
20677a6eaa06SBram Moolenaar      assert_equal('hello there', Func('there'))
20687a6eaa06SBram Moolenaar
20697a6eaa06SBram Moolenaar      var ll = range(3)
20707a6eaa06SBram Moolenaar      var dll = mapnew(ll, (k, v): string => {
20717a6eaa06SBram Moolenaar          if v % 2
20727a6eaa06SBram Moolenaar            return 'yes'
20737a6eaa06SBram Moolenaar          endif
20747a6eaa06SBram Moolenaar          return 'no'
20757a6eaa06SBram Moolenaar        })
20767a6eaa06SBram Moolenaar      assert_equal(['no', 'yes', 'no'], dll)
207749f1e9ecSBram Moolenaar
2078*ac2cd2b0SBram Moolenaar      # ignored_inline(0, (_) => {
2079*ac2cd2b0SBram Moolenaar      #   echo 'body'
2080*ac2cd2b0SBram Moolenaar      # })
2081*ac2cd2b0SBram Moolenaar
208249f1e9ecSBram Moolenaar      sandbox var Safe = (nr: number): number => {
208349f1e9ecSBram Moolenaar          return nr + 7
208449f1e9ecSBram Moolenaar        }
208549f1e9ecSBram Moolenaar      assert_equal(10, Safe(3))
20867a6eaa06SBram Moolenaar  END
20877a6eaa06SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2088e98f60a5SBram Moolenaar
2089e98f60a5SBram Moolenaar  lines =<< trim END
2090e98f60a5SBram Moolenaar      map([1, 2], (k, v) => { redrawt })
2091e98f60a5SBram Moolenaar  END
2092e98f60a5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E488')
209349f1e9ecSBram Moolenaar
209449f1e9ecSBram Moolenaar  lines =<< trim END
209549f1e9ecSBram Moolenaar      var Func = (nr: int) => {
209649f1e9ecSBram Moolenaar              echo nr
209749f1e9ecSBram Moolenaar            }
209849f1e9ecSBram Moolenaar  END
209949f1e9ecSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1010', 1)
210049f1e9ecSBram Moolenaar
210149f1e9ecSBram Moolenaar  lines =<< trim END
210249f1e9ecSBram Moolenaar      var Func = (nr: number): int => {
210349f1e9ecSBram Moolenaar              return nr
210449f1e9ecSBram Moolenaar            }
210549f1e9ecSBram Moolenaar  END
210649f1e9ecSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1010', 1)
210749f1e9ecSBram Moolenaar
210849f1e9ecSBram Moolenaar  lines =<< trim END
210949f1e9ecSBram Moolenaar      var Func = (nr: number): int => {
211049f1e9ecSBram Moolenaar              return nr
211149f1e9ecSBram Moolenaar  END
21125245beb3SBram Moolenaar  CheckDefFailure(lines, 'E1171', 0)  # line nr is function start
21135245beb3SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1171', 2)
211449f1e9ecSBram Moolenaar
211549f1e9ecSBram Moolenaar  lines =<< trim END
211649f1e9ecSBram Moolenaar      var Func = (nr: number): int => {
211749f1e9ecSBram Moolenaar          var ll =<< ENDIT
211849f1e9ecSBram Moolenaar             nothing
211949f1e9ecSBram Moolenaar  END
212090193e61SBram Moolenaar  CheckDefFailure(lines, 'E1145: Missing heredoc end marker: ENDIT', 0)
212190193e61SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1145: Missing heredoc end marker: ENDIT', 2)
21227a6eaa06SBram Moolenaarenddef
21237a6eaa06SBram Moolenaar
212465c44152SBram Moolenaardef NewLambdaWithComments(): func
212565c44152SBram Moolenaar  return (x) =>
212665c44152SBram Moolenaar            # some comment
212765c44152SBram Moolenaar            x == 1
212865c44152SBram Moolenaar            # some comment
212965c44152SBram Moolenaar            ||
213065c44152SBram Moolenaar            x == 2
213165c44152SBram Moolenaarenddef
213265c44152SBram Moolenaar
213365c44152SBram Moolenaardef NewLambdaUsingArg(x: number): func
213465c44152SBram Moolenaar  return () =>
213565c44152SBram Moolenaar            # some comment
213665c44152SBram Moolenaar            x == 1
213765c44152SBram Moolenaar            # some comment
213865c44152SBram Moolenaar            ||
213965c44152SBram Moolenaar            x == 2
214065c44152SBram Moolenaarenddef
214165c44152SBram Moolenaar
214265c44152SBram Moolenaardef Test_expr7_new_lambda()
214365c44152SBram Moolenaar  var lines =<< trim END
214465c44152SBram Moolenaar      var La = () => 'result'
214565c44152SBram Moolenaar      assert_equal('result', La())
214665c44152SBram Moolenaar      assert_equal([1, 3, 5], [1, 2, 3]->map((key, val) => key + val))
214765c44152SBram Moolenaar
214865c44152SBram Moolenaar      # line continuation inside lambda with "cond ? expr : expr" works
214965c44152SBram Moolenaar      var ll = range(3)
215075ab91ffSBram Moolenaar      var dll = mapnew(ll, (k, v) => v % 2 ? {
215165c44152SBram Moolenaar                ['111']: 111 } : {}
215265c44152SBram Moolenaar            )
215375ab91ffSBram Moolenaar      assert_equal([{}, {111: 111}, {}], dll)
215465c44152SBram Moolenaar
215565c44152SBram Moolenaar      ll = range(3)
215665c44152SBram Moolenaar      map(ll, (k, v) => v == 8 || v
215765c44152SBram Moolenaar                    == 9
215865c44152SBram Moolenaar                    || v % 2 ? 111 : 222
215965c44152SBram Moolenaar            )
216065c44152SBram Moolenaar      assert_equal([222, 111, 222], ll)
216165c44152SBram Moolenaar
216265c44152SBram Moolenaar      ll = range(3)
216365c44152SBram Moolenaar      map(ll, (k, v) => v != 8 && v
216465c44152SBram Moolenaar                    != 9
216565c44152SBram Moolenaar                    && v % 2 == 0 ? 111 : 222
216665c44152SBram Moolenaar            )
216765c44152SBram Moolenaar      assert_equal([111, 222, 111], ll)
216865c44152SBram Moolenaar
216965c44152SBram Moolenaar      var dl = [{key: 0}, {key: 22}]->filter(( _, v) => v['key'] )
217065c44152SBram Moolenaar      assert_equal([{key: 22}], dl)
217165c44152SBram Moolenaar
217265c44152SBram Moolenaar      dl = [{key: 12}, {['foo']: 34}]
217365c44152SBram Moolenaar      assert_equal([{key: 12}], filter(dl,
217465c44152SBram Moolenaar            (_, v) => has_key(v, 'key') ? v['key'] == 12 : 0))
217565c44152SBram Moolenaar
217665c44152SBram Moolenaar      assert_equal(false, NewLambdaWithComments()(0))
217765c44152SBram Moolenaar      assert_equal(true, NewLambdaWithComments()(1))
217865c44152SBram Moolenaar      assert_equal(true, NewLambdaWithComments()(2))
217965c44152SBram Moolenaar      assert_equal(false, NewLambdaWithComments()(3))
218065c44152SBram Moolenaar
218165c44152SBram Moolenaar      assert_equal(false, NewLambdaUsingArg(0)())
218265c44152SBram Moolenaar      assert_equal(true, NewLambdaUsingArg(1)())
218365c44152SBram Moolenaar
218465c44152SBram Moolenaar      var res = map([1, 2, 3], (i: number, v: number) => i + v)
218565c44152SBram Moolenaar      assert_equal([1, 3, 5], res)
218665c44152SBram Moolenaar
218765c44152SBram Moolenaar      # Lambda returning a dict
21889e68c325SBram Moolenaar      var Lmb = () => ({key: 42})
218965c44152SBram Moolenaar      assert_equal({key: 42}, Lmb())
2190c754b4ccSBram Moolenaar
2191c754b4ccSBram Moolenaar      var RefOne: func(number): string = (a: number): string => 'x'
2192c754b4ccSBram Moolenaar      var RefTwo: func(number): any = (a: number): any => 'x'
2193c754b4ccSBram Moolenaar
2194c754b4ccSBram Moolenaar      var Fx = (a) => ({k1: 0,
2195c754b4ccSBram Moolenaar                         k2: 1})
2196c754b4ccSBram Moolenaar      var Fy = (a) => [0,
2197c754b4ccSBram Moolenaar                       1]
219865c44152SBram Moolenaar  END
2199c754b4ccSBram Moolenaar  CheckDefAndScriptSuccess(lines)
220065c44152SBram Moolenaar
2201e462f52dSBram Moolenaar  CheckDefAndScriptFailure(["var Ref = (a)=>a + 1"], 'E1004:')
2202e462f52dSBram Moolenaar  CheckDefAndScriptFailure(["var Ref = (a)=> a + 1"], 'E1004:')
2203e7a73e07SBram Moolenaar  CheckDefAndScriptFailure(["var Ref = (a) =>a + 1"],
2204e7a73e07SBram Moolenaar      'E1004: White space required before and after ''=>'' at " =>a + 1"')
2205c754b4ccSBram Moolenaar
220690193e61SBram Moolenaar  CheckDefAndScriptFailure(["var Ref: func(number): number = (a: number): string => 'x'"], 'E1012:')
220790193e61SBram Moolenaar  CheckDefAndScriptFailure(["var Ref: func(number): string = (a: number): string => 99"], 'E1012:')
22089e68c325SBram Moolenaar
220990193e61SBram Moolenaar  CheckDefAndScriptFailure(["filter([1, 2], (k,v) => 1)"], 'E1069:', 1)
221065c44152SBram Moolenaar  # error is in first line of the lambda
221190193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var L = (a) -> a + b"], 'E1001:', 'E121:', 1)
221265c44152SBram Moolenaar
221390193e61SBram Moolenaar  assert_equal('xxxyyy', 'xxx'->((a, b) => a .. b)('yyy'))
221465c44152SBram Moolenaar
221590193e61SBram Moolenaar  CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x')"],
221690193e61SBram Moolenaar        'E118: Too many arguments for function:')
221790193e61SBram Moolenaar  CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x', 'y')"],
221890193e61SBram Moolenaar        'E118: Too many arguments for function:')
221990193e61SBram Moolenaar  CheckDefFailure(["echo 'asdf'->((a) => a)(x)"], 'E1001:', 1)
222065c44152SBram Moolenaar
222190193e61SBram Moolenaar  CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0', ' k2: 1})'], 'E722:', 2)
222290193e61SBram Moolenaar  CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0,', ' k2 1})'], 'E720:', 2)
222365c44152SBram Moolenaar
222490193e61SBram Moolenaar  CheckDefAndScriptFailure(['var Fx = (a) => [0', ' 1]'], 'E696:', 2)
222565c44152SBram Moolenaarenddef
222665c44152SBram Moolenaar
2227e40fbc2cSBram Moolenaardef Test_expr7_lambda_vim9script()
222837ce6d3aSBram Moolenaar  var lines =<< trim END
22292949cfdbSBram Moolenaar      var v = 10->((a) =>
2230e40fbc2cSBram Moolenaar	    a
2231e40fbc2cSBram Moolenaar	      + 2
22322949cfdbSBram Moolenaar            )()
2233e40fbc2cSBram Moolenaar      assert_equal(12, v)
2234e40fbc2cSBram Moolenaar  END
22352927c07bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
2236aeb2bdd0SBram Moolenaar
2237aeb2bdd0SBram Moolenaar  # nested lambda with line breaks
2238aeb2bdd0SBram Moolenaar  lines =<< trim END
22392949cfdbSBram Moolenaar      search('"', 'cW', 0, 0, () =>
2240aeb2bdd0SBram Moolenaar	synstack('.', col('.'))
22412949cfdbSBram Moolenaar          ->map((_, v) => synIDattr(v, 'name'))->len())
2242aeb2bdd0SBram Moolenaar  END
224390193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2244e40fbc2cSBram Moolenaarenddef
2245e40fbc2cSBram Moolenaar
224690193e61SBram Moolenaardef Test_expr7_funcref()
224737ce6d3aSBram Moolenaar  var lines =<< trim END
2248601e76acSBram Moolenaar      def RetNumber(): number
2249601e76acSBram Moolenaar        return 123
2250601e76acSBram Moolenaar      enddef
225137ce6d3aSBram Moolenaar      var FuncRef = RetNumber
2252601e76acSBram Moolenaar      assert_equal(123, FuncRef())
2253601e76acSBram Moolenaar  END
2254601e76acSBram Moolenaar  CheckDefAndScriptSuccess(lines)
2255fa596388SBram Moolenaar
2256fa596388SBram Moolenaar  lines =<< trim END
2257fa596388SBram Moolenaar      vim9script
2258fa596388SBram Moolenaar      func g:GlobalFunc()
2259fa596388SBram Moolenaar        return 'global'
2260fa596388SBram Moolenaar      endfunc
2261fa596388SBram Moolenaar      func s:ScriptFunc()
2262fa596388SBram Moolenaar        return 'script'
2263fa596388SBram Moolenaar      endfunc
2264fa596388SBram Moolenaar      def Test()
2265fa596388SBram Moolenaar        var Ref = g:GlobalFunc
2266fa596388SBram Moolenaar        assert_equal('global', Ref())
2267fa596388SBram Moolenaar        Ref = GlobalFunc
2268fa596388SBram Moolenaar        assert_equal('global', Ref())
2269fa596388SBram Moolenaar
2270fa596388SBram Moolenaar        Ref = s:ScriptFunc
2271fa596388SBram Moolenaar        assert_equal('script', Ref())
2272fa596388SBram Moolenaar        Ref = ScriptFunc
2273fa596388SBram Moolenaar        assert_equal('script', Ref())
2274fa596388SBram Moolenaar      enddef
2275fa596388SBram Moolenaar      Test()
2276fa596388SBram Moolenaar  END
2277fa596388SBram Moolenaar  CheckScriptSuccess(lines)
2278601e76acSBram Moolenaarenddef
2279601e76acSBram Moolenaar
22802bede173SBram Moolenaarlet g:test_space_dict = {'': 'empty', ' ': 'space'}
22812bede173SBram Moolenaarlet g:test_hash_dict = #{one: 1, two: 2}
22822bede173SBram Moolenaar
22838a7d6542SBram Moolenaardef Test_expr7_dict()
2284f5be8cdbSBram Moolenaar  # dictionary
2285659bb227SBram Moolenaar  var lines =<< trim END
22868a7d6542SBram Moolenaar      assert_equal(g:dict_empty, {})
22878a7d6542SBram Moolenaar      assert_equal(g:dict_empty, {  })
2288e0de171eSBram Moolenaar      assert_equal(g:dict_one, {['one']: 1})
228937ce6d3aSBram Moolenaar      var key = 'one'
229037ce6d3aSBram Moolenaar      var val = 1
22912bede173SBram Moolenaar      assert_equal(g:dict_one, {[key]: val})
22920062c2d4SBram Moolenaar
22932bede173SBram Moolenaar      var numbers: dict<number> = {a: 1, b: 2, c: 3}
2294e0de171eSBram Moolenaar      numbers = {a: 1}
2295e0de171eSBram Moolenaar      numbers = {}
2296127542bcSBram Moolenaar
22972bede173SBram Moolenaar      var strings: dict<string> = {a: 'a', b: 'b', c: 'c'}
2298e0de171eSBram Moolenaar      strings = {a: 'x'}
2299e0de171eSBram Moolenaar      strings = {}
2300e0de171eSBram Moolenaar
2301e0de171eSBram Moolenaar      var dash = {xx-x: 8}
2302e0de171eSBram Moolenaar      assert_equal({['xx-x']: 8}, dash)
2303e0de171eSBram Moolenaar
2304e0de171eSBram Moolenaar      var dnr = {8: 8}
2305e0de171eSBram Moolenaar      assert_equal({['8']: 8}, dnr)
2306127542bcSBram Moolenaar
23072bede173SBram Moolenaar      var mixed: dict<any> = {a: 'a', b: 42}
2308e0de171eSBram Moolenaar      mixed = {a: 'x'}
2309e0de171eSBram Moolenaar      mixed = {a: 234}
2310e0de171eSBram Moolenaar      mixed = {}
2311127542bcSBram Moolenaar
2312e0de171eSBram Moolenaar      var dictlist: dict<list<string>> = {absent: [], present: ['hi']}
2313e0de171eSBram Moolenaar      dictlist = {absent: ['hi'], present: []}
2314e0de171eSBram Moolenaar      dictlist = {absent: [], present: []}
231577b20977SBram Moolenaar
2316e0de171eSBram Moolenaar      var dictdict: dict<dict<string>> = {one: {a: 'text'}, two: {}}
2317e0de171eSBram Moolenaar      dictdict = {one: {}, two: {a: 'text'}}
2318e0de171eSBram Moolenaar      dictdict = {one: {}, two: {}}
2319c7f7f6dbSBram Moolenaar
2320e0de171eSBram Moolenaar      assert_equal({['']: 0}, {[matchstr('string', 'wont match')]: 0})
23212bede173SBram Moolenaar
23222bede173SBram Moolenaar      assert_equal(g:test_space_dict, {['']: 'empty', [' ']: 'space'})
23232bede173SBram Moolenaar      assert_equal(g:test_hash_dict, {one: 1, two: 2})
2324c5e6a717SBram Moolenaar
2325c5e6a717SBram Moolenaar      assert_equal({['a a']: 1, ['b/c']: 2}, {'a a': 1, "b/c": 2})
23266b553773SBram Moolenaar
23276b553773SBram Moolenaar      var d = {a: () => 3, b: () => 7}
23286b553773SBram Moolenaar      assert_equal(3, d.a())
23296b553773SBram Moolenaar      assert_equal(7, d.b())
23305afd081cSBram Moolenaar
23315afd081cSBram Moolenaar      var cd = { # comment
23325afd081cSBram Moolenaar                key: 'val' # comment
23335afd081cSBram Moolenaar               }
23342e5910bfSBram Moolenaar
23352e5910bfSBram Moolenaar      # different types used for the key
23362e5910bfSBram Moolenaar      var dkeys = {['key']: 'string',
23372e5910bfSBram Moolenaar                   [12]: 'numberexpr',
23382e5910bfSBram Moolenaar                   34: 'number',
23392e5910bfSBram Moolenaar                   [true]: 'bool'}
23402e5910bfSBram Moolenaar      assert_equal('string', dkeys['key'])
23412e5910bfSBram Moolenaar      assert_equal('numberexpr', dkeys[12])
23422e5910bfSBram Moolenaar      assert_equal('number', dkeys[34])
23432e5910bfSBram Moolenaar      assert_equal('bool', dkeys[true])
23442e5910bfSBram Moolenaar      if has('float')
23452e5910bfSBram Moolenaar        dkeys = {[1.2]: 'floatexpr', [3.4]: 'float'}
23462e5910bfSBram Moolenaar        assert_equal('floatexpr', dkeys[1.2])
23472e5910bfSBram Moolenaar        assert_equal('float', dkeys[3.4])
23482e5910bfSBram Moolenaar      endif
23492e5910bfSBram Moolenaar
23502e5910bfSBram Moolenaar      # automatic conversion from number to string
23512e5910bfSBram Moolenaar      var n = 123
23522e5910bfSBram Moolenaar      var dictnr = {[n]: 1}
2353a0399efaSBram Moolenaar
2354a0399efaSBram Moolenaar      # comment to start fold is OK
2355a0399efaSBram Moolenaar      var x1: number #{{ fold
2356a0399efaSBram Moolenaar      var x2 = 9 #{{ fold
2357659bb227SBram Moolenaar  END
2358659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
235977b20977SBram Moolenaar
2360e0de171eSBram Moolenaar  # legacy syntax doesn't work
23615c7a299cSBram Moolenaar  CheckDefAndScriptFailure(["var x = #{key: 8}"], 'E1170:', 1)
23625c7a299cSBram Moolenaar  CheckDefAndScriptFailure(["var x = 'a' #{a: 1}"], 'E1170:', 1)
23635c7a299cSBram Moolenaar  CheckDefAndScriptFailure(["var x = 'a' .. #{a: 1}"], 'E1170:', 1)
23645c7a299cSBram Moolenaar  CheckDefAndScriptFailure(["var x = true ? #{a: 1}"], 'E1170:', 1)
236517a836cbSBram Moolenaar
236690193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = {a:8}"], 'E1069:', 1)
236790193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = {a : 8}"], 'E1068:', 1)
236890193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = {a :8}"], 'E1068:', 1)
236990193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = {a: 8 , b: 9}"], 'E1068:', 1)
237090193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = {a: 1,b: 2}"], 'E1069:', 1)
2371e0de171eSBram Moolenaar
237290193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = {xxx}"], 'E720:', 1)
237390193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = {xxx: 1", "var y = 2"], 'E722:', 2)
2374e0de171eSBram Moolenaar  CheckDefFailure(["var x = {xxx: 1,"], 'E723:', 2)
237590193e61SBram Moolenaar  CheckScriptFailure(['vim9script', "var x = {xxx: 1,"], 'E723:', 2)
237690193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var x = {['a']: xxx}"], 'E1001:', 'E121:', 1)
237790193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = {a: 1, a: 2}"], 'E721:', 1)
2378fae55a9cSBram Moolenaar  CheckDefExecAndScriptFailure2(["var x = g:anint.member"], 'E715:', 'E488:', 1)
237990193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var x = g:dict_empty.member"], 'E716:', 1)
2380127542bcSBram Moolenaar
238190193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['var x: dict<number> = {a: 234, b: "1"}'], 'E1012:', 1)
238290193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['var x: dict<number> = {a: "x", b: 134}'], 'E1012:', 1)
238390193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['var x: dict<string> = {a: 234, b: "1"}'], 'E1012:', 1)
238490193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['var x: dict<string> = {a: "x", b: 134}'], 'E1012:', 1)
238544aefffaSBram Moolenaar
23862e5910bfSBram Moolenaar  # invalid types for the key
238790193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var x = {[[1, 2]]: 0}"], 'E1105:', 'E730:', 1)
23882e5910bfSBram Moolenaar
238944aefffaSBram Moolenaar  CheckDefFailure(['var x = ({'], 'E723:', 2)
239090193e61SBram Moolenaar  CheckScriptFailure(['vim9script', 'var x = ({'], 'E723:', 2)
239190193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['{}[getftype("file")]'], 'E716: Key not present in Dictionary: ""', 1)
23928a7d6542SBram Moolenaarenddef
23938a7d6542SBram Moolenaar
23948ea9390bSBram Moolenaardef Test_expr7_dict_vim9script()
239537ce6d3aSBram Moolenaar  var lines =<< trim END
239637ce6d3aSBram Moolenaar      var d = {
2397e0de171eSBram Moolenaar		['one']:
23988ea9390bSBram Moolenaar		   1,
2399e0de171eSBram Moolenaar		['two']: 2,
24008ea9390bSBram Moolenaar		   }
2401e0de171eSBram Moolenaar      assert_equal({one: 1, two: 2}, d)
240293be1644SBram Moolenaar
240393be1644SBram Moolenaar      d = {  # comment
2404e0de171eSBram Moolenaar		['one']:
240593be1644SBram Moolenaar                # comment
240693be1644SBram Moolenaar
240793be1644SBram Moolenaar		   1,
240893be1644SBram Moolenaar                # comment
240993be1644SBram Moolenaar                # comment
2410e0de171eSBram Moolenaar		['two']: 2,
241193be1644SBram Moolenaar		   }
2412e0de171eSBram Moolenaar      assert_equal({one: 1, two: 2}, d)
24132949cfdbSBram Moolenaar
24142949cfdbSBram Moolenaar      var dd = {k: 123->len()}
24152949cfdbSBram Moolenaar      assert_equal(3, dd.k)
24168ea9390bSBram Moolenaar  END
241790193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
24188ea9390bSBram Moolenaar
24198ea9390bSBram Moolenaar  lines =<< trim END
2420e0de171eSBram Moolenaar      var d = { ["one"]: "one", ["two"]: "two", }
2421e0de171eSBram Moolenaar      assert_equal({one: 'one', two: 'two'}, d)
2422e6b5324eSBram Moolenaar  END
242390193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2424e6b5324eSBram Moolenaar
2425e6b5324eSBram Moolenaar  lines =<< trim END
2426e0de171eSBram Moolenaar      var d = {one: 1,
24278ea9390bSBram Moolenaar		two: 2,
24288ea9390bSBram Moolenaar	       }
2429e0de171eSBram Moolenaar      assert_equal({one: 1, two: 2}, d)
24308ea9390bSBram Moolenaar  END
243190193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
24328ea9390bSBram Moolenaar
24338ea9390bSBram Moolenaar  lines =<< trim END
2434e0de171eSBram Moolenaar      var d = {one:1, two: 2}
24358ea9390bSBram Moolenaar  END
243690193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1069:', 1)
24378ea9390bSBram Moolenaar
24388ea9390bSBram Moolenaar  lines =<< trim END
2439e0de171eSBram Moolenaar      var d = {one: 1,two: 2}
24408ea9390bSBram Moolenaar  END
244190193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1069:', 1)
2442db199216SBram Moolenaar
2443db199216SBram Moolenaar  lines =<< trim END
2444e0de171eSBram Moolenaar      var d = {one : 1}
2445e0de171eSBram Moolenaar  END
244690193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1068:', 1)
2447e0de171eSBram Moolenaar
2448e0de171eSBram Moolenaar  lines =<< trim END
2449e0de171eSBram Moolenaar      var d = {one:1}
2450e0de171eSBram Moolenaar  END
245190193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1069:', 1)
2452e0de171eSBram Moolenaar
2453e0de171eSBram Moolenaar  lines =<< trim END
2454e0de171eSBram Moolenaar      var d = {one: 1 , two: 2}
2455db199216SBram Moolenaar  END
245690193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1068:', 1)
2457db199216SBram Moolenaar
2458db199216SBram Moolenaar  lines =<< trim END
2459e0de171eSBram Moolenaar    var l: dict<number> = {a: 234, b: 'x'}
246041fab3eaSBram Moolenaar  END
246190193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012:', 1)
246290193e61SBram Moolenaar
246341fab3eaSBram Moolenaar  lines =<< trim END
2464e0de171eSBram Moolenaar    var l: dict<number> = {a: 'x', b: 234}
246541fab3eaSBram Moolenaar  END
246690193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012:', 1)
246790193e61SBram Moolenaar
246841fab3eaSBram Moolenaar  lines =<< trim END
2469e0de171eSBram Moolenaar    var l: dict<string> = {a: 'x', b: 234}
247041fab3eaSBram Moolenaar  END
247190193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012:', 1)
247290193e61SBram Moolenaar
247341fab3eaSBram Moolenaar  lines =<< trim END
2474e0de171eSBram Moolenaar    var l: dict<string> = {a: 234, b: 'x'}
247541fab3eaSBram Moolenaar  END
247690193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012:', 1)
24779c13f762SBram Moolenaar
24789c13f762SBram Moolenaar  lines =<< trim END
2479918a4249SBram Moolenaar    var d = {['a']: 234, ['b': 'x'}
2480918a4249SBram Moolenaar  END
248190193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1139:', 1)
248290193e61SBram Moolenaar
2483918a4249SBram Moolenaar  lines =<< trim END
2484918a4249SBram Moolenaar    def Func()
2485918a4249SBram Moolenaar      var d = {['a']: 234, ['b': 'x'}
2486918a4249SBram Moolenaar    enddef
2487918a4249SBram Moolenaar    defcompile
2488918a4249SBram Moolenaar  END
248990193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1139:', 0)
249090193e61SBram Moolenaar
2491918a4249SBram Moolenaar  lines =<< trim END
2492918a4249SBram Moolenaar    var d = {'a':
2493918a4249SBram Moolenaar  END
249490193e61SBram Moolenaar  CheckDefFailure(lines, 'E723:', 2)
249590193e61SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E15:', 2)
249690193e61SBram Moolenaar
2497918a4249SBram Moolenaar  lines =<< trim END
2498918a4249SBram Moolenaar    def Func()
2499918a4249SBram Moolenaar      var d = {'a':
2500918a4249SBram Moolenaar    enddef
2501918a4249SBram Moolenaar    defcompile
2502918a4249SBram Moolenaar  END
250390193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E723:', 0)
2504918a4249SBram Moolenaar
2505918a4249SBram Moolenaar  lines =<< trim END
25069c13f762SBram Moolenaar      def Failing()
25079c13f762SBram Moolenaar        job_stop()
25089c13f762SBram Moolenaar      enddef
2509e0de171eSBram Moolenaar      var dict = {name: Failing}
25109c13f762SBram Moolenaar  END
251146f479c7SBram Moolenaar  if has('channel')
251290193e61SBram Moolenaar    CheckDefAndScriptFailure(lines, 'E119:', 0)
251346f479c7SBram Moolenaar  else
2514886e5e73SBram Moolenaar    CheckDefAndScriptFailure(lines, 'E117:', 0)
251546f479c7SBram Moolenaar  endif
251611005b07SBram Moolenaar
251711005b07SBram Moolenaar  lines =<< trim END
251811005b07SBram Moolenaar      vim9script
251911005b07SBram Moolenaar      var x = 99
252011005b07SBram Moolenaar      assert_equal({x: 99}, s:)
252111005b07SBram Moolenaar  END
252211005b07SBram Moolenaar  CheckScriptSuccess(lines)
25238ea9390bSBram Moolenaarenddef
25248ea9390bSBram Moolenaar
25255fa9b244SBram Moolenaardef Test_expr7_call_2bool()
25265fa9b244SBram Moolenaar  var lines =<< trim END
25275fa9b244SBram Moolenaar      vim9script
25285fa9b244SBram Moolenaar
25295fa9b244SBram Moolenaar      def BrokenCall(nr: number, mode: bool, use: string): void
25305fa9b244SBram Moolenaar        assert_equal(3, nr)
25315fa9b244SBram Moolenaar        assert_equal(false, mode)
25325fa9b244SBram Moolenaar        assert_equal('ab', use)
25335fa9b244SBram Moolenaar      enddef
25345fa9b244SBram Moolenaar
25355fa9b244SBram Moolenaar      def TestBrokenCall(): void
25365fa9b244SBram Moolenaar        BrokenCall(3, 0, 'ab')
25375fa9b244SBram Moolenaar      enddef
25385fa9b244SBram Moolenaar
25395fa9b244SBram Moolenaar      TestBrokenCall()
25405fa9b244SBram Moolenaar  END
25415fa9b244SBram Moolenaar  CheckScriptSuccess(lines)
25425fa9b244SBram Moolenaarenddef
25435fa9b244SBram Moolenaar
254450788ef3SBram Moolenaarlet g:oneString = 'one'
254550788ef3SBram Moolenaar
25460b37a2f3SBram Moolenaardef Test_expr_member()
254790193e61SBram Moolenaar  var lines =<< trim END
25480b37a2f3SBram Moolenaar      assert_equal(1, g:dict_one.one)
254937ce6d3aSBram Moolenaar      var d: dict<number> = g:dict_one
25504dac32caSBram Moolenaar      assert_equal(1, d['one'])
2551a7eedf31SBram Moolenaar      assert_equal(1, d[
2552a7eedf31SBram Moolenaar                      'one'
2553a7eedf31SBram Moolenaar                      ])
2554a7eedf31SBram Moolenaar      assert_equal(1, d
2555a7eedf31SBram Moolenaar            .one)
2556e0de171eSBram Moolenaar      d = {1: 1, _: 2}
2557b13ab999SBram Moolenaar      assert_equal(1, d
2558b13ab999SBram Moolenaar            .1)
2559b13ab999SBram Moolenaar      assert_equal(2, d
2560b13ab999SBram Moolenaar            ._)
25610b37a2f3SBram Moolenaar
2562fb9d5c51SBram Moolenaar      # getting the one member should clear the dict after getting the item
2563e0de171eSBram Moolenaar      assert_equal('one', {one: 'one'}.one)
2564e0de171eSBram Moolenaar      assert_equal('one', {one: 'one'}[g:oneString])
256590193e61SBram Moolenaar  END
256690193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2567fb9d5c51SBram Moolenaar
256890193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var x = g:dict_one.#$!"], 'E1002:', 'E15:', 1)
256990193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var d: dict<any>", "echo d['a']"], 'E716:', 2)
257090193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var d: dict<number>", "d = g:list_empty"], 'E1012: Type mismatch; expected dict<number> but got list<unknown>', 2)
25710b37a2f3SBram Moolenaarenddef
25720b37a2f3SBram Moolenaar
2573cc673e74SBram Moolenaardef Test_expr7_any_index_slice()
257437ce6d3aSBram Moolenaar  var lines =<< trim END
2575435d8978SBram Moolenaar    # getting the one member should clear the list only after getting the item
2576435d8978SBram Moolenaar    assert_equal('bbb', ['aaa', 'bbb', 'ccc'][1])
2577cc673e74SBram Moolenaar
2578cc673e74SBram Moolenaar    # string is permissive, index out of range accepted
2579cc673e74SBram Moolenaar    g:teststring = 'abcdef'
2580cc673e74SBram Moolenaar    assert_equal('b', g:teststring[1])
2581e7525c55SBram Moolenaar    assert_equal('f', g:teststring[-1])
2582cc673e74SBram Moolenaar    assert_equal('', g:teststring[99])
2583cc673e74SBram Moolenaar
2584cc673e74SBram Moolenaar    assert_equal('b', g:teststring[1 : 1])
2585cc673e74SBram Moolenaar    assert_equal('bcdef', g:teststring[1 :])
2586cc673e74SBram Moolenaar    assert_equal('abcd', g:teststring[: 3])
2587cc673e74SBram Moolenaar    assert_equal('cdef', g:teststring[-4 :])
2588cc673e74SBram Moolenaar    assert_equal('abcdef', g:teststring[-9 :])
2589cc673e74SBram Moolenaar    assert_equal('abcd', g:teststring[: -3])
2590cc673e74SBram Moolenaar    assert_equal('', g:teststring[: -9])
2591cc673e74SBram Moolenaar
25920289a093SBram Moolenaar    # composing characters are included
25930289a093SBram Moolenaar    g:teststring = 'àéû'
25940289a093SBram Moolenaar    assert_equal('à', g:teststring[0])
25950289a093SBram Moolenaar    assert_equal('é', g:teststring[1])
25960289a093SBram Moolenaar    assert_equal('û', g:teststring[2])
25970289a093SBram Moolenaar    assert_equal('', g:teststring[3])
25980289a093SBram Moolenaar    assert_equal('', g:teststring[4])
25990289a093SBram Moolenaar
26000289a093SBram Moolenaar    assert_equal('û', g:teststring[-1])
26010289a093SBram Moolenaar    assert_equal('é', g:teststring[-2])
26020289a093SBram Moolenaar    assert_equal('à', g:teststring[-3])
26030289a093SBram Moolenaar    assert_equal('', g:teststring[-4])
26040289a093SBram Moolenaar    assert_equal('', g:teststring[-5])
26050289a093SBram Moolenaar
26060289a093SBram Moolenaar    assert_equal('à', g:teststring[0 : 0])
26070289a093SBram Moolenaar    assert_equal('é', g:teststring[1 : 1])
26080289a093SBram Moolenaar    assert_equal('àé', g:teststring[0 : 1])
26090289a093SBram Moolenaar    assert_equal('àéû', g:teststring[0 : -1])
26100289a093SBram Moolenaar    assert_equal('àé', g:teststring[0 : -2])
26110289a093SBram Moolenaar    assert_equal('à', g:teststring[0 : -3])
26120289a093SBram Moolenaar    assert_equal('', g:teststring[0 : -4])
26130289a093SBram Moolenaar    assert_equal('', g:teststring[0 : -5])
26140289a093SBram Moolenaar    assert_equal('àéû', g:teststring[ : ])
26150289a093SBram Moolenaar    assert_equal('àéû', g:teststring[0 : ])
26160289a093SBram Moolenaar    assert_equal('éû', g:teststring[1 : ])
26170289a093SBram Moolenaar    assert_equal('û', g:teststring[2 : ])
26180289a093SBram Moolenaar    assert_equal('', g:teststring[3 : ])
26190289a093SBram Moolenaar    assert_equal('', g:teststring[4 : ])
26200289a093SBram Moolenaar
2621cc673e74SBram Moolenaar    # blob index cannot be out of range
2622cc673e74SBram Moolenaar    g:testblob = 0z01ab
2623cc673e74SBram Moolenaar    assert_equal(0x01, g:testblob[0])
2624cc673e74SBram Moolenaar    assert_equal(0xab, g:testblob[1])
2625cc673e74SBram Moolenaar    assert_equal(0xab, g:testblob[-1])
2626cc673e74SBram Moolenaar    assert_equal(0x01, g:testblob[-2])
2627cc673e74SBram Moolenaar
2628cc673e74SBram Moolenaar    # blob slice accepts out of range
2629cc673e74SBram Moolenaar    assert_equal(0z01ab, g:testblob[0 : 1])
2630cc673e74SBram Moolenaar    assert_equal(0z01, g:testblob[0 : 0])
2631cc673e74SBram Moolenaar    assert_equal(0z01, g:testblob[-2 : -2])
2632cc673e74SBram Moolenaar    assert_equal(0zab, g:testblob[1 : 1])
2633cc673e74SBram Moolenaar    assert_equal(0zab, g:testblob[-1 : -1])
2634cc673e74SBram Moolenaar    assert_equal(0z, g:testblob[2 : 2])
2635cc673e74SBram Moolenaar    assert_equal(0z, g:testblob[0 : -3])
2636cc673e74SBram Moolenaar
2637cc673e74SBram Moolenaar    # list index cannot be out of range
2638cc673e74SBram Moolenaar    g:testlist = [0, 1, 2, 3]
2639cc673e74SBram Moolenaar    assert_equal(0, g:testlist[0])
2640cc673e74SBram Moolenaar    assert_equal(1, g:testlist[1])
2641cc673e74SBram Moolenaar    assert_equal(3, g:testlist[3])
2642cc673e74SBram Moolenaar    assert_equal(3, g:testlist[-1])
2643cc673e74SBram Moolenaar    assert_equal(0, g:testlist[-4])
2644cc673e74SBram Moolenaar    assert_equal(1, g:testlist[g:theone])
2645cc673e74SBram Moolenaar
2646cc673e74SBram Moolenaar    # list slice accepts out of range
2647cc673e74SBram Moolenaar    assert_equal([0], g:testlist[0 : 0])
2648cc673e74SBram Moolenaar    assert_equal([3], g:testlist[3 : 3])
2649cc673e74SBram Moolenaar    assert_equal([0, 1], g:testlist[0 : 1])
2650cc673e74SBram Moolenaar    assert_equal([0, 1, 2, 3], g:testlist[0 : 3])
2651cc673e74SBram Moolenaar    assert_equal([0, 1, 2, 3], g:testlist[0 : 9])
2652cc673e74SBram Moolenaar    assert_equal([], g:testlist[-1 : 1])
2653cc673e74SBram Moolenaar    assert_equal([1], g:testlist[-3 : 1])
2654cc673e74SBram Moolenaar    assert_equal([0, 1], g:testlist[-4 : 1])
2655cc673e74SBram Moolenaar    assert_equal([0, 1], g:testlist[-9 : 1])
2656cc673e74SBram Moolenaar    assert_equal([1, 2, 3], g:testlist[1 : -1])
2657cc673e74SBram Moolenaar    assert_equal([1], g:testlist[1 : -3])
2658cc673e74SBram Moolenaar    assert_equal([], g:testlist[1 : -4])
2659cc673e74SBram Moolenaar    assert_equal([], g:testlist[1 : -9])
2660cc673e74SBram Moolenaar
2661e0de171eSBram Moolenaar    g:testdict = {a: 1, b: 2}
2662cc673e74SBram Moolenaar    assert_equal(1, g:testdict['a'])
2663cc673e74SBram Moolenaar    assert_equal(2, g:testdict['b'])
2664cc673e74SBram Moolenaar  END
2665cc673e74SBram Moolenaar
266690193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2667cc673e74SBram Moolenaar
266890193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['echo g:testblob[2]'], 'E979:', 1)
266990193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['echo g:testblob[-3]'], 'E979:', 1)
2670cc673e74SBram Moolenaar
267190193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['echo g:testlist[4]'], 'E684: list index out of range: 4', 1)
267290193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['echo g:testlist[-5]'], 'E684:', 1)
2673cc673e74SBram Moolenaar
267490193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['echo g:testdict["a" : "b"]'], 'E719:', 1)
267590193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['echo g:testdict[1]'], 'E716:', 1)
2676cc673e74SBram Moolenaar
2677cc673e74SBram Moolenaar  unlet g:teststring
2678cc673e74SBram Moolenaar  unlet g:testblob
2679cc673e74SBram Moolenaar  unlet g:testlist
2680435d8978SBram Moolenaarenddef
2681435d8978SBram Moolenaar
2682442af2f8SBram Moolenaardef Test_expr_member_vim9script()
268337ce6d3aSBram Moolenaar  var lines =<< trim END
2684e0de171eSBram Moolenaar      var d = {one:
2685442af2f8SBram Moolenaar      		'one',
2686b13ab999SBram Moolenaar		two: 'two',
2687b13ab999SBram Moolenaar		1: 1,
2688b13ab999SBram Moolenaar		_: 2}
2689442af2f8SBram Moolenaar      assert_equal('one', d.one)
2690442af2f8SBram Moolenaar      assert_equal('one', d
2691442af2f8SBram Moolenaar                            .one)
2692b13ab999SBram Moolenaar      assert_equal(1, d
2693b13ab999SBram Moolenaar                            .1)
2694b13ab999SBram Moolenaar      assert_equal(2, d
2695b13ab999SBram Moolenaar                            ._)
2696442af2f8SBram Moolenaar      assert_equal('one', d[
2697442af2f8SBram Moolenaar			    'one'
2698442af2f8SBram Moolenaar			    ])
2699442af2f8SBram Moolenaar  END
270090193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2701442af2f8SBram Moolenaar
2702442af2f8SBram Moolenaar  lines =<< trim END
270337ce6d3aSBram Moolenaar      var l = [1,
2704442af2f8SBram Moolenaar		  2,
2705442af2f8SBram Moolenaar		  3, 4
2706442af2f8SBram Moolenaar		  ]
2707442af2f8SBram Moolenaar      assert_equal(2, l[
2708442af2f8SBram Moolenaar			    1
2709442af2f8SBram Moolenaar			    ])
2710442af2f8SBram Moolenaar      assert_equal([2, 3], l[1 : 2])
2711442af2f8SBram Moolenaar      assert_equal([1, 2, 3], l[
2712442af2f8SBram Moolenaar				:
2713442af2f8SBram Moolenaar				2
2714442af2f8SBram Moolenaar				])
2715442af2f8SBram Moolenaar      assert_equal([3, 4], l[
2716442af2f8SBram Moolenaar				2
2717442af2f8SBram Moolenaar				:
2718442af2f8SBram Moolenaar				])
2719442af2f8SBram Moolenaar  END
272090193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2721442af2f8SBram Moolenaarenddef
2722442af2f8SBram Moolenaar
2723a79925a0SBram Moolenaardef SetSomeVar()
2724a79925a0SBram Moolenaar  b:someVar = &fdm
2725a79925a0SBram Moolenaarenddef
2726a79925a0SBram Moolenaar
27278a7d6542SBram Moolenaardef Test_expr7_option()
272890193e61SBram Moolenaar  var lines =<< trim END
2729f5be8cdbSBram Moolenaar      # option
27308a7d6542SBram Moolenaar      set ts=11
27318a7d6542SBram Moolenaar      assert_equal(11, &ts)
2732401d9ffbSBram Moolenaar      &ts = 9
2733401d9ffbSBram Moolenaar      assert_equal(9, &ts)
27348a7d6542SBram Moolenaar      set ts=8
27358a7d6542SBram Moolenaar      set grepprg=some\ text
27368a7d6542SBram Moolenaar      assert_equal('some text', &grepprg)
273797a2af39SBram Moolenaar      &grepprg = test_null_string()
273897a2af39SBram Moolenaar      assert_equal('', &grepprg)
27398a7d6542SBram Moolenaar      set grepprg&
2740d5ea8f08SBram Moolenaar
2741d5ea8f08SBram Moolenaar      # check matching type
2742d5ea8f08SBram Moolenaar      var bval: bool = &tgc
2743d5ea8f08SBram Moolenaar      var nval: number = &ts
2744d5ea8f08SBram Moolenaar      var sval: string = &path
2745a79925a0SBram Moolenaar
2746a79925a0SBram Moolenaar      # check v_lock is cleared (requires using valgrind, doesn't always show)
2747a79925a0SBram Moolenaar      SetSomeVar()
2748a79925a0SBram Moolenaar      b:someVar = 0
2749a79925a0SBram Moolenaar      unlet b:someVar
275090193e61SBram Moolenaar  END
275190193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
27528a7d6542SBram Moolenaarenddef
27538a7d6542SBram Moolenaar
27548a7d6542SBram Moolenaardef Test_expr7_environment()
275590193e61SBram Moolenaar  var lines =<< trim END
2756f5be8cdbSBram Moolenaar      # environment variable
27578a7d6542SBram Moolenaar      assert_equal('testvar', $TESTVAR)
27588a7d6542SBram Moolenaar      assert_equal('', $ASDF_ASD_XXX)
275990193e61SBram Moolenaar  END
276090193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2761c58164c5SBram Moolenaar
276290193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var x = $$$"], 'E1002:', 'E15:', 1)
27638a7d6542SBram Moolenaarenddef
27648a7d6542SBram Moolenaar
27658a7d6542SBram Moolenaardef Test_expr7_register()
276690193e61SBram Moolenaar  var lines =<< trim END
2767401d9ffbSBram Moolenaar      @a = 'register a'
27688a7d6542SBram Moolenaar      assert_equal('register a', @a)
27697226e5b1SBram Moolenaar
277037ce6d3aSBram Moolenaar      var fname = expand('%')
27717226e5b1SBram Moolenaar      assert_equal(fname, @%)
27727226e5b1SBram Moolenaar
27737226e5b1SBram Moolenaar      feedkeys(":echo 'some'\<CR>", "xt")
27747226e5b1SBram Moolenaar      assert_equal("echo 'some'", @:)
27757226e5b1SBram Moolenaar
27767226e5b1SBram Moolenaar      normal axyz
27777226e5b1SBram Moolenaar      assert_equal("xyz", @.)
277865821727SBram Moolenaar
277965821727SBram Moolenaar      @/ = 'slash'
278065821727SBram Moolenaar      assert_equal('slash', @/)
278165821727SBram Moolenaar
278265821727SBram Moolenaar      @= = 'equal'
278365821727SBram Moolenaar      assert_equal('equal', @=)
278490193e61SBram Moolenaar  END
278590193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
278690193e61SBram Moolenaar
278790193e61SBram Moolenaar  CheckDefAndScriptFailure2(["@. = 'yes'"], 'E354:', 'E488:', 1)
27888a7d6542SBram Moolenaarenddef
27898a7d6542SBram Moolenaar
2790886e5e73SBram Moolenaar" This is slow when run under valgrind.
27912f8ce0aeSBram Moolenaardef Test_expr7_namespace()
279290193e61SBram Moolenaar  var lines =<< trim END
27932f8ce0aeSBram Moolenaar      g:some_var = 'some'
27942f8ce0aeSBram Moolenaar      assert_equal('some', get(g:, 'some_var'))
27952f8ce0aeSBram Moolenaar      assert_equal('some', get(g:, 'some_var', 'xxx'))
27962f8ce0aeSBram Moolenaar      assert_equal('xxx', get(g:, 'no_var', 'xxx'))
27972f8ce0aeSBram Moolenaar      unlet g:some_var
27982f8ce0aeSBram Moolenaar
27992f8ce0aeSBram Moolenaar      b:some_var = 'some'
28002f8ce0aeSBram Moolenaar      assert_equal('some', get(b:, 'some_var'))
28012f8ce0aeSBram Moolenaar      assert_equal('some', get(b:, 'some_var', 'xxx'))
28022f8ce0aeSBram Moolenaar      assert_equal('xxx', get(b:, 'no_var', 'xxx'))
28032f8ce0aeSBram Moolenaar      unlet b:some_var
28042f8ce0aeSBram Moolenaar
28052f8ce0aeSBram Moolenaar      w:some_var = 'some'
28062f8ce0aeSBram Moolenaar      assert_equal('some', get(w:, 'some_var'))
28072f8ce0aeSBram Moolenaar      assert_equal('some', get(w:, 'some_var', 'xxx'))
28082f8ce0aeSBram Moolenaar      assert_equal('xxx', get(w:, 'no_var', 'xxx'))
28092f8ce0aeSBram Moolenaar      unlet w:some_var
28102f8ce0aeSBram Moolenaar
28112f8ce0aeSBram Moolenaar      t:some_var = 'some'
28122f8ce0aeSBram Moolenaar      assert_equal('some', get(t:, 'some_var'))
28132f8ce0aeSBram Moolenaar      assert_equal('some', get(t:, 'some_var', 'xxx'))
28142f8ce0aeSBram Moolenaar      assert_equal('xxx', get(t:, 'no_var', 'xxx'))
28152f8ce0aeSBram Moolenaar      unlet t:some_var
28161bd3cb20SBram Moolenaar
28171bd3cb20SBram Moolenaar      # check using g: in a for loop more than DO_NOT_FREE_CNT times
28181bd3cb20SBram Moolenaar      for i in range(100000)
28191bd3cb20SBram Moolenaar        if has_key(g:, 'does-not-exist')
28201bd3cb20SBram Moolenaar        endif
28211bd3cb20SBram Moolenaar      endfor
282290193e61SBram Moolenaar  END
282390193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
28242f8ce0aeSBram Moolenaarenddef
28252f8ce0aeSBram Moolenaar
28268a7d6542SBram Moolenaardef Test_expr7_parens()
2827f5be8cdbSBram Moolenaar  # (expr)
282824156693SBram Moolenaar  var lines =<< trim END
28298a7d6542SBram Moolenaar      assert_equal(4, (6 * 4) / 6)
28308a7d6542SBram Moolenaar      assert_equal(0, 6 * ( 4 / 6 ))
28318a7d6542SBram Moolenaar
28328a7d6542SBram Moolenaar      assert_equal(6, +6)
28338a7d6542SBram Moolenaar      assert_equal(-6, -6)
28340b1cd52fSBram Moolenaar      assert_equal(false, !-3)
2835b23279d7SBram Moolenaar      assert_equal(true, !+0)
28368a7d6542SBram Moolenaar
283724156693SBram Moolenaar      assert_equal(7, 5 + (
283824156693SBram Moolenaar                    2))
283924156693SBram Moolenaar      assert_equal(7, 5 + (
284024156693SBram Moolenaar                    2
284124156693SBram Moolenaar                    ))
284224156693SBram Moolenaar      assert_equal(7, 5 + ( # comment
284324156693SBram Moolenaar                    2))
284424156693SBram Moolenaar      assert_equal(7, 5 + ( # comment
284524156693SBram Moolenaar                    # comment
284624156693SBram Moolenaar                    2))
284724156693SBram Moolenaar
284837ce6d3aSBram Moolenaar      var s = (
28497a4981b9SBram Moolenaar		'one'
28507a4981b9SBram Moolenaar		..
28517a4981b9SBram Moolenaar		'two'
28527a4981b9SBram Moolenaar		)
28537a4981b9SBram Moolenaar      assert_equal('onetwo', s)
28547a4981b9SBram Moolenaar  END
285524156693SBram Moolenaar  CheckDefAndScriptSuccess(lines)
28567a4981b9SBram Moolenaarenddef
28577a4981b9SBram Moolenaar
285879cdf80bSBram Moolenaardef Test_expr7_negate_add()
285990193e61SBram Moolenaar  var lines =<< trim END
286079cdf80bSBram Moolenaar      assert_equal(-99, -99)
28610b37a2f3SBram Moolenaar      assert_equal(-99, - 99)
286279cdf80bSBram Moolenaar      assert_equal(99, +99)
286379cdf80bSBram Moolenaar
286437ce6d3aSBram Moolenaar      var nr = 88
28650b37a2f3SBram Moolenaar      assert_equal(-88, -nr)
286679cdf80bSBram Moolenaar      assert_equal(-88, - nr)
286779cdf80bSBram Moolenaar      assert_equal(88, + nr)
286890193e61SBram Moolenaar  END
286990193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2870b23279d7SBram Moolenaar
287190193e61SBram Moolenaar  lines =<< trim END
2872b23279d7SBram Moolenaar    var n = 12
2873b23279d7SBram Moolenaar    echo ++n
2874b23279d7SBram Moolenaar  END
2875b23279d7SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:')
2876b23279d7SBram Moolenaar  lines =<< trim END
2877b23279d7SBram Moolenaar    var n = 12
2878b23279d7SBram Moolenaar    echo --n
2879b23279d7SBram Moolenaar  END
2880b23279d7SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:')
2881b23279d7SBram Moolenaar  lines =<< trim END
2882b23279d7SBram Moolenaar    var n = 12
2883b23279d7SBram Moolenaar    echo +-n
2884b23279d7SBram Moolenaar  END
2885b23279d7SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:')
2886b23279d7SBram Moolenaar  lines =<< trim END
2887b23279d7SBram Moolenaar    var n = 12
2888b23279d7SBram Moolenaar    echo -+n
2889b23279d7SBram Moolenaar  END
2890b23279d7SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:')
2891b23279d7SBram Moolenaar  lines =<< trim END
2892b23279d7SBram Moolenaar    var n = 12
2893b23279d7SBram Moolenaar    echo - -n
2894b23279d7SBram Moolenaar  END
2895b23279d7SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:')
2896b23279d7SBram Moolenaar  lines =<< trim END
2897b23279d7SBram Moolenaar    var n = 12
2898b23279d7SBram Moolenaar    echo + +n
2899b23279d7SBram Moolenaar  END
2900b23279d7SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:')
29010b37a2f3SBram Moolenaarenddef
29020b37a2f3SBram Moolenaar
29033b1373b1SBram Moolenaardef LegacyReturn(): string
29043b1373b1SBram Moolenaar  legacy return #{key: 'ok'}.key
29053b1373b1SBram Moolenaarenddef
29063b1373b1SBram Moolenaar
290715e5e53eSBram Moolenaardef Test_expr7_legacy_script()
290815e5e53eSBram Moolenaar  var lines =<< trim END
290915e5e53eSBram Moolenaar      let s:legacy = 'legacy'
291015e5e53eSBram Moolenaar      def GetLocal(): string
291115e5e53eSBram Moolenaar        return legacy
291215e5e53eSBram Moolenaar      enddef
291315e5e53eSBram Moolenaar      def GetLocalPrefix(): string
291415e5e53eSBram Moolenaar        return s:legacy
291515e5e53eSBram Moolenaar      enddef
291615e5e53eSBram Moolenaar      call assert_equal('legacy', GetLocal())
291715e5e53eSBram Moolenaar      call assert_equal('legacy', GetLocalPrefix())
291815e5e53eSBram Moolenaar  END
291915e5e53eSBram Moolenaar  CheckScriptSuccess(lines)
29203b1373b1SBram Moolenaar
29213b1373b1SBram Moolenaar  assert_equal('ok', LegacyReturn())
29223b1373b1SBram Moolenaar
29233b1373b1SBram Moolenaar  lines =<< trim END
29243b1373b1SBram Moolenaar      vim9script
29253b1373b1SBram Moolenaar      def GetNumber(): number
29263b1373b1SBram Moolenaar          legacy return range(3)->map('v:val + 1')
29273b1373b1SBram Moolenaar      enddef
29283b1373b1SBram Moolenaar      echo GetNumber()
29293b1373b1SBram Moolenaar  END
29303b1373b1SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected number but got list<number>')
293115e5e53eSBram Moolenaarenddef
293215e5e53eSBram Moolenaar
29336e949784SBram Moolenaardef Echo(arg: any): string
29340b37a2f3SBram Moolenaar  return arg
29350b37a2f3SBram Moolenaarenddef
29360b37a2f3SBram Moolenaar
2937c5da1fb7SBram Moolenaardef s:Echo4Arg(arg: any): string
29380b37a2f3SBram Moolenaar  return arg
29390b37a2f3SBram Moolenaarenddef
29400b37a2f3SBram Moolenaar
29410b37a2f3SBram Moolenaardef Test_expr7_call()
2942659bb227SBram Moolenaar  var lines =<< trim END
29430b37a2f3SBram Moolenaar      assert_equal('yes', 'yes'->Echo())
294459eccb92SBram Moolenaar      assert_equal(true, !range(5)->empty())
2945b23279d7SBram Moolenaar      assert_equal([0, 1, 2], 3->range())
2946659bb227SBram Moolenaar  END
2947659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2948659bb227SBram Moolenaar
2949659bb227SBram Moolenaar  assert_equal('yes', 'yes'
2950659bb227SBram Moolenaar                        ->s:Echo4Arg())
29510b37a2f3SBram Moolenaar
295290193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = 'yes'->Echo"], 'E107:', 1)
295390193e61SBram Moolenaar  CheckDefAndScriptFailure2([
295437ce6d3aSBram Moolenaar       "var x = substitute ('x', 'x', 'x', 'x')"
295590193e61SBram Moolenaar       ], 'E1001:', 'E121:', 1)
295690193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var Ref = function('len' [1, 2])"], 'E1123:', 'E116:', 1)
2957a177344dSBram Moolenaar
295837ce6d3aSBram Moolenaar  var auto_lines =<< trim END
2959a177344dSBram Moolenaar      def g:some#func(): string
2960a177344dSBram Moolenaar	return 'found'
2961a177344dSBram Moolenaar      enddef
2962a177344dSBram Moolenaar  END
2963a177344dSBram Moolenaar  mkdir('Xruntime/autoload', 'p')
2964a177344dSBram Moolenaar  writefile(auto_lines, 'Xruntime/autoload/some.vim')
296537ce6d3aSBram Moolenaar  var save_rtp = &rtp
2966a177344dSBram Moolenaar  &rtp = getcwd() .. '/Xruntime,' .. &rtp
2967a177344dSBram Moolenaar  assert_equal('found', g:some#func())
2968a177344dSBram Moolenaar  assert_equal('found', some#func())
2969a177344dSBram Moolenaar
2970a177344dSBram Moolenaar  &rtp = save_rtp
2971a177344dSBram Moolenaar  delete('Xruntime', 'rf')
29720b37a2f3SBram Moolenaarenddef
29730b37a2f3SBram Moolenaar
29747e368206SBram Moolenaardef Test_expr7_method_call()
297590193e61SBram Moolenaar  var lines =<< trim END
29767e368206SBram Moolenaar      new
29777e368206SBram Moolenaar      setline(1, ['first', 'last'])
29787e368206SBram Moolenaar      'second'->append(1)
29797e368206SBram Moolenaar      "third"->append(2)
29807e368206SBram Moolenaar      assert_equal(['first', 'second', 'third', 'last'], getline(1, '$'))
29817e368206SBram Moolenaar      bwipe!
29827e368206SBram Moolenaar
29837e368206SBram Moolenaar      var bufnr = bufnr()
29847e368206SBram Moolenaar      var loclist = [{bufnr: bufnr, lnum: 42, col: 17, text: 'wrong'}]
29857e368206SBram Moolenaar      loclist->setloclist(0)
29867e368206SBram Moolenaar      assert_equal([{bufnr: bufnr,
29877e368206SBram Moolenaar                    lnum: 42,
29886864efa5Sthinca                    end_lnum: 0,
29897e368206SBram Moolenaar                    col: 17,
29906864efa5Sthinca                    end_col: 0,
29917e368206SBram Moolenaar                    text: 'wrong',
29927e368206SBram Moolenaar                    pattern: '',
29937e368206SBram Moolenaar                    valid: 1,
29947e368206SBram Moolenaar                    vcol: 0,
29957e368206SBram Moolenaar                    nr: 0,
29967e368206SBram Moolenaar                    type: '',
29977e368206SBram Moolenaar                    module: ''}
29987e368206SBram Moolenaar                    ], getloclist(0))
29997e368206SBram Moolenaar
30007e368206SBram Moolenaar      var result: bool = get({n: 0}, 'n', 0)
30017e368206SBram Moolenaar      assert_equal(false, result)
30027e368206SBram Moolenaar
30037e368206SBram Moolenaar      assert_equal('+string+', 'string'->((s) => '+' .. s .. '+')())
30047e368206SBram Moolenaar      assert_equal('-text-', 'text'->((s, c) => c .. s .. c)('-'))
30057e368206SBram Moolenaar
30067e368206SBram Moolenaar      var Join = (l) => join(l, 'x')
30077e368206SBram Moolenaar      assert_equal('axb', ['a', 'b']->(Join)())
3008a733042bSBram Moolenaar
3009a733042bSBram Moolenaar      var sorted = [3, 1, 2]
3010a733042bSBram Moolenaar                    -> sort()
3011a733042bSBram Moolenaar      assert_equal([1, 2, 3], sorted)
301290193e61SBram Moolenaar  END
301390193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3014f57b43c2SBram Moolenaar
3015f57b43c2SBram Moolenaar  lines =<< trim END
3016f57b43c2SBram Moolenaar    def RetVoid()
3017f57b43c2SBram Moolenaar    enddef
3018f57b43c2SBram Moolenaar    RetVoid()->byteidx(3)
3019f57b43c2SBram Moolenaar  END
30201a71d31bSYegappan Lakshmanan  CheckDefExecFailure(lines, 'E1013:')
30217e368206SBram Moolenaarenddef
30227e368206SBram Moolenaar
30230b37a2f3SBram Moolenaar
30248a7d6542SBram Moolenaardef Test_expr7_not()
302537ce6d3aSBram Moolenaar  var lines =<< trim END
30268a7d6542SBram Moolenaar      assert_equal(true, !'')
30278a7d6542SBram Moolenaar      assert_equal(true, ![])
30288a7d6542SBram Moolenaar      assert_equal(false, !'asdf')
30298a7d6542SBram Moolenaar      assert_equal(false, ![2])
30308a7d6542SBram Moolenaar      assert_equal(true, !!'asdf')
30318a7d6542SBram Moolenaar      assert_equal(true, !![2])
30328ed04587SBram Moolenaar
303327491cd3SBram Moolenaar      assert_equal(true, ! false)
303427491cd3SBram Moolenaar      assert_equal(true, !! true)
303527491cd3SBram Moolenaar      assert_equal(true, ! ! true)
303627491cd3SBram Moolenaar      assert_equal(true, !!! false)
303727491cd3SBram Moolenaar      assert_equal(true, ! ! ! false)
303827491cd3SBram Moolenaar
303927491cd3SBram Moolenaar      g:true = true
304027491cd3SBram Moolenaar      g:false = false
304127491cd3SBram Moolenaar      assert_equal(true, ! g:false)
304227491cd3SBram Moolenaar      assert_equal(true, !! g:true)
304327491cd3SBram Moolenaar      assert_equal(true, ! ! g:true)
304427491cd3SBram Moolenaar      assert_equal(true, !!! g:false)
304527491cd3SBram Moolenaar      assert_equal(true, ! ! ! g:false)
304627491cd3SBram Moolenaar      unlet g:true
304727491cd3SBram Moolenaar      unlet g:false
304827491cd3SBram Moolenaar
30498ed04587SBram Moolenaar      assert_equal(true, !test_null_partial())
30502949cfdbSBram Moolenaar      assert_equal(false, !() => 'yes')
30518ed04587SBram Moolenaar
30528ed04587SBram Moolenaar      assert_equal(true, !test_null_dict())
30538ed04587SBram Moolenaar      assert_equal(true, !{})
3054e0de171eSBram Moolenaar      assert_equal(false, !{yes: 'no'})
30558ed04587SBram Moolenaar
3056b4d2cb10SBram Moolenaar      if has('channel')
30578ed04587SBram Moolenaar	assert_equal(true, !test_null_job())
30588ed04587SBram Moolenaar	assert_equal(true, !test_null_channel())
3059b4d2cb10SBram Moolenaar      endif
30608ed04587SBram Moolenaar
30618ed04587SBram Moolenaar      assert_equal(true, !test_null_blob())
30628ed04587SBram Moolenaar      assert_equal(true, !0z)
30638ed04587SBram Moolenaar      assert_equal(false, !0z01)
30648ed04587SBram Moolenaar
30658ed04587SBram Moolenaar      assert_equal(true, !test_void())
30668ed04587SBram Moolenaar      assert_equal(true, !test_unknown())
306759eccb92SBram Moolenaar
306859eccb92SBram Moolenaar      assert_equal(false, ![1, 2, 3]->reverse())
306959eccb92SBram Moolenaar      assert_equal(true, ![]->reverse())
30703e06a1e2SBram Moolenaar  END
307127491cd3SBram Moolenaar  CheckDefAndScriptSuccess(lines)
30728a7d6542SBram Moolenaarenddef
30738a7d6542SBram Moolenaar
30748a7d6542SBram Moolenaarfunc Test_expr7_fails()
30755afd081cSBram Moolenaar  call CheckDefFailure(["var x = (12"], "E1097:", 3)
307690193e61SBram Moolenaar  call CheckScriptFailure(['vim9script', "var x = (12"], 'E110:', 2)
30778a7d6542SBram Moolenaar
307890193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = -'xx'"], "E1030:", 1)
307990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = +'xx'"], "E1030:", 1)
308090193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = -0z12"], "E974:", 1)
308190193e61SBram Moolenaar  call CheckDefExecAndScriptFailure2(["var x = -[8]"], "E39:", 'E745:', 1)
308290193e61SBram Moolenaar  call CheckDefExecAndScriptFailure2(["var x = -{a: 1}"], "E39:", 'E728:', 1)
30838a7d6542SBram Moolenaar
308490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = @"], "E1002:", 1)
308590193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = @<"], "E354:", 1)
308658ceca5cSBram Moolenaar
308737ce6d3aSBram Moolenaar  call CheckDefFailure(["var x = [1, 2"], "E697:", 2)
308890193e61SBram Moolenaar  call CheckScriptFailure(['vim9script', "var x = [1, 2"], 'E696:', 2)
3089ee619e5bSBram Moolenaar
309090193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = [notfound]"], "E1001:", 'E121:', 1)
3091ee619e5bSBram Moolenaar
3092fae55a9cSBram Moolenaar  call CheckDefAndScriptFailure(["var X = () => 123)"], 'E488:', 1)
309390193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 123->((x) => x + 5)"], "E107:", 1)
3094fd1823e0SBram Moolenaar
309590193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = &notexist"], 'E113:', 1)
309690193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["&grepprg = [343]"], 'E1012:', 'E730:', 1)
309709f28f49SBram Moolenaar
309890193e61SBram Moolenaar  call CheckDefExecAndScriptFailure(["echo s:doesnt_exist"], 'E121:', 1)
309990193e61SBram Moolenaar  call CheckDefExecAndScriptFailure(["echo g:doesnt_exist"], 'E121:', 1)
310033fa29cfSBram Moolenaar
310190193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["echo a:somevar"], 'E1075:', 'E121:', 1)
310290193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["echo l:somevar"], 'E1075:', 'E121:', 1)
310390193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["echo x:somevar"], 'E1075:', 'E121:', 1)
310442a480bfSBram Moolenaar
310590193e61SBram Moolenaar  call CheckDefExecAndScriptFailure(["var x = +g:astring"], 'E1030:', 1)
310690193e61SBram Moolenaar  call CheckDefExecAndScriptFailure(["var x = +g:ablob"], 'E974:', 1)
310790193e61SBram Moolenaar  call CheckDefExecAndScriptFailure(["var x = +g:alist"], 'E745:', 1)
310890193e61SBram Moolenaar  call CheckDefExecAndScriptFailure(["var x = +g:adict"], 'E728:', 1)
310933fa29cfSBram Moolenaar
3110fae55a9cSBram Moolenaar  call CheckDefAndScriptFailure2(["var x = ''", "var y = x.memb"], 'E715:', 'E488:', 2)
311190193e61SBram Moolenaar
311290193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["'yes'->", "Echo()"], 'E488: Trailing characters: ->', 'E260: Missing name after ->', 1)
3113dd1a9af0SBram Moolenaar
31143affe7a6SBram Moolenaar  call CheckDefExecFailure(["[1, 2->len()"], 'E697:', 2)
311590193e61SBram Moolenaar  call CheckScriptFailure(['vim9script', "[1, 2->len()"], 'E696:', 2)
311690193e61SBram Moolenaar
311790193e61SBram Moolenaar  call CheckDefFailure(["{a: 1->len()"], 'E723:', 2)
311890193e61SBram Moolenaar  call CheckScriptFailure(['vim9script', "{a: 1->len()"], 'E722:', 2)
311990193e61SBram Moolenaar
3120e0de171eSBram Moolenaar  call CheckDefExecFailure(["{['a']: 1->len()"], 'E723:', 2)
312190193e61SBram Moolenaar  call CheckScriptFailure(['vim9script', "{['a']: 1->len()"], 'E722:', 2)
31228a7d6542SBram Moolenaarendfunc
31238a7d6542SBram Moolenaar
31248a7d6542SBram Moolenaarlet g:Funcrefs = [function('add')]
31258a7d6542SBram Moolenaar
31268a7d6542SBram Moolenaarfunc CallMe(arg)
31278a7d6542SBram Moolenaar  return a:arg
31288a7d6542SBram Moolenaarendfunc
31298a7d6542SBram Moolenaar
313038a5f517SBram Moolenaarfunc CallMe2(one, two)
313138a5f517SBram Moolenaar  return a:one .. a:two
313238a5f517SBram Moolenaarendfunc
313338a5f517SBram Moolenaar
31348a7d6542SBram Moolenaardef Test_expr7_trailing()
313590193e61SBram Moolenaar  var lines =<< trim END
3136f5be8cdbSBram Moolenaar      # user function call
31374c17ad94SBram Moolenaar      assert_equal(123, g:CallMe(123))
31384c17ad94SBram Moolenaar      assert_equal(123, g:CallMe(  123))
31394c17ad94SBram Moolenaar      assert_equal(123, g:CallMe(123  ))
31404c17ad94SBram Moolenaar      assert_equal('yesno', g:CallMe2('yes', 'no'))
31414c17ad94SBram Moolenaar      assert_equal('yesno', g:CallMe2( 'yes', 'no' ))
31424c17ad94SBram Moolenaar      assert_equal('nothing', g:CallMe('nothing'))
31438a7d6542SBram Moolenaar
3144f5be8cdbSBram Moolenaar      # partial call
314537ce6d3aSBram Moolenaar      var Part = function('g:CallMe')
31468a7d6542SBram Moolenaar      assert_equal('yes', Part('yes'))
31478a7d6542SBram Moolenaar
3148f5be8cdbSBram Moolenaar      # funcref call, using list index
314937ce6d3aSBram Moolenaar      var l = []
31508a7d6542SBram Moolenaar      g:Funcrefs[0](l, 2)
31518a7d6542SBram Moolenaar      assert_equal([2], l)
31528a7d6542SBram Moolenaar
3153f5be8cdbSBram Moolenaar      # method call
31548a7d6542SBram Moolenaar      l = [2, 5, 6]
31552949cfdbSBram Moolenaar      l->map((k, v) => k + v)
31568a7d6542SBram Moolenaar      assert_equal([2, 6, 8], l)
31578a7d6542SBram Moolenaar
3158f5be8cdbSBram Moolenaar      # lambda method call
31598a7d6542SBram Moolenaar      l = [2, 5]
3160057e84afSBram Moolenaar      l->((ll) => add(ll, 8))()
31618a7d6542SBram Moolenaar      assert_equal([2, 5, 8], l)
31628a7d6542SBram Moolenaar
3163f5be8cdbSBram Moolenaar      # dict member
3164e0de171eSBram Moolenaar      var d = {key: 123}
31658a7d6542SBram Moolenaar      assert_equal(123, d.key)
316690193e61SBram Moolenaar  END
316790193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
31688a7d6542SBram Moolenaarenddef
31698a7d6542SBram Moolenaar
317011107babSBram Moolenaardef Test_expr7_string_subscript()
317137ce6d3aSBram Moolenaar  var lines =<< trim END
317237ce6d3aSBram Moolenaar    var text = 'abcdef'
3173e7525c55SBram Moolenaar    assert_equal('f', text[-1])
3174bf9d8c37SBram Moolenaar    assert_equal('a', text[0])
3175bf9d8c37SBram Moolenaar    assert_equal('e', text[4])
3176bf9d8c37SBram Moolenaar    assert_equal('f', text[5])
3177bf9d8c37SBram Moolenaar    assert_equal('', text[6])
3178e3c37d8eSBram Moolenaar
3179e7525c55SBram Moolenaar    text = 'ábçdë'
3180e7525c55SBram Moolenaar    assert_equal('ë', text[-1])
3181e7525c55SBram Moolenaar    assert_equal('d', text[-2])
3182e7525c55SBram Moolenaar    assert_equal('ç', text[-3])
3183e7525c55SBram Moolenaar    assert_equal('b', text[-4])
3184e7525c55SBram Moolenaar    assert_equal('á', text[-5])
3185e7525c55SBram Moolenaar    assert_equal('', text[-6])
3186e7525c55SBram Moolenaar
3187e3c37d8eSBram Moolenaar    text = 'ábçdëf'
3188e3c37d8eSBram Moolenaar    assert_equal('', text[-999])
3189e7525c55SBram Moolenaar    assert_equal('f', text[-1])
3190e3c37d8eSBram Moolenaar    assert_equal('á', text[0])
3191e3c37d8eSBram Moolenaar    assert_equal('b', text[1])
3192e3c37d8eSBram Moolenaar    assert_equal('ç', text[2])
3193e3c37d8eSBram Moolenaar    assert_equal('d', text[3])
3194e3c37d8eSBram Moolenaar    assert_equal('ë', text[4])
3195e3c37d8eSBram Moolenaar    assert_equal('f', text[5])
3196e3c37d8eSBram Moolenaar    assert_equal('', text[6])
3197e3c37d8eSBram Moolenaar    assert_equal('', text[999])
319811107babSBram Moolenaar
319911107babSBram Moolenaar    assert_equal('ábçdëf', text[0 : -1])
320011107babSBram Moolenaar    assert_equal('ábçdëf', text[0 : -1])
320111107babSBram Moolenaar    assert_equal('ábçdëf', text[0 : -1])
320211107babSBram Moolenaar    assert_equal('ábçdëf', text[0 : -1])
320311107babSBram Moolenaar    assert_equal('ábçdëf', text[0
320411107babSBram Moolenaar                  : -1])
320511107babSBram Moolenaar    assert_equal('ábçdëf', text[0 :
320611107babSBram Moolenaar                  -1])
320711107babSBram Moolenaar    assert_equal('ábçdëf', text[0 : -1
320811107babSBram Moolenaar                  ])
320911107babSBram Moolenaar    assert_equal('bçdëf', text[1 : -1])
321011107babSBram Moolenaar    assert_equal('çdëf', text[2 : -1])
321111107babSBram Moolenaar    assert_equal('dëf', text[3 : -1])
321211107babSBram Moolenaar    assert_equal('ëf', text[4 : -1])
321311107babSBram Moolenaar    assert_equal('f', text[5 : -1])
321411107babSBram Moolenaar    assert_equal('', text[6 : -1])
321511107babSBram Moolenaar    assert_equal('', text[999 : -1])
321611107babSBram Moolenaar
321711107babSBram Moolenaar    assert_equal('ábçd', text[: 3])
321811107babSBram Moolenaar    assert_equal('bçdëf', text[1 :])
321911107babSBram Moolenaar    assert_equal('ábçdëf', text[:])
3220261417b8SBram Moolenaar
3221261417b8SBram Moolenaar    assert_equal('a', g:astring[0])
3222261417b8SBram Moolenaar    assert_equal('sd', g:astring[1 : 2])
3223261417b8SBram Moolenaar    assert_equal('asdf', g:astring[:])
3224e3c37d8eSBram Moolenaar  END
322590193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3226918a4249SBram Moolenaar
3227918a4249SBram Moolenaar  lines =<< trim END
3228918a4249SBram Moolenaar      var d = 'asdf'[1 :
3229918a4249SBram Moolenaar  END
32308ff16e01SBram Moolenaar  CheckDefFailure(lines, 'E1097:', 3)
323190193e61SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E15:', 2)
323290193e61SBram Moolenaar
3233918a4249SBram Moolenaar  lines =<< trim END
3234918a4249SBram Moolenaar      var d = 'asdf'[1 : xxx]
3235918a4249SBram Moolenaar  END
323690193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1001:', 'E121:', 1)
323790193e61SBram Moolenaar
3238918a4249SBram Moolenaar  lines =<< trim END
3239918a4249SBram Moolenaar      var d = 'asdf'[1 : 2
3240918a4249SBram Moolenaar  END
32418ff16e01SBram Moolenaar  CheckDefFailure(lines, 'E1097:', 3)
324290193e61SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E111:', 2)
324390193e61SBram Moolenaar
3244918a4249SBram Moolenaar  lines =<< trim END
3245918a4249SBram Moolenaar      var d = 'asdf'[1 : 2
3246918a4249SBram Moolenaar      echo d
3247918a4249SBram Moolenaar  END
324890193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E111:', 2)
324990193e61SBram Moolenaar
3250918a4249SBram Moolenaar  lines =<< trim END
3251918a4249SBram Moolenaar      var d = 'asdf'['1']
3252918a4249SBram Moolenaar      echo d
3253918a4249SBram Moolenaar  END
325490193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "1"', 1)
325590193e61SBram Moolenaar
3256918a4249SBram Moolenaar  lines =<< trim END
3257918a4249SBram Moolenaar      var d = 'asdf'['1' : 2]
3258918a4249SBram Moolenaar      echo d
3259918a4249SBram Moolenaar  END
326090193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "1"', 1)
326190193e61SBram Moolenaar
3262918a4249SBram Moolenaar  lines =<< trim END
3263918a4249SBram Moolenaar      var d = 'asdf'[1 : '2']
3264918a4249SBram Moolenaar      echo d
3265918a4249SBram Moolenaar  END
326690193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "2"', 1)
3267bf9d8c37SBram Moolenaarenddef
3268bf9d8c37SBram Moolenaar
3269ed591877SBram Moolenaardef Test_expr7_list_subscript()
327037ce6d3aSBram Moolenaar  var lines =<< trim END
327137ce6d3aSBram Moolenaar      var list = [0, 1, 2, 3, 4]
3272ed591877SBram Moolenaar      assert_equal(0, list[0])
3273ed591877SBram Moolenaar      assert_equal(4, list[4])
3274ed591877SBram Moolenaar      assert_equal(4, list[-1])
3275ed591877SBram Moolenaar      assert_equal(0, list[-5])
3276ed591877SBram Moolenaar
3277ed591877SBram Moolenaar      assert_equal([0, 1, 2, 3, 4], list[0 : 4])
3278ed591877SBram Moolenaar      assert_equal([0, 1, 2, 3, 4], list[:])
3279ed591877SBram Moolenaar      assert_equal([1, 2, 3, 4], list[1 :])
3280ed591877SBram Moolenaar      assert_equal([2, 3, 4], list[2 : -1])
3281ed591877SBram Moolenaar      assert_equal([4], list[4 : -1])
3282ed591877SBram Moolenaar      assert_equal([], list[5 : -1])
3283ed591877SBram Moolenaar      assert_equal([], list[999 : -1])
328456acb094SBram Moolenaar      assert_equal([1, 2, 3, 4], list[g:theone : g:thefour])
3285ed591877SBram Moolenaar
3286ed591877SBram Moolenaar      assert_equal([0, 1, 2, 3], list[0 : 3])
3287ed591877SBram Moolenaar      assert_equal([0], list[0 : 0])
3288ed591877SBram Moolenaar      assert_equal([0, 1, 2, 3, 4], list[0 : -1])
3289ed591877SBram Moolenaar      assert_equal([0, 1, 2], list[0 : -3])
3290ed591877SBram Moolenaar      assert_equal([0], list[0 : -5])
3291ed591877SBram Moolenaar      assert_equal([], list[0 : -6])
3292ed591877SBram Moolenaar      assert_equal([], list[0 : -99])
3293261417b8SBram Moolenaar
3294261417b8SBram Moolenaar      assert_equal(2, g:alist[0])
3295261417b8SBram Moolenaar      assert_equal([2, 3, 4], g:alist[:])
3296ed591877SBram Moolenaar  END
3297e7525c55SBram Moolenaar  CheckDefAndScriptSuccess(lines)
329856acb094SBram Moolenaar
329937ce6d3aSBram Moolenaar  lines = ['var l = [0, 1, 2]', 'echo l[g:astring : g:theone]']
330090193e61SBram Moolenaar  CheckDefExecAndScriptFailure2(lines, 'E1012:', 'E1030:', 2)
330131a11b94SBram Moolenaar
330231a11b94SBram Moolenaar  lines =<< trim END
330331a11b94SBram Moolenaar      var ld = []
330431a11b94SBram Moolenaar      def Func()
330531a11b94SBram Moolenaar        eval ld[0].key
330631a11b94SBram Moolenaar      enddef
330731a11b94SBram Moolenaar      defcompile
330831a11b94SBram Moolenaar  END
330990193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3310ed591877SBram Moolenaarenddef
3311ed591877SBram Moolenaar
3312c6e57b74SBram Moolenaardef Test_expr7_dict_subscript()
331337ce6d3aSBram Moolenaar  var lines =<< trim END
3314e0de171eSBram Moolenaar      var l = [{lnum: 2}, {lnum: 1}]
331537ce6d3aSBram Moolenaar      var res = l[0].lnum > l[1].lnum
3316c6e57b74SBram Moolenaar      assert_true(res)
331731a11b94SBram Moolenaar
3318261417b8SBram Moolenaar      assert_equal(2, g:adict['aaa'])
3319261417b8SBram Moolenaar      assert_equal(8, g:adict.bbb)
3320261417b8SBram Moolenaar
332131a11b94SBram Moolenaar      var dd = {}
332231a11b94SBram Moolenaar      def Func1()
332331a11b94SBram Moolenaar        eval dd.key1.key2
332431a11b94SBram Moolenaar      enddef
332531a11b94SBram Moolenaar      def Func2()
332631a11b94SBram Moolenaar        eval dd['key1'].key2
332731a11b94SBram Moolenaar      enddef
332831a11b94SBram Moolenaar      defcompile
3329c6e57b74SBram Moolenaar  END
333090193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3331c6e57b74SBram Moolenaarenddef
3332c6e57b74SBram Moolenaar
3333261417b8SBram Moolenaardef Test_expr7_blob_subscript()
3334261417b8SBram Moolenaar  var lines =<< trim END
3335261417b8SBram Moolenaar      var b = 0z112233
3336261417b8SBram Moolenaar      assert_equal(0x11, b[0])
3337261417b8SBram Moolenaar      assert_equal(0z112233, b[:])
3338261417b8SBram Moolenaar
3339261417b8SBram Moolenaar      assert_equal(0x01, g:ablob[0])
3340261417b8SBram Moolenaar      assert_equal(0z01ab, g:ablob[:])
3341261417b8SBram Moolenaar  END
3342261417b8SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3343261417b8SBram Moolenaarenddef
3344261417b8SBram Moolenaar
3345a3b7fdc1SBram Moolenaardef Test_expr7_subscript_linebreak()
334690193e61SBram Moolenaar  var lines =<< trim END
334737ce6d3aSBram Moolenaar      var range = range(
3348a3b7fdc1SBram Moolenaar                    3)
334937ce6d3aSBram Moolenaar      var l = range
335075ab91ffSBram Moolenaar            ->mapnew('string(v:key)')
3351a3b7fdc1SBram Moolenaar      assert_equal(['0', '1', '2'], l)
3352a3b7fdc1SBram Moolenaar
335323c55273SBram Moolenaar      l = range
335475ab91ffSBram Moolenaar            ->mapnew('string(v:key)')
335523c55273SBram Moolenaar      assert_equal(['0', '1', '2'], l)
335623c55273SBram Moolenaar
335723c55273SBram Moolenaar      l = range # comment
335875ab91ffSBram Moolenaar            ->mapnew('string(v:key)')
335923c55273SBram Moolenaar      assert_equal(['0', '1', '2'], l)
336023c55273SBram Moolenaar
336123c55273SBram Moolenaar      l = range
336223c55273SBram Moolenaar
336375ab91ffSBram Moolenaar            ->mapnew('string(v:key)')
336423c55273SBram Moolenaar      assert_equal(['0', '1', '2'], l)
336523c55273SBram Moolenaar
336623c55273SBram Moolenaar      l = range
336723c55273SBram Moolenaar            # comment
336875ab91ffSBram Moolenaar            ->mapnew('string(v:key)')
336923c55273SBram Moolenaar      assert_equal(['0', '1', '2'], l)
337023c55273SBram Moolenaar
3371a3b7fdc1SBram Moolenaar      assert_equal('1', l[
3372a3b7fdc1SBram Moolenaar            1])
3373a3b7fdc1SBram Moolenaar
3374e0de171eSBram Moolenaar      var d = {one: 33}
337590193e61SBram Moolenaar      assert_equal(33, d
337690193e61SBram Moolenaar            .one)
337790193e61SBram Moolenaar  END
337890193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
337990193e61SBram Moolenaar
338090193e61SBram Moolenaar  lines =<< trim END
338190193e61SBram Moolenaar      var d = {one: 33}
3382a3b7fdc1SBram Moolenaar      assert_equal(33, d.
3383a3b7fdc1SBram Moolenaar            one)
338490193e61SBram Moolenaar  END
338590193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1127:', 'E116:', 2)
3386a3b7fdc1SBram Moolenaarenddef
3387a3b7fdc1SBram Moolenaar
33888a7d6542SBram Moolenaarfunc Test_expr7_trailing_fails()
338990193e61SBram Moolenaar  call CheckDefAndScriptFailure(['var l = [2]', 'l->((ll) => add(ll, 8))'], 'E107:', 2)
339090193e61SBram Moolenaar  call CheckDefAndScriptFailure(['var l = [2]', 'l->((ll) => add(ll, 8)) ()'], 'E274:', 2)
33918a7d6542SBram Moolenaarendfunc
33928a7d6542SBram Moolenaar
33938a7d6542SBram Moolenaarfunc Test_expr_fails()
3394fae55a9cSBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1'is2"], 'E488:', 1)
3395fae55a9cSBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1'isnot2"], 'E488:', 1)
339638a5f517SBram Moolenaar
339790193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["CallMe ('yes')"], 'E476:', 'E492:', 1)
339890193e61SBram Moolenaar
3399ba7c0d7bSBram Moolenaar  call CheckDefAndScriptFailure(["CallMe2('yes','no')"], 'E1069:', 1)
34000c2ca58eSBram Moolenaar
340190193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["v:nosuch += 3"], 'E1001:', 'E121:', 1)
340290193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var v:statusmsg = ''"], 'E1016: Cannot declare a v: variable:', 1)
340390193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var asdf = v:nosuch"], 'E1001:', 'E121:', 1)
340433fa29cfSBram Moolenaar
34053affe7a6SBram Moolenaar  call CheckDefFailure(["echo len('asdf'"], 'E110:', 2)
340690193e61SBram Moolenaar  call CheckScriptFailure(['vim9script', "echo len('asdf'"], 'E116:', 2)
340790193e61SBram Moolenaar
340890193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["echo Func0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789()"], 'E1011:', 'E117:', 1)
340990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["echo doesnotexist()"], 'E117:', 1)
34108a7d6542SBram Moolenaarendfunc
34116d91bcb4SBram Moolenaar
34126d91bcb4SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
3413