18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
7e3d4685fSBram Moolenaarsource shared.vim
88a7d6542SBram Moolenaar
95d72ce69SBram Moolenaardef Test_range_only()
105d72ce69SBram Moolenaar  new
115d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
125d72ce69SBram Moolenaar  :/Blah/
135d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
14c2af0affSBram Moolenaar  bwipe!
15c2af0affSBram Moolenaar
16c2af0affSBram Moolenaar  # without range commands use current line
17c2af0affSBram Moolenaar  new
18c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
19c2af0affSBram Moolenaar  :2
20c2af0affSBram Moolenaar  print
21c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
22c2af0affSBram Moolenaar  :3
23c2af0affSBram Moolenaar  list
24c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
25c2af0affSBram Moolenaar  bwipe!
265d72ce69SBram Moolenaarenddef
275d72ce69SBram Moolenaar
28a6e67e4fSBram Moolenaarlet g:alist = [7]
29a6e67e4fSBram Moolenaarlet g:astring = 'text'
30f0b9f43cSBram Moolenaarlet g:anumber = 123
316e587dcbSBram Moolenaar
324c17ad94SBram Moolenaardef Test_delfunction()
33f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
344c17ad94SBram Moolenaar  CheckScriptSuccess([
354c17ad94SBram Moolenaar      'vim9script',
364c17ad94SBram Moolenaar      'func CheckMe()',
374c17ad94SBram Moolenaar      '  return 123',
384c17ad94SBram Moolenaar      'endfunc',
394c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
404c17ad94SBram Moolenaar      ])
414c17ad94SBram Moolenaar
42f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
434c17ad94SBram Moolenaar  CheckScriptFailure([
444c17ad94SBram Moolenaar      'vim9script',
454c17ad94SBram Moolenaar      'func DeleteMe1()',
464c17ad94SBram Moolenaar      'endfunc',
474c17ad94SBram Moolenaar      'delfunction DeleteMe1',
484c17ad94SBram Moolenaar      ], 'E1084:')
494c17ad94SBram Moolenaar  CheckScriptFailure([
504c17ad94SBram Moolenaar      'vim9script',
514c17ad94SBram Moolenaar      'func DeleteMe2()',
524c17ad94SBram Moolenaar      'endfunc',
534c17ad94SBram Moolenaar      'def DoThat()',
544c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
554c17ad94SBram Moolenaar      'enddef',
564c17ad94SBram Moolenaar      'DoThat()',
574c17ad94SBram Moolenaar      ], 'E1084:')
584c17ad94SBram Moolenaar  CheckScriptFailure([
594c17ad94SBram Moolenaar      'vim9script',
604c17ad94SBram Moolenaar      'def DeleteMe3()',
614c17ad94SBram Moolenaar      'enddef',
624c17ad94SBram Moolenaar      'delfunction DeleteMe3',
634c17ad94SBram Moolenaar      ], 'E1084:')
644c17ad94SBram Moolenaar  CheckScriptFailure([
654c17ad94SBram Moolenaar      'vim9script',
664c17ad94SBram Moolenaar      'def DeleteMe4()',
674c17ad94SBram Moolenaar      'enddef',
684c17ad94SBram Moolenaar      'def DoThat()',
694c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
704c17ad94SBram Moolenaar      'enddef',
714c17ad94SBram Moolenaar      'DoThat()',
724c17ad94SBram Moolenaar      ], 'E1084:')
73925e9fd6SBram Moolenaar
74925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
75cfcd011fSBram Moolenaar  var lines =<< trim END
76925e9fd6SBram Moolenaar      vim9script
77925e9fd6SBram Moolenaar      def g:Global(): string
78925e9fd6SBram Moolenaar        return "yes"
79925e9fd6SBram Moolenaar      enddef
80925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
81925e9fd6SBram Moolenaar      def! g:Global(): string
82925e9fd6SBram Moolenaar        return "no"
83925e9fd6SBram Moolenaar      enddef
84925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
85925e9fd6SBram Moolenaar      delfunc g:Global
86925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
87925e9fd6SBram Moolenaar  END
88925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
89925e9fd6SBram Moolenaar
90925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
91925e9fd6SBram Moolenaar  lines =<< trim END
92925e9fd6SBram Moolenaar      vim9script
93925e9fd6SBram Moolenaar      func g:Global()
94925e9fd6SBram Moolenaar        return "yes"
95925e9fd6SBram Moolenaar      endfunc
96925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
97925e9fd6SBram Moolenaar      def! g:Global(): string
98925e9fd6SBram Moolenaar        return "no"
99925e9fd6SBram Moolenaar      enddef
100925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
101925e9fd6SBram Moolenaar      delfunc g:Global
102925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
103925e9fd6SBram Moolenaar  END
104925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
105925e9fd6SBram Moolenaar
106925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
107925e9fd6SBram Moolenaar  lines =<< trim END
108925e9fd6SBram Moolenaar      vim9script
109925e9fd6SBram Moolenaar      def g:Global(): string
110925e9fd6SBram Moolenaar        return "yes"
111925e9fd6SBram Moolenaar      enddef
112925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
113925e9fd6SBram Moolenaar      func! g:Global()
114925e9fd6SBram Moolenaar        return "no"
115925e9fd6SBram Moolenaar      endfunc
116925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
117925e9fd6SBram Moolenaar      delfunc g:Global
118925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
119925e9fd6SBram Moolenaar  END
120925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1214c17ad94SBram Moolenaarenddef
1224c17ad94SBram Moolenaar
12308052228SBram Moolenaardef Test_wrong_type()
124cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
125cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
126cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
127cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
128599c89c8SBram Moolenaar
129cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
130cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
13142a480bfSBram Moolenaar
132cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
133cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
134cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
135cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
136cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
137cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
138cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
139cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
140cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
143a0a9f43aSBram Moolenaar
144cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
145cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
14608052228SBram Moolenaarenddef
1478a7d6542SBram Moolenaar
14810c65860SBram Moolenaardef Test_script_wrong_type()
14910c65860SBram Moolenaar  var lines =<< trim END
15010c65860SBram Moolenaar      vim9script
15110c65860SBram Moolenaar      var s:dict: dict<string>
15210c65860SBram Moolenaar      s:dict['a'] = ['x']
15310c65860SBram Moolenaar  END
15410c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
15510c65860SBram Moolenaarenddef
15610c65860SBram Moolenaar
15708052228SBram Moolenaardef Test_const()
158cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
159cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
160cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
16130fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
16230fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
163dbeecb2bSBram Moolenaar
164cfcd011fSBram Moolenaar  var lines =<< trim END
16530fd8204SBram Moolenaar    final list = [1, 2, 3]
166dbeecb2bSBram Moolenaar    list[0] = 4
1670b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
16830fd8204SBram Moolenaar    const other = [5, 6, 7]
1690b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
17071abe482SBram Moolenaar
171cfcd011fSBram Moolenaar    var varlist = [7, 8]
17230fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
17371abe482SBram Moolenaar    varlist[0] = 77
17471abe482SBram Moolenaar    # TODO: does not work yet
17571abe482SBram Moolenaar    # constlist[1][1] = 88
176cfcd011fSBram Moolenaar    var cl = constlist[1]
17771abe482SBram Moolenaar    cl[1] = 88
17871abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
17971abe482SBram Moolenaar
180cfcd011fSBram Moolenaar    var vardict = #{five: 5, six: 6}
18130fd8204SBram Moolenaar    const constdict = #{one: 1, two: vardict, three: 3}
18271abe482SBram Moolenaar    vardict['five'] = 55
18371abe482SBram Moolenaar    # TODO: does not work yet
18471abe482SBram Moolenaar    # constdict['two']['six'] = 66
185cfcd011fSBram Moolenaar    var cd = constdict['two']
18671abe482SBram Moolenaar    cd['six'] = 66
18771abe482SBram Moolenaar    constdict->assert_equal(#{one: 1, two: #{five: 55, six: 66}, three: 3})
188dbeecb2bSBram Moolenaar  END
189dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
19008052228SBram Moolenaarenddef
1918a7d6542SBram Moolenaar
1920b4c66c6SBram Moolenaardef Test_const_bang()
193cfcd011fSBram Moolenaar  var lines =<< trim END
19430fd8204SBram Moolenaar      const var = 234
1950b4c66c6SBram Moolenaar      var = 99
1960b4c66c6SBram Moolenaar  END
1970b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
1980b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
1990b4c66c6SBram Moolenaar
2000b4c66c6SBram Moolenaar  lines =<< trim END
20130fd8204SBram Moolenaar      const ll = [2, 3, 4]
2020b4c66c6SBram Moolenaar      ll[0] = 99
2030b4c66c6SBram Moolenaar  END
2040b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2050b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2060b4c66c6SBram Moolenaar
2070b4c66c6SBram Moolenaar  lines =<< trim END
20830fd8204SBram Moolenaar      const ll = [2, 3, 4]
2090b4c66c6SBram Moolenaar      ll[3] = 99
2100b4c66c6SBram Moolenaar  END
2110b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2120b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2130b4c66c6SBram Moolenaar
2140b4c66c6SBram Moolenaar  lines =<< trim END
21530fd8204SBram Moolenaar      const dd = #{one: 1, two: 2}
2160b4c66c6SBram Moolenaar      dd["one"] = 99
2170b4c66c6SBram Moolenaar  END
2180b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2190b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2200b4c66c6SBram Moolenaar
2210b4c66c6SBram Moolenaar  lines =<< trim END
22230fd8204SBram Moolenaar      const dd = #{one: 1, two: 2}
2230b4c66c6SBram Moolenaar      dd["three"] = 99
2240b4c66c6SBram Moolenaar  END
2250b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2260b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2270b4c66c6SBram Moolenaarenddef
2280b4c66c6SBram Moolenaar
229df069eecSBram Moolenaardef Test_range_no_colon()
230d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
231d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
232d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
233d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
234df069eecSBram Moolenaarenddef
235df069eecSBram Moolenaar
236df069eecSBram Moolenaar
2378a7d6542SBram Moolenaardef Test_block()
238cfcd011fSBram Moolenaar  var outer = 1
2398a7d6542SBram Moolenaar  {
240cfcd011fSBram Moolenaar    var inner = 2
2418a7d6542SBram Moolenaar    assert_equal(1, outer)
2428a7d6542SBram Moolenaar    assert_equal(2, inner)
2438a7d6542SBram Moolenaar  }
2448a7d6542SBram Moolenaar  assert_equal(1, outer)
2458a7d6542SBram Moolenaarenddef
2468a7d6542SBram Moolenaar
24708052228SBram Moolenaardef Test_block_failure()
248cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
24908052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
25008052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
25108052228SBram Moolenaarenddef
2528a7d6542SBram Moolenaar
253*fbbcd003SBram Moolenaardef Test_block_local_vars()
254*fbbcd003SBram Moolenaar  var lines =<< trim END
255*fbbcd003SBram Moolenaar      vim9script
256*fbbcd003SBram Moolenaar      if true
257*fbbcd003SBram Moolenaar        var text = 'hello'
258*fbbcd003SBram Moolenaar        def SayHello(): string
259*fbbcd003SBram Moolenaar          return text
260*fbbcd003SBram Moolenaar        enddef
261*fbbcd003SBram Moolenaar        def SetText(v: string)
262*fbbcd003SBram Moolenaar          text = v
263*fbbcd003SBram Moolenaar        enddef
264*fbbcd003SBram Moolenaar      endif
265*fbbcd003SBram Moolenaar
266*fbbcd003SBram Moolenaar      if true
267*fbbcd003SBram Moolenaar        var text = 'again'
268*fbbcd003SBram Moolenaar        def SayAgain(): string
269*fbbcd003SBram Moolenaar          return text
270*fbbcd003SBram Moolenaar        enddef
271*fbbcd003SBram Moolenaar      endif
272*fbbcd003SBram Moolenaar      defcompile
273*fbbcd003SBram Moolenaar
274*fbbcd003SBram Moolenaar      assert_equal('hello', SayHello())
275*fbbcd003SBram Moolenaar      assert_equal('again', SayAgain())
276*fbbcd003SBram Moolenaar
277*fbbcd003SBram Moolenaar      SetText('foobar')
278*fbbcd003SBram Moolenaar      assert_equal('foobar', SayHello())
279*fbbcd003SBram Moolenaar  END
280*fbbcd003SBram Moolenaar  CheckScriptSuccess(lines)
281*fbbcd003SBram Moolenaarenddef
282*fbbcd003SBram Moolenaar
283d032f34aSBram Moolenaarfunc g:NoSuchFunc()
284d032f34aSBram Moolenaar  echo 'none'
285d032f34aSBram Moolenaarendfunc
286d032f34aSBram Moolenaar
2878a7d6542SBram Moolenaardef Test_try_catch()
288cfcd011fSBram Moolenaar  var l = []
2897a092245SBram Moolenaar  try # comment
2908a7d6542SBram Moolenaar    add(l, '1')
2918a7d6542SBram Moolenaar    throw 'wrong'
2928a7d6542SBram Moolenaar    add(l, '2')
2937a092245SBram Moolenaar  catch # comment
2948a7d6542SBram Moolenaar    add(l, v:exception)
2957a092245SBram Moolenaar  finally # comment
2968a7d6542SBram Moolenaar    add(l, '3')
2977a092245SBram Moolenaar  endtry # comment
2988a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
29968d130c6SBram Moolenaar
300e859312eSBram Moolenaar  l = []
301e859312eSBram Moolenaar  try
302e859312eSBram Moolenaar    try
303e859312eSBram Moolenaar      add(l, '1')
304e859312eSBram Moolenaar      throw 'wrong'
305e859312eSBram Moolenaar      add(l, '2')
306e859312eSBram Moolenaar    catch /right/
307e859312eSBram Moolenaar      add(l, v:exception)
308e859312eSBram Moolenaar    endtry
309e859312eSBram Moolenaar  catch /wrong/
310e859312eSBram Moolenaar    add(l, 'caught')
311373863edSBram Moolenaar  fina
312e859312eSBram Moolenaar    add(l, 'finally')
313e859312eSBram Moolenaar  endtry
314e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
315e859312eSBram Moolenaar
316cfcd011fSBram Moolenaar  var n: number
31768d130c6SBram Moolenaar  try
31868d130c6SBram Moolenaar    n = l[3]
31968d130c6SBram Moolenaar  catch /E684:/
32068d130c6SBram Moolenaar    n = 99
32168d130c6SBram Moolenaar  endtry
32268d130c6SBram Moolenaar  assert_equal(99, n)
32368d130c6SBram Moolenaar
32468d130c6SBram Moolenaar  try
325cc673e74SBram Moolenaar    # string slice returns a string, not a number
32668d130c6SBram Moolenaar    n = g:astring[3]
3275e654230SBram Moolenaar  catch /E1012:/
32868d130c6SBram Moolenaar    n = 77
32968d130c6SBram Moolenaar  endtry
33068d130c6SBram Moolenaar  assert_equal(77, n)
33168d130c6SBram Moolenaar
33268d130c6SBram Moolenaar  try
33368d130c6SBram Moolenaar    n = l[g:astring]
3345e654230SBram Moolenaar  catch /E1012:/
33556acb094SBram Moolenaar    n = 88
33668d130c6SBram Moolenaar  endtry
33756acb094SBram Moolenaar  assert_equal(88, n)
33868d130c6SBram Moolenaar
33968d130c6SBram Moolenaar  try
34068d130c6SBram Moolenaar    n = s:does_not_exist
34168d130c6SBram Moolenaar  catch /E121:/
342f0b9f43cSBram Moolenaar    n = 111
343f0b9f43cSBram Moolenaar  endtry
344f0b9f43cSBram Moolenaar  assert_equal(111, n)
345f0b9f43cSBram Moolenaar
346f0b9f43cSBram Moolenaar  try
347f0b9f43cSBram Moolenaar    n = g:does_not_exist
348f0b9f43cSBram Moolenaar  catch /E121:/
34968d130c6SBram Moolenaar    n = 121
35068d130c6SBram Moolenaar  endtry
35168d130c6SBram Moolenaar  assert_equal(121, n)
35268d130c6SBram Moolenaar
353cfcd011fSBram Moolenaar  var d = #{one: 1}
35468d130c6SBram Moolenaar  try
35568d130c6SBram Moolenaar    n = d[g:astring]
35668d130c6SBram Moolenaar  catch /E716:/
35768d130c6SBram Moolenaar    n = 222
35868d130c6SBram Moolenaar  endtry
35968d130c6SBram Moolenaar  assert_equal(222, n)
360f0b9f43cSBram Moolenaar
361f0b9f43cSBram Moolenaar  try
362f0b9f43cSBram Moolenaar    n = -g:astring
363f0b9f43cSBram Moolenaar  catch /E39:/
364f0b9f43cSBram Moolenaar    n = 233
365f0b9f43cSBram Moolenaar  endtry
366f0b9f43cSBram Moolenaar  assert_equal(233, n)
367f0b9f43cSBram Moolenaar
368f0b9f43cSBram Moolenaar  try
369f0b9f43cSBram Moolenaar    n = +g:astring
370f0b9f43cSBram Moolenaar  catch /E1030:/
371f0b9f43cSBram Moolenaar    n = 244
372f0b9f43cSBram Moolenaar  endtry
373f0b9f43cSBram Moolenaar  assert_equal(244, n)
374f0b9f43cSBram Moolenaar
375f0b9f43cSBram Moolenaar  try
376f0b9f43cSBram Moolenaar    n = +g:alist
377f0b9f43cSBram Moolenaar  catch /E745:/
378f0b9f43cSBram Moolenaar    n = 255
379f0b9f43cSBram Moolenaar  endtry
380f0b9f43cSBram Moolenaar  assert_equal(255, n)
381f0b9f43cSBram Moolenaar
382cfcd011fSBram Moolenaar  var nd: dict<any>
383f0b9f43cSBram Moolenaar  try
384f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
3855e654230SBram Moolenaar  catch /E1012:/
386f0b9f43cSBram Moolenaar    n = 266
387f0b9f43cSBram Moolenaar  endtry
388f0b9f43cSBram Moolenaar  assert_equal(266, n)
389f0b9f43cSBram Moolenaar
390f0b9f43cSBram Moolenaar  try
391f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
392f0b9f43cSBram Moolenaar  catch /E1093:/
393f0b9f43cSBram Moolenaar    n = 277
394f0b9f43cSBram Moolenaar  endtry
395f0b9f43cSBram Moolenaar  assert_equal(277, n)
396f0b9f43cSBram Moolenaar
397e859312eSBram Moolenaar  try
398e859312eSBram Moolenaar    &ts = g:astring
3995e654230SBram Moolenaar  catch /E1012:/
400e859312eSBram Moolenaar    n = 288
401e859312eSBram Moolenaar  endtry
402e859312eSBram Moolenaar  assert_equal(288, n)
403e859312eSBram Moolenaar
404e859312eSBram Moolenaar  try
405e859312eSBram Moolenaar    &backspace = 'asdf'
406e859312eSBram Moolenaar  catch /E474:/
407e859312eSBram Moolenaar    n = 299
408e859312eSBram Moolenaar  endtry
409e859312eSBram Moolenaar  assert_equal(299, n)
410e859312eSBram Moolenaar
411e859312eSBram Moolenaar  l = [1]
412e859312eSBram Moolenaar  try
413e859312eSBram Moolenaar    l[3] = 3
414e859312eSBram Moolenaar  catch /E684:/
415e859312eSBram Moolenaar    n = 300
416e859312eSBram Moolenaar  endtry
417e859312eSBram Moolenaar  assert_equal(300, n)
418e859312eSBram Moolenaar
419e859312eSBram Moolenaar  try
420e859312eSBram Moolenaar    unlet g:does_not_exist
421e859312eSBram Moolenaar  catch /E108:/
422e859312eSBram Moolenaar    n = 322
423e859312eSBram Moolenaar  endtry
424e859312eSBram Moolenaar  assert_equal(322, n)
425e859312eSBram Moolenaar
426e859312eSBram Moolenaar  try
427e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
428e859312eSBram Moolenaar  catch /E721:/
429e859312eSBram Moolenaar    n = 333
430e859312eSBram Moolenaar  endtry
431e859312eSBram Moolenaar  assert_equal(333, n)
432e859312eSBram Moolenaar
433e859312eSBram Moolenaar  try
434e859312eSBram Moolenaar    l = DeletedFunc()
435e859312eSBram Moolenaar  catch /E933:/
436e859312eSBram Moolenaar    n = 344
437e859312eSBram Moolenaar  endtry
438e859312eSBram Moolenaar  assert_equal(344, n)
439d032f34aSBram Moolenaar
440d032f34aSBram Moolenaar  try
441d032f34aSBram Moolenaar    echo len(v:true)
442d032f34aSBram Moolenaar  catch /E701:/
443d032f34aSBram Moolenaar    n = 355
444d032f34aSBram Moolenaar  endtry
445d032f34aSBram Moolenaar  assert_equal(355, n)
446d032f34aSBram Moolenaar
447cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
448d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
449d032f34aSBram Moolenaar  try
450d032f34aSBram Moolenaar    echo P()
451d032f34aSBram Moolenaar  catch /E117:/
452d032f34aSBram Moolenaar    n = 366
453d032f34aSBram Moolenaar  endtry
454d032f34aSBram Moolenaar  assert_equal(366, n)
455d032f34aSBram Moolenaar
456d032f34aSBram Moolenaar  try
457d032f34aSBram Moolenaar    echo g:NoSuchFunc()
458d032f34aSBram Moolenaar  catch /E117:/
459d032f34aSBram Moolenaar    n = 377
460d032f34aSBram Moolenaar  endtry
461d032f34aSBram Moolenaar  assert_equal(377, n)
462d032f34aSBram Moolenaar
463d032f34aSBram Moolenaar  try
464d032f34aSBram Moolenaar    echo g:alist + 4
465d032f34aSBram Moolenaar  catch /E745:/
466d032f34aSBram Moolenaar    n = 388
467d032f34aSBram Moolenaar  endtry
468d032f34aSBram Moolenaar  assert_equal(388, n)
469d032f34aSBram Moolenaar
470d032f34aSBram Moolenaar  try
471d032f34aSBram Moolenaar    echo 4 + g:alist
472d032f34aSBram Moolenaar  catch /E745:/
473d032f34aSBram Moolenaar    n = 399
474d032f34aSBram Moolenaar  endtry
475d032f34aSBram Moolenaar  assert_equal(399, n)
476d032f34aSBram Moolenaar
477d032f34aSBram Moolenaar  try
478d032f34aSBram Moolenaar    echo g:alist.member
479d032f34aSBram Moolenaar  catch /E715:/
480d032f34aSBram Moolenaar    n = 400
481d032f34aSBram Moolenaar  endtry
482d032f34aSBram Moolenaar  assert_equal(400, n)
483d032f34aSBram Moolenaar
484d032f34aSBram Moolenaar  try
485d032f34aSBram Moolenaar    echo d.member
486d032f34aSBram Moolenaar  catch /E716:/
487d032f34aSBram Moolenaar    n = 411
488d032f34aSBram Moolenaar  endtry
489d032f34aSBram Moolenaar  assert_equal(411, n)
4908a7d6542SBram Moolenaarenddef
4918a7d6542SBram Moolenaar
492e859312eSBram Moolenaardef DeletedFunc(): list<any>
493e859312eSBram Moolenaar  return ['delete me']
494e859312eSBram Moolenaarenddef
495e859312eSBram Moolenaardefcompile
496e859312eSBram Moolenaardelfunc DeletedFunc
497e859312eSBram Moolenaar
498257cc5eeSBram Moolenaardef ThrowFromDef()
499a72cfb80SBram Moolenaar  throw "getout" # comment
500257cc5eeSBram Moolenaarenddef
501257cc5eeSBram Moolenaar
502257cc5eeSBram Moolenaarfunc CatchInFunc()
503257cc5eeSBram Moolenaar  try
504257cc5eeSBram Moolenaar    call ThrowFromDef()
505257cc5eeSBram Moolenaar  catch
506257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
507257cc5eeSBram Moolenaar  endtry
508257cc5eeSBram Moolenaarendfunc
509257cc5eeSBram Moolenaar
510257cc5eeSBram Moolenaardef CatchInDef()
511257cc5eeSBram Moolenaar  try
512257cc5eeSBram Moolenaar    ThrowFromDef()
513257cc5eeSBram Moolenaar  catch
514257cc5eeSBram Moolenaar    g:thrown_def = v:exception
515257cc5eeSBram Moolenaar  endtry
516257cc5eeSBram Moolenaarenddef
517257cc5eeSBram Moolenaar
518f575adffSBram Moolenaardef ReturnFinally(): string
519f575adffSBram Moolenaar  try
520f575adffSBram Moolenaar    return 'intry'
521373863edSBram Moolenaar  finall
522f575adffSBram Moolenaar    g:in_finally = 'finally'
523f575adffSBram Moolenaar  endtry
524f575adffSBram Moolenaar  return 'end'
525f575adffSBram Moolenaarenddef
526f575adffSBram Moolenaar
527257cc5eeSBram Moolenaardef Test_try_catch_nested()
528257cc5eeSBram Moolenaar  CatchInFunc()
529257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
530257cc5eeSBram Moolenaar
531257cc5eeSBram Moolenaar  CatchInDef()
532257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
533f575adffSBram Moolenaar
534f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
535f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
536f575adffSBram Moolenaarenddef
537f575adffSBram Moolenaar
5389939f57bSBram Moolenaardef TryOne(): number
5399939f57bSBram Moolenaar  try
5409939f57bSBram Moolenaar    return 0
5419939f57bSBram Moolenaar  catch
5429939f57bSBram Moolenaar  endtry
5439939f57bSBram Moolenaar  return 0
5449939f57bSBram Moolenaarenddef
5459939f57bSBram Moolenaar
5469939f57bSBram Moolenaardef TryTwo(n: number): string
5479939f57bSBram Moolenaar  try
548cfcd011fSBram Moolenaar    var x = {}
5499939f57bSBram Moolenaar  catch
5509939f57bSBram Moolenaar  endtry
5519939f57bSBram Moolenaar  return 'text'
5529939f57bSBram Moolenaarenddef
5539939f57bSBram Moolenaar
5549939f57bSBram Moolenaardef Test_try_catch_twice()
5559939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
5569939f57bSBram Moolenaarenddef
5579939f57bSBram Moolenaar
558f575adffSBram Moolenaardef Test_try_catch_match()
559cfcd011fSBram Moolenaar  var seq = 'a'
560f575adffSBram Moolenaar  try
561f575adffSBram Moolenaar    throw 'something'
562f575adffSBram Moolenaar  catch /nothing/
563f575adffSBram Moolenaar    seq ..= 'x'
564f575adffSBram Moolenaar  catch /some/
565f575adffSBram Moolenaar    seq ..= 'b'
566f575adffSBram Moolenaar  catch /asdf/
567f575adffSBram Moolenaar    seq ..= 'x'
568e8c4abbbSBram Moolenaar  catch ?a\?sdf?
569e8c4abbbSBram Moolenaar    seq ..= 'y'
570f575adffSBram Moolenaar  finally
571f575adffSBram Moolenaar    seq ..= 'c'
572f575adffSBram Moolenaar  endtry
573f575adffSBram Moolenaar  assert_equal('abc', seq)
574257cc5eeSBram Moolenaarenddef
575257cc5eeSBram Moolenaar
576e8c4abbbSBram Moolenaardef Test_try_catch_fails()
577d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
578d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
579d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
580d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
581d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
582d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
583d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
584d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
58513106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
586d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
587585fea7bSBram Moolenaar
588d2c61705SBram Moolenaar  CheckDefFailure(['throw'], 'E1015:')
589d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
590e8c4abbbSBram Moolenaarenddef
591e8c4abbbSBram Moolenaar
592006ad48bSBram Moolenaardef Test_throw_vimscript()
593f5be8cdbSBram Moolenaar  # only checks line continuation
594cfcd011fSBram Moolenaar  var lines =<< trim END
595006ad48bSBram Moolenaar      vim9script
596006ad48bSBram Moolenaar      try
597006ad48bSBram Moolenaar        throw 'one'
598006ad48bSBram Moolenaar              .. 'two'
599006ad48bSBram Moolenaar      catch
600006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
601006ad48bSBram Moolenaar      endtry
602006ad48bSBram Moolenaar  END
603006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
604006ad48bSBram Moolenaarenddef
605006ad48bSBram Moolenaar
606ed677f55SBram Moolenaardef Test_error_in_nested_function()
607ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
608cfcd011fSBram Moolenaar  var lines =<< trim END
609ed677f55SBram Moolenaar      vim9script
610ed677f55SBram Moolenaar      def Func()
611ed677f55SBram Moolenaar        Error()
612ed677f55SBram Moolenaar        g:test_var = 1
613ed677f55SBram Moolenaar      enddef
614ed677f55SBram Moolenaar      func Error() abort
615ed677f55SBram Moolenaar        eval [][0]
616ed677f55SBram Moolenaar      endfunc
617ed677f55SBram Moolenaar      Func()
618ed677f55SBram Moolenaar  END
619ed677f55SBram Moolenaar  g:test_var = 0
620ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
621ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
622ed677f55SBram Moolenaarenddef
623ed677f55SBram Moolenaar
62437c83711SBram Moolenaardef Test_cexpr_vimscript()
625f5be8cdbSBram Moolenaar  # only checks line continuation
62637c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
627cfcd011fSBram Moolenaar  var lines =<< trim END
62837c83711SBram Moolenaar      vim9script
62937c83711SBram Moolenaar      cexpr 'File'
63037c83711SBram Moolenaar                .. ' someFile' ..
63137c83711SBram Moolenaar                   ' line 19'
63237c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
63337c83711SBram Moolenaar  END
63437c83711SBram Moolenaar  CheckScriptSuccess(lines)
63537c83711SBram Moolenaar  set errorformat&
63637c83711SBram Moolenaarenddef
63737c83711SBram Moolenaar
638c9edd6b5SBram Moolenaardef Test_statusline_syntax()
639c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
640cfcd011fSBram Moolenaar  var lines =<< trim END
641c9edd6b5SBram Moolenaar      vim9script
642c9edd6b5SBram Moolenaar      func g:Status()
643c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
644c9edd6b5SBram Moolenaar      endfunc
645c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
646c9edd6b5SBram Moolenaar      redrawstatus
647c9edd6b5SBram Moolenaar      set laststatus statusline=
648c9edd6b5SBram Moolenaar  END
649c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
650c9edd6b5SBram Moolenaarenddef
651c9edd6b5SBram Moolenaar
652b209750bSBram Moolenaardef Test_list_vimscript()
653b209750bSBram Moolenaar  # checks line continuation and comments
654cfcd011fSBram Moolenaar  var lines =<< trim END
655b209750bSBram Moolenaar      vim9script
656cfcd011fSBram Moolenaar      var mylist = [
657b209750bSBram Moolenaar            'one',
658b209750bSBram Moolenaar            # comment
659b209750bSBram Moolenaar            'two', # empty line follows
660b209750bSBram Moolenaar
661b209750bSBram Moolenaar            'three',
662b209750bSBram Moolenaar            ]
663b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
664b209750bSBram Moolenaar  END
665b209750bSBram Moolenaar  CheckScriptSuccess(lines)
66666250c93SBram Moolenaar
66766250c93SBram Moolenaar  # check all lines from heredoc are kept
66866250c93SBram Moolenaar  lines =<< trim END
66966250c93SBram Moolenaar      # comment 1
67066250c93SBram Moolenaar      two
67166250c93SBram Moolenaar      # comment 3
67266250c93SBram Moolenaar
67366250c93SBram Moolenaar      five
67466250c93SBram Moolenaar      # comment 6
67566250c93SBram Moolenaar  END
67666250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
677b209750bSBram Moolenaarenddef
678b209750bSBram Moolenaar
6792a1381c3SBram Moolenaarif has('channel')
68040ee466cSBram Moolenaar  let someJob = test_null_job()
68140ee466cSBram Moolenaar
68240ee466cSBram Moolenaar  def FuncWithError()
68340ee466cSBram Moolenaar    echomsg g:someJob
68440ee466cSBram Moolenaar  enddef
68540ee466cSBram Moolenaar
68640ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
68740ee466cSBram Moolenaar    try
68840ee466cSBram Moolenaar      call FuncWithError()
68940ee466cSBram Moolenaar    catch
69040ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
69140ee466cSBram Moolenaar    endtry
69240ee466cSBram Moolenaar  endfunc
6932a1381c3SBram Moolenaarendif
69440ee466cSBram Moolenaar
6958a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
6968a7d6542SBram Moolenaar  vim9script
697cfcd011fSBram Moolenaar  var name: string = 'bob'
6988a7d6542SBram Moolenaar  def Concat(arg: string): string
6998a7d6542SBram Moolenaar    return name .. arg
7008a7d6542SBram Moolenaar  enddef
701227a69deSBram Moolenaar  g:result = Concat('bie')
702227a69deSBram Moolenaar  g:localname = name
7038a7d6542SBram Moolenaar
7048a7d6542SBram Moolenaar  export const CONST = 1234
705cfcd011fSBram Moolenaar  export var exported = 9876
706cfcd011fSBram Moolenaar  export var exp_name = 'John'
7078a7d6542SBram Moolenaar  export def Exported(): string
7088a7d6542SBram Moolenaar    return 'Exported'
7098a7d6542SBram Moolenaar  enddef
7108a7d6542SBram MoolenaarEND
7118a7d6542SBram Moolenaar
712b3ca9824SBram Moolenaardef Undo_export_script_lines()
713b3ca9824SBram Moolenaar  unlet g:result
714b3ca9824SBram Moolenaar  unlet g:localname
715b3ca9824SBram Moolenaarenddef
716b3ca9824SBram Moolenaar
7175269bd2aSBram Moolenaardef Test_vim9_import_export()
718cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
7198a7d6542SBram Moolenaar    vim9script
7208a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
7218a7d6542SBram Moolenaar    g:imported = exported
7226e587dcbSBram Moolenaar    exported += 3
7236e587dcbSBram Moolenaar    g:imported_added = exported
7248a7d6542SBram Moolenaar    g:imported_func = Exported()
7256e587dcbSBram Moolenaar
72640f4f7a4SBram Moolenaar    def GetExported(): string
727cfcd011fSBram Moolenaar      var local_dict = #{ref: Exported}
72840f4f7a4SBram Moolenaar      return local_dict.ref()
72940f4f7a4SBram Moolenaar    enddef
73040f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
73140f4f7a4SBram Moolenaar
7326e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
7336e587dcbSBram Moolenaar    g:imported_name = exp_name
7346e587dcbSBram Moolenaar    exp_name ..= ' Doe'
7356e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
7365381c7a1SBram Moolenaar    g:imported_later = exported
7378a7d6542SBram Moolenaar  END
7388a7d6542SBram Moolenaar
7398a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
7408a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
7418a7d6542SBram Moolenaar
7428a7d6542SBram Moolenaar  source Ximport.vim
7438a7d6542SBram Moolenaar
7448a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
7458a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
7468a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
7476e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
7485381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
7498a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
75040f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
7516e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
7526e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
7538a7d6542SBram Moolenaar  assert_false(exists('g:name'))
7548a7d6542SBram Moolenaar
755b3ca9824SBram Moolenaar  Undo_export_script_lines()
7568a7d6542SBram Moolenaar  unlet g:imported
7576e587dcbSBram Moolenaar  unlet g:imported_added
7585381c7a1SBram Moolenaar  unlet g:imported_later
7598a7d6542SBram Moolenaar  unlet g:imported_func
7606e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
7618a7d6542SBram Moolenaar  delete('Ximport.vim')
762f2d5c240SBram Moolenaar
7631c991144SBram Moolenaar  # similar, with line breaks
764cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
7651c991144SBram Moolenaar    vim9script
7661c991144SBram Moolenaar    import {
7671c991144SBram Moolenaar        exported,
7681c991144SBram Moolenaar        Exported,
7691c991144SBram Moolenaar        }
7701c991144SBram Moolenaar        from
7711c991144SBram Moolenaar        './Xexport.vim'
7721c991144SBram Moolenaar    g:imported = exported
7731c991144SBram Moolenaar    exported += 5
7741c991144SBram Moolenaar    g:imported_added = exported
7751c991144SBram Moolenaar    g:imported_func = Exported()
7761c991144SBram Moolenaar  END
7771c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
7781c991144SBram Moolenaar  source Ximport_lbr.vim
7791c991144SBram Moolenaar
7801c991144SBram Moolenaar  assert_equal(9876, g:imported)
7811c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
7821c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
7831c991144SBram Moolenaar
7841c991144SBram Moolenaar  # exported script not sourced again
7851c991144SBram Moolenaar  assert_false(exists('g:result'))
7861c991144SBram Moolenaar  unlet g:imported
7871c991144SBram Moolenaar  unlet g:imported_added
7881c991144SBram Moolenaar  unlet g:imported_func
7891c991144SBram Moolenaar  delete('Ximport_lbr.vim')
7901c991144SBram Moolenaar
7911c991144SBram Moolenaar  # import inside :def function
792cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
7935381c7a1SBram Moolenaar    vim9script
7945381c7a1SBram Moolenaar    def ImportInDef()
7955381c7a1SBram Moolenaar      import exported from './Xexport.vim'
7965381c7a1SBram Moolenaar      g:imported = exported
7975381c7a1SBram Moolenaar      exported += 7
7985381c7a1SBram Moolenaar      g:imported_added = exported
7995381c7a1SBram Moolenaar    enddef
8005381c7a1SBram Moolenaar    ImportInDef()
8015381c7a1SBram Moolenaar  END
8025381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
8035381c7a1SBram Moolenaar  source Ximport2.vim
804f5be8cdbSBram Moolenaar  # TODO: this should be 9879
8055381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
8065381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
8075381c7a1SBram Moolenaar  unlet g:imported
8085381c7a1SBram Moolenaar  unlet g:imported_added
8095381c7a1SBram Moolenaar  delete('Ximport2.vim')
8105381c7a1SBram Moolenaar
811cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
812f2d5c240SBram Moolenaar    vim9script
813f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
814f2d5c240SBram Moolenaar    def UseExport()
815f2d5c240SBram Moolenaar      g:imported = Export.exported
816f2d5c240SBram Moolenaar    enddef
817f2d5c240SBram Moolenaar    UseExport()
818f2d5c240SBram Moolenaar  END
819f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
820f2d5c240SBram Moolenaar  source Ximport.vim
8215381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
822f2d5c240SBram Moolenaar
823cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
824599c89c8SBram Moolenaar    vim9script
825599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
826599c89c8SBram Moolenaar    def Func()
827cfcd011fSBram Moolenaar      var dummy = 1
828cfcd011fSBram Moolenaar      var imported = Export + dummy
829599c89c8SBram Moolenaar    enddef
830822ba247SBram Moolenaar    defcompile
831599c89c8SBram Moolenaar  END
832599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
83344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
834599c89c8SBram Moolenaar
835cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
836599c89c8SBram Moolenaar    vim9script
837599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
838599c89c8SBram Moolenaar    def Func()
839cfcd011fSBram Moolenaar      var imported = Export . exported
840599c89c8SBram Moolenaar    enddef
841822ba247SBram Moolenaar    defcompile
842599c89c8SBram Moolenaar  END
843599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
84444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
845599c89c8SBram Moolenaar
846cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
847599c89c8SBram Moolenaar    vim9script
848599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
849599c89c8SBram Moolenaar    def Func()
850cfcd011fSBram Moolenaar      var imported = Export.
851599c89c8SBram Moolenaar    enddef
852822ba247SBram Moolenaar    defcompile
853599c89c8SBram Moolenaar  END
854599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
85544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
856599c89c8SBram Moolenaar
857cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
8581c991144SBram Moolenaar    vim9script
8591c991144SBram Moolenaar    import *
8601c991144SBram Moolenaar        as Export
8611c991144SBram Moolenaar        from
8621c991144SBram Moolenaar        './Xexport.vim'
8631c991144SBram Moolenaar    def UseExport()
8641c991144SBram Moolenaar      g:imported = Export.exported
8651c991144SBram Moolenaar    enddef
8661c991144SBram Moolenaar    UseExport()
8671c991144SBram Moolenaar  END
8681c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
8691c991144SBram Moolenaar  source Ximport.vim
8701c991144SBram Moolenaar  assert_equal(9883, g:imported)
8711c991144SBram Moolenaar
872cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
873f2d5c240SBram Moolenaar    vim9script
874f2d5c240SBram Moolenaar    import * from './Xexport.vim'
875f2d5c240SBram Moolenaar  END
876f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
87744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
878f2d5c240SBram Moolenaar
879f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
880cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
881fa29c8abSBram Moolenaar    vim9script
882fa29c8abSBram Moolenaar    import name from './Xexport.vim'
883fa29c8abSBram Moolenaar  END
884fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
88544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
886fa29c8abSBram Moolenaar
887f5be8cdbSBram Moolenaar  # try to import something that is already defined
888cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
8895269bd2aSBram Moolenaar    vim9script
890cfcd011fSBram Moolenaar    var exported = 'something'
8915269bd2aSBram Moolenaar    import exported from './Xexport.vim'
8925269bd2aSBram Moolenaar  END
8935269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
89444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
8955269bd2aSBram Moolenaar
896f5be8cdbSBram Moolenaar  # try to import something that is already defined
8975269bd2aSBram Moolenaar  import_already_defined =<< trim END
8985269bd2aSBram Moolenaar    vim9script
899cfcd011fSBram Moolenaar    var exported = 'something'
9005269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
9015269bd2aSBram Moolenaar  END
9025269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
90344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9045269bd2aSBram Moolenaar
905f5be8cdbSBram Moolenaar  # try to import something that is already defined
9065269bd2aSBram Moolenaar  import_already_defined =<< trim END
9075269bd2aSBram Moolenaar    vim9script
908cfcd011fSBram Moolenaar    var exported = 'something'
9095269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
9105269bd2aSBram Moolenaar  END
9115269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
91244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9135269bd2aSBram Moolenaar
914f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
915cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
916fa29c8abSBram Moolenaar    vim9script
917fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
918fa29c8abSBram Moolenaar  END
919fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
92044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
921fa29c8abSBram Moolenaar
922cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
923fa29c8abSBram Moolenaar    vim9script
924fa29c8abSBram Moolenaar    import name './Xexport.vim'
925fa29c8abSBram Moolenaar  END
926fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
92744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
928fa29c8abSBram Moolenaar
929cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
930fa29c8abSBram Moolenaar    vim9script
931fa29c8abSBram Moolenaar    import name from Xexport.vim
932fa29c8abSBram Moolenaar  END
933fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
93444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
935fa29c8abSBram Moolenaar
936cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
937fa29c8abSBram Moolenaar    vim9script
938fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
939fa29c8abSBram Moolenaar  END
940fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
94144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
942fa29c8abSBram Moolenaar
943cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
944fa29c8abSBram Moolenaar    vim9script
945fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
946fa29c8abSBram Moolenaar  END
9475269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
94844d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
949fa29c8abSBram Moolenaar
950f2d5c240SBram Moolenaar  delete('Ximport.vim')
9515269bd2aSBram Moolenaar  delete('Ximport3.vim')
9528a7d6542SBram Moolenaar  delete('Xexport.vim')
9538a7d6542SBram Moolenaar
954f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
955750802b5SBram Moolenaar  set cpo&vi
956cfcd011fSBram Moolenaar  var cpo_before = &cpo
957cfcd011fSBram Moolenaar  var lines =<< trim END
958750802b5SBram Moolenaar    vim9script
959750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
960750802b5SBram Moolenaar  END
961750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
962750802b5SBram Moolenaar  source Xvim9_script
963750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
964750802b5SBram Moolenaar  set cpo&vim
965750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
966750802b5SBram Moolenaar  delete('Xvim9_script')
967750802b5SBram Moolenaarenddef
968750802b5SBram Moolenaar
969803af686SBram Moolenaarfunc g:Trigger()
970803af686SBram Moolenaar  source Ximport.vim
971803af686SBram Moolenaar  return "echo 'yes'\<CR>"
972803af686SBram Moolenaarendfunc
973803af686SBram Moolenaar
974803af686SBram Moolenaardef Test_import_export_expr_map()
975803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
976cfcd011fSBram Moolenaar  var export_lines =<< trim END
977803af686SBram Moolenaar    vim9script
978803af686SBram Moolenaar    export def That(): string
979803af686SBram Moolenaar      return 'yes'
980803af686SBram Moolenaar    enddef
981803af686SBram Moolenaar  END
982803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
983803af686SBram Moolenaar
984cfcd011fSBram Moolenaar  var import_lines =<< trim END
985803af686SBram Moolenaar    vim9script
986803af686SBram Moolenaar    import That from './Xexport_that.vim'
987803af686SBram Moolenaar    assert_equal('yes', That())
988803af686SBram Moolenaar  END
989803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
990803af686SBram Moolenaar
991803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
992803af686SBram Moolenaar  feedkeys('trigger', "xt")
993803af686SBram Moolenaar
994730b2483SBram Moolenaar  delete('Xexport_that.vim')
995803af686SBram Moolenaar  delete('Ximport.vim')
996803af686SBram Moolenaar  nunmap trigger
997803af686SBram Moolenaarenddef
998803af686SBram Moolenaar
9998e1986e3SBram Moolenaardef Test_import_in_filetype()
10008e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
10018e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1002cfcd011fSBram Moolenaar  var export_lines =<< trim END
10038e1986e3SBram Moolenaar    vim9script
1004cfcd011fSBram Moolenaar    export var That = 'yes'
10058e1986e3SBram Moolenaar  END
1006730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
10078e1986e3SBram Moolenaar
1008cfcd011fSBram Moolenaar  var import_lines =<< trim END
10098e1986e3SBram Moolenaar    vim9script
1010730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
10118e1986e3SBram Moolenaar    assert_equal('yes', That)
10128e1986e3SBram Moolenaar    g:did_load_mytpe = 1
10138e1986e3SBram Moolenaar  END
10148e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
10158e1986e3SBram Moolenaar
1016cfcd011fSBram Moolenaar  var save_rtp = &rtp
10178e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
10188e1986e3SBram Moolenaar
10198e1986e3SBram Moolenaar  filetype plugin on
10208e1986e3SBram Moolenaar  copen
10218e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
10228e1986e3SBram Moolenaar
10238e1986e3SBram Moolenaar  quit!
1024730b2483SBram Moolenaar  delete('Xexport_ft.vim')
10258e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
10268e1986e3SBram Moolenaar  &rtp = save_rtp
10278e1986e3SBram Moolenaarenddef
10288e1986e3SBram Moolenaar
1029efa94447SBram Moolenaardef Test_use_import_in_mapping()
1030cfcd011fSBram Moolenaar  var lines =<< trim END
1031efa94447SBram Moolenaar      vim9script
1032efa94447SBram Moolenaar      export def Funcx()
1033efa94447SBram Moolenaar        g:result = 42
1034efa94447SBram Moolenaar      enddef
1035efa94447SBram Moolenaar  END
1036efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1037efa94447SBram Moolenaar  lines =<< trim END
1038efa94447SBram Moolenaar      vim9script
1039efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1040b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1041efa94447SBram Moolenaar  END
1042efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1043efa94447SBram Moolenaar
1044efa94447SBram Moolenaar  source Xmapscript.vim
1045b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1046efa94447SBram Moolenaar  assert_equal(42, g:result)
1047efa94447SBram Moolenaar
1048efa94447SBram Moolenaar  unlet g:result
1049efa94447SBram Moolenaar  delete('XsomeExport.vim')
1050efa94447SBram Moolenaar  delete('Xmapscript.vim')
1051b3ca9824SBram Moolenaar  nunmap <F3>
1052efa94447SBram Moolenaarenddef
1053efa94447SBram Moolenaar
1054750802b5SBram Moolenaardef Test_vim9script_fails()
10558a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
10568a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1057cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
10589721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1059cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1060750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1061750802b5SBram Moolenaar
1062cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1063c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1064c785b9a7SBram Moolenaar
1065e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1066e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
10678a7d6542SBram Moolenaarenddef
10688a7d6542SBram Moolenaar
1069f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1070101f4810SBram Moolenaar  CheckRunVimInTerminal
1071101f4810SBram Moolenaar
10729bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1073c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
10749bb3eb3eSBram Moolenaarendfunc
10759bb3eb3eSBram Moolenaar
1076c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1077cfcd011fSBram Moolenaar  var export =<< trim END
1078101f4810SBram Moolenaar    vim9script
1079101f4810SBram Moolenaar    export def Foo(): number
1080101f4810SBram Moolenaar        return 0
1081101f4810SBram Moolenaar    enddef
1082101f4810SBram Moolenaar  END
1083730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1084101f4810SBram Moolenaar
1085cfcd011fSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
10869bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
10879bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1088101f4810SBram Moolenaar
1089730b2483SBram Moolenaar  delete('XexportCmd.vim')
10909bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
10919bb3eb3eSBram Moolenaarenddef
1092101f4810SBram Moolenaar
10934c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1094cfcd011fSBram Moolenaar  var lines =<< trim END
10958a7d6542SBram Moolenaar    vim9script
10968a7d6542SBram Moolenaar    const var = ''
1097cfcd011fSBram Moolenaar    var valone = 1234
10988a7d6542SBram Moolenaar    def MyFunc(arg: string)
10998a7d6542SBram Moolenaar       valone = 5678
11008a7d6542SBram Moolenaar    enddef
11018a7d6542SBram Moolenaar  END
1102cfcd011fSBram Moolenaar  var morelines =<< trim END
1103cfcd011fSBram Moolenaar    var valtwo = 222
11048a7d6542SBram Moolenaar    export def GetValtwo(): number
11058a7d6542SBram Moolenaar      return valtwo
11068a7d6542SBram Moolenaar    enddef
11078a7d6542SBram Moolenaar  END
110803afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
11098a7d6542SBram Moolenaar  source Xreload.vim
11108a7d6542SBram Moolenaar  source Xreload.vim
11118a7d6542SBram Moolenaar  source Xreload.vim
11128a7d6542SBram Moolenaar
1113cfcd011fSBram Moolenaar  var testlines =<< trim END
11148a7d6542SBram Moolenaar    vim9script
11158a7d6542SBram Moolenaar    def TheFunc()
11168a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
11178a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
11188a7d6542SBram Moolenaar    enddef
11198a7d6542SBram Moolenaar    TheFunc()
11208a7d6542SBram Moolenaar  END
11218a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
11228a7d6542SBram Moolenaar  source Ximport.vim
11238a7d6542SBram Moolenaar
1124f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1125f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
11268a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
11278a7d6542SBram Moolenaar  source Ximport.vim
11288a7d6542SBram Moolenaar
1129f5be8cdbSBram Moolenaar  # cannot declare a var twice
11308a7d6542SBram Moolenaar  lines =<< trim END
11318a7d6542SBram Moolenaar    vim9script
1132cfcd011fSBram Moolenaar    var valone = 1234
1133cfcd011fSBram Moolenaar    var valone = 5678
11348a7d6542SBram Moolenaar  END
11358a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
113644d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
11378a7d6542SBram Moolenaar
11388a7d6542SBram Moolenaar  delete('Xreload.vim')
11398a7d6542SBram Moolenaar  delete('Ximport.vim')
11408a7d6542SBram Moolenaarenddef
11418a7d6542SBram Moolenaar
114295006e3dSBram Moolenaardef s:RetSome(): string
114395006e3dSBram Moolenaar  return 'some'
114495006e3dSBram Moolenaarenddef
114595006e3dSBram Moolenaar
1146fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1147fe465a01SBram Moolenaar" script-local name.
1148fe465a01SBram Moolenaardef Test_vim9script_funcref()
1149cfcd011fSBram Moolenaar  var sortlines =<< trim END
1150fe465a01SBram Moolenaar      vim9script
1151fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1152bed36b93SBram Moolenaar        return i2 - i1
1153fe465a01SBram Moolenaar      enddef
1154fe465a01SBram Moolenaar
1155fe465a01SBram Moolenaar      export def FastSort(): list<number>
1156fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1157fe465a01SBram Moolenaar      enddef
1158fe465a01SBram Moolenaar  END
1159fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1160fe465a01SBram Moolenaar
1161cfcd011fSBram Moolenaar  var lines =<< trim END
1162fe465a01SBram Moolenaar    vim9script
1163fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1164fe465a01SBram Moolenaar    def Test()
1165fe465a01SBram Moolenaar      g:result = FastSort()
1166fe465a01SBram Moolenaar    enddef
1167fe465a01SBram Moolenaar    Test()
1168fe465a01SBram Moolenaar  END
1169fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1170fe465a01SBram Moolenaar
1171fe465a01SBram Moolenaar  source Xscript.vim
1172fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1173fe465a01SBram Moolenaar
1174fe465a01SBram Moolenaar  unlet g:result
1175fe465a01SBram Moolenaar  delete('Xsort.vim')
1176fe465a01SBram Moolenaar  delete('Xscript.vim')
117795006e3dSBram Moolenaar
1178cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
117995006e3dSBram Moolenaar  assert_equal('some', Funcref())
1180fe465a01SBram Moolenaarenddef
1181fe465a01SBram Moolenaar
1182601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1183601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1184601e76acSBram Moolenaar" function reference.
1185c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1186cfcd011fSBram Moolenaar  var filterLines =<< trim END
1187c620c055SBram Moolenaar    vim9script
1188c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1189c620c055SBram Moolenaar      return idx % 2 == 1
1190c620c055SBram Moolenaar    enddef
1191c620c055SBram Moolenaar    export def FastFilter(): list<number>
1192c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1193c620c055SBram Moolenaar    enddef
1194601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1195601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1196601e76acSBram Moolenaar    enddef
1197c620c055SBram Moolenaar  END
1198c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1199c620c055SBram Moolenaar
1200cfcd011fSBram Moolenaar  var lines =<< trim END
1201c620c055SBram Moolenaar    vim9script
1202601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1203c620c055SBram Moolenaar    def Test()
1204cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1205c620c055SBram Moolenaar    enddef
1206c620c055SBram Moolenaar    Test()
1207601e76acSBram Moolenaar    def TestDirect()
1208cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1209601e76acSBram Moolenaar    enddef
1210601e76acSBram Moolenaar    TestDirect()
1211c620c055SBram Moolenaar  END
1212601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1213c620c055SBram Moolenaar  delete('Xfilter.vim')
1214c620c055SBram Moolenaarenddef
1215c620c055SBram Moolenaar
12164c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1217cfcd011fSBram Moolenaar  var first_lines =<< trim END
12184c17ad94SBram Moolenaar    vim9script
12194c17ad94SBram Moolenaar    def FuncYes(): string
12204c17ad94SBram Moolenaar      return 'yes'
12214c17ad94SBram Moolenaar    enddef
12224c17ad94SBram Moolenaar  END
1223cfcd011fSBram Moolenaar  var withno_lines =<< trim END
12244c17ad94SBram Moolenaar    def FuncNo(): string
12254c17ad94SBram Moolenaar      return 'no'
12264c17ad94SBram Moolenaar    enddef
12274c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
12284c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
12294c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
123003afdcf1SBram Moolenaar    enddef
123103afdcf1SBram Moolenaar  END
1232cfcd011fSBram Moolenaar  var nono_lines =<< trim END
123303afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
123403afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
123544d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
12364c17ad94SBram Moolenaar    enddef
12374c17ad94SBram Moolenaar  END
12384c17ad94SBram Moolenaar
12394c17ad94SBram Moolenaar  # FuncNo() is defined
124003afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12414c17ad94SBram Moolenaar  source Xreloaded.vim
12424c17ad94SBram Moolenaar  g:DoCheck(true)
12434c17ad94SBram Moolenaar
12444c17ad94SBram Moolenaar  # FuncNo() is not redefined
124503afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
12464c17ad94SBram Moolenaar  source Xreloaded.vim
124703afdcf1SBram Moolenaar  g:DoCheck()
12484c17ad94SBram Moolenaar
12494c17ad94SBram Moolenaar  # FuncNo() is back
125003afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12514c17ad94SBram Moolenaar  source Xreloaded.vim
125203afdcf1SBram Moolenaar  g:DoCheck()
12534c17ad94SBram Moolenaar
12544c17ad94SBram Moolenaar  delete('Xreloaded.vim')
12554c17ad94SBram Moolenaarenddef
12564c17ad94SBram Moolenaar
125789483d40SBram Moolenaardef Test_vim9script_reload_delvar()
125889483d40SBram Moolenaar  # write the script with a script-local variable
1259cfcd011fSBram Moolenaar  var lines =<< trim END
126089483d40SBram Moolenaar    vim9script
1261cfcd011fSBram Moolenaar    var name = 'string'
126289483d40SBram Moolenaar  END
126389483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
126489483d40SBram Moolenaar  source XreloadVar.vim
126589483d40SBram Moolenaar
126689483d40SBram Moolenaar  # now write the script using the same variable locally - works
126789483d40SBram Moolenaar  lines =<< trim END
126889483d40SBram Moolenaar    vim9script
126989483d40SBram Moolenaar    def Func()
1270cfcd011fSBram Moolenaar      var name = 'string'
127189483d40SBram Moolenaar    enddef
127289483d40SBram Moolenaar  END
127389483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
127489483d40SBram Moolenaar  source XreloadVar.vim
127589483d40SBram Moolenaar
127689483d40SBram Moolenaar  delete('XreloadVar.vim')
127789483d40SBram Moolenaarenddef
127889483d40SBram Moolenaar
12798a7d6542SBram Moolenaardef Test_import_absolute()
1280cfcd011fSBram Moolenaar  var import_lines = [
1281e6085c53SBram Moolenaar        'vim9script',
1282e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1283e6085c53SBram Moolenaar        'def UseExported()',
1284e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1285e6085c53SBram Moolenaar        '  exported = 8888',
1286e6085c53SBram Moolenaar        '  g:imported_after = exported',
1287e6085c53SBram Moolenaar        'enddef',
1288e6085c53SBram Moolenaar        'UseExported()',
1289e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1290e6085c53SBram Moolenaar        ]
12918a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
12928a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
12938a7d6542SBram Moolenaar
12948a7d6542SBram Moolenaar  source Ximport_abs.vim
12958a7d6542SBram Moolenaar
12968a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
12974e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1298*fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1299*fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1300*fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1301*fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1302*fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1303*fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1304*fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1305*fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1306*fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1307*fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1308e6085c53SBram Moolenaar        g:import_disassembled)
1309b3ca9824SBram Moolenaar
1310b3ca9824SBram Moolenaar  Undo_export_script_lines()
13118a7d6542SBram Moolenaar  unlet g:imported_abs
13124e12a5dfSBram Moolenaar  unlet g:import_disassembled
13138a7d6542SBram Moolenaar
13148a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
13158a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
13168a7d6542SBram Moolenaarenddef
13178a7d6542SBram Moolenaar
13188a7d6542SBram Moolenaardef Test_import_rtp()
1319cfcd011fSBram Moolenaar  var import_lines = [
1320e6085c53SBram Moolenaar        'vim9script',
1321e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1322e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1323e6085c53SBram Moolenaar        ]
13248a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
13258a7d6542SBram Moolenaar  mkdir('import')
13268a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
13278a7d6542SBram Moolenaar
1328cfcd011fSBram Moolenaar  var save_rtp = &rtp
13298a7d6542SBram Moolenaar  &rtp = getcwd()
13308a7d6542SBram Moolenaar  source Ximport_rtp.vim
13318a7d6542SBram Moolenaar  &rtp = save_rtp
13328a7d6542SBram Moolenaar
13338a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
13348a7d6542SBram Moolenaar
1335b3ca9824SBram Moolenaar  Undo_export_script_lines()
1336b3ca9824SBram Moolenaar  unlet g:imported_rtp
13378a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
133889483d40SBram Moolenaar  delete('import', 'rf')
13398a7d6542SBram Moolenaarenddef
13408a7d6542SBram Moolenaar
134125e0f586SBram Moolenaardef Test_import_compile_error()
1342cfcd011fSBram Moolenaar  var export_lines = [
134325e0f586SBram Moolenaar        'vim9script',
134425e0f586SBram Moolenaar        'export def ExpFunc(): string',
134525e0f586SBram Moolenaar        '  return notDefined',
134625e0f586SBram Moolenaar        'enddef',
134725e0f586SBram Moolenaar        ]
134825e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
134925e0f586SBram Moolenaar
1350cfcd011fSBram Moolenaar  var import_lines = [
135125e0f586SBram Moolenaar        'vim9script',
135225e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
135325e0f586SBram Moolenaar        'def ImpFunc()',
135425e0f586SBram Moolenaar        '  echo ExpFunc()',
135525e0f586SBram Moolenaar        'enddef',
135625e0f586SBram Moolenaar        'defcompile',
135725e0f586SBram Moolenaar        ]
135825e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
135925e0f586SBram Moolenaar
136025e0f586SBram Moolenaar  try
136125e0f586SBram Moolenaar    source Ximport.vim
136225e0f586SBram Moolenaar  catch /E1001/
1363f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
13647707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
136525e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
136625e0f586SBram Moolenaar  endtry
136725e0f586SBram Moolenaar
136825e0f586SBram Moolenaar  delete('Xexported.vim')
136925e0f586SBram Moolenaar  delete('Ximport.vim')
137025e0f586SBram Moolenaarenddef
137125e0f586SBram Moolenaar
1372c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1373cfcd011fSBram Moolenaar  var lines = [
1374c4ce36d4SBram Moolenaar        'vim9script',
1375c4ce36d4SBram Moolenaar        'def Func()',
1376c4ce36d4SBram Moolenaar        '  eval [][0]',
1377c4ce36d4SBram Moolenaar        'enddef',
1378c4ce36d4SBram Moolenaar        'Func()',
1379c4ce36d4SBram Moolenaar        ]
1380c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1381c4ce36d4SBram Moolenaar
1382c4ce36d4SBram Moolenaar  for count in range(3)
1383c4ce36d4SBram Moolenaar    try
1384c4ce36d4SBram Moolenaar      source Xtestscript.vim
1385c4ce36d4SBram Moolenaar    catch /E684/
1386c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1387c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1388c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1389c4ce36d4SBram Moolenaar    endtry
1390c4ce36d4SBram Moolenaar  endfor
1391c4ce36d4SBram Moolenaar
1392c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1393c4ce36d4SBram Moolenaarenddef
1394c4ce36d4SBram Moolenaar
1395eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1396cfcd011fSBram Moolenaar  var export_lines =<< trim END
1397eef2102eSBram Moolenaar      vim9script
1398eef2102eSBram Moolenaar      export def Func()
1399eef2102eSBram Moolenaar        echo 'imported'
1400eef2102eSBram Moolenaar      enddef
1401eef2102eSBram Moolenaar  END
1402eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1403eef2102eSBram Moolenaar
1404cfcd011fSBram Moolenaar  var lines =<< trim END
1405eef2102eSBram Moolenaar    vim9script
1406eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1407eef2102eSBram Moolenaar    def Func()
1408eef2102eSBram Moolenaar      echo 'local to function'
1409eef2102eSBram Moolenaar    enddef
1410eef2102eSBram Moolenaar  END
1411eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1412eef2102eSBram Moolenaar
1413eef2102eSBram Moolenaar  lines =<< trim END
1414eef2102eSBram Moolenaar    vim9script
1415eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1416eef2102eSBram Moolenaar    def Outer()
1417eef2102eSBram Moolenaar      def Func()
1418eef2102eSBram Moolenaar        echo 'local to function'
1419eef2102eSBram Moolenaar      enddef
1420eef2102eSBram Moolenaar    enddef
1421eef2102eSBram Moolenaar    defcompile
1422eef2102eSBram Moolenaar  END
1423eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1424eef2102eSBram Moolenaar
1425eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1426eef2102eSBram Moolenaarenddef
1427eef2102eSBram Moolenaar
1428b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1429cfcd011fSBram Moolenaar  var lines =<< trim END
1430b9a2cac3SBram Moolenaar    vim9script
1431b9a2cac3SBram Moolenaar    def Func()
1432b9a2cac3SBram Moolenaar      echo 'one'
1433b9a2cac3SBram Moolenaar    enddef
1434b9a2cac3SBram Moolenaar    def Func()
1435b9a2cac3SBram Moolenaar      echo 'two'
1436b9a2cac3SBram Moolenaar    enddef
1437b9a2cac3SBram Moolenaar  END
1438b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1439fa211f3cSBram Moolenaar
1440fa211f3cSBram Moolenaar  lines =<< trim END
1441fa211f3cSBram Moolenaar    vim9script
1442fa211f3cSBram Moolenaar    def Foo(): string
1443fa211f3cSBram Moolenaar      return 'foo'
1444fa211f3cSBram Moolenaar      enddef
1445fa211f3cSBram Moolenaar    def Func()
1446cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1447fa211f3cSBram Moolenaar    enddef
1448fa211f3cSBram Moolenaar    defcompile
1449fa211f3cSBram Moolenaar  END
1450fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1451b9a2cac3SBram Moolenaarenddef
1452b9a2cac3SBram Moolenaar
14538a7d6542SBram Moolenaardef Test_fixed_size_list()
1454f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1455cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
14568a7d6542SBram Moolenaar  l->remove(0)
14578a7d6542SBram Moolenaar  l->add(5)
14588a7d6542SBram Moolenaar  l->insert(99, 1)
14590f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
14608a7d6542SBram Moolenaarenddef
14618a7d6542SBram Moolenaar
1462ae616494SBram Moolenaardef Test_no_insert_xit()
1463d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1464d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1465d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1466d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1467d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1468ae616494SBram Moolenaar
1469ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1470ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1471ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1472ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1473f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1474f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1475f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1476f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1477f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1478ae616494SBram Moolenaarenddef
1479ae616494SBram Moolenaar
1480158906cfSBram Moolenaardef IfElse(what: number): string
1481cfcd011fSBram Moolenaar  var res = ''
1482158906cfSBram Moolenaar  if what == 1
1483158906cfSBram Moolenaar    res = "one"
1484158906cfSBram Moolenaar  elseif what == 2
1485158906cfSBram Moolenaar    res = "two"
1486a259d8d3SBram Moolenaar  else
1487158906cfSBram Moolenaar    res = "three"
1488a259d8d3SBram Moolenaar  endif
1489158906cfSBram Moolenaar  return res
1490a259d8d3SBram Moolenaarenddef
1491a259d8d3SBram Moolenaar
1492158906cfSBram Moolenaardef Test_if_elseif_else()
1493158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1494158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1495158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
14960f18b6d1SBram Moolenaarenddef
14970f18b6d1SBram Moolenaar
1498e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1499d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1500d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1501d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1502d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1503d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
1504e8c4abbbSBram Moolenaarenddef
1505e8c4abbbSBram Moolenaar
15066d69bf60SBram Moolenaarlet g:bool_true = v:true
15076d69bf60SBram Moolenaarlet g:bool_false = v:false
15086d69bf60SBram Moolenaar
15096d69bf60SBram Moolenaardef Test_if_const_expr()
1510cfcd011fSBram Moolenaar  var res = false
15116d69bf60SBram Moolenaar  if true ? true : false
15126d69bf60SBram Moolenaar    res = true
15136d69bf60SBram Moolenaar  endif
15146d69bf60SBram Moolenaar  assert_equal(true, res)
15156d69bf60SBram Moolenaar
1516585fea7bSBram Moolenaar  g:glob = 2
1517585fea7bSBram Moolenaar  if false
15186797966dSBram Moolenaar    execute('g:glob = 3')
1519585fea7bSBram Moolenaar  endif
1520585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1521585fea7bSBram Moolenaar  if true
15226797966dSBram Moolenaar    execute('g:glob = 3')
1523585fea7bSBram Moolenaar  endif
1524585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1525585fea7bSBram Moolenaar
15266d69bf60SBram Moolenaar  res = false
15276d69bf60SBram Moolenaar  if g:bool_true ? true : false
15286d69bf60SBram Moolenaar    res = true
15296d69bf60SBram Moolenaar  endif
15306d69bf60SBram Moolenaar  assert_equal(true, res)
15316d69bf60SBram Moolenaar
15326d69bf60SBram Moolenaar  res = false
15336d69bf60SBram Moolenaar  if true ? g:bool_true : false
15346d69bf60SBram Moolenaar    res = true
15356d69bf60SBram Moolenaar  endif
15366d69bf60SBram Moolenaar  assert_equal(true, res)
15376d69bf60SBram Moolenaar
15386d69bf60SBram Moolenaar  res = false
15396d69bf60SBram Moolenaar  if true ? true : g:bool_false
15406d69bf60SBram Moolenaar    res = true
15416d69bf60SBram Moolenaar  endif
15426d69bf60SBram Moolenaar  assert_equal(true, res)
15436d69bf60SBram Moolenaar
15446d69bf60SBram Moolenaar  res = false
15456d69bf60SBram Moolenaar  if true ? false : true
15466d69bf60SBram Moolenaar    res = true
15476d69bf60SBram Moolenaar  endif
15486d69bf60SBram Moolenaar  assert_equal(false, res)
15496d69bf60SBram Moolenaar
15506d69bf60SBram Moolenaar  res = false
15516d69bf60SBram Moolenaar  if false ? false : true
15526d69bf60SBram Moolenaar    res = true
15536d69bf60SBram Moolenaar  endif
15546d69bf60SBram Moolenaar  assert_equal(true, res)
15556d69bf60SBram Moolenaar
15566d69bf60SBram Moolenaar  res = false
15576d69bf60SBram Moolenaar  if false ? true : false
15586d69bf60SBram Moolenaar    res = true
15596d69bf60SBram Moolenaar  endif
15606d69bf60SBram Moolenaar  assert_equal(false, res)
15616d69bf60SBram Moolenaar
15626d69bf60SBram Moolenaar  res = false
1563e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1564e8c4abbbSBram Moolenaar    res = true
1565e8c4abbbSBram Moolenaar  endif
1566e8c4abbbSBram Moolenaar  assert_equal(false, res)
1567e8c4abbbSBram Moolenaar
1568e8c4abbbSBram Moolenaar  res = false
15696d69bf60SBram Moolenaar  if true && true
15706d69bf60SBram Moolenaar    res = true
15716d69bf60SBram Moolenaar  endif
15726d69bf60SBram Moolenaar  assert_equal(true, res)
15736d69bf60SBram Moolenaar
15746d69bf60SBram Moolenaar  res = false
15756d69bf60SBram Moolenaar  if true && false
15766d69bf60SBram Moolenaar    res = true
15776d69bf60SBram Moolenaar  endif
15786d69bf60SBram Moolenaar  assert_equal(false, res)
15796d69bf60SBram Moolenaar
15806d69bf60SBram Moolenaar  res = false
15816d69bf60SBram Moolenaar  if g:bool_true && false
15826d69bf60SBram Moolenaar    res = true
15836d69bf60SBram Moolenaar  endif
15846d69bf60SBram Moolenaar  assert_equal(false, res)
15856d69bf60SBram Moolenaar
15866d69bf60SBram Moolenaar  res = false
15876d69bf60SBram Moolenaar  if true && g:bool_false
15886d69bf60SBram Moolenaar    res = true
15896d69bf60SBram Moolenaar  endif
15906d69bf60SBram Moolenaar  assert_equal(false, res)
15916d69bf60SBram Moolenaar
15926d69bf60SBram Moolenaar  res = false
15936d69bf60SBram Moolenaar  if false && false
15946d69bf60SBram Moolenaar    res = true
15956d69bf60SBram Moolenaar  endif
15966d69bf60SBram Moolenaar  assert_equal(false, res)
15976d69bf60SBram Moolenaar
15986d69bf60SBram Moolenaar  res = false
15996d69bf60SBram Moolenaar  if true || false
16006d69bf60SBram Moolenaar    res = true
16016d69bf60SBram Moolenaar  endif
16026d69bf60SBram Moolenaar  assert_equal(true, res)
16036d69bf60SBram Moolenaar
16046d69bf60SBram Moolenaar  res = false
16056d69bf60SBram Moolenaar  if g:bool_true || false
16066d69bf60SBram Moolenaar    res = true
16076d69bf60SBram Moolenaar  endif
16086d69bf60SBram Moolenaar  assert_equal(true, res)
16096d69bf60SBram Moolenaar
16106d69bf60SBram Moolenaar  res = false
16116d69bf60SBram Moolenaar  if true || g:bool_false
16126d69bf60SBram Moolenaar    res = true
16136d69bf60SBram Moolenaar  endif
16146d69bf60SBram Moolenaar  assert_equal(true, res)
16156d69bf60SBram Moolenaar
16166d69bf60SBram Moolenaar  res = false
16176d69bf60SBram Moolenaar  if false || false
16186d69bf60SBram Moolenaar    res = true
16196d69bf60SBram Moolenaar  endif
16206d69bf60SBram Moolenaar  assert_equal(false, res)
16213988f64fSBram Moolenaar
16223988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
16233988f64fSBram Moolenaar  if false | eval 0 | endif
16243988f64fSBram Moolenaar  if false | eval burp + 234 | endif
16253988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
16263988f64fSBram Moolenaar  if false
16273988f64fSBram Moolenaar    burp
16283988f64fSBram Moolenaar  endif
162980c34ca3SBram Moolenaarenddef
16306d69bf60SBram Moolenaar
163180c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1632d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1633d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1634d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1635d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
16366d69bf60SBram Moolenaarenddef
16376d69bf60SBram Moolenaar
163872abcf42SBram Moolenaardef RunNested(i: number): number
1639cfcd011fSBram Moolenaar  var x: number = 0
164072abcf42SBram Moolenaar  if i % 2
164172abcf42SBram Moolenaar    if 1
1642f5be8cdbSBram Moolenaar      # comment
164372abcf42SBram Moolenaar    else
1644f5be8cdbSBram Moolenaar      # comment
164572abcf42SBram Moolenaar    endif
164672abcf42SBram Moolenaar    x += 1
164772abcf42SBram Moolenaar  else
164872abcf42SBram Moolenaar    x += 1000
164972abcf42SBram Moolenaar  endif
165072abcf42SBram Moolenaar  return x
165172abcf42SBram Moolenaarenddef
165272abcf42SBram Moolenaar
165372abcf42SBram Moolenaardef Test_nested_if()
165472abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
165572abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
165672abcf42SBram Moolenaarenddef
165772abcf42SBram Moolenaar
1658ad39c094SBram Moolenaardef Test_execute_cmd()
1659ad39c094SBram Moolenaar  new
1660ad39c094SBram Moolenaar  setline(1, 'default')
1661d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1662ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1663a72cfb80SBram Moolenaar
1664d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1665a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1666a72cfb80SBram Moolenaar
1667cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
1668cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
1669a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1670ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1671a72cfb80SBram Moolenaar
1672d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
1673ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1674a72cfb80SBram Moolenaar
1675cfcd011fSBram Moolenaar  var cmd_first = 'call '
1676cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
1677ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1678ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1679ad39c094SBram Moolenaar  bwipe!
1680585fea7bSBram Moolenaar
1681cfcd011fSBram Moolenaar  var n = true
16822d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
16832d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
16842d6b20d6SBram Moolenaar
1685e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
1686e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
1687e5abf7afSBram Moolenaar
1688d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
1689d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1690d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
1691ad39c094SBram Moolenaarenddef
1692ad39c094SBram Moolenaar
169347e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1694f5be8cdbSBram Moolenaar  # only checks line continuation
1695cfcd011fSBram Moolenaar  var lines =<< trim END
169647e880d6SBram Moolenaar      vim9script
169747e880d6SBram Moolenaar      execute 'g:someVar'
169847e880d6SBram Moolenaar                .. ' = ' ..
169947e880d6SBram Moolenaar                   '28'
170047e880d6SBram Moolenaar      assert_equal(28, g:someVar)
170147e880d6SBram Moolenaar      unlet g:someVar
170247e880d6SBram Moolenaar  END
170347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
170447e880d6SBram Moolenaarenddef
170547e880d6SBram Moolenaar
1706ad39c094SBram Moolenaardef Test_echo_cmd()
1707a72cfb80SBram Moolenaar  echo 'some' # comment
1708585fea7bSBram Moolenaar  echon 'thing'
1709ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1710ad39c094SBram Moolenaar
1711a72cfb80SBram Moolenaar  echo "some" # comment
1712a72cfb80SBram Moolenaar  echon "thing"
1713a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1714a72cfb80SBram Moolenaar
1715cfcd011fSBram Moolenaar  var str1 = 'some'
1716cfcd011fSBram Moolenaar  var str2 = 'more'
1717ad39c094SBram Moolenaar  echo str1 str2
1718ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1719a72cfb80SBram Moolenaar
1720d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1721ad39c094SBram Moolenaarenddef
1722ad39c094SBram Moolenaar
1723f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1724f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1725f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1726f93c7feaSBram Moolenaar  echo 'clear'
1727df069eecSBram Moolenaar  :1messages
1728f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1729f93c7feaSBram Moolenaar
1730d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1731f93c7feaSBram Moolenaarenddef
1732f93c7feaSBram Moolenaar
173347e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1734f5be8cdbSBram Moolenaar  # only checks line continuation
1735cfcd011fSBram Moolenaar  var lines =<< trim END
173647e880d6SBram Moolenaar      vim9script
173747e880d6SBram Moolenaar      echomsg 'here'
173847e880d6SBram Moolenaar                .. ' is ' ..
173947e880d6SBram Moolenaar                   'a message'
174047e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
174147e880d6SBram Moolenaar  END
174247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
174347e880d6SBram Moolenaarenddef
174447e880d6SBram Moolenaar
1745f93c7feaSBram Moolenaardef Test_echoerr_cmd()
174640ee466cSBram Moolenaar  try
174740ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
174840ee466cSBram Moolenaar  catch
174940ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
175040ee466cSBram Moolenaar  endtry
1751f93c7feaSBram Moolenaarenddef
1752f93c7feaSBram Moolenaar
175347e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1754f5be8cdbSBram Moolenaar  # only checks line continuation
1755cfcd011fSBram Moolenaar  var lines =<< trim END
175647e880d6SBram Moolenaar      vim9script
175747e880d6SBram Moolenaar      try
175847e880d6SBram Moolenaar        echoerr 'this'
175947e880d6SBram Moolenaar                .. ' is ' ..
176047e880d6SBram Moolenaar                   'wrong'
176147e880d6SBram Moolenaar      catch
176247e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
176347e880d6SBram Moolenaar      endtry
176447e880d6SBram Moolenaar  END
176547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
176647e880d6SBram Moolenaarenddef
176747e880d6SBram Moolenaar
176841fe0617SBram Moolenaardef Test_for_outside_of_function()
1769cfcd011fSBram Moolenaar  var lines =<< trim END
177041fe0617SBram Moolenaar    vim9script
177141fe0617SBram Moolenaar    new
177241fe0617SBram Moolenaar    for var in range(0, 3)
177341fe0617SBram Moolenaar      append(line('$'), var)
177441fe0617SBram Moolenaar    endfor
177541fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
177641fe0617SBram Moolenaar    bwipe!
177741fe0617SBram Moolenaar  END
177841fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
177941fe0617SBram Moolenaar  source Xvim9for.vim
178041fe0617SBram Moolenaar  delete('Xvim9for.vim')
178141fe0617SBram Moolenaarenddef
17828a7d6542SBram Moolenaar
1783e8c4abbbSBram Moolenaardef Test_for_loop()
1784cfcd011fSBram Moolenaar  var result = ''
1785e8c4abbbSBram Moolenaar  for cnt in range(7)
1786e8c4abbbSBram Moolenaar    if cnt == 4
1787e8c4abbbSBram Moolenaar      break
1788e8c4abbbSBram Moolenaar    endif
1789e8c4abbbSBram Moolenaar    if cnt == 2
1790e8c4abbbSBram Moolenaar      continue
1791e8c4abbbSBram Moolenaar    endif
1792e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1793e8c4abbbSBram Moolenaar  endfor
1794e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
17950ad3e894SBram Moolenaar
1796cfcd011fSBram Moolenaar  var concat = ''
17970ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
17980ad3e894SBram Moolenaar    concat ..= str
17990ad3e894SBram Moolenaar  endfor
18000ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1801e8c4abbbSBram Moolenaarenddef
1802e8c4abbbSBram Moolenaar
1803e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1804675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1805675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1806cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
1807822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
1808451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
1809675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1810675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1811675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1812e8c4abbbSBram Moolenaarenddef
1813e8c4abbbSBram Moolenaar
1814d0df1aacSBram Moolenaardef Test_while_loop()
1815cfcd011fSBram Moolenaar  var result = ''
1816cfcd011fSBram Moolenaar  var cnt = 0
1817d0df1aacSBram Moolenaar  while cnt < 555
1818d0df1aacSBram Moolenaar    if cnt == 3
1819d0df1aacSBram Moolenaar      break
1820d0df1aacSBram Moolenaar    endif
1821d0df1aacSBram Moolenaar    cnt += 1
1822d0df1aacSBram Moolenaar    if cnt == 2
1823d0df1aacSBram Moolenaar      continue
1824d0df1aacSBram Moolenaar    endif
1825d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1826d0df1aacSBram Moolenaar  endwhile
1827d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1828d0df1aacSBram Moolenaarenddef
1829d0df1aacSBram Moolenaar
1830e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1831675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1832675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1833675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1834675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1835675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1836675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1837675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1838bd5da371SBram Moolenaarenddef
1839bd5da371SBram Moolenaar
18409645e2d9SBram Moolenaardef Test_interrupt_loop()
1841cfcd011fSBram Moolenaar  var caught = false
1842cfcd011fSBram Moolenaar  var x = 0
184397acfc78SBram Moolenaar  try
18449645e2d9SBram Moolenaar    while 1
18459645e2d9SBram Moolenaar      x += 1
18469645e2d9SBram Moolenaar      if x == 100
18479645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
18489645e2d9SBram Moolenaar      endif
18499645e2d9SBram Moolenaar    endwhile
185097acfc78SBram Moolenaar  catch
185197acfc78SBram Moolenaar    caught = true
185297acfc78SBram Moolenaar    assert_equal(100, x)
185397acfc78SBram Moolenaar  endtry
185497acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
185525859dd7SBram Moolenaar  # consume the CTRL-C
185625859dd7SBram Moolenaar  getchar(0)
18579645e2d9SBram Moolenaarenddef
185820431c9dSBram Moolenaar
18594fdae999SBram Moolenaardef Test_automatic_line_continuation()
1860cfcd011fSBram Moolenaar  var mylist = [
18614fdae999SBram Moolenaar      'one',
18624fdae999SBram Moolenaar      'two',
18634fdae999SBram Moolenaar      'three',
1864f5be8cdbSBram Moolenaar      ] # comment
18654fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
18664fdae999SBram Moolenaar
1867cfcd011fSBram Moolenaar  var mydict = {
18684fdae999SBram Moolenaar      'one': 1,
18694fdae999SBram Moolenaar      'two': 2,
18704fdae999SBram Moolenaar      'three':
18714fdae999SBram Moolenaar          3,
1872f5be8cdbSBram Moolenaar      } # comment
18734fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
18744fdae999SBram Moolenaar  mydict = #{
18752c330432SBram Moolenaar      one: 1,  # comment
18762c330432SBram Moolenaar      two:     # comment
18772c330432SBram Moolenaar           2,  # comment
18782c330432SBram Moolenaar      three: 3 # comment
18792c330432SBram Moolenaar      }
18802c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
18812c330432SBram Moolenaar  mydict = #{
18822c330432SBram Moolenaar      one: 1,
18834fdae999SBram Moolenaar      two:
18844fdae999SBram Moolenaar           2,
18852c330432SBram Moolenaar      three: 3
18864fdae999SBram Moolenaar      }
18874fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1888e6085c53SBram Moolenaar
1889e6085c53SBram Moolenaar  assert_equal(
1890e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1891e6085c53SBram Moolenaar        split('one two three')
1892e6085c53SBram Moolenaar        )
18934fdae999SBram Moolenaarenddef
18944fdae999SBram Moolenaar
18957a092245SBram Moolenaardef Test_vim9_comment()
18967a092245SBram Moolenaar  CheckScriptSuccess([
18977a092245SBram Moolenaar      'vim9script',
18987a092245SBram Moolenaar      '# something',
18997a092245SBram Moolenaar      ])
19007a092245SBram Moolenaar  CheckScriptFailure([
19017a092245SBram Moolenaar      'vim9script',
19027a092245SBram Moolenaar      ':# something',
19037a092245SBram Moolenaar      ], 'E488:')
19047a092245SBram Moolenaar  CheckScriptFailure([
19057a092245SBram Moolenaar      '# something',
19067a092245SBram Moolenaar      ], 'E488:')
19077a092245SBram Moolenaar  CheckScriptFailure([
19087a092245SBram Moolenaar      ':# something',
19097a092245SBram Moolenaar      ], 'E488:')
19107a092245SBram Moolenaar
19114a8d9f2eSBram Moolenaar  { # block start
19124a8d9f2eSBram Moolenaar  } # block end
19134a8d9f2eSBram Moolenaar  CheckDefFailure([
19144a8d9f2eSBram Moolenaar      '{# comment',
19154a8d9f2eSBram Moolenaar      ], 'E488:')
19164a8d9f2eSBram Moolenaar  CheckDefFailure([
19174a8d9f2eSBram Moolenaar      '{',
19184a8d9f2eSBram Moolenaar      '}# comment',
19194a8d9f2eSBram Moolenaar      ], 'E488:')
19204a8d9f2eSBram Moolenaar
19214a8d9f2eSBram Moolenaar  echo "yes" # comment
19224a8d9f2eSBram Moolenaar  CheckDefFailure([
19234a8d9f2eSBram Moolenaar      'echo "yes"# comment',
19244a8d9f2eSBram Moolenaar      ], 'E488:')
19257a092245SBram Moolenaar  CheckScriptSuccess([
19267a092245SBram Moolenaar      'vim9script',
19277a092245SBram Moolenaar      'echo "yes" # something',
19287a092245SBram Moolenaar      ])
19297a092245SBram Moolenaar  CheckScriptFailure([
19307a092245SBram Moolenaar      'vim9script',
19317a092245SBram Moolenaar      'echo "yes"# something',
19327a092245SBram Moolenaar      ], 'E121:')
19337a092245SBram Moolenaar  CheckScriptFailure([
19347a092245SBram Moolenaar      'vim9script',
19357a092245SBram Moolenaar      'echo# something',
19367a092245SBram Moolenaar      ], 'E121:')
19377a092245SBram Moolenaar  CheckScriptFailure([
19387a092245SBram Moolenaar      'echo "yes" # something',
19397a092245SBram Moolenaar      ], 'E121:')
19407a092245SBram Moolenaar
19414a8d9f2eSBram Moolenaar  exe "echo" # comment
19424a8d9f2eSBram Moolenaar  CheckDefFailure([
19434a8d9f2eSBram Moolenaar      'exe "echo"# comment',
19444a8d9f2eSBram Moolenaar      ], 'E488:')
19454a8d9f2eSBram Moolenaar  CheckScriptSuccess([
19464a8d9f2eSBram Moolenaar      'vim9script',
19474a8d9f2eSBram Moolenaar      'exe "echo" # something',
19484a8d9f2eSBram Moolenaar      ])
19494a8d9f2eSBram Moolenaar  CheckScriptFailure([
19504a8d9f2eSBram Moolenaar      'vim9script',
19514a8d9f2eSBram Moolenaar      'exe "echo"# something',
19524a8d9f2eSBram Moolenaar      ], 'E121:')
19534a8d9f2eSBram Moolenaar  CheckDefFailure([
19544a8d9f2eSBram Moolenaar      'exe # comment',
19554a8d9f2eSBram Moolenaar      ], 'E1015:')
19564a8d9f2eSBram Moolenaar  CheckScriptFailure([
19574a8d9f2eSBram Moolenaar      'vim9script',
19584a8d9f2eSBram Moolenaar      'exe# something',
19594a8d9f2eSBram Moolenaar      ], 'E121:')
19604a8d9f2eSBram Moolenaar  CheckScriptFailure([
19614a8d9f2eSBram Moolenaar      'exe "echo" # something',
19624a8d9f2eSBram Moolenaar      ], 'E121:')
19634a8d9f2eSBram Moolenaar
19647a092245SBram Moolenaar  CheckDefFailure([
19657a092245SBram Moolenaar      'try# comment',
19667a092245SBram Moolenaar      '  echo "yes"',
19677a092245SBram Moolenaar      'catch',
19687a092245SBram Moolenaar      'endtry',
19697a092245SBram Moolenaar      ], 'E488:')
19702c5ed4e3SBram Moolenaar  CheckScriptFailure([
19712c5ed4e3SBram Moolenaar      'vim9script',
19722c5ed4e3SBram Moolenaar      'try# comment',
19732c5ed4e3SBram Moolenaar      'echo "yes"',
19742c5ed4e3SBram Moolenaar      ], 'E488:')
19757a092245SBram Moolenaar  CheckDefFailure([
19767a092245SBram Moolenaar      'try',
1977a72cfb80SBram Moolenaar      '  throw#comment',
1978a72cfb80SBram Moolenaar      'catch',
1979a72cfb80SBram Moolenaar      'endtry',
1980a72cfb80SBram Moolenaar      ], 'E1015:')
1981a72cfb80SBram Moolenaar  CheckDefFailure([
1982a72cfb80SBram Moolenaar      'try',
1983a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1984a72cfb80SBram Moolenaar      'catch',
1985a72cfb80SBram Moolenaar      'endtry',
1986a72cfb80SBram Moolenaar      ], 'E488:')
1987a72cfb80SBram Moolenaar  CheckDefFailure([
1988a72cfb80SBram Moolenaar      'try',
19897a092245SBram Moolenaar      '  echo "yes"',
19907a092245SBram Moolenaar      'catch# comment',
19917a092245SBram Moolenaar      'endtry',
19927a092245SBram Moolenaar      ], 'E488:')
19932c5ed4e3SBram Moolenaar  CheckScriptFailure([
19942c5ed4e3SBram Moolenaar      'vim9script',
19952c5ed4e3SBram Moolenaar      'try',
19962c5ed4e3SBram Moolenaar      '  echo "yes"',
19972c5ed4e3SBram Moolenaar      'catch# comment',
19982c5ed4e3SBram Moolenaar      'endtry',
19992c5ed4e3SBram Moolenaar      ], 'E654:')
20002c5ed4e3SBram Moolenaar  CheckDefFailure([
20012c5ed4e3SBram Moolenaar      'try',
20022c5ed4e3SBram Moolenaar      '  echo "yes"',
20032c5ed4e3SBram Moolenaar      'catch /pat/# comment',
20042c5ed4e3SBram Moolenaar      'endtry',
20052c5ed4e3SBram Moolenaar      ], 'E488:')
20067a092245SBram Moolenaar  CheckDefFailure([
20077a092245SBram Moolenaar      'try',
20087a092245SBram Moolenaar      'echo "yes"',
20097a092245SBram Moolenaar      'catch',
20107a092245SBram Moolenaar      'endtry# comment',
20117a092245SBram Moolenaar      ], 'E488:')
20122c5ed4e3SBram Moolenaar  CheckScriptFailure([
20132c5ed4e3SBram Moolenaar      'vim9script',
20142c5ed4e3SBram Moolenaar      'try',
20152c5ed4e3SBram Moolenaar      '  echo "yes"',
20162c5ed4e3SBram Moolenaar      'catch',
20172c5ed4e3SBram Moolenaar      'endtry# comment',
20189b7bf9e9SBram Moolenaar      ], 'E488:')
20192c5ed4e3SBram Moolenaar
20202c5ed4e3SBram Moolenaar  CheckScriptSuccess([
20212c5ed4e3SBram Moolenaar      'vim9script',
20222c5ed4e3SBram Moolenaar      'hi # comment',
20232c5ed4e3SBram Moolenaar      ])
20242c5ed4e3SBram Moolenaar  CheckScriptFailure([
20252c5ed4e3SBram Moolenaar      'vim9script',
20262c5ed4e3SBram Moolenaar      'hi# comment',
20272c5ed4e3SBram Moolenaar      ], 'E416:')
20281966c248SBram Moolenaar  CheckScriptSuccess([
20291966c248SBram Moolenaar      'vim9script',
20301966c248SBram Moolenaar      'hi Search # comment',
20311966c248SBram Moolenaar      ])
20321966c248SBram Moolenaar  CheckScriptFailure([
20331966c248SBram Moolenaar      'vim9script',
20341966c248SBram Moolenaar      'hi Search# comment',
20351966c248SBram Moolenaar      ], 'E416:')
20361966c248SBram Moolenaar  CheckScriptSuccess([
20371966c248SBram Moolenaar      'vim9script',
20381966c248SBram Moolenaar      'hi link This Search # comment',
20391966c248SBram Moolenaar      ])
20401966c248SBram Moolenaar  CheckScriptFailure([
20411966c248SBram Moolenaar      'vim9script',
20421966c248SBram Moolenaar      'hi link This That# comment',
20431966c248SBram Moolenaar      ], 'E413:')
20441966c248SBram Moolenaar  CheckScriptSuccess([
20451966c248SBram Moolenaar      'vim9script',
20461966c248SBram Moolenaar      'hi clear This # comment',
20471966c248SBram Moolenaar      'hi clear # comment',
20481966c248SBram Moolenaar      ])
2049f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2050f5be8cdbSBram Moolenaar  # hi clear This# comment',
20511966c248SBram Moolenaar  CheckScriptFailure([
20521966c248SBram Moolenaar      'vim9script',
20531966c248SBram Moolenaar      'hi clear# comment',
20541966c248SBram Moolenaar      ], 'E416:')
20551966c248SBram Moolenaar
20561966c248SBram Moolenaar  CheckScriptSuccess([
20571966c248SBram Moolenaar      'vim9script',
20581966c248SBram Moolenaar      'hi Group term=bold',
20591966c248SBram Moolenaar      'match Group /todo/ # comment',
20601966c248SBram Moolenaar      ])
20611966c248SBram Moolenaar  CheckScriptFailure([
20621966c248SBram Moolenaar      'vim9script',
20631966c248SBram Moolenaar      'hi Group term=bold',
20641966c248SBram Moolenaar      'match Group /todo/# comment',
20651966c248SBram Moolenaar      ], 'E488:')
20661966c248SBram Moolenaar  CheckScriptSuccess([
20671966c248SBram Moolenaar      'vim9script',
20681966c248SBram Moolenaar      'match # comment',
20691966c248SBram Moolenaar      ])
20701966c248SBram Moolenaar  CheckScriptFailure([
20711966c248SBram Moolenaar      'vim9script',
20721966c248SBram Moolenaar      'match# comment',
20731966c248SBram Moolenaar      ], 'E475:')
20741966c248SBram Moolenaar  CheckScriptSuccess([
20751966c248SBram Moolenaar      'vim9script',
20761966c248SBram Moolenaar      'match none # comment',
20771966c248SBram Moolenaar      ])
20781966c248SBram Moolenaar  CheckScriptFailure([
20791966c248SBram Moolenaar      'vim9script',
20801966c248SBram Moolenaar      'match none# comment',
20811966c248SBram Moolenaar      ], 'E475:')
20821966c248SBram Moolenaar
20831966c248SBram Moolenaar  CheckScriptSuccess([
20841966c248SBram Moolenaar      'vim9script',
20851966c248SBram Moolenaar      'menutrans clear # comment',
20861966c248SBram Moolenaar      ])
20871966c248SBram Moolenaar  CheckScriptFailure([
20881966c248SBram Moolenaar      'vim9script',
20891966c248SBram Moolenaar      'menutrans clear# comment text',
20901966c248SBram Moolenaar      ], 'E474:')
20911966c248SBram Moolenaar
20921966c248SBram Moolenaar  CheckScriptSuccess([
20931966c248SBram Moolenaar      'vim9script',
20941966c248SBram Moolenaar      'syntax clear # comment',
20951966c248SBram Moolenaar      ])
20961966c248SBram Moolenaar  CheckScriptFailure([
20971966c248SBram Moolenaar      'vim9script',
20981966c248SBram Moolenaar      'syntax clear# comment text',
20991966c248SBram Moolenaar      ], 'E28:')
21001966c248SBram Moolenaar  CheckScriptSuccess([
21011966c248SBram Moolenaar      'vim9script',
21021966c248SBram Moolenaar      'syntax keyword Word some',
21031966c248SBram Moolenaar      'syntax clear Word # comment',
21041966c248SBram Moolenaar      ])
21051966c248SBram Moolenaar  CheckScriptFailure([
21061966c248SBram Moolenaar      'vim9script',
21071966c248SBram Moolenaar      'syntax keyword Word some',
21081966c248SBram Moolenaar      'syntax clear Word# comment text',
21091966c248SBram Moolenaar      ], 'E28:')
21101966c248SBram Moolenaar
21111966c248SBram Moolenaar  CheckScriptSuccess([
21121966c248SBram Moolenaar      'vim9script',
21131966c248SBram Moolenaar      'syntax list # comment',
21141966c248SBram Moolenaar      ])
21151966c248SBram Moolenaar  CheckScriptFailure([
21161966c248SBram Moolenaar      'vim9script',
21171966c248SBram Moolenaar      'syntax list# comment text',
21181966c248SBram Moolenaar      ], 'E28:')
21191966c248SBram Moolenaar
21201966c248SBram Moolenaar  CheckScriptSuccess([
21211966c248SBram Moolenaar      'vim9script',
21221966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
21231966c248SBram Moolenaar      ])
21241966c248SBram Moolenaar  CheckScriptFailure([
21251966c248SBram Moolenaar      'vim9script',
21261966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
21271966c248SBram Moolenaar      ], 'E475:')
21281966c248SBram Moolenaar
21291966c248SBram Moolenaar  CheckScriptSuccess([
21301966c248SBram Moolenaar      'vim9script',
21311966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
21321966c248SBram Moolenaar      ])
21331966c248SBram Moolenaar  CheckScriptFailure([
21341966c248SBram Moolenaar      'vim9script',
21351966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
21361966c248SBram Moolenaar      ], 'E789:')
21371966c248SBram Moolenaar
21381966c248SBram Moolenaar  CheckScriptSuccess([
21391966c248SBram Moolenaar      'vim9script',
21401966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
21411966c248SBram Moolenaar      ])
21421966c248SBram Moolenaar  CheckScriptFailure([
21431966c248SBram Moolenaar      'vim9script',
21441966c248SBram Moolenaar      'syntax match Word /pat/# comment',
21451966c248SBram Moolenaar      ], 'E402:')
21461966c248SBram Moolenaar
21471966c248SBram Moolenaar  CheckScriptSuccess([
21481966c248SBram Moolenaar      'vim9script',
21491966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
21501966c248SBram Moolenaar      ])
21511966c248SBram Moolenaar  CheckScriptFailure([
21521966c248SBram Moolenaar      'vim9script',
21531966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
21541966c248SBram Moolenaar      ], 'E475:')
21551966c248SBram Moolenaar  CheckScriptFailure([
21561966c248SBram Moolenaar      'vim9script',
21571966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
21581966c248SBram Moolenaar      ], 'E406:')
21591966c248SBram Moolenaar  CheckScriptFailure([
21601966c248SBram Moolenaar      'vim9script',
21611966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
21621966c248SBram Moolenaar      ], 'E475:')
21631966c248SBram Moolenaar
21641966c248SBram Moolenaar  CheckScriptSuccess([
21651966c248SBram Moolenaar      'vim9script',
21661966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
21671966c248SBram Moolenaar      ])
21681966c248SBram Moolenaar  CheckScriptFailure([
21691966c248SBram Moolenaar      'vim9script',
21701966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2171d032f34aSBram Moolenaar      ], 'E402:')
21721966c248SBram Moolenaar
21731966c248SBram Moolenaar  CheckScriptSuccess([
21741966c248SBram Moolenaar      'vim9script',
21751966c248SBram Moolenaar      'syntax sync # comment',
21761966c248SBram Moolenaar      ])
21771966c248SBram Moolenaar  CheckScriptFailure([
21781966c248SBram Moolenaar      'vim9script',
21791966c248SBram Moolenaar      'syntax sync# comment',
21801966c248SBram Moolenaar      ], 'E404:')
21811966c248SBram Moolenaar  CheckScriptSuccess([
21821966c248SBram Moolenaar      'vim9script',
21831966c248SBram Moolenaar      'syntax sync ccomment # comment',
21841966c248SBram Moolenaar      ])
21851966c248SBram Moolenaar  CheckScriptFailure([
21861966c248SBram Moolenaar      'vim9script',
21871966c248SBram Moolenaar      'syntax sync ccomment# comment',
21881966c248SBram Moolenaar      ], 'E404:')
21891966c248SBram Moolenaar
21901966c248SBram Moolenaar  CheckScriptSuccess([
21911966c248SBram Moolenaar      'vim9script',
21921966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
21931966c248SBram Moolenaar      ])
21941966c248SBram Moolenaar  CheckScriptFailure([
21951966c248SBram Moolenaar      'vim9script',
21961966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
21971966c248SBram Moolenaar      ], 'E475:')
2198a72cfb80SBram Moolenaar
2199a72cfb80SBram Moolenaar  CheckScriptSuccess([
2200a72cfb80SBram Moolenaar      'vim9script',
2201a72cfb80SBram Moolenaar      'command Echo echo # comment',
2202a72cfb80SBram Moolenaar      'command Echo # comment',
2203a72cfb80SBram Moolenaar      ])
2204a72cfb80SBram Moolenaar  CheckScriptFailure([
2205a72cfb80SBram Moolenaar      'vim9script',
2206a72cfb80SBram Moolenaar      'command Echo echo# comment',
2207a72cfb80SBram Moolenaar      'Echo',
2208a72cfb80SBram Moolenaar      ], 'E121:')
2209a72cfb80SBram Moolenaar  CheckScriptFailure([
2210a72cfb80SBram Moolenaar      'vim9script',
2211a72cfb80SBram Moolenaar      'command Echo# comment',
2212a72cfb80SBram Moolenaar      ], 'E182:')
2213a72cfb80SBram Moolenaar  CheckScriptFailure([
2214a72cfb80SBram Moolenaar      'vim9script',
2215a72cfb80SBram Moolenaar      'command Echo echo',
2216a72cfb80SBram Moolenaar      'command Echo# comment',
2217a72cfb80SBram Moolenaar      ], 'E182:')
2218a72cfb80SBram Moolenaar
2219a72cfb80SBram Moolenaar  CheckScriptSuccess([
2220a72cfb80SBram Moolenaar      'vim9script',
2221a72cfb80SBram Moolenaar      'function # comment',
2222a72cfb80SBram Moolenaar      ])
2223a72cfb80SBram Moolenaar  CheckScriptFailure([
2224a72cfb80SBram Moolenaar      'vim9script',
22259898107fSBram Moolenaar      'function " comment',
22269898107fSBram Moolenaar      ], 'E129:')
22279898107fSBram Moolenaar  CheckScriptFailure([
22289898107fSBram Moolenaar      'vim9script',
2229a72cfb80SBram Moolenaar      'function# comment',
2230a72cfb80SBram Moolenaar      ], 'E129:')
2231a72cfb80SBram Moolenaar  CheckScriptSuccess([
2232a72cfb80SBram Moolenaar      'vim9script',
2233a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2234a72cfb80SBram Moolenaar      ])
2235a72cfb80SBram Moolenaar  CheckScriptFailure([
2236a72cfb80SBram Moolenaar      'vim9script',
2237a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2238a72cfb80SBram Moolenaar      ], 'E488:')
2239a72cfb80SBram Moolenaar
2240a72cfb80SBram Moolenaar  CheckScriptSuccess([
2241a72cfb80SBram Moolenaar      'vim9script',
22424c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2243a72cfb80SBram Moolenaar      'endfunc',
22444c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2245a72cfb80SBram Moolenaar      ])
2246a72cfb80SBram Moolenaar  CheckScriptFailure([
2247a72cfb80SBram Moolenaar      'vim9script',
22484c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2249a72cfb80SBram Moolenaar      'endfunc',
22504c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2251a72cfb80SBram Moolenaar      ], 'E488:')
2252a72cfb80SBram Moolenaar
2253a72cfb80SBram Moolenaar  CheckScriptSuccess([
2254a72cfb80SBram Moolenaar      'vim9script',
2255a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2256a72cfb80SBram Moolenaar      ])
2257a72cfb80SBram Moolenaar  CheckScriptFailure([
2258a72cfb80SBram Moolenaar      'vim9script',
2259a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2260a72cfb80SBram Moolenaar      ], 'E488:')
2261e7e4838fSBram Moolenaar
2262e7e4838fSBram Moolenaar  CheckScriptFailure([
2263e7e4838fSBram Moolenaar      'def Test() " comment',
2264e7e4838fSBram Moolenaar      'enddef',
2265e7e4838fSBram Moolenaar      ], 'E488:')
2266e7e4838fSBram Moolenaar  CheckScriptFailure([
2267e7e4838fSBram Moolenaar      'vim9script',
2268e7e4838fSBram Moolenaar      'def Test() " comment',
2269e7e4838fSBram Moolenaar      'enddef',
2270e7e4838fSBram Moolenaar      ], 'E488:')
2271e7e4838fSBram Moolenaar
2272e7e4838fSBram Moolenaar  CheckScriptSuccess([
2273e7e4838fSBram Moolenaar      'func Test() " comment',
2274e7e4838fSBram Moolenaar      'endfunc',
2275e7e4838fSBram Moolenaar      ])
22769898107fSBram Moolenaar  CheckScriptSuccess([
2277e7e4838fSBram Moolenaar      'vim9script',
2278e7e4838fSBram Moolenaar      'func Test() " comment',
2279e7e4838fSBram Moolenaar      'endfunc',
22809898107fSBram Moolenaar      ])
2281e7e4838fSBram Moolenaar
2282e7e4838fSBram Moolenaar  CheckScriptSuccess([
2283e7e4838fSBram Moolenaar      'def Test() # comment',
2284e7e4838fSBram Moolenaar      'enddef',
2285e7e4838fSBram Moolenaar      ])
2286e7e4838fSBram Moolenaar  CheckScriptFailure([
2287e7e4838fSBram Moolenaar      'func Test() # comment',
2288e7e4838fSBram Moolenaar      'endfunc',
2289e7e4838fSBram Moolenaar      ], 'E488:')
22902c5ed4e3SBram Moolenaarenddef
22912c5ed4e3SBram Moolenaar
22922c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
22932c5ed4e3SBram Moolenaar  CheckCanRunGui
22942c5ed4e3SBram Moolenaar
22952c5ed4e3SBram Moolenaar  CheckScriptFailure([
22962c5ed4e3SBram Moolenaar      'vim9script',
22972c5ed4e3SBram Moolenaar      'gui#comment'
22982c5ed4e3SBram Moolenaar      ], 'E499:')
22992c5ed4e3SBram Moolenaar  CheckScriptFailure([
23002c5ed4e3SBram Moolenaar      'vim9script',
23012c5ed4e3SBram Moolenaar      'gui -f#comment'
23022c5ed4e3SBram Moolenaar      ], 'E499:')
23037a092245SBram Moolenaarenddef
23047a092245SBram Moolenaar
2305a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
23066797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
23076797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2308a26b9700SBram Moolenaar
2309a26b9700SBram Moolenaar  edit test.vim
2310a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2311a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2312a26b9700SBram Moolenaar
2313a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2314a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2315a26b9700SBram Moolenaar
2316a26b9700SBram Moolenaar  g:entered = 0
2317a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2318a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2319a26b9700SBram Moolenaar
2320a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2321a26b9700SBram Moolenaar
2322a26b9700SBram Moolenaar  au! TabEnter
2323a26b9700SBram Moolenaar  unlet g:entered
2324d72c1bf0SBram Moolenaar
2325d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2326d72c1bf0SBram Moolenaar      'vim9script',
23276797966dSBram Moolenaar      'g:var = 123',
2328e55b1c09SBram Moolenaar      'b:var = 456',
2329e55b1c09SBram Moolenaar      'w:var = 777',
2330e55b1c09SBram Moolenaar      't:var = 888',
2331d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2332d72c1bf0SBram Moolenaar      ])
2333d72c1bf0SBram Moolenaar
2334d72c1bf0SBram Moolenaar  CheckScriptFailure([
2335d72c1bf0SBram Moolenaar      'vim9script',
2336cfcd011fSBram Moolenaar      'let var = 123',
2337cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2338cfcd011fSBram Moolenaar
2339cfcd011fSBram Moolenaar  CheckScriptFailure([
2340cfcd011fSBram Moolenaar      'vim9script',
2341cfcd011fSBram Moolenaar      'var g:var = 123',
2342e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2343e55b1c09SBram Moolenaar
2344e55b1c09SBram Moolenaar  CheckScriptFailure([
2345e55b1c09SBram Moolenaar      'vim9script',
2346cfcd011fSBram Moolenaar      'var b:var = 123',
2347e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2348e55b1c09SBram Moolenaar
2349e55b1c09SBram Moolenaar  CheckScriptFailure([
2350e55b1c09SBram Moolenaar      'vim9script',
2351cfcd011fSBram Moolenaar      'var w:var = 123',
2352e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2353e55b1c09SBram Moolenaar
2354e55b1c09SBram Moolenaar  CheckScriptFailure([
2355e55b1c09SBram Moolenaar      'vim9script',
2356cfcd011fSBram Moolenaar      'var t:var = 123',
2357e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2358e55b1c09SBram Moolenaar
2359e55b1c09SBram Moolenaar  CheckScriptFailure([
2360e55b1c09SBram Moolenaar      'vim9script',
2361cfcd011fSBram Moolenaar      'var v:version = 123',
2362e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2363e55b1c09SBram Moolenaar
2364e55b1c09SBram Moolenaar  CheckScriptFailure([
2365e55b1c09SBram Moolenaar      'vim9script',
2366cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2367e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
23686797966dSBram Moolenaar
23696797966dSBram Moolenaar  CheckScriptFailure([
23706797966dSBram Moolenaar      'vim9script',
23716797966dSBram Moolenaar      'g:var = 123',
237232e35117SBram Moolenaar      'unlet g:var# comment1',
2373d72c1bf0SBram Moolenaar      ], 'E108:')
2374d72c1bf0SBram Moolenaar
2375d72c1bf0SBram Moolenaar  CheckScriptFailure([
2376d72c1bf0SBram Moolenaar      'let g:var = 123',
2377d72c1bf0SBram Moolenaar      'unlet g:var # something',
2378d72c1bf0SBram Moolenaar      ], 'E488:')
2379faac4104SBram Moolenaar
2380faac4104SBram Moolenaar  CheckScriptSuccess([
2381faac4104SBram Moolenaar      'vim9script',
238232e35117SBram Moolenaar      'if 1 # comment2',
2383faac4104SBram Moolenaar      '  echo "yes"',
2384faac4104SBram Moolenaar      'elseif 2 #comment',
2385faac4104SBram Moolenaar      '  echo "no"',
2386faac4104SBram Moolenaar      'endif',
2387faac4104SBram Moolenaar      ])
2388faac4104SBram Moolenaar
2389faac4104SBram Moolenaar  CheckScriptFailure([
2390faac4104SBram Moolenaar      'vim9script',
239132e35117SBram Moolenaar      'if 1# comment3',
2392faac4104SBram Moolenaar      '  echo "yes"',
2393faac4104SBram Moolenaar      'endif',
2394faac4104SBram Moolenaar      ], 'E15:')
2395faac4104SBram Moolenaar
2396faac4104SBram Moolenaar  CheckScriptFailure([
2397faac4104SBram Moolenaar      'vim9script',
239832e35117SBram Moolenaar      'if 0 # comment4',
2399faac4104SBram Moolenaar      '  echo "yes"',
2400faac4104SBram Moolenaar      'elseif 2#comment',
2401faac4104SBram Moolenaar      '  echo "no"',
2402faac4104SBram Moolenaar      'endif',
2403faac4104SBram Moolenaar      ], 'E15:')
2404faac4104SBram Moolenaar
2405faac4104SBram Moolenaar  CheckScriptSuccess([
2406faac4104SBram Moolenaar      'vim9script',
2407cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2408faac4104SBram Moolenaar      ])
2409faac4104SBram Moolenaar
2410faac4104SBram Moolenaar  CheckScriptFailure([
2411faac4104SBram Moolenaar      'vim9script',
2412cfcd011fSBram Moolenaar      'var v = 1# comment6',
241332e35117SBram Moolenaar      ], 'E15:')
2414faac4104SBram Moolenaar
2415faac4104SBram Moolenaar  CheckScriptSuccess([
2416faac4104SBram Moolenaar      'vim9script',
2417faac4104SBram Moolenaar      'new'
2418d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2419df069eecSBram Moolenaar      ':$',
2420faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2421faac4104SBram Moolenaar      'bwipe!',
2422faac4104SBram Moolenaar      ])
2423faac4104SBram Moolenaar
2424f5be8cdbSBram Moolenaar  CheckScriptFailure([
2425f5be8cdbSBram Moolenaar      'vim9script',
2426f5be8cdbSBram Moolenaar      'new'
2427d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2428f5be8cdbSBram Moolenaar      ':$',
2429f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2430f5be8cdbSBram Moolenaar      'bwipe!',
2431f5be8cdbSBram Moolenaar      ], 'E488:')
2432f5be8cdbSBram Moolenaar
2433f5be8cdbSBram Moolenaar  CheckScriptFailure([
2434f5be8cdbSBram Moolenaar      'vim9script',
2435f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2436f5be8cdbSBram Moolenaar      ], 'E477:')
2437a26b9700SBram Moolenaarenddef
2438a26b9700SBram Moolenaar
24397e5bd91dSBram Moolenaardef Test_finish()
2440cfcd011fSBram Moolenaar  var lines =<< trim END
24417e5bd91dSBram Moolenaar    vim9script
24426797966dSBram Moolenaar    g:res = 'one'
24437e5bd91dSBram Moolenaar    if v:false | finish | endif
24446797966dSBram Moolenaar    g:res = 'two'
24457e5bd91dSBram Moolenaar    finish
24466797966dSBram Moolenaar    g:res = 'three'
24477e5bd91dSBram Moolenaar  END
24487e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
24497e5bd91dSBram Moolenaar  source Xfinished
24507e5bd91dSBram Moolenaar  assert_equal('two', g:res)
24517e5bd91dSBram Moolenaar
24527e5bd91dSBram Moolenaar  unlet g:res
24537e5bd91dSBram Moolenaar  delete('Xfinished')
24547e5bd91dSBram Moolenaarenddef
24557e5bd91dSBram Moolenaar
2456a5d0077eSBram Moolenaardef Test_forward_declaration()
2457cfcd011fSBram Moolenaar  var lines =<< trim END
2458a5d0077eSBram Moolenaar    vim9script
2459a5d0077eSBram Moolenaar    def GetValue(): string
2460a5d0077eSBram Moolenaar      return theVal
2461a5d0077eSBram Moolenaar    enddef
2462cfcd011fSBram Moolenaar    var theVal = 'something'
2463822ba247SBram Moolenaar    g:initVal = GetValue()
2464a5d0077eSBram Moolenaar    theVal = 'else'
2465a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2466a5d0077eSBram Moolenaar  END
2467a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2468a5d0077eSBram Moolenaar  source Xforward
2469a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2470a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2471a5d0077eSBram Moolenaar
2472a5d0077eSBram Moolenaar  unlet g:initVal
2473a5d0077eSBram Moolenaar  unlet g:laterVal
2474a5d0077eSBram Moolenaar  delete('Xforward')
2475a5d0077eSBram Moolenaarenddef
2476a5d0077eSBram Moolenaar
24779721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
2478cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
24799721fb4eSBram Moolenaar    source Xvim9_script.vim
24809721fb4eSBram Moolenaar
24819721fb4eSBram Moolenaar    call assert_false(exists('local'))
24829721fb4eSBram Moolenaar    call assert_false(exists('exported'))
24839721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
24849721fb4eSBram Moolenaar    call assert_equal('global', global)
24859721fb4eSBram Moolenaar    call assert_equal('global', g:global)
24869721fb4eSBram Moolenaar
24879721fb4eSBram Moolenaar    " imported variable becomes script-local
24889721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
24899721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
24909721fb4eSBram Moolenaar    call assert_false(exists('exported'))
24919721fb4eSBram Moolenaar
24929721fb4eSBram Moolenaar    " imported function becomes script-local
24939721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
24949721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
24959721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
24969721fb4eSBram Moolenaar  END
24979721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
24989721fb4eSBram Moolenaar
2499cfcd011fSBram Moolenaar  var vim9_lines =<< trim END
25009721fb4eSBram Moolenaar    vim9script
2501cfcd011fSBram Moolenaar    var local = 'local'
25029721fb4eSBram Moolenaar    g:global = 'global'
2503cfcd011fSBram Moolenaar    export var exported = 'exported'
25049721fb4eSBram Moolenaar    export def GetText(): string
25059721fb4eSBram Moolenaar       return 'text'
25069721fb4eSBram Moolenaar    enddef
25079721fb4eSBram Moolenaar  END
25089721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
25099721fb4eSBram Moolenaar
25109721fb4eSBram Moolenaar  source Xlegacy_script.vim
25119721fb4eSBram Moolenaar
25129721fb4eSBram Moolenaar  assert_equal('global', g:global)
2513f5be8cdbSBram Moolenaar  unlet g:global
25149721fb4eSBram Moolenaar
25159721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
25169721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
25179721fb4eSBram Moolenaarenddef
2518a5d0077eSBram Moolenaar
25197d699701SBram Moolenaarfunc Test_vim9script_not_global()
25207d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
25217d699701SBram Moolenaar  let vim9lines =<< trim END
25227d699701SBram Moolenaar    vim9script
2523cfcd011fSBram Moolenaar    var name = 'local'
25247d699701SBram Moolenaar    func TheFunc()
25257d699701SBram Moolenaar      echo 'local'
25267d699701SBram Moolenaar    endfunc
25277d699701SBram Moolenaar    def DefFunc()
25287d699701SBram Moolenaar      echo 'local'
25297d699701SBram Moolenaar    enddef
25307d699701SBram Moolenaar  END
25317d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
25327d699701SBram Moolenaar  source Xvim9script.vim
25337d699701SBram Moolenaar  try
25347d699701SBram Moolenaar    echo g:var
25357d699701SBram Moolenaar    assert_report('did not fail')
25367d699701SBram Moolenaar  catch /E121:/
25377d699701SBram Moolenaar    " caught
25387d699701SBram Moolenaar  endtry
25397d699701SBram Moolenaar  try
25407d699701SBram Moolenaar    call TheFunc()
25417d699701SBram Moolenaar    assert_report('did not fail')
25427d699701SBram Moolenaar  catch /E117:/
25437d699701SBram Moolenaar    " caught
25447d699701SBram Moolenaar  endtry
25457d699701SBram Moolenaar  try
25467d699701SBram Moolenaar    call DefFunc()
25477d699701SBram Moolenaar    assert_report('did not fail')
25487d699701SBram Moolenaar  catch /E117:/
25497d699701SBram Moolenaar    " caught
25507d699701SBram Moolenaar  endtry
25517d699701SBram Moolenaar
255225859dd7SBram Moolenaar  call delete('Xvim9script.vim')
25537d699701SBram Moolenaarendfunc
25547d699701SBram Moolenaar
2555eeb27bfeSBram Moolenaardef Test_vim9_copen()
2556eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2557eeb27bfeSBram Moolenaar  copen
2558eeb27bfeSBram Moolenaar  quit
2559eeb27bfeSBram Moolenaarenddef
2560eeb27bfeSBram Moolenaar
25612d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
25622d6b20d6SBram Moolenaardef Test_vim9_autoload()
2563cfcd011fSBram Moolenaar  var lines =<< trim END
25642d6b20d6SBram Moolenaar     vim9script
25652d6b20d6SBram Moolenaar     def foo#test()
25662d6b20d6SBram Moolenaar         echomsg getreg('"')
25672d6b20d6SBram Moolenaar     enddef
25682d6b20d6SBram Moolenaar  END
25692d6b20d6SBram Moolenaar
25702d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
25712d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
2572cfcd011fSBram Moolenaar  var save_rtp = &rtp
25732d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
25742d6b20d6SBram Moolenaar  augroup test
25752d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
25762d6b20d6SBram Moolenaar  augroup END
25772d6b20d6SBram Moolenaar
25782d6b20d6SBram Moolenaar  normal Y
25792d6b20d6SBram Moolenaar
25802d6b20d6SBram Moolenaar  augroup test
25812d6b20d6SBram Moolenaar    autocmd!
25822d6b20d6SBram Moolenaar  augroup END
25832d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
25842d6b20d6SBram Moolenaar  &rtp = save_rtp
25852d6b20d6SBram Moolenaarenddef
25862d6b20d6SBram Moolenaar
258777e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
258877e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
2589cfcd011fSBram Moolenaar  var lines =<< trim END
259077e5dcc3SBram Moolenaar      vim9script
259177e5dcc3SBram Moolenaar      def crash#func()
259277e5dcc3SBram Moolenaar          try
259377e5dcc3SBram Moolenaar              for x in List()
259477e5dcc3SBram Moolenaar              endfor
259577e5dcc3SBram Moolenaar          catch
259677e5dcc3SBram Moolenaar          endtry
259777e5dcc3SBram Moolenaar          g:ok = true
259877e5dcc3SBram Moolenaar      enddef
259977e5dcc3SBram Moolenaar      fu List()
260077e5dcc3SBram Moolenaar          invalid
260177e5dcc3SBram Moolenaar      endfu
260277e5dcc3SBram Moolenaar      try
260377e5dcc3SBram Moolenaar          invalid
260477e5dcc3SBram Moolenaar      catch /wontmatch/
260577e5dcc3SBram Moolenaar      endtry
260677e5dcc3SBram Moolenaar  END
260777e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
260877e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
260977e5dcc3SBram Moolenaar
261077e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
261177e5dcc3SBram Moolenaar  lines =<< trim END
261277e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
261377e5dcc3SBram Moolenaar    call crash#func()
261477e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
26159c4f5520SBram Moolenaar    qall!
261677e5dcc3SBram Moolenaar  END
261777e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
261877e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
261977e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
262077e5dcc3SBram Moolenaar
262177e5dcc3SBram Moolenaar  delete('Xdidit')
262277e5dcc3SBram Moolenaar  delete('Xscript')
262377e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
262477e5dcc3SBram Moolenaarenddef
262577e5dcc3SBram Moolenaar
262681e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
262781e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
262881e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
2629cfcd011fSBram Moolenaar  var lines =<< trim END
263081e17fbeSBram Moolenaar    let s:counter = 1
263181e17fbeSBram Moolenaar    def s:Func()
263281e17fbeSBram Moolenaar      au! CursorHold
263381e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
263481e17fbeSBram Moolenaar    enddef
263581e17fbeSBram Moolenaar    call s:Func()
263681e17fbeSBram Moolenaar    doau CursorHold
263781e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
263881e17fbeSBram Moolenaar    au! CursorHold
263981e17fbeSBram Moolenaar  END
264081e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
264181e17fbeSBram Moolenaarenddef
264281e17fbeSBram Moolenaar
26433896a105SBram Moolenaardef Test_cmdline_win()
26443896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
26453896a105SBram Moolenaar  # the command line window.
26463896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
2647cfcd011fSBram Moolenaar  var export_lines =<< trim END
26483896a105SBram Moolenaar    vim9script
2649cfcd011fSBram Moolenaar    export var That = 'yes'
26503896a105SBram Moolenaar  END
26513896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
2652cfcd011fSBram Moolenaar  var import_lines =<< trim END
26533896a105SBram Moolenaar    vim9script
26543896a105SBram Moolenaar    import That from './Xexport.vim'
26553896a105SBram Moolenaar  END
26563896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
2657cfcd011fSBram Moolenaar  var save_rtp = &rtp
26583896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
26593896a105SBram Moolenaar  syntax on
26603896a105SBram Moolenaar  augroup CmdWin
26613896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
26623896a105SBram Moolenaar  augroup END
26633896a105SBram Moolenaar  # this will open and also close the cmdline window
26643896a105SBram Moolenaar  feedkeys('q:', 'xt')
26653896a105SBram Moolenaar  assert_equal('yes', g:got_there)
26663896a105SBram Moolenaar
26673896a105SBram Moolenaar  augroup CmdWin
26683896a105SBram Moolenaar    au!
26693896a105SBram Moolenaar  augroup END
26703896a105SBram Moolenaar  &rtp = save_rtp
26713896a105SBram Moolenaar  delete('rtp', 'rf')
26723896a105SBram Moolenaarenddef
26733896a105SBram Moolenaar
2674e3d4685fSBram Moolenaardef Test_invalid_sid()
2675e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
267625859dd7SBram Moolenaar
26779c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
2678d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
2679e3d4685fSBram Moolenaar  endif
2680e3d4685fSBram Moolenaar  delete('Xdidit')
2681e3d4685fSBram Moolenaarenddef
2682e3d4685fSBram Moolenaar
2683f0afd9e1SBram Moolenaardef Test_unset_any_variable()
2684cfcd011fSBram Moolenaar  var lines =<< trim END
2685cfcd011fSBram Moolenaar    var name: any
2686cfcd011fSBram Moolenaar    assert_equal(0, name)
2687f0afd9e1SBram Moolenaar  END
2688f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2689f0afd9e1SBram Moolenaarenddef
2690f0afd9e1SBram Moolenaar
26917e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
269258dbef33SBram Moolenaar  CheckRunVimInTerminal
269358dbef33SBram Moolenaar
26947e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
26957e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
26967e9210eaSBram Moolenaarendfunc
26977e9210eaSBram Moolenaar
26987e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
26999c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
2700cfcd011fSBram Moolenaar  var lines =<< trim END
27019c4f5520SBram Moolenaar    func CheckAndQuit()
27029c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
27039c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
27049c4f5520SBram Moolenaar    endfunc
27059c4f5520SBram Moolenaar  END
27069c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
27079c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
2708cfcd011fSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', #{rows: 6})
27099c4f5520SBram Moolenaar  # define Afunc() on the command line
27109c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
27119c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
27129c4f5520SBram Moolenaar  WaitForAssert({-> assert_equal(['errors: []'], readfile('Xdidcmd'))})
27139c4f5520SBram Moolenaar
27149c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
27159c4f5520SBram Moolenaar  delete('XcallFunc')
27169c4f5520SBram Moolenaar  delete('Xdidcmd')
27179c4f5520SBram Moolenaarenddef
27189c4f5520SBram Moolenaar
2719fcdc5d83SBram Moolenaardef Test_script_var_scope()
2720fcdc5d83SBram Moolenaar  var lines =<< trim END
2721fcdc5d83SBram Moolenaar      vim9script
2722fcdc5d83SBram Moolenaar      if true
2723fcdc5d83SBram Moolenaar        if true
2724fcdc5d83SBram Moolenaar          var one = 'one'
2725fcdc5d83SBram Moolenaar          echo one
2726fcdc5d83SBram Moolenaar        endif
2727fcdc5d83SBram Moolenaar        echo one
2728fcdc5d83SBram Moolenaar      endif
2729fcdc5d83SBram Moolenaar  END
2730fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
2731fcdc5d83SBram Moolenaar
2732fcdc5d83SBram Moolenaar  lines =<< trim END
2733fcdc5d83SBram Moolenaar      vim9script
2734fcdc5d83SBram Moolenaar      if true
2735fcdc5d83SBram Moolenaar        if false
2736fcdc5d83SBram Moolenaar          var one = 'one'
2737fcdc5d83SBram Moolenaar          echo one
2738fcdc5d83SBram Moolenaar        else
2739fcdc5d83SBram Moolenaar          var one = 'one'
2740fcdc5d83SBram Moolenaar          echo one
2741fcdc5d83SBram Moolenaar        endif
2742fcdc5d83SBram Moolenaar        echo one
2743fcdc5d83SBram Moolenaar      endif
2744fcdc5d83SBram Moolenaar  END
2745fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
2746fcdc5d83SBram Moolenaar
2747fcdc5d83SBram Moolenaar  lines =<< trim END
2748fcdc5d83SBram Moolenaar      vim9script
2749fcdc5d83SBram Moolenaar      while true
2750fcdc5d83SBram Moolenaar        var one = 'one'
2751fcdc5d83SBram Moolenaar        echo one
2752fcdc5d83SBram Moolenaar        break
2753fcdc5d83SBram Moolenaar      endwhile
2754fcdc5d83SBram Moolenaar      echo one
2755fcdc5d83SBram Moolenaar  END
2756fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
2757fcdc5d83SBram Moolenaar
2758fcdc5d83SBram Moolenaar  lines =<< trim END
2759fcdc5d83SBram Moolenaar      vim9script
2760fcdc5d83SBram Moolenaar      for i in range(1)
2761fcdc5d83SBram Moolenaar        var one = 'one'
2762fcdc5d83SBram Moolenaar        echo one
2763fcdc5d83SBram Moolenaar      endfor
2764fcdc5d83SBram Moolenaar      echo one
2765fcdc5d83SBram Moolenaar  END
2766fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
27679becdf2bSBram Moolenaar
27689becdf2bSBram Moolenaar  lines =<< trim END
27699becdf2bSBram Moolenaar      vim9script
27709becdf2bSBram Moolenaar      {
27719becdf2bSBram Moolenaar        var one = 'one'
27729becdf2bSBram Moolenaar        assert_equal('one', one)
27739becdf2bSBram Moolenaar      }
27749becdf2bSBram Moolenaar      assert_false(exists('one'))
27759becdf2bSBram Moolenaar      assert_false(exists('s:one'))
27769becdf2bSBram Moolenaar  END
27779becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
27789becdf2bSBram Moolenaar
27799becdf2bSBram Moolenaar  lines =<< trim END
27809becdf2bSBram Moolenaar      vim9script
27819becdf2bSBram Moolenaar      {
27829becdf2bSBram Moolenaar        var one = 'one'
27839becdf2bSBram Moolenaar        echo one
27849becdf2bSBram Moolenaar      }
27859becdf2bSBram Moolenaar      echo one
27869becdf2bSBram Moolenaar  END
27879becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
2788fcdc5d83SBram Moolenaarenddef
2789fcdc5d83SBram Moolenaar
2790585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2791585fea7bSBram Moolenaardef Test_substitute_cmd()
2792585fea7bSBram Moolenaar  new
2793585fea7bSBram Moolenaar  setline(1, 'something')
2794585fea7bSBram Moolenaar  :substitute(some(other(
2795585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2796585fea7bSBram Moolenaar  bwipe!
2797585fea7bSBram Moolenaar
2798f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2799cfcd011fSBram Moolenaar  var lines =<< trim END
2800585fea7bSBram Moolenaar    vim9script
2801585fea7bSBram Moolenaar    new
2802585fea7bSBram Moolenaar    setline(1, 'something')
2803585fea7bSBram Moolenaar    :substitute(some(other(
2804585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2805585fea7bSBram Moolenaar    bwipe!
2806585fea7bSBram Moolenaar  END
2807585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2808585fea7bSBram Moolenaar  source Xvim9lines
2809585fea7bSBram Moolenaar
2810585fea7bSBram Moolenaar  delete('Xvim9lines')
2811585fea7bSBram Moolenaarenddef
2812585fea7bSBram Moolenaar
28138a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2814