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))
25b8554304SBram Moolenaar
26b8554304SBram Moolenaar  # missing command does not print the line
27b8554304SBram Moolenaar  var lines =<< trim END
28b8554304SBram Moolenaar    vim9script
29b8554304SBram Moolenaar    :1|
30b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
31b8554304SBram Moolenaar    :|
32b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
33b8554304SBram Moolenaar  END
34b8554304SBram Moolenaar  CheckScriptSuccess(lines)
35b8554304SBram Moolenaar
36c2af0affSBram Moolenaar  bwipe!
37025cb1caSBram Moolenaar
38025cb1caSBram Moolenaar  # won't generate anything
39025cb1caSBram Moolenaar  if false
40025cb1caSBram Moolenaar    :123
41025cb1caSBram Moolenaar  endif
425d72ce69SBram Moolenaarenddef
435d72ce69SBram Moolenaar
44a6e67e4fSBram Moolenaarlet g:alist = [7]
45a6e67e4fSBram Moolenaarlet g:astring = 'text'
46f0b9f43cSBram Moolenaarlet g:anumber = 123
476e587dcbSBram Moolenaar
484c17ad94SBram Moolenaardef Test_delfunction()
49f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
504c17ad94SBram Moolenaar  CheckScriptSuccess([
514c17ad94SBram Moolenaar      'vim9script',
524c17ad94SBram Moolenaar      'func CheckMe()',
534c17ad94SBram Moolenaar      '  return 123',
544c17ad94SBram Moolenaar      'endfunc',
554c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
564c17ad94SBram Moolenaar      ])
574c17ad94SBram Moolenaar
58f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
594c17ad94SBram Moolenaar  CheckScriptFailure([
604c17ad94SBram Moolenaar      'vim9script',
614c17ad94SBram Moolenaar      'func DeleteMe1()',
624c17ad94SBram Moolenaar      'endfunc',
634c17ad94SBram Moolenaar      'delfunction DeleteMe1',
644c17ad94SBram Moolenaar      ], 'E1084:')
654c17ad94SBram Moolenaar  CheckScriptFailure([
664c17ad94SBram Moolenaar      'vim9script',
674c17ad94SBram Moolenaar      'func DeleteMe2()',
684c17ad94SBram Moolenaar      'endfunc',
694c17ad94SBram Moolenaar      'def DoThat()',
704c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
714c17ad94SBram Moolenaar      'enddef',
724c17ad94SBram Moolenaar      'DoThat()',
734c17ad94SBram Moolenaar      ], 'E1084:')
744c17ad94SBram Moolenaar  CheckScriptFailure([
754c17ad94SBram Moolenaar      'vim9script',
764c17ad94SBram Moolenaar      'def DeleteMe3()',
774c17ad94SBram Moolenaar      'enddef',
784c17ad94SBram Moolenaar      'delfunction DeleteMe3',
794c17ad94SBram Moolenaar      ], 'E1084:')
804c17ad94SBram Moolenaar  CheckScriptFailure([
814c17ad94SBram Moolenaar      'vim9script',
824c17ad94SBram Moolenaar      'def DeleteMe4()',
834c17ad94SBram Moolenaar      'enddef',
844c17ad94SBram Moolenaar      'def DoThat()',
854c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
864c17ad94SBram Moolenaar      'enddef',
874c17ad94SBram Moolenaar      'DoThat()',
884c17ad94SBram Moolenaar      ], 'E1084:')
89925e9fd6SBram Moolenaar
90925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
91cfcd011fSBram Moolenaar  var lines =<< trim END
92925e9fd6SBram Moolenaar      vim9script
93925e9fd6SBram Moolenaar      def g:Global(): string
94925e9fd6SBram Moolenaar        return "yes"
95925e9fd6SBram Moolenaar      enddef
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 function can be replaced by a :def function and deleted
107925e9fd6SBram Moolenaar  lines =<< trim END
108925e9fd6SBram Moolenaar      vim9script
109925e9fd6SBram Moolenaar      func g:Global()
110925e9fd6SBram Moolenaar        return "yes"
111925e9fd6SBram Moolenaar      endfunc
112925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
113925e9fd6SBram Moolenaar      def! g:Global(): string
114925e9fd6SBram Moolenaar        return "no"
115925e9fd6SBram Moolenaar      enddef
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)
121925e9fd6SBram Moolenaar
122925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
123925e9fd6SBram Moolenaar  lines =<< trim END
124925e9fd6SBram Moolenaar      vim9script
125925e9fd6SBram Moolenaar      def g:Global(): string
126925e9fd6SBram Moolenaar        return "yes"
127925e9fd6SBram Moolenaar      enddef
128925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
129925e9fd6SBram Moolenaar      func! g:Global()
130925e9fd6SBram Moolenaar        return "no"
131925e9fd6SBram Moolenaar      endfunc
132925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
133925e9fd6SBram Moolenaar      delfunc g:Global
134925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
135925e9fd6SBram Moolenaar  END
136925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1374c17ad94SBram Moolenaarenddef
1384c17ad94SBram Moolenaar
13908052228SBram Moolenaardef Test_wrong_type()
140cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
143cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
144599c89c8SBram Moolenaar
145cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
146cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
14742a480bfSBram Moolenaar
148cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
149cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
150cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
151cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
152cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
153cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
154cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
155cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
156cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
157cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
158cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
159a0a9f43aSBram Moolenaar
160cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
161cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
16208052228SBram Moolenaarenddef
1638a7d6542SBram Moolenaar
16410c65860SBram Moolenaardef Test_script_wrong_type()
16510c65860SBram Moolenaar  var lines =<< trim END
16610c65860SBram Moolenaar      vim9script
16710c65860SBram Moolenaar      var s:dict: dict<string>
16810c65860SBram Moolenaar      s:dict['a'] = ['x']
16910c65860SBram Moolenaar  END
17010c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
17110c65860SBram Moolenaarenddef
17210c65860SBram Moolenaar
17308052228SBram Moolenaardef Test_const()
174cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
175cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
176cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
17730fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
17830fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
179dbeecb2bSBram Moolenaar
180cfcd011fSBram Moolenaar  var lines =<< trim END
18130fd8204SBram Moolenaar    final list = [1, 2, 3]
182dbeecb2bSBram Moolenaar    list[0] = 4
1830b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
18430fd8204SBram Moolenaar    const other = [5, 6, 7]
1850b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
18671abe482SBram Moolenaar
187cfcd011fSBram Moolenaar    var varlist = [7, 8]
18830fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
18971abe482SBram Moolenaar    varlist[0] = 77
19071abe482SBram Moolenaar    # TODO: does not work yet
19171abe482SBram Moolenaar    # constlist[1][1] = 88
192cfcd011fSBram Moolenaar    var cl = constlist[1]
19371abe482SBram Moolenaar    cl[1] = 88
19471abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
19571abe482SBram Moolenaar
196e0de171eSBram Moolenaar    var vardict = {five: 5, six: 6}
197e0de171eSBram Moolenaar    const constdict = {one: 1, two: vardict, three: 3}
19871abe482SBram Moolenaar    vardict['five'] = 55
19971abe482SBram Moolenaar    # TODO: does not work yet
20071abe482SBram Moolenaar    # constdict['two']['six'] = 66
201cfcd011fSBram Moolenaar    var cd = constdict['two']
20271abe482SBram Moolenaar    cd['six'] = 66
203e0de171eSBram Moolenaar    constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
204dbeecb2bSBram Moolenaar  END
205dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
20608052228SBram Moolenaarenddef
2078a7d6542SBram Moolenaar
2080b4c66c6SBram Moolenaardef Test_const_bang()
209cfcd011fSBram Moolenaar  var lines =<< trim END
21030fd8204SBram Moolenaar      const var = 234
2110b4c66c6SBram Moolenaar      var = 99
2120b4c66c6SBram Moolenaar  END
2130b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
2140b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
2150b4c66c6SBram Moolenaar
2160b4c66c6SBram Moolenaar  lines =<< trim END
21730fd8204SBram Moolenaar      const ll = [2, 3, 4]
2180b4c66c6SBram Moolenaar      ll[0] = 99
2190b4c66c6SBram Moolenaar  END
2200b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2210b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2220b4c66c6SBram Moolenaar
2230b4c66c6SBram Moolenaar  lines =<< trim END
22430fd8204SBram Moolenaar      const ll = [2, 3, 4]
2250b4c66c6SBram Moolenaar      ll[3] = 99
2260b4c66c6SBram Moolenaar  END
2270b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2280b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2290b4c66c6SBram Moolenaar
2300b4c66c6SBram Moolenaar  lines =<< trim END
231e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2320b4c66c6SBram Moolenaar      dd["one"] = 99
2330b4c66c6SBram Moolenaar  END
2340b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2350b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2360b4c66c6SBram Moolenaar
2370b4c66c6SBram Moolenaar  lines =<< trim END
238e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2390b4c66c6SBram Moolenaar      dd["three"] = 99
2400b4c66c6SBram Moolenaar  END
2410b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2420b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2430b4c66c6SBram Moolenaarenddef
2440b4c66c6SBram Moolenaar
245df069eecSBram Moolenaardef Test_range_no_colon()
246d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
247d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
248d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
249d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
250df069eecSBram Moolenaarenddef
251df069eecSBram Moolenaar
252df069eecSBram Moolenaar
2538a7d6542SBram Moolenaardef Test_block()
254cfcd011fSBram Moolenaar  var outer = 1
2558a7d6542SBram Moolenaar  {
256cfcd011fSBram Moolenaar    var inner = 2
2578a7d6542SBram Moolenaar    assert_equal(1, outer)
2588a7d6542SBram Moolenaar    assert_equal(2, inner)
2598a7d6542SBram Moolenaar  }
2608a7d6542SBram Moolenaar  assert_equal(1, outer)
2618a7d6542SBram Moolenaarenddef
2628a7d6542SBram Moolenaar
26308052228SBram Moolenaardef Test_block_failure()
264cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
26508052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
26608052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
26708052228SBram Moolenaarenddef
2688a7d6542SBram Moolenaar
269fbbcd003SBram Moolenaardef Test_block_local_vars()
270fbbcd003SBram Moolenaar  var lines =<< trim END
271fbbcd003SBram Moolenaar      vim9script
272ed234f24SBram Moolenaar      v:testing = 1
273fbbcd003SBram Moolenaar      if true
274ed234f24SBram Moolenaar        var text = ['hello']
275ed234f24SBram Moolenaar        def SayHello(): list<string>
276fbbcd003SBram Moolenaar          return text
277fbbcd003SBram Moolenaar        enddef
278fbbcd003SBram Moolenaar        def SetText(v: string)
279ed234f24SBram Moolenaar          text = [v]
280fbbcd003SBram Moolenaar        enddef
281fbbcd003SBram Moolenaar      endif
282fbbcd003SBram Moolenaar
283fbbcd003SBram Moolenaar      if true
284ed234f24SBram Moolenaar        var text = ['again']
285ed234f24SBram Moolenaar        def SayAgain(): list<string>
286fbbcd003SBram Moolenaar          return text
287fbbcd003SBram Moolenaar        enddef
288fbbcd003SBram Moolenaar      endif
289ed234f24SBram Moolenaar
290ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
291ed234f24SBram Moolenaar      test_garbagecollect_now()
292ed234f24SBram Moolenaar
293fbbcd003SBram Moolenaar      defcompile
294fbbcd003SBram Moolenaar
295ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
296ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
297fbbcd003SBram Moolenaar
298fbbcd003SBram Moolenaar      SetText('foobar')
299ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
300ed234f24SBram Moolenaar
301ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
302ed234f24SBram Moolenaar      qall!
303fbbcd003SBram Moolenaar  END
304ed234f24SBram Moolenaar
305ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
306ed234f24SBram Moolenaar  # context gets garbage collected.
307ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
308ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
309ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
310ed234f24SBram Moolenaar
311ed234f24SBram Moolenaar  delete('Xscript')
312ed234f24SBram Moolenaar  delete('Xdidit')
313fbbcd003SBram Moolenaarenddef
314fbbcd003SBram Moolenaar
31539ca4127SBram Moolenaardef Test_block_local_vars_with_func()
31639ca4127SBram Moolenaar  var lines =<< trim END
31739ca4127SBram Moolenaar      vim9script
31839ca4127SBram Moolenaar      if true
31939ca4127SBram Moolenaar        var foo = 'foo'
32039ca4127SBram Moolenaar        if true
32139ca4127SBram Moolenaar          var bar = 'bar'
32239ca4127SBram Moolenaar          def Func(): list<string>
32339ca4127SBram Moolenaar            return [foo, bar]
32439ca4127SBram Moolenaar          enddef
32539ca4127SBram Moolenaar        endif
32639ca4127SBram Moolenaar      endif
32739ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
32839ca4127SBram Moolenaar      # "foo" and "bar"
32939ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
33039ca4127SBram Moolenaar  END
33139ca4127SBram Moolenaar  CheckScriptSuccess(lines)
33239ca4127SBram Moolenaarenddef
33339ca4127SBram Moolenaar
334d032f34aSBram Moolenaarfunc g:NoSuchFunc()
335d032f34aSBram Moolenaar  echo 'none'
336d032f34aSBram Moolenaarendfunc
337d032f34aSBram Moolenaar
3389e1d9e34SBram Moolenaardef Test_try_catch_throw()
339cfcd011fSBram Moolenaar  var l = []
3407a092245SBram Moolenaar  try # comment
3418a7d6542SBram Moolenaar    add(l, '1')
3428a7d6542SBram Moolenaar    throw 'wrong'
3438a7d6542SBram Moolenaar    add(l, '2')
3447a092245SBram Moolenaar  catch # comment
3458a7d6542SBram Moolenaar    add(l, v:exception)
3467a092245SBram Moolenaar  finally # comment
3478a7d6542SBram Moolenaar    add(l, '3')
3487a092245SBram Moolenaar  endtry # comment
3498a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
35068d130c6SBram Moolenaar
351e859312eSBram Moolenaar  l = []
352e859312eSBram Moolenaar  try
353e859312eSBram Moolenaar    try
354e859312eSBram Moolenaar      add(l, '1')
355e859312eSBram Moolenaar      throw 'wrong'
356e859312eSBram Moolenaar      add(l, '2')
357e859312eSBram Moolenaar    catch /right/
358e859312eSBram Moolenaar      add(l, v:exception)
359e859312eSBram Moolenaar    endtry
360e859312eSBram Moolenaar  catch /wrong/
361e859312eSBram Moolenaar    add(l, 'caught')
362373863edSBram Moolenaar  fina
363e859312eSBram Moolenaar    add(l, 'finally')
364e859312eSBram Moolenaar  endtry
365e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
366e859312eSBram Moolenaar
367cfcd011fSBram Moolenaar  var n: number
36868d130c6SBram Moolenaar  try
36968d130c6SBram Moolenaar    n = l[3]
37068d130c6SBram Moolenaar  catch /E684:/
37168d130c6SBram Moolenaar    n = 99
37268d130c6SBram Moolenaar  endtry
37368d130c6SBram Moolenaar  assert_equal(99, n)
37468d130c6SBram Moolenaar
37569f7050cSBram Moolenaar  var done = 'no'
37669f7050cSBram Moolenaar  if 0
37769f7050cSBram Moolenaar    try | catch | endtry
37869f7050cSBram Moolenaar  else
37969f7050cSBram Moolenaar    done = 'yes'
38069f7050cSBram Moolenaar  endif
38169f7050cSBram Moolenaar  assert_equal('yes', done)
38269f7050cSBram Moolenaar
38369f7050cSBram Moolenaar  done = 'no'
38469f7050cSBram Moolenaar  if 1
38569f7050cSBram Moolenaar    done = 'yes'
38669f7050cSBram Moolenaar  else
38769f7050cSBram Moolenaar    try | catch | endtry
38869f7050cSBram Moolenaar    done = 'never'
38969f7050cSBram Moolenaar  endif
39069f7050cSBram Moolenaar  assert_equal('yes', done)
39169f7050cSBram Moolenaar
39269f7050cSBram Moolenaar  if 1
39369f7050cSBram Moolenaar  else
39469f7050cSBram Moolenaar    try | catch /pat/ | endtry
39569f7050cSBram Moolenaar    try | catch /pat/
39669f7050cSBram Moolenaar    endtry
39769f7050cSBram Moolenaar    try
39869f7050cSBram Moolenaar    catch /pat/ | endtry
39969f7050cSBram Moolenaar    try
40069f7050cSBram Moolenaar    catch /pat/
40169f7050cSBram Moolenaar    endtry
40269f7050cSBram Moolenaar  endif
40369f7050cSBram Moolenaar
40468d130c6SBram Moolenaar  try
405cc673e74SBram Moolenaar    # string slice returns a string, not a number
40668d130c6SBram Moolenaar    n = g:astring[3]
4075e654230SBram Moolenaar  catch /E1012:/
40868d130c6SBram Moolenaar    n = 77
40968d130c6SBram Moolenaar  endtry
41068d130c6SBram Moolenaar  assert_equal(77, n)
41168d130c6SBram Moolenaar
41268d130c6SBram Moolenaar  try
41368d130c6SBram Moolenaar    n = l[g:astring]
4145e654230SBram Moolenaar  catch /E1012:/
41556acb094SBram Moolenaar    n = 88
41668d130c6SBram Moolenaar  endtry
41756acb094SBram Moolenaar  assert_equal(88, n)
41868d130c6SBram Moolenaar
41968d130c6SBram Moolenaar  try
42068d130c6SBram Moolenaar    n = s:does_not_exist
42168d130c6SBram Moolenaar  catch /E121:/
422f0b9f43cSBram Moolenaar    n = 111
423f0b9f43cSBram Moolenaar  endtry
424f0b9f43cSBram Moolenaar  assert_equal(111, n)
425f0b9f43cSBram Moolenaar
426f0b9f43cSBram Moolenaar  try
427f0b9f43cSBram Moolenaar    n = g:does_not_exist
428f0b9f43cSBram Moolenaar  catch /E121:/
42968d130c6SBram Moolenaar    n = 121
43068d130c6SBram Moolenaar  endtry
43168d130c6SBram Moolenaar  assert_equal(121, n)
43268d130c6SBram Moolenaar
433e0de171eSBram Moolenaar  var d = {one: 1}
43468d130c6SBram Moolenaar  try
43568d130c6SBram Moolenaar    n = d[g:astring]
43668d130c6SBram Moolenaar  catch /E716:/
43768d130c6SBram Moolenaar    n = 222
43868d130c6SBram Moolenaar  endtry
43968d130c6SBram Moolenaar  assert_equal(222, n)
440f0b9f43cSBram Moolenaar
441f0b9f43cSBram Moolenaar  try
442f0b9f43cSBram Moolenaar    n = -g:astring
443f0b9f43cSBram Moolenaar  catch /E39:/
444f0b9f43cSBram Moolenaar    n = 233
445f0b9f43cSBram Moolenaar  endtry
446f0b9f43cSBram Moolenaar  assert_equal(233, n)
447f0b9f43cSBram Moolenaar
448f0b9f43cSBram Moolenaar  try
449f0b9f43cSBram Moolenaar    n = +g:astring
450f0b9f43cSBram Moolenaar  catch /E1030:/
451f0b9f43cSBram Moolenaar    n = 244
452f0b9f43cSBram Moolenaar  endtry
453f0b9f43cSBram Moolenaar  assert_equal(244, n)
454f0b9f43cSBram Moolenaar
455f0b9f43cSBram Moolenaar  try
456f0b9f43cSBram Moolenaar    n = +g:alist
457f0b9f43cSBram Moolenaar  catch /E745:/
458f0b9f43cSBram Moolenaar    n = 255
459f0b9f43cSBram Moolenaar  endtry
460f0b9f43cSBram Moolenaar  assert_equal(255, n)
461f0b9f43cSBram Moolenaar
462cfcd011fSBram Moolenaar  var nd: dict<any>
463f0b9f43cSBram Moolenaar  try
4642e5910bfSBram Moolenaar    nd = {[g:alist]: 1}
4652e5910bfSBram Moolenaar  catch /E1105:/
466f0b9f43cSBram Moolenaar    n = 266
467f0b9f43cSBram Moolenaar  endtry
468f0b9f43cSBram Moolenaar  assert_equal(266, n)
469f0b9f43cSBram Moolenaar
470f0b9f43cSBram Moolenaar  try
471f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
472f0b9f43cSBram Moolenaar  catch /E1093:/
473f0b9f43cSBram Moolenaar    n = 277
474f0b9f43cSBram Moolenaar  endtry
475f0b9f43cSBram Moolenaar  assert_equal(277, n)
476f0b9f43cSBram Moolenaar
477e859312eSBram Moolenaar  try
478e859312eSBram Moolenaar    &ts = g:astring
4795e654230SBram Moolenaar  catch /E1012:/
480e859312eSBram Moolenaar    n = 288
481e859312eSBram Moolenaar  endtry
482e859312eSBram Moolenaar  assert_equal(288, n)
483e859312eSBram Moolenaar
484e859312eSBram Moolenaar  try
485e859312eSBram Moolenaar    &backspace = 'asdf'
486e859312eSBram Moolenaar  catch /E474:/
487e859312eSBram Moolenaar    n = 299
488e859312eSBram Moolenaar  endtry
489e859312eSBram Moolenaar  assert_equal(299, n)
490e859312eSBram Moolenaar
491e859312eSBram Moolenaar  l = [1]
492e859312eSBram Moolenaar  try
493e859312eSBram Moolenaar    l[3] = 3
494e859312eSBram Moolenaar  catch /E684:/
495e859312eSBram Moolenaar    n = 300
496e859312eSBram Moolenaar  endtry
497e859312eSBram Moolenaar  assert_equal(300, n)
498e859312eSBram Moolenaar
499e859312eSBram Moolenaar  try
500e859312eSBram Moolenaar    unlet g:does_not_exist
501e859312eSBram Moolenaar  catch /E108:/
502e859312eSBram Moolenaar    n = 322
503e859312eSBram Moolenaar  endtry
504e859312eSBram Moolenaar  assert_equal(322, n)
505e859312eSBram Moolenaar
506e859312eSBram Moolenaar  try
5072bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
508e859312eSBram Moolenaar  catch /E721:/
509e859312eSBram Moolenaar    n = 333
510e859312eSBram Moolenaar  endtry
511e859312eSBram Moolenaar  assert_equal(333, n)
512e859312eSBram Moolenaar
513e859312eSBram Moolenaar  try
514e859312eSBram Moolenaar    l = DeletedFunc()
515e859312eSBram Moolenaar  catch /E933:/
516e859312eSBram Moolenaar    n = 344
517e859312eSBram Moolenaar  endtry
518e859312eSBram Moolenaar  assert_equal(344, n)
519d032f34aSBram Moolenaar
520d032f34aSBram Moolenaar  try
521d032f34aSBram Moolenaar    echo len(v:true)
522d032f34aSBram Moolenaar  catch /E701:/
523d032f34aSBram Moolenaar    n = 355
524d032f34aSBram Moolenaar  endtry
525d032f34aSBram Moolenaar  assert_equal(355, n)
526d032f34aSBram Moolenaar
527cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
528d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
529d032f34aSBram Moolenaar  try
530d032f34aSBram Moolenaar    echo P()
531d032f34aSBram Moolenaar  catch /E117:/
532d032f34aSBram Moolenaar    n = 366
533d032f34aSBram Moolenaar  endtry
534d032f34aSBram Moolenaar  assert_equal(366, n)
535d032f34aSBram Moolenaar
536d032f34aSBram Moolenaar  try
537d032f34aSBram Moolenaar    echo g:NoSuchFunc()
538d032f34aSBram Moolenaar  catch /E117:/
539d032f34aSBram Moolenaar    n = 377
540d032f34aSBram Moolenaar  endtry
541d032f34aSBram Moolenaar  assert_equal(377, n)
542d032f34aSBram Moolenaar
543d032f34aSBram Moolenaar  try
544d032f34aSBram Moolenaar    echo g:alist + 4
545d032f34aSBram Moolenaar  catch /E745:/
546d032f34aSBram Moolenaar    n = 388
547d032f34aSBram Moolenaar  endtry
548d032f34aSBram Moolenaar  assert_equal(388, n)
549d032f34aSBram Moolenaar
550d032f34aSBram Moolenaar  try
551d032f34aSBram Moolenaar    echo 4 + g:alist
552d032f34aSBram Moolenaar  catch /E745:/
553d032f34aSBram Moolenaar    n = 399
554d032f34aSBram Moolenaar  endtry
555d032f34aSBram Moolenaar  assert_equal(399, n)
556d032f34aSBram Moolenaar
557d032f34aSBram Moolenaar  try
558d032f34aSBram Moolenaar    echo g:alist.member
559d032f34aSBram Moolenaar  catch /E715:/
560d032f34aSBram Moolenaar    n = 400
561d032f34aSBram Moolenaar  endtry
562d032f34aSBram Moolenaar  assert_equal(400, n)
563d032f34aSBram Moolenaar
564d032f34aSBram Moolenaar  try
565d032f34aSBram Moolenaar    echo d.member
566d032f34aSBram Moolenaar  catch /E716:/
567d032f34aSBram Moolenaar    n = 411
568d032f34aSBram Moolenaar  endtry
569d032f34aSBram Moolenaar  assert_equal(411, n)
570d9d7789bSBram Moolenaar
571d9d7789bSBram Moolenaar  var counter = 0
572d9d7789bSBram Moolenaar  for i in range(4)
573d9d7789bSBram Moolenaar    try
574d9d7789bSBram Moolenaar      eval [][0]
575d9d7789bSBram Moolenaar    catch
576d9d7789bSBram Moolenaar    endtry
577d9d7789bSBram Moolenaar    counter += 1
578d9d7789bSBram Moolenaar  endfor
579d9d7789bSBram Moolenaar  assert_equal(4, counter)
5807e82c5f3SBram Moolenaar
5817e82c5f3SBram Moolenaar  # return in finally after empty catch
5827e82c5f3SBram Moolenaar  def ReturnInFinally(): number
5837e82c5f3SBram Moolenaar    try
5847e82c5f3SBram Moolenaar    finally
5857e82c5f3SBram Moolenaar      return 4
5867e82c5f3SBram Moolenaar    endtry
5877e82c5f3SBram Moolenaar    return 2
5887e82c5f3SBram Moolenaar  enddef
5897e82c5f3SBram Moolenaar  assert_equal(4, ReturnInFinally())
5908a7d6542SBram Moolenaarenddef
5918a7d6542SBram Moolenaar
5929cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
5939cb577a6SBram Moolenaar  # return in try block returns normally
5949cb577a6SBram Moolenaar  def ReturnInTry(): string
5959cb577a6SBram Moolenaar    try
5969cb577a6SBram Moolenaar      return '"some message"'
5979cb577a6SBram Moolenaar    catch
5989cb577a6SBram Moolenaar    endtry
5999cb577a6SBram Moolenaar    return 'not reached'
6009cb577a6SBram Moolenaar  enddef
6019cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
6029cb577a6SBram Moolenaarenddef
6039cb577a6SBram Moolenaar
6041430ceebSBram Moolenaardef Test_cnext_works_in_catch()
6051430ceebSBram Moolenaar  var lines =<< trim END
6061430ceebSBram Moolenaar      vim9script
6071430ceebSBram Moolenaar      au BufEnter * eval 0
6081430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
6091430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
6101430ceebSBram Moolenaar      var items = [
6111430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
6121430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
6131430ceebSBram Moolenaar        ]
6141430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
6151430ceebSBram Moolenaar      cwindow
6161430ceebSBram Moolenaar
6171430ceebSBram Moolenaar      def CnextOrCfirst()
6181430ceebSBram Moolenaar        # if cnext fails, cfirst is used
6191430ceebSBram Moolenaar        try
6201430ceebSBram Moolenaar          cnext
6211430ceebSBram Moolenaar        catch
6221430ceebSBram Moolenaar          cfirst
6231430ceebSBram Moolenaar        endtry
6241430ceebSBram Moolenaar      enddef
6251430ceebSBram Moolenaar
6261430ceebSBram Moolenaar      CnextOrCfirst()
6271430ceebSBram Moolenaar      CnextOrCfirst()
6281430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
6291430ceebSBram Moolenaar      qall
6301430ceebSBram Moolenaar  END
6311430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
6321430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
6331430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
6341430ceebSBram Moolenaar
6351430ceebSBram Moolenaar  delete('Xfile1')
6361430ceebSBram Moolenaar  delete('Xfile2')
6371430ceebSBram Moolenaar  delete('XCatchCnext')
6381430ceebSBram Moolenaar  delete('Xresult')
6391430ceebSBram Moolenaarenddef
6401430ceebSBram Moolenaar
6419e1d9e34SBram Moolenaardef Test_throw_skipped()
6429e1d9e34SBram Moolenaar  if 0
6439e1d9e34SBram Moolenaar    throw dontgethere
6449e1d9e34SBram Moolenaar  endif
6459e1d9e34SBram Moolenaarenddef
6469e1d9e34SBram Moolenaar
6478f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
6488f81b22eSBram Moolenaar  var lines =<< trim END
6498f81b22eSBram Moolenaar    vim9script
6508f81b22eSBram Moolenaar    def Func()
6518f81b22eSBram Moolenaar      throw 'error'
6528f81b22eSBram Moolenaar    enddef
6538f81b22eSBram Moolenaar    silent! Func()
6548f81b22eSBram Moolenaar  END
6558f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
6568f81b22eSBram Moolenaar  source XthrowSilenced
6578f81b22eSBram Moolenaar  delete('XthrowSilenced')
6588f81b22eSBram Moolenaarenddef
6598f81b22eSBram Moolenaar
660e859312eSBram Moolenaardef DeletedFunc(): list<any>
661e859312eSBram Moolenaar  return ['delete me']
662e859312eSBram Moolenaarenddef
663e859312eSBram Moolenaardefcompile
664e859312eSBram Moolenaardelfunc DeletedFunc
665e859312eSBram Moolenaar
666257cc5eeSBram Moolenaardef ThrowFromDef()
667a72cfb80SBram Moolenaar  throw "getout" # comment
668257cc5eeSBram Moolenaarenddef
669257cc5eeSBram Moolenaar
670257cc5eeSBram Moolenaarfunc CatchInFunc()
671257cc5eeSBram Moolenaar  try
672257cc5eeSBram Moolenaar    call ThrowFromDef()
673257cc5eeSBram Moolenaar  catch
674257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
675257cc5eeSBram Moolenaar  endtry
676257cc5eeSBram Moolenaarendfunc
677257cc5eeSBram Moolenaar
678257cc5eeSBram Moolenaardef CatchInDef()
679257cc5eeSBram Moolenaar  try
680257cc5eeSBram Moolenaar    ThrowFromDef()
681257cc5eeSBram Moolenaar  catch
682257cc5eeSBram Moolenaar    g:thrown_def = v:exception
683257cc5eeSBram Moolenaar  endtry
684257cc5eeSBram Moolenaarenddef
685257cc5eeSBram Moolenaar
686f575adffSBram Moolenaardef ReturnFinally(): string
687f575adffSBram Moolenaar  try
688f575adffSBram Moolenaar    return 'intry'
689373863edSBram Moolenaar  finall
690f575adffSBram Moolenaar    g:in_finally = 'finally'
691f575adffSBram Moolenaar  endtry
692f575adffSBram Moolenaar  return 'end'
693f575adffSBram Moolenaarenddef
694f575adffSBram Moolenaar
695257cc5eeSBram Moolenaardef Test_try_catch_nested()
696257cc5eeSBram Moolenaar  CatchInFunc()
697257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
698257cc5eeSBram Moolenaar
699257cc5eeSBram Moolenaar  CatchInDef()
700257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
701f575adffSBram Moolenaar
702f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
703f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
704f575adffSBram Moolenaarenddef
705f575adffSBram Moolenaar
7069939f57bSBram Moolenaardef TryOne(): number
7079939f57bSBram Moolenaar  try
7089939f57bSBram Moolenaar    return 0
7099939f57bSBram Moolenaar  catch
7109939f57bSBram Moolenaar  endtry
7119939f57bSBram Moolenaar  return 0
7129939f57bSBram Moolenaarenddef
7139939f57bSBram Moolenaar
7149939f57bSBram Moolenaardef TryTwo(n: number): string
7159939f57bSBram Moolenaar  try
716cfcd011fSBram Moolenaar    var x = {}
7179939f57bSBram Moolenaar  catch
7189939f57bSBram Moolenaar  endtry
7199939f57bSBram Moolenaar  return 'text'
7209939f57bSBram Moolenaarenddef
7219939f57bSBram Moolenaar
7229939f57bSBram Moolenaardef Test_try_catch_twice()
7239939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
7249939f57bSBram Moolenaarenddef
7259939f57bSBram Moolenaar
726f575adffSBram Moolenaardef Test_try_catch_match()
727cfcd011fSBram Moolenaar  var seq = 'a'
728f575adffSBram Moolenaar  try
729f575adffSBram Moolenaar    throw 'something'
730f575adffSBram Moolenaar  catch /nothing/
731f575adffSBram Moolenaar    seq ..= 'x'
732f575adffSBram Moolenaar  catch /some/
733f575adffSBram Moolenaar    seq ..= 'b'
734f575adffSBram Moolenaar  catch /asdf/
735f575adffSBram Moolenaar    seq ..= 'x'
736e8c4abbbSBram Moolenaar  catch ?a\?sdf?
737e8c4abbbSBram Moolenaar    seq ..= 'y'
738f575adffSBram Moolenaar  finally
739f575adffSBram Moolenaar    seq ..= 'c'
740f575adffSBram Moolenaar  endtry
741f575adffSBram Moolenaar  assert_equal('abc', seq)
742257cc5eeSBram Moolenaarenddef
743257cc5eeSBram Moolenaar
744e8c4abbbSBram Moolenaardef Test_try_catch_fails()
745d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
746d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
747d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
748d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
749d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
750d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
751d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
752d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
75313106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
754d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
755585fea7bSBram Moolenaar
756e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
757d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
758e8c4abbbSBram Moolenaarenddef
759e8c4abbbSBram Moolenaar
7607c5b3c03SBram Moolenaardef Try_catch_skipped()
7617c5b3c03SBram Moolenaar  var l = []
7627c5b3c03SBram Moolenaar  try
7637c5b3c03SBram Moolenaar  finally
7647c5b3c03SBram Moolenaar  endtry
7657c5b3c03SBram Moolenaar
7667c5b3c03SBram Moolenaar  if 1
7677c5b3c03SBram Moolenaar  else
7687c5b3c03SBram Moolenaar    try
7697c5b3c03SBram Moolenaar    endtry
7707c5b3c03SBram Moolenaar  endif
7717c5b3c03SBram Moolenaarenddef
7727c5b3c03SBram Moolenaar
7737c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
7747c5b3c03SBram Moolenaardef Test_try_catch_skipped()
7757c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
7767c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
7777c5b3c03SBram Moolenaarenddef
7787c5b3c03SBram Moolenaar
7797c5b3c03SBram Moolenaar
7807c5b3c03SBram Moolenaar
781006ad48bSBram Moolenaardef Test_throw_vimscript()
782f5be8cdbSBram Moolenaar  # only checks line continuation
783cfcd011fSBram Moolenaar  var lines =<< trim END
784006ad48bSBram Moolenaar      vim9script
785006ad48bSBram Moolenaar      try
786006ad48bSBram Moolenaar        throw 'one'
787006ad48bSBram Moolenaar              .. 'two'
788006ad48bSBram Moolenaar      catch
789006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
790006ad48bSBram Moolenaar      endtry
791006ad48bSBram Moolenaar  END
792006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
7931e021e63SBram Moolenaar
7941e021e63SBram Moolenaar  lines =<< trim END
7951e021e63SBram Moolenaar    vim9script
796352134bbSBram Moolenaar    @r = ''
7971e021e63SBram Moolenaar    def Func()
7981e021e63SBram Moolenaar      throw @r
7991e021e63SBram Moolenaar    enddef
8001e021e63SBram Moolenaar    var result = ''
8011e021e63SBram Moolenaar    try
8021e021e63SBram Moolenaar      Func()
8031e021e63SBram Moolenaar    catch /E1129:/
8041e021e63SBram Moolenaar      result = 'caught'
8051e021e63SBram Moolenaar    endtry
8061e021e63SBram Moolenaar    assert_equal('caught', result)
8071e021e63SBram Moolenaar  END
8081e021e63SBram Moolenaar  CheckScriptSuccess(lines)
809006ad48bSBram Moolenaarenddef
810006ad48bSBram Moolenaar
811ed677f55SBram Moolenaardef Test_error_in_nested_function()
81203dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
813cfcd011fSBram Moolenaar  var lines =<< trim END
814ed677f55SBram Moolenaar      vim9script
815ed677f55SBram Moolenaar      def Func()
816ed677f55SBram Moolenaar        Error()
817ed677f55SBram Moolenaar        g:test_var = 1
818ed677f55SBram Moolenaar      enddef
819ed677f55SBram Moolenaar      func Error() abort
820ed677f55SBram Moolenaar        eval [][0]
821ed677f55SBram Moolenaar      endfunc
822ed677f55SBram Moolenaar      Func()
823ed677f55SBram Moolenaar  END
824ed677f55SBram Moolenaar  g:test_var = 0
825ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
826ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
827ed677f55SBram Moolenaarenddef
828ed677f55SBram Moolenaar
82937c83711SBram Moolenaardef Test_cexpr_vimscript()
830f5be8cdbSBram Moolenaar  # only checks line continuation
83137c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
832cfcd011fSBram Moolenaar  var lines =<< trim END
83337c83711SBram Moolenaar      vim9script
83437c83711SBram Moolenaar      cexpr 'File'
83537c83711SBram Moolenaar                .. ' someFile' ..
83637c83711SBram Moolenaar                   ' line 19'
83737c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
83837c83711SBram Moolenaar  END
83937c83711SBram Moolenaar  CheckScriptSuccess(lines)
84037c83711SBram Moolenaar  set errorformat&
84137c83711SBram Moolenaarenddef
84237c83711SBram Moolenaar
843c9edd6b5SBram Moolenaardef Test_statusline_syntax()
844c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
845cfcd011fSBram Moolenaar  var lines =<< trim END
846c9edd6b5SBram Moolenaar      vim9script
847c9edd6b5SBram Moolenaar      func g:Status()
848c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
849c9edd6b5SBram Moolenaar      endfunc
850c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
851c9edd6b5SBram Moolenaar      redrawstatus
852c9edd6b5SBram Moolenaar      set laststatus statusline=
853c9edd6b5SBram Moolenaar  END
854c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
855c9edd6b5SBram Moolenaarenddef
856c9edd6b5SBram Moolenaar
857b209750bSBram Moolenaardef Test_list_vimscript()
858b209750bSBram Moolenaar  # checks line continuation and comments
859cfcd011fSBram Moolenaar  var lines =<< trim END
860b209750bSBram Moolenaar      vim9script
861cfcd011fSBram Moolenaar      var mylist = [
862b209750bSBram Moolenaar            'one',
863b209750bSBram Moolenaar            # comment
864b209750bSBram Moolenaar            'two', # empty line follows
865b209750bSBram Moolenaar
866b209750bSBram Moolenaar            'three',
867b209750bSBram Moolenaar            ]
868b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
869b209750bSBram Moolenaar  END
870b209750bSBram Moolenaar  CheckScriptSuccess(lines)
87166250c93SBram Moolenaar
87266250c93SBram Moolenaar  # check all lines from heredoc are kept
87366250c93SBram Moolenaar  lines =<< trim END
87466250c93SBram Moolenaar      # comment 1
87566250c93SBram Moolenaar      two
87666250c93SBram Moolenaar      # comment 3
87766250c93SBram Moolenaar
87866250c93SBram Moolenaar      five
87966250c93SBram Moolenaar      # comment 6
88066250c93SBram Moolenaar  END
88166250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
8824bce26bbSBram Moolenaar
8834bce26bbSBram Moolenaar  lines =<< trim END
8844bce26bbSBram Moolenaar    [{
8854bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
8864bce26bbSBram Moolenaar  END
8874bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
888b209750bSBram Moolenaarenddef
889b209750bSBram Moolenaar
8902a1381c3SBram Moolenaarif has('channel')
89140ee466cSBram Moolenaar  let someJob = test_null_job()
89240ee466cSBram Moolenaar
89340ee466cSBram Moolenaar  def FuncWithError()
89440ee466cSBram Moolenaar    echomsg g:someJob
89540ee466cSBram Moolenaar  enddef
89640ee466cSBram Moolenaar
89740ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
89840ee466cSBram Moolenaar    try
89940ee466cSBram Moolenaar      call FuncWithError()
90040ee466cSBram Moolenaar    catch
90140ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
90240ee466cSBram Moolenaar    endtry
90340ee466cSBram Moolenaar  endfunc
9042a1381c3SBram Moolenaarendif
90540ee466cSBram Moolenaar
9068a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
9078a7d6542SBram Moolenaar  vim9script
908cfcd011fSBram Moolenaar  var name: string = 'bob'
9098a7d6542SBram Moolenaar  def Concat(arg: string): string
9108a7d6542SBram Moolenaar    return name .. arg
9118a7d6542SBram Moolenaar  enddef
912227a69deSBram Moolenaar  g:result = Concat('bie')
913227a69deSBram Moolenaar  g:localname = name
9148a7d6542SBram Moolenaar
9158a7d6542SBram Moolenaar  export const CONST = 1234
916cfcd011fSBram Moolenaar  export var exported = 9876
917cfcd011fSBram Moolenaar  export var exp_name = 'John'
9188a7d6542SBram Moolenaar  export def Exported(): string
9198a7d6542SBram Moolenaar    return 'Exported'
9208a7d6542SBram Moolenaar  enddef
921*0f2a5cc6SBram Moolenaar  export final theList = [1]
9228a7d6542SBram MoolenaarEND
9238a7d6542SBram Moolenaar
924b3ca9824SBram Moolenaardef Undo_export_script_lines()
925b3ca9824SBram Moolenaar  unlet g:result
926b3ca9824SBram Moolenaar  unlet g:localname
927b3ca9824SBram Moolenaarenddef
928b3ca9824SBram Moolenaar
9295269bd2aSBram Moolenaardef Test_vim9_import_export()
930cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
9318a7d6542SBram Moolenaar    vim9script
9328a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
9338a7d6542SBram Moolenaar    g:imported = exported
9346e587dcbSBram Moolenaar    exported += 3
9356e587dcbSBram Moolenaar    g:imported_added = exported
9368a7d6542SBram Moolenaar    g:imported_func = Exported()
9376e587dcbSBram Moolenaar
93840f4f7a4SBram Moolenaar    def GetExported(): string
939e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
94040f4f7a4SBram Moolenaar      return local_dict.ref()
94140f4f7a4SBram Moolenaar    enddef
94240f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
94340f4f7a4SBram Moolenaar
9446e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
9456e587dcbSBram Moolenaar    g:imported_name = exp_name
9466e587dcbSBram Moolenaar    exp_name ..= ' Doe'
9476e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
9485381c7a1SBram Moolenaar    g:imported_later = exported
949*0f2a5cc6SBram Moolenaar
950*0f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
951*0f2a5cc6SBram Moolenaar    theList->add(2)
952*0f2a5cc6SBram Moolenaar    assert_equal([1, 2], theList)
9538a7d6542SBram Moolenaar  END
9548a7d6542SBram Moolenaar
9558a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
9568a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
9578a7d6542SBram Moolenaar
9588a7d6542SBram Moolenaar  source Ximport.vim
9598a7d6542SBram Moolenaar
9608a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
9618a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
9628a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
9636e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
9645381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
9658a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
96640f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
9676e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
9686e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
9698a7d6542SBram Moolenaar  assert_false(exists('g:name'))
9708a7d6542SBram Moolenaar
971b3ca9824SBram Moolenaar  Undo_export_script_lines()
9728a7d6542SBram Moolenaar  unlet g:imported
9736e587dcbSBram Moolenaar  unlet g:imported_added
9745381c7a1SBram Moolenaar  unlet g:imported_later
9758a7d6542SBram Moolenaar  unlet g:imported_func
9766e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
9778a7d6542SBram Moolenaar  delete('Ximport.vim')
978f2d5c240SBram Moolenaar
9791c991144SBram Moolenaar  # similar, with line breaks
980cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
9811c991144SBram Moolenaar    vim9script
9821c991144SBram Moolenaar    import {
9831c991144SBram Moolenaar        exported,
9841c991144SBram Moolenaar        Exported,
9851c991144SBram Moolenaar        }
9861c991144SBram Moolenaar        from
9871c991144SBram Moolenaar        './Xexport.vim'
9881c991144SBram Moolenaar    g:imported = exported
9891c991144SBram Moolenaar    exported += 5
9901c991144SBram Moolenaar    g:imported_added = exported
9911c991144SBram Moolenaar    g:imported_func = Exported()
9921c991144SBram Moolenaar  END
9931c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
9941c991144SBram Moolenaar  source Ximport_lbr.vim
9951c991144SBram Moolenaar
9961c991144SBram Moolenaar  assert_equal(9876, g:imported)
9971c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
9981c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
9991c991144SBram Moolenaar
10001c991144SBram Moolenaar  # exported script not sourced again
10011c991144SBram Moolenaar  assert_false(exists('g:result'))
10021c991144SBram Moolenaar  unlet g:imported
10031c991144SBram Moolenaar  unlet g:imported_added
10041c991144SBram Moolenaar  unlet g:imported_func
10051c991144SBram Moolenaar  delete('Ximport_lbr.vim')
10061c991144SBram Moolenaar
10071c991144SBram Moolenaar  # import inside :def function
1008cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
10095381c7a1SBram Moolenaar    vim9script
10105381c7a1SBram Moolenaar    def ImportInDef()
10115381c7a1SBram Moolenaar      import exported from './Xexport.vim'
10125381c7a1SBram Moolenaar      g:imported = exported
10135381c7a1SBram Moolenaar      exported += 7
10145381c7a1SBram Moolenaar      g:imported_added = exported
10155381c7a1SBram Moolenaar    enddef
10165381c7a1SBram Moolenaar    ImportInDef()
10175381c7a1SBram Moolenaar  END
10185381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
10195381c7a1SBram Moolenaar  source Ximport2.vim
1020f5be8cdbSBram Moolenaar  # TODO: this should be 9879
10215381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
10225381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
10235381c7a1SBram Moolenaar  unlet g:imported
10245381c7a1SBram Moolenaar  unlet g:imported_added
10255381c7a1SBram Moolenaar  delete('Ximport2.vim')
10265381c7a1SBram Moolenaar
1027cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1028f2d5c240SBram Moolenaar    vim9script
1029f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1030f2d5c240SBram Moolenaar    def UseExport()
1031f2d5c240SBram Moolenaar      g:imported = Export.exported
1032f2d5c240SBram Moolenaar    enddef
1033f2d5c240SBram Moolenaar    UseExport()
1034f2d5c240SBram Moolenaar  END
1035f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1036f2d5c240SBram Moolenaar  source Ximport.vim
10375381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1038f2d5c240SBram Moolenaar
1039cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1040599c89c8SBram Moolenaar    vim9script
1041599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1042599c89c8SBram Moolenaar    def Func()
1043cfcd011fSBram Moolenaar      var dummy = 1
1044cfcd011fSBram Moolenaar      var imported = Export + dummy
1045599c89c8SBram Moolenaar    enddef
1046822ba247SBram Moolenaar    defcompile
1047599c89c8SBram Moolenaar  END
1048599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
104944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1050599c89c8SBram Moolenaar
1051cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1052599c89c8SBram Moolenaar    vim9script
1053599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1054599c89c8SBram Moolenaar    def Func()
1055cfcd011fSBram Moolenaar      var imported = Export . exported
1056599c89c8SBram Moolenaar    enddef
1057822ba247SBram Moolenaar    defcompile
1058599c89c8SBram Moolenaar  END
1059599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
106044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1061599c89c8SBram Moolenaar
1062a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1063a6294955SBram Moolenaar    vim9script
1064a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1065a6294955SBram Moolenaar    var some = 'other'
1066a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1067a6294955SBram Moolenaar    defcompile
1068a6294955SBram Moolenaar  END
1069a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1070a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1071a6294955SBram Moolenaar
1072cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1073599c89c8SBram Moolenaar    vim9script
1074599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1075599c89c8SBram Moolenaar    def Func()
1076cfcd011fSBram Moolenaar      var imported = Export.
1077599c89c8SBram Moolenaar    enddef
1078822ba247SBram Moolenaar    defcompile
1079599c89c8SBram Moolenaar  END
1080599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
108144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1082599c89c8SBram Moolenaar
1083cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
10841c991144SBram Moolenaar    vim9script
10851c991144SBram Moolenaar    import *
10861c991144SBram Moolenaar        as Export
10871c991144SBram Moolenaar        from
10881c991144SBram Moolenaar        './Xexport.vim'
10891c991144SBram Moolenaar    def UseExport()
10901c991144SBram Moolenaar      g:imported = Export.exported
10911c991144SBram Moolenaar    enddef
10921c991144SBram Moolenaar    UseExport()
10931c991144SBram Moolenaar  END
10941c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
10951c991144SBram Moolenaar  source Ximport.vim
10961c991144SBram Moolenaar  assert_equal(9883, g:imported)
10971c991144SBram Moolenaar
1098cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1099f2d5c240SBram Moolenaar    vim9script
1100f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1101f2d5c240SBram Moolenaar  END
1102f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
110344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1104f2d5c240SBram Moolenaar
1105f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1106cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1107fa29c8abSBram Moolenaar    vim9script
1108fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1109fa29c8abSBram Moolenaar  END
1110fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
111144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1112fa29c8abSBram Moolenaar
1113f5be8cdbSBram Moolenaar  # try to import something that is already defined
1114cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
11155269bd2aSBram Moolenaar    vim9script
1116cfcd011fSBram Moolenaar    var exported = 'something'
11175269bd2aSBram Moolenaar    import exported from './Xexport.vim'
11185269bd2aSBram Moolenaar  END
11195269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
112044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
11215269bd2aSBram Moolenaar
1122f5be8cdbSBram Moolenaar  # try to import something that is already defined
11235269bd2aSBram Moolenaar  import_already_defined =<< trim END
11245269bd2aSBram Moolenaar    vim9script
1125cfcd011fSBram Moolenaar    var exported = 'something'
11265269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
11275269bd2aSBram Moolenaar  END
11285269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
112944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
11305269bd2aSBram Moolenaar
1131f5be8cdbSBram Moolenaar  # try to import something that is already defined
11325269bd2aSBram Moolenaar  import_already_defined =<< trim END
11335269bd2aSBram Moolenaar    vim9script
1134cfcd011fSBram Moolenaar    var exported = 'something'
11355269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
11365269bd2aSBram Moolenaar  END
11375269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
113844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
11395269bd2aSBram Moolenaar
1140918a4249SBram Moolenaar  # try changing an imported const
1141918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1142918a4249SBram Moolenaar    vim9script
1143918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1144918a4249SBram Moolenaar    def Assign()
1145918a4249SBram Moolenaar      CONST = 987
1146918a4249SBram Moolenaar    enddef
1147918a4249SBram Moolenaar    defcompile
1148918a4249SBram Moolenaar  END
1149918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1150918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1151918a4249SBram Moolenaar
1152*0f2a5cc6SBram Moolenaar  # try changing an imported final
1153*0f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
1154*0f2a5cc6SBram Moolenaar    vim9script
1155*0f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
1156*0f2a5cc6SBram Moolenaar    def Assign()
1157*0f2a5cc6SBram Moolenaar      theList = [2]
1158*0f2a5cc6SBram Moolenaar    enddef
1159*0f2a5cc6SBram Moolenaar    defcompile
1160*0f2a5cc6SBram Moolenaar  END
1161*0f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
1162*0f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1163*0f2a5cc6SBram Moolenaar
1164f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1165cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1166fa29c8abSBram Moolenaar    vim9script
1167fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1168fa29c8abSBram Moolenaar  END
1169fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
117044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1171fa29c8abSBram Moolenaar
1172cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1173fa29c8abSBram Moolenaar    vim9script
1174fa29c8abSBram Moolenaar    import name './Xexport.vim'
1175fa29c8abSBram Moolenaar  END
1176fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
117744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1178fa29c8abSBram Moolenaar
1179cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1180fa29c8abSBram Moolenaar    vim9script
1181fa29c8abSBram Moolenaar    import name from Xexport.vim
1182fa29c8abSBram Moolenaar  END
1183fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
118444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1185fa29c8abSBram Moolenaar
1186cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1187fa29c8abSBram Moolenaar    vim9script
1188fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1189fa29c8abSBram Moolenaar  END
1190fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
119144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1192fa29c8abSBram Moolenaar
1193cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1194fa29c8abSBram Moolenaar    vim9script
1195fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1196fa29c8abSBram Moolenaar  END
11975269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
119844d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1199fa29c8abSBram Moolenaar
1200f2d5c240SBram Moolenaar  delete('Ximport.vim')
12015269bd2aSBram Moolenaar  delete('Ximport3.vim')
12028a7d6542SBram Moolenaar  delete('Xexport.vim')
12038a7d6542SBram Moolenaar
1204f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1205750802b5SBram Moolenaar  set cpo&vi
1206cfcd011fSBram Moolenaar  var cpo_before = &cpo
1207cfcd011fSBram Moolenaar  var lines =<< trim END
1208750802b5SBram Moolenaar    vim9script
1209750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1210750802b5SBram Moolenaar  END
1211750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1212750802b5SBram Moolenaar  source Xvim9_script
1213750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1214750802b5SBram Moolenaar  set cpo&vim
1215750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1216750802b5SBram Moolenaar  delete('Xvim9_script')
1217750802b5SBram Moolenaarenddef
1218750802b5SBram Moolenaar
1219803af686SBram Moolenaarfunc g:Trigger()
1220803af686SBram Moolenaar  source Ximport.vim
1221803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1222803af686SBram Moolenaarendfunc
1223803af686SBram Moolenaar
1224803af686SBram Moolenaardef Test_import_export_expr_map()
1225803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1226cfcd011fSBram Moolenaar  var export_lines =<< trim END
1227803af686SBram Moolenaar    vim9script
1228803af686SBram Moolenaar    export def That(): string
1229803af686SBram Moolenaar      return 'yes'
1230803af686SBram Moolenaar    enddef
1231803af686SBram Moolenaar  END
1232803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1233803af686SBram Moolenaar
1234cfcd011fSBram Moolenaar  var import_lines =<< trim END
1235803af686SBram Moolenaar    vim9script
1236803af686SBram Moolenaar    import That from './Xexport_that.vim'
1237803af686SBram Moolenaar    assert_equal('yes', That())
1238803af686SBram Moolenaar  END
1239803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1240803af686SBram Moolenaar
1241803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1242803af686SBram Moolenaar  feedkeys('trigger', "xt")
1243803af686SBram Moolenaar
1244730b2483SBram Moolenaar  delete('Xexport_that.vim')
1245803af686SBram Moolenaar  delete('Ximport.vim')
1246803af686SBram Moolenaar  nunmap trigger
1247803af686SBram Moolenaarenddef
1248803af686SBram Moolenaar
12498e1986e3SBram Moolenaardef Test_import_in_filetype()
12508e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
12518e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1252cfcd011fSBram Moolenaar  var export_lines =<< trim END
12538e1986e3SBram Moolenaar    vim9script
1254cfcd011fSBram Moolenaar    export var That = 'yes'
12558e1986e3SBram Moolenaar  END
1256730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
12578e1986e3SBram Moolenaar
1258cfcd011fSBram Moolenaar  var import_lines =<< trim END
12598e1986e3SBram Moolenaar    vim9script
1260730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
12618e1986e3SBram Moolenaar    assert_equal('yes', That)
12628e1986e3SBram Moolenaar    g:did_load_mytpe = 1
12638e1986e3SBram Moolenaar  END
12648e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
12658e1986e3SBram Moolenaar
1266cfcd011fSBram Moolenaar  var save_rtp = &rtp
12678e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
12688e1986e3SBram Moolenaar
12698e1986e3SBram Moolenaar  filetype plugin on
12708e1986e3SBram Moolenaar  copen
12718e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
12728e1986e3SBram Moolenaar
12738e1986e3SBram Moolenaar  quit!
1274730b2483SBram Moolenaar  delete('Xexport_ft.vim')
12758e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
12768e1986e3SBram Moolenaar  &rtp = save_rtp
12778e1986e3SBram Moolenaarenddef
12788e1986e3SBram Moolenaar
1279efa94447SBram Moolenaardef Test_use_import_in_mapping()
1280cfcd011fSBram Moolenaar  var lines =<< trim END
1281efa94447SBram Moolenaar      vim9script
1282efa94447SBram Moolenaar      export def Funcx()
1283efa94447SBram Moolenaar        g:result = 42
1284efa94447SBram Moolenaar      enddef
1285efa94447SBram Moolenaar  END
1286efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1287efa94447SBram Moolenaar  lines =<< trim END
1288efa94447SBram Moolenaar      vim9script
1289efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1290b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1291efa94447SBram Moolenaar  END
1292efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1293efa94447SBram Moolenaar
1294efa94447SBram Moolenaar  source Xmapscript.vim
1295b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1296efa94447SBram Moolenaar  assert_equal(42, g:result)
1297efa94447SBram Moolenaar
1298efa94447SBram Moolenaar  unlet g:result
1299efa94447SBram Moolenaar  delete('XsomeExport.vim')
1300efa94447SBram Moolenaar  delete('Xmapscript.vim')
1301b3ca9824SBram Moolenaar  nunmap <F3>
1302efa94447SBram Moolenaarenddef
1303efa94447SBram Moolenaar
1304d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1305d3f8a9eeSBram Moolenaar  var lines =<< trim END
1306d3f8a9eeSBram Moolenaar    if has(g:feature)
1307d3f8a9eeSBram Moolenaar      " legacy script
1308d3f8a9eeSBram Moolenaar      let g:legacy = 1
1309d3f8a9eeSBram Moolenaar      finish
1310d3f8a9eeSBram Moolenaar    endif
1311d3f8a9eeSBram Moolenaar    vim9script
1312d3f8a9eeSBram Moolenaar    g:legacy = 0
1313d3f8a9eeSBram Moolenaar  END
1314d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1315d3f8a9eeSBram Moolenaar  g:legacy = -1
1316d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1317d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1318d3f8a9eeSBram Moolenaar
1319d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1320d3f8a9eeSBram Moolenaar  g:legacy = -1
1321d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1322d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1323d3f8a9eeSBram Moolenaarenddef
1324d3f8a9eeSBram Moolenaar
1325750802b5SBram Moolenaardef Test_vim9script_fails()
13268a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
13278a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1328cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
13299721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1330cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1331750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1332750802b5SBram Moolenaar
1333cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1334c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1335c785b9a7SBram Moolenaar
1336e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1337e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
13388a7d6542SBram Moolenaarenddef
13398a7d6542SBram Moolenaar
1340f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1341101f4810SBram Moolenaar  CheckRunVimInTerminal
1342101f4810SBram Moolenaar
13439bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1344c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
13459bb3eb3eSBram Moolenaarendfunc
13469bb3eb3eSBram Moolenaar
1347c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1348cfcd011fSBram Moolenaar  var export =<< trim END
1349101f4810SBram Moolenaar    vim9script
1350101f4810SBram Moolenaar    export def Foo(): number
1351101f4810SBram Moolenaar        return 0
1352101f4810SBram Moolenaar    enddef
1353101f4810SBram Moolenaar  END
1354730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1355101f4810SBram Moolenaar
1356e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
13579bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
13582949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1359101f4810SBram Moolenaar
1360730b2483SBram Moolenaar  delete('XexportCmd.vim')
13619bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
13629bb3eb3eSBram Moolenaarenddef
1363101f4810SBram Moolenaar
13642b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
13652b32700dSBram Moolenaar  var lines =<< trim END
1366a6294955SBram Moolenaar    vim9script
1367a6294955SBram Moolenaar    export var exported = 'thexport'
1368a6294955SBram Moolenaar  END
1369a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1370a6294955SBram Moolenaar  lines =<< trim END
13712b32700dSBram Moolenaar    vim9script noclear
13722b32700dSBram Moolenaar    g:loadCount += 1
13732b32700dSBram Moolenaar    var s:reloaded = 'init'
1374a6294955SBram Moolenaar    import exported from './XExportReload'
13752b32700dSBram Moolenaar
13762b32700dSBram Moolenaar    def Again(): string
13772b32700dSBram Moolenaar      return 'again'
13782b32700dSBram Moolenaar    enddef
13792b32700dSBram Moolenaar
13802b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
13812b32700dSBram Moolenaar    var s:loaded = true
13822b32700dSBram Moolenaar
13832b32700dSBram Moolenaar    var s:notReloaded = 'yes'
13842b32700dSBram Moolenaar    s:reloaded = 'first'
13852b32700dSBram Moolenaar    def g:Values(): list<string>
1386a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
13872b32700dSBram Moolenaar    enddef
13882b32700dSBram Moolenaar
13892b32700dSBram Moolenaar    def Once(): string
13902b32700dSBram Moolenaar      return 'once'
13912b32700dSBram Moolenaar    enddef
13922b32700dSBram Moolenaar  END
13932b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
13942b32700dSBram Moolenaar  g:loadCount = 0
13952b32700dSBram Moolenaar  source XReloaded
13962b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1397a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
13982b32700dSBram Moolenaar  source XReloaded
13992b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1400a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
14012b32700dSBram Moolenaar  source XReloaded
14022b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1403a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
14042b32700dSBram Moolenaar
140548e11c10SBram Moolenaar  delete('XReloaded')
1406a6294955SBram Moolenaar  delete('XExportReload')
14072b32700dSBram Moolenaar  delfunc g:Values
14082b32700dSBram Moolenaar  unlet g:loadCount
14092b32700dSBram Moolenaarenddef
14102b32700dSBram Moolenaar
14114c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1412cfcd011fSBram Moolenaar  var lines =<< trim END
14138a7d6542SBram Moolenaar    vim9script
14148a7d6542SBram Moolenaar    const var = ''
1415cfcd011fSBram Moolenaar    var valone = 1234
14168a7d6542SBram Moolenaar    def MyFunc(arg: string)
14178a7d6542SBram Moolenaar       valone = 5678
14188a7d6542SBram Moolenaar    enddef
14198a7d6542SBram Moolenaar  END
1420cfcd011fSBram Moolenaar  var morelines =<< trim END
1421cfcd011fSBram Moolenaar    var valtwo = 222
14228a7d6542SBram Moolenaar    export def GetValtwo(): number
14238a7d6542SBram Moolenaar      return valtwo
14248a7d6542SBram Moolenaar    enddef
14258a7d6542SBram Moolenaar  END
142603afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
14278a7d6542SBram Moolenaar  source Xreload.vim
14288a7d6542SBram Moolenaar  source Xreload.vim
14298a7d6542SBram Moolenaar  source Xreload.vim
14308a7d6542SBram Moolenaar
1431cfcd011fSBram Moolenaar  var testlines =<< trim END
14328a7d6542SBram Moolenaar    vim9script
14338a7d6542SBram Moolenaar    def TheFunc()
14348a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
14358a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
14368a7d6542SBram Moolenaar    enddef
14378a7d6542SBram Moolenaar    TheFunc()
14388a7d6542SBram Moolenaar  END
14398a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
14408a7d6542SBram Moolenaar  source Ximport.vim
14418a7d6542SBram Moolenaar
1442f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1443f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
14448a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
14458a7d6542SBram Moolenaar  source Ximport.vim
14468a7d6542SBram Moolenaar
1447f5be8cdbSBram Moolenaar  # cannot declare a var twice
14488a7d6542SBram Moolenaar  lines =<< trim END
14498a7d6542SBram Moolenaar    vim9script
1450cfcd011fSBram Moolenaar    var valone = 1234
1451cfcd011fSBram Moolenaar    var valone = 5678
14528a7d6542SBram Moolenaar  END
14538a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
145444d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
14558a7d6542SBram Moolenaar
14568a7d6542SBram Moolenaar  delete('Xreload.vim')
14578a7d6542SBram Moolenaar  delete('Ximport.vim')
14588a7d6542SBram Moolenaarenddef
14598a7d6542SBram Moolenaar
146007a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
146107a65d26SBram Moolenaar" compiled function using that variable must fail.
146207a65d26SBram Moolenaardef Test_script_reload_change_type()
146307a65d26SBram Moolenaar  var lines =<< trim END
146407a65d26SBram Moolenaar    vim9script noclear
146507a65d26SBram Moolenaar    var str = 'string'
146607a65d26SBram Moolenaar    def g:GetStr(): string
146707a65d26SBram Moolenaar      return str .. 'xxx'
146807a65d26SBram Moolenaar    enddef
146907a65d26SBram Moolenaar  END
147007a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
147107a65d26SBram Moolenaar  source Xreload.vim
147207a65d26SBram Moolenaar  echo g:GetStr()
147307a65d26SBram Moolenaar
147407a65d26SBram Moolenaar  lines =<< trim END
147507a65d26SBram Moolenaar    vim9script noclear
147607a65d26SBram Moolenaar    var str = 1234
147707a65d26SBram Moolenaar  END
147807a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
147907a65d26SBram Moolenaar  source Xreload.vim
148007a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
148107a65d26SBram Moolenaar
148207a65d26SBram Moolenaar  delfunc g:GetStr
148307a65d26SBram Moolenaar  delete('Xreload.vim')
148407a65d26SBram Moolenaarenddef
148507a65d26SBram Moolenaar
148695006e3dSBram Moolenaardef s:RetSome(): string
148795006e3dSBram Moolenaar  return 'some'
148895006e3dSBram Moolenaarenddef
148995006e3dSBram Moolenaar
1490fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1491fe465a01SBram Moolenaar" script-local name.
1492fe465a01SBram Moolenaardef Test_vim9script_funcref()
1493cfcd011fSBram Moolenaar  var sortlines =<< trim END
1494fe465a01SBram Moolenaar      vim9script
1495fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1496bed36b93SBram Moolenaar        return i2 - i1
1497fe465a01SBram Moolenaar      enddef
1498fe465a01SBram Moolenaar
1499fe465a01SBram Moolenaar      export def FastSort(): list<number>
1500fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1501fe465a01SBram Moolenaar      enddef
1502fe465a01SBram Moolenaar  END
1503fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1504fe465a01SBram Moolenaar
1505cfcd011fSBram Moolenaar  var lines =<< trim END
1506fe465a01SBram Moolenaar    vim9script
1507fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1508fe465a01SBram Moolenaar    def Test()
1509fe465a01SBram Moolenaar      g:result = FastSort()
1510fe465a01SBram Moolenaar    enddef
1511fe465a01SBram Moolenaar    Test()
1512fe465a01SBram Moolenaar  END
1513fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1514fe465a01SBram Moolenaar
1515fe465a01SBram Moolenaar  source Xscript.vim
1516fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1517fe465a01SBram Moolenaar
1518fe465a01SBram Moolenaar  unlet g:result
1519fe465a01SBram Moolenaar  delete('Xsort.vim')
1520fe465a01SBram Moolenaar  delete('Xscript.vim')
152195006e3dSBram Moolenaar
1522cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
152395006e3dSBram Moolenaar  assert_equal('some', Funcref())
1524fe465a01SBram Moolenaarenddef
1525fe465a01SBram Moolenaar
1526601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1527601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1528601e76acSBram Moolenaar" function reference.
1529c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1530cfcd011fSBram Moolenaar  var filterLines =<< trim END
1531c620c055SBram Moolenaar    vim9script
1532c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1533c620c055SBram Moolenaar      return idx % 2 == 1
1534c620c055SBram Moolenaar    enddef
1535c620c055SBram Moolenaar    export def FastFilter(): list<number>
1536c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1537c620c055SBram Moolenaar    enddef
1538601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1539601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1540601e76acSBram Moolenaar    enddef
1541c620c055SBram Moolenaar  END
1542c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1543c620c055SBram Moolenaar
1544cfcd011fSBram Moolenaar  var lines =<< trim END
1545c620c055SBram Moolenaar    vim9script
1546601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1547c620c055SBram Moolenaar    def Test()
1548cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1549c620c055SBram Moolenaar    enddef
1550c620c055SBram Moolenaar    Test()
1551601e76acSBram Moolenaar    def TestDirect()
1552cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1553601e76acSBram Moolenaar    enddef
1554601e76acSBram Moolenaar    TestDirect()
1555c620c055SBram Moolenaar  END
1556601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1557c620c055SBram Moolenaar  delete('Xfilter.vim')
1558c620c055SBram Moolenaarenddef
1559c620c055SBram Moolenaar
15604c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1561cfcd011fSBram Moolenaar  var first_lines =<< trim END
15624c17ad94SBram Moolenaar    vim9script
15634c17ad94SBram Moolenaar    def FuncYes(): string
15644c17ad94SBram Moolenaar      return 'yes'
15654c17ad94SBram Moolenaar    enddef
15664c17ad94SBram Moolenaar  END
1567cfcd011fSBram Moolenaar  var withno_lines =<< trim END
15684c17ad94SBram Moolenaar    def FuncNo(): string
15694c17ad94SBram Moolenaar      return 'no'
15704c17ad94SBram Moolenaar    enddef
15714c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
15724c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
15734c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
157403afdcf1SBram Moolenaar    enddef
157503afdcf1SBram Moolenaar  END
1576cfcd011fSBram Moolenaar  var nono_lines =<< trim END
157703afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
157803afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
157944d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
15804c17ad94SBram Moolenaar    enddef
15814c17ad94SBram Moolenaar  END
15824c17ad94SBram Moolenaar
15834c17ad94SBram Moolenaar  # FuncNo() is defined
158403afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
15854c17ad94SBram Moolenaar  source Xreloaded.vim
15864c17ad94SBram Moolenaar  g:DoCheck(true)
15874c17ad94SBram Moolenaar
15884c17ad94SBram Moolenaar  # FuncNo() is not redefined
158903afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
15904c17ad94SBram Moolenaar  source Xreloaded.vim
15915082471fSBram Moolenaar  g:DoCheck(false)
15924c17ad94SBram Moolenaar
15934c17ad94SBram Moolenaar  # FuncNo() is back
159403afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
15954c17ad94SBram Moolenaar  source Xreloaded.vim
15965082471fSBram Moolenaar  g:DoCheck(false)
15974c17ad94SBram Moolenaar
15984c17ad94SBram Moolenaar  delete('Xreloaded.vim')
15994c17ad94SBram Moolenaarenddef
16004c17ad94SBram Moolenaar
160189483d40SBram Moolenaardef Test_vim9script_reload_delvar()
160289483d40SBram Moolenaar  # write the script with a script-local variable
1603cfcd011fSBram Moolenaar  var lines =<< trim END
160489483d40SBram Moolenaar    vim9script
1605cfcd011fSBram Moolenaar    var name = 'string'
160689483d40SBram Moolenaar  END
160789483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
160889483d40SBram Moolenaar  source XreloadVar.vim
160989483d40SBram Moolenaar
161089483d40SBram Moolenaar  # now write the script using the same variable locally - works
161189483d40SBram Moolenaar  lines =<< trim END
161289483d40SBram Moolenaar    vim9script
161389483d40SBram Moolenaar    def Func()
1614cfcd011fSBram Moolenaar      var name = 'string'
161589483d40SBram Moolenaar    enddef
161689483d40SBram Moolenaar  END
161789483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
161889483d40SBram Moolenaar  source XreloadVar.vim
161989483d40SBram Moolenaar
162089483d40SBram Moolenaar  delete('XreloadVar.vim')
162189483d40SBram Moolenaarenddef
162289483d40SBram Moolenaar
16238a7d6542SBram Moolenaardef Test_import_absolute()
1624cfcd011fSBram Moolenaar  var import_lines = [
1625e6085c53SBram Moolenaar        'vim9script',
1626e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1627e6085c53SBram Moolenaar        'def UseExported()',
1628e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1629e6085c53SBram Moolenaar        '  exported = 8888',
1630e6085c53SBram Moolenaar        '  g:imported_after = exported',
1631e6085c53SBram Moolenaar        'enddef',
1632e6085c53SBram Moolenaar        'UseExported()',
1633e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1634e6085c53SBram Moolenaar        ]
16358a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
16368a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
16378a7d6542SBram Moolenaar
16388a7d6542SBram Moolenaar  source Ximport_abs.vim
16398a7d6542SBram Moolenaar
16408a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
16414e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1642fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1643fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1644fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1645fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1646fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1647fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1648fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1649fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1650fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1651fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1652e6085c53SBram Moolenaar        g:import_disassembled)
1653b3ca9824SBram Moolenaar
1654b3ca9824SBram Moolenaar  Undo_export_script_lines()
16558a7d6542SBram Moolenaar  unlet g:imported_abs
16564e12a5dfSBram Moolenaar  unlet g:import_disassembled
16578a7d6542SBram Moolenaar
16588a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
16598a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
16608a7d6542SBram Moolenaarenddef
16618a7d6542SBram Moolenaar
16628a7d6542SBram Moolenaardef Test_import_rtp()
1663cfcd011fSBram Moolenaar  var import_lines = [
1664e6085c53SBram Moolenaar        'vim9script',
1665e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1666e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1667e6085c53SBram Moolenaar        ]
16688a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
16698a7d6542SBram Moolenaar  mkdir('import')
16708a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
16718a7d6542SBram Moolenaar
1672cfcd011fSBram Moolenaar  var save_rtp = &rtp
16738a7d6542SBram Moolenaar  &rtp = getcwd()
16748a7d6542SBram Moolenaar  source Ximport_rtp.vim
16758a7d6542SBram Moolenaar  &rtp = save_rtp
16768a7d6542SBram Moolenaar
16778a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
16788a7d6542SBram Moolenaar
1679b3ca9824SBram Moolenaar  Undo_export_script_lines()
1680b3ca9824SBram Moolenaar  unlet g:imported_rtp
16818a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
168289483d40SBram Moolenaar  delete('import', 'rf')
16838a7d6542SBram Moolenaarenddef
16848a7d6542SBram Moolenaar
168525e0f586SBram Moolenaardef Test_import_compile_error()
1686cfcd011fSBram Moolenaar  var export_lines = [
168725e0f586SBram Moolenaar        'vim9script',
168825e0f586SBram Moolenaar        'export def ExpFunc(): string',
168925e0f586SBram Moolenaar        '  return notDefined',
169025e0f586SBram Moolenaar        'enddef',
169125e0f586SBram Moolenaar        ]
169225e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
169325e0f586SBram Moolenaar
1694cfcd011fSBram Moolenaar  var import_lines = [
169525e0f586SBram Moolenaar        'vim9script',
169625e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
169725e0f586SBram Moolenaar        'def ImpFunc()',
169825e0f586SBram Moolenaar        '  echo ExpFunc()',
169925e0f586SBram Moolenaar        'enddef',
170025e0f586SBram Moolenaar        'defcompile',
170125e0f586SBram Moolenaar        ]
170225e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
170325e0f586SBram Moolenaar
170425e0f586SBram Moolenaar  try
170525e0f586SBram Moolenaar    source Ximport.vim
170625e0f586SBram Moolenaar  catch /E1001/
1707f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
17087707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
170925e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
171025e0f586SBram Moolenaar  endtry
171125e0f586SBram Moolenaar
171225e0f586SBram Moolenaar  delete('Xexported.vim')
171325e0f586SBram Moolenaar  delete('Ximport.vim')
171425e0f586SBram Moolenaarenddef
171525e0f586SBram Moolenaar
1716c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1717cfcd011fSBram Moolenaar  var lines = [
1718c4ce36d4SBram Moolenaar        'vim9script',
1719c4ce36d4SBram Moolenaar        'def Func()',
1720c4ce36d4SBram Moolenaar        '  eval [][0]',
1721c4ce36d4SBram Moolenaar        'enddef',
1722c4ce36d4SBram Moolenaar        'Func()',
1723c4ce36d4SBram Moolenaar        ]
1724c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1725c4ce36d4SBram Moolenaar
1726c4ce36d4SBram Moolenaar  for count in range(3)
1727c4ce36d4SBram Moolenaar    try
1728c4ce36d4SBram Moolenaar      source Xtestscript.vim
1729c4ce36d4SBram Moolenaar    catch /E684/
1730c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1731c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1732c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1733c4ce36d4SBram Moolenaar    endtry
1734c4ce36d4SBram Moolenaar  endfor
1735c4ce36d4SBram Moolenaar
1736c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1737c4ce36d4SBram Moolenaarenddef
1738c4ce36d4SBram Moolenaar
1739eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1740cfcd011fSBram Moolenaar  var export_lines =<< trim END
1741eef2102eSBram Moolenaar      vim9script
1742eef2102eSBram Moolenaar      export def Func()
1743eef2102eSBram Moolenaar        echo 'imported'
1744eef2102eSBram Moolenaar      enddef
1745eef2102eSBram Moolenaar  END
1746eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1747eef2102eSBram Moolenaar
1748cfcd011fSBram Moolenaar  var lines =<< trim END
1749eef2102eSBram Moolenaar    vim9script
1750eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1751eef2102eSBram Moolenaar    def Func()
1752eef2102eSBram Moolenaar      echo 'local to function'
1753eef2102eSBram Moolenaar    enddef
1754eef2102eSBram Moolenaar  END
1755eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1756eef2102eSBram Moolenaar
1757eef2102eSBram Moolenaar  lines =<< trim END
1758eef2102eSBram Moolenaar    vim9script
1759eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1760eef2102eSBram Moolenaar    def Outer()
1761eef2102eSBram Moolenaar      def Func()
1762eef2102eSBram Moolenaar        echo 'local to function'
1763eef2102eSBram Moolenaar      enddef
1764eef2102eSBram Moolenaar    enddef
1765eef2102eSBram Moolenaar    defcompile
1766eef2102eSBram Moolenaar  END
1767eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1768eef2102eSBram Moolenaar
1769eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1770eef2102eSBram Moolenaarenddef
1771eef2102eSBram Moolenaar
1772b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1773cfcd011fSBram Moolenaar  var lines =<< trim END
1774b9a2cac3SBram Moolenaar    vim9script
1775b9a2cac3SBram Moolenaar    def Func()
1776b9a2cac3SBram Moolenaar      echo 'one'
1777b9a2cac3SBram Moolenaar    enddef
1778b9a2cac3SBram Moolenaar    def Func()
1779b9a2cac3SBram Moolenaar      echo 'two'
1780b9a2cac3SBram Moolenaar    enddef
1781b9a2cac3SBram Moolenaar  END
1782b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1783fa211f3cSBram Moolenaar
1784fa211f3cSBram Moolenaar  lines =<< trim END
1785fa211f3cSBram Moolenaar    vim9script
1786fa211f3cSBram Moolenaar    def Foo(): string
1787fa211f3cSBram Moolenaar      return 'foo'
1788fa211f3cSBram Moolenaar      enddef
1789fa211f3cSBram Moolenaar    def Func()
1790cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1791fa211f3cSBram Moolenaar    enddef
1792fa211f3cSBram Moolenaar    defcompile
1793fa211f3cSBram Moolenaar  END
1794fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1795b9a2cac3SBram Moolenaarenddef
1796b9a2cac3SBram Moolenaar
17978a7d6542SBram Moolenaardef Test_fixed_size_list()
1798f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1799cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
18008a7d6542SBram Moolenaar  l->remove(0)
18018a7d6542SBram Moolenaar  l->add(5)
18028a7d6542SBram Moolenaar  l->insert(99, 1)
18030f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
18048a7d6542SBram Moolenaarenddef
18058a7d6542SBram Moolenaar
1806ae616494SBram Moolenaardef Test_no_insert_xit()
1807d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1808d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1809d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1810d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1811d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1812ae616494SBram Moolenaar
1813ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1814ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1815ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1816ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1817f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1818f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1819f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1820f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1821f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1822ae616494SBram Moolenaarenddef
1823ae616494SBram Moolenaar
1824158906cfSBram Moolenaardef IfElse(what: number): string
1825cfcd011fSBram Moolenaar  var res = ''
1826158906cfSBram Moolenaar  if what == 1
1827158906cfSBram Moolenaar    res = "one"
1828158906cfSBram Moolenaar  elseif what == 2
1829158906cfSBram Moolenaar    res = "two"
1830a259d8d3SBram Moolenaar  else
1831158906cfSBram Moolenaar    res = "three"
1832a259d8d3SBram Moolenaar  endif
1833158906cfSBram Moolenaar  return res
1834a259d8d3SBram Moolenaarenddef
1835a259d8d3SBram Moolenaar
1836158906cfSBram Moolenaardef Test_if_elseif_else()
1837158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1838158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1839158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
18400f18b6d1SBram Moolenaarenddef
18410f18b6d1SBram Moolenaar
1842e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1843d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1844d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1845d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1846ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1847d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
18486628b7ebSBram Moolenaar
18496628b7ebSBram Moolenaar  var lines =<< trim END
18506628b7ebSBram Moolenaar      var s = ''
18516628b7ebSBram Moolenaar      if s = ''
18526628b7ebSBram Moolenaar      endif
18536628b7ebSBram Moolenaar  END
18546628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
18556628b7ebSBram Moolenaar
18566628b7ebSBram Moolenaar  lines =<< trim END
18576628b7ebSBram Moolenaar      var s = ''
18586628b7ebSBram Moolenaar      if s == ''
18596628b7ebSBram Moolenaar      elseif s = ''
18606628b7ebSBram Moolenaar      endif
18616628b7ebSBram Moolenaar  END
18626628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
1863e8c4abbbSBram Moolenaarenddef
1864e8c4abbbSBram Moolenaar
18656d69bf60SBram Moolenaarlet g:bool_true = v:true
18666d69bf60SBram Moolenaarlet g:bool_false = v:false
18676d69bf60SBram Moolenaar
18686d69bf60SBram Moolenaardef Test_if_const_expr()
1869cfcd011fSBram Moolenaar  var res = false
18706d69bf60SBram Moolenaar  if true ? true : false
18716d69bf60SBram Moolenaar    res = true
18726d69bf60SBram Moolenaar  endif
18736d69bf60SBram Moolenaar  assert_equal(true, res)
18746d69bf60SBram Moolenaar
1875585fea7bSBram Moolenaar  g:glob = 2
1876585fea7bSBram Moolenaar  if false
18776797966dSBram Moolenaar    execute('g:glob = 3')
1878585fea7bSBram Moolenaar  endif
1879585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1880585fea7bSBram Moolenaar  if true
18816797966dSBram Moolenaar    execute('g:glob = 3')
1882585fea7bSBram Moolenaar  endif
1883585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1884585fea7bSBram Moolenaar
18856d69bf60SBram Moolenaar  res = false
18866d69bf60SBram Moolenaar  if g:bool_true ? true : false
18876d69bf60SBram Moolenaar    res = true
18886d69bf60SBram Moolenaar  endif
18896d69bf60SBram Moolenaar  assert_equal(true, res)
18906d69bf60SBram Moolenaar
18916d69bf60SBram Moolenaar  res = false
18926d69bf60SBram Moolenaar  if true ? g:bool_true : false
18936d69bf60SBram Moolenaar    res = true
18946d69bf60SBram Moolenaar  endif
18956d69bf60SBram Moolenaar  assert_equal(true, res)
18966d69bf60SBram Moolenaar
18976d69bf60SBram Moolenaar  res = false
18986d69bf60SBram Moolenaar  if true ? true : g:bool_false
18996d69bf60SBram Moolenaar    res = true
19006d69bf60SBram Moolenaar  endif
19016d69bf60SBram Moolenaar  assert_equal(true, res)
19026d69bf60SBram Moolenaar
19036d69bf60SBram Moolenaar  res = false
19046d69bf60SBram Moolenaar  if true ? false : true
19056d69bf60SBram Moolenaar    res = true
19066d69bf60SBram Moolenaar  endif
19076d69bf60SBram Moolenaar  assert_equal(false, res)
19086d69bf60SBram Moolenaar
19096d69bf60SBram Moolenaar  res = false
19106d69bf60SBram Moolenaar  if false ? false : true
19116d69bf60SBram Moolenaar    res = true
19126d69bf60SBram Moolenaar  endif
19136d69bf60SBram Moolenaar  assert_equal(true, res)
19146d69bf60SBram Moolenaar
19156d69bf60SBram Moolenaar  res = false
19166d69bf60SBram Moolenaar  if false ? true : false
19176d69bf60SBram Moolenaar    res = true
19186d69bf60SBram Moolenaar  endif
19196d69bf60SBram Moolenaar  assert_equal(false, res)
19206d69bf60SBram Moolenaar
19216d69bf60SBram Moolenaar  res = false
1922e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1923e8c4abbbSBram Moolenaar    res = true
1924e8c4abbbSBram Moolenaar  endif
1925e8c4abbbSBram Moolenaar  assert_equal(false, res)
1926e8c4abbbSBram Moolenaar
1927e8c4abbbSBram Moolenaar  res = false
19286d69bf60SBram Moolenaar  if true && true
19296d69bf60SBram Moolenaar    res = true
19306d69bf60SBram Moolenaar  endif
19316d69bf60SBram Moolenaar  assert_equal(true, res)
19326d69bf60SBram Moolenaar
19336d69bf60SBram Moolenaar  res = false
19346d69bf60SBram Moolenaar  if true && false
19356d69bf60SBram Moolenaar    res = true
19366d69bf60SBram Moolenaar  endif
19376d69bf60SBram Moolenaar  assert_equal(false, res)
19386d69bf60SBram Moolenaar
19396d69bf60SBram Moolenaar  res = false
19406d69bf60SBram Moolenaar  if g:bool_true && false
19416d69bf60SBram Moolenaar    res = true
19426d69bf60SBram Moolenaar  endif
19436d69bf60SBram Moolenaar  assert_equal(false, res)
19446d69bf60SBram Moolenaar
19456d69bf60SBram Moolenaar  res = false
19466d69bf60SBram Moolenaar  if true && g:bool_false
19476d69bf60SBram Moolenaar    res = true
19486d69bf60SBram Moolenaar  endif
19496d69bf60SBram Moolenaar  assert_equal(false, res)
19506d69bf60SBram Moolenaar
19516d69bf60SBram Moolenaar  res = false
19526d69bf60SBram Moolenaar  if false && false
19536d69bf60SBram Moolenaar    res = true
19546d69bf60SBram Moolenaar  endif
19556d69bf60SBram Moolenaar  assert_equal(false, res)
19566d69bf60SBram Moolenaar
19576d69bf60SBram Moolenaar  res = false
19586d69bf60SBram Moolenaar  if true || false
19596d69bf60SBram Moolenaar    res = true
19606d69bf60SBram Moolenaar  endif
19616d69bf60SBram Moolenaar  assert_equal(true, res)
19626d69bf60SBram Moolenaar
19636d69bf60SBram Moolenaar  res = false
19646d69bf60SBram Moolenaar  if g:bool_true || false
19656d69bf60SBram Moolenaar    res = true
19666d69bf60SBram Moolenaar  endif
19676d69bf60SBram Moolenaar  assert_equal(true, res)
19686d69bf60SBram Moolenaar
19696d69bf60SBram Moolenaar  res = false
19706d69bf60SBram Moolenaar  if true || g:bool_false
19716d69bf60SBram Moolenaar    res = true
19726d69bf60SBram Moolenaar  endif
19736d69bf60SBram Moolenaar  assert_equal(true, res)
19746d69bf60SBram Moolenaar
19756d69bf60SBram Moolenaar  res = false
19766d69bf60SBram Moolenaar  if false || false
19776d69bf60SBram Moolenaar    res = true
19786d69bf60SBram Moolenaar  endif
19796d69bf60SBram Moolenaar  assert_equal(false, res)
19803988f64fSBram Moolenaar
19813988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
19823988f64fSBram Moolenaar  if false | eval 0 | endif
19833988f64fSBram Moolenaar  if false | eval burp + 234 | endif
19843988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
19853988f64fSBram Moolenaar  if false
19863988f64fSBram Moolenaar    burp
19873988f64fSBram Moolenaar  endif
198880c34ca3SBram Moolenaarenddef
19896d69bf60SBram Moolenaar
199080c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1991d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1992d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1993d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1994d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
19956d69bf60SBram Moolenaarenddef
19966d69bf60SBram Moolenaar
199772abcf42SBram Moolenaardef RunNested(i: number): number
1998cfcd011fSBram Moolenaar  var x: number = 0
199972abcf42SBram Moolenaar  if i % 2
200072abcf42SBram Moolenaar    if 1
2001f5be8cdbSBram Moolenaar      # comment
200272abcf42SBram Moolenaar    else
2003f5be8cdbSBram Moolenaar      # comment
200472abcf42SBram Moolenaar    endif
200572abcf42SBram Moolenaar    x += 1
200672abcf42SBram Moolenaar  else
200772abcf42SBram Moolenaar    x += 1000
200872abcf42SBram Moolenaar  endif
200972abcf42SBram Moolenaar  return x
201072abcf42SBram Moolenaarenddef
201172abcf42SBram Moolenaar
201272abcf42SBram Moolenaardef Test_nested_if()
201372abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
201472abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
201572abcf42SBram Moolenaarenddef
201672abcf42SBram Moolenaar
2017ad39c094SBram Moolenaardef Test_execute_cmd()
2018e4984290SBram Moolenaar  # missing argument is ignored
2019e4984290SBram Moolenaar  execute
2020e4984290SBram Moolenaar  execute # comment
2021e4984290SBram Moolenaar
2022ad39c094SBram Moolenaar  new
2023ad39c094SBram Moolenaar  setline(1, 'default')
2024d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2025ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2026a72cfb80SBram Moolenaar
2027d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2028a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2029a72cfb80SBram Moolenaar
2030cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2031cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2032a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2033ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2034a72cfb80SBram Moolenaar
2035d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2036ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2037a72cfb80SBram Moolenaar
2038cfcd011fSBram Moolenaar  var cmd_first = 'call '
2039cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2040ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2041ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2042ad39c094SBram Moolenaar  bwipe!
2043585fea7bSBram Moolenaar
2044cfcd011fSBram Moolenaar  var n = true
20452d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
20462d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
20472d6b20d6SBram Moolenaar
2048e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2049e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2050e5abf7afSBram Moolenaar
2051d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2052d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2053d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2054ad39c094SBram Moolenaarenddef
2055ad39c094SBram Moolenaar
205647e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2057f5be8cdbSBram Moolenaar  # only checks line continuation
2058cfcd011fSBram Moolenaar  var lines =<< trim END
205947e880d6SBram Moolenaar      vim9script
206047e880d6SBram Moolenaar      execute 'g:someVar'
206147e880d6SBram Moolenaar                .. ' = ' ..
206247e880d6SBram Moolenaar                   '28'
206347e880d6SBram Moolenaar      assert_equal(28, g:someVar)
206447e880d6SBram Moolenaar      unlet g:someVar
206547e880d6SBram Moolenaar  END
206647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
206747e880d6SBram Moolenaarenddef
206847e880d6SBram Moolenaar
2069ad39c094SBram Moolenaardef Test_echo_cmd()
2070a72cfb80SBram Moolenaar  echo 'some' # comment
2071585fea7bSBram Moolenaar  echon 'thing'
2072ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2073ad39c094SBram Moolenaar
2074a72cfb80SBram Moolenaar  echo "some" # comment
2075a72cfb80SBram Moolenaar  echon "thing"
2076a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2077a72cfb80SBram Moolenaar
2078cfcd011fSBram Moolenaar  var str1 = 'some'
2079cfcd011fSBram Moolenaar  var str2 = 'more'
2080ad39c094SBram Moolenaar  echo str1 str2
2081ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2082a72cfb80SBram Moolenaar
2083d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2084ad39c094SBram Moolenaarenddef
2085ad39c094SBram Moolenaar
2086f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2087f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2088f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2089f93c7feaSBram Moolenaar  echo 'clear'
2090df069eecSBram Moolenaar  :1messages
2091f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2092f93c7feaSBram Moolenaar
2093d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2094f93c7feaSBram Moolenaarenddef
2095f93c7feaSBram Moolenaar
209647e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2097f5be8cdbSBram Moolenaar  # only checks line continuation
2098cfcd011fSBram Moolenaar  var lines =<< trim END
209947e880d6SBram Moolenaar      vim9script
210047e880d6SBram Moolenaar      echomsg 'here'
210147e880d6SBram Moolenaar                .. ' is ' ..
210247e880d6SBram Moolenaar                   'a message'
210347e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
210447e880d6SBram Moolenaar  END
210547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
210647e880d6SBram Moolenaarenddef
210747e880d6SBram Moolenaar
2108f93c7feaSBram Moolenaardef Test_echoerr_cmd()
210940ee466cSBram Moolenaar  try
211040ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
211140ee466cSBram Moolenaar  catch
211240ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
211340ee466cSBram Moolenaar  endtry
2114f93c7feaSBram Moolenaarenddef
2115f93c7feaSBram Moolenaar
211647e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2117f5be8cdbSBram Moolenaar  # only checks line continuation
2118cfcd011fSBram Moolenaar  var lines =<< trim END
211947e880d6SBram Moolenaar      vim9script
212047e880d6SBram Moolenaar      try
212147e880d6SBram Moolenaar        echoerr 'this'
212247e880d6SBram Moolenaar                .. ' is ' ..
212347e880d6SBram Moolenaar                   'wrong'
212447e880d6SBram Moolenaar      catch
212547e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
212647e880d6SBram Moolenaar      endtry
212747e880d6SBram Moolenaar  END
212847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
212947e880d6SBram Moolenaarenddef
213047e880d6SBram Moolenaar
213141fe0617SBram Moolenaardef Test_for_outside_of_function()
2132cfcd011fSBram Moolenaar  var lines =<< trim END
213341fe0617SBram Moolenaar    vim9script
213441fe0617SBram Moolenaar    new
213541fe0617SBram Moolenaar    for var in range(0, 3)
213641fe0617SBram Moolenaar      append(line('$'), var)
213741fe0617SBram Moolenaar    endfor
213841fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
213941fe0617SBram Moolenaar    bwipe!
214041fe0617SBram Moolenaar  END
214141fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
214241fe0617SBram Moolenaar  source Xvim9for.vim
214341fe0617SBram Moolenaar  delete('Xvim9for.vim')
214441fe0617SBram Moolenaarenddef
21458a7d6542SBram Moolenaar
2146e8c4abbbSBram Moolenaardef Test_for_loop()
2147cfcd011fSBram Moolenaar  var result = ''
2148e8c4abbbSBram Moolenaar  for cnt in range(7)
2149e8c4abbbSBram Moolenaar    if cnt == 4
2150e8c4abbbSBram Moolenaar      break
2151e8c4abbbSBram Moolenaar    endif
2152e8c4abbbSBram Moolenaar    if cnt == 2
2153e8c4abbbSBram Moolenaar      continue
2154e8c4abbbSBram Moolenaar    endif
2155e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2156e8c4abbbSBram Moolenaar  endfor
2157e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
21580ad3e894SBram Moolenaar
2159cfcd011fSBram Moolenaar  var concat = ''
21600ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
21610ad3e894SBram Moolenaar    concat ..= str
21620ad3e894SBram Moolenaar  endfor
21630ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
216438bd8de5SBram Moolenaar
216538bd8de5SBram Moolenaar  var total = 0
216638bd8de5SBram Moolenaar  for nr in
216738bd8de5SBram Moolenaar      [1, 2, 3]
216838bd8de5SBram Moolenaar    total += nr
216938bd8de5SBram Moolenaar  endfor
217038bd8de5SBram Moolenaar  assert_equal(6, total)
217138bd8de5SBram Moolenaar
217238bd8de5SBram Moolenaar  total = 0
217338bd8de5SBram Moolenaar  for nr
217438bd8de5SBram Moolenaar    in [1, 2, 3]
217538bd8de5SBram Moolenaar    total += nr
217638bd8de5SBram Moolenaar  endfor
217738bd8de5SBram Moolenaar  assert_equal(6, total)
217838bd8de5SBram Moolenaar
217938bd8de5SBram Moolenaar  total = 0
218038bd8de5SBram Moolenaar  for nr
218138bd8de5SBram Moolenaar    in
218238bd8de5SBram Moolenaar    [1, 2, 3]
218338bd8de5SBram Moolenaar    total += nr
218438bd8de5SBram Moolenaar  endfor
218538bd8de5SBram Moolenaar  assert_equal(6, total)
2186036d0714SBram Moolenaar
2187036d0714SBram Moolenaar  var res = ""
2188036d0714SBram Moolenaar  for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2189036d0714SBram Moolenaar    res ..= n .. s
2190036d0714SBram Moolenaar  endfor
2191036d0714SBram Moolenaar  assert_equal('1a2b', res)
2192e8c4abbbSBram Moolenaarenddef
2193e8c4abbbSBram Moolenaar
2194e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2195025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2196025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2197025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2198675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2199675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2200cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2201822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
22022d870f8dSBram Moolenaar  delfunc! g:Func
2203451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2204675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2205675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2206675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2207e8c4abbbSBram Moolenaarenddef
2208e8c4abbbSBram Moolenaar
2209ea87069dSBram Moolenaardef Test_for_loop_script_var()
2210ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2211ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2212ea87069dSBram Moolenaar
2213ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2214ea87069dSBram Moolenaar  var lines =<< trim END
2215ea87069dSBram Moolenaar    vim9script
2216ea87069dSBram Moolenaar    var total = 0
2217ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2218ea87069dSBram Moolenaar      total += s:var
2219ea87069dSBram Moolenaar    endfor
2220ea87069dSBram Moolenaar    assert_equal(6, total)
2221ea87069dSBram Moolenaar
2222ea87069dSBram Moolenaar    total = 0
2223ea87069dSBram Moolenaar    for var in [1, 2, 3]
2224ea87069dSBram Moolenaar      total += var
2225ea87069dSBram Moolenaar    endfor
2226ea87069dSBram Moolenaar    assert_equal(6, total)
2227ea87069dSBram Moolenaar  END
2228ea87069dSBram Moolenaarenddef
2229ea87069dSBram Moolenaar
2230792f786aSBram Moolenaardef Test_for_loop_unpack()
22314b8a0651SBram Moolenaar  var lines =<< trim END
2232792f786aSBram Moolenaar      var result = []
2233792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2234792f786aSBram Moolenaar        result->add(v1)
2235792f786aSBram Moolenaar        result->add(v2)
2236792f786aSBram Moolenaar      endfor
2237792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2238792f786aSBram Moolenaar
2239792f786aSBram Moolenaar      result = []
2240792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2241792f786aSBram Moolenaar        result->add(v1)
2242792f786aSBram Moolenaar        result->add(v2)
2243792f786aSBram Moolenaar        result->add(v3)
2244792f786aSBram Moolenaar      endfor
2245792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2246792f786aSBram Moolenaar
22474b8a0651SBram Moolenaar      result = []
22484b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
22494b8a0651SBram Moolenaar        result->add(&ts)
22504b8a0651SBram Moolenaar        result->add(&sw)
22514b8a0651SBram Moolenaar      endfor
22524b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
22534b8a0651SBram Moolenaar
22544b8a0651SBram Moolenaar      var slist: list<string>
22554b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
22564b8a0651SBram Moolenaar        slist->add($LOOPVAR)
22574b8a0651SBram Moolenaar        slist->add(@r)
22584b8a0651SBram Moolenaar        slist->add(v:errmsg)
22594b8a0651SBram Moolenaar      endfor
22604b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
22614b8a0651SBram Moolenaar
22624b8a0651SBram Moolenaar      slist = []
22634b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
22644b8a0651SBram Moolenaar        slist->add(g:globalvar)
22654b8a0651SBram Moolenaar        slist->add(b:bufvar)
22664b8a0651SBram Moolenaar        slist->add(w:winvar)
22674b8a0651SBram Moolenaar        slist->add(t:tabvar)
22684b8a0651SBram Moolenaar      endfor
22694b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2270f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
22714b8a0651SBram Moolenaar  END
22724b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
22734b8a0651SBram Moolenaar
22744b8a0651SBram Moolenaar  lines =<< trim END
2275792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2276792f786aSBram Moolenaar        echo v1 v2
2277792f786aSBram Moolenaar      endfor
2278792f786aSBram Moolenaar  END
2279792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2280792f786aSBram Moolenaar
2281792f786aSBram Moolenaar  lines =<< trim END
2282792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2283792f786aSBram Moolenaar        echo v1 v2
2284792f786aSBram Moolenaar      endfor
2285792f786aSBram Moolenaar  END
2286792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2287792f786aSBram Moolenaar
2288792f786aSBram Moolenaar  lines =<< trim END
2289792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2290792f786aSBram Moolenaar        echo v1
2291792f786aSBram Moolenaar      endfor
2292792f786aSBram Moolenaar  END
2293792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2294792f786aSBram Moolenaarenddef
2295792f786aSBram Moolenaar
2296c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2297c150c09eSBram Moolenaar  var looped = 0
2298c150c09eSBram Moolenaar  var cleanup = 0
2299c150c09eSBram Moolenaar  for i in range(3)
2300c150c09eSBram Moolenaar    looped += 1
2301c150c09eSBram Moolenaar    try
2302c150c09eSBram Moolenaar      eval [][0]
2303c150c09eSBram Moolenaar    catch
2304c150c09eSBram Moolenaar      continue
2305c150c09eSBram Moolenaar    finally
2306c150c09eSBram Moolenaar      cleanup += 1
2307c150c09eSBram Moolenaar    endtry
2308c150c09eSBram Moolenaar  endfor
2309c150c09eSBram Moolenaar  assert_equal(3, looped)
2310c150c09eSBram Moolenaar  assert_equal(3, cleanup)
2311c150c09eSBram Moolenaarenddef
2312c150c09eSBram Moolenaar
2313d0df1aacSBram Moolenaardef Test_while_loop()
2314cfcd011fSBram Moolenaar  var result = ''
2315cfcd011fSBram Moolenaar  var cnt = 0
2316d0df1aacSBram Moolenaar  while cnt < 555
2317d0df1aacSBram Moolenaar    if cnt == 3
2318d0df1aacSBram Moolenaar      break
2319d0df1aacSBram Moolenaar    endif
2320d0df1aacSBram Moolenaar    cnt += 1
2321d0df1aacSBram Moolenaar    if cnt == 2
2322d0df1aacSBram Moolenaar      continue
2323d0df1aacSBram Moolenaar    endif
2324d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2325d0df1aacSBram Moolenaar  endwhile
2326d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2327dee37dc7SBram Moolenaar
2328dee37dc7SBram Moolenaar  var s = ''
23290123cc1eSBram Moolenaar  while s == 'x' #{comment}
2330dee37dc7SBram Moolenaar  endwhile
2331d0df1aacSBram Moolenaarenddef
2332d0df1aacSBram Moolenaar
2333e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2334675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2335675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2336675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2337675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2338675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2339675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2340675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
23416628b7ebSBram Moolenaar
23426628b7ebSBram Moolenaar  var lines =<< trim END
23436628b7ebSBram Moolenaar      var s = ''
23446628b7ebSBram Moolenaar      while s = ''
23456628b7ebSBram Moolenaar      endwhile
23466628b7ebSBram Moolenaar  END
23476628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2348bd5da371SBram Moolenaarenddef
2349bd5da371SBram Moolenaar
23509645e2d9SBram Moolenaardef Test_interrupt_loop()
2351cfcd011fSBram Moolenaar  var caught = false
2352cfcd011fSBram Moolenaar  var x = 0
235397acfc78SBram Moolenaar  try
23549645e2d9SBram Moolenaar    while 1
23559645e2d9SBram Moolenaar      x += 1
23569645e2d9SBram Moolenaar      if x == 100
23579645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
23589645e2d9SBram Moolenaar      endif
23599645e2d9SBram Moolenaar    endwhile
236097acfc78SBram Moolenaar  catch
236197acfc78SBram Moolenaar    caught = true
236297acfc78SBram Moolenaar    assert_equal(100, x)
236397acfc78SBram Moolenaar  endtry
236497acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
236525859dd7SBram Moolenaar  # consume the CTRL-C
236625859dd7SBram Moolenaar  getchar(0)
23679645e2d9SBram Moolenaarenddef
236820431c9dSBram Moolenaar
23694fdae999SBram Moolenaardef Test_automatic_line_continuation()
2370cfcd011fSBram Moolenaar  var mylist = [
23714fdae999SBram Moolenaar      'one',
23724fdae999SBram Moolenaar      'two',
23734fdae999SBram Moolenaar      'three',
2374f5be8cdbSBram Moolenaar      ] # comment
23754fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
23764fdae999SBram Moolenaar
2377cfcd011fSBram Moolenaar  var mydict = {
2378e0de171eSBram Moolenaar      ['one']: 1,
2379e0de171eSBram Moolenaar      ['two']: 2,
2380e0de171eSBram Moolenaar      ['three']:
23814fdae999SBram Moolenaar          3,
2382f5be8cdbSBram Moolenaar      } # comment
2383e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2384e0de171eSBram Moolenaar  mydict = {
23852c330432SBram Moolenaar      one: 1,  # comment
23862c330432SBram Moolenaar      two:     # comment
23872c330432SBram Moolenaar           2,  # comment
23882c330432SBram Moolenaar      three: 3 # comment
23892c330432SBram Moolenaar      }
2390e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2391e0de171eSBram Moolenaar  mydict = {
23922c330432SBram Moolenaar      one: 1,
23934fdae999SBram Moolenaar      two:
23944fdae999SBram Moolenaar           2,
23952c330432SBram Moolenaar      three: 3
23964fdae999SBram Moolenaar      }
2397e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2398e6085c53SBram Moolenaar
2399e6085c53SBram Moolenaar  assert_equal(
2400e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2401e6085c53SBram Moolenaar        split('one two three')
2402e6085c53SBram Moolenaar        )
24034fdae999SBram Moolenaarenddef
24044fdae999SBram Moolenaar
24057a092245SBram Moolenaardef Test_vim9_comment()
24067a092245SBram Moolenaar  CheckScriptSuccess([
24077a092245SBram Moolenaar      'vim9script',
24087a092245SBram Moolenaar      '# something',
240993f82cbeSBram Moolenaar      '#something',
241093f82cbeSBram Moolenaar      '#{something',
24117a092245SBram Moolenaar      ])
241293f82cbeSBram Moolenaar
241393f82cbeSBram Moolenaar  split Xfile
241493f82cbeSBram Moolenaar  CheckScriptSuccess([
241593f82cbeSBram Moolenaar      'vim9script',
241693f82cbeSBram Moolenaar      'edit #something',
241793f82cbeSBram Moolenaar      ])
241893f82cbeSBram Moolenaar  CheckScriptSuccess([
241993f82cbeSBram Moolenaar      'vim9script',
242093f82cbeSBram Moolenaar      'edit #{something',
242193f82cbeSBram Moolenaar      ])
242293f82cbeSBram Moolenaar  close
242393f82cbeSBram Moolenaar
24247a092245SBram Moolenaar  CheckScriptFailure([
24257a092245SBram Moolenaar      'vim9script',
24267a092245SBram Moolenaar      ':# something',
24277a092245SBram Moolenaar      ], 'E488:')
24287a092245SBram Moolenaar  CheckScriptFailure([
24297a092245SBram Moolenaar      '# something',
24307a092245SBram Moolenaar      ], 'E488:')
24317a092245SBram Moolenaar  CheckScriptFailure([
24327a092245SBram Moolenaar      ':# something',
24337a092245SBram Moolenaar      ], 'E488:')
24347a092245SBram Moolenaar
24354a8d9f2eSBram Moolenaar  { # block start
24364a8d9f2eSBram Moolenaar  } # block end
24374a8d9f2eSBram Moolenaar  CheckDefFailure([
24384a8d9f2eSBram Moolenaar      '{# comment',
24394a8d9f2eSBram Moolenaar      ], 'E488:')
24404a8d9f2eSBram Moolenaar  CheckDefFailure([
24414a8d9f2eSBram Moolenaar      '{',
24424a8d9f2eSBram Moolenaar      '}# comment',
24434a8d9f2eSBram Moolenaar      ], 'E488:')
24444a8d9f2eSBram Moolenaar
24454a8d9f2eSBram Moolenaar  echo "yes" # comment
24464a8d9f2eSBram Moolenaar  CheckDefFailure([
24474a8d9f2eSBram Moolenaar      'echo "yes"# comment',
24484a8d9f2eSBram Moolenaar      ], 'E488:')
24497a092245SBram Moolenaar  CheckScriptSuccess([
24507a092245SBram Moolenaar      'vim9script',
24517a092245SBram Moolenaar      'echo "yes" # something',
24527a092245SBram Moolenaar      ])
24537a092245SBram Moolenaar  CheckScriptFailure([
24547a092245SBram Moolenaar      'vim9script',
24557a092245SBram Moolenaar      'echo "yes"# something',
24567a092245SBram Moolenaar      ], 'E121:')
24577a092245SBram Moolenaar  CheckScriptFailure([
24587a092245SBram Moolenaar      'vim9script',
24597a092245SBram Moolenaar      'echo# something',
2460f8103f27SBram Moolenaar      ], 'E1144:')
24617a092245SBram Moolenaar  CheckScriptFailure([
24627a092245SBram Moolenaar      'echo "yes" # something',
24637a092245SBram Moolenaar      ], 'E121:')
24647a092245SBram Moolenaar
24654a8d9f2eSBram Moolenaar  exe "echo" # comment
24664a8d9f2eSBram Moolenaar  CheckDefFailure([
24674a8d9f2eSBram Moolenaar      'exe "echo"# comment',
24684a8d9f2eSBram Moolenaar      ], 'E488:')
24694a8d9f2eSBram Moolenaar  CheckScriptSuccess([
24704a8d9f2eSBram Moolenaar      'vim9script',
24714a8d9f2eSBram Moolenaar      'exe "echo" # something',
24724a8d9f2eSBram Moolenaar      ])
24734a8d9f2eSBram Moolenaar  CheckScriptFailure([
24744a8d9f2eSBram Moolenaar      'vim9script',
24754a8d9f2eSBram Moolenaar      'exe "echo"# something',
24764a8d9f2eSBram Moolenaar      ], 'E121:')
24774a8d9f2eSBram Moolenaar  CheckScriptFailure([
24784a8d9f2eSBram Moolenaar      'vim9script',
24794a8d9f2eSBram Moolenaar      'exe# something',
2480f8103f27SBram Moolenaar      ], 'E1144:')
24814a8d9f2eSBram Moolenaar  CheckScriptFailure([
24824a8d9f2eSBram Moolenaar      'exe "echo" # something',
24834a8d9f2eSBram Moolenaar      ], 'E121:')
24844a8d9f2eSBram Moolenaar
24857a092245SBram Moolenaar  CheckDefFailure([
24867a092245SBram Moolenaar      'try# comment',
24877a092245SBram Moolenaar      '  echo "yes"',
24887a092245SBram Moolenaar      'catch',
24897a092245SBram Moolenaar      'endtry',
2490f8103f27SBram Moolenaar      ], 'E1144:')
24912c5ed4e3SBram Moolenaar  CheckScriptFailure([
24922c5ed4e3SBram Moolenaar      'vim9script',
24932c5ed4e3SBram Moolenaar      'try# comment',
24942c5ed4e3SBram Moolenaar      'echo "yes"',
2495f8103f27SBram Moolenaar      ], 'E1144:')
24967a092245SBram Moolenaar  CheckDefFailure([
24977a092245SBram Moolenaar      'try',
2498a72cfb80SBram Moolenaar      '  throw#comment',
2499a72cfb80SBram Moolenaar      'catch',
2500a72cfb80SBram Moolenaar      'endtry',
2501f8103f27SBram Moolenaar      ], 'E1144:')
2502a72cfb80SBram Moolenaar  CheckDefFailure([
2503a72cfb80SBram Moolenaar      'try',
2504a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2505a72cfb80SBram Moolenaar      'catch',
2506a72cfb80SBram Moolenaar      'endtry',
2507a72cfb80SBram Moolenaar      ], 'E488:')
2508a72cfb80SBram Moolenaar  CheckDefFailure([
2509a72cfb80SBram Moolenaar      'try',
25107a092245SBram Moolenaar      '  echo "yes"',
25117a092245SBram Moolenaar      'catch# comment',
25127a092245SBram Moolenaar      'endtry',
2513f8103f27SBram Moolenaar      ], 'E1144:')
25142c5ed4e3SBram Moolenaar  CheckScriptFailure([
25152c5ed4e3SBram Moolenaar      'vim9script',
25162c5ed4e3SBram Moolenaar      'try',
25172c5ed4e3SBram Moolenaar      '  echo "yes"',
25182c5ed4e3SBram Moolenaar      'catch# comment',
25192c5ed4e3SBram Moolenaar      'endtry',
2520f8103f27SBram Moolenaar      ], 'E1144:')
25212c5ed4e3SBram Moolenaar  CheckDefFailure([
25222c5ed4e3SBram Moolenaar      'try',
25232c5ed4e3SBram Moolenaar      '  echo "yes"',
25242c5ed4e3SBram Moolenaar      'catch /pat/# comment',
25252c5ed4e3SBram Moolenaar      'endtry',
25262c5ed4e3SBram Moolenaar      ], 'E488:')
25277a092245SBram Moolenaar  CheckDefFailure([
25287a092245SBram Moolenaar      'try',
25297a092245SBram Moolenaar      'echo "yes"',
25307a092245SBram Moolenaar      'catch',
25317a092245SBram Moolenaar      'endtry# comment',
2532f8103f27SBram Moolenaar      ], 'E1144:')
25332c5ed4e3SBram Moolenaar  CheckScriptFailure([
25342c5ed4e3SBram Moolenaar      'vim9script',
25352c5ed4e3SBram Moolenaar      'try',
25362c5ed4e3SBram Moolenaar      '  echo "yes"',
25372c5ed4e3SBram Moolenaar      'catch',
25382c5ed4e3SBram Moolenaar      'endtry# comment',
2539f8103f27SBram Moolenaar      ], 'E1144:')
25402c5ed4e3SBram Moolenaar
25412c5ed4e3SBram Moolenaar  CheckScriptSuccess([
25422c5ed4e3SBram Moolenaar      'vim9script',
25432c5ed4e3SBram Moolenaar      'hi # comment',
25442c5ed4e3SBram Moolenaar      ])
25452c5ed4e3SBram Moolenaar  CheckScriptFailure([
25462c5ed4e3SBram Moolenaar      'vim9script',
25472c5ed4e3SBram Moolenaar      'hi# comment',
2548f8103f27SBram Moolenaar      ], 'E1144:')
25491966c248SBram Moolenaar  CheckScriptSuccess([
25501966c248SBram Moolenaar      'vim9script',
25511966c248SBram Moolenaar      'hi Search # comment',
25521966c248SBram Moolenaar      ])
25531966c248SBram Moolenaar  CheckScriptFailure([
25541966c248SBram Moolenaar      'vim9script',
25551966c248SBram Moolenaar      'hi Search# comment',
25561966c248SBram Moolenaar      ], 'E416:')
25571966c248SBram Moolenaar  CheckScriptSuccess([
25581966c248SBram Moolenaar      'vim9script',
25591966c248SBram Moolenaar      'hi link This Search # comment',
25601966c248SBram Moolenaar      ])
25611966c248SBram Moolenaar  CheckScriptFailure([
25621966c248SBram Moolenaar      'vim9script',
25631966c248SBram Moolenaar      'hi link This That# comment',
25641966c248SBram Moolenaar      ], 'E413:')
25651966c248SBram Moolenaar  CheckScriptSuccess([
25661966c248SBram Moolenaar      'vim9script',
25671966c248SBram Moolenaar      'hi clear This # comment',
25681966c248SBram Moolenaar      'hi clear # comment',
25691966c248SBram Moolenaar      ])
2570f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2571f5be8cdbSBram Moolenaar  # hi clear This# comment',
25721966c248SBram Moolenaar  CheckScriptFailure([
25731966c248SBram Moolenaar      'vim9script',
25741966c248SBram Moolenaar      'hi clear# comment',
25751966c248SBram Moolenaar      ], 'E416:')
25761966c248SBram Moolenaar
25771966c248SBram Moolenaar  CheckScriptSuccess([
25781966c248SBram Moolenaar      'vim9script',
25791966c248SBram Moolenaar      'hi Group term=bold',
25801966c248SBram Moolenaar      'match Group /todo/ # comment',
25811966c248SBram Moolenaar      ])
25821966c248SBram Moolenaar  CheckScriptFailure([
25831966c248SBram Moolenaar      'vim9script',
25841966c248SBram Moolenaar      'hi Group term=bold',
25851966c248SBram Moolenaar      'match Group /todo/# comment',
25861966c248SBram Moolenaar      ], 'E488:')
25871966c248SBram Moolenaar  CheckScriptSuccess([
25881966c248SBram Moolenaar      'vim9script',
25891966c248SBram Moolenaar      'match # comment',
25901966c248SBram Moolenaar      ])
25911966c248SBram Moolenaar  CheckScriptFailure([
25921966c248SBram Moolenaar      'vim9script',
25931966c248SBram Moolenaar      'match# comment',
2594f8103f27SBram Moolenaar      ], 'E1144:')
25951966c248SBram Moolenaar  CheckScriptSuccess([
25961966c248SBram Moolenaar      'vim9script',
25971966c248SBram Moolenaar      'match none # comment',
25981966c248SBram Moolenaar      ])
25991966c248SBram Moolenaar  CheckScriptFailure([
26001966c248SBram Moolenaar      'vim9script',
26011966c248SBram Moolenaar      'match none# comment',
26021966c248SBram Moolenaar      ], 'E475:')
26031966c248SBram Moolenaar
26041966c248SBram Moolenaar  CheckScriptSuccess([
26051966c248SBram Moolenaar      'vim9script',
26061966c248SBram Moolenaar      'menutrans clear # comment',
26071966c248SBram Moolenaar      ])
26081966c248SBram Moolenaar  CheckScriptFailure([
26091966c248SBram Moolenaar      'vim9script',
26101966c248SBram Moolenaar      'menutrans clear# comment text',
26111966c248SBram Moolenaar      ], 'E474:')
26121966c248SBram Moolenaar
26131966c248SBram Moolenaar  CheckScriptSuccess([
26141966c248SBram Moolenaar      'vim9script',
26151966c248SBram Moolenaar      'syntax clear # comment',
26161966c248SBram Moolenaar      ])
26171966c248SBram Moolenaar  CheckScriptFailure([
26181966c248SBram Moolenaar      'vim9script',
26191966c248SBram Moolenaar      'syntax clear# comment text',
26201966c248SBram Moolenaar      ], 'E28:')
26211966c248SBram Moolenaar  CheckScriptSuccess([
26221966c248SBram Moolenaar      'vim9script',
26231966c248SBram Moolenaar      'syntax keyword Word some',
26241966c248SBram Moolenaar      'syntax clear Word # comment',
26251966c248SBram Moolenaar      ])
26261966c248SBram Moolenaar  CheckScriptFailure([
26271966c248SBram Moolenaar      'vim9script',
26281966c248SBram Moolenaar      'syntax keyword Word some',
26291966c248SBram Moolenaar      'syntax clear Word# comment text',
26301966c248SBram Moolenaar      ], 'E28:')
26311966c248SBram Moolenaar
26321966c248SBram Moolenaar  CheckScriptSuccess([
26331966c248SBram Moolenaar      'vim9script',
26341966c248SBram Moolenaar      'syntax list # comment',
26351966c248SBram Moolenaar      ])
26361966c248SBram Moolenaar  CheckScriptFailure([
26371966c248SBram Moolenaar      'vim9script',
26381966c248SBram Moolenaar      'syntax list# comment text',
26391966c248SBram Moolenaar      ], 'E28:')
26401966c248SBram Moolenaar
26411966c248SBram Moolenaar  CheckScriptSuccess([
26421966c248SBram Moolenaar      'vim9script',
26431966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
26441966c248SBram Moolenaar      ])
26451966c248SBram Moolenaar  CheckScriptFailure([
26461966c248SBram Moolenaar      'vim9script',
26471966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
26481966c248SBram Moolenaar      ], 'E475:')
26491966c248SBram Moolenaar
26501966c248SBram Moolenaar  CheckScriptSuccess([
26511966c248SBram Moolenaar      'vim9script',
26521966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
26531966c248SBram Moolenaar      ])
26541966c248SBram Moolenaar  CheckScriptFailure([
26551966c248SBram Moolenaar      'vim9script',
26561966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
26571966c248SBram Moolenaar      ], 'E789:')
26581966c248SBram Moolenaar
26591966c248SBram Moolenaar  CheckScriptSuccess([
26601966c248SBram Moolenaar      'vim9script',
26611966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
26621966c248SBram Moolenaar      ])
26631966c248SBram Moolenaar  CheckScriptFailure([
26641966c248SBram Moolenaar      'vim9script',
26651966c248SBram Moolenaar      'syntax match Word /pat/# comment',
26661966c248SBram Moolenaar      ], 'E402:')
26671966c248SBram Moolenaar
26681966c248SBram Moolenaar  CheckScriptSuccess([
26691966c248SBram Moolenaar      'vim9script',
26701966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
26711966c248SBram Moolenaar      ])
26721966c248SBram Moolenaar  CheckScriptFailure([
26731966c248SBram Moolenaar      'vim9script',
26741966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
26751966c248SBram Moolenaar      ], 'E475:')
26761966c248SBram Moolenaar  CheckScriptFailure([
26771966c248SBram Moolenaar      'vim9script',
26781966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
26791966c248SBram Moolenaar      ], 'E406:')
26801966c248SBram Moolenaar  CheckScriptFailure([
26811966c248SBram Moolenaar      'vim9script',
26821966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
26831966c248SBram Moolenaar      ], 'E475:')
26841966c248SBram Moolenaar
26851966c248SBram Moolenaar  CheckScriptSuccess([
26861966c248SBram Moolenaar      'vim9script',
26871966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
26881966c248SBram Moolenaar      ])
26891966c248SBram Moolenaar  CheckScriptFailure([
26901966c248SBram Moolenaar      'vim9script',
26911966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2692d032f34aSBram Moolenaar      ], 'E402:')
26931966c248SBram Moolenaar
26941966c248SBram Moolenaar  CheckScriptSuccess([
26951966c248SBram Moolenaar      'vim9script',
26961966c248SBram Moolenaar      'syntax sync # comment',
26971966c248SBram Moolenaar      ])
26981966c248SBram Moolenaar  CheckScriptFailure([
26991966c248SBram Moolenaar      'vim9script',
27001966c248SBram Moolenaar      'syntax sync# comment',
27011966c248SBram Moolenaar      ], 'E404:')
27021966c248SBram Moolenaar  CheckScriptSuccess([
27031966c248SBram Moolenaar      'vim9script',
27041966c248SBram Moolenaar      'syntax sync ccomment # comment',
27051966c248SBram Moolenaar      ])
27061966c248SBram Moolenaar  CheckScriptFailure([
27071966c248SBram Moolenaar      'vim9script',
27081966c248SBram Moolenaar      'syntax sync ccomment# comment',
27091966c248SBram Moolenaar      ], 'E404:')
27101966c248SBram Moolenaar
27111966c248SBram Moolenaar  CheckScriptSuccess([
27121966c248SBram Moolenaar      'vim9script',
27131966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
27141966c248SBram Moolenaar      ])
27151966c248SBram Moolenaar  CheckScriptFailure([
27161966c248SBram Moolenaar      'vim9script',
27171966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
27181966c248SBram Moolenaar      ], 'E475:')
2719a72cfb80SBram Moolenaar
2720a72cfb80SBram Moolenaar  CheckScriptSuccess([
2721a72cfb80SBram Moolenaar      'vim9script',
2722a72cfb80SBram Moolenaar      'command Echo echo # comment',
2723a72cfb80SBram Moolenaar      'command Echo # comment',
27242d870f8dSBram Moolenaar      'delcommand Echo',
2725a72cfb80SBram Moolenaar      ])
2726a72cfb80SBram Moolenaar  CheckScriptFailure([
2727a72cfb80SBram Moolenaar      'vim9script',
2728a72cfb80SBram Moolenaar      'command Echo echo# comment',
2729a72cfb80SBram Moolenaar      'Echo',
2730f8103f27SBram Moolenaar      ], 'E1144:')
27312d870f8dSBram Moolenaar  delcommand Echo
273270249ee8SBram Moolenaar
273370249ee8SBram Moolenaar  var curdir = getcwd()
273470249ee8SBram Moolenaar  CheckScriptSuccess([
273570249ee8SBram Moolenaar      'command Echo cd " comment',
273670249ee8SBram Moolenaar      'Echo',
273770249ee8SBram Moolenaar      'delcommand Echo',
273870249ee8SBram Moolenaar      ])
273970249ee8SBram Moolenaar  CheckScriptSuccess([
2740090728adSBram Moolenaar      'vim9script',
274170249ee8SBram Moolenaar      'command Echo cd # comment',
274270249ee8SBram Moolenaar      'Echo',
274370249ee8SBram Moolenaar      'delcommand Echo',
274470249ee8SBram Moolenaar      ])
274570249ee8SBram Moolenaar  CheckScriptFailure([
274670249ee8SBram Moolenaar      'vim9script',
274770249ee8SBram Moolenaar      'command Echo cd " comment',
274870249ee8SBram Moolenaar      'Echo',
274970249ee8SBram Moolenaar      ], 'E344:')
275070249ee8SBram Moolenaar  delcommand Echo
275170249ee8SBram Moolenaar  chdir(curdir)
275270249ee8SBram Moolenaar
2753a72cfb80SBram Moolenaar  CheckScriptFailure([
2754a72cfb80SBram Moolenaar      'vim9script',
2755a72cfb80SBram Moolenaar      'command Echo# comment',
2756a72cfb80SBram Moolenaar      ], 'E182:')
2757a72cfb80SBram Moolenaar  CheckScriptFailure([
2758a72cfb80SBram Moolenaar      'vim9script',
2759a72cfb80SBram Moolenaar      'command Echo echo',
2760a72cfb80SBram Moolenaar      'command Echo# comment',
2761a72cfb80SBram Moolenaar      ], 'E182:')
27622d870f8dSBram Moolenaar  delcommand Echo
2763a72cfb80SBram Moolenaar
2764a72cfb80SBram Moolenaar  CheckScriptSuccess([
2765a72cfb80SBram Moolenaar      'vim9script',
2766a72cfb80SBram Moolenaar      'function # comment',
2767a72cfb80SBram Moolenaar      ])
2768a72cfb80SBram Moolenaar  CheckScriptFailure([
2769a72cfb80SBram Moolenaar      'vim9script',
27709898107fSBram Moolenaar      'function " comment',
27719898107fSBram Moolenaar      ], 'E129:')
27729898107fSBram Moolenaar  CheckScriptFailure([
27739898107fSBram Moolenaar      'vim9script',
2774a72cfb80SBram Moolenaar      'function# comment',
2775f8103f27SBram Moolenaar      ], 'E1144:')
2776a72cfb80SBram Moolenaar  CheckScriptSuccess([
2777a72cfb80SBram Moolenaar      'vim9script',
2778a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2779a72cfb80SBram Moolenaar      ])
2780a72cfb80SBram Moolenaar  CheckScriptFailure([
2781a72cfb80SBram Moolenaar      'vim9script',
2782a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2783a72cfb80SBram Moolenaar      ], 'E488:')
2784a72cfb80SBram Moolenaar
2785a72cfb80SBram Moolenaar  CheckScriptSuccess([
2786a72cfb80SBram Moolenaar      'vim9script',
27874c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2788a72cfb80SBram Moolenaar      'endfunc',
27894c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2790a72cfb80SBram Moolenaar      ])
2791a72cfb80SBram Moolenaar  CheckScriptFailure([
2792a72cfb80SBram Moolenaar      'vim9script',
27934c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2794a72cfb80SBram Moolenaar      'endfunc',
27954c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2796a72cfb80SBram Moolenaar      ], 'E488:')
2797a72cfb80SBram Moolenaar
2798a72cfb80SBram Moolenaar  CheckScriptSuccess([
2799a72cfb80SBram Moolenaar      'vim9script',
2800a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2801a72cfb80SBram Moolenaar      ])
2802a72cfb80SBram Moolenaar  CheckScriptFailure([
2803a72cfb80SBram Moolenaar      'vim9script',
2804a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2805a72cfb80SBram Moolenaar      ], 'E488:')
2806e7e4838fSBram Moolenaar
2807e7e4838fSBram Moolenaar  CheckScriptFailure([
2808e7e4838fSBram Moolenaar      'def Test() " comment',
2809e7e4838fSBram Moolenaar      'enddef',
2810e7e4838fSBram Moolenaar      ], 'E488:')
2811e7e4838fSBram Moolenaar  CheckScriptFailure([
2812e7e4838fSBram Moolenaar      'vim9script',
2813e7e4838fSBram Moolenaar      'def Test() " comment',
2814e7e4838fSBram Moolenaar      'enddef',
2815e7e4838fSBram Moolenaar      ], 'E488:')
2816e7e4838fSBram Moolenaar
2817e7e4838fSBram Moolenaar  CheckScriptSuccess([
2818e7e4838fSBram Moolenaar      'func Test() " comment',
2819e7e4838fSBram Moolenaar      'endfunc',
28202d870f8dSBram Moolenaar      'delfunc Test',
2821e7e4838fSBram Moolenaar      ])
28229898107fSBram Moolenaar  CheckScriptSuccess([
2823e7e4838fSBram Moolenaar      'vim9script',
2824e7e4838fSBram Moolenaar      'func Test() " comment',
2825e7e4838fSBram Moolenaar      'endfunc',
28269898107fSBram Moolenaar      ])
2827e7e4838fSBram Moolenaar
2828e7e4838fSBram Moolenaar  CheckScriptSuccess([
2829e7e4838fSBram Moolenaar      'def Test() # comment',
2830e7e4838fSBram Moolenaar      'enddef',
2831e7e4838fSBram Moolenaar      ])
2832e7e4838fSBram Moolenaar  CheckScriptFailure([
2833e7e4838fSBram Moolenaar      'func Test() # comment',
2834e7e4838fSBram Moolenaar      'endfunc',
2835e7e4838fSBram Moolenaar      ], 'E488:')
28362c5ed4e3SBram Moolenaarenddef
28372c5ed4e3SBram Moolenaar
28382c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
28392c5ed4e3SBram Moolenaar  CheckCanRunGui
28402c5ed4e3SBram Moolenaar
28412c5ed4e3SBram Moolenaar  CheckScriptFailure([
28422c5ed4e3SBram Moolenaar      'vim9script',
28432c5ed4e3SBram Moolenaar      'gui#comment'
2844f8103f27SBram Moolenaar      ], 'E1144:')
28452c5ed4e3SBram Moolenaar  CheckScriptFailure([
28462c5ed4e3SBram Moolenaar      'vim9script',
28472c5ed4e3SBram Moolenaar      'gui -f#comment'
28482c5ed4e3SBram Moolenaar      ], 'E499:')
28497a092245SBram Moolenaarenddef
28507a092245SBram Moolenaar
2851a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
28526797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
28536797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2854a26b9700SBram Moolenaar
2855a26b9700SBram Moolenaar  edit test.vim
2856a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2857a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2858a26b9700SBram Moolenaar
2859a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2860a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2861a26b9700SBram Moolenaar
2862a26b9700SBram Moolenaar  g:entered = 0
2863a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2864a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2865a26b9700SBram Moolenaar
2866a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2867a26b9700SBram Moolenaar
2868a26b9700SBram Moolenaar  au! TabEnter
2869a26b9700SBram Moolenaar  unlet g:entered
2870d72c1bf0SBram Moolenaar
2871d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2872d72c1bf0SBram Moolenaar      'vim9script',
28736797966dSBram Moolenaar      'g:var = 123',
2874e55b1c09SBram Moolenaar      'b:var = 456',
2875e55b1c09SBram Moolenaar      'w:var = 777',
2876e55b1c09SBram Moolenaar      't:var = 888',
2877d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2878d72c1bf0SBram Moolenaar      ])
2879d72c1bf0SBram Moolenaar
2880d72c1bf0SBram Moolenaar  CheckScriptFailure([
2881d72c1bf0SBram Moolenaar      'vim9script',
2882cfcd011fSBram Moolenaar      'let var = 123',
2883cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2884cfcd011fSBram Moolenaar
2885cfcd011fSBram Moolenaar  CheckScriptFailure([
2886cfcd011fSBram Moolenaar      'vim9script',
2887cfcd011fSBram Moolenaar      'var g:var = 123',
2888e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2889e55b1c09SBram Moolenaar
2890e55b1c09SBram Moolenaar  CheckScriptFailure([
2891e55b1c09SBram Moolenaar      'vim9script',
2892cfcd011fSBram Moolenaar      'var b:var = 123',
2893e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2894e55b1c09SBram Moolenaar
2895e55b1c09SBram Moolenaar  CheckScriptFailure([
2896e55b1c09SBram Moolenaar      'vim9script',
2897cfcd011fSBram Moolenaar      'var w:var = 123',
2898e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2899e55b1c09SBram Moolenaar
2900e55b1c09SBram Moolenaar  CheckScriptFailure([
2901e55b1c09SBram Moolenaar      'vim9script',
2902cfcd011fSBram Moolenaar      'var t:var = 123',
2903e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2904e55b1c09SBram Moolenaar
2905e55b1c09SBram Moolenaar  CheckScriptFailure([
2906e55b1c09SBram Moolenaar      'vim9script',
2907cfcd011fSBram Moolenaar      'var v:version = 123',
2908e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2909e55b1c09SBram Moolenaar
2910e55b1c09SBram Moolenaar  CheckScriptFailure([
2911e55b1c09SBram Moolenaar      'vim9script',
2912cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2913e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
29146797966dSBram Moolenaar
29156797966dSBram Moolenaar  CheckScriptFailure([
29166797966dSBram Moolenaar      'vim9script',
29176797966dSBram Moolenaar      'g:var = 123',
291832e35117SBram Moolenaar      'unlet g:var# comment1',
2919d72c1bf0SBram Moolenaar      ], 'E108:')
2920d72c1bf0SBram Moolenaar
2921d72c1bf0SBram Moolenaar  CheckScriptFailure([
2922d72c1bf0SBram Moolenaar      'let g:var = 123',
2923d72c1bf0SBram Moolenaar      'unlet g:var # something',
2924d72c1bf0SBram Moolenaar      ], 'E488:')
2925faac4104SBram Moolenaar
2926faac4104SBram Moolenaar  CheckScriptSuccess([
2927faac4104SBram Moolenaar      'vim9script',
292832e35117SBram Moolenaar      'if 1 # comment2',
2929faac4104SBram Moolenaar      '  echo "yes"',
2930faac4104SBram Moolenaar      'elseif 2 #comment',
2931faac4104SBram Moolenaar      '  echo "no"',
2932faac4104SBram Moolenaar      'endif',
2933faac4104SBram Moolenaar      ])
2934faac4104SBram Moolenaar
2935faac4104SBram Moolenaar  CheckScriptFailure([
2936faac4104SBram Moolenaar      'vim9script',
293732e35117SBram Moolenaar      'if 1# comment3',
2938faac4104SBram Moolenaar      '  echo "yes"',
2939faac4104SBram Moolenaar      'endif',
2940faac4104SBram Moolenaar      ], 'E15:')
2941faac4104SBram Moolenaar
2942faac4104SBram Moolenaar  CheckScriptFailure([
2943faac4104SBram Moolenaar      'vim9script',
294432e35117SBram Moolenaar      'if 0 # comment4',
2945faac4104SBram Moolenaar      '  echo "yes"',
2946faac4104SBram Moolenaar      'elseif 2#comment',
2947faac4104SBram Moolenaar      '  echo "no"',
2948faac4104SBram Moolenaar      'endif',
2949faac4104SBram Moolenaar      ], 'E15:')
2950faac4104SBram Moolenaar
2951faac4104SBram Moolenaar  CheckScriptSuccess([
2952faac4104SBram Moolenaar      'vim9script',
2953cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2954faac4104SBram Moolenaar      ])
2955faac4104SBram Moolenaar
2956faac4104SBram Moolenaar  CheckScriptFailure([
2957faac4104SBram Moolenaar      'vim9script',
2958cfcd011fSBram Moolenaar      'var v = 1# comment6',
295932e35117SBram Moolenaar      ], 'E15:')
2960faac4104SBram Moolenaar
2961faac4104SBram Moolenaar  CheckScriptSuccess([
2962faac4104SBram Moolenaar      'vim9script',
2963faac4104SBram Moolenaar      'new'
2964d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2965df069eecSBram Moolenaar      ':$',
2966faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2967faac4104SBram Moolenaar      'bwipe!',
2968faac4104SBram Moolenaar      ])
2969faac4104SBram Moolenaar
2970f5be8cdbSBram Moolenaar  CheckScriptFailure([
2971f5be8cdbSBram Moolenaar      'vim9script',
2972f5be8cdbSBram Moolenaar      'new'
2973d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2974f5be8cdbSBram Moolenaar      ':$',
2975f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2976f5be8cdbSBram Moolenaar      'bwipe!',
2977f5be8cdbSBram Moolenaar      ], 'E488:')
2978f5be8cdbSBram Moolenaar
2979f5be8cdbSBram Moolenaar  CheckScriptFailure([
2980f5be8cdbSBram Moolenaar      'vim9script',
2981f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2982f5be8cdbSBram Moolenaar      ], 'E477:')
2983a26b9700SBram Moolenaarenddef
2984a26b9700SBram Moolenaar
29857e5bd91dSBram Moolenaardef Test_finish()
2986cfcd011fSBram Moolenaar  var lines =<< trim END
29877e5bd91dSBram Moolenaar    vim9script
29886797966dSBram Moolenaar    g:res = 'one'
29897e5bd91dSBram Moolenaar    if v:false | finish | endif
29906797966dSBram Moolenaar    g:res = 'two'
29917e5bd91dSBram Moolenaar    finish
29926797966dSBram Moolenaar    g:res = 'three'
29937e5bd91dSBram Moolenaar  END
29947e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
29957e5bd91dSBram Moolenaar  source Xfinished
29967e5bd91dSBram Moolenaar  assert_equal('two', g:res)
29977e5bd91dSBram Moolenaar
29987e5bd91dSBram Moolenaar  unlet g:res
29997e5bd91dSBram Moolenaar  delete('Xfinished')
30007e5bd91dSBram Moolenaarenddef
30017e5bd91dSBram Moolenaar
3002a5d0077eSBram Moolenaardef Test_forward_declaration()
3003cfcd011fSBram Moolenaar  var lines =<< trim END
3004a5d0077eSBram Moolenaar    vim9script
3005a5d0077eSBram Moolenaar    def GetValue(): string
3006a5d0077eSBram Moolenaar      return theVal
3007a5d0077eSBram Moolenaar    enddef
3008cfcd011fSBram Moolenaar    var theVal = 'something'
3009822ba247SBram Moolenaar    g:initVal = GetValue()
3010a5d0077eSBram Moolenaar    theVal = 'else'
3011a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3012a5d0077eSBram Moolenaar  END
3013a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3014a5d0077eSBram Moolenaar  source Xforward
3015a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3016a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3017a5d0077eSBram Moolenaar
3018a5d0077eSBram Moolenaar  unlet g:initVal
3019a5d0077eSBram Moolenaar  unlet g:laterVal
3020a5d0077eSBram Moolenaar  delete('Xforward')
3021a5d0077eSBram Moolenaarenddef
3022a5d0077eSBram Moolenaar
30239721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3024a6294955SBram Moolenaar  var vim9_lines =<< trim END
3025a6294955SBram Moolenaar    vim9script
3026a6294955SBram Moolenaar    var local = 'local'
3027a6294955SBram Moolenaar    g:global = 'global'
3028a6294955SBram Moolenaar    export var exported = 'exported'
3029a6294955SBram Moolenaar    export def GetText(): string
3030a6294955SBram Moolenaar       return 'text'
3031a6294955SBram Moolenaar    enddef
3032a6294955SBram Moolenaar  END
3033a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3034a6294955SBram Moolenaar
3035cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
30369721fb4eSBram Moolenaar    source Xvim9_script.vim
30379721fb4eSBram Moolenaar
30389721fb4eSBram Moolenaar    call assert_false(exists('local'))
30399721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30409721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
30419721fb4eSBram Moolenaar    call assert_equal('global', global)
30429721fb4eSBram Moolenaar    call assert_equal('global', g:global)
30439721fb4eSBram Moolenaar
30449721fb4eSBram Moolenaar    " imported variable becomes script-local
30459721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
30469721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
30479721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30489721fb4eSBram Moolenaar
30499721fb4eSBram Moolenaar    " imported function becomes script-local
30509721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
30519721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
30529721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
30539721fb4eSBram Moolenaar  END
30549721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
30559721fb4eSBram Moolenaar
30569721fb4eSBram Moolenaar  source Xlegacy_script.vim
30579721fb4eSBram Moolenaar  assert_equal('global', g:global)
3058f5be8cdbSBram Moolenaar  unlet g:global
30599721fb4eSBram Moolenaar
30609721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
30619721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
30629721fb4eSBram Moolenaarenddef
3063a5d0077eSBram Moolenaar
30647d699701SBram Moolenaarfunc Test_vim9script_not_global()
30657d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
30667d699701SBram Moolenaar  let vim9lines =<< trim END
30677d699701SBram Moolenaar    vim9script
3068cfcd011fSBram Moolenaar    var name = 'local'
30697d699701SBram Moolenaar    func TheFunc()
30707d699701SBram Moolenaar      echo 'local'
30717d699701SBram Moolenaar    endfunc
30727d699701SBram Moolenaar    def DefFunc()
30737d699701SBram Moolenaar      echo 'local'
30747d699701SBram Moolenaar    enddef
30757d699701SBram Moolenaar  END
30767d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
30777d699701SBram Moolenaar  source Xvim9script.vim
30787d699701SBram Moolenaar  try
30797d699701SBram Moolenaar    echo g:var
30807d699701SBram Moolenaar    assert_report('did not fail')
30817d699701SBram Moolenaar  catch /E121:/
30827d699701SBram Moolenaar    " caught
30837d699701SBram Moolenaar  endtry
30847d699701SBram Moolenaar  try
30857d699701SBram Moolenaar    call TheFunc()
30867d699701SBram Moolenaar    assert_report('did not fail')
30877d699701SBram Moolenaar  catch /E117:/
30887d699701SBram Moolenaar    " caught
30897d699701SBram Moolenaar  endtry
30907d699701SBram Moolenaar  try
30917d699701SBram Moolenaar    call DefFunc()
30927d699701SBram Moolenaar    assert_report('did not fail')
30937d699701SBram Moolenaar  catch /E117:/
30947d699701SBram Moolenaar    " caught
30957d699701SBram Moolenaar  endtry
30967d699701SBram Moolenaar
309725859dd7SBram Moolenaar  call delete('Xvim9script.vim')
30987d699701SBram Moolenaarendfunc
30997d699701SBram Moolenaar
3100eeb27bfeSBram Moolenaardef Test_vim9_copen()
3101eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3102eeb27bfeSBram Moolenaar  copen
3103eeb27bfeSBram Moolenaar  quit
3104eeb27bfeSBram Moolenaarenddef
3105eeb27bfeSBram Moolenaar
310603290b84SBram Moolenaar" test using an auto-loaded function and variable
31072d6b20d6SBram Moolenaardef Test_vim9_autoload()
3108cfcd011fSBram Moolenaar  var lines =<< trim END
31092d6b20d6SBram Moolenaar     vim9script
311003290b84SBram Moolenaar     def some#gettest(): string
311103290b84SBram Moolenaar       return 'test'
311203290b84SBram Moolenaar     enddef
311303290b84SBram Moolenaar     g:some#name = 'name'
311403290b84SBram Moolenaar  END
311503290b84SBram Moolenaar
311603290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
311703290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
311803290b84SBram Moolenaar  var save_rtp = &rtp
311903290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
312003290b84SBram Moolenaar
312103290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
312203290b84SBram Moolenaar  assert_equal('name', g:some#name)
312303290b84SBram Moolenaar  g:some#other = 'other'
312403290b84SBram Moolenaar  assert_equal('other', g:some#other)
312503290b84SBram Moolenaar
312617f700acSBram Moolenaar  # upper case script name works
312717f700acSBram Moolenaar  lines =<< trim END
312817f700acSBram Moolenaar     vim9script
312917f700acSBram Moolenaar     def Other#getOther(): string
313017f700acSBram Moolenaar       return 'other'
313117f700acSBram Moolenaar     enddef
313217f700acSBram Moolenaar  END
313317f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
313417f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
313517f700acSBram Moolenaar
313603290b84SBram Moolenaar  delete('Xdir', 'rf')
313703290b84SBram Moolenaar  &rtp = save_rtp
313803290b84SBram Moolenaarenddef
313903290b84SBram Moolenaar
314003290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
314103290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
314203290b84SBram Moolenaar  var lines =<< trim END
314303290b84SBram Moolenaar     vim9script
31442d6b20d6SBram Moolenaar     def foo#test()
31452d6b20d6SBram Moolenaar         echomsg getreg('"')
31462d6b20d6SBram Moolenaar     enddef
31472d6b20d6SBram Moolenaar  END
31482d6b20d6SBram Moolenaar
31492d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
31502d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3151cfcd011fSBram Moolenaar  var save_rtp = &rtp
31522d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
31532d6b20d6SBram Moolenaar  augroup test
31542d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
31552d6b20d6SBram Moolenaar  augroup END
31562d6b20d6SBram Moolenaar
31572d6b20d6SBram Moolenaar  normal Y
31582d6b20d6SBram Moolenaar
31592d6b20d6SBram Moolenaar  augroup test
31602d6b20d6SBram Moolenaar    autocmd!
31612d6b20d6SBram Moolenaar  augroup END
31622d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
31632d6b20d6SBram Moolenaar  &rtp = save_rtp
31642d6b20d6SBram Moolenaarenddef
31652d6b20d6SBram Moolenaar
316677e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
316777e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3168cfcd011fSBram Moolenaar  var lines =<< trim END
316977e5dcc3SBram Moolenaar      vim9script
317077e5dcc3SBram Moolenaar      def crash#func()
317177e5dcc3SBram Moolenaar          try
317277e5dcc3SBram Moolenaar              for x in List()
317377e5dcc3SBram Moolenaar              endfor
317477e5dcc3SBram Moolenaar          catch
317577e5dcc3SBram Moolenaar          endtry
317677e5dcc3SBram Moolenaar          g:ok = true
317777e5dcc3SBram Moolenaar      enddef
317877e5dcc3SBram Moolenaar      fu List()
317977e5dcc3SBram Moolenaar          invalid
318077e5dcc3SBram Moolenaar      endfu
318177e5dcc3SBram Moolenaar      try
318248e11c10SBram Moolenaar          alsoinvalid
318377e5dcc3SBram Moolenaar      catch /wontmatch/
318477e5dcc3SBram Moolenaar      endtry
318577e5dcc3SBram Moolenaar  END
318677e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
318777e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
318877e5dcc3SBram Moolenaar
318977e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
319077e5dcc3SBram Moolenaar  lines =<< trim END
319177e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
319277e5dcc3SBram Moolenaar    call crash#func()
319377e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
31949c4f5520SBram Moolenaar    qall!
319577e5dcc3SBram Moolenaar  END
319677e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
319777e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
319877e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
319977e5dcc3SBram Moolenaar
320077e5dcc3SBram Moolenaar  delete('Xdidit')
320177e5dcc3SBram Moolenaar  delete('Xscript')
320277e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
320303290b84SBram Moolenaar
320403290b84SBram Moolenaar  lines =<< trim END
320503290b84SBram Moolenaar    vim9script
320603290b84SBram Moolenaar    var foo#bar = 'asdf'
320703290b84SBram Moolenaar  END
320803290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
320977e5dcc3SBram Moolenaarenddef
321077e5dcc3SBram Moolenaar
321181e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
321281e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
321381e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3214cfcd011fSBram Moolenaar  var lines =<< trim END
321581e17fbeSBram Moolenaar    let s:counter = 1
321681e17fbeSBram Moolenaar    def s:Func()
321781e17fbeSBram Moolenaar      au! CursorHold
321881e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
321981e17fbeSBram Moolenaar    enddef
322081e17fbeSBram Moolenaar    call s:Func()
322181e17fbeSBram Moolenaar    doau CursorHold
322281e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
322381e17fbeSBram Moolenaar    au! CursorHold
322481e17fbeSBram Moolenaar  END
322581e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
322681e17fbeSBram Moolenaarenddef
322781e17fbeSBram Moolenaar
32283896a105SBram Moolenaardef Test_cmdline_win()
32293896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
32303896a105SBram Moolenaar  # the command line window.
32313896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3232cfcd011fSBram Moolenaar  var export_lines =<< trim END
32333896a105SBram Moolenaar    vim9script
3234cfcd011fSBram Moolenaar    export var That = 'yes'
32353896a105SBram Moolenaar  END
32363896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3237cfcd011fSBram Moolenaar  var import_lines =<< trim END
32383896a105SBram Moolenaar    vim9script
32393896a105SBram Moolenaar    import That from './Xexport.vim'
32403896a105SBram Moolenaar  END
32413896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3242cfcd011fSBram Moolenaar  var save_rtp = &rtp
32433896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
32443896a105SBram Moolenaar  syntax on
32453896a105SBram Moolenaar  augroup CmdWin
32463896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
32473896a105SBram Moolenaar  augroup END
32483896a105SBram Moolenaar  # this will open and also close the cmdline window
32493896a105SBram Moolenaar  feedkeys('q:', 'xt')
32503896a105SBram Moolenaar  assert_equal('yes', g:got_there)
32513896a105SBram Moolenaar
32523896a105SBram Moolenaar  augroup CmdWin
32533896a105SBram Moolenaar    au!
32543896a105SBram Moolenaar  augroup END
32553896a105SBram Moolenaar  &rtp = save_rtp
32563896a105SBram Moolenaar  delete('rtp', 'rf')
32573896a105SBram Moolenaarenddef
32583896a105SBram Moolenaar
3259e3d4685fSBram Moolenaardef Test_invalid_sid()
3260e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
326125859dd7SBram Moolenaar
32629c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3263d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3264e3d4685fSBram Moolenaar  endif
3265e3d4685fSBram Moolenaar  delete('Xdidit')
3266e3d4685fSBram Moolenaarenddef
3267e3d4685fSBram Moolenaar
32689ec7026fSBram Moolenaardef Test_restoring_cpo()
32699ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
32709ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
32719ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
32729ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
32739ec7026fSBram Moolenaar  endif
32749ec7026fSBram Moolenaar  delete('Xsourced')
32759ec7026fSBram Moolenaar  delete('Xclose')
3276090728adSBram Moolenaar  delete('Xdone')
32770123cc1eSBram Moolenaar
32780123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
32790123cc1eSBram Moolenaar  set cpo=aABceFsMny>
32800123cc1eSBram Moolenaar  edit XanotherScript
32810123cc1eSBram Moolenaar  so %
32820123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
32830123cc1eSBram Moolenaar  :1del
32840123cc1eSBram Moolenaar  w
32850123cc1eSBram Moolenaar  so %
32860123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
32870123cc1eSBram Moolenaar
32880123cc1eSBram Moolenaar  delete('XanotherScript')
32890123cc1eSBram Moolenaar  set cpo&vim
32909ec7026fSBram Moolenaarenddef
32919ec7026fSBram Moolenaar
32929ec7026fSBram Moolenaar
3293f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3294cfcd011fSBram Moolenaar  var lines =<< trim END
3295cfcd011fSBram Moolenaar    var name: any
3296cfcd011fSBram Moolenaar    assert_equal(0, name)
3297f0afd9e1SBram Moolenaar  END
3298f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3299f0afd9e1SBram Moolenaarenddef
3300f0afd9e1SBram Moolenaar
33017e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
330258dbef33SBram Moolenaar  CheckRunVimInTerminal
330358dbef33SBram Moolenaar
33047e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
33057e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
33067e9210eaSBram Moolenaarendfunc
33077e9210eaSBram Moolenaar
33087e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
33099c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3310cfcd011fSBram Moolenaar  var lines =<< trim END
33119c4f5520SBram Moolenaar    func CheckAndQuit()
33129c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
33139c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
33149c4f5520SBram Moolenaar    endfunc
33159c4f5520SBram Moolenaar  END
33169c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
33179c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3318e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
33199c4f5520SBram Moolenaar  # define Afunc() on the command line
33209c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
33219c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
33222949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
33239c4f5520SBram Moolenaar
33249c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
33259c4f5520SBram Moolenaar  delete('XcallFunc')
33269c4f5520SBram Moolenaar  delete('Xdidcmd')
33279c4f5520SBram Moolenaarenddef
33289c4f5520SBram Moolenaar
3329fcdc5d83SBram Moolenaardef Test_script_var_scope()
3330fcdc5d83SBram Moolenaar  var lines =<< trim END
3331fcdc5d83SBram Moolenaar      vim9script
3332fcdc5d83SBram Moolenaar      if true
3333fcdc5d83SBram Moolenaar        if true
3334fcdc5d83SBram Moolenaar          var one = 'one'
3335fcdc5d83SBram Moolenaar          echo one
3336fcdc5d83SBram Moolenaar        endif
3337fcdc5d83SBram Moolenaar        echo one
3338fcdc5d83SBram Moolenaar      endif
3339fcdc5d83SBram Moolenaar  END
3340fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3341fcdc5d83SBram Moolenaar
3342fcdc5d83SBram Moolenaar  lines =<< trim END
3343fcdc5d83SBram Moolenaar      vim9script
3344fcdc5d83SBram Moolenaar      if true
3345fcdc5d83SBram Moolenaar        if false
3346fcdc5d83SBram Moolenaar          var one = 'one'
3347fcdc5d83SBram Moolenaar          echo one
3348fcdc5d83SBram Moolenaar        else
3349fcdc5d83SBram Moolenaar          var one = 'one'
3350fcdc5d83SBram Moolenaar          echo one
3351fcdc5d83SBram Moolenaar        endif
3352fcdc5d83SBram Moolenaar        echo one
3353fcdc5d83SBram Moolenaar      endif
3354fcdc5d83SBram Moolenaar  END
3355fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3356fcdc5d83SBram Moolenaar
3357fcdc5d83SBram Moolenaar  lines =<< trim END
3358fcdc5d83SBram Moolenaar      vim9script
3359fcdc5d83SBram Moolenaar      while true
3360fcdc5d83SBram Moolenaar        var one = 'one'
3361fcdc5d83SBram Moolenaar        echo one
3362fcdc5d83SBram Moolenaar        break
3363fcdc5d83SBram Moolenaar      endwhile
3364fcdc5d83SBram Moolenaar      echo one
3365fcdc5d83SBram Moolenaar  END
3366fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3367fcdc5d83SBram Moolenaar
3368fcdc5d83SBram Moolenaar  lines =<< trim END
3369fcdc5d83SBram Moolenaar      vim9script
3370fcdc5d83SBram Moolenaar      for i in range(1)
3371fcdc5d83SBram Moolenaar        var one = 'one'
3372fcdc5d83SBram Moolenaar        echo one
3373fcdc5d83SBram Moolenaar      endfor
3374fcdc5d83SBram Moolenaar      echo one
3375fcdc5d83SBram Moolenaar  END
3376fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
33779becdf2bSBram Moolenaar
33789becdf2bSBram Moolenaar  lines =<< trim END
33799becdf2bSBram Moolenaar      vim9script
33809becdf2bSBram Moolenaar      {
33819becdf2bSBram Moolenaar        var one = 'one'
33829becdf2bSBram Moolenaar        assert_equal('one', one)
33839becdf2bSBram Moolenaar      }
33849becdf2bSBram Moolenaar      assert_false(exists('one'))
33859becdf2bSBram Moolenaar      assert_false(exists('s:one'))
33869becdf2bSBram Moolenaar  END
33879becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
33889becdf2bSBram Moolenaar
33899becdf2bSBram Moolenaar  lines =<< trim END
33909becdf2bSBram Moolenaar      vim9script
33919becdf2bSBram Moolenaar      {
33929becdf2bSBram Moolenaar        var one = 'one'
33939becdf2bSBram Moolenaar        echo one
33949becdf2bSBram Moolenaar      }
33959becdf2bSBram Moolenaar      echo one
33969becdf2bSBram Moolenaar  END
33979becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3398fcdc5d83SBram Moolenaarenddef
3399fcdc5d83SBram Moolenaar
3400352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3401352134bbSBram Moolenaar  var lines =<< trim END
3402352134bbSBram Moolenaar    vim9script
3403352134bbSBram Moolenaar    def Callback(...l: any)
3404352134bbSBram Moolenaar      try
3405352134bbSBram Moolenaar        var x: string
3406352134bbSBram Moolenaar        var y: string
3407352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3408352134bbSBram Moolenaar        [x, y] = ['']
3409352134bbSBram Moolenaar      catch
3410352134bbSBram Moolenaar        g:caught = 'yes'
3411352134bbSBram Moolenaar      endtry
3412352134bbSBram Moolenaar    enddef
3413e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3414352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3415352134bbSBram Moolenaar  END
3416352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3417352134bbSBram Moolenaar
3418352134bbSBram Moolenaar  unlet g:caught
3419352134bbSBram Moolenaarenddef
3420352134bbSBram Moolenaar
3421631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3422631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3423631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3424631e8f93SBram Moolenaar  endif
3425631e8f93SBram Moolenaar  var lines =<< trim END
3426631e8f93SBram Moolenaar      vim9script
3427631e8f93SBram Moolenaar      var source: list<number>
3428631e8f93SBram Moolenaar      def Out_cb(...l: any)
3429631e8f93SBram Moolenaar          eval [][0]
3430631e8f93SBram Moolenaar      enddef
3431631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3432631e8f93SBram Moolenaar          sleep 1m
3433631e8f93SBram Moolenaar          source += l
3434631e8f93SBram Moolenaar      enddef
3435e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
34366f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
34376f17a3f0SBram Moolenaar        sleep 10m
34386f17a3f0SBram Moolenaar      endwhile
3439206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3440206c2a6eSBram Moolenaar      sleep 100m
3441631e8f93SBram Moolenaar  END
3442631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3443631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3444631e8f93SBram Moolenaar  delete('Xdef')
3445631e8f93SBram Moolenaarenddef
3446631e8f93SBram Moolenaar
34474324d87aSBram Moolenaardef InvokeNormal()
34484324d87aSBram Moolenaar  exe "norm! :m+1\r"
34494324d87aSBram Moolenaarenddef
34504324d87aSBram Moolenaar
34514324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
34524324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
34534324d87aSBram Moolenaar  new
34544324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
34554324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
34564324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
34574324d87aSBram Moolenaar  xunmap <F3>
3458b5b9480eSBram Moolenaarenddef
3459b5b9480eSBram Moolenaar
3460b5b9480eSBram Moolenaardef Test_white_space_after_command()
3461b5b9480eSBram Moolenaar  var lines =<< trim END
3462b5b9480eSBram Moolenaar    exit_cb: Func})
3463b5b9480eSBram Moolenaar  END
3464b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3465f8103f27SBram Moolenaar
3466f8103f27SBram Moolenaar  lines =<< trim END
3467f8103f27SBram Moolenaar    e#
3468f8103f27SBram Moolenaar  END
3469f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
34704324d87aSBram Moolenaarenddef
34714324d87aSBram Moolenaar
34724aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
34734aab88d9SBram Moolenaar  var lines =<< trim END
34744aab88d9SBram Moolenaar      vim9script
34754aab88d9SBram Moolenaar      if exists('g:guard')
34764aab88d9SBram Moolenaar        finish
34774aab88d9SBram Moolenaar      endif
34784aab88d9SBram Moolenaar      g:guard = 1
34794aab88d9SBram Moolenaar      var name = 'thename'
34804aab88d9SBram Moolenaar      def g:GetName(): string
34814aab88d9SBram Moolenaar        return name
34824aab88d9SBram Moolenaar      enddef
34834aab88d9SBram Moolenaar      def g:SetName(arg: string)
34844aab88d9SBram Moolenaar        name = arg
34854aab88d9SBram Moolenaar      enddef
34864aab88d9SBram Moolenaar  END
34874aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
34884aab88d9SBram Moolenaar  so XscriptTwice.vim
34894aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
34904aab88d9SBram Moolenaar  g:SetName('newname')
34914aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
34924aab88d9SBram Moolenaar  so XscriptTwice.vim
34934aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
34944aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
34954aab88d9SBram Moolenaar
34964aab88d9SBram Moolenaar  delfunc g:GetName
34974aab88d9SBram Moolenaar  delfunc g:SetName
34984aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
34994aab88d9SBram Moolenaar  unlet g:guard
35004aab88d9SBram Moolenaarenddef
35014aab88d9SBram Moolenaar
35024aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
35034aab88d9SBram Moolenaar  var exportlines =<< trim END
35044aab88d9SBram Moolenaar      vim9script
35054aab88d9SBram Moolenaar      if exists('g:guard')
35064aab88d9SBram Moolenaar        finish
35074aab88d9SBram Moolenaar      endif
35084aab88d9SBram Moolenaar      g:guard = 1
35094aab88d9SBram Moolenaar      export var name = 'someName'
35104aab88d9SBram Moolenaar  END
35114aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
35124aab88d9SBram Moolenaar
35134aab88d9SBram Moolenaar  var lines =<< trim END
35144aab88d9SBram Moolenaar      vim9script
35154aab88d9SBram Moolenaar      import name from './XexportScript.vim'
35164aab88d9SBram Moolenaar      def g:GetName(): string
35174aab88d9SBram Moolenaar        return name
35184aab88d9SBram Moolenaar      enddef
35194aab88d9SBram Moolenaar  END
35204aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
35214aab88d9SBram Moolenaar  so XscriptImport.vim
35224aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
35234aab88d9SBram Moolenaar
35244aab88d9SBram Moolenaar  so XexportScript.vim
35254aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
35264aab88d9SBram Moolenaar
35274aab88d9SBram Moolenaar  delfunc g:GetName
35284aab88d9SBram Moolenaar  delete('XexportScript.vim')
35294aab88d9SBram Moolenaar  delete('XscriptImport.vim')
35304aab88d9SBram Moolenaar  unlet g:guard
35314aab88d9SBram Moolenaarenddef
35324aab88d9SBram Moolenaar
353310b9421fSBram Moolenaardef Test_unsupported_commands()
353410b9421fSBram Moolenaar  var lines =<< trim END
353510b9421fSBram Moolenaar      ka
353610b9421fSBram Moolenaar  END
353710b9421fSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1100:')
353810b9421fSBram Moolenaar
353910b9421fSBram Moolenaar  lines =<< trim END
3540ada1d870SBram Moolenaar      :1ka
3541ada1d870SBram Moolenaar  END
3542ada1d870SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E481:')
3543ada1d870SBram Moolenaar
3544ada1d870SBram Moolenaar  lines =<< trim END
354510b9421fSBram Moolenaar    t
354610b9421fSBram Moolenaar  END
354710b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
354810b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
354910b9421fSBram Moolenaar
355010b9421fSBram Moolenaar  lines =<< trim END
355110b9421fSBram Moolenaar    x
355210b9421fSBram Moolenaar  END
355310b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
355410b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
355510b9421fSBram Moolenaar
355610b9421fSBram Moolenaar  lines =<< trim END
355710b9421fSBram Moolenaar    xit
355810b9421fSBram Moolenaar  END
355910b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
356010b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
356110b9421fSBram Moolenaarenddef
356210b9421fSBram Moolenaar
3563585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3564585fea7bSBram Moolenaardef Test_substitute_cmd()
3565585fea7bSBram Moolenaar  new
3566585fea7bSBram Moolenaar  setline(1, 'something')
3567585fea7bSBram Moolenaar  :substitute(some(other(
3568585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3569585fea7bSBram Moolenaar  bwipe!
3570585fea7bSBram Moolenaar
3571f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3572cfcd011fSBram Moolenaar  var lines =<< trim END
3573585fea7bSBram Moolenaar    vim9script
3574585fea7bSBram Moolenaar    new
3575585fea7bSBram Moolenaar    setline(1, 'something')
3576585fea7bSBram Moolenaar    :substitute(some(other(
3577585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3578585fea7bSBram Moolenaar    bwipe!
3579585fea7bSBram Moolenaar  END
3580585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3581585fea7bSBram Moolenaar  source Xvim9lines
3582585fea7bSBram Moolenaar
3583585fea7bSBram Moolenaar  delete('Xvim9lines')
3584585fea7bSBram Moolenaarenddef
3585585fea7bSBram Moolenaar
35868a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3587