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)
404*9e60e899SBram Moolenaar
405*9e60e899SBram Moolenaar  lines =<< trim END
406*9e60e899SBram Moolenaar      var x = false
407*9e60e899SBram Moolenaar              || false
408*9e60e899SBram Moolenaar              || a.b
409*9e60e899SBram Moolenaar  END
410*9e60e899SBram 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)
663cff40ff9SBram Moolenaar
664cff40ff9SBram Moolenaar  for op in ['>', '>=', '<', '<=', '=~', '!~']
66590193e61SBram Moolenaar    CheckDefExecAndScriptFailure([
666cff40ff9SBram Moolenaar        "var a: any = 'a'",
667cff40ff9SBram Moolenaar        'var b: any = true',
668cff40ff9SBram Moolenaar        'echo a ' .. op .. ' b'], 'E1072:', 3)
669cff40ff9SBram Moolenaar  endfor
6708a7d6542SBram Moolenaarenddef
6718a7d6542SBram Moolenaar
6728a7d6542SBram Moolenaar" test != comperator
6738a7d6542SBram Moolenaardef Test_expr4_notequal()
674659bb227SBram Moolenaar  var lines =<< trim END
67537ce6d3aSBram Moolenaar      var trueVar = true
67637ce6d3aSBram Moolenaar      var falseVar = false
6778a7d6542SBram Moolenaar      assert_equal(false, true != true)
6789c7e6dd6SBram Moolenaar      assert_equal(true, true !=
6799c7e6dd6SBram Moolenaar                            false)
68067fbdfefSBram Moolenaar      assert_equal(false, true
68167fbdfefSBram Moolenaar                            != trueVar)
68266b31016SBram Moolenaar      assert_equal(true, true != falseVar)
6838a7d6542SBram Moolenaar      assert_equal(false, true != g:atrue)
6848a7d6542SBram Moolenaar      assert_equal(true, g:atrue != false)
6858a7d6542SBram Moolenaar
6868a7d6542SBram Moolenaar      assert_equal(false, v:none != v:none)
6878a7d6542SBram Moolenaar      assert_equal(true, v:none != v:null)
6888a7d6542SBram Moolenaar      assert_equal(false, g:anone != v:none)
6898a7d6542SBram Moolenaar      assert_equal(true, v:none != g:anull)
6908a7d6542SBram Moolenaar
69137ce6d3aSBram Moolenaar      var nr55 = 55
69237ce6d3aSBram Moolenaar      var nr0 = 55
6938a7d6542SBram Moolenaar      assert_equal(true, 2 != 0)
69466b31016SBram Moolenaar      assert_equal(true, 2 != nr0)
6958a7d6542SBram Moolenaar      assert_equal(false, 55 != 55)
69666b31016SBram Moolenaar      assert_equal(false, 55 != nr55)
6978a7d6542SBram Moolenaar      assert_equal(false, g:anint != 10)
6988a7d6542SBram Moolenaar      assert_equal(true, 61 != g:anint)
6998a7d6542SBram Moolenaar
7008a7d6542SBram Moolenaar      if has('float')
70137ce6d3aSBram Moolenaar        var ff = 0.3
7024aeeb639SBram Moolenaar        assert_equal(false, 0.3 != ff)
7034aeeb639SBram Moolenaar        assert_equal(true, 0.4 != ff)
7048a7d6542SBram Moolenaar        assert_equal(false, 0.1 != g:afloat)
7058a7d6542SBram Moolenaar        assert_equal(true, g:afloat != 0.3)
7068a7d6542SBram Moolenaar
7074aeeb639SBram Moolenaar        ff = 3.0
7084aeeb639SBram Moolenaar        assert_equal(false, ff != 3)
7094aeeb639SBram Moolenaar        assert_equal(false, 3 != ff)
7104aeeb639SBram Moolenaar        ff = 3.1
7114aeeb639SBram Moolenaar        assert_equal(true, ff != 3)
7124aeeb639SBram Moolenaar        assert_equal(true, 3 != ff)
7138a7d6542SBram Moolenaar      endif
7148a7d6542SBram Moolenaar
7158a7d6542SBram Moolenaar      assert_equal(false, 'abc' != 'abc')
7168a7d6542SBram Moolenaar      assert_equal(true, 'xyz' != 'abc')
7178a7d6542SBram Moolenaar      assert_equal(false, g:astring != 'asdf')
7188a7d6542SBram Moolenaar      assert_equal(true, 'xyz' != g:astring)
7198a7d6542SBram Moolenaar
7208a7d6542SBram Moolenaar      assert_equal(true, 'abc' != 'ABC')
7218a7d6542SBram Moolenaar      set ignorecase
7228a7d6542SBram Moolenaar      assert_equal(true, 'abc' != 'ABC')
723659bb227SBram Moolenaar      assert_equal(true, 'abc' !=# 'ABC')
724659bb227SBram Moolenaar      assert_equal(false, 'abc' !=? 'ABC')
7258a7d6542SBram Moolenaar      set noignorecase
7268a7d6542SBram Moolenaar
72737ce6d3aSBram Moolenaar      var bb = 0z3f
7284aeeb639SBram Moolenaar      assert_equal(false, 0z3f != bb)
7294aeeb639SBram Moolenaar      assert_equal(true, bb != 0z4f)
7308a7d6542SBram Moolenaar      assert_equal(false, g:ablob != 0z01ab)
7318a7d6542SBram Moolenaar      assert_equal(true, 0z3f != g:ablob)
7328a7d6542SBram Moolenaar
7338a7d6542SBram Moolenaar      assert_equal(false, [1, 2, 3] != [1, 2, 3])
7348a7d6542SBram Moolenaar      assert_equal(true, [1, 2, 3] != [2, 3, 1])
7358a7d6542SBram Moolenaar      assert_equal(false, [2, 3, 4] != g:alist)
7368a7d6542SBram Moolenaar      assert_equal(true, g:alist != [2, 3, 1])
7378a7d6542SBram Moolenaar      assert_equal(true, [1, 2, 3] != [])
7388a7d6542SBram Moolenaar      assert_equal(true, [1, 2, 3] != ['1', '2', '3'])
7398a7d6542SBram Moolenaar
740e0de171eSBram Moolenaar      assert_equal(false, {one: 1, two: 2} != {one: 1, two: 2})
741e0de171eSBram Moolenaar      assert_equal(true, {one: 1, two: 2} != {one: 2, two: 2})
742e0de171eSBram Moolenaar      assert_equal(true, {one: 1, two: 2} != {two: 2})
743e0de171eSBram Moolenaar      assert_equal(true, {one: 1, two: 2} != {})
744e0de171eSBram Moolenaar      assert_equal(false, g:adict != {bbb: 8, aaa: 2})
745e0de171eSBram Moolenaar      assert_equal(true, {ccc: 9, aaa: 2} != g:adict)
7468a7d6542SBram Moolenaar
7474c17ad94SBram Moolenaar      assert_equal(false, function('g:Test_expr4_equal') != function('g:Test_expr4_equal'))
7484c17ad94SBram Moolenaar      assert_equal(true, function('g:Test_expr4_equal') != function('g:Test_expr4_is'))
7498a7d6542SBram Moolenaar
7504c17ad94SBram Moolenaar      assert_equal(false, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_equal', [123]))
7514c17ad94SBram Moolenaar      assert_equal(true, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_is', [123]))
7524c17ad94SBram Moolenaar      assert_equal(true, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_equal', [999]))
753659bb227SBram Moolenaar  END
754659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
7558a7d6542SBram Moolenaarenddef
7568a7d6542SBram Moolenaar
7578a7d6542SBram Moolenaar" test > comperator
7588a7d6542SBram Moolenaardef Test_expr4_greater()
759659bb227SBram Moolenaar  var lines =<< trim END
7600062c2d4SBram Moolenaar      assert_true(2 > 0)
7619c7e6dd6SBram Moolenaar      assert_true(2 >
7629c7e6dd6SBram Moolenaar                    1)
7630062c2d4SBram Moolenaar      assert_false(2 > 2)
7640062c2d4SBram Moolenaar      assert_false(2 > 3)
76537ce6d3aSBram Moolenaar      var nr2 = 2
76666b31016SBram Moolenaar      assert_true(nr2 > 0)
76766b31016SBram Moolenaar      assert_true(nr2 >
76866b31016SBram Moolenaar                    1)
76966b31016SBram Moolenaar      assert_false(nr2 > 2)
77067fbdfefSBram Moolenaar      assert_false(nr2
77167fbdfefSBram Moolenaar                        > 3)
7720062c2d4SBram Moolenaar      if has('float')
77337ce6d3aSBram Moolenaar        var ff = 2.0
7744aeeb639SBram Moolenaar        assert_true(ff > 0.0)
7754aeeb639SBram Moolenaar        assert_true(ff > 1.0)
7764aeeb639SBram Moolenaar        assert_false(ff > 2.0)
7774aeeb639SBram Moolenaar        assert_false(ff > 3.0)
7780062c2d4SBram Moolenaar      endif
779659bb227SBram Moolenaar  END
780659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
7818a7d6542SBram Moolenaarenddef
7828a7d6542SBram Moolenaar
7838a7d6542SBram Moolenaar" test >= comperator
7848a7d6542SBram Moolenaardef Test_expr4_greaterequal()
785659bb227SBram Moolenaar  var lines =<< trim END
7860062c2d4SBram Moolenaar      assert_true(2 >= 0)
7879c7e6dd6SBram Moolenaar      assert_true(2 >=
7889c7e6dd6SBram Moolenaar                            2)
7890062c2d4SBram Moolenaar      assert_false(2 >= 3)
79037ce6d3aSBram Moolenaar      var nr2 = 2
79166b31016SBram Moolenaar      assert_true(nr2 >= 0)
79266b31016SBram Moolenaar      assert_true(nr2 >= 2)
79366b31016SBram Moolenaar      assert_false(nr2 >= 3)
7940062c2d4SBram Moolenaar      if has('float')
79537ce6d3aSBram Moolenaar        var ff = 2.0
7964aeeb639SBram Moolenaar        assert_true(ff >= 0.0)
7974aeeb639SBram Moolenaar        assert_true(ff >= 2.0)
7984aeeb639SBram Moolenaar        assert_false(ff >= 3.0)
7990062c2d4SBram Moolenaar      endif
800659bb227SBram Moolenaar  END
801659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
8028a7d6542SBram Moolenaarenddef
8038a7d6542SBram Moolenaar
8048a7d6542SBram Moolenaar" test < comperator
8058a7d6542SBram Moolenaardef Test_expr4_smaller()
806659bb227SBram Moolenaar  var lines =<< trim END
8070062c2d4SBram Moolenaar      assert_false(2 < 0)
8089c7e6dd6SBram Moolenaar      assert_false(2 <
8099c7e6dd6SBram Moolenaar                            2)
81067fbdfefSBram Moolenaar      assert_true(2
81167fbdfefSBram Moolenaar                    < 3)
81237ce6d3aSBram Moolenaar      var nr2 = 2
81366b31016SBram Moolenaar      assert_false(nr2 < 0)
81466b31016SBram Moolenaar      assert_false(nr2 < 2)
81566b31016SBram Moolenaar      assert_true(nr2 < 3)
8160062c2d4SBram Moolenaar      if has('float')
81737ce6d3aSBram Moolenaar        var ff = 2.0
8184aeeb639SBram Moolenaar        assert_false(ff < 0.0)
8194aeeb639SBram Moolenaar        assert_false(ff < 2.0)
8204aeeb639SBram Moolenaar        assert_true(ff < 3.0)
8210062c2d4SBram Moolenaar      endif
822659bb227SBram Moolenaar  END
823659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
8248a7d6542SBram Moolenaarenddef
8258a7d6542SBram Moolenaar
8268a7d6542SBram Moolenaar" test <= comperator
8278a7d6542SBram Moolenaardef Test_expr4_smallerequal()
828659bb227SBram Moolenaar  var lines =<< trim END
8290062c2d4SBram Moolenaar      assert_false(2 <= 0)
8309c7e6dd6SBram Moolenaar      assert_false(2 <=
8319c7e6dd6SBram Moolenaar                            1)
83267fbdfefSBram Moolenaar      assert_true(2
83367fbdfefSBram Moolenaar                    <= 2)
8340062c2d4SBram Moolenaar      assert_true(2 <= 3)
83537ce6d3aSBram Moolenaar      var nr2 = 2
83666b31016SBram Moolenaar      assert_false(nr2 <= 0)
83766b31016SBram Moolenaar      assert_false(nr2 <= 1)
83866b31016SBram Moolenaar      assert_true(nr2 <= 2)
83966b31016SBram Moolenaar      assert_true(nr2 <= 3)
8400062c2d4SBram Moolenaar      if has('float')
84137ce6d3aSBram Moolenaar        var ff = 2.0
8424aeeb639SBram Moolenaar        assert_false(ff <= 0.0)
8434aeeb639SBram Moolenaar        assert_false(ff <= 1.0)
8444aeeb639SBram Moolenaar        assert_true(ff <= 2.0)
8454aeeb639SBram Moolenaar        assert_true(ff <= 3.0)
8460062c2d4SBram Moolenaar      endif
847659bb227SBram Moolenaar  END
848659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
8498a7d6542SBram Moolenaarenddef
8508a7d6542SBram Moolenaar
8518a7d6542SBram Moolenaar" test =~ comperator
8528a7d6542SBram Moolenaardef Test_expr4_match()
853659bb227SBram Moolenaar  var lines =<< trim END
8548a7d6542SBram Moolenaar      assert_equal(false, '2' =~ '0')
85567fbdfefSBram Moolenaar      assert_equal(false, ''
85667fbdfefSBram Moolenaar                             =~ '0')
8579c7e6dd6SBram Moolenaar      assert_equal(true, '2' =~
8589c7e6dd6SBram Moolenaar                            '[0-9]')
859659bb227SBram Moolenaar      set ignorecase
860659bb227SBram Moolenaar      assert_equal(false, 'abc' =~ 'ABC')
861659bb227SBram Moolenaar      assert_equal(false, 'abc' =~# 'ABC')
862659bb227SBram Moolenaar      assert_equal(true, 'abc' =~? 'ABC')
863659bb227SBram Moolenaar      set noignorecase
864659bb227SBram Moolenaar  END
865659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
8668a7d6542SBram Moolenaarenddef
8678a7d6542SBram Moolenaar
8688a7d6542SBram Moolenaar" test !~ comperator
8698a7d6542SBram Moolenaardef Test_expr4_nomatch()
870659bb227SBram Moolenaar  var lines =<< trim END
8718a7d6542SBram Moolenaar      assert_equal(true, '2' !~ '0')
87267fbdfefSBram Moolenaar      assert_equal(true, ''
87367fbdfefSBram Moolenaar                            !~ '0')
8749c7e6dd6SBram Moolenaar      assert_equal(false, '2' !~
8759c7e6dd6SBram Moolenaar                            '[0-9]')
876659bb227SBram Moolenaar  END
877659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
8788a7d6542SBram Moolenaarenddef
8798a7d6542SBram Moolenaar
8808a7d6542SBram Moolenaar" test is comperator
8818a7d6542SBram Moolenaardef Test_expr4_is()
882659bb227SBram Moolenaar  var lines =<< trim END
88337ce6d3aSBram Moolenaar      var mylist = [2]
8840062c2d4SBram Moolenaar      assert_false(mylist is [2])
88537ce6d3aSBram Moolenaar      var other = mylist
8869c7e6dd6SBram Moolenaar      assert_true(mylist is
8879c7e6dd6SBram Moolenaar                    other)
8880062c2d4SBram Moolenaar
88937ce6d3aSBram Moolenaar      var myblob = 0z1234
89067fbdfefSBram Moolenaar      assert_false(myblob
89167fbdfefSBram Moolenaar                            is 0z1234)
89237ce6d3aSBram Moolenaar      var otherblob = myblob
8930062c2d4SBram Moolenaar      assert_true(myblob is otherblob)
894659bb227SBram Moolenaar  END
895659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
8968a7d6542SBram Moolenaarenddef
8978a7d6542SBram Moolenaar
8988a7d6542SBram Moolenaar" test isnot comperator
8998a7d6542SBram Moolenaardef Test_expr4_isnot()
900659bb227SBram Moolenaar  var lines =<< trim END
90137ce6d3aSBram Moolenaar      var mylist = [2]
9020062c2d4SBram Moolenaar      assert_true('2' isnot '0')
9030062c2d4SBram Moolenaar      assert_true(mylist isnot [2])
90437ce6d3aSBram Moolenaar      var other = mylist
9059c7e6dd6SBram Moolenaar      assert_false(mylist isnot
9069c7e6dd6SBram Moolenaar                            other)
9070062c2d4SBram Moolenaar
90837ce6d3aSBram Moolenaar      var myblob = 0z1234
90967fbdfefSBram Moolenaar      assert_true(myblob
91067fbdfefSBram Moolenaar                    isnot 0z1234)
91137ce6d3aSBram Moolenaar      var otherblob = myblob
9120062c2d4SBram Moolenaar      assert_false(myblob isnot otherblob)
913659bb227SBram Moolenaar  END
914659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
9158a7d6542SBram Moolenaarenddef
9168a7d6542SBram Moolenaar
9178a7d6542SBram Moolenaardef RetVoid()
91837ce6d3aSBram Moolenaar  var x = 1
9198a7d6542SBram Moolenaarenddef
9208a7d6542SBram Moolenaar
9218294d499SBram Moolenaardef Test_expr4_vim9script()
922f5be8cdbSBram Moolenaar  # check line continuation
92337ce6d3aSBram Moolenaar  var lines =<< trim END
9249830938eSBram Moolenaar      var name = 0
925e6536aa7SBram Moolenaar      		< 1
9269830938eSBram Moolenaar      assert_equal(true, name)
927e6536aa7SBram Moolenaar  END
92890193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
929e6536aa7SBram Moolenaar
930e6536aa7SBram Moolenaar  lines =<< trim END
9319830938eSBram Moolenaar      var name = 123
93293be1644SBram Moolenaar                # comment
933e6536aa7SBram Moolenaar      		!= 123
9349830938eSBram Moolenaar      assert_equal(false, name)
935e6536aa7SBram Moolenaar  END
93690193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
937e6536aa7SBram Moolenaar
938e6536aa7SBram Moolenaar  lines =<< trim END
9399830938eSBram Moolenaar      var name = 123 ==
9409215f012SBram Moolenaar      			123
9419830938eSBram Moolenaar      assert_equal(true, name)
9429215f012SBram Moolenaar  END
94390193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
9449215f012SBram Moolenaar
9459215f012SBram Moolenaar  lines =<< trim END
94637ce6d3aSBram Moolenaar      var list = [1, 2, 3]
94737ce6d3aSBram Moolenaar      var name = list
948e6536aa7SBram Moolenaar      		is list
94937ce6d3aSBram Moolenaar      assert_equal(true, name)
950e6536aa7SBram Moolenaar  END
95190193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
952e6536aa7SBram Moolenaar
953e6536aa7SBram Moolenaar  lines =<< trim END
95493be1644SBram Moolenaar      var list = [1, 2, 3]
95593be1644SBram Moolenaar      var name = list # comment
95693be1644SBram Moolenaar                 # comment
95793be1644SBram Moolenaar      		is list
95893be1644SBram Moolenaar      assert_equal(true, name)
95993be1644SBram Moolenaar  END
96090193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
96193be1644SBram Moolenaar
96293be1644SBram Moolenaar  lines =<< trim END
96337ce6d3aSBram Moolenaar      var myblob = 0z1234
96437ce6d3aSBram Moolenaar      var name = myblob
965e6536aa7SBram Moolenaar      		isnot 0z11
96637ce6d3aSBram Moolenaar      assert_equal(true, name)
967e6536aa7SBram Moolenaar  END
96890193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
969543e6f34SBram Moolenaar
970f5be8cdbSBram Moolenaar  # spot check mismatching types
971543e6f34SBram Moolenaar  lines =<< trim END
972543e6f34SBram Moolenaar      echo '' == 0
973543e6f34SBram Moolenaar  END
97490193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1072:', 1)
975543e6f34SBram Moolenaar
976543e6f34SBram Moolenaar  lines =<< trim END
977543e6f34SBram Moolenaar      echo v:true > v:false
978543e6f34SBram Moolenaar  END
97990193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'Cannot compare bool with bool', 1)
980543e6f34SBram Moolenaar
981543e6f34SBram Moolenaar  lines =<< trim END
982543e6f34SBram Moolenaar      echo 123 is 123
983543e6f34SBram Moolenaar  END
98490193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'Cannot use "is" with number', 1)
985c71f36a8SBram Moolenaar
986ff1cd39cSBram Moolenaar  # check missing white space
987ff1cd39cSBram Moolenaar  lines =<< trim END
988ff1cd39cSBram Moolenaar    echo 2>3
989ff1cd39cSBram Moolenaar  END
99090193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''>'' at ">3"', 1)
9918294d499SBram Moolenaar
9928294d499SBram Moolenaar  lines =<< trim END
99390193e61SBram Moolenaar    echo 2 >3
99490193e61SBram Moolenaar  END
99590193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
99690193e61SBram Moolenaar
99790193e61SBram Moolenaar  lines =<< trim END
99890193e61SBram Moolenaar    echo 2> 3
99990193e61SBram Moolenaar  END
100090193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
100190193e61SBram Moolenaar
100290193e61SBram Moolenaar  lines =<< trim END
100390193e61SBram Moolenaar    echo 2!=3
100490193e61SBram Moolenaar  END
100590193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
100690193e61SBram Moolenaar
100790193e61SBram Moolenaar  lines =<< trim END
100890193e61SBram Moolenaar    echo 2 !=3
100990193e61SBram Moolenaar  END
101090193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''!='' at "!=3"', 1)
101190193e61SBram Moolenaar
101290193e61SBram Moolenaar  lines =<< trim END
101390193e61SBram Moolenaar    echo 2!= 3
101490193e61SBram Moolenaar  END
101590193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
101690193e61SBram Moolenaar
10174ac198c6Smityu  for op in ['==', '>', '>=', '<', '<=', '=~', '!~', 'is', 'isnot']
10184ac198c6Smityu    lines = ["echo 'aaa'", op .. "'bbb'", '# comment']
10194ac198c6Smityu    var msg = printf("E1004: White space required before and after '%s'", op)
10204ac198c6Smityu    CheckDefAndScriptFailure(lines, msg, 2)
10214ac198c6Smityu  endfor
10224ac198c6Smityu
102390193e61SBram Moolenaar  lines =<< trim END
10248294d499SBram Moolenaar    echo len('xxx') == 3
10258294d499SBram Moolenaar  END
102690193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1027f923571eSBram Moolenaar
1028f923571eSBram Moolenaar  lines =<< trim END
102937ce6d3aSBram Moolenaar    var line = 'abc'
1030f923571eSBram Moolenaar    echo line[1] =~ '\w'
1031f923571eSBram Moolenaar  END
103290193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1033e6536aa7SBram Moolenaarenddef
1034e6536aa7SBram Moolenaar
10358a7d6542SBram Moolenaarfunc Test_expr4_fails()
10367707228aSBram Moolenaar  let msg = "White space required before and after '>'"
103790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1>2"], msg, 1)
103890193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 >2"], msg, 1)
103990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1> 2"], msg, 1)
10408a7d6542SBram Moolenaar
10417707228aSBram Moolenaar  let msg = "White space required before and after '=='"
104290193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1==2"], msg, 1)
104390193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 ==2"], msg, 1)
104490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1== 2"], msg, 1)
10458a7d6542SBram Moolenaar
10467707228aSBram Moolenaar  let msg = "White space required before and after 'is'"
104790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1'is'2'"], msg, 1)
104890193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1' is'2'"], msg, 1)
104990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1'is '2'"], msg, 1)
10508a7d6542SBram Moolenaar
10517707228aSBram Moolenaar  let msg = "White space required before and after 'isnot'"
105290193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1'isnot'2'"], msg, 1)
105390193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1' isnot'2'"], msg, 1)
105490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1'isnot '2'"], msg, 1)
10558a7d6542SBram Moolenaar
105690193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 is# 2"], 'E15:', 1)
105790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 is? 2"], 'E15:', 1)
105890193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 isnot# 2"], 'E15:', 1)
105990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 isnot? 2"], 'E15:', 1)
10608a7d6542SBram Moolenaar
106190193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 == '2'"], 'Cannot compare number with string', 1)
106290193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1' == 2"], 'Cannot compare string with number', 1)
106390193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 == RetVoid()"], 'Cannot compare number with void', 1)
106490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = RetVoid() == 1"], 'Cannot compare void with number', 1)
10658a7d6542SBram Moolenaar
106690193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = true > false"], 'Cannot compare bool with bool', 1)
106790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = true >= false"], 'Cannot compare bool with bool', 1)
106890193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = true < false"], 'Cannot compare bool with bool', 1)
106990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = true <= false"], 'Cannot compare bool with bool', 1)
107090193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = true =~ false"], 'Cannot compare bool with bool', 1)
107190193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = true !~ false"], 'Cannot compare bool with bool', 1)
107290193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = true is false"], 'Cannot use "is" with bool', 1)
107390193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = true isnot false"], 'Cannot use "isnot" with bool', 1)
10748a7d6542SBram Moolenaar
107590193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = v:none is v:null"], 'Cannot use "is" with special', 1)
107690193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = v:none isnot v:null"], 'Cannot use "isnot" with special', 1)
107790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 123 is 123"], 'Cannot use "is" with number', 1)
107890193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 123 isnot 123"], 'Cannot use "isnot" with number', 1)
10798a7d6542SBram Moolenaar  if has('float')
108090193e61SBram Moolenaar    call CheckDefAndScriptFailure(["var x = 1.3 is 1.3"], 'Cannot use "is" with float', 1)
108190193e61SBram Moolenaar    call CheckDefAndScriptFailure(["var x = 1.3 isnot 1.3"], 'Cannot use "isnot" with float', 1)
10828a7d6542SBram Moolenaar  endif
10838a7d6542SBram Moolenaar
108490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 0za1 > 0z34"], 'Cannot compare blob with blob', 1)
108590193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 0za1 >= 0z34"], 'Cannot compare blob with blob', 1)
108690193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 0za1 < 0z34"], 'Cannot compare blob with blob', 1)
108790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 0za1 <= 0z34"], 'Cannot compare blob with blob', 1)
108890193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 0za1 =~ 0z34"], 'Cannot compare blob with blob', 1)
108990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 0za1 !~ 0z34"], 'Cannot compare blob with blob', 1)
10908a7d6542SBram Moolenaar
109190193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = [13] > [88]"], 'Cannot compare list with list', 1)
109290193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = [13] >= [88]"], 'Cannot compare list with list', 1)
109390193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = [13] < [88]"], 'Cannot compare list with list', 1)
109490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = [13] <= [88]"], 'Cannot compare list with list', 1)
109590193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = [13] =~ [88]"], 'Cannot compare list with list', 1)
109690193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = [13] !~ [88]"], 'Cannot compare list with list', 1)
10975381c7a1SBram Moolenaar
109890193e61SBram Moolenaar  call CheckDefAndScriptFailure(['var j: job', 'var chan: channel', 'var r = j == chan'], 'Cannot compare job with channel', 3)
109990193e61SBram Moolenaar  call CheckDefAndScriptFailure(['var j: job', 'var x: list<any>', 'var r = j == x'], 'Cannot compare job with list', 3)
110090193e61SBram Moolenaar  call CheckDefAndScriptFailure(['var j: job', 'var Xx: func', 'var r = j == Xx'], 'Cannot compare job with func', 3)
110190193e61SBram Moolenaar  call CheckDefAndScriptFailure(['var j: job', 'var Xx: func', 'var r = j == Xx'], 'Cannot compare job with func', 3)
11028a7d6542SBram Moolenaarendfunc
11038a7d6542SBram Moolenaar
11048a7d6542SBram Moolenaar" test addition, subtraction, concatenation
11058a7d6542SBram Moolenaardef Test_expr5()
1106659bb227SBram Moolenaar  var lines =<< trim END
11078a7d6542SBram Moolenaar      assert_equal(66, 60 + 6)
11089c7e6dd6SBram Moolenaar      assert_equal(70, 60 +
11099c7e6dd6SBram Moolenaar                            g:anint)
111056acb094SBram Moolenaar      assert_equal(9, g:thefour
111167fbdfefSBram Moolenaar                            + 5)
111256acb094SBram Moolenaar      assert_equal(14, g:thefour + g:anint)
1113c785b9a7SBram Moolenaar      assert_equal([1, 2, 3, 4], [1] + g:alist)
11148a7d6542SBram Moolenaar
11158a7d6542SBram Moolenaar      assert_equal(54, 60 - 6)
11169c7e6dd6SBram Moolenaar      assert_equal(50, 60 -
11179c7e6dd6SBram Moolenaar                        g:anint)
111856acb094SBram Moolenaar      assert_equal(-1, g:thefour
111967fbdfefSBram Moolenaar                            - 5)
112056acb094SBram Moolenaar      assert_equal(-6, g:thefour - g:anint)
11218a7d6542SBram Moolenaar
11228a7d6542SBram Moolenaar      assert_equal('hello', 'hel' .. 'lo')
1123f0eefce9SBram Moolenaar      assert_equal('hello 123', 'hello ' ..
1124f0eefce9SBram Moolenaar                                            123)
112567fbdfefSBram Moolenaar      assert_equal('hello 123', 'hello '
112667fbdfefSBram Moolenaar                                    ..  123)
11278a7d6542SBram Moolenaar      assert_equal('123 hello', 123 .. ' hello')
11288a7d6542SBram Moolenaar      assert_equal('123456', 123 .. 456)
11290062c2d4SBram Moolenaar
1130a8b8af19SBram Moolenaar      assert_equal('atrue', 'a' .. true)
1131a8b8af19SBram Moolenaar      assert_equal('afalse', 'a' .. false)
113267977821SBram Moolenaar      assert_equal('anull', 'a' .. v:null)
1133418f1df5SBram Moolenaar      assert_equal('av:none', 'a' .. v:none)
1134418f1df5SBram Moolenaar      if has('float')
1135418f1df5SBram Moolenaar        assert_equal('a0.123', 'a' .. 0.123)
1136418f1df5SBram Moolenaar      endif
1137418f1df5SBram Moolenaar
1138e507ff15SBram Moolenaar      assert_equal(3, 1 + [2, 3, 4][0])
1139e507ff15SBram Moolenaar      assert_equal(5, 2 + {key: 3}['key'])
1140e507ff15SBram Moolenaar
1141a8b8af19SBram Moolenaar      set digraph
1142a8b8af19SBram Moolenaar      assert_equal('val: true', 'val: ' .. &digraph)
1143a8b8af19SBram Moolenaar      set nodigraph
1144a8b8af19SBram Moolenaar      assert_equal('val: false', 'val: ' .. &digraph)
1145a8b8af19SBram Moolenaar
11460062c2d4SBram Moolenaar      assert_equal([1, 2, 3, 4], [1, 2] + [3, 4])
11470062c2d4SBram Moolenaar      assert_equal(0z11223344, 0z1122 + 0z3344)
114867fbdfefSBram Moolenaar      assert_equal(0z112201ab, 0z1122
114967fbdfefSBram Moolenaar                                    + g:ablob)
11500062c2d4SBram Moolenaar      assert_equal(0z01ab3344, g:ablob + 0z3344)
11510062c2d4SBram Moolenaar      assert_equal(0z01ab01ab, g:ablob + g:ablob)
11523fc71285SBram Moolenaar
11533fc71285SBram Moolenaar      # concatenate non-constant to constant
115437ce6d3aSBram Moolenaar      var save_path = &path
11553fc71285SBram Moolenaar      &path = 'b'
11563fc71285SBram Moolenaar      assert_equal('ab', 'a' .. &path)
11573fc71285SBram Moolenaar      &path = save_path
11583fc71285SBram Moolenaar
11593fc71285SBram Moolenaar      @b = 'b'
11603fc71285SBram Moolenaar      assert_equal('ab', 'a' .. @b)
11613fc71285SBram Moolenaar
11623fc71285SBram Moolenaar      $ENVVAR = 'env'
11633fc71285SBram Moolenaar      assert_equal('aenv', 'a' .. $ENVVAR)
1164d62d87d8SBram Moolenaar
1165d62d87d8SBram Moolenaar      assert_equal('val', '' .. {key: 'val'}['key'])
1166659bb227SBram Moolenaar  END
1167659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
11688a7d6542SBram Moolenaarenddef
11698a7d6542SBram Moolenaar
11705409f5d8SBram Moolenaardef Test_expr5_vim9script()
1171696ba231SBram Moolenaar  # check line continuation
117237ce6d3aSBram Moolenaar  var lines =<< trim END
11739830938eSBram Moolenaar      var name = 11
11745409f5d8SBram Moolenaar      		+ 77
11755409f5d8SBram Moolenaar		- 22
11769830938eSBram Moolenaar      assert_equal(66, name)
11775409f5d8SBram Moolenaar  END
117890193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
11795409f5d8SBram Moolenaar
11805409f5d8SBram Moolenaar  lines =<< trim END
11819830938eSBram Moolenaar      var name = 11 +
1182b4caa163SBram Moolenaar		  77 -
1183b4caa163SBram Moolenaar		  22
11849830938eSBram Moolenaar      assert_equal(66, name)
1185b4caa163SBram Moolenaar  END
118690193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1187b4caa163SBram Moolenaar
1188b4caa163SBram Moolenaar  lines =<< trim END
118993be1644SBram Moolenaar      var name = 11 +  # comment
119093be1644SBram Moolenaar		  77 -
119193be1644SBram Moolenaar                  # comment
119293be1644SBram Moolenaar		  22
119393be1644SBram Moolenaar      assert_equal(66, name)
119493be1644SBram Moolenaar  END
119590193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
119693be1644SBram Moolenaar
119793be1644SBram Moolenaar  lines =<< trim END
11989830938eSBram Moolenaar      var name = 'one'
11995409f5d8SBram Moolenaar      		.. 'two'
12009830938eSBram Moolenaar      assert_equal('onetwo', name)
12015409f5d8SBram Moolenaar  END
120290193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1203696ba231SBram Moolenaar
1204696ba231SBram Moolenaar  lines =<< trim END
1205696ba231SBram Moolenaar      echo 'abc' is# 'abc'
1206696ba231SBram Moolenaar  END
120790193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:', 1)
1208696ba231SBram Moolenaar
1209696ba231SBram Moolenaar  lines =<< trim END
1210b07a39deSBram Moolenaar      echo {} - 22
1211b07a39deSBram Moolenaar  END
121290193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1036:', 'E728:', 1)
1213081db1a6SBram Moolenaar
1214081db1a6SBram Moolenaar  lines =<< trim END
1215081db1a6SBram Moolenaar      echo [] - 33
1216081db1a6SBram Moolenaar  END
121790193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1036:', 'E745:', 1)
1218081db1a6SBram Moolenaar
1219081db1a6SBram Moolenaar  lines =<< trim END
1220081db1a6SBram Moolenaar      echo 0z1234 - 44
1221081db1a6SBram Moolenaar  END
122290193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1036', 'E974:', 1)
1223b07a39deSBram Moolenaar
1224b07a39deSBram Moolenaar  lines =<< trim END
1225696ba231SBram Moolenaar      echo 'abc' is? 'abc'
1226696ba231SBram Moolenaar  END
122790193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:', 1)
1228696ba231SBram Moolenaar
1229696ba231SBram Moolenaar  lines =<< trim END
1230696ba231SBram Moolenaar      echo 'abc' isnot# 'abc'
1231696ba231SBram Moolenaar  END
123290193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:', 1)
1233696ba231SBram Moolenaar
1234696ba231SBram Moolenaar  lines =<< trim END
1235696ba231SBram Moolenaar      echo 'abc' isnot? 'abc'
1236696ba231SBram Moolenaar  END
123790193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:', 1)
1238bb1b5e24SBram Moolenaar
1239bb1b5e24SBram Moolenaar  # check white space
1240bb1b5e24SBram Moolenaar  lines =<< trim END
1241bb1b5e24SBram Moolenaar      echo 5+6
1242bb1b5e24SBram Moolenaar  END
124390193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
1244bb1b5e24SBram Moolenaar  lines =<< trim END
1245bb1b5e24SBram Moolenaar      echo 5 +6
1246bb1b5e24SBram Moolenaar  END
124790193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
1248bb1b5e24SBram Moolenaar
1249bb1b5e24SBram Moolenaar  lines =<< trim END
125090193e61SBram Moolenaar      echo 5+ 6
1251bb1b5e24SBram Moolenaar  END
125290193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
125390193e61SBram Moolenaar
1254bb1b5e24SBram Moolenaar  lines =<< trim END
1255bb1b5e24SBram Moolenaar      echo 'a'..'b'
1256bb1b5e24SBram Moolenaar  END
125790193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''..'' at "..''b''"', 1)
125890193e61SBram Moolenaar
1259bb1b5e24SBram Moolenaar  lines =<< trim END
1260bb1b5e24SBram Moolenaar      echo 'a' ..'b'
1261bb1b5e24SBram Moolenaar  END
126290193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
126390193e61SBram Moolenaar
126490193e61SBram Moolenaar  lines =<< trim END
126590193e61SBram Moolenaar      echo 'a'.. 'b'
126690193e61SBram Moolenaar  END
126789dcb4dcSmityu  CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''..'' at ".. ''b''"', 1)
126889dcb4dcSmityu
126989dcb4dcSmityu  lines =<< trim END
127089dcb4dcSmityu      echo 'a'
127189dcb4dcSmityu          ..'b'
127289dcb4dcSmityu      # comment
127389dcb4dcSmityu  END
127489dcb4dcSmityu  CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''..'' at "..''b''"', 2)
1275418f1df5SBram Moolenaar
1276418f1df5SBram Moolenaar  # check invalid string concatenation
1277418f1df5SBram Moolenaar  lines =<< trim END
1278418f1df5SBram Moolenaar      echo 'a' .. [1]
1279418f1df5SBram Moolenaar  END
128090193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1105:', 'E730:', 1)
1281a9749534SBram Moolenaar
1282a9749534SBram Moolenaar  lines =<< trim END
128390193e61SBram Moolenaar      echo 'a' .. {a: 1}
128490193e61SBram Moolenaar  END
128590193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1105:', 'E731:', 1)
128690193e61SBram Moolenaar
128790193e61SBram Moolenaar  lines =<< trim END
128890193e61SBram Moolenaar      echo 'a' .. test_void()
128990193e61SBram Moolenaar  END
129090193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1105:', 'E908:', 1)
129190193e61SBram Moolenaar
129290193e61SBram Moolenaar  lines =<< trim END
129390193e61SBram Moolenaar      echo 'a' .. 0z33
129490193e61SBram Moolenaar  END
129590193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1105:', 'E976:', 1)
129690193e61SBram Moolenaar
129790193e61SBram Moolenaar  lines =<< trim END
129890193e61SBram Moolenaar      echo 'a' .. function('len')
129990193e61SBram Moolenaar  END
130090193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1105:', 'E729:', 1)
130190193e61SBram Moolenaar
130290193e61SBram Moolenaar  lines =<< trim END
1303a9749534SBram Moolenaar      new
1304a9749534SBram Moolenaar      ['']->setline(1)
1305a9749534SBram Moolenaar      /pattern
1306a9749534SBram Moolenaar
1307a9749534SBram Moolenaar      eval 0
1308a9749534SBram Moolenaar      bwipe!
1309a9749534SBram Moolenaar  END
131090193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, "E1004: White space required before and after '/' at \"/pattern", 3)
13114ac198c6Smityu
13124ac198c6Smityu  for op in ['+', '-']
13134ac198c6Smityu    lines = ['var x = 1', op .. '2', '# comment']
13144ac198c6Smityu    var msg = printf("E1004: White space required before and after '%s' at \"%s2\"", op, op)
13154ac198c6Smityu    CheckDefAndScriptFailure(lines, msg, 2)
13164ac198c6Smityu  endfor
131779182385SBram Moolenaarenddef
131879182385SBram Moolenaar
131979182385SBram Moolenaardef Test_expr5_vim9script_channel()
132079182385SBram Moolenaar  if !has('channel')
132179182385SBram Moolenaar    MissingFeature 'float'
132279182385SBram Moolenaar  else
132337ce6d3aSBram Moolenaar    var lines =<< trim END
1324418f1df5SBram Moolenaar        echo 'a' .. test_null_job()
1325418f1df5SBram Moolenaar    END
132690193e61SBram Moolenaar    CheckDefAndScriptFailure2(lines, 'E1105:', 'E908:', 1)
1327418f1df5SBram Moolenaar    lines =<< trim END
1328418f1df5SBram Moolenaar        echo 'a' .. test_null_channel()
1329418f1df5SBram Moolenaar    END
133090193e61SBram Moolenaar    CheckDefAndScriptFailure2(lines, 'E1105:', 'E908:', 1)
133179182385SBram Moolenaar  endif
13325409f5d8SBram Moolenaarenddef
13335409f5d8SBram Moolenaar
13348a7d6542SBram Moolenaardef Test_expr5_float()
13357f829cabSBram Moolenaar  if !has('float')
13367f829cabSBram Moolenaar    MissingFeature 'float'
13377f829cabSBram Moolenaar  else
1338659bb227SBram Moolenaar    var lines =<< trim END
13398a7d6542SBram Moolenaar        assert_equal(66.0, 60.0 + 6.0)
13408a7d6542SBram Moolenaar        assert_equal(66.0, 60.0 + 6)
13419c7e6dd6SBram Moolenaar        assert_equal(66.0, 60 +
13429c7e6dd6SBram Moolenaar                             6.0)
134367fbdfefSBram Moolenaar        assert_equal(5.1, g:afloat
134467fbdfefSBram Moolenaar                            + 5)
13458a7d6542SBram Moolenaar        assert_equal(8.1, 8 + g:afloat)
13468a7d6542SBram Moolenaar        assert_equal(10.1, g:anint + g:afloat)
13478a7d6542SBram Moolenaar        assert_equal(10.1, g:afloat + g:anint)
13488a7d6542SBram Moolenaar
13498a7d6542SBram Moolenaar        assert_equal(54.0, 60.0 - 6.0)
135067fbdfefSBram Moolenaar        assert_equal(54.0, 60.0
135167fbdfefSBram Moolenaar                                - 6)
13528a7d6542SBram Moolenaar        assert_equal(54.0, 60 - 6.0)
13538a7d6542SBram Moolenaar        assert_equal(-4.9, g:afloat - 5)
13548a7d6542SBram Moolenaar        assert_equal(7.9, 8 - g:afloat)
13558a7d6542SBram Moolenaar        assert_equal(9.9, g:anint - g:afloat)
13568a7d6542SBram Moolenaar        assert_equal(-9.9, g:afloat - g:anint)
1357659bb227SBram Moolenaar    END
1358659bb227SBram Moolenaar    CheckDefAndScriptSuccess(lines)
13597f829cabSBram Moolenaar  endif
13608a7d6542SBram Moolenaarenddef
13618a7d6542SBram Moolenaar
13628a7d6542SBram Moolenaarfunc Test_expr5_fails()
13637707228aSBram Moolenaar  let msg = "White space required before and after '+'"
136490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1+2"], msg, 1)
136590193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 +2"], msg, 1)
136690193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1+ 2"], msg, 1)
13678a7d6542SBram Moolenaar
13687707228aSBram Moolenaar  let msg = "White space required before and after '-'"
136990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1-2"], msg, 1)
137090193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 -2"], msg, 1)
137190193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1- 2"], msg, 1)
13728a7d6542SBram Moolenaar
13737707228aSBram Moolenaar  let msg = "White space required before and after '..'"
137490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1'..'2'"], msg, 1)
137590193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1' ..'2'"], msg, 1)
137690193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1'.. '2'"], msg, 1)
13770062c2d4SBram Moolenaar
137890193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 0z1122 + 33"], 'E1051:', 'E974:', 1)
137990193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 0z1122 + [3]"], 'E1051:', 'E974:', 1)
138090193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 0z1122 + 'asd'"], 'E1051:', 'E974:', 1)
138190193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 33 + 0z1122"], 'E1051:', 'E974:', 1)
138290193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = [3] + 0z1122"], 'E1051:', 'E745:', 1)
138390193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'asdf' + 0z1122"], 'E1051:', 'E1030:', 1)
138490193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 6 + xxx"], 'E1001:', 'E121:', 1)
1385418f1df5SBram Moolenaar
138690193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'a' .. [1]"], 'E1105:', 'E730:', 1)
138790193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'a' .. {a: 1}"], 'E1105:', 'E731:', 1)
138890193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'a' .. test_void()"], 'E1105:', 'E908:', 1)
138990193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'a' .. 0z32"], 'E1105:', 'E976:', 1)
139090193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'a' .. function('len')"], 'E1105:', 'E729:', 1)
139190193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'a' .. function('len', ['a'])"], 'E1105:', 'E729:', 1)
1392d92cc130SBram Moolenaar
139390193e61SBram Moolenaar  call CheckDefAndScriptFailure2(['var x = 1 + v:none'], 'E1051:', 'E611:', 1)
139490193e61SBram Moolenaar  call CheckDefAndScriptFailure2(['var x = 1 + v:null'], 'E1051:', 'E611:', 1)
139590193e61SBram Moolenaar  call CheckDefAndScriptFailure2(['var x = 1 + v:true'], 'E1051:', 'E1138:', 1)
139690193e61SBram Moolenaar  call CheckDefAndScriptFailure2(['var x = 1 + v:false'], 'E1051:', 'E1138:', 1)
139790193e61SBram Moolenaar  call CheckDefAndScriptFailure2(['var x = 1 + true'], 'E1051:', 'E1138:', 1)
139890193e61SBram Moolenaar  call CheckDefAndScriptFailure2(['var x = 1 + false'], 'E1051:', 'E1138:', 1)
139979182385SBram Moolenaarendfunc
140079182385SBram Moolenaar
140179182385SBram Moolenaarfunc Test_expr5_fails_channel()
140279182385SBram Moolenaar  CheckFeature channel
140390193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'a' .. test_null_job()"], 'E1105:', 'E908:', 1)
140490193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 'a' .. test_null_channel()"], 'E1105:', 'E908:', 1)
14058a7d6542SBram Moolenaarendfunc
14068a7d6542SBram Moolenaar
1407399ea810SBram Moolenaardef Test_expr5_list_add()
140890193e61SBram Moolenaar  var lines =<< trim END
1409399ea810SBram Moolenaar      # concatenating two lists with same member types is OK
1410399ea810SBram Moolenaar      var d = {}
1411399ea810SBram Moolenaar      for i in ['a'] + ['b']
1412399ea810SBram Moolenaar        d = {[i]: 0}
1413399ea810SBram Moolenaar      endfor
1414399ea810SBram Moolenaar
1415399ea810SBram Moolenaar      # concatenating two lists with different member types results in "any"
14162e5910bfSBram Moolenaar      var dany = {}
14172e5910bfSBram Moolenaar      for i in ['a'] + [12]
14182e5910bfSBram Moolenaar        dany[i] = i
1419399ea810SBram Moolenaar      endfor
14202e5910bfSBram Moolenaar      assert_equal({a: 'a', 12: 12}, dany)
1421d345fb92SBram Moolenaar
1422d345fb92SBram Moolenaar      # result of glob() is "any", runtime type check
1423d345fb92SBram Moolenaar      var sl: list<string> = glob('*.txt', false, true) + ['']
142490193e61SBram Moolenaar  END
142590193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1426399ea810SBram Moolenaarenddef
1427399ea810SBram Moolenaar
14288a7d6542SBram Moolenaar" test multiply, divide, modulo
14298a7d6542SBram Moolenaardef Test_expr6()
1430659bb227SBram Moolenaar  var lines =<< trim END
14318a7d6542SBram Moolenaar      assert_equal(36, 6 * 6)
14329c7e6dd6SBram Moolenaar      assert_equal(24, 6 *
143356acb094SBram Moolenaar                            g:thefour)
143456acb094SBram Moolenaar      assert_equal(24, g:thefour
143567fbdfefSBram Moolenaar                            * 6)
143656acb094SBram Moolenaar      assert_equal(40, g:anint * g:thefour)
14378a7d6542SBram Moolenaar
14388a7d6542SBram Moolenaar      assert_equal(10, 60 / 6)
14399c7e6dd6SBram Moolenaar      assert_equal(6, 60 /
14409c7e6dd6SBram Moolenaar                            g:anint)
14418a7d6542SBram Moolenaar      assert_equal(1, g:anint / 6)
144267fbdfefSBram Moolenaar      assert_equal(2, g:anint
144356acb094SBram Moolenaar                            / g:thefour)
14448a7d6542SBram Moolenaar
14458a7d6542SBram Moolenaar      assert_equal(5, 11 % 6)
14468a7d6542SBram Moolenaar      assert_equal(4, g:anint % 6)
14479c7e6dd6SBram Moolenaar      assert_equal(3, 13 %
14489c7e6dd6SBram Moolenaar                            g:anint)
144967fbdfefSBram Moolenaar      assert_equal(2, g:anint
145056acb094SBram Moolenaar                            % g:thefour)
14518a7d6542SBram Moolenaar
14528a7d6542SBram Moolenaar      assert_equal(4, 6 * 4 / 6)
1453b13af50fSBram Moolenaar
145437ce6d3aSBram Moolenaar      var x = [2]
145537ce6d3aSBram Moolenaar      var y = [3]
1456b13af50fSBram Moolenaar      assert_equal(5, x[0] + y[0])
1457b13af50fSBram Moolenaar      assert_equal(6, x[0] * y[0])
1458b13af50fSBram Moolenaar      if has('float')
145937ce6d3aSBram Moolenaar        var xf = [2.0]
146037ce6d3aSBram Moolenaar        var yf = [3.0]
146167fbdfefSBram Moolenaar        assert_equal(5.0, xf[0]
146267fbdfefSBram Moolenaar                            + yf[0])
146367fbdfefSBram Moolenaar        assert_equal(6.0, xf[0]
146467fbdfefSBram Moolenaar                            * yf[0])
1465b13af50fSBram Moolenaar      endif
1466659bb227SBram Moolenaar  END
1467659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
146892dba36fSBram Moolenaar
146990193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var x = 6 * xxx"], 'E1001:', 'E121:', 1)
14708ff16e01SBram Moolenaar  CheckDefFailure(["var d = 6 * "], 'E1097:', 3)
147190193e61SBram Moolenaar  CheckScriptFailure(['vim9script', "var d = 6 * "], 'E15:', 2)
147299880f96SBram Moolenaar
147399880f96SBram Moolenaar  CheckDefExecAndScriptFailure(['echo 1 / 0'], 'E1154', 1)
147499880f96SBram Moolenaar  CheckDefExecAndScriptFailure(['echo 1 % 0'], 'E1154', 1)
14758a7d6542SBram Moolenaarenddef
14768a7d6542SBram Moolenaar
14775409f5d8SBram Moolenaardef Test_expr6_vim9script()
1478b4caa163SBram Moolenaar  # check line continuation
147937ce6d3aSBram Moolenaar  var lines =<< trim END
14809830938eSBram Moolenaar      var name = 11
14815409f5d8SBram Moolenaar      		* 22
14825409f5d8SBram Moolenaar		/ 3
14839830938eSBram Moolenaar      assert_equal(80, name)
14845409f5d8SBram Moolenaar  END
148590193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
14865409f5d8SBram Moolenaar
14875409f5d8SBram Moolenaar  lines =<< trim END
14889830938eSBram Moolenaar      var name = 25
14895409f5d8SBram Moolenaar      		% 10
14909830938eSBram Moolenaar      assert_equal(5, name)
14915409f5d8SBram Moolenaar  END
149290193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1493b4caa163SBram Moolenaar
1494b4caa163SBram Moolenaar  lines =<< trim END
149593be1644SBram Moolenaar      var name = 25
149693be1644SBram Moolenaar                # comment
149793be1644SBram Moolenaar
149893be1644SBram Moolenaar                # comment
149993be1644SBram Moolenaar      		% 10
150093be1644SBram Moolenaar      assert_equal(5, name)
150193be1644SBram Moolenaar  END
150290193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
150393be1644SBram Moolenaar
150493be1644SBram Moolenaar  lines =<< trim END
15059830938eSBram Moolenaar      var name = 11 *
1506b4caa163SBram Moolenaar      		22 /
1507b4caa163SBram Moolenaar		3
15089830938eSBram Moolenaar      assert_equal(80, name)
1509b4caa163SBram Moolenaar  END
151090193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1511b4caa163SBram Moolenaar
1512b4caa163SBram Moolenaar  # check white space
1513b4caa163SBram Moolenaar  lines =<< trim END
1514b4caa163SBram Moolenaar      echo 5*6
1515b4caa163SBram Moolenaar  END
151690193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
151790193e61SBram Moolenaar
1518b4caa163SBram Moolenaar  lines =<< trim END
1519b4caa163SBram Moolenaar      echo 5 *6
1520b4caa163SBram Moolenaar  END
152190193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
152290193e61SBram Moolenaar
1523b4caa163SBram Moolenaar  lines =<< trim END
1524b4caa163SBram Moolenaar      echo 5* 6
1525b4caa163SBram Moolenaar  END
152690193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1004:', 1)
15275409f5d8SBram Moolenaarenddef
15285409f5d8SBram Moolenaar
15298a7d6542SBram Moolenaardef Test_expr6_float()
15307f829cabSBram Moolenaar  if !has('float')
15317f829cabSBram Moolenaar    MissingFeature 'float'
15327f829cabSBram Moolenaar  else
1533659bb227SBram Moolenaar    var lines =<< trim END
15348a7d6542SBram Moolenaar        assert_equal(36.0, 6.0 * 6)
15359c7e6dd6SBram Moolenaar        assert_equal(36.0, 6 *
15369c7e6dd6SBram Moolenaar                               6.0)
15378a7d6542SBram Moolenaar        assert_equal(36.0, 6.0 * 6.0)
15388a7d6542SBram Moolenaar        assert_equal(1.0, g:afloat * g:anint)
15398a7d6542SBram Moolenaar
15408a7d6542SBram Moolenaar        assert_equal(10.0, 60 / 6.0)
15419c7e6dd6SBram Moolenaar        assert_equal(10.0, 60.0 /
15429c7e6dd6SBram Moolenaar                            6)
15438a7d6542SBram Moolenaar        assert_equal(10.0, 60.0 / 6.0)
15448a7d6542SBram Moolenaar        assert_equal(0.01, g:afloat / g:anint)
15458a7d6542SBram Moolenaar
15468a7d6542SBram Moolenaar        assert_equal(4.0, 6.0 * 4 / 6)
15479c7e6dd6SBram Moolenaar        assert_equal(4.0, 6 *
15489c7e6dd6SBram Moolenaar                            4.0 /
15499c7e6dd6SBram Moolenaar                            6)
15508a7d6542SBram Moolenaar        assert_equal(4.0, 6 * 4 / 6.0)
15518a7d6542SBram Moolenaar        assert_equal(4.0, 6.0 * 4.0 / 6)
15528a7d6542SBram Moolenaar        assert_equal(4.0, 6 * 4.0 / 6.0)
15538a7d6542SBram Moolenaar        assert_equal(4.0, 6.0 * 4 / 6.0)
15548a7d6542SBram Moolenaar        assert_equal(4.0, 6.0 * 4.0 / 6.0)
15558a7d6542SBram Moolenaar
15568a7d6542SBram Moolenaar        assert_equal(4.0, 6.0 * 4.0 / 6.0)
1557659bb227SBram Moolenaar    END
1558659bb227SBram Moolenaar    CheckDefAndScriptSuccess(lines)
15597f829cabSBram Moolenaar  endif
15608a7d6542SBram Moolenaarenddef
15618a7d6542SBram Moolenaar
15628a7d6542SBram Moolenaarfunc Test_expr6_fails()
15637707228aSBram Moolenaar  let msg = "White space required before and after '*'"
156490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1*2"], msg, 1)
156590193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 *2"], msg, 1)
156690193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1* 2"], msg, 1)
15678a7d6542SBram Moolenaar
15687707228aSBram Moolenaar  let msg = "White space required before and after '/'"
156990193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1/2"], msg, 1)
157090193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 /2"], msg, 1)
157190193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1/ 2"], msg, 1)
15728a7d6542SBram Moolenaar
15737707228aSBram Moolenaar  let msg = "White space required before and after '%'"
157490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1%2"], msg, 1)
157590193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1 %2"], msg, 1)
157690193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 1% 2"], msg, 1)
15778a7d6542SBram Moolenaar
157890193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = '1' * '2'"], 'E1036:', 'E1030:', 1)
157990193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = '1' / '2'"], 'E1036:', 'E1030:', 1)
158090193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = '1' % '2'"], 'E1035:', 'E1030:', 1)
15818a7d6542SBram Moolenaar
158290193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 0z01 * 0z12"], 'E1036:', 'E974:', 1)
158390193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 0z01 / 0z12"], 'E1036:', 'E974:', 1)
158490193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 0z01 % 0z12"], 'E1035:', 'E974:', 1)
15858a7d6542SBram Moolenaar
158690193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = [1] * [2]"], 'E1036:', 'E745:', 1)
158790193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = [1] / [2]"], 'E1036:', 'E745:', 1)
158890193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = [1] % [2]"], 'E1035:', 'E745:', 1)
15898a7d6542SBram Moolenaar
159090193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = {one: 1} * {two: 2}"], 'E1036:', 'E728:', 1)
159190193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = {one: 1} / {two: 2}"], 'E1036:', 'E728:', 1)
159290193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = {one: 1} % {two: 2}"], 'E1035:', 'E728:', 1)
15938a7d6542SBram Moolenaar
159490193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 0xff[1]"], 'E1107:', 'E1062:', 1)
1595b13af50fSBram Moolenaar  if has('float')
159690193e61SBram Moolenaar    call CheckDefAndScriptFailure2(["var x = 0.7[1]"], 'E1107:', 'E806:', 1)
1597b13af50fSBram Moolenaar  endif
15984ac198c6Smityu
15994ac198c6Smityu  for op in ['*', '/', '%']
16004ac198c6Smityu    let lines = ['var x = 1', op .. '2', '# comment']
16014ac198c6Smityu    let msg = printf("E1004: White space required before and after '%s' at \"%s2\"", op, op)
16024ac198c6Smityu    call CheckDefAndScriptFailure(lines, msg, 2)
16034ac198c6Smityu  endfor
16048a7d6542SBram Moolenaarendfunc
16058a7d6542SBram Moolenaar
16068a7d6542SBram Moolenaarfunc Test_expr6_float_fails()
16078a7d6542SBram Moolenaar  CheckFeature float
160890193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = 1.0 % 2"], 'E1035:', 'E804:', 1)
16098a7d6542SBram Moolenaarendfunc
16108a7d6542SBram Moolenaar
16118a7d6542SBram Moolenaar" define here to use old style parsing
16128a7d6542SBram Moolenaarif has('float')
16138a7d6542SBram Moolenaar  let g:float_zero = 0.0
16148a7d6542SBram Moolenaar  let g:float_neg = -9.8
16158a7d6542SBram Moolenaar  let g:float_big = 9.9e99
16168a7d6542SBram Moolenaarendif
16178a7d6542SBram Moolenaarlet g:blob_empty = 0z
16188a7d6542SBram Moolenaarlet g:blob_one = 0z01
16198a7d6542SBram Moolenaarlet g:blob_long = 0z0102.0304
16208a7d6542SBram Moolenaar
16218a7d6542SBram Moolenaarlet g:string_empty = ''
16228a7d6542SBram Moolenaarlet g:string_short = 'x'
16238a7d6542SBram Moolenaarlet g:string_long = 'abcdefghijklm'
16248a7d6542SBram Moolenaarlet g:string_special = "ab\ncd\ref\ekk"
16258a7d6542SBram Moolenaar
16268a7d6542SBram Moolenaarlet g:special_true = v:true
16278a7d6542SBram Moolenaarlet g:special_false = v:false
16288a7d6542SBram Moolenaarlet g:special_null = v:null
16298a7d6542SBram Moolenaarlet g:special_none = v:none
16308a7d6542SBram Moolenaar
16318a7d6542SBram Moolenaarlet g:list_empty = []
16328a7d6542SBram Moolenaarlet g:list_mixed = [1, 'b', v:false]
16338a7d6542SBram Moolenaar
16348a7d6542SBram Moolenaarlet g:dict_empty = {}
16358a7d6542SBram Moolenaarlet g:dict_one = #{one: 1}
16368a7d6542SBram Moolenaar
16378a7d6542SBram Moolenaarlet $TESTVAR = 'testvar'
16388a7d6542SBram Moolenaar
163964d662d5SBram Moolenaar" type casts
164064d662d5SBram Moolenaardef Test_expr7t()
1641459fbdbfSBram Moolenaar  var lines =<< trim END
164237ce6d3aSBram Moolenaar      var ls: list<string> = ['a', <string>g:string_empty]
164337ce6d3aSBram Moolenaar      var ln: list<number> = [<number>g:anint, <number>g:thefour]
164437ce6d3aSBram Moolenaar      var nr = <number>234
1645d1103587SBram Moolenaar      assert_equal(234, nr)
164634fcb697SYegappan Lakshmanan      var b: bool = <bool>1
164734fcb697SYegappan Lakshmanan      assert_equal(true, b)
1648459fbdbfSBram Moolenaar      var text =
1649459fbdbfSBram Moolenaar            <string>
1650459fbdbfSBram Moolenaar              'text'
1651459fbdbfSBram Moolenaar      if false
1652459fbdbfSBram Moolenaar        text = <number>'xxx'
1653459fbdbfSBram Moolenaar      endif
1654459fbdbfSBram Moolenaar  END
1655459fbdbfSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1656d1103587SBram Moolenaar
1657459fbdbfSBram Moolenaar  CheckDefAndScriptFailure(["var x = <nr>123"], 'E1010:', 1)
16588ff16e01SBram Moolenaar  CheckDefFailure(["var x = <number>"], 'E1097:', 3)
165934fcb697SYegappan Lakshmanan  CheckDefFailure(["var x = <number>string(1)"], 'E1012:', 1)
166090193e61SBram Moolenaar  CheckScriptFailure(['vim9script', "var x = <number>"], 'E15:', 2)
1661459fbdbfSBram Moolenaar  CheckDefAndScriptFailure(["var x = <number >123"], 'E1068:', 1)
1662459fbdbfSBram Moolenaar  CheckDefAndScriptFailure(["var x = <number 123"], 'E1104:', 1)
166364d662d5SBram Moolenaarenddef
166464d662d5SBram Moolenaar
16658a7d6542SBram Moolenaar" test low level expression
16668a7d6542SBram Moolenaardef Test_expr7_number()
1667f5be8cdbSBram Moolenaar  # number constant
1668659bb227SBram Moolenaar  var lines =<< trim END
16698a7d6542SBram Moolenaar      assert_equal(0, 0)
16708a7d6542SBram Moolenaar      assert_equal(654, 0654)
16718a7d6542SBram Moolenaar
16728a7d6542SBram Moolenaar      assert_equal(6, 0x6)
16738a7d6542SBram Moolenaar      assert_equal(15, 0xf)
16748a7d6542SBram Moolenaar      assert_equal(255, 0xff)
1675659bb227SBram Moolenaar  END
1676659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
16778a7d6542SBram Moolenaarenddef
16788a7d6542SBram Moolenaar
16798a7d6542SBram Moolenaardef Test_expr7_float()
1680f5be8cdbSBram Moolenaar  # float constant
16817f829cabSBram Moolenaar  if !has('float')
16827f829cabSBram Moolenaar    MissingFeature 'float'
16837f829cabSBram Moolenaar  else
1684659bb227SBram Moolenaar    var lines =<< trim END
16858a7d6542SBram Moolenaar        assert_equal(g:float_zero, .0)
16868a7d6542SBram Moolenaar        assert_equal(g:float_zero, 0.0)
16878a7d6542SBram Moolenaar        assert_equal(g:float_neg, -9.8)
16888a7d6542SBram Moolenaar        assert_equal(g:float_big, 9.9e99)
1689659bb227SBram Moolenaar    END
1690659bb227SBram Moolenaar    CheckDefAndScriptSuccess(lines)
16918a7d6542SBram Moolenaar  endif
16928a7d6542SBram Moolenaarenddef
16938a7d6542SBram Moolenaar
16948a7d6542SBram Moolenaardef Test_expr7_blob()
1695f5be8cdbSBram Moolenaar  # blob constant
1696659bb227SBram Moolenaar  var lines =<< trim END
16978a7d6542SBram Moolenaar      assert_equal(g:blob_empty, 0z)
16988a7d6542SBram Moolenaar      assert_equal(g:blob_one, 0z01)
16998a7d6542SBram Moolenaar      assert_equal(g:blob_long, 0z0102.0304)
1700cfc3023cSBram Moolenaar
1701cfc3023cSBram Moolenaar      var testblob = 0z010203
1702cfc3023cSBram Moolenaar      assert_equal(0x01, testblob[0])
1703cfc3023cSBram Moolenaar      assert_equal(0x02, testblob[1])
1704cfc3023cSBram Moolenaar      assert_equal(0x03, testblob[-1])
1705cfc3023cSBram Moolenaar      assert_equal(0x02, testblob[-2])
1706cfc3023cSBram Moolenaar
1707cfc3023cSBram Moolenaar      assert_equal(0z01, testblob[0 : 0])
1708cfc3023cSBram Moolenaar      assert_equal(0z0102, testblob[0 : 1])
1709cfc3023cSBram Moolenaar      assert_equal(0z010203, testblob[0 : 2])
1710cfc3023cSBram Moolenaar      assert_equal(0z010203, testblob[0 : ])
1711cfc3023cSBram Moolenaar      assert_equal(0z0203, testblob[1 : ])
1712cfc3023cSBram Moolenaar      assert_equal(0z0203, testblob[1 : 2])
1713cfc3023cSBram Moolenaar      assert_equal(0z0203, testblob[1 : -1])
1714cfc3023cSBram Moolenaar      assert_equal(0z03, testblob[-1 : -1])
1715cfc3023cSBram Moolenaar      assert_equal(0z02, testblob[-2 : -2])
1716cfc3023cSBram Moolenaar
1717cfc3023cSBram Moolenaar      # blob slice accepts out of range
1718cfc3023cSBram Moolenaar      assert_equal(0z, testblob[3 : 3])
1719cfc3023cSBram Moolenaar      assert_equal(0z, testblob[0 : -4])
1720659bb227SBram Moolenaar  END
1721659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
172292dba36fSBram Moolenaar
172390193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = 0z123"], 'E973:', 1)
17248a7d6542SBram Moolenaarenddef
17258a7d6542SBram Moolenaar
17268a7d6542SBram Moolenaardef Test_expr7_string()
1727f5be8cdbSBram Moolenaar  # string constant
1728659bb227SBram Moolenaar  var lines =<< trim END
17298a7d6542SBram Moolenaar      assert_equal(g:string_empty, '')
17308a7d6542SBram Moolenaar      assert_equal(g:string_empty, "")
17318a7d6542SBram Moolenaar      assert_equal(g:string_short, 'x')
17328a7d6542SBram Moolenaar      assert_equal(g:string_short, "x")
17338a7d6542SBram Moolenaar      assert_equal(g:string_long, 'abcdefghijklm')
17348a7d6542SBram Moolenaar      assert_equal(g:string_long, "abcdefghijklm")
17358a7d6542SBram Moolenaar      assert_equal(g:string_special, "ab\ncd\ref\ekk")
1736659bb227SBram Moolenaar  END
1737659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
173892dba36fSBram Moolenaar
173990193e61SBram Moolenaar  CheckDefAndScriptFailure(['var x = "abc'], 'E114:', 1)
174090193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = 'abc"], 'E115:', 1)
17418a7d6542SBram Moolenaarenddef
17428a7d6542SBram Moolenaar
17435da356e0SBram Moolenaardef Test_expr7_vimvar()
174437ce6d3aSBram Moolenaar  var old: list<string> = v:oldfiles
174537ce6d3aSBram Moolenaar  var compl: dict<any> = v:completed_item
17465da356e0SBram Moolenaar
174737ce6d3aSBram Moolenaar  CheckDefFailure(["var old: list<number> = v:oldfiles"], 'E1012: Type mismatch; expected list<number> but got list<string>', 1)
174890193e61SBram Moolenaar  CheckScriptFailure(['vim9script', 'v:oldfiles = ["foo"]', "var old: list<number> = v:oldfiles"], 'E1012: Type mismatch; expected list<number> but got list<string>', 3)
17495e654230SBram Moolenaar  new
17505e654230SBram Moolenaar  exec "normal! afoo fo\<C-N>\<Esc>"
175190193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var old: dict<number> = v:completed_item"], 'E1012: Type mismatch; expected dict<number> but got dict<string>', 1)
17525e654230SBram Moolenaar  bwipe!
17535da356e0SBram Moolenaarenddef
17545da356e0SBram Moolenaar
17558a7d6542SBram Moolenaardef Test_expr7_special()
1756f5be8cdbSBram Moolenaar  # special constant
1757659bb227SBram Moolenaar  var lines =<< trim END
17588a7d6542SBram Moolenaar      assert_equal(g:special_true, true)
17598a7d6542SBram Moolenaar      assert_equal(g:special_false, false)
17605da356e0SBram Moolenaar      assert_equal(g:special_true, v:true)
17615da356e0SBram Moolenaar      assert_equal(g:special_false, v:false)
1762659bb227SBram Moolenaar      assert_equal(v:true, true)
1763659bb227SBram Moolenaar      assert_equal(v:false, false)
17646e4cfffeSBram Moolenaar
17656e4cfffeSBram Moolenaar      assert_equal(true, !false)
17666e4cfffeSBram Moolenaar      assert_equal(false, !true)
17676e4cfffeSBram Moolenaar      assert_equal(true, !0)
17686e4cfffeSBram Moolenaar      assert_equal(false, !1)
17696e4cfffeSBram Moolenaar      assert_equal(false, !!false)
17706e4cfffeSBram Moolenaar      assert_equal(true, !!true)
17716e4cfffeSBram Moolenaar      assert_equal(false, !!0)
17726e4cfffeSBram Moolenaar      assert_equal(true, !!1)
17736e4cfffeSBram Moolenaar
1774659bb227SBram Moolenaar      var t = true
1775659bb227SBram Moolenaar      var f = false
1776659bb227SBram Moolenaar      assert_equal(true, t)
1777659bb227SBram Moolenaar      assert_equal(false, f)
1778659bb227SBram Moolenaar
17798a7d6542SBram Moolenaar      assert_equal(g:special_null, v:null)
178067977821SBram Moolenaar      assert_equal(g:special_null, null)
17818a7d6542SBram Moolenaar      assert_equal(g:special_none, v:none)
1782659bb227SBram Moolenaar  END
1783659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
17845da356e0SBram Moolenaar
178590193e61SBram Moolenaar  CheckDefAndScriptFailure(['v:true = true'], 'E46:', 1)
178690193e61SBram Moolenaar  CheckDefAndScriptFailure(['v:true = false'], 'E46:', 1)
178790193e61SBram Moolenaar  CheckDefAndScriptFailure(['v:false = true'], 'E46:', 1)
178890193e61SBram Moolenaar  CheckDefAndScriptFailure(['v:null = 11'], 'E46:', 1)
178990193e61SBram Moolenaar  CheckDefAndScriptFailure(['v:none = 22'], 'E46:', 1)
17908a7d6542SBram Moolenaarenddef
17918a7d6542SBram Moolenaar
17928a7d6542SBram Moolenaardef Test_expr7_list()
1793f5be8cdbSBram Moolenaar  # list
1794659bb227SBram Moolenaar  var lines =<< trim END
17958a7d6542SBram Moolenaar      assert_equal(g:list_empty, [])
17968a7d6542SBram Moolenaar      assert_equal(g:list_empty, [  ])
1797127542bcSBram Moolenaar
179837ce6d3aSBram Moolenaar      var numbers: list<number> = [1, 2, 3]
1799127542bcSBram Moolenaar      numbers = [1]
1800127542bcSBram Moolenaar      numbers = []
1801127542bcSBram Moolenaar
180237ce6d3aSBram Moolenaar      var strings: list<string> = ['a', 'b', 'c']
1803127542bcSBram Moolenaar      strings = ['x']
1804127542bcSBram Moolenaar      strings = []
1805127542bcSBram Moolenaar
180637ce6d3aSBram Moolenaar      var mixed: list<any> = [1, 'b', false,]
1807127542bcSBram Moolenaar      assert_equal(g:list_mixed, mixed)
180856acb094SBram Moolenaar      assert_equal('b', mixed[1])
18090062c2d4SBram Moolenaar
1810badd8486SBram Moolenaar      echo [1,
1811badd8486SBram Moolenaar            2] [3,
1812badd8486SBram Moolenaar                    4]
1813badd8486SBram Moolenaar
181437ce6d3aSBram Moolenaar      var llstring: list<list<string>> = [['text'], []]
181577b20977SBram Moolenaar      llstring = [[], ['text']]
181677b20977SBram Moolenaar      llstring = [[], []]
1817659bb227SBram Moolenaar  END
1818659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
181977b20977SBram Moolenaar
18205597ba04SBram Moolenaar  var rangelist: list<number> = range(3)
18215597ba04SBram Moolenaar  g:rangelist = range(3)
182290193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var x: list<string> = g:rangelist"], 'E1012: Type mismatch; expected list<string> but got list<number>', 1)
18235597ba04SBram Moolenaar
182490193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var x = 1234[3]"], 'E1107:', 'E1062:', 1)
182590193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var x = g:anint[3]"], 'E1062:', 1)
182656acb094SBram Moolenaar
182790193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var x = g:list_mixed[xxx]"], 'E1001:', 'E121:', 1)
1828db199216SBram Moolenaar
182990193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = [1,2,3]"], 'E1069:', 1)
183090193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = [1 ,2, 3]"], 'E1068:', 1)
1831db199216SBram Moolenaar
183290193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["echo 1", "var x = [][0]", "echo 3"], 'E684:', 2)
18331d634542SBram Moolenaar
183490193e61SBram Moolenaar  CheckDefExecAndScriptFailure2(["var x = g:list_mixed['xx']"], 'E1012:', 'E1030:', 1)
18358ff16e01SBram Moolenaar  CheckDefFailure(["var x = g:list_mixed["], 'E1097:', 3)
183690193e61SBram Moolenaar  CheckScriptFailure(['vim9script', "var x = g:list_mixed["], 'E15:', 2)
18378ff16e01SBram Moolenaar  CheckDefFailure(["var x = g:list_mixed[0"], 'E1097:', 3)
183890193e61SBram Moolenaar  CheckScriptFailure(['vim9script', "var x = g:list_mixed[0"], 'E111:', 2)
183990193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var x = g:list_empty[3]"], 'E684:', 1)
184090193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var l: list<number> = [234, 'x']"], 'E1012:', 1)
184190193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var l: list<number> = ['x', 234]"], 'E1012:', 1)
184290193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var l: list<string> = [234, 'x']"], 'E1012:', 1)
184390193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var l: list<string> = ['x', 123]"], 'E1012:', 1)
1844c1f0066bSBram Moolenaar
1845659bb227SBram Moolenaar  lines =<< trim END
1846c1f0066bSBram Moolenaar      var datalist: list<string>
1847c1f0066bSBram Moolenaar      def Main()
1848c1f0066bSBram Moolenaar        datalist += ['x'.
1849c1f0066bSBram Moolenaar      enddef
1850c1f0066bSBram Moolenaar      Main()
1851c1f0066bSBram Moolenaar  END
185290193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1127:')
1853de4f95b0SBram Moolenaar
1854de4f95b0SBram Moolenaar  lines =<< trim END
1855de4f95b0SBram Moolenaar      var numbers = [1, 2, 3, 4]
1856de4f95b0SBram Moolenaar      var a = 1
1857de4f95b0SBram Moolenaar      var b = 2
1858de4f95b0SBram Moolenaar  END
1859e7a73e07SBram Moolenaar  CheckDefAndScriptFailure(lines + ['echo numbers[1:b]'],
1860e7a73e07SBram Moolenaar      'E1004: White space required before and after '':'' at ":b]"', 4)
1861de4f95b0SBram Moolenaar  CheckDefAndScriptFailure(lines + ['echo numbers[1: b]'], 'E1004:', 4)
1862de4f95b0SBram Moolenaar  CheckDefAndScriptFailure(lines + ['echo numbers[a :b]'], 'E1004:', 4)
18638a7d6542SBram Moolenaarenddef
18648a7d6542SBram Moolenaar
18657147820cSBram Moolenaardef Test_expr7_list_vim9script()
186637ce6d3aSBram Moolenaar  var lines =<< trim END
186737ce6d3aSBram Moolenaar      var l = [
18687147820cSBram Moolenaar		11,
18697147820cSBram Moolenaar		22,
18707147820cSBram Moolenaar		]
18717147820cSBram Moolenaar      assert_equal([11, 22], l)
1872badd8486SBram Moolenaar
1873badd8486SBram Moolenaar      echo [1,
1874badd8486SBram Moolenaar	    2] [3,
1875badd8486SBram Moolenaar		    4]
187693be1644SBram Moolenaar
187793be1644SBram Moolenaar      echo [1, # comment
187893be1644SBram Moolenaar            # comment
187993be1644SBram Moolenaar	    2] [3,
188093be1644SBram Moolenaar            # comment
188193be1644SBram Moolenaar		    4]
18827147820cSBram Moolenaar  END
188390193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
18847147820cSBram Moolenaar
18857147820cSBram Moolenaar  lines =<< trim END
188637ce6d3aSBram Moolenaar      var l = [11,
18877147820cSBram Moolenaar		22]
18887147820cSBram Moolenaar      assert_equal([11, 22], l)
18897147820cSBram Moolenaar  END
189090193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
18918ea9390bSBram Moolenaar
18928ea9390bSBram Moolenaar  lines =<< trim END
189337ce6d3aSBram Moolenaar      var l = [11,22]
18948ea9390bSBram Moolenaar  END
189590193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1069:', 1)
1896db199216SBram Moolenaar
1897db199216SBram Moolenaar  lines =<< trim END
189837ce6d3aSBram Moolenaar      var l = [11 , 22]
1899db199216SBram Moolenaar  END
190090193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1068:', 1)
190141fab3eaSBram Moolenaar
190241fab3eaSBram Moolenaar  lines =<< trim END
190337ce6d3aSBram Moolenaar    var l: list<number> = [234, 'x']
190441fab3eaSBram Moolenaar  END
190590193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012:', 1)
19069c13f762SBram Moolenaar
19079c13f762SBram Moolenaar  lines =<< trim END
190890193e61SBram Moolenaar    var l: list<number> = ['x', 234]
190990193e61SBram Moolenaar  END
191090193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012:', 1)
191190193e61SBram Moolenaar
191290193e61SBram Moolenaar  lines =<< trim END
191390193e61SBram Moolenaar    var l: list<string> = ['x', 234]
191490193e61SBram Moolenaar  END
191590193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012:', 1)
191690193e61SBram Moolenaar
191790193e61SBram Moolenaar  lines =<< trim END
191890193e61SBram Moolenaar    var l: list<string> = [234, 'x']
191990193e61SBram Moolenaar  END
192090193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012:', 1)
192190193e61SBram Moolenaar
192290193e61SBram Moolenaar  lines =<< trim END
19239c13f762SBram Moolenaar      def Failing()
19249c13f762SBram Moolenaar        job_stop()
19259c13f762SBram Moolenaar      enddef
19269c13f762SBram Moolenaar      var list = [Failing]
19279c13f762SBram Moolenaar  END
192846f479c7SBram Moolenaar  if has('channel')
192990193e61SBram Moolenaar    CheckDefAndScriptFailure(lines, 'E119:', 0)
193046f479c7SBram Moolenaar  else
193190193e61SBram Moolenaar    CheckDefAndScriptFailure(lines, 'E117:', 0)
193246f479c7SBram Moolenaar  endif
19337147820cSBram Moolenaarenddef
19347147820cSBram Moolenaar
1935ba60cc45SBram Moolenaardef LambdaWithComments(): func
19362949cfdbSBram Moolenaar  return (x) =>
1937ba60cc45SBram Moolenaar            # some comment
1938ba60cc45SBram Moolenaar            x == 1
1939ba60cc45SBram Moolenaar            # some comment
1940ba60cc45SBram Moolenaar            ||
1941ba60cc45SBram Moolenaar            x == 2
1942ba60cc45SBram Moolenaarenddef
1943ba60cc45SBram Moolenaar
1944fd77748dSBram Moolenaardef LambdaUsingArg(x: number): func
19452949cfdbSBram Moolenaar  return () =>
1946fd77748dSBram Moolenaar            # some comment
1947fd77748dSBram Moolenaar            x == 1
1948fd77748dSBram Moolenaar            # some comment
1949fd77748dSBram Moolenaar            ||
1950fd77748dSBram Moolenaar            x == 2
1951fd77748dSBram Moolenaarenddef
1952fd77748dSBram Moolenaar
19538a7d6542SBram Moolenaardef Test_expr7_lambda()
1954659bb227SBram Moolenaar  var lines =<< trim END
19552949cfdbSBram Moolenaar      var La = () => 'result'
195603717bf6SBram Moolenaar      # comment
19578a7d6542SBram Moolenaar      assert_equal('result', La())
19582949cfdbSBram Moolenaar      assert_equal([1, 3, 5], [1, 2, 3]->map((key, val) => key + val))
1959914e7eaaSBram Moolenaar
1960f5be8cdbSBram Moolenaar      # line continuation inside lambda with "cond ? expr : expr" works
196137ce6d3aSBram Moolenaar      var ll = range(3)
196275ab91ffSBram Moolenaar      var dll = mapnew(ll, (k, v) => v % 2 ? {
1963e0de171eSBram Moolenaar                ['111']: 111 } : {}
19642949cfdbSBram Moolenaar            )
196575ab91ffSBram Moolenaar      assert_equal([{}, {111: 111}, {}], dll)
19668af81d65SBram Moolenaar
196703717bf6SBram Moolenaar      # comment halfway an expression
196803717bf6SBram Moolenaar      var Ref = () => 4
196903717bf6SBram Moolenaar      # comment
197003717bf6SBram Moolenaar      + 6
197103717bf6SBram Moolenaar      assert_equal(10, Ref())
197203717bf6SBram Moolenaar
19738af81d65SBram Moolenaar      ll = range(3)
19742949cfdbSBram Moolenaar      map(ll, (k, v) => v == 8 || v
19758af81d65SBram Moolenaar                    == 9
19768af81d65SBram Moolenaar                    || v % 2 ? 111 : 222
19772949cfdbSBram Moolenaar            )
19788af81d65SBram Moolenaar      assert_equal([222, 111, 222], ll)
19798af81d65SBram Moolenaar
19808af81d65SBram Moolenaar      ll = range(3)
19812949cfdbSBram Moolenaar      map(ll, (k, v) => v != 8 && v
19828af81d65SBram Moolenaar                    != 9
19838af81d65SBram Moolenaar                    && v % 2 == 0 ? 111 : 222
19842949cfdbSBram Moolenaar            )
19858af81d65SBram Moolenaar      assert_equal([111, 222, 111], ll)
19868af81d65SBram Moolenaar
19872949cfdbSBram Moolenaar      var dl = [{key: 0}, {key: 22}]->filter(( _, v) => v['key'] )
1988e0de171eSBram Moolenaar      assert_equal([{key: 22}], dl)
19896802cce4SBram Moolenaar
1990e0de171eSBram Moolenaar      dl = [{key: 12}, {['foo']: 34}]
1991e0de171eSBram Moolenaar      assert_equal([{key: 12}], filter(dl,
19922949cfdbSBram Moolenaar            (_, v) => has_key(v, 'key') ? v['key'] == 12 : 0))
19937892b953SBram Moolenaar
1994ba60cc45SBram Moolenaar      assert_equal(false, LambdaWithComments()(0))
1995ba60cc45SBram Moolenaar      assert_equal(true, LambdaWithComments()(1))
1996ba60cc45SBram Moolenaar      assert_equal(true, LambdaWithComments()(2))
1997ba60cc45SBram Moolenaar      assert_equal(false, LambdaWithComments()(3))
1998ba60cc45SBram Moolenaar
1999fd77748dSBram Moolenaar      assert_equal(false, LambdaUsingArg(0)())
2000fd77748dSBram Moolenaar      assert_equal(true, LambdaUsingArg(1)())
2001c2ca935dSBram Moolenaar
20022949cfdbSBram Moolenaar      var res = map([1, 2, 3], (i: number, v: number) => i + v)
2003c2ca935dSBram Moolenaar      assert_equal([1, 3, 5], res)
2004659bb227SBram Moolenaar  END
2005659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2006fd77748dSBram Moolenaar
200790193e61SBram Moolenaar  CheckDefAndScriptFailure(["var Ref = (a)=>a + 1"], 'E1004:')
200890193e61SBram Moolenaar  CheckDefAndScriptFailure(["var Ref = (a)=> a + 1"], 'E1004: White space required before and after ''=>'' at "=> a + 1"')
200990193e61SBram Moolenaar  CheckDefAndScriptFailure(["var Ref = (a) =>a + 1"], 'E1004:')
2010611728f8SYegappan Lakshmanan  CheckDefAndScriptFailure2(["var Ref = (a) =< a + 1"], 'E1001:', 'E121:')
2011611728f8SYegappan Lakshmanan  CheckDefAndScriptFailure(["var Ref = (a: int) => a + 1"], 'E1010:')
2012611728f8SYegappan Lakshmanan  CheckDefAndScriptFailure(["var Ref = (a): int => a + 1"], 'E1010:')
201327bf7af9SBram Moolenaar
201490193e61SBram Moolenaar  CheckDefAndScriptFailure(["filter([1, 2], (k,v) => 1)"], 'E1069:', 1)
20153affe7a6SBram Moolenaar  # error is in first line of the lambda
201690193e61SBram Moolenaar  CheckDefAndScriptFailure(["var L = (a) => a + b"], 'E1001:', 0)
201779e8db9aSBram Moolenaar
20182949cfdbSBram Moolenaar  assert_equal('xxxyyy', 'xxx'->((a, b) => a .. b)('yyy'))
201979e8db9aSBram Moolenaar
20202949cfdbSBram Moolenaar  CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x')"], 'E118:')
20212949cfdbSBram Moolenaar  CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x', 'y')"], 'E118:')
202290193e61SBram Moolenaar  CheckDefAndScriptFailure2(["echo 'asdf'->((a) => a)(x)"], 'E1001:', 'E121:', 1)
2023a2c026d0SBram Moolenaar
202490193e61SBram Moolenaar  CheckDefAndScriptSuccess(['var Fx = (a) => ({k1: 0,', ' k2: 1})'])
202590193e61SBram Moolenaar  CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0', ' k2: 1})'], 'E722:', 2)
202690193e61SBram Moolenaar  CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0,', ' k2 1})'], 'E720:', 2)
2027a2c026d0SBram Moolenaar
202890193e61SBram Moolenaar  CheckDefAndScriptSuccess(['var Fx = (a) => [0,', ' 1]'])
202990193e61SBram Moolenaar  CheckDefAndScriptFailure(['var Fx = (a) => [0', ' 1]'], 'E696:', 2)
2030bc327cccSBram Moolenaar
2031bc327cccSBram Moolenaar  # no error for existing script variable when checking for lambda
2032bc327cccSBram Moolenaar  lines =<< trim END
2033bc327cccSBram Moolenaar    var name = 0
2034bc327cccSBram Moolenaar    eval (name + 2) / 3
2035bc327cccSBram Moolenaar  END
203690193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
20378a7d6542SBram Moolenaarenddef
20388a7d6542SBram Moolenaar
20397a6eaa06SBram Moolenaardef Test_expr7_lambda_block()
20407a6eaa06SBram Moolenaar  var lines =<< trim END
20417a6eaa06SBram Moolenaar      var Func = (s: string): string => {
20427a6eaa06SBram Moolenaar                      return 'hello ' .. s
20437a6eaa06SBram Moolenaar                    }
20447a6eaa06SBram Moolenaar      assert_equal('hello there', Func('there'))
20457a6eaa06SBram Moolenaar
20467a6eaa06SBram Moolenaar      var ll = range(3)
20477a6eaa06SBram Moolenaar      var dll = mapnew(ll, (k, v): string => {
20487a6eaa06SBram Moolenaar          if v % 2
20497a6eaa06SBram Moolenaar            return 'yes'
20507a6eaa06SBram Moolenaar          endif
20517a6eaa06SBram Moolenaar          return 'no'
20527a6eaa06SBram Moolenaar        })
20537a6eaa06SBram Moolenaar      assert_equal(['no', 'yes', 'no'], dll)
205449f1e9ecSBram Moolenaar
205549f1e9ecSBram Moolenaar      sandbox var Safe = (nr: number): number => {
205649f1e9ecSBram Moolenaar          return nr + 7
205749f1e9ecSBram Moolenaar        }
205849f1e9ecSBram Moolenaar      assert_equal(10, Safe(3))
20597a6eaa06SBram Moolenaar  END
20607a6eaa06SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2061e98f60a5SBram Moolenaar
2062e98f60a5SBram Moolenaar  lines =<< trim END
2063e98f60a5SBram Moolenaar      map([1, 2], (k, v) => { redrawt })
2064e98f60a5SBram Moolenaar  END
2065e98f60a5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E488')
206649f1e9ecSBram Moolenaar
206749f1e9ecSBram Moolenaar  lines =<< trim END
206849f1e9ecSBram Moolenaar      var Func = (nr: int) => {
206949f1e9ecSBram Moolenaar              echo nr
207049f1e9ecSBram Moolenaar            }
207149f1e9ecSBram Moolenaar  END
207249f1e9ecSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1010', 1)
207349f1e9ecSBram Moolenaar
207449f1e9ecSBram Moolenaar  lines =<< trim END
207549f1e9ecSBram Moolenaar      var Func = (nr: number): int => {
207649f1e9ecSBram Moolenaar              return nr
207749f1e9ecSBram Moolenaar            }
207849f1e9ecSBram Moolenaar  END
207949f1e9ecSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1010', 1)
208049f1e9ecSBram Moolenaar
208149f1e9ecSBram Moolenaar  lines =<< trim END
208249f1e9ecSBram Moolenaar      var Func = (nr: number): int => {
208349f1e9ecSBram Moolenaar              return nr
208449f1e9ecSBram Moolenaar  END
208549f1e9ecSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1171', 1)  # line nr is function start
208649f1e9ecSBram Moolenaar
208749f1e9ecSBram Moolenaar  lines =<< trim END
208849f1e9ecSBram Moolenaar      var Func = (nr: number): int => {
208949f1e9ecSBram Moolenaar          var ll =<< ENDIT
209049f1e9ecSBram Moolenaar             nothing
209149f1e9ecSBram Moolenaar  END
209290193e61SBram Moolenaar  CheckDefFailure(lines, 'E1145: Missing heredoc end marker: ENDIT', 0)
209390193e61SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1145: Missing heredoc end marker: ENDIT', 2)
20947a6eaa06SBram Moolenaarenddef
20957a6eaa06SBram Moolenaar
209665c44152SBram Moolenaardef NewLambdaWithComments(): func
209765c44152SBram Moolenaar  return (x) =>
209865c44152SBram Moolenaar            # some comment
209965c44152SBram Moolenaar            x == 1
210065c44152SBram Moolenaar            # some comment
210165c44152SBram Moolenaar            ||
210265c44152SBram Moolenaar            x == 2
210365c44152SBram Moolenaarenddef
210465c44152SBram Moolenaar
210565c44152SBram Moolenaardef NewLambdaUsingArg(x: number): func
210665c44152SBram Moolenaar  return () =>
210765c44152SBram Moolenaar            # some comment
210865c44152SBram Moolenaar            x == 1
210965c44152SBram Moolenaar            # some comment
211065c44152SBram Moolenaar            ||
211165c44152SBram Moolenaar            x == 2
211265c44152SBram Moolenaarenddef
211365c44152SBram Moolenaar
211465c44152SBram Moolenaardef Test_expr7_new_lambda()
211565c44152SBram Moolenaar  var lines =<< trim END
211665c44152SBram Moolenaar      var La = () => 'result'
211765c44152SBram Moolenaar      assert_equal('result', La())
211865c44152SBram Moolenaar      assert_equal([1, 3, 5], [1, 2, 3]->map((key, val) => key + val))
211965c44152SBram Moolenaar
212065c44152SBram Moolenaar      # line continuation inside lambda with "cond ? expr : expr" works
212165c44152SBram Moolenaar      var ll = range(3)
212275ab91ffSBram Moolenaar      var dll = mapnew(ll, (k, v) => v % 2 ? {
212365c44152SBram Moolenaar                ['111']: 111 } : {}
212465c44152SBram Moolenaar            )
212575ab91ffSBram Moolenaar      assert_equal([{}, {111: 111}, {}], dll)
212665c44152SBram Moolenaar
212765c44152SBram Moolenaar      ll = range(3)
212865c44152SBram Moolenaar      map(ll, (k, v) => v == 8 || v
212965c44152SBram Moolenaar                    == 9
213065c44152SBram Moolenaar                    || v % 2 ? 111 : 222
213165c44152SBram Moolenaar            )
213265c44152SBram Moolenaar      assert_equal([222, 111, 222], ll)
213365c44152SBram Moolenaar
213465c44152SBram Moolenaar      ll = range(3)
213565c44152SBram Moolenaar      map(ll, (k, v) => v != 8 && v
213665c44152SBram Moolenaar                    != 9
213765c44152SBram Moolenaar                    && v % 2 == 0 ? 111 : 222
213865c44152SBram Moolenaar            )
213965c44152SBram Moolenaar      assert_equal([111, 222, 111], ll)
214065c44152SBram Moolenaar
214165c44152SBram Moolenaar      var dl = [{key: 0}, {key: 22}]->filter(( _, v) => v['key'] )
214265c44152SBram Moolenaar      assert_equal([{key: 22}], dl)
214365c44152SBram Moolenaar
214465c44152SBram Moolenaar      dl = [{key: 12}, {['foo']: 34}]
214565c44152SBram Moolenaar      assert_equal([{key: 12}], filter(dl,
214665c44152SBram Moolenaar            (_, v) => has_key(v, 'key') ? v['key'] == 12 : 0))
214765c44152SBram Moolenaar
214865c44152SBram Moolenaar      assert_equal(false, NewLambdaWithComments()(0))
214965c44152SBram Moolenaar      assert_equal(true, NewLambdaWithComments()(1))
215065c44152SBram Moolenaar      assert_equal(true, NewLambdaWithComments()(2))
215165c44152SBram Moolenaar      assert_equal(false, NewLambdaWithComments()(3))
215265c44152SBram Moolenaar
215365c44152SBram Moolenaar      assert_equal(false, NewLambdaUsingArg(0)())
215465c44152SBram Moolenaar      assert_equal(true, NewLambdaUsingArg(1)())
215565c44152SBram Moolenaar
215665c44152SBram Moolenaar      var res = map([1, 2, 3], (i: number, v: number) => i + v)
215765c44152SBram Moolenaar      assert_equal([1, 3, 5], res)
215865c44152SBram Moolenaar
215965c44152SBram Moolenaar      # Lambda returning a dict
21609e68c325SBram Moolenaar      var Lmb = () => ({key: 42})
216165c44152SBram Moolenaar      assert_equal({key: 42}, Lmb())
2162c754b4ccSBram Moolenaar
2163c754b4ccSBram Moolenaar      var RefOne: func(number): string = (a: number): string => 'x'
2164c754b4ccSBram Moolenaar      var RefTwo: func(number): any = (a: number): any => 'x'
2165c754b4ccSBram Moolenaar
2166c754b4ccSBram Moolenaar      var Fx = (a) => ({k1: 0,
2167c754b4ccSBram Moolenaar                         k2: 1})
2168c754b4ccSBram Moolenaar      var Fy = (a) => [0,
2169c754b4ccSBram Moolenaar                       1]
217065c44152SBram Moolenaar  END
2171c754b4ccSBram Moolenaar  CheckDefAndScriptSuccess(lines)
217265c44152SBram Moolenaar
2173e462f52dSBram Moolenaar  CheckDefAndScriptFailure(["var Ref = (a)=>a + 1"], 'E1004:')
2174e462f52dSBram Moolenaar  CheckDefAndScriptFailure(["var Ref = (a)=> a + 1"], 'E1004:')
2175e7a73e07SBram Moolenaar  CheckDefAndScriptFailure(["var Ref = (a) =>a + 1"],
2176e7a73e07SBram Moolenaar      'E1004: White space required before and after ''=>'' at " =>a + 1"')
2177c754b4ccSBram Moolenaar
217890193e61SBram Moolenaar  CheckDefAndScriptFailure(["var Ref: func(number): number = (a: number): string => 'x'"], 'E1012:')
217990193e61SBram Moolenaar  CheckDefAndScriptFailure(["var Ref: func(number): string = (a: number): string => 99"], 'E1012:')
21809e68c325SBram Moolenaar
218190193e61SBram Moolenaar  CheckDefAndScriptFailure(["filter([1, 2], (k,v) => 1)"], 'E1069:', 1)
218265c44152SBram Moolenaar  # error is in first line of the lambda
218390193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var L = (a) -> a + b"], 'E1001:', 'E121:', 1)
218465c44152SBram Moolenaar
218590193e61SBram Moolenaar  assert_equal('xxxyyy', 'xxx'->((a, b) => a .. b)('yyy'))
218665c44152SBram Moolenaar
218790193e61SBram Moolenaar  CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x')"],
218890193e61SBram Moolenaar        'E118: Too many arguments for function:')
218990193e61SBram Moolenaar  CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x', 'y')"],
219090193e61SBram Moolenaar        'E118: Too many arguments for function:')
219190193e61SBram Moolenaar  CheckDefFailure(["echo 'asdf'->((a) => a)(x)"], 'E1001:', 1)
219265c44152SBram Moolenaar
219390193e61SBram Moolenaar  CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0', ' k2: 1})'], 'E722:', 2)
219490193e61SBram Moolenaar  CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0,', ' k2 1})'], 'E720:', 2)
219565c44152SBram Moolenaar
219690193e61SBram Moolenaar  CheckDefAndScriptFailure(['var Fx = (a) => [0', ' 1]'], 'E696:', 2)
219765c44152SBram Moolenaarenddef
219865c44152SBram Moolenaar
2199e40fbc2cSBram Moolenaardef Test_expr7_lambda_vim9script()
220037ce6d3aSBram Moolenaar  var lines =<< trim END
22012949cfdbSBram Moolenaar      var v = 10->((a) =>
2202e40fbc2cSBram Moolenaar	    a
2203e40fbc2cSBram Moolenaar	      + 2
22042949cfdbSBram Moolenaar            )()
2205e40fbc2cSBram Moolenaar      assert_equal(12, v)
2206e40fbc2cSBram Moolenaar  END
22072927c07bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
2208aeb2bdd0SBram Moolenaar
2209aeb2bdd0SBram Moolenaar  # nested lambda with line breaks
2210aeb2bdd0SBram Moolenaar  lines =<< trim END
22112949cfdbSBram Moolenaar      search('"', 'cW', 0, 0, () =>
2212aeb2bdd0SBram Moolenaar	synstack('.', col('.'))
22132949cfdbSBram Moolenaar          ->map((_, v) => synIDattr(v, 'name'))->len())
2214aeb2bdd0SBram Moolenaar  END
221590193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2216e40fbc2cSBram Moolenaarenddef
2217e40fbc2cSBram Moolenaar
221890193e61SBram Moolenaardef Test_expr7_funcref()
221937ce6d3aSBram Moolenaar  var lines =<< trim END
2220601e76acSBram Moolenaar      def RetNumber(): number
2221601e76acSBram Moolenaar        return 123
2222601e76acSBram Moolenaar      enddef
222337ce6d3aSBram Moolenaar      var FuncRef = RetNumber
2224601e76acSBram Moolenaar      assert_equal(123, FuncRef())
2225601e76acSBram Moolenaar  END
2226601e76acSBram Moolenaar  CheckDefAndScriptSuccess(lines)
2227fa596388SBram Moolenaar
2228fa596388SBram Moolenaar  lines =<< trim END
2229fa596388SBram Moolenaar      vim9script
2230fa596388SBram Moolenaar      func g:GlobalFunc()
2231fa596388SBram Moolenaar        return 'global'
2232fa596388SBram Moolenaar      endfunc
2233fa596388SBram Moolenaar      func s:ScriptFunc()
2234fa596388SBram Moolenaar        return 'script'
2235fa596388SBram Moolenaar      endfunc
2236fa596388SBram Moolenaar      def Test()
2237fa596388SBram Moolenaar        var Ref = g:GlobalFunc
2238fa596388SBram Moolenaar        assert_equal('global', Ref())
2239fa596388SBram Moolenaar        Ref = GlobalFunc
2240fa596388SBram Moolenaar        assert_equal('global', Ref())
2241fa596388SBram Moolenaar
2242fa596388SBram Moolenaar        Ref = s:ScriptFunc
2243fa596388SBram Moolenaar        assert_equal('script', Ref())
2244fa596388SBram Moolenaar        Ref = ScriptFunc
2245fa596388SBram Moolenaar        assert_equal('script', Ref())
2246fa596388SBram Moolenaar      enddef
2247fa596388SBram Moolenaar      Test()
2248fa596388SBram Moolenaar  END
2249fa596388SBram Moolenaar  CheckScriptSuccess(lines)
2250601e76acSBram Moolenaarenddef
2251601e76acSBram Moolenaar
22522bede173SBram Moolenaarlet g:test_space_dict = {'': 'empty', ' ': 'space'}
22532bede173SBram Moolenaarlet g:test_hash_dict = #{one: 1, two: 2}
22542bede173SBram Moolenaar
22558a7d6542SBram Moolenaardef Test_expr7_dict()
2256f5be8cdbSBram Moolenaar  # dictionary
2257659bb227SBram Moolenaar  var lines =<< trim END
22588a7d6542SBram Moolenaar      assert_equal(g:dict_empty, {})
22598a7d6542SBram Moolenaar      assert_equal(g:dict_empty, {  })
2260e0de171eSBram Moolenaar      assert_equal(g:dict_one, {['one']: 1})
226137ce6d3aSBram Moolenaar      var key = 'one'
226237ce6d3aSBram Moolenaar      var val = 1
22632bede173SBram Moolenaar      assert_equal(g:dict_one, {[key]: val})
22640062c2d4SBram Moolenaar
22652bede173SBram Moolenaar      var numbers: dict<number> = {a: 1, b: 2, c: 3}
2266e0de171eSBram Moolenaar      numbers = {a: 1}
2267e0de171eSBram Moolenaar      numbers = {}
2268127542bcSBram Moolenaar
22692bede173SBram Moolenaar      var strings: dict<string> = {a: 'a', b: 'b', c: 'c'}
2270e0de171eSBram Moolenaar      strings = {a: 'x'}
2271e0de171eSBram Moolenaar      strings = {}
2272e0de171eSBram Moolenaar
2273e0de171eSBram Moolenaar      var dash = {xx-x: 8}
2274e0de171eSBram Moolenaar      assert_equal({['xx-x']: 8}, dash)
2275e0de171eSBram Moolenaar
2276e0de171eSBram Moolenaar      var dnr = {8: 8}
2277e0de171eSBram Moolenaar      assert_equal({['8']: 8}, dnr)
2278127542bcSBram Moolenaar
22792bede173SBram Moolenaar      var mixed: dict<any> = {a: 'a', b: 42}
2280e0de171eSBram Moolenaar      mixed = {a: 'x'}
2281e0de171eSBram Moolenaar      mixed = {a: 234}
2282e0de171eSBram Moolenaar      mixed = {}
2283127542bcSBram Moolenaar
2284e0de171eSBram Moolenaar      var dictlist: dict<list<string>> = {absent: [], present: ['hi']}
2285e0de171eSBram Moolenaar      dictlist = {absent: ['hi'], present: []}
2286e0de171eSBram Moolenaar      dictlist = {absent: [], present: []}
228777b20977SBram Moolenaar
2288e0de171eSBram Moolenaar      var dictdict: dict<dict<string>> = {one: {a: 'text'}, two: {}}
2289e0de171eSBram Moolenaar      dictdict = {one: {}, two: {a: 'text'}}
2290e0de171eSBram Moolenaar      dictdict = {one: {}, two: {}}
2291c7f7f6dbSBram Moolenaar
2292e0de171eSBram Moolenaar      assert_equal({['']: 0}, {[matchstr('string', 'wont match')]: 0})
22932bede173SBram Moolenaar
22942bede173SBram Moolenaar      assert_equal(g:test_space_dict, {['']: 'empty', [' ']: 'space'})
22952bede173SBram Moolenaar      assert_equal(g:test_hash_dict, {one: 1, two: 2})
2296c5e6a717SBram Moolenaar
2297c5e6a717SBram Moolenaar      assert_equal({['a a']: 1, ['b/c']: 2}, {'a a': 1, "b/c": 2})
22986b553773SBram Moolenaar
22996b553773SBram Moolenaar      var d = {a: () => 3, b: () => 7}
23006b553773SBram Moolenaar      assert_equal(3, d.a())
23016b553773SBram Moolenaar      assert_equal(7, d.b())
23025afd081cSBram Moolenaar
23035afd081cSBram Moolenaar      var cd = { # comment
23045afd081cSBram Moolenaar                key: 'val' # comment
23055afd081cSBram Moolenaar               }
23062e5910bfSBram Moolenaar
23072e5910bfSBram Moolenaar      # different types used for the key
23082e5910bfSBram Moolenaar      var dkeys = {['key']: 'string',
23092e5910bfSBram Moolenaar                   [12]: 'numberexpr',
23102e5910bfSBram Moolenaar                   34: 'number',
23112e5910bfSBram Moolenaar                   [true]: 'bool'}
23122e5910bfSBram Moolenaar      assert_equal('string', dkeys['key'])
23132e5910bfSBram Moolenaar      assert_equal('numberexpr', dkeys[12])
23142e5910bfSBram Moolenaar      assert_equal('number', dkeys[34])
23152e5910bfSBram Moolenaar      assert_equal('bool', dkeys[true])
23162e5910bfSBram Moolenaar      if has('float')
23172e5910bfSBram Moolenaar        dkeys = {[1.2]: 'floatexpr', [3.4]: 'float'}
23182e5910bfSBram Moolenaar        assert_equal('floatexpr', dkeys[1.2])
23192e5910bfSBram Moolenaar        assert_equal('float', dkeys[3.4])
23202e5910bfSBram Moolenaar      endif
23212e5910bfSBram Moolenaar
23222e5910bfSBram Moolenaar      # automatic conversion from number to string
23232e5910bfSBram Moolenaar      var n = 123
23242e5910bfSBram Moolenaar      var dictnr = {[n]: 1}
2325a0399efaSBram Moolenaar
2326a0399efaSBram Moolenaar      # comment to start fold is OK
2327a0399efaSBram Moolenaar      var x1: number #{{ fold
2328a0399efaSBram Moolenaar      var x2 = 9 #{{ fold
2329659bb227SBram Moolenaar  END
2330659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
233177b20977SBram Moolenaar
2332e0de171eSBram Moolenaar  # legacy syntax doesn't work
23335c7a299cSBram Moolenaar  CheckDefAndScriptFailure(["var x = #{key: 8}"], 'E1170:', 1)
23345c7a299cSBram Moolenaar  CheckDefAndScriptFailure(["var x = 'a' #{a: 1}"], 'E1170:', 1)
23355c7a299cSBram Moolenaar  CheckDefAndScriptFailure(["var x = 'a' .. #{a: 1}"], 'E1170:', 1)
23365c7a299cSBram Moolenaar  CheckDefAndScriptFailure(["var x = true ? #{a: 1}"], 'E1170:', 1)
233717a836cbSBram Moolenaar
233890193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = {a:8}"], 'E1069:', 1)
233990193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = {a : 8}"], 'E1068:', 1)
234090193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = {a :8}"], 'E1068:', 1)
234190193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = {a: 8 , b: 9}"], 'E1068:', 1)
234290193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = {a: 1,b: 2}"], 'E1069:', 1)
2343e0de171eSBram Moolenaar
234490193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = {xxx}"], 'E720:', 1)
234590193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = {xxx: 1", "var y = 2"], 'E722:', 2)
2346e0de171eSBram Moolenaar  CheckDefFailure(["var x = {xxx: 1,"], 'E723:', 2)
234790193e61SBram Moolenaar  CheckScriptFailure(['vim9script', "var x = {xxx: 1,"], 'E723:', 2)
234890193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var x = {['a']: xxx}"], 'E1001:', 'E121:', 1)
234990193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = {a: 1, a: 2}"], 'E721:', 1)
2350fae55a9cSBram Moolenaar  CheckDefExecAndScriptFailure2(["var x = g:anint.member"], 'E715:', 'E488:', 1)
235190193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var x = g:dict_empty.member"], 'E716:', 1)
2352127542bcSBram Moolenaar
235390193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['var x: dict<number> = {a: 234, b: "1"}'], 'E1012:', 1)
235490193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['var x: dict<number> = {a: "x", b: 134}'], 'E1012:', 1)
235590193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['var x: dict<string> = {a: 234, b: "1"}'], 'E1012:', 1)
235690193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['var x: dict<string> = {a: "x", b: 134}'], 'E1012:', 1)
235744aefffaSBram Moolenaar
23582e5910bfSBram Moolenaar  # invalid types for the key
235990193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var x = {[[1, 2]]: 0}"], 'E1105:', 'E730:', 1)
23602e5910bfSBram Moolenaar
236144aefffaSBram Moolenaar  CheckDefFailure(['var x = ({'], 'E723:', 2)
236290193e61SBram Moolenaar  CheckScriptFailure(['vim9script', 'var x = ({'], 'E723:', 2)
236390193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['{}[getftype("file")]'], 'E716: Key not present in Dictionary: ""', 1)
23648a7d6542SBram Moolenaarenddef
23658a7d6542SBram Moolenaar
23668ea9390bSBram Moolenaardef Test_expr7_dict_vim9script()
236737ce6d3aSBram Moolenaar  var lines =<< trim END
236837ce6d3aSBram Moolenaar      var d = {
2369e0de171eSBram Moolenaar		['one']:
23708ea9390bSBram Moolenaar		   1,
2371e0de171eSBram Moolenaar		['two']: 2,
23728ea9390bSBram Moolenaar		   }
2373e0de171eSBram Moolenaar      assert_equal({one: 1, two: 2}, d)
237493be1644SBram Moolenaar
237593be1644SBram Moolenaar      d = {  # comment
2376e0de171eSBram Moolenaar		['one']:
237793be1644SBram Moolenaar                # comment
237893be1644SBram Moolenaar
237993be1644SBram Moolenaar		   1,
238093be1644SBram Moolenaar                # comment
238193be1644SBram Moolenaar                # comment
2382e0de171eSBram Moolenaar		['two']: 2,
238393be1644SBram Moolenaar		   }
2384e0de171eSBram Moolenaar      assert_equal({one: 1, two: 2}, d)
23852949cfdbSBram Moolenaar
23862949cfdbSBram Moolenaar      var dd = {k: 123->len()}
23872949cfdbSBram Moolenaar      assert_equal(3, dd.k)
23888ea9390bSBram Moolenaar  END
238990193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
23908ea9390bSBram Moolenaar
23918ea9390bSBram Moolenaar  lines =<< trim END
2392e0de171eSBram Moolenaar      var d = { ["one"]: "one", ["two"]: "two", }
2393e0de171eSBram Moolenaar      assert_equal({one: 'one', two: 'two'}, d)
2394e6b5324eSBram Moolenaar  END
239590193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2396e6b5324eSBram Moolenaar
2397e6b5324eSBram Moolenaar  lines =<< trim END
2398e0de171eSBram Moolenaar      var d = {one: 1,
23998ea9390bSBram Moolenaar		two: 2,
24008ea9390bSBram Moolenaar	       }
2401e0de171eSBram Moolenaar      assert_equal({one: 1, two: 2}, d)
24028ea9390bSBram Moolenaar  END
240390193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
24048ea9390bSBram Moolenaar
24058ea9390bSBram Moolenaar  lines =<< trim END
2406e0de171eSBram Moolenaar      var d = {one:1, two: 2}
24078ea9390bSBram Moolenaar  END
240890193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1069:', 1)
24098ea9390bSBram Moolenaar
24108ea9390bSBram Moolenaar  lines =<< trim END
2411e0de171eSBram Moolenaar      var d = {one: 1,two: 2}
24128ea9390bSBram Moolenaar  END
241390193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1069:', 1)
2414db199216SBram Moolenaar
2415db199216SBram Moolenaar  lines =<< trim END
2416e0de171eSBram Moolenaar      var d = {one : 1}
2417e0de171eSBram Moolenaar  END
241890193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1068:', 1)
2419e0de171eSBram Moolenaar
2420e0de171eSBram Moolenaar  lines =<< trim END
2421e0de171eSBram Moolenaar      var d = {one:1}
2422e0de171eSBram Moolenaar  END
242390193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1069:', 1)
2424e0de171eSBram Moolenaar
2425e0de171eSBram Moolenaar  lines =<< trim END
2426e0de171eSBram Moolenaar      var d = {one: 1 , two: 2}
2427db199216SBram Moolenaar  END
242890193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1068:', 1)
2429db199216SBram Moolenaar
2430db199216SBram Moolenaar  lines =<< trim END
2431e0de171eSBram Moolenaar    var l: dict<number> = {a: 234, b: 'x'}
243241fab3eaSBram Moolenaar  END
243390193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012:', 1)
243490193e61SBram Moolenaar
243541fab3eaSBram Moolenaar  lines =<< trim END
2436e0de171eSBram Moolenaar    var l: dict<number> = {a: 'x', b: 234}
243741fab3eaSBram Moolenaar  END
243890193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012:', 1)
243990193e61SBram Moolenaar
244041fab3eaSBram Moolenaar  lines =<< trim END
2441e0de171eSBram Moolenaar    var l: dict<string> = {a: 'x', b: 234}
244241fab3eaSBram Moolenaar  END
244390193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012:', 1)
244490193e61SBram Moolenaar
244541fab3eaSBram Moolenaar  lines =<< trim END
2446e0de171eSBram Moolenaar    var l: dict<string> = {a: 234, b: 'x'}
244741fab3eaSBram Moolenaar  END
244890193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012:', 1)
24499c13f762SBram Moolenaar
24509c13f762SBram Moolenaar  lines =<< trim END
2451918a4249SBram Moolenaar    var d = {['a']: 234, ['b': 'x'}
2452918a4249SBram Moolenaar  END
245390193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1139:', 1)
245490193e61SBram Moolenaar
2455918a4249SBram Moolenaar  lines =<< trim END
2456918a4249SBram Moolenaar    def Func()
2457918a4249SBram Moolenaar      var d = {['a']: 234, ['b': 'x'}
2458918a4249SBram Moolenaar    enddef
2459918a4249SBram Moolenaar    defcompile
2460918a4249SBram Moolenaar  END
246190193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1139:', 0)
246290193e61SBram Moolenaar
2463918a4249SBram Moolenaar  lines =<< trim END
2464918a4249SBram Moolenaar    var d = {'a':
2465918a4249SBram Moolenaar  END
246690193e61SBram Moolenaar  CheckDefFailure(lines, 'E723:', 2)
246790193e61SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E15:', 2)
246890193e61SBram Moolenaar
2469918a4249SBram Moolenaar  lines =<< trim END
2470918a4249SBram Moolenaar    def Func()
2471918a4249SBram Moolenaar      var d = {'a':
2472918a4249SBram Moolenaar    enddef
2473918a4249SBram Moolenaar    defcompile
2474918a4249SBram Moolenaar  END
247590193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E723:', 0)
2476918a4249SBram Moolenaar
2477918a4249SBram Moolenaar  lines =<< trim END
24789c13f762SBram Moolenaar      def Failing()
24799c13f762SBram Moolenaar        job_stop()
24809c13f762SBram Moolenaar      enddef
2481e0de171eSBram Moolenaar      var dict = {name: Failing}
24829c13f762SBram Moolenaar  END
248346f479c7SBram Moolenaar  if has('channel')
248490193e61SBram Moolenaar    CheckDefAndScriptFailure(lines, 'E119:', 0)
248546f479c7SBram Moolenaar  else
2486886e5e73SBram Moolenaar    CheckDefAndScriptFailure(lines, 'E117:', 0)
248746f479c7SBram Moolenaar  endif
248811005b07SBram Moolenaar
248911005b07SBram Moolenaar  lines =<< trim END
249011005b07SBram Moolenaar      vim9script
249111005b07SBram Moolenaar      var x = 99
249211005b07SBram Moolenaar      assert_equal({x: 99}, s:)
249311005b07SBram Moolenaar  END
249411005b07SBram Moolenaar  CheckScriptSuccess(lines)
24958ea9390bSBram Moolenaarenddef
24968ea9390bSBram Moolenaar
24975fa9b244SBram Moolenaardef Test_expr7_call_2bool()
24985fa9b244SBram Moolenaar  var lines =<< trim END
24995fa9b244SBram Moolenaar      vim9script
25005fa9b244SBram Moolenaar
25015fa9b244SBram Moolenaar      def BrokenCall(nr: number, mode: bool, use: string): void
25025fa9b244SBram Moolenaar        assert_equal(3, nr)
25035fa9b244SBram Moolenaar        assert_equal(false, mode)
25045fa9b244SBram Moolenaar        assert_equal('ab', use)
25055fa9b244SBram Moolenaar      enddef
25065fa9b244SBram Moolenaar
25075fa9b244SBram Moolenaar      def TestBrokenCall(): void
25085fa9b244SBram Moolenaar        BrokenCall(3, 0, 'ab')
25095fa9b244SBram Moolenaar      enddef
25105fa9b244SBram Moolenaar
25115fa9b244SBram Moolenaar      TestBrokenCall()
25125fa9b244SBram Moolenaar  END
25135fa9b244SBram Moolenaar  CheckScriptSuccess(lines)
25145fa9b244SBram Moolenaarenddef
25155fa9b244SBram Moolenaar
251650788ef3SBram Moolenaarlet g:oneString = 'one'
251750788ef3SBram Moolenaar
25180b37a2f3SBram Moolenaardef Test_expr_member()
251990193e61SBram Moolenaar  var lines =<< trim END
25200b37a2f3SBram Moolenaar      assert_equal(1, g:dict_one.one)
252137ce6d3aSBram Moolenaar      var d: dict<number> = g:dict_one
25224dac32caSBram Moolenaar      assert_equal(1, d['one'])
2523a7eedf31SBram Moolenaar      assert_equal(1, d[
2524a7eedf31SBram Moolenaar                      'one'
2525a7eedf31SBram Moolenaar                      ])
2526a7eedf31SBram Moolenaar      assert_equal(1, d
2527a7eedf31SBram Moolenaar            .one)
2528e0de171eSBram Moolenaar      d = {1: 1, _: 2}
2529b13ab999SBram Moolenaar      assert_equal(1, d
2530b13ab999SBram Moolenaar            .1)
2531b13ab999SBram Moolenaar      assert_equal(2, d
2532b13ab999SBram Moolenaar            ._)
25330b37a2f3SBram Moolenaar
2534fb9d5c51SBram Moolenaar      # getting the one member should clear the dict after getting the item
2535e0de171eSBram Moolenaar      assert_equal('one', {one: 'one'}.one)
2536e0de171eSBram Moolenaar      assert_equal('one', {one: 'one'}[g:oneString])
253790193e61SBram Moolenaar  END
253890193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2539fb9d5c51SBram Moolenaar
254090193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var x = g:dict_one.#$!"], 'E1002:', 'E15:', 1)
254190193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var d: dict<any>", "echo d['a']"], 'E716:', 2)
254290193e61SBram Moolenaar  CheckDefExecAndScriptFailure(["var d: dict<number>", "d = g:list_empty"], 'E1012: Type mismatch; expected dict<number> but got list<unknown>', 2)
25430b37a2f3SBram Moolenaarenddef
25440b37a2f3SBram Moolenaar
2545cc673e74SBram Moolenaardef Test_expr7_any_index_slice()
254637ce6d3aSBram Moolenaar  var lines =<< trim END
2547435d8978SBram Moolenaar    # getting the one member should clear the list only after getting the item
2548435d8978SBram Moolenaar    assert_equal('bbb', ['aaa', 'bbb', 'ccc'][1])
2549cc673e74SBram Moolenaar
2550cc673e74SBram Moolenaar    # string is permissive, index out of range accepted
2551cc673e74SBram Moolenaar    g:teststring = 'abcdef'
2552cc673e74SBram Moolenaar    assert_equal('b', g:teststring[1])
2553e7525c55SBram Moolenaar    assert_equal('f', g:teststring[-1])
2554cc673e74SBram Moolenaar    assert_equal('', g:teststring[99])
2555cc673e74SBram Moolenaar
2556cc673e74SBram Moolenaar    assert_equal('b', g:teststring[1 : 1])
2557cc673e74SBram Moolenaar    assert_equal('bcdef', g:teststring[1 :])
2558cc673e74SBram Moolenaar    assert_equal('abcd', g:teststring[: 3])
2559cc673e74SBram Moolenaar    assert_equal('cdef', g:teststring[-4 :])
2560cc673e74SBram Moolenaar    assert_equal('abcdef', g:teststring[-9 :])
2561cc673e74SBram Moolenaar    assert_equal('abcd', g:teststring[: -3])
2562cc673e74SBram Moolenaar    assert_equal('', g:teststring[: -9])
2563cc673e74SBram Moolenaar
25640289a093SBram Moolenaar    # composing characters are included
25650289a093SBram Moolenaar    g:teststring = 'àéû'
25660289a093SBram Moolenaar    assert_equal('à', g:teststring[0])
25670289a093SBram Moolenaar    assert_equal('é', g:teststring[1])
25680289a093SBram Moolenaar    assert_equal('û', g:teststring[2])
25690289a093SBram Moolenaar    assert_equal('', g:teststring[3])
25700289a093SBram Moolenaar    assert_equal('', g:teststring[4])
25710289a093SBram Moolenaar
25720289a093SBram Moolenaar    assert_equal('û', g:teststring[-1])
25730289a093SBram Moolenaar    assert_equal('é', g:teststring[-2])
25740289a093SBram Moolenaar    assert_equal('à', g:teststring[-3])
25750289a093SBram Moolenaar    assert_equal('', g:teststring[-4])
25760289a093SBram Moolenaar    assert_equal('', g:teststring[-5])
25770289a093SBram Moolenaar
25780289a093SBram Moolenaar    assert_equal('à', g:teststring[0 : 0])
25790289a093SBram Moolenaar    assert_equal('é', g:teststring[1 : 1])
25800289a093SBram Moolenaar    assert_equal('àé', g:teststring[0 : 1])
25810289a093SBram Moolenaar    assert_equal('àéû', g:teststring[0 : -1])
25820289a093SBram Moolenaar    assert_equal('àé', g:teststring[0 : -2])
25830289a093SBram Moolenaar    assert_equal('à', g:teststring[0 : -3])
25840289a093SBram Moolenaar    assert_equal('', g:teststring[0 : -4])
25850289a093SBram Moolenaar    assert_equal('', g:teststring[0 : -5])
25860289a093SBram Moolenaar    assert_equal('àéû', g:teststring[ : ])
25870289a093SBram Moolenaar    assert_equal('àéû', g:teststring[0 : ])
25880289a093SBram Moolenaar    assert_equal('éû', g:teststring[1 : ])
25890289a093SBram Moolenaar    assert_equal('û', g:teststring[2 : ])
25900289a093SBram Moolenaar    assert_equal('', g:teststring[3 : ])
25910289a093SBram Moolenaar    assert_equal('', g:teststring[4 : ])
25920289a093SBram Moolenaar
2593cc673e74SBram Moolenaar    # blob index cannot be out of range
2594cc673e74SBram Moolenaar    g:testblob = 0z01ab
2595cc673e74SBram Moolenaar    assert_equal(0x01, g:testblob[0])
2596cc673e74SBram Moolenaar    assert_equal(0xab, g:testblob[1])
2597cc673e74SBram Moolenaar    assert_equal(0xab, g:testblob[-1])
2598cc673e74SBram Moolenaar    assert_equal(0x01, g:testblob[-2])
2599cc673e74SBram Moolenaar
2600cc673e74SBram Moolenaar    # blob slice accepts out of range
2601cc673e74SBram Moolenaar    assert_equal(0z01ab, g:testblob[0 : 1])
2602cc673e74SBram Moolenaar    assert_equal(0z01, g:testblob[0 : 0])
2603cc673e74SBram Moolenaar    assert_equal(0z01, g:testblob[-2 : -2])
2604cc673e74SBram Moolenaar    assert_equal(0zab, g:testblob[1 : 1])
2605cc673e74SBram Moolenaar    assert_equal(0zab, g:testblob[-1 : -1])
2606cc673e74SBram Moolenaar    assert_equal(0z, g:testblob[2 : 2])
2607cc673e74SBram Moolenaar    assert_equal(0z, g:testblob[0 : -3])
2608cc673e74SBram Moolenaar
2609cc673e74SBram Moolenaar    # list index cannot be out of range
2610cc673e74SBram Moolenaar    g:testlist = [0, 1, 2, 3]
2611cc673e74SBram Moolenaar    assert_equal(0, g:testlist[0])
2612cc673e74SBram Moolenaar    assert_equal(1, g:testlist[1])
2613cc673e74SBram Moolenaar    assert_equal(3, g:testlist[3])
2614cc673e74SBram Moolenaar    assert_equal(3, g:testlist[-1])
2615cc673e74SBram Moolenaar    assert_equal(0, g:testlist[-4])
2616cc673e74SBram Moolenaar    assert_equal(1, g:testlist[g:theone])
2617cc673e74SBram Moolenaar
2618cc673e74SBram Moolenaar    # list slice accepts out of range
2619cc673e74SBram Moolenaar    assert_equal([0], g:testlist[0 : 0])
2620cc673e74SBram Moolenaar    assert_equal([3], g:testlist[3 : 3])
2621cc673e74SBram Moolenaar    assert_equal([0, 1], g:testlist[0 : 1])
2622cc673e74SBram Moolenaar    assert_equal([0, 1, 2, 3], g:testlist[0 : 3])
2623cc673e74SBram Moolenaar    assert_equal([0, 1, 2, 3], g:testlist[0 : 9])
2624cc673e74SBram Moolenaar    assert_equal([], g:testlist[-1 : 1])
2625cc673e74SBram Moolenaar    assert_equal([1], g:testlist[-3 : 1])
2626cc673e74SBram Moolenaar    assert_equal([0, 1], g:testlist[-4 : 1])
2627cc673e74SBram Moolenaar    assert_equal([0, 1], g:testlist[-9 : 1])
2628cc673e74SBram Moolenaar    assert_equal([1, 2, 3], g:testlist[1 : -1])
2629cc673e74SBram Moolenaar    assert_equal([1], g:testlist[1 : -3])
2630cc673e74SBram Moolenaar    assert_equal([], g:testlist[1 : -4])
2631cc673e74SBram Moolenaar    assert_equal([], g:testlist[1 : -9])
2632cc673e74SBram Moolenaar
2633e0de171eSBram Moolenaar    g:testdict = {a: 1, b: 2}
2634cc673e74SBram Moolenaar    assert_equal(1, g:testdict['a'])
2635cc673e74SBram Moolenaar    assert_equal(2, g:testdict['b'])
2636cc673e74SBram Moolenaar  END
2637cc673e74SBram Moolenaar
263890193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2639cc673e74SBram Moolenaar
264090193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['echo g:testblob[2]'], 'E979:', 1)
264190193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['echo g:testblob[-3]'], 'E979:', 1)
2642cc673e74SBram Moolenaar
264390193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['echo g:testlist[4]'], 'E684: list index out of range: 4', 1)
264490193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['echo g:testlist[-5]'], 'E684:', 1)
2645cc673e74SBram Moolenaar
264690193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['echo g:testdict["a" : "b"]'], 'E719:', 1)
264790193e61SBram Moolenaar  CheckDefExecAndScriptFailure(['echo g:testdict[1]'], 'E716:', 1)
2648cc673e74SBram Moolenaar
2649cc673e74SBram Moolenaar  unlet g:teststring
2650cc673e74SBram Moolenaar  unlet g:testblob
2651cc673e74SBram Moolenaar  unlet g:testlist
2652435d8978SBram Moolenaarenddef
2653435d8978SBram Moolenaar
2654442af2f8SBram Moolenaardef Test_expr_member_vim9script()
265537ce6d3aSBram Moolenaar  var lines =<< trim END
2656e0de171eSBram Moolenaar      var d = {one:
2657442af2f8SBram Moolenaar      		'one',
2658b13ab999SBram Moolenaar		two: 'two',
2659b13ab999SBram Moolenaar		1: 1,
2660b13ab999SBram Moolenaar		_: 2}
2661442af2f8SBram Moolenaar      assert_equal('one', d.one)
2662442af2f8SBram Moolenaar      assert_equal('one', d
2663442af2f8SBram Moolenaar                            .one)
2664b13ab999SBram Moolenaar      assert_equal(1, d
2665b13ab999SBram Moolenaar                            .1)
2666b13ab999SBram Moolenaar      assert_equal(2, d
2667b13ab999SBram Moolenaar                            ._)
2668442af2f8SBram Moolenaar      assert_equal('one', d[
2669442af2f8SBram Moolenaar			    'one'
2670442af2f8SBram Moolenaar			    ])
2671442af2f8SBram Moolenaar  END
267290193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2673442af2f8SBram Moolenaar
2674442af2f8SBram Moolenaar  lines =<< trim END
267537ce6d3aSBram Moolenaar      var l = [1,
2676442af2f8SBram Moolenaar		  2,
2677442af2f8SBram Moolenaar		  3, 4
2678442af2f8SBram Moolenaar		  ]
2679442af2f8SBram Moolenaar      assert_equal(2, l[
2680442af2f8SBram Moolenaar			    1
2681442af2f8SBram Moolenaar			    ])
2682442af2f8SBram Moolenaar      assert_equal([2, 3], l[1 : 2])
2683442af2f8SBram Moolenaar      assert_equal([1, 2, 3], l[
2684442af2f8SBram Moolenaar				:
2685442af2f8SBram Moolenaar				2
2686442af2f8SBram Moolenaar				])
2687442af2f8SBram Moolenaar      assert_equal([3, 4], l[
2688442af2f8SBram Moolenaar				2
2689442af2f8SBram Moolenaar				:
2690442af2f8SBram Moolenaar				])
2691442af2f8SBram Moolenaar  END
269290193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2693442af2f8SBram Moolenaarenddef
2694442af2f8SBram Moolenaar
2695a79925a0SBram Moolenaardef SetSomeVar()
2696a79925a0SBram Moolenaar  b:someVar = &fdm
2697a79925a0SBram Moolenaarenddef
2698a79925a0SBram Moolenaar
26998a7d6542SBram Moolenaardef Test_expr7_option()
270090193e61SBram Moolenaar  var lines =<< trim END
2701f5be8cdbSBram Moolenaar      # option
27028a7d6542SBram Moolenaar      set ts=11
27038a7d6542SBram Moolenaar      assert_equal(11, &ts)
2704401d9ffbSBram Moolenaar      &ts = 9
2705401d9ffbSBram Moolenaar      assert_equal(9, &ts)
27068a7d6542SBram Moolenaar      set ts=8
27078a7d6542SBram Moolenaar      set grepprg=some\ text
27088a7d6542SBram Moolenaar      assert_equal('some text', &grepprg)
270997a2af39SBram Moolenaar      &grepprg = test_null_string()
271097a2af39SBram Moolenaar      assert_equal('', &grepprg)
27118a7d6542SBram Moolenaar      set grepprg&
2712d5ea8f08SBram Moolenaar
2713d5ea8f08SBram Moolenaar      # check matching type
2714d5ea8f08SBram Moolenaar      var bval: bool = &tgc
2715d5ea8f08SBram Moolenaar      var nval: number = &ts
2716d5ea8f08SBram Moolenaar      var sval: string = &path
2717a79925a0SBram Moolenaar
2718a79925a0SBram Moolenaar      # check v_lock is cleared (requires using valgrind, doesn't always show)
2719a79925a0SBram Moolenaar      SetSomeVar()
2720a79925a0SBram Moolenaar      b:someVar = 0
2721a79925a0SBram Moolenaar      unlet b:someVar
272290193e61SBram Moolenaar  END
272390193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
27248a7d6542SBram Moolenaarenddef
27258a7d6542SBram Moolenaar
27268a7d6542SBram Moolenaardef Test_expr7_environment()
272790193e61SBram Moolenaar  var lines =<< trim END
2728f5be8cdbSBram Moolenaar      # environment variable
27298a7d6542SBram Moolenaar      assert_equal('testvar', $TESTVAR)
27308a7d6542SBram Moolenaar      assert_equal('', $ASDF_ASD_XXX)
273190193e61SBram Moolenaar  END
273290193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2733c58164c5SBram Moolenaar
273490193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var x = $$$"], 'E1002:', 'E15:', 1)
27358a7d6542SBram Moolenaarenddef
27368a7d6542SBram Moolenaar
27378a7d6542SBram Moolenaardef Test_expr7_register()
273890193e61SBram Moolenaar  var lines =<< trim END
2739401d9ffbSBram Moolenaar      @a = 'register a'
27408a7d6542SBram Moolenaar      assert_equal('register a', @a)
27417226e5b1SBram Moolenaar
274237ce6d3aSBram Moolenaar      var fname = expand('%')
27437226e5b1SBram Moolenaar      assert_equal(fname, @%)
27447226e5b1SBram Moolenaar
27457226e5b1SBram Moolenaar      feedkeys(":echo 'some'\<CR>", "xt")
27467226e5b1SBram Moolenaar      assert_equal("echo 'some'", @:)
27477226e5b1SBram Moolenaar
27487226e5b1SBram Moolenaar      normal axyz
27497226e5b1SBram Moolenaar      assert_equal("xyz", @.)
275065821727SBram Moolenaar
275165821727SBram Moolenaar      @/ = 'slash'
275265821727SBram Moolenaar      assert_equal('slash', @/)
275365821727SBram Moolenaar
275465821727SBram Moolenaar      @= = 'equal'
275565821727SBram Moolenaar      assert_equal('equal', @=)
275690193e61SBram Moolenaar  END
275790193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
275890193e61SBram Moolenaar
275990193e61SBram Moolenaar  CheckDefAndScriptFailure2(["@. = 'yes'"], 'E354:', 'E488:', 1)
27608a7d6542SBram Moolenaarenddef
27618a7d6542SBram Moolenaar
2762886e5e73SBram Moolenaar" This is slow when run under valgrind.
27632f8ce0aeSBram Moolenaardef Test_expr7_namespace()
276490193e61SBram Moolenaar  var lines =<< trim END
27652f8ce0aeSBram Moolenaar      g:some_var = 'some'
27662f8ce0aeSBram Moolenaar      assert_equal('some', get(g:, 'some_var'))
27672f8ce0aeSBram Moolenaar      assert_equal('some', get(g:, 'some_var', 'xxx'))
27682f8ce0aeSBram Moolenaar      assert_equal('xxx', get(g:, 'no_var', 'xxx'))
27692f8ce0aeSBram Moolenaar      unlet g:some_var
27702f8ce0aeSBram Moolenaar
27712f8ce0aeSBram Moolenaar      b:some_var = 'some'
27722f8ce0aeSBram Moolenaar      assert_equal('some', get(b:, 'some_var'))
27732f8ce0aeSBram Moolenaar      assert_equal('some', get(b:, 'some_var', 'xxx'))
27742f8ce0aeSBram Moolenaar      assert_equal('xxx', get(b:, 'no_var', 'xxx'))
27752f8ce0aeSBram Moolenaar      unlet b:some_var
27762f8ce0aeSBram Moolenaar
27772f8ce0aeSBram Moolenaar      w:some_var = 'some'
27782f8ce0aeSBram Moolenaar      assert_equal('some', get(w:, 'some_var'))
27792f8ce0aeSBram Moolenaar      assert_equal('some', get(w:, 'some_var', 'xxx'))
27802f8ce0aeSBram Moolenaar      assert_equal('xxx', get(w:, 'no_var', 'xxx'))
27812f8ce0aeSBram Moolenaar      unlet w:some_var
27822f8ce0aeSBram Moolenaar
27832f8ce0aeSBram Moolenaar      t:some_var = 'some'
27842f8ce0aeSBram Moolenaar      assert_equal('some', get(t:, 'some_var'))
27852f8ce0aeSBram Moolenaar      assert_equal('some', get(t:, 'some_var', 'xxx'))
27862f8ce0aeSBram Moolenaar      assert_equal('xxx', get(t:, 'no_var', 'xxx'))
27872f8ce0aeSBram Moolenaar      unlet t:some_var
27881bd3cb20SBram Moolenaar
27891bd3cb20SBram Moolenaar      # check using g: in a for loop more than DO_NOT_FREE_CNT times
27901bd3cb20SBram Moolenaar      for i in range(100000)
27911bd3cb20SBram Moolenaar        if has_key(g:, 'does-not-exist')
27921bd3cb20SBram Moolenaar        endif
27931bd3cb20SBram Moolenaar      endfor
279490193e61SBram Moolenaar  END
279590193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
27962f8ce0aeSBram Moolenaarenddef
27972f8ce0aeSBram Moolenaar
27988a7d6542SBram Moolenaardef Test_expr7_parens()
2799f5be8cdbSBram Moolenaar  # (expr)
280024156693SBram Moolenaar  var lines =<< trim END
28018a7d6542SBram Moolenaar      assert_equal(4, (6 * 4) / 6)
28028a7d6542SBram Moolenaar      assert_equal(0, 6 * ( 4 / 6 ))
28038a7d6542SBram Moolenaar
28048a7d6542SBram Moolenaar      assert_equal(6, +6)
28058a7d6542SBram Moolenaar      assert_equal(-6, -6)
28060b1cd52fSBram Moolenaar      assert_equal(false, !-3)
2807b23279d7SBram Moolenaar      assert_equal(true, !+0)
28088a7d6542SBram Moolenaar
280924156693SBram Moolenaar      assert_equal(7, 5 + (
281024156693SBram Moolenaar                    2))
281124156693SBram Moolenaar      assert_equal(7, 5 + (
281224156693SBram Moolenaar                    2
281324156693SBram Moolenaar                    ))
281424156693SBram Moolenaar      assert_equal(7, 5 + ( # comment
281524156693SBram Moolenaar                    2))
281624156693SBram Moolenaar      assert_equal(7, 5 + ( # comment
281724156693SBram Moolenaar                    # comment
281824156693SBram Moolenaar                    2))
281924156693SBram Moolenaar
282037ce6d3aSBram Moolenaar      var s = (
28217a4981b9SBram Moolenaar		'one'
28227a4981b9SBram Moolenaar		..
28237a4981b9SBram Moolenaar		'two'
28247a4981b9SBram Moolenaar		)
28257a4981b9SBram Moolenaar      assert_equal('onetwo', s)
28267a4981b9SBram Moolenaar  END
282724156693SBram Moolenaar  CheckDefAndScriptSuccess(lines)
28287a4981b9SBram Moolenaarenddef
28297a4981b9SBram Moolenaar
283079cdf80bSBram Moolenaardef Test_expr7_negate_add()
283190193e61SBram Moolenaar  var lines =<< trim END
283279cdf80bSBram Moolenaar      assert_equal(-99, -99)
28330b37a2f3SBram Moolenaar      assert_equal(-99, - 99)
283479cdf80bSBram Moolenaar      assert_equal(99, +99)
283579cdf80bSBram Moolenaar
283637ce6d3aSBram Moolenaar      var nr = 88
28370b37a2f3SBram Moolenaar      assert_equal(-88, -nr)
283879cdf80bSBram Moolenaar      assert_equal(-88, - nr)
283979cdf80bSBram Moolenaar      assert_equal(88, + nr)
284090193e61SBram Moolenaar  END
284190193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2842b23279d7SBram Moolenaar
284390193e61SBram Moolenaar  lines =<< trim END
2844b23279d7SBram Moolenaar    var n = 12
2845b23279d7SBram Moolenaar    echo ++n
2846b23279d7SBram Moolenaar  END
2847b23279d7SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:')
2848b23279d7SBram Moolenaar  lines =<< trim END
2849b23279d7SBram Moolenaar    var n = 12
2850b23279d7SBram Moolenaar    echo --n
2851b23279d7SBram Moolenaar  END
2852b23279d7SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:')
2853b23279d7SBram Moolenaar  lines =<< trim END
2854b23279d7SBram Moolenaar    var n = 12
2855b23279d7SBram Moolenaar    echo +-n
2856b23279d7SBram Moolenaar  END
2857b23279d7SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:')
2858b23279d7SBram Moolenaar  lines =<< trim END
2859b23279d7SBram Moolenaar    var n = 12
2860b23279d7SBram Moolenaar    echo -+n
2861b23279d7SBram Moolenaar  END
2862b23279d7SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:')
2863b23279d7SBram Moolenaar  lines =<< trim END
2864b23279d7SBram Moolenaar    var n = 12
2865b23279d7SBram Moolenaar    echo - -n
2866b23279d7SBram Moolenaar  END
2867b23279d7SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:')
2868b23279d7SBram Moolenaar  lines =<< trim END
2869b23279d7SBram Moolenaar    var n = 12
2870b23279d7SBram Moolenaar    echo + +n
2871b23279d7SBram Moolenaar  END
2872b23279d7SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E15:')
28730b37a2f3SBram Moolenaarenddef
28740b37a2f3SBram Moolenaar
28753b1373b1SBram Moolenaardef LegacyReturn(): string
28763b1373b1SBram Moolenaar  legacy return #{key: 'ok'}.key
28773b1373b1SBram Moolenaarenddef
28783b1373b1SBram Moolenaar
287915e5e53eSBram Moolenaardef Test_expr7_legacy_script()
288015e5e53eSBram Moolenaar  var lines =<< trim END
288115e5e53eSBram Moolenaar      let s:legacy = 'legacy'
288215e5e53eSBram Moolenaar      def GetLocal(): string
288315e5e53eSBram Moolenaar        return legacy
288415e5e53eSBram Moolenaar      enddef
288515e5e53eSBram Moolenaar      def GetLocalPrefix(): string
288615e5e53eSBram Moolenaar        return s:legacy
288715e5e53eSBram Moolenaar      enddef
288815e5e53eSBram Moolenaar      call assert_equal('legacy', GetLocal())
288915e5e53eSBram Moolenaar      call assert_equal('legacy', GetLocalPrefix())
289015e5e53eSBram Moolenaar  END
289115e5e53eSBram Moolenaar  CheckScriptSuccess(lines)
28923b1373b1SBram Moolenaar
28933b1373b1SBram Moolenaar  assert_equal('ok', LegacyReturn())
28943b1373b1SBram Moolenaar
28953b1373b1SBram Moolenaar  lines =<< trim END
28963b1373b1SBram Moolenaar      vim9script
28973b1373b1SBram Moolenaar      def GetNumber(): number
28983b1373b1SBram Moolenaar          legacy return range(3)->map('v:val + 1')
28993b1373b1SBram Moolenaar      enddef
29003b1373b1SBram Moolenaar      echo GetNumber()
29013b1373b1SBram Moolenaar  END
29023b1373b1SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected number but got list<number>')
290315e5e53eSBram Moolenaarenddef
290415e5e53eSBram Moolenaar
29056e949784SBram Moolenaardef Echo(arg: any): string
29060b37a2f3SBram Moolenaar  return arg
29070b37a2f3SBram Moolenaarenddef
29080b37a2f3SBram Moolenaar
2909c5da1fb7SBram Moolenaardef s:Echo4Arg(arg: any): string
29100b37a2f3SBram Moolenaar  return arg
29110b37a2f3SBram Moolenaarenddef
29120b37a2f3SBram Moolenaar
29130b37a2f3SBram Moolenaardef Test_expr7_call()
2914659bb227SBram Moolenaar  var lines =<< trim END
29150b37a2f3SBram Moolenaar      assert_equal('yes', 'yes'->Echo())
291659eccb92SBram Moolenaar      assert_equal(true, !range(5)->empty())
2917b23279d7SBram Moolenaar      assert_equal([0, 1, 2], 3->range())
2918659bb227SBram Moolenaar  END
2919659bb227SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2920659bb227SBram Moolenaar
2921659bb227SBram Moolenaar  assert_equal('yes', 'yes'
2922659bb227SBram Moolenaar                        ->s:Echo4Arg())
29230b37a2f3SBram Moolenaar
292490193e61SBram Moolenaar  CheckDefAndScriptFailure(["var x = 'yes'->Echo"], 'E107:', 1)
292590193e61SBram Moolenaar  CheckDefAndScriptFailure2([
292637ce6d3aSBram Moolenaar       "var x = substitute ('x', 'x', 'x', 'x')"
292790193e61SBram Moolenaar       ], 'E1001:', 'E121:', 1)
292890193e61SBram Moolenaar  CheckDefAndScriptFailure2(["var Ref = function('len' [1, 2])"], 'E1123:', 'E116:', 1)
2929a177344dSBram Moolenaar
293037ce6d3aSBram Moolenaar  var auto_lines =<< trim END
2931a177344dSBram Moolenaar      def g:some#func(): string
2932a177344dSBram Moolenaar	return 'found'
2933a177344dSBram Moolenaar      enddef
2934a177344dSBram Moolenaar  END
2935a177344dSBram Moolenaar  mkdir('Xruntime/autoload', 'p')
2936a177344dSBram Moolenaar  writefile(auto_lines, 'Xruntime/autoload/some.vim')
293737ce6d3aSBram Moolenaar  var save_rtp = &rtp
2938a177344dSBram Moolenaar  &rtp = getcwd() .. '/Xruntime,' .. &rtp
2939a177344dSBram Moolenaar  assert_equal('found', g:some#func())
2940a177344dSBram Moolenaar  assert_equal('found', some#func())
2941a177344dSBram Moolenaar
2942a177344dSBram Moolenaar  &rtp = save_rtp
2943a177344dSBram Moolenaar  delete('Xruntime', 'rf')
29440b37a2f3SBram Moolenaarenddef
29450b37a2f3SBram Moolenaar
29467e368206SBram Moolenaardef Test_expr7_method_call()
294790193e61SBram Moolenaar  var lines =<< trim END
29487e368206SBram Moolenaar      new
29497e368206SBram Moolenaar      setline(1, ['first', 'last'])
29507e368206SBram Moolenaar      'second'->append(1)
29517e368206SBram Moolenaar      "third"->append(2)
29527e368206SBram Moolenaar      assert_equal(['first', 'second', 'third', 'last'], getline(1, '$'))
29537e368206SBram Moolenaar      bwipe!
29547e368206SBram Moolenaar
29557e368206SBram Moolenaar      var bufnr = bufnr()
29567e368206SBram Moolenaar      var loclist = [{bufnr: bufnr, lnum: 42, col: 17, text: 'wrong'}]
29577e368206SBram Moolenaar      loclist->setloclist(0)
29587e368206SBram Moolenaar      assert_equal([{bufnr: bufnr,
29597e368206SBram Moolenaar                    lnum: 42,
29606864efa5Sthinca                    end_lnum: 0,
29617e368206SBram Moolenaar                    col: 17,
29626864efa5Sthinca                    end_col: 0,
29637e368206SBram Moolenaar                    text: 'wrong',
29647e368206SBram Moolenaar                    pattern: '',
29657e368206SBram Moolenaar                    valid: 1,
29667e368206SBram Moolenaar                    vcol: 0,
29677e368206SBram Moolenaar                    nr: 0,
29687e368206SBram Moolenaar                    type: '',
29697e368206SBram Moolenaar                    module: ''}
29707e368206SBram Moolenaar                    ], getloclist(0))
29717e368206SBram Moolenaar
29727e368206SBram Moolenaar      var result: bool = get({n: 0}, 'n', 0)
29737e368206SBram Moolenaar      assert_equal(false, result)
29747e368206SBram Moolenaar
29757e368206SBram Moolenaar      assert_equal('+string+', 'string'->((s) => '+' .. s .. '+')())
29767e368206SBram Moolenaar      assert_equal('-text-', 'text'->((s, c) => c .. s .. c)('-'))
29777e368206SBram Moolenaar
29787e368206SBram Moolenaar      var Join = (l) => join(l, 'x')
29797e368206SBram Moolenaar      assert_equal('axb', ['a', 'b']->(Join)())
2980a733042bSBram Moolenaar
2981a733042bSBram Moolenaar      var sorted = [3, 1, 2]
2982a733042bSBram Moolenaar                    -> sort()
2983a733042bSBram Moolenaar      assert_equal([1, 2, 3], sorted)
298490193e61SBram Moolenaar  END
298590193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2986f57b43c2SBram Moolenaar
2987f57b43c2SBram Moolenaar  lines =<< trim END
2988f57b43c2SBram Moolenaar    def RetVoid()
2989f57b43c2SBram Moolenaar    enddef
2990f57b43c2SBram Moolenaar    RetVoid()->byteidx(3)
2991f57b43c2SBram Moolenaar  END
29921a71d31bSYegappan Lakshmanan  CheckDefExecFailure(lines, 'E1013:')
29937e368206SBram Moolenaarenddef
29947e368206SBram Moolenaar
29950b37a2f3SBram Moolenaar
29968a7d6542SBram Moolenaardef Test_expr7_not()
299737ce6d3aSBram Moolenaar  var lines =<< trim END
29988a7d6542SBram Moolenaar      assert_equal(true, !'')
29998a7d6542SBram Moolenaar      assert_equal(true, ![])
30008a7d6542SBram Moolenaar      assert_equal(false, !'asdf')
30018a7d6542SBram Moolenaar      assert_equal(false, ![2])
30028a7d6542SBram Moolenaar      assert_equal(true, !!'asdf')
30038a7d6542SBram Moolenaar      assert_equal(true, !![2])
30048ed04587SBram Moolenaar
300527491cd3SBram Moolenaar      assert_equal(true, ! false)
300627491cd3SBram Moolenaar      assert_equal(true, !! true)
300727491cd3SBram Moolenaar      assert_equal(true, ! ! true)
300827491cd3SBram Moolenaar      assert_equal(true, !!! false)
300927491cd3SBram Moolenaar      assert_equal(true, ! ! ! false)
301027491cd3SBram Moolenaar
301127491cd3SBram Moolenaar      g:true = true
301227491cd3SBram Moolenaar      g:false = false
301327491cd3SBram Moolenaar      assert_equal(true, ! g:false)
301427491cd3SBram Moolenaar      assert_equal(true, !! g:true)
301527491cd3SBram Moolenaar      assert_equal(true, ! ! g:true)
301627491cd3SBram Moolenaar      assert_equal(true, !!! g:false)
301727491cd3SBram Moolenaar      assert_equal(true, ! ! ! g:false)
301827491cd3SBram Moolenaar      unlet g:true
301927491cd3SBram Moolenaar      unlet g:false
302027491cd3SBram Moolenaar
30218ed04587SBram Moolenaar      assert_equal(true, !test_null_partial())
30222949cfdbSBram Moolenaar      assert_equal(false, !() => 'yes')
30238ed04587SBram Moolenaar
30248ed04587SBram Moolenaar      assert_equal(true, !test_null_dict())
30258ed04587SBram Moolenaar      assert_equal(true, !{})
3026e0de171eSBram Moolenaar      assert_equal(false, !{yes: 'no'})
30278ed04587SBram Moolenaar
3028b4d2cb10SBram Moolenaar      if has('channel')
30298ed04587SBram Moolenaar	assert_equal(true, !test_null_job())
30308ed04587SBram Moolenaar	assert_equal(true, !test_null_channel())
3031b4d2cb10SBram Moolenaar      endif
30328ed04587SBram Moolenaar
30338ed04587SBram Moolenaar      assert_equal(true, !test_null_blob())
30348ed04587SBram Moolenaar      assert_equal(true, !0z)
30358ed04587SBram Moolenaar      assert_equal(false, !0z01)
30368ed04587SBram Moolenaar
30378ed04587SBram Moolenaar      assert_equal(true, !test_void())
30388ed04587SBram Moolenaar      assert_equal(true, !test_unknown())
303959eccb92SBram Moolenaar
304059eccb92SBram Moolenaar      assert_equal(false, ![1, 2, 3]->reverse())
304159eccb92SBram Moolenaar      assert_equal(true, ![]->reverse())
30423e06a1e2SBram Moolenaar  END
304327491cd3SBram Moolenaar  CheckDefAndScriptSuccess(lines)
30448a7d6542SBram Moolenaarenddef
30458a7d6542SBram Moolenaar
30468a7d6542SBram Moolenaarfunc Test_expr7_fails()
30475afd081cSBram Moolenaar  call CheckDefFailure(["var x = (12"], "E1097:", 3)
304890193e61SBram Moolenaar  call CheckScriptFailure(['vim9script', "var x = (12"], 'E110:', 2)
30498a7d6542SBram Moolenaar
305090193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = -'xx'"], "E1030:", 1)
305190193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = +'xx'"], "E1030:", 1)
305290193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = -0z12"], "E974:", 1)
305390193e61SBram Moolenaar  call CheckDefExecAndScriptFailure2(["var x = -[8]"], "E39:", 'E745:', 1)
305490193e61SBram Moolenaar  call CheckDefExecAndScriptFailure2(["var x = -{a: 1}"], "E39:", 'E728:', 1)
30558a7d6542SBram Moolenaar
305690193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = @"], "E1002:", 1)
305790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = @<"], "E354:", 1)
305858ceca5cSBram Moolenaar
305937ce6d3aSBram Moolenaar  call CheckDefFailure(["var x = [1, 2"], "E697:", 2)
306090193e61SBram Moolenaar  call CheckScriptFailure(['vim9script', "var x = [1, 2"], 'E696:', 2)
3061ee619e5bSBram Moolenaar
306290193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var x = [notfound]"], "E1001:", 'E121:', 1)
3063ee619e5bSBram Moolenaar
3064fae55a9cSBram Moolenaar  call CheckDefAndScriptFailure(["var X = () => 123)"], 'E488:', 1)
306590193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = 123->((x) => x + 5)"], "E107:", 1)
3066fd1823e0SBram Moolenaar
306790193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var x = &notexist"], 'E113:', 1)
306890193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["&grepprg = [343]"], 'E1012:', 'E730:', 1)
306909f28f49SBram Moolenaar
307090193e61SBram Moolenaar  call CheckDefExecAndScriptFailure(["echo s:doesnt_exist"], 'E121:', 1)
307190193e61SBram Moolenaar  call CheckDefExecAndScriptFailure(["echo g:doesnt_exist"], 'E121:', 1)
307233fa29cfSBram Moolenaar
307390193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["echo a:somevar"], 'E1075:', 'E121:', 1)
307490193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["echo l:somevar"], 'E1075:', 'E121:', 1)
307590193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["echo x:somevar"], 'E1075:', 'E121:', 1)
307642a480bfSBram Moolenaar
307790193e61SBram Moolenaar  call CheckDefExecAndScriptFailure(["var x = +g:astring"], 'E1030:', 1)
307890193e61SBram Moolenaar  call CheckDefExecAndScriptFailure(["var x = +g:ablob"], 'E974:', 1)
307990193e61SBram Moolenaar  call CheckDefExecAndScriptFailure(["var x = +g:alist"], 'E745:', 1)
308090193e61SBram Moolenaar  call CheckDefExecAndScriptFailure(["var x = +g:adict"], 'E728:', 1)
308133fa29cfSBram Moolenaar
3082fae55a9cSBram Moolenaar  call CheckDefAndScriptFailure2(["var x = ''", "var y = x.memb"], 'E715:', 'E488:', 2)
308390193e61SBram Moolenaar
308490193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["'yes'->", "Echo()"], 'E488: Trailing characters: ->', 'E260: Missing name after ->', 1)
3085dd1a9af0SBram Moolenaar
30863affe7a6SBram Moolenaar  call CheckDefExecFailure(["[1, 2->len()"], 'E697:', 2)
308790193e61SBram Moolenaar  call CheckScriptFailure(['vim9script', "[1, 2->len()"], 'E696:', 2)
308890193e61SBram Moolenaar
308990193e61SBram Moolenaar  call CheckDefFailure(["{a: 1->len()"], 'E723:', 2)
309090193e61SBram Moolenaar  call CheckScriptFailure(['vim9script', "{a: 1->len()"], 'E722:', 2)
309190193e61SBram Moolenaar
3092e0de171eSBram Moolenaar  call CheckDefExecFailure(["{['a']: 1->len()"], 'E723:', 2)
309390193e61SBram Moolenaar  call CheckScriptFailure(['vim9script', "{['a']: 1->len()"], 'E722:', 2)
30948a7d6542SBram Moolenaarendfunc
30958a7d6542SBram Moolenaar
30968a7d6542SBram Moolenaarlet g:Funcrefs = [function('add')]
30978a7d6542SBram Moolenaar
30988a7d6542SBram Moolenaarfunc CallMe(arg)
30998a7d6542SBram Moolenaar  return a:arg
31008a7d6542SBram Moolenaarendfunc
31018a7d6542SBram Moolenaar
310238a5f517SBram Moolenaarfunc CallMe2(one, two)
310338a5f517SBram Moolenaar  return a:one .. a:two
310438a5f517SBram Moolenaarendfunc
310538a5f517SBram Moolenaar
31068a7d6542SBram Moolenaardef Test_expr7_trailing()
310790193e61SBram Moolenaar  var lines =<< trim END
3108f5be8cdbSBram Moolenaar      # user function call
31094c17ad94SBram Moolenaar      assert_equal(123, g:CallMe(123))
31104c17ad94SBram Moolenaar      assert_equal(123, g:CallMe(  123))
31114c17ad94SBram Moolenaar      assert_equal(123, g:CallMe(123  ))
31124c17ad94SBram Moolenaar      assert_equal('yesno', g:CallMe2('yes', 'no'))
31134c17ad94SBram Moolenaar      assert_equal('yesno', g:CallMe2( 'yes', 'no' ))
31144c17ad94SBram Moolenaar      assert_equal('nothing', g:CallMe('nothing'))
31158a7d6542SBram Moolenaar
3116f5be8cdbSBram Moolenaar      # partial call
311737ce6d3aSBram Moolenaar      var Part = function('g:CallMe')
31188a7d6542SBram Moolenaar      assert_equal('yes', Part('yes'))
31198a7d6542SBram Moolenaar
3120f5be8cdbSBram Moolenaar      # funcref call, using list index
312137ce6d3aSBram Moolenaar      var l = []
31228a7d6542SBram Moolenaar      g:Funcrefs[0](l, 2)
31238a7d6542SBram Moolenaar      assert_equal([2], l)
31248a7d6542SBram Moolenaar
3125f5be8cdbSBram Moolenaar      # method call
31268a7d6542SBram Moolenaar      l = [2, 5, 6]
31272949cfdbSBram Moolenaar      l->map((k, v) => k + v)
31288a7d6542SBram Moolenaar      assert_equal([2, 6, 8], l)
31298a7d6542SBram Moolenaar
3130f5be8cdbSBram Moolenaar      # lambda method call
31318a7d6542SBram Moolenaar      l = [2, 5]
3132057e84afSBram Moolenaar      l->((ll) => add(ll, 8))()
31338a7d6542SBram Moolenaar      assert_equal([2, 5, 8], l)
31348a7d6542SBram Moolenaar
3135f5be8cdbSBram Moolenaar      # dict member
3136e0de171eSBram Moolenaar      var d = {key: 123}
31378a7d6542SBram Moolenaar      assert_equal(123, d.key)
313890193e61SBram Moolenaar  END
313990193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
31408a7d6542SBram Moolenaarenddef
31418a7d6542SBram Moolenaar
314211107babSBram Moolenaardef Test_expr7_string_subscript()
314337ce6d3aSBram Moolenaar  var lines =<< trim END
314437ce6d3aSBram Moolenaar    var text = 'abcdef'
3145e7525c55SBram Moolenaar    assert_equal('f', text[-1])
3146bf9d8c37SBram Moolenaar    assert_equal('a', text[0])
3147bf9d8c37SBram Moolenaar    assert_equal('e', text[4])
3148bf9d8c37SBram Moolenaar    assert_equal('f', text[5])
3149bf9d8c37SBram Moolenaar    assert_equal('', text[6])
3150e3c37d8eSBram Moolenaar
3151e7525c55SBram Moolenaar    text = 'ábçdë'
3152e7525c55SBram Moolenaar    assert_equal('ë', text[-1])
3153e7525c55SBram Moolenaar    assert_equal('d', text[-2])
3154e7525c55SBram Moolenaar    assert_equal('ç', text[-3])
3155e7525c55SBram Moolenaar    assert_equal('b', text[-4])
3156e7525c55SBram Moolenaar    assert_equal('á', text[-5])
3157e7525c55SBram Moolenaar    assert_equal('', text[-6])
3158e7525c55SBram Moolenaar
3159e3c37d8eSBram Moolenaar    text = 'ábçdëf'
3160e3c37d8eSBram Moolenaar    assert_equal('', text[-999])
3161e7525c55SBram Moolenaar    assert_equal('f', text[-1])
3162e3c37d8eSBram Moolenaar    assert_equal('á', text[0])
3163e3c37d8eSBram Moolenaar    assert_equal('b', text[1])
3164e3c37d8eSBram Moolenaar    assert_equal('ç', text[2])
3165e3c37d8eSBram Moolenaar    assert_equal('d', text[3])
3166e3c37d8eSBram Moolenaar    assert_equal('ë', text[4])
3167e3c37d8eSBram Moolenaar    assert_equal('f', text[5])
3168e3c37d8eSBram Moolenaar    assert_equal('', text[6])
3169e3c37d8eSBram Moolenaar    assert_equal('', text[999])
317011107babSBram Moolenaar
317111107babSBram Moolenaar    assert_equal('ábçdëf', text[0 : -1])
317211107babSBram Moolenaar    assert_equal('ábçdëf', text[0 : -1])
317311107babSBram Moolenaar    assert_equal('ábçdëf', text[0 : -1])
317411107babSBram Moolenaar    assert_equal('ábçdëf', text[0 : -1])
317511107babSBram Moolenaar    assert_equal('ábçdëf', text[0
317611107babSBram Moolenaar                  : -1])
317711107babSBram Moolenaar    assert_equal('ábçdëf', text[0 :
317811107babSBram Moolenaar                  -1])
317911107babSBram Moolenaar    assert_equal('ábçdëf', text[0 : -1
318011107babSBram Moolenaar                  ])
318111107babSBram Moolenaar    assert_equal('bçdëf', text[1 : -1])
318211107babSBram Moolenaar    assert_equal('çdëf', text[2 : -1])
318311107babSBram Moolenaar    assert_equal('dëf', text[3 : -1])
318411107babSBram Moolenaar    assert_equal('ëf', text[4 : -1])
318511107babSBram Moolenaar    assert_equal('f', text[5 : -1])
318611107babSBram Moolenaar    assert_equal('', text[6 : -1])
318711107babSBram Moolenaar    assert_equal('', text[999 : -1])
318811107babSBram Moolenaar
318911107babSBram Moolenaar    assert_equal('ábçd', text[: 3])
319011107babSBram Moolenaar    assert_equal('bçdëf', text[1 :])
319111107babSBram Moolenaar    assert_equal('ábçdëf', text[:])
3192261417b8SBram Moolenaar
3193261417b8SBram Moolenaar    assert_equal('a', g:astring[0])
3194261417b8SBram Moolenaar    assert_equal('sd', g:astring[1 : 2])
3195261417b8SBram Moolenaar    assert_equal('asdf', g:astring[:])
3196e3c37d8eSBram Moolenaar  END
319790193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3198918a4249SBram Moolenaar
3199918a4249SBram Moolenaar  lines =<< trim END
3200918a4249SBram Moolenaar      var d = 'asdf'[1 :
3201918a4249SBram Moolenaar  END
32028ff16e01SBram Moolenaar  CheckDefFailure(lines, 'E1097:', 3)
320390193e61SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E15:', 2)
320490193e61SBram Moolenaar
3205918a4249SBram Moolenaar  lines =<< trim END
3206918a4249SBram Moolenaar      var d = 'asdf'[1 : xxx]
3207918a4249SBram Moolenaar  END
320890193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1001:', 'E121:', 1)
320990193e61SBram Moolenaar
3210918a4249SBram Moolenaar  lines =<< trim END
3211918a4249SBram Moolenaar      var d = 'asdf'[1 : 2
3212918a4249SBram Moolenaar  END
32138ff16e01SBram Moolenaar  CheckDefFailure(lines, 'E1097:', 3)
321490193e61SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E111:', 2)
321590193e61SBram Moolenaar
3216918a4249SBram Moolenaar  lines =<< trim END
3217918a4249SBram Moolenaar      var d = 'asdf'[1 : 2
3218918a4249SBram Moolenaar      echo d
3219918a4249SBram Moolenaar  END
322090193e61SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E111:', 2)
322190193e61SBram Moolenaar
3222918a4249SBram Moolenaar  lines =<< trim END
3223918a4249SBram Moolenaar      var d = 'asdf'['1']
3224918a4249SBram Moolenaar      echo d
3225918a4249SBram Moolenaar  END
322690193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "1"', 1)
322790193e61SBram Moolenaar
3228918a4249SBram Moolenaar  lines =<< trim END
3229918a4249SBram Moolenaar      var d = 'asdf'['1' : 2]
3230918a4249SBram Moolenaar      echo d
3231918a4249SBram Moolenaar  END
323290193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "1"', 1)
323390193e61SBram Moolenaar
3234918a4249SBram Moolenaar  lines =<< trim END
3235918a4249SBram Moolenaar      var d = 'asdf'[1 : '2']
3236918a4249SBram Moolenaar      echo d
3237918a4249SBram Moolenaar  END
323890193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "2"', 1)
3239bf9d8c37SBram Moolenaarenddef
3240bf9d8c37SBram Moolenaar
3241ed591877SBram Moolenaardef Test_expr7_list_subscript()
324237ce6d3aSBram Moolenaar  var lines =<< trim END
324337ce6d3aSBram Moolenaar      var list = [0, 1, 2, 3, 4]
3244ed591877SBram Moolenaar      assert_equal(0, list[0])
3245ed591877SBram Moolenaar      assert_equal(4, list[4])
3246ed591877SBram Moolenaar      assert_equal(4, list[-1])
3247ed591877SBram Moolenaar      assert_equal(0, list[-5])
3248ed591877SBram Moolenaar
3249ed591877SBram Moolenaar      assert_equal([0, 1, 2, 3, 4], list[0 : 4])
3250ed591877SBram Moolenaar      assert_equal([0, 1, 2, 3, 4], list[:])
3251ed591877SBram Moolenaar      assert_equal([1, 2, 3, 4], list[1 :])
3252ed591877SBram Moolenaar      assert_equal([2, 3, 4], list[2 : -1])
3253ed591877SBram Moolenaar      assert_equal([4], list[4 : -1])
3254ed591877SBram Moolenaar      assert_equal([], list[5 : -1])
3255ed591877SBram Moolenaar      assert_equal([], list[999 : -1])
325656acb094SBram Moolenaar      assert_equal([1, 2, 3, 4], list[g:theone : g:thefour])
3257ed591877SBram Moolenaar
3258ed591877SBram Moolenaar      assert_equal([0, 1, 2, 3], list[0 : 3])
3259ed591877SBram Moolenaar      assert_equal([0], list[0 : 0])
3260ed591877SBram Moolenaar      assert_equal([0, 1, 2, 3, 4], list[0 : -1])
3261ed591877SBram Moolenaar      assert_equal([0, 1, 2], list[0 : -3])
3262ed591877SBram Moolenaar      assert_equal([0], list[0 : -5])
3263ed591877SBram Moolenaar      assert_equal([], list[0 : -6])
3264ed591877SBram Moolenaar      assert_equal([], list[0 : -99])
3265261417b8SBram Moolenaar
3266261417b8SBram Moolenaar      assert_equal(2, g:alist[0])
3267261417b8SBram Moolenaar      assert_equal([2, 3, 4], g:alist[:])
3268ed591877SBram Moolenaar  END
3269e7525c55SBram Moolenaar  CheckDefAndScriptSuccess(lines)
327056acb094SBram Moolenaar
327137ce6d3aSBram Moolenaar  lines = ['var l = [0, 1, 2]', 'echo l[g:astring : g:theone]']
327290193e61SBram Moolenaar  CheckDefExecAndScriptFailure2(lines, 'E1012:', 'E1030:', 2)
327331a11b94SBram Moolenaar
327431a11b94SBram Moolenaar  lines =<< trim END
327531a11b94SBram Moolenaar      var ld = []
327631a11b94SBram Moolenaar      def Func()
327731a11b94SBram Moolenaar        eval ld[0].key
327831a11b94SBram Moolenaar      enddef
327931a11b94SBram Moolenaar      defcompile
328031a11b94SBram Moolenaar  END
328190193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3282ed591877SBram Moolenaarenddef
3283ed591877SBram Moolenaar
3284c6e57b74SBram Moolenaardef Test_expr7_dict_subscript()
328537ce6d3aSBram Moolenaar  var lines =<< trim END
3286e0de171eSBram Moolenaar      var l = [{lnum: 2}, {lnum: 1}]
328737ce6d3aSBram Moolenaar      var res = l[0].lnum > l[1].lnum
3288c6e57b74SBram Moolenaar      assert_true(res)
328931a11b94SBram Moolenaar
3290261417b8SBram Moolenaar      assert_equal(2, g:adict['aaa'])
3291261417b8SBram Moolenaar      assert_equal(8, g:adict.bbb)
3292261417b8SBram Moolenaar
329331a11b94SBram Moolenaar      var dd = {}
329431a11b94SBram Moolenaar      def Func1()
329531a11b94SBram Moolenaar        eval dd.key1.key2
329631a11b94SBram Moolenaar      enddef
329731a11b94SBram Moolenaar      def Func2()
329831a11b94SBram Moolenaar        eval dd['key1'].key2
329931a11b94SBram Moolenaar      enddef
330031a11b94SBram Moolenaar      defcompile
3301c6e57b74SBram Moolenaar  END
330290193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3303c6e57b74SBram Moolenaarenddef
3304c6e57b74SBram Moolenaar
3305261417b8SBram Moolenaardef Test_expr7_blob_subscript()
3306261417b8SBram Moolenaar  var lines =<< trim END
3307261417b8SBram Moolenaar      var b = 0z112233
3308261417b8SBram Moolenaar      assert_equal(0x11, b[0])
3309261417b8SBram Moolenaar      assert_equal(0z112233, b[:])
3310261417b8SBram Moolenaar
3311261417b8SBram Moolenaar      assert_equal(0x01, g:ablob[0])
3312261417b8SBram Moolenaar      assert_equal(0z01ab, g:ablob[:])
3313261417b8SBram Moolenaar  END
3314261417b8SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3315261417b8SBram Moolenaarenddef
3316261417b8SBram Moolenaar
3317a3b7fdc1SBram Moolenaardef Test_expr7_subscript_linebreak()
331890193e61SBram Moolenaar  var lines =<< trim END
331937ce6d3aSBram Moolenaar      var range = range(
3320a3b7fdc1SBram Moolenaar                    3)
332137ce6d3aSBram Moolenaar      var l = range
332275ab91ffSBram Moolenaar            ->mapnew('string(v:key)')
3323a3b7fdc1SBram Moolenaar      assert_equal(['0', '1', '2'], l)
3324a3b7fdc1SBram Moolenaar
332523c55273SBram Moolenaar      l = range
332675ab91ffSBram Moolenaar            ->mapnew('string(v:key)')
332723c55273SBram Moolenaar      assert_equal(['0', '1', '2'], l)
332823c55273SBram Moolenaar
332923c55273SBram Moolenaar      l = range # comment
333075ab91ffSBram Moolenaar            ->mapnew('string(v:key)')
333123c55273SBram Moolenaar      assert_equal(['0', '1', '2'], l)
333223c55273SBram Moolenaar
333323c55273SBram Moolenaar      l = range
333423c55273SBram Moolenaar
333575ab91ffSBram Moolenaar            ->mapnew('string(v:key)')
333623c55273SBram Moolenaar      assert_equal(['0', '1', '2'], l)
333723c55273SBram Moolenaar
333823c55273SBram Moolenaar      l = range
333923c55273SBram Moolenaar            # comment
334075ab91ffSBram Moolenaar            ->mapnew('string(v:key)')
334123c55273SBram Moolenaar      assert_equal(['0', '1', '2'], l)
334223c55273SBram Moolenaar
3343a3b7fdc1SBram Moolenaar      assert_equal('1', l[
3344a3b7fdc1SBram Moolenaar            1])
3345a3b7fdc1SBram Moolenaar
3346e0de171eSBram Moolenaar      var d = {one: 33}
334790193e61SBram Moolenaar      assert_equal(33, d
334890193e61SBram Moolenaar            .one)
334990193e61SBram Moolenaar  END
335090193e61SBram Moolenaar  CheckDefAndScriptSuccess(lines)
335190193e61SBram Moolenaar
335290193e61SBram Moolenaar  lines =<< trim END
335390193e61SBram Moolenaar      var d = {one: 33}
3354a3b7fdc1SBram Moolenaar      assert_equal(33, d.
3355a3b7fdc1SBram Moolenaar            one)
335690193e61SBram Moolenaar  END
335790193e61SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1127:', 'E116:', 2)
3358a3b7fdc1SBram Moolenaarenddef
3359a3b7fdc1SBram Moolenaar
33608a7d6542SBram Moolenaarfunc Test_expr7_trailing_fails()
336190193e61SBram Moolenaar  call CheckDefAndScriptFailure(['var l = [2]', 'l->((ll) => add(ll, 8))'], 'E107:', 2)
336290193e61SBram Moolenaar  call CheckDefAndScriptFailure(['var l = [2]', 'l->((ll) => add(ll, 8)) ()'], 'E274:', 2)
33638a7d6542SBram Moolenaarendfunc
33648a7d6542SBram Moolenaar
33658a7d6542SBram Moolenaarfunc Test_expr_fails()
3366fae55a9cSBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1'is2"], 'E488:', 1)
3367fae55a9cSBram Moolenaar  call CheckDefAndScriptFailure(["var x = '1'isnot2"], 'E488:', 1)
336838a5f517SBram Moolenaar
336990193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["CallMe ('yes')"], 'E476:', 'E492:', 1)
337090193e61SBram Moolenaar
3371ba7c0d7bSBram Moolenaar  call CheckDefAndScriptFailure(["CallMe2('yes','no')"], 'E1069:', 1)
33720c2ca58eSBram Moolenaar
337390193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["v:nosuch += 3"], 'E1001:', 'E121:', 1)
337490193e61SBram Moolenaar  call CheckDefAndScriptFailure(["var v:statusmsg = ''"], 'E1016: Cannot declare a v: variable:', 1)
337590193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["var asdf = v:nosuch"], 'E1001:', 'E121:', 1)
337633fa29cfSBram Moolenaar
33773affe7a6SBram Moolenaar  call CheckDefFailure(["echo len('asdf'"], 'E110:', 2)
337890193e61SBram Moolenaar  call CheckScriptFailure(['vim9script', "echo len('asdf'"], 'E116:', 2)
337990193e61SBram Moolenaar
338090193e61SBram Moolenaar  call CheckDefAndScriptFailure2(["echo Func0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789()"], 'E1011:', 'E117:', 1)
338190193e61SBram Moolenaar  call CheckDefAndScriptFailure(["echo doesnotexist()"], 'E117:', 1)
33828a7d6542SBram Moolenaarendfunc
33836d91bcb4SBram Moolenaar
33846d91bcb4SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
3385