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
592*9cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
593*9cb577a6SBram Moolenaar  # return in try block returns normally
594*9cb577a6SBram Moolenaar  def ReturnInTry(): string
595*9cb577a6SBram Moolenaar    try
596*9cb577a6SBram Moolenaar      return '"some message"'
597*9cb577a6SBram Moolenaar    catch
598*9cb577a6SBram Moolenaar    endtry
599*9cb577a6SBram Moolenaar    return 'not reached'
600*9cb577a6SBram Moolenaar  enddef
601*9cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
602*9cb577a6SBram Moolenaarenddef
603*9cb577a6SBram 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
9218a7d6542SBram MoolenaarEND
9228a7d6542SBram Moolenaar
923b3ca9824SBram Moolenaardef Undo_export_script_lines()
924b3ca9824SBram Moolenaar  unlet g:result
925b3ca9824SBram Moolenaar  unlet g:localname
926b3ca9824SBram Moolenaarenddef
927b3ca9824SBram Moolenaar
9285269bd2aSBram Moolenaardef Test_vim9_import_export()
929cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
9308a7d6542SBram Moolenaar    vim9script
9318a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
9328a7d6542SBram Moolenaar    g:imported = exported
9336e587dcbSBram Moolenaar    exported += 3
9346e587dcbSBram Moolenaar    g:imported_added = exported
9358a7d6542SBram Moolenaar    g:imported_func = Exported()
9366e587dcbSBram Moolenaar
93740f4f7a4SBram Moolenaar    def GetExported(): string
938e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
93940f4f7a4SBram Moolenaar      return local_dict.ref()
94040f4f7a4SBram Moolenaar    enddef
94140f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
94240f4f7a4SBram Moolenaar
9436e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
9446e587dcbSBram Moolenaar    g:imported_name = exp_name
9456e587dcbSBram Moolenaar    exp_name ..= ' Doe'
9466e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
9475381c7a1SBram Moolenaar    g:imported_later = exported
9488a7d6542SBram Moolenaar  END
9498a7d6542SBram Moolenaar
9508a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
9518a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
9528a7d6542SBram Moolenaar
9538a7d6542SBram Moolenaar  source Ximport.vim
9548a7d6542SBram Moolenaar
9558a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
9568a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
9578a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
9586e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
9595381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
9608a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
96140f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
9626e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
9636e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
9648a7d6542SBram Moolenaar  assert_false(exists('g:name'))
9658a7d6542SBram Moolenaar
966b3ca9824SBram Moolenaar  Undo_export_script_lines()
9678a7d6542SBram Moolenaar  unlet g:imported
9686e587dcbSBram Moolenaar  unlet g:imported_added
9695381c7a1SBram Moolenaar  unlet g:imported_later
9708a7d6542SBram Moolenaar  unlet g:imported_func
9716e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
9728a7d6542SBram Moolenaar  delete('Ximport.vim')
973f2d5c240SBram Moolenaar
9741c991144SBram Moolenaar  # similar, with line breaks
975cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
9761c991144SBram Moolenaar    vim9script
9771c991144SBram Moolenaar    import {
9781c991144SBram Moolenaar        exported,
9791c991144SBram Moolenaar        Exported,
9801c991144SBram Moolenaar        }
9811c991144SBram Moolenaar        from
9821c991144SBram Moolenaar        './Xexport.vim'
9831c991144SBram Moolenaar    g:imported = exported
9841c991144SBram Moolenaar    exported += 5
9851c991144SBram Moolenaar    g:imported_added = exported
9861c991144SBram Moolenaar    g:imported_func = Exported()
9871c991144SBram Moolenaar  END
9881c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
9891c991144SBram Moolenaar  source Ximport_lbr.vim
9901c991144SBram Moolenaar
9911c991144SBram Moolenaar  assert_equal(9876, g:imported)
9921c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
9931c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
9941c991144SBram Moolenaar
9951c991144SBram Moolenaar  # exported script not sourced again
9961c991144SBram Moolenaar  assert_false(exists('g:result'))
9971c991144SBram Moolenaar  unlet g:imported
9981c991144SBram Moolenaar  unlet g:imported_added
9991c991144SBram Moolenaar  unlet g:imported_func
10001c991144SBram Moolenaar  delete('Ximport_lbr.vim')
10011c991144SBram Moolenaar
10021c991144SBram Moolenaar  # import inside :def function
1003cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
10045381c7a1SBram Moolenaar    vim9script
10055381c7a1SBram Moolenaar    def ImportInDef()
10065381c7a1SBram Moolenaar      import exported from './Xexport.vim'
10075381c7a1SBram Moolenaar      g:imported = exported
10085381c7a1SBram Moolenaar      exported += 7
10095381c7a1SBram Moolenaar      g:imported_added = exported
10105381c7a1SBram Moolenaar    enddef
10115381c7a1SBram Moolenaar    ImportInDef()
10125381c7a1SBram Moolenaar  END
10135381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
10145381c7a1SBram Moolenaar  source Ximport2.vim
1015f5be8cdbSBram Moolenaar  # TODO: this should be 9879
10165381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
10175381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
10185381c7a1SBram Moolenaar  unlet g:imported
10195381c7a1SBram Moolenaar  unlet g:imported_added
10205381c7a1SBram Moolenaar  delete('Ximport2.vim')
10215381c7a1SBram Moolenaar
1022cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1023f2d5c240SBram Moolenaar    vim9script
1024f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1025f2d5c240SBram Moolenaar    def UseExport()
1026f2d5c240SBram Moolenaar      g:imported = Export.exported
1027f2d5c240SBram Moolenaar    enddef
1028f2d5c240SBram Moolenaar    UseExport()
1029f2d5c240SBram Moolenaar  END
1030f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1031f2d5c240SBram Moolenaar  source Ximport.vim
10325381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1033f2d5c240SBram Moolenaar
1034cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1035599c89c8SBram Moolenaar    vim9script
1036599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1037599c89c8SBram Moolenaar    def Func()
1038cfcd011fSBram Moolenaar      var dummy = 1
1039cfcd011fSBram Moolenaar      var imported = Export + dummy
1040599c89c8SBram Moolenaar    enddef
1041822ba247SBram Moolenaar    defcompile
1042599c89c8SBram Moolenaar  END
1043599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
104444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1045599c89c8SBram Moolenaar
1046cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1047599c89c8SBram Moolenaar    vim9script
1048599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1049599c89c8SBram Moolenaar    def Func()
1050cfcd011fSBram Moolenaar      var imported = Export . exported
1051599c89c8SBram Moolenaar    enddef
1052822ba247SBram Moolenaar    defcompile
1053599c89c8SBram Moolenaar  END
1054599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
105544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1056599c89c8SBram Moolenaar
1057a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1058a6294955SBram Moolenaar    vim9script
1059a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1060a6294955SBram Moolenaar    var some = 'other'
1061a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1062a6294955SBram Moolenaar    defcompile
1063a6294955SBram Moolenaar  END
1064a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1065a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1066a6294955SBram Moolenaar
1067cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1068599c89c8SBram Moolenaar    vim9script
1069599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1070599c89c8SBram Moolenaar    def Func()
1071cfcd011fSBram Moolenaar      var imported = Export.
1072599c89c8SBram Moolenaar    enddef
1073822ba247SBram Moolenaar    defcompile
1074599c89c8SBram Moolenaar  END
1075599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
107644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1077599c89c8SBram Moolenaar
1078cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
10791c991144SBram Moolenaar    vim9script
10801c991144SBram Moolenaar    import *
10811c991144SBram Moolenaar        as Export
10821c991144SBram Moolenaar        from
10831c991144SBram Moolenaar        './Xexport.vim'
10841c991144SBram Moolenaar    def UseExport()
10851c991144SBram Moolenaar      g:imported = Export.exported
10861c991144SBram Moolenaar    enddef
10871c991144SBram Moolenaar    UseExport()
10881c991144SBram Moolenaar  END
10891c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
10901c991144SBram Moolenaar  source Ximport.vim
10911c991144SBram Moolenaar  assert_equal(9883, g:imported)
10921c991144SBram Moolenaar
1093cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1094f2d5c240SBram Moolenaar    vim9script
1095f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1096f2d5c240SBram Moolenaar  END
1097f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
109844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1099f2d5c240SBram Moolenaar
1100f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1101cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1102fa29c8abSBram Moolenaar    vim9script
1103fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1104fa29c8abSBram Moolenaar  END
1105fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
110644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1107fa29c8abSBram Moolenaar
1108f5be8cdbSBram Moolenaar  # try to import something that is already defined
1109cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
11105269bd2aSBram Moolenaar    vim9script
1111cfcd011fSBram Moolenaar    var exported = 'something'
11125269bd2aSBram Moolenaar    import exported from './Xexport.vim'
11135269bd2aSBram Moolenaar  END
11145269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
111544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
11165269bd2aSBram Moolenaar
1117f5be8cdbSBram Moolenaar  # try to import something that is already defined
11185269bd2aSBram Moolenaar  import_already_defined =<< trim END
11195269bd2aSBram Moolenaar    vim9script
1120cfcd011fSBram Moolenaar    var exported = 'something'
11215269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
11225269bd2aSBram Moolenaar  END
11235269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
112444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
11255269bd2aSBram Moolenaar
1126f5be8cdbSBram Moolenaar  # try to import something that is already defined
11275269bd2aSBram Moolenaar  import_already_defined =<< trim END
11285269bd2aSBram Moolenaar    vim9script
1129cfcd011fSBram Moolenaar    var exported = 'something'
11305269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
11315269bd2aSBram Moolenaar  END
11325269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
113344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
11345269bd2aSBram Moolenaar
1135918a4249SBram Moolenaar  # try changing an imported const
1136918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1137918a4249SBram Moolenaar    vim9script
1138918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1139918a4249SBram Moolenaar    def Assign()
1140918a4249SBram Moolenaar      CONST = 987
1141918a4249SBram Moolenaar    enddef
1142918a4249SBram Moolenaar    defcompile
1143918a4249SBram Moolenaar  END
1144918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1145918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1146918a4249SBram Moolenaar
1147f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1148cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1149fa29c8abSBram Moolenaar    vim9script
1150fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1151fa29c8abSBram Moolenaar  END
1152fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
115344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1154fa29c8abSBram Moolenaar
1155cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1156fa29c8abSBram Moolenaar    vim9script
1157fa29c8abSBram Moolenaar    import name './Xexport.vim'
1158fa29c8abSBram Moolenaar  END
1159fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
116044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1161fa29c8abSBram Moolenaar
1162cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1163fa29c8abSBram Moolenaar    vim9script
1164fa29c8abSBram Moolenaar    import name from Xexport.vim
1165fa29c8abSBram Moolenaar  END
1166fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
116744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1168fa29c8abSBram Moolenaar
1169cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1170fa29c8abSBram Moolenaar    vim9script
1171fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1172fa29c8abSBram Moolenaar  END
1173fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
117444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1175fa29c8abSBram Moolenaar
1176cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1177fa29c8abSBram Moolenaar    vim9script
1178fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1179fa29c8abSBram Moolenaar  END
11805269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
118144d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1182fa29c8abSBram Moolenaar
1183f2d5c240SBram Moolenaar  delete('Ximport.vim')
11845269bd2aSBram Moolenaar  delete('Ximport3.vim')
11858a7d6542SBram Moolenaar  delete('Xexport.vim')
11868a7d6542SBram Moolenaar
1187f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1188750802b5SBram Moolenaar  set cpo&vi
1189cfcd011fSBram Moolenaar  var cpo_before = &cpo
1190cfcd011fSBram Moolenaar  var lines =<< trim END
1191750802b5SBram Moolenaar    vim9script
1192750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1193750802b5SBram Moolenaar  END
1194750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1195750802b5SBram Moolenaar  source Xvim9_script
1196750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1197750802b5SBram Moolenaar  set cpo&vim
1198750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1199750802b5SBram Moolenaar  delete('Xvim9_script')
1200750802b5SBram Moolenaarenddef
1201750802b5SBram Moolenaar
1202803af686SBram Moolenaarfunc g:Trigger()
1203803af686SBram Moolenaar  source Ximport.vim
1204803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1205803af686SBram Moolenaarendfunc
1206803af686SBram Moolenaar
1207803af686SBram Moolenaardef Test_import_export_expr_map()
1208803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1209cfcd011fSBram Moolenaar  var export_lines =<< trim END
1210803af686SBram Moolenaar    vim9script
1211803af686SBram Moolenaar    export def That(): string
1212803af686SBram Moolenaar      return 'yes'
1213803af686SBram Moolenaar    enddef
1214803af686SBram Moolenaar  END
1215803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1216803af686SBram Moolenaar
1217cfcd011fSBram Moolenaar  var import_lines =<< trim END
1218803af686SBram Moolenaar    vim9script
1219803af686SBram Moolenaar    import That from './Xexport_that.vim'
1220803af686SBram Moolenaar    assert_equal('yes', That())
1221803af686SBram Moolenaar  END
1222803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1223803af686SBram Moolenaar
1224803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1225803af686SBram Moolenaar  feedkeys('trigger', "xt")
1226803af686SBram Moolenaar
1227730b2483SBram Moolenaar  delete('Xexport_that.vim')
1228803af686SBram Moolenaar  delete('Ximport.vim')
1229803af686SBram Moolenaar  nunmap trigger
1230803af686SBram Moolenaarenddef
1231803af686SBram Moolenaar
12328e1986e3SBram Moolenaardef Test_import_in_filetype()
12338e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
12348e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1235cfcd011fSBram Moolenaar  var export_lines =<< trim END
12368e1986e3SBram Moolenaar    vim9script
1237cfcd011fSBram Moolenaar    export var That = 'yes'
12388e1986e3SBram Moolenaar  END
1239730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
12408e1986e3SBram Moolenaar
1241cfcd011fSBram Moolenaar  var import_lines =<< trim END
12428e1986e3SBram Moolenaar    vim9script
1243730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
12448e1986e3SBram Moolenaar    assert_equal('yes', That)
12458e1986e3SBram Moolenaar    g:did_load_mytpe = 1
12468e1986e3SBram Moolenaar  END
12478e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
12488e1986e3SBram Moolenaar
1249cfcd011fSBram Moolenaar  var save_rtp = &rtp
12508e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
12518e1986e3SBram Moolenaar
12528e1986e3SBram Moolenaar  filetype plugin on
12538e1986e3SBram Moolenaar  copen
12548e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
12558e1986e3SBram Moolenaar
12568e1986e3SBram Moolenaar  quit!
1257730b2483SBram Moolenaar  delete('Xexport_ft.vim')
12588e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
12598e1986e3SBram Moolenaar  &rtp = save_rtp
12608e1986e3SBram Moolenaarenddef
12618e1986e3SBram Moolenaar
1262efa94447SBram Moolenaardef Test_use_import_in_mapping()
1263cfcd011fSBram Moolenaar  var lines =<< trim END
1264efa94447SBram Moolenaar      vim9script
1265efa94447SBram Moolenaar      export def Funcx()
1266efa94447SBram Moolenaar        g:result = 42
1267efa94447SBram Moolenaar      enddef
1268efa94447SBram Moolenaar  END
1269efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1270efa94447SBram Moolenaar  lines =<< trim END
1271efa94447SBram Moolenaar      vim9script
1272efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1273b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1274efa94447SBram Moolenaar  END
1275efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1276efa94447SBram Moolenaar
1277efa94447SBram Moolenaar  source Xmapscript.vim
1278b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1279efa94447SBram Moolenaar  assert_equal(42, g:result)
1280efa94447SBram Moolenaar
1281efa94447SBram Moolenaar  unlet g:result
1282efa94447SBram Moolenaar  delete('XsomeExport.vim')
1283efa94447SBram Moolenaar  delete('Xmapscript.vim')
1284b3ca9824SBram Moolenaar  nunmap <F3>
1285efa94447SBram Moolenaarenddef
1286efa94447SBram Moolenaar
1287d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1288d3f8a9eeSBram Moolenaar  var lines =<< trim END
1289d3f8a9eeSBram Moolenaar    if has(g:feature)
1290d3f8a9eeSBram Moolenaar      " legacy script
1291d3f8a9eeSBram Moolenaar      let g:legacy = 1
1292d3f8a9eeSBram Moolenaar      finish
1293d3f8a9eeSBram Moolenaar    endif
1294d3f8a9eeSBram Moolenaar    vim9script
1295d3f8a9eeSBram Moolenaar    g:legacy = 0
1296d3f8a9eeSBram Moolenaar  END
1297d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1298d3f8a9eeSBram Moolenaar  g:legacy = -1
1299d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1300d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1301d3f8a9eeSBram Moolenaar
1302d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1303d3f8a9eeSBram Moolenaar  g:legacy = -1
1304d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1305d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1306d3f8a9eeSBram Moolenaarenddef
1307d3f8a9eeSBram Moolenaar
1308750802b5SBram Moolenaardef Test_vim9script_fails()
13098a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
13108a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1311cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
13129721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1313cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1314750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1315750802b5SBram Moolenaar
1316cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1317c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1318c785b9a7SBram Moolenaar
1319e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1320e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
13218a7d6542SBram Moolenaarenddef
13228a7d6542SBram Moolenaar
1323f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1324101f4810SBram Moolenaar  CheckRunVimInTerminal
1325101f4810SBram Moolenaar
13269bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1327c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
13289bb3eb3eSBram Moolenaarendfunc
13299bb3eb3eSBram Moolenaar
1330c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1331cfcd011fSBram Moolenaar  var export =<< trim END
1332101f4810SBram Moolenaar    vim9script
1333101f4810SBram Moolenaar    export def Foo(): number
1334101f4810SBram Moolenaar        return 0
1335101f4810SBram Moolenaar    enddef
1336101f4810SBram Moolenaar  END
1337730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1338101f4810SBram Moolenaar
1339e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
13409bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
13412949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1342101f4810SBram Moolenaar
1343730b2483SBram Moolenaar  delete('XexportCmd.vim')
13449bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
13459bb3eb3eSBram Moolenaarenddef
1346101f4810SBram Moolenaar
13472b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
13482b32700dSBram Moolenaar  var lines =<< trim END
1349a6294955SBram Moolenaar    vim9script
1350a6294955SBram Moolenaar    export var exported = 'thexport'
1351a6294955SBram Moolenaar  END
1352a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1353a6294955SBram Moolenaar  lines =<< trim END
13542b32700dSBram Moolenaar    vim9script noclear
13552b32700dSBram Moolenaar    g:loadCount += 1
13562b32700dSBram Moolenaar    var s:reloaded = 'init'
1357a6294955SBram Moolenaar    import exported from './XExportReload'
13582b32700dSBram Moolenaar
13592b32700dSBram Moolenaar    def Again(): string
13602b32700dSBram Moolenaar      return 'again'
13612b32700dSBram Moolenaar    enddef
13622b32700dSBram Moolenaar
13632b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
13642b32700dSBram Moolenaar    var s:loaded = true
13652b32700dSBram Moolenaar
13662b32700dSBram Moolenaar    var s:notReloaded = 'yes'
13672b32700dSBram Moolenaar    s:reloaded = 'first'
13682b32700dSBram Moolenaar    def g:Values(): list<string>
1369a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
13702b32700dSBram Moolenaar    enddef
13712b32700dSBram Moolenaar
13722b32700dSBram Moolenaar    def Once(): string
13732b32700dSBram Moolenaar      return 'once'
13742b32700dSBram Moolenaar    enddef
13752b32700dSBram Moolenaar  END
13762b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
13772b32700dSBram Moolenaar  g:loadCount = 0
13782b32700dSBram Moolenaar  source XReloaded
13792b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1380a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
13812b32700dSBram Moolenaar  source XReloaded
13822b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1383a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
13842b32700dSBram Moolenaar  source XReloaded
13852b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1386a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
13872b32700dSBram Moolenaar
138848e11c10SBram Moolenaar  delete('XReloaded')
1389a6294955SBram Moolenaar  delete('XExportReload')
13902b32700dSBram Moolenaar  delfunc g:Values
13912b32700dSBram Moolenaar  unlet g:loadCount
13922b32700dSBram Moolenaarenddef
13932b32700dSBram Moolenaar
13944c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1395cfcd011fSBram Moolenaar  var lines =<< trim END
13968a7d6542SBram Moolenaar    vim9script
13978a7d6542SBram Moolenaar    const var = ''
1398cfcd011fSBram Moolenaar    var valone = 1234
13998a7d6542SBram Moolenaar    def MyFunc(arg: string)
14008a7d6542SBram Moolenaar       valone = 5678
14018a7d6542SBram Moolenaar    enddef
14028a7d6542SBram Moolenaar  END
1403cfcd011fSBram Moolenaar  var morelines =<< trim END
1404cfcd011fSBram Moolenaar    var valtwo = 222
14058a7d6542SBram Moolenaar    export def GetValtwo(): number
14068a7d6542SBram Moolenaar      return valtwo
14078a7d6542SBram Moolenaar    enddef
14088a7d6542SBram Moolenaar  END
140903afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
14108a7d6542SBram Moolenaar  source Xreload.vim
14118a7d6542SBram Moolenaar  source Xreload.vim
14128a7d6542SBram Moolenaar  source Xreload.vim
14138a7d6542SBram Moolenaar
1414cfcd011fSBram Moolenaar  var testlines =<< trim END
14158a7d6542SBram Moolenaar    vim9script
14168a7d6542SBram Moolenaar    def TheFunc()
14178a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
14188a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
14198a7d6542SBram Moolenaar    enddef
14208a7d6542SBram Moolenaar    TheFunc()
14218a7d6542SBram Moolenaar  END
14228a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
14238a7d6542SBram Moolenaar  source Ximport.vim
14248a7d6542SBram Moolenaar
1425f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1426f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
14278a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
14288a7d6542SBram Moolenaar  source Ximport.vim
14298a7d6542SBram Moolenaar
1430f5be8cdbSBram Moolenaar  # cannot declare a var twice
14318a7d6542SBram Moolenaar  lines =<< trim END
14328a7d6542SBram Moolenaar    vim9script
1433cfcd011fSBram Moolenaar    var valone = 1234
1434cfcd011fSBram Moolenaar    var valone = 5678
14358a7d6542SBram Moolenaar  END
14368a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
143744d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
14388a7d6542SBram Moolenaar
14398a7d6542SBram Moolenaar  delete('Xreload.vim')
14408a7d6542SBram Moolenaar  delete('Ximport.vim')
14418a7d6542SBram Moolenaarenddef
14428a7d6542SBram Moolenaar
144307a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
144407a65d26SBram Moolenaar" compiled function using that variable must fail.
144507a65d26SBram Moolenaardef Test_script_reload_change_type()
144607a65d26SBram Moolenaar  var lines =<< trim END
144707a65d26SBram Moolenaar    vim9script noclear
144807a65d26SBram Moolenaar    var str = 'string'
144907a65d26SBram Moolenaar    def g:GetStr(): string
145007a65d26SBram Moolenaar      return str .. 'xxx'
145107a65d26SBram Moolenaar    enddef
145207a65d26SBram Moolenaar  END
145307a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
145407a65d26SBram Moolenaar  source Xreload.vim
145507a65d26SBram Moolenaar  echo g:GetStr()
145607a65d26SBram Moolenaar
145707a65d26SBram Moolenaar  lines =<< trim END
145807a65d26SBram Moolenaar    vim9script noclear
145907a65d26SBram Moolenaar    var str = 1234
146007a65d26SBram Moolenaar  END
146107a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
146207a65d26SBram Moolenaar  source Xreload.vim
146307a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
146407a65d26SBram Moolenaar
146507a65d26SBram Moolenaar  delfunc g:GetStr
146607a65d26SBram Moolenaar  delete('Xreload.vim')
146707a65d26SBram Moolenaarenddef
146807a65d26SBram Moolenaar
146995006e3dSBram Moolenaardef s:RetSome(): string
147095006e3dSBram Moolenaar  return 'some'
147195006e3dSBram Moolenaarenddef
147295006e3dSBram Moolenaar
1473fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1474fe465a01SBram Moolenaar" script-local name.
1475fe465a01SBram Moolenaardef Test_vim9script_funcref()
1476cfcd011fSBram Moolenaar  var sortlines =<< trim END
1477fe465a01SBram Moolenaar      vim9script
1478fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1479bed36b93SBram Moolenaar        return i2 - i1
1480fe465a01SBram Moolenaar      enddef
1481fe465a01SBram Moolenaar
1482fe465a01SBram Moolenaar      export def FastSort(): list<number>
1483fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1484fe465a01SBram Moolenaar      enddef
1485fe465a01SBram Moolenaar  END
1486fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1487fe465a01SBram Moolenaar
1488cfcd011fSBram Moolenaar  var lines =<< trim END
1489fe465a01SBram Moolenaar    vim9script
1490fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1491fe465a01SBram Moolenaar    def Test()
1492fe465a01SBram Moolenaar      g:result = FastSort()
1493fe465a01SBram Moolenaar    enddef
1494fe465a01SBram Moolenaar    Test()
1495fe465a01SBram Moolenaar  END
1496fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1497fe465a01SBram Moolenaar
1498fe465a01SBram Moolenaar  source Xscript.vim
1499fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1500fe465a01SBram Moolenaar
1501fe465a01SBram Moolenaar  unlet g:result
1502fe465a01SBram Moolenaar  delete('Xsort.vim')
1503fe465a01SBram Moolenaar  delete('Xscript.vim')
150495006e3dSBram Moolenaar
1505cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
150695006e3dSBram Moolenaar  assert_equal('some', Funcref())
1507fe465a01SBram Moolenaarenddef
1508fe465a01SBram Moolenaar
1509601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1510601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1511601e76acSBram Moolenaar" function reference.
1512c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1513cfcd011fSBram Moolenaar  var filterLines =<< trim END
1514c620c055SBram Moolenaar    vim9script
1515c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1516c620c055SBram Moolenaar      return idx % 2 == 1
1517c620c055SBram Moolenaar    enddef
1518c620c055SBram Moolenaar    export def FastFilter(): list<number>
1519c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1520c620c055SBram Moolenaar    enddef
1521601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1522601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1523601e76acSBram Moolenaar    enddef
1524c620c055SBram Moolenaar  END
1525c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1526c620c055SBram Moolenaar
1527cfcd011fSBram Moolenaar  var lines =<< trim END
1528c620c055SBram Moolenaar    vim9script
1529601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1530c620c055SBram Moolenaar    def Test()
1531cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1532c620c055SBram Moolenaar    enddef
1533c620c055SBram Moolenaar    Test()
1534601e76acSBram Moolenaar    def TestDirect()
1535cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1536601e76acSBram Moolenaar    enddef
1537601e76acSBram Moolenaar    TestDirect()
1538c620c055SBram Moolenaar  END
1539601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1540c620c055SBram Moolenaar  delete('Xfilter.vim')
1541c620c055SBram Moolenaarenddef
1542c620c055SBram Moolenaar
15434c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1544cfcd011fSBram Moolenaar  var first_lines =<< trim END
15454c17ad94SBram Moolenaar    vim9script
15464c17ad94SBram Moolenaar    def FuncYes(): string
15474c17ad94SBram Moolenaar      return 'yes'
15484c17ad94SBram Moolenaar    enddef
15494c17ad94SBram Moolenaar  END
1550cfcd011fSBram Moolenaar  var withno_lines =<< trim END
15514c17ad94SBram Moolenaar    def FuncNo(): string
15524c17ad94SBram Moolenaar      return 'no'
15534c17ad94SBram Moolenaar    enddef
15544c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
15554c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
15564c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
155703afdcf1SBram Moolenaar    enddef
155803afdcf1SBram Moolenaar  END
1559cfcd011fSBram Moolenaar  var nono_lines =<< trim END
156003afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
156103afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
156244d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
15634c17ad94SBram Moolenaar    enddef
15644c17ad94SBram Moolenaar  END
15654c17ad94SBram Moolenaar
15664c17ad94SBram Moolenaar  # FuncNo() is defined
156703afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
15684c17ad94SBram Moolenaar  source Xreloaded.vim
15694c17ad94SBram Moolenaar  g:DoCheck(true)
15704c17ad94SBram Moolenaar
15714c17ad94SBram Moolenaar  # FuncNo() is not redefined
157203afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
15734c17ad94SBram Moolenaar  source Xreloaded.vim
15745082471fSBram Moolenaar  g:DoCheck(false)
15754c17ad94SBram Moolenaar
15764c17ad94SBram Moolenaar  # FuncNo() is back
157703afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
15784c17ad94SBram Moolenaar  source Xreloaded.vim
15795082471fSBram Moolenaar  g:DoCheck(false)
15804c17ad94SBram Moolenaar
15814c17ad94SBram Moolenaar  delete('Xreloaded.vim')
15824c17ad94SBram Moolenaarenddef
15834c17ad94SBram Moolenaar
158489483d40SBram Moolenaardef Test_vim9script_reload_delvar()
158589483d40SBram Moolenaar  # write the script with a script-local variable
1586cfcd011fSBram Moolenaar  var lines =<< trim END
158789483d40SBram Moolenaar    vim9script
1588cfcd011fSBram Moolenaar    var name = 'string'
158989483d40SBram Moolenaar  END
159089483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
159189483d40SBram Moolenaar  source XreloadVar.vim
159289483d40SBram Moolenaar
159389483d40SBram Moolenaar  # now write the script using the same variable locally - works
159489483d40SBram Moolenaar  lines =<< trim END
159589483d40SBram Moolenaar    vim9script
159689483d40SBram Moolenaar    def Func()
1597cfcd011fSBram Moolenaar      var name = 'string'
159889483d40SBram Moolenaar    enddef
159989483d40SBram Moolenaar  END
160089483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
160189483d40SBram Moolenaar  source XreloadVar.vim
160289483d40SBram Moolenaar
160389483d40SBram Moolenaar  delete('XreloadVar.vim')
160489483d40SBram Moolenaarenddef
160589483d40SBram Moolenaar
16068a7d6542SBram Moolenaardef Test_import_absolute()
1607cfcd011fSBram Moolenaar  var import_lines = [
1608e6085c53SBram Moolenaar        'vim9script',
1609e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1610e6085c53SBram Moolenaar        'def UseExported()',
1611e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1612e6085c53SBram Moolenaar        '  exported = 8888',
1613e6085c53SBram Moolenaar        '  g:imported_after = exported',
1614e6085c53SBram Moolenaar        'enddef',
1615e6085c53SBram Moolenaar        'UseExported()',
1616e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1617e6085c53SBram Moolenaar        ]
16188a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
16198a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
16208a7d6542SBram Moolenaar
16218a7d6542SBram Moolenaar  source Ximport_abs.vim
16228a7d6542SBram Moolenaar
16238a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
16244e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1625fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1626fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1627fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1628fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1629fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1630fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1631fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1632fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1633fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1634fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1635e6085c53SBram Moolenaar        g:import_disassembled)
1636b3ca9824SBram Moolenaar
1637b3ca9824SBram Moolenaar  Undo_export_script_lines()
16388a7d6542SBram Moolenaar  unlet g:imported_abs
16394e12a5dfSBram Moolenaar  unlet g:import_disassembled
16408a7d6542SBram Moolenaar
16418a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
16428a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
16438a7d6542SBram Moolenaarenddef
16448a7d6542SBram Moolenaar
16458a7d6542SBram Moolenaardef Test_import_rtp()
1646cfcd011fSBram Moolenaar  var import_lines = [
1647e6085c53SBram Moolenaar        'vim9script',
1648e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1649e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1650e6085c53SBram Moolenaar        ]
16518a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
16528a7d6542SBram Moolenaar  mkdir('import')
16538a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
16548a7d6542SBram Moolenaar
1655cfcd011fSBram Moolenaar  var save_rtp = &rtp
16568a7d6542SBram Moolenaar  &rtp = getcwd()
16578a7d6542SBram Moolenaar  source Ximport_rtp.vim
16588a7d6542SBram Moolenaar  &rtp = save_rtp
16598a7d6542SBram Moolenaar
16608a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
16618a7d6542SBram Moolenaar
1662b3ca9824SBram Moolenaar  Undo_export_script_lines()
1663b3ca9824SBram Moolenaar  unlet g:imported_rtp
16648a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
166589483d40SBram Moolenaar  delete('import', 'rf')
16668a7d6542SBram Moolenaarenddef
16678a7d6542SBram Moolenaar
166825e0f586SBram Moolenaardef Test_import_compile_error()
1669cfcd011fSBram Moolenaar  var export_lines = [
167025e0f586SBram Moolenaar        'vim9script',
167125e0f586SBram Moolenaar        'export def ExpFunc(): string',
167225e0f586SBram Moolenaar        '  return notDefined',
167325e0f586SBram Moolenaar        'enddef',
167425e0f586SBram Moolenaar        ]
167525e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
167625e0f586SBram Moolenaar
1677cfcd011fSBram Moolenaar  var import_lines = [
167825e0f586SBram Moolenaar        'vim9script',
167925e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
168025e0f586SBram Moolenaar        'def ImpFunc()',
168125e0f586SBram Moolenaar        '  echo ExpFunc()',
168225e0f586SBram Moolenaar        'enddef',
168325e0f586SBram Moolenaar        'defcompile',
168425e0f586SBram Moolenaar        ]
168525e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
168625e0f586SBram Moolenaar
168725e0f586SBram Moolenaar  try
168825e0f586SBram Moolenaar    source Ximport.vim
168925e0f586SBram Moolenaar  catch /E1001/
1690f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
16917707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
169225e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
169325e0f586SBram Moolenaar  endtry
169425e0f586SBram Moolenaar
169525e0f586SBram Moolenaar  delete('Xexported.vim')
169625e0f586SBram Moolenaar  delete('Ximport.vim')
169725e0f586SBram Moolenaarenddef
169825e0f586SBram Moolenaar
1699c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1700cfcd011fSBram Moolenaar  var lines = [
1701c4ce36d4SBram Moolenaar        'vim9script',
1702c4ce36d4SBram Moolenaar        'def Func()',
1703c4ce36d4SBram Moolenaar        '  eval [][0]',
1704c4ce36d4SBram Moolenaar        'enddef',
1705c4ce36d4SBram Moolenaar        'Func()',
1706c4ce36d4SBram Moolenaar        ]
1707c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1708c4ce36d4SBram Moolenaar
1709c4ce36d4SBram Moolenaar  for count in range(3)
1710c4ce36d4SBram Moolenaar    try
1711c4ce36d4SBram Moolenaar      source Xtestscript.vim
1712c4ce36d4SBram Moolenaar    catch /E684/
1713c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1714c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1715c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1716c4ce36d4SBram Moolenaar    endtry
1717c4ce36d4SBram Moolenaar  endfor
1718c4ce36d4SBram Moolenaar
1719c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1720c4ce36d4SBram Moolenaarenddef
1721c4ce36d4SBram Moolenaar
1722eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1723cfcd011fSBram Moolenaar  var export_lines =<< trim END
1724eef2102eSBram Moolenaar      vim9script
1725eef2102eSBram Moolenaar      export def Func()
1726eef2102eSBram Moolenaar        echo 'imported'
1727eef2102eSBram Moolenaar      enddef
1728eef2102eSBram Moolenaar  END
1729eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1730eef2102eSBram Moolenaar
1731cfcd011fSBram Moolenaar  var lines =<< trim END
1732eef2102eSBram Moolenaar    vim9script
1733eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1734eef2102eSBram Moolenaar    def Func()
1735eef2102eSBram Moolenaar      echo 'local to function'
1736eef2102eSBram Moolenaar    enddef
1737eef2102eSBram Moolenaar  END
1738eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1739eef2102eSBram Moolenaar
1740eef2102eSBram Moolenaar  lines =<< trim END
1741eef2102eSBram Moolenaar    vim9script
1742eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1743eef2102eSBram Moolenaar    def Outer()
1744eef2102eSBram Moolenaar      def Func()
1745eef2102eSBram Moolenaar        echo 'local to function'
1746eef2102eSBram Moolenaar      enddef
1747eef2102eSBram Moolenaar    enddef
1748eef2102eSBram Moolenaar    defcompile
1749eef2102eSBram Moolenaar  END
1750eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1751eef2102eSBram Moolenaar
1752eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1753eef2102eSBram Moolenaarenddef
1754eef2102eSBram Moolenaar
1755b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1756cfcd011fSBram Moolenaar  var lines =<< trim END
1757b9a2cac3SBram Moolenaar    vim9script
1758b9a2cac3SBram Moolenaar    def Func()
1759b9a2cac3SBram Moolenaar      echo 'one'
1760b9a2cac3SBram Moolenaar    enddef
1761b9a2cac3SBram Moolenaar    def Func()
1762b9a2cac3SBram Moolenaar      echo 'two'
1763b9a2cac3SBram Moolenaar    enddef
1764b9a2cac3SBram Moolenaar  END
1765b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1766fa211f3cSBram Moolenaar
1767fa211f3cSBram Moolenaar  lines =<< trim END
1768fa211f3cSBram Moolenaar    vim9script
1769fa211f3cSBram Moolenaar    def Foo(): string
1770fa211f3cSBram Moolenaar      return 'foo'
1771fa211f3cSBram Moolenaar      enddef
1772fa211f3cSBram Moolenaar    def Func()
1773cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1774fa211f3cSBram Moolenaar    enddef
1775fa211f3cSBram Moolenaar    defcompile
1776fa211f3cSBram Moolenaar  END
1777fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1778b9a2cac3SBram Moolenaarenddef
1779b9a2cac3SBram Moolenaar
17808a7d6542SBram Moolenaardef Test_fixed_size_list()
1781f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1782cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
17838a7d6542SBram Moolenaar  l->remove(0)
17848a7d6542SBram Moolenaar  l->add(5)
17858a7d6542SBram Moolenaar  l->insert(99, 1)
17860f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
17878a7d6542SBram Moolenaarenddef
17888a7d6542SBram Moolenaar
1789ae616494SBram Moolenaardef Test_no_insert_xit()
1790d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1791d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1792d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1793d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1794d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1795ae616494SBram Moolenaar
1796ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1797ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1798ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1799ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1800f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1801f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1802f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1803f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1804f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1805ae616494SBram Moolenaarenddef
1806ae616494SBram Moolenaar
1807158906cfSBram Moolenaardef IfElse(what: number): string
1808cfcd011fSBram Moolenaar  var res = ''
1809158906cfSBram Moolenaar  if what == 1
1810158906cfSBram Moolenaar    res = "one"
1811158906cfSBram Moolenaar  elseif what == 2
1812158906cfSBram Moolenaar    res = "two"
1813a259d8d3SBram Moolenaar  else
1814158906cfSBram Moolenaar    res = "three"
1815a259d8d3SBram Moolenaar  endif
1816158906cfSBram Moolenaar  return res
1817a259d8d3SBram Moolenaarenddef
1818a259d8d3SBram Moolenaar
1819158906cfSBram Moolenaardef Test_if_elseif_else()
1820158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1821158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1822158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
18230f18b6d1SBram Moolenaarenddef
18240f18b6d1SBram Moolenaar
1825e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1826d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1827d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1828d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1829ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1830d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
18316628b7ebSBram Moolenaar
18326628b7ebSBram Moolenaar  var lines =<< trim END
18336628b7ebSBram Moolenaar      var s = ''
18346628b7ebSBram Moolenaar      if s = ''
18356628b7ebSBram Moolenaar      endif
18366628b7ebSBram Moolenaar  END
18376628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
18386628b7ebSBram Moolenaar
18396628b7ebSBram Moolenaar  lines =<< trim END
18406628b7ebSBram Moolenaar      var s = ''
18416628b7ebSBram Moolenaar      if s == ''
18426628b7ebSBram Moolenaar      elseif s = ''
18436628b7ebSBram Moolenaar      endif
18446628b7ebSBram Moolenaar  END
18456628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
1846e8c4abbbSBram Moolenaarenddef
1847e8c4abbbSBram Moolenaar
18486d69bf60SBram Moolenaarlet g:bool_true = v:true
18496d69bf60SBram Moolenaarlet g:bool_false = v:false
18506d69bf60SBram Moolenaar
18516d69bf60SBram Moolenaardef Test_if_const_expr()
1852cfcd011fSBram Moolenaar  var res = false
18536d69bf60SBram Moolenaar  if true ? true : false
18546d69bf60SBram Moolenaar    res = true
18556d69bf60SBram Moolenaar  endif
18566d69bf60SBram Moolenaar  assert_equal(true, res)
18576d69bf60SBram Moolenaar
1858585fea7bSBram Moolenaar  g:glob = 2
1859585fea7bSBram Moolenaar  if false
18606797966dSBram Moolenaar    execute('g:glob = 3')
1861585fea7bSBram Moolenaar  endif
1862585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1863585fea7bSBram Moolenaar  if true
18646797966dSBram Moolenaar    execute('g:glob = 3')
1865585fea7bSBram Moolenaar  endif
1866585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1867585fea7bSBram Moolenaar
18686d69bf60SBram Moolenaar  res = false
18696d69bf60SBram Moolenaar  if g:bool_true ? true : false
18706d69bf60SBram Moolenaar    res = true
18716d69bf60SBram Moolenaar  endif
18726d69bf60SBram Moolenaar  assert_equal(true, res)
18736d69bf60SBram Moolenaar
18746d69bf60SBram Moolenaar  res = false
18756d69bf60SBram Moolenaar  if true ? g:bool_true : false
18766d69bf60SBram Moolenaar    res = true
18776d69bf60SBram Moolenaar  endif
18786d69bf60SBram Moolenaar  assert_equal(true, res)
18796d69bf60SBram Moolenaar
18806d69bf60SBram Moolenaar  res = false
18816d69bf60SBram Moolenaar  if true ? true : g:bool_false
18826d69bf60SBram Moolenaar    res = true
18836d69bf60SBram Moolenaar  endif
18846d69bf60SBram Moolenaar  assert_equal(true, res)
18856d69bf60SBram Moolenaar
18866d69bf60SBram Moolenaar  res = false
18876d69bf60SBram Moolenaar  if true ? false : true
18886d69bf60SBram Moolenaar    res = true
18896d69bf60SBram Moolenaar  endif
18906d69bf60SBram Moolenaar  assert_equal(false, res)
18916d69bf60SBram Moolenaar
18926d69bf60SBram Moolenaar  res = false
18936d69bf60SBram Moolenaar  if false ? false : true
18946d69bf60SBram Moolenaar    res = true
18956d69bf60SBram Moolenaar  endif
18966d69bf60SBram Moolenaar  assert_equal(true, res)
18976d69bf60SBram Moolenaar
18986d69bf60SBram Moolenaar  res = false
18996d69bf60SBram Moolenaar  if false ? true : false
19006d69bf60SBram Moolenaar    res = true
19016d69bf60SBram Moolenaar  endif
19026d69bf60SBram Moolenaar  assert_equal(false, res)
19036d69bf60SBram Moolenaar
19046d69bf60SBram Moolenaar  res = false
1905e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1906e8c4abbbSBram Moolenaar    res = true
1907e8c4abbbSBram Moolenaar  endif
1908e8c4abbbSBram Moolenaar  assert_equal(false, res)
1909e8c4abbbSBram Moolenaar
1910e8c4abbbSBram Moolenaar  res = false
19116d69bf60SBram Moolenaar  if true && true
19126d69bf60SBram Moolenaar    res = true
19136d69bf60SBram Moolenaar  endif
19146d69bf60SBram Moolenaar  assert_equal(true, res)
19156d69bf60SBram Moolenaar
19166d69bf60SBram Moolenaar  res = false
19176d69bf60SBram Moolenaar  if true && false
19186d69bf60SBram Moolenaar    res = true
19196d69bf60SBram Moolenaar  endif
19206d69bf60SBram Moolenaar  assert_equal(false, res)
19216d69bf60SBram Moolenaar
19226d69bf60SBram Moolenaar  res = false
19236d69bf60SBram Moolenaar  if g:bool_true && false
19246d69bf60SBram Moolenaar    res = true
19256d69bf60SBram Moolenaar  endif
19266d69bf60SBram Moolenaar  assert_equal(false, res)
19276d69bf60SBram Moolenaar
19286d69bf60SBram Moolenaar  res = false
19296d69bf60SBram Moolenaar  if true && g:bool_false
19306d69bf60SBram Moolenaar    res = true
19316d69bf60SBram Moolenaar  endif
19326d69bf60SBram Moolenaar  assert_equal(false, res)
19336d69bf60SBram Moolenaar
19346d69bf60SBram Moolenaar  res = false
19356d69bf60SBram Moolenaar  if false && false
19366d69bf60SBram Moolenaar    res = true
19376d69bf60SBram Moolenaar  endif
19386d69bf60SBram Moolenaar  assert_equal(false, res)
19396d69bf60SBram Moolenaar
19406d69bf60SBram Moolenaar  res = false
19416d69bf60SBram Moolenaar  if true || false
19426d69bf60SBram Moolenaar    res = true
19436d69bf60SBram Moolenaar  endif
19446d69bf60SBram Moolenaar  assert_equal(true, res)
19456d69bf60SBram Moolenaar
19466d69bf60SBram Moolenaar  res = false
19476d69bf60SBram Moolenaar  if g:bool_true || false
19486d69bf60SBram Moolenaar    res = true
19496d69bf60SBram Moolenaar  endif
19506d69bf60SBram Moolenaar  assert_equal(true, res)
19516d69bf60SBram Moolenaar
19526d69bf60SBram Moolenaar  res = false
19536d69bf60SBram Moolenaar  if true || g:bool_false
19546d69bf60SBram Moolenaar    res = true
19556d69bf60SBram Moolenaar  endif
19566d69bf60SBram Moolenaar  assert_equal(true, res)
19576d69bf60SBram Moolenaar
19586d69bf60SBram Moolenaar  res = false
19596d69bf60SBram Moolenaar  if false || false
19606d69bf60SBram Moolenaar    res = true
19616d69bf60SBram Moolenaar  endif
19626d69bf60SBram Moolenaar  assert_equal(false, res)
19633988f64fSBram Moolenaar
19643988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
19653988f64fSBram Moolenaar  if false | eval 0 | endif
19663988f64fSBram Moolenaar  if false | eval burp + 234 | endif
19673988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
19683988f64fSBram Moolenaar  if false
19693988f64fSBram Moolenaar    burp
19703988f64fSBram Moolenaar  endif
197180c34ca3SBram Moolenaarenddef
19726d69bf60SBram Moolenaar
197380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1974d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1975d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1976d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1977d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
19786d69bf60SBram Moolenaarenddef
19796d69bf60SBram Moolenaar
198072abcf42SBram Moolenaardef RunNested(i: number): number
1981cfcd011fSBram Moolenaar  var x: number = 0
198272abcf42SBram Moolenaar  if i % 2
198372abcf42SBram Moolenaar    if 1
1984f5be8cdbSBram Moolenaar      # comment
198572abcf42SBram Moolenaar    else
1986f5be8cdbSBram Moolenaar      # comment
198772abcf42SBram Moolenaar    endif
198872abcf42SBram Moolenaar    x += 1
198972abcf42SBram Moolenaar  else
199072abcf42SBram Moolenaar    x += 1000
199172abcf42SBram Moolenaar  endif
199272abcf42SBram Moolenaar  return x
199372abcf42SBram Moolenaarenddef
199472abcf42SBram Moolenaar
199572abcf42SBram Moolenaardef Test_nested_if()
199672abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
199772abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
199872abcf42SBram Moolenaarenddef
199972abcf42SBram Moolenaar
2000ad39c094SBram Moolenaardef Test_execute_cmd()
2001e4984290SBram Moolenaar  # missing argument is ignored
2002e4984290SBram Moolenaar  execute
2003e4984290SBram Moolenaar  execute # comment
2004e4984290SBram Moolenaar
2005ad39c094SBram Moolenaar  new
2006ad39c094SBram Moolenaar  setline(1, 'default')
2007d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2008ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2009a72cfb80SBram Moolenaar
2010d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2011a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2012a72cfb80SBram Moolenaar
2013cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2014cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2015a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2016ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2017a72cfb80SBram Moolenaar
2018d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2019ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2020a72cfb80SBram Moolenaar
2021cfcd011fSBram Moolenaar  var cmd_first = 'call '
2022cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2023ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2024ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2025ad39c094SBram Moolenaar  bwipe!
2026585fea7bSBram Moolenaar
2027cfcd011fSBram Moolenaar  var n = true
20282d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
20292d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
20302d6b20d6SBram Moolenaar
2031e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2032e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2033e5abf7afSBram Moolenaar
2034d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2035d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2036d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2037ad39c094SBram Moolenaarenddef
2038ad39c094SBram Moolenaar
203947e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2040f5be8cdbSBram Moolenaar  # only checks line continuation
2041cfcd011fSBram Moolenaar  var lines =<< trim END
204247e880d6SBram Moolenaar      vim9script
204347e880d6SBram Moolenaar      execute 'g:someVar'
204447e880d6SBram Moolenaar                .. ' = ' ..
204547e880d6SBram Moolenaar                   '28'
204647e880d6SBram Moolenaar      assert_equal(28, g:someVar)
204747e880d6SBram Moolenaar      unlet g:someVar
204847e880d6SBram Moolenaar  END
204947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
205047e880d6SBram Moolenaarenddef
205147e880d6SBram Moolenaar
2052ad39c094SBram Moolenaardef Test_echo_cmd()
2053a72cfb80SBram Moolenaar  echo 'some' # comment
2054585fea7bSBram Moolenaar  echon 'thing'
2055ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2056ad39c094SBram Moolenaar
2057a72cfb80SBram Moolenaar  echo "some" # comment
2058a72cfb80SBram Moolenaar  echon "thing"
2059a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2060a72cfb80SBram Moolenaar
2061cfcd011fSBram Moolenaar  var str1 = 'some'
2062cfcd011fSBram Moolenaar  var str2 = 'more'
2063ad39c094SBram Moolenaar  echo str1 str2
2064ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2065a72cfb80SBram Moolenaar
2066d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2067ad39c094SBram Moolenaarenddef
2068ad39c094SBram Moolenaar
2069f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2070f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2071f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2072f93c7feaSBram Moolenaar  echo 'clear'
2073df069eecSBram Moolenaar  :1messages
2074f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2075f93c7feaSBram Moolenaar
2076d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2077f93c7feaSBram Moolenaarenddef
2078f93c7feaSBram Moolenaar
207947e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2080f5be8cdbSBram Moolenaar  # only checks line continuation
2081cfcd011fSBram Moolenaar  var lines =<< trim END
208247e880d6SBram Moolenaar      vim9script
208347e880d6SBram Moolenaar      echomsg 'here'
208447e880d6SBram Moolenaar                .. ' is ' ..
208547e880d6SBram Moolenaar                   'a message'
208647e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
208747e880d6SBram Moolenaar  END
208847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
208947e880d6SBram Moolenaarenddef
209047e880d6SBram Moolenaar
2091f93c7feaSBram Moolenaardef Test_echoerr_cmd()
209240ee466cSBram Moolenaar  try
209340ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
209440ee466cSBram Moolenaar  catch
209540ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
209640ee466cSBram Moolenaar  endtry
2097f93c7feaSBram Moolenaarenddef
2098f93c7feaSBram Moolenaar
209947e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2100f5be8cdbSBram Moolenaar  # only checks line continuation
2101cfcd011fSBram Moolenaar  var lines =<< trim END
210247e880d6SBram Moolenaar      vim9script
210347e880d6SBram Moolenaar      try
210447e880d6SBram Moolenaar        echoerr 'this'
210547e880d6SBram Moolenaar                .. ' is ' ..
210647e880d6SBram Moolenaar                   'wrong'
210747e880d6SBram Moolenaar      catch
210847e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
210947e880d6SBram Moolenaar      endtry
211047e880d6SBram Moolenaar  END
211147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
211247e880d6SBram Moolenaarenddef
211347e880d6SBram Moolenaar
211441fe0617SBram Moolenaardef Test_for_outside_of_function()
2115cfcd011fSBram Moolenaar  var lines =<< trim END
211641fe0617SBram Moolenaar    vim9script
211741fe0617SBram Moolenaar    new
211841fe0617SBram Moolenaar    for var in range(0, 3)
211941fe0617SBram Moolenaar      append(line('$'), var)
212041fe0617SBram Moolenaar    endfor
212141fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
212241fe0617SBram Moolenaar    bwipe!
212341fe0617SBram Moolenaar  END
212441fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
212541fe0617SBram Moolenaar  source Xvim9for.vim
212641fe0617SBram Moolenaar  delete('Xvim9for.vim')
212741fe0617SBram Moolenaarenddef
21288a7d6542SBram Moolenaar
2129e8c4abbbSBram Moolenaardef Test_for_loop()
2130cfcd011fSBram Moolenaar  var result = ''
2131e8c4abbbSBram Moolenaar  for cnt in range(7)
2132e8c4abbbSBram Moolenaar    if cnt == 4
2133e8c4abbbSBram Moolenaar      break
2134e8c4abbbSBram Moolenaar    endif
2135e8c4abbbSBram Moolenaar    if cnt == 2
2136e8c4abbbSBram Moolenaar      continue
2137e8c4abbbSBram Moolenaar    endif
2138e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2139e8c4abbbSBram Moolenaar  endfor
2140e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
21410ad3e894SBram Moolenaar
2142cfcd011fSBram Moolenaar  var concat = ''
21430ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
21440ad3e894SBram Moolenaar    concat ..= str
21450ad3e894SBram Moolenaar  endfor
21460ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
214738bd8de5SBram Moolenaar
214838bd8de5SBram Moolenaar  var total = 0
214938bd8de5SBram Moolenaar  for nr in
215038bd8de5SBram Moolenaar      [1, 2, 3]
215138bd8de5SBram Moolenaar    total += nr
215238bd8de5SBram Moolenaar  endfor
215338bd8de5SBram Moolenaar  assert_equal(6, total)
215438bd8de5SBram Moolenaar
215538bd8de5SBram Moolenaar  total = 0
215638bd8de5SBram Moolenaar  for nr
215738bd8de5SBram Moolenaar    in [1, 2, 3]
215838bd8de5SBram Moolenaar    total += nr
215938bd8de5SBram Moolenaar  endfor
216038bd8de5SBram Moolenaar  assert_equal(6, total)
216138bd8de5SBram Moolenaar
216238bd8de5SBram Moolenaar  total = 0
216338bd8de5SBram Moolenaar  for nr
216438bd8de5SBram Moolenaar    in
216538bd8de5SBram Moolenaar    [1, 2, 3]
216638bd8de5SBram Moolenaar    total += nr
216738bd8de5SBram Moolenaar  endfor
216838bd8de5SBram Moolenaar  assert_equal(6, total)
2169036d0714SBram Moolenaar
2170036d0714SBram Moolenaar  var res = ""
2171036d0714SBram Moolenaar  for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2172036d0714SBram Moolenaar    res ..= n .. s
2173036d0714SBram Moolenaar  endfor
2174036d0714SBram Moolenaar  assert_equal('1a2b', res)
2175e8c4abbbSBram Moolenaarenddef
2176e8c4abbbSBram Moolenaar
2177e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2178025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2179025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2180025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2181675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2182675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2183cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2184822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
21852d870f8dSBram Moolenaar  delfunc! g:Func
2186451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2187675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2188675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2189675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2190e8c4abbbSBram Moolenaarenddef
2191e8c4abbbSBram Moolenaar
2192ea87069dSBram Moolenaardef Test_for_loop_script_var()
2193ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2194ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2195ea87069dSBram Moolenaar
2196ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2197ea87069dSBram Moolenaar  var lines =<< trim END
2198ea87069dSBram Moolenaar    vim9script
2199ea87069dSBram Moolenaar    var total = 0
2200ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2201ea87069dSBram Moolenaar      total += s:var
2202ea87069dSBram Moolenaar    endfor
2203ea87069dSBram Moolenaar    assert_equal(6, total)
2204ea87069dSBram Moolenaar
2205ea87069dSBram Moolenaar    total = 0
2206ea87069dSBram Moolenaar    for var in [1, 2, 3]
2207ea87069dSBram Moolenaar      total += var
2208ea87069dSBram Moolenaar    endfor
2209ea87069dSBram Moolenaar    assert_equal(6, total)
2210ea87069dSBram Moolenaar  END
2211ea87069dSBram Moolenaarenddef
2212ea87069dSBram Moolenaar
2213792f786aSBram Moolenaardef Test_for_loop_unpack()
22144b8a0651SBram Moolenaar  var lines =<< trim END
2215792f786aSBram Moolenaar      var result = []
2216792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2217792f786aSBram Moolenaar        result->add(v1)
2218792f786aSBram Moolenaar        result->add(v2)
2219792f786aSBram Moolenaar      endfor
2220792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2221792f786aSBram Moolenaar
2222792f786aSBram Moolenaar      result = []
2223792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2224792f786aSBram Moolenaar        result->add(v1)
2225792f786aSBram Moolenaar        result->add(v2)
2226792f786aSBram Moolenaar        result->add(v3)
2227792f786aSBram Moolenaar      endfor
2228792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2229792f786aSBram Moolenaar
22304b8a0651SBram Moolenaar      result = []
22314b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
22324b8a0651SBram Moolenaar        result->add(&ts)
22334b8a0651SBram Moolenaar        result->add(&sw)
22344b8a0651SBram Moolenaar      endfor
22354b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
22364b8a0651SBram Moolenaar
22374b8a0651SBram Moolenaar      var slist: list<string>
22384b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
22394b8a0651SBram Moolenaar        slist->add($LOOPVAR)
22404b8a0651SBram Moolenaar        slist->add(@r)
22414b8a0651SBram Moolenaar        slist->add(v:errmsg)
22424b8a0651SBram Moolenaar      endfor
22434b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
22444b8a0651SBram Moolenaar
22454b8a0651SBram Moolenaar      slist = []
22464b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
22474b8a0651SBram Moolenaar        slist->add(g:globalvar)
22484b8a0651SBram Moolenaar        slist->add(b:bufvar)
22494b8a0651SBram Moolenaar        slist->add(w:winvar)
22504b8a0651SBram Moolenaar        slist->add(t:tabvar)
22514b8a0651SBram Moolenaar      endfor
22524b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2253f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
22544b8a0651SBram Moolenaar  END
22554b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
22564b8a0651SBram Moolenaar
22574b8a0651SBram Moolenaar  lines =<< trim END
2258792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2259792f786aSBram Moolenaar        echo v1 v2
2260792f786aSBram Moolenaar      endfor
2261792f786aSBram Moolenaar  END
2262792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2263792f786aSBram Moolenaar
2264792f786aSBram Moolenaar  lines =<< trim END
2265792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2266792f786aSBram Moolenaar        echo v1 v2
2267792f786aSBram Moolenaar      endfor
2268792f786aSBram Moolenaar  END
2269792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2270792f786aSBram Moolenaar
2271792f786aSBram Moolenaar  lines =<< trim END
2272792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2273792f786aSBram Moolenaar        echo v1
2274792f786aSBram Moolenaar      endfor
2275792f786aSBram Moolenaar  END
2276792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2277792f786aSBram Moolenaarenddef
2278792f786aSBram Moolenaar
2279c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2280c150c09eSBram Moolenaar  var looped = 0
2281c150c09eSBram Moolenaar  var cleanup = 0
2282c150c09eSBram Moolenaar  for i in range(3)
2283c150c09eSBram Moolenaar    looped += 1
2284c150c09eSBram Moolenaar    try
2285c150c09eSBram Moolenaar      eval [][0]
2286c150c09eSBram Moolenaar    catch
2287c150c09eSBram Moolenaar      continue
2288c150c09eSBram Moolenaar    finally
2289c150c09eSBram Moolenaar      cleanup += 1
2290c150c09eSBram Moolenaar    endtry
2291c150c09eSBram Moolenaar  endfor
2292c150c09eSBram Moolenaar  assert_equal(3, looped)
2293c150c09eSBram Moolenaar  assert_equal(3, cleanup)
2294c150c09eSBram Moolenaarenddef
2295c150c09eSBram Moolenaar
2296d0df1aacSBram Moolenaardef Test_while_loop()
2297cfcd011fSBram Moolenaar  var result = ''
2298cfcd011fSBram Moolenaar  var cnt = 0
2299d0df1aacSBram Moolenaar  while cnt < 555
2300d0df1aacSBram Moolenaar    if cnt == 3
2301d0df1aacSBram Moolenaar      break
2302d0df1aacSBram Moolenaar    endif
2303d0df1aacSBram Moolenaar    cnt += 1
2304d0df1aacSBram Moolenaar    if cnt == 2
2305d0df1aacSBram Moolenaar      continue
2306d0df1aacSBram Moolenaar    endif
2307d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2308d0df1aacSBram Moolenaar  endwhile
2309d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2310dee37dc7SBram Moolenaar
2311dee37dc7SBram Moolenaar  var s = ''
23120123cc1eSBram Moolenaar  while s == 'x' #{comment}
2313dee37dc7SBram Moolenaar  endwhile
2314d0df1aacSBram Moolenaarenddef
2315d0df1aacSBram Moolenaar
2316e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2317675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2318675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2319675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2320675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2321675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2322675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2323675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
23246628b7ebSBram Moolenaar
23256628b7ebSBram Moolenaar  var lines =<< trim END
23266628b7ebSBram Moolenaar      var s = ''
23276628b7ebSBram Moolenaar      while s = ''
23286628b7ebSBram Moolenaar      endwhile
23296628b7ebSBram Moolenaar  END
23306628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2331bd5da371SBram Moolenaarenddef
2332bd5da371SBram Moolenaar
23339645e2d9SBram Moolenaardef Test_interrupt_loop()
2334cfcd011fSBram Moolenaar  var caught = false
2335cfcd011fSBram Moolenaar  var x = 0
233697acfc78SBram Moolenaar  try
23379645e2d9SBram Moolenaar    while 1
23389645e2d9SBram Moolenaar      x += 1
23399645e2d9SBram Moolenaar      if x == 100
23409645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
23419645e2d9SBram Moolenaar      endif
23429645e2d9SBram Moolenaar    endwhile
234397acfc78SBram Moolenaar  catch
234497acfc78SBram Moolenaar    caught = true
234597acfc78SBram Moolenaar    assert_equal(100, x)
234697acfc78SBram Moolenaar  endtry
234797acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
234825859dd7SBram Moolenaar  # consume the CTRL-C
234925859dd7SBram Moolenaar  getchar(0)
23509645e2d9SBram Moolenaarenddef
235120431c9dSBram Moolenaar
23524fdae999SBram Moolenaardef Test_automatic_line_continuation()
2353cfcd011fSBram Moolenaar  var mylist = [
23544fdae999SBram Moolenaar      'one',
23554fdae999SBram Moolenaar      'two',
23564fdae999SBram Moolenaar      'three',
2357f5be8cdbSBram Moolenaar      ] # comment
23584fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
23594fdae999SBram Moolenaar
2360cfcd011fSBram Moolenaar  var mydict = {
2361e0de171eSBram Moolenaar      ['one']: 1,
2362e0de171eSBram Moolenaar      ['two']: 2,
2363e0de171eSBram Moolenaar      ['three']:
23644fdae999SBram Moolenaar          3,
2365f5be8cdbSBram Moolenaar      } # comment
2366e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2367e0de171eSBram Moolenaar  mydict = {
23682c330432SBram Moolenaar      one: 1,  # comment
23692c330432SBram Moolenaar      two:     # comment
23702c330432SBram Moolenaar           2,  # comment
23712c330432SBram Moolenaar      three: 3 # comment
23722c330432SBram Moolenaar      }
2373e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2374e0de171eSBram Moolenaar  mydict = {
23752c330432SBram Moolenaar      one: 1,
23764fdae999SBram Moolenaar      two:
23774fdae999SBram Moolenaar           2,
23782c330432SBram Moolenaar      three: 3
23794fdae999SBram Moolenaar      }
2380e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2381e6085c53SBram Moolenaar
2382e6085c53SBram Moolenaar  assert_equal(
2383e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2384e6085c53SBram Moolenaar        split('one two three')
2385e6085c53SBram Moolenaar        )
23864fdae999SBram Moolenaarenddef
23874fdae999SBram Moolenaar
23887a092245SBram Moolenaardef Test_vim9_comment()
23897a092245SBram Moolenaar  CheckScriptSuccess([
23907a092245SBram Moolenaar      'vim9script',
23917a092245SBram Moolenaar      '# something',
239293f82cbeSBram Moolenaar      '#something',
239393f82cbeSBram Moolenaar      '#{something',
23947a092245SBram Moolenaar      ])
239593f82cbeSBram Moolenaar
239693f82cbeSBram Moolenaar  split Xfile
239793f82cbeSBram Moolenaar  CheckScriptSuccess([
239893f82cbeSBram Moolenaar      'vim9script',
239993f82cbeSBram Moolenaar      'edit #something',
240093f82cbeSBram Moolenaar      ])
240193f82cbeSBram Moolenaar  CheckScriptSuccess([
240293f82cbeSBram Moolenaar      'vim9script',
240393f82cbeSBram Moolenaar      'edit #{something',
240493f82cbeSBram Moolenaar      ])
240593f82cbeSBram Moolenaar  close
240693f82cbeSBram Moolenaar
24077a092245SBram Moolenaar  CheckScriptFailure([
24087a092245SBram Moolenaar      'vim9script',
24097a092245SBram Moolenaar      ':# something',
24107a092245SBram Moolenaar      ], 'E488:')
24117a092245SBram Moolenaar  CheckScriptFailure([
24127a092245SBram Moolenaar      '# something',
24137a092245SBram Moolenaar      ], 'E488:')
24147a092245SBram Moolenaar  CheckScriptFailure([
24157a092245SBram Moolenaar      ':# something',
24167a092245SBram Moolenaar      ], 'E488:')
24177a092245SBram Moolenaar
24184a8d9f2eSBram Moolenaar  { # block start
24194a8d9f2eSBram Moolenaar  } # block end
24204a8d9f2eSBram Moolenaar  CheckDefFailure([
24214a8d9f2eSBram Moolenaar      '{# comment',
24224a8d9f2eSBram Moolenaar      ], 'E488:')
24234a8d9f2eSBram Moolenaar  CheckDefFailure([
24244a8d9f2eSBram Moolenaar      '{',
24254a8d9f2eSBram Moolenaar      '}# comment',
24264a8d9f2eSBram Moolenaar      ], 'E488:')
24274a8d9f2eSBram Moolenaar
24284a8d9f2eSBram Moolenaar  echo "yes" # comment
24294a8d9f2eSBram Moolenaar  CheckDefFailure([
24304a8d9f2eSBram Moolenaar      'echo "yes"# comment',
24314a8d9f2eSBram Moolenaar      ], 'E488:')
24327a092245SBram Moolenaar  CheckScriptSuccess([
24337a092245SBram Moolenaar      'vim9script',
24347a092245SBram Moolenaar      'echo "yes" # something',
24357a092245SBram Moolenaar      ])
24367a092245SBram Moolenaar  CheckScriptFailure([
24377a092245SBram Moolenaar      'vim9script',
24387a092245SBram Moolenaar      'echo "yes"# something',
24397a092245SBram Moolenaar      ], 'E121:')
24407a092245SBram Moolenaar  CheckScriptFailure([
24417a092245SBram Moolenaar      'vim9script',
24427a092245SBram Moolenaar      'echo# something',
2443f8103f27SBram Moolenaar      ], 'E1144:')
24447a092245SBram Moolenaar  CheckScriptFailure([
24457a092245SBram Moolenaar      'echo "yes" # something',
24467a092245SBram Moolenaar      ], 'E121:')
24477a092245SBram Moolenaar
24484a8d9f2eSBram Moolenaar  exe "echo" # comment
24494a8d9f2eSBram Moolenaar  CheckDefFailure([
24504a8d9f2eSBram Moolenaar      'exe "echo"# comment',
24514a8d9f2eSBram Moolenaar      ], 'E488:')
24524a8d9f2eSBram Moolenaar  CheckScriptSuccess([
24534a8d9f2eSBram Moolenaar      'vim9script',
24544a8d9f2eSBram Moolenaar      'exe "echo" # something',
24554a8d9f2eSBram Moolenaar      ])
24564a8d9f2eSBram Moolenaar  CheckScriptFailure([
24574a8d9f2eSBram Moolenaar      'vim9script',
24584a8d9f2eSBram Moolenaar      'exe "echo"# something',
24594a8d9f2eSBram Moolenaar      ], 'E121:')
24604a8d9f2eSBram Moolenaar  CheckScriptFailure([
24614a8d9f2eSBram Moolenaar      'vim9script',
24624a8d9f2eSBram Moolenaar      'exe# something',
2463f8103f27SBram Moolenaar      ], 'E1144:')
24644a8d9f2eSBram Moolenaar  CheckScriptFailure([
24654a8d9f2eSBram Moolenaar      'exe "echo" # something',
24664a8d9f2eSBram Moolenaar      ], 'E121:')
24674a8d9f2eSBram Moolenaar
24687a092245SBram Moolenaar  CheckDefFailure([
24697a092245SBram Moolenaar      'try# comment',
24707a092245SBram Moolenaar      '  echo "yes"',
24717a092245SBram Moolenaar      'catch',
24727a092245SBram Moolenaar      'endtry',
2473f8103f27SBram Moolenaar      ], 'E1144:')
24742c5ed4e3SBram Moolenaar  CheckScriptFailure([
24752c5ed4e3SBram Moolenaar      'vim9script',
24762c5ed4e3SBram Moolenaar      'try# comment',
24772c5ed4e3SBram Moolenaar      'echo "yes"',
2478f8103f27SBram Moolenaar      ], 'E1144:')
24797a092245SBram Moolenaar  CheckDefFailure([
24807a092245SBram Moolenaar      'try',
2481a72cfb80SBram Moolenaar      '  throw#comment',
2482a72cfb80SBram Moolenaar      'catch',
2483a72cfb80SBram Moolenaar      'endtry',
2484f8103f27SBram Moolenaar      ], 'E1144:')
2485a72cfb80SBram Moolenaar  CheckDefFailure([
2486a72cfb80SBram Moolenaar      'try',
2487a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2488a72cfb80SBram Moolenaar      'catch',
2489a72cfb80SBram Moolenaar      'endtry',
2490a72cfb80SBram Moolenaar      ], 'E488:')
2491a72cfb80SBram Moolenaar  CheckDefFailure([
2492a72cfb80SBram Moolenaar      'try',
24937a092245SBram Moolenaar      '  echo "yes"',
24947a092245SBram Moolenaar      'catch# comment',
24957a092245SBram Moolenaar      'endtry',
2496f8103f27SBram Moolenaar      ], 'E1144:')
24972c5ed4e3SBram Moolenaar  CheckScriptFailure([
24982c5ed4e3SBram Moolenaar      'vim9script',
24992c5ed4e3SBram Moolenaar      'try',
25002c5ed4e3SBram Moolenaar      '  echo "yes"',
25012c5ed4e3SBram Moolenaar      'catch# comment',
25022c5ed4e3SBram Moolenaar      'endtry',
2503f8103f27SBram Moolenaar      ], 'E1144:')
25042c5ed4e3SBram Moolenaar  CheckDefFailure([
25052c5ed4e3SBram Moolenaar      'try',
25062c5ed4e3SBram Moolenaar      '  echo "yes"',
25072c5ed4e3SBram Moolenaar      'catch /pat/# comment',
25082c5ed4e3SBram Moolenaar      'endtry',
25092c5ed4e3SBram Moolenaar      ], 'E488:')
25107a092245SBram Moolenaar  CheckDefFailure([
25117a092245SBram Moolenaar      'try',
25127a092245SBram Moolenaar      'echo "yes"',
25137a092245SBram Moolenaar      'catch',
25147a092245SBram Moolenaar      'endtry# comment',
2515f8103f27SBram Moolenaar      ], 'E1144:')
25162c5ed4e3SBram Moolenaar  CheckScriptFailure([
25172c5ed4e3SBram Moolenaar      'vim9script',
25182c5ed4e3SBram Moolenaar      'try',
25192c5ed4e3SBram Moolenaar      '  echo "yes"',
25202c5ed4e3SBram Moolenaar      'catch',
25212c5ed4e3SBram Moolenaar      'endtry# comment',
2522f8103f27SBram Moolenaar      ], 'E1144:')
25232c5ed4e3SBram Moolenaar
25242c5ed4e3SBram Moolenaar  CheckScriptSuccess([
25252c5ed4e3SBram Moolenaar      'vim9script',
25262c5ed4e3SBram Moolenaar      'hi # comment',
25272c5ed4e3SBram Moolenaar      ])
25282c5ed4e3SBram Moolenaar  CheckScriptFailure([
25292c5ed4e3SBram Moolenaar      'vim9script',
25302c5ed4e3SBram Moolenaar      'hi# comment',
2531f8103f27SBram Moolenaar      ], 'E1144:')
25321966c248SBram Moolenaar  CheckScriptSuccess([
25331966c248SBram Moolenaar      'vim9script',
25341966c248SBram Moolenaar      'hi Search # comment',
25351966c248SBram Moolenaar      ])
25361966c248SBram Moolenaar  CheckScriptFailure([
25371966c248SBram Moolenaar      'vim9script',
25381966c248SBram Moolenaar      'hi Search# comment',
25391966c248SBram Moolenaar      ], 'E416:')
25401966c248SBram Moolenaar  CheckScriptSuccess([
25411966c248SBram Moolenaar      'vim9script',
25421966c248SBram Moolenaar      'hi link This Search # comment',
25431966c248SBram Moolenaar      ])
25441966c248SBram Moolenaar  CheckScriptFailure([
25451966c248SBram Moolenaar      'vim9script',
25461966c248SBram Moolenaar      'hi link This That# comment',
25471966c248SBram Moolenaar      ], 'E413:')
25481966c248SBram Moolenaar  CheckScriptSuccess([
25491966c248SBram Moolenaar      'vim9script',
25501966c248SBram Moolenaar      'hi clear This # comment',
25511966c248SBram Moolenaar      'hi clear # comment',
25521966c248SBram Moolenaar      ])
2553f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2554f5be8cdbSBram Moolenaar  # hi clear This# comment',
25551966c248SBram Moolenaar  CheckScriptFailure([
25561966c248SBram Moolenaar      'vim9script',
25571966c248SBram Moolenaar      'hi clear# comment',
25581966c248SBram Moolenaar      ], 'E416:')
25591966c248SBram Moolenaar
25601966c248SBram Moolenaar  CheckScriptSuccess([
25611966c248SBram Moolenaar      'vim9script',
25621966c248SBram Moolenaar      'hi Group term=bold',
25631966c248SBram Moolenaar      'match Group /todo/ # comment',
25641966c248SBram Moolenaar      ])
25651966c248SBram Moolenaar  CheckScriptFailure([
25661966c248SBram Moolenaar      'vim9script',
25671966c248SBram Moolenaar      'hi Group term=bold',
25681966c248SBram Moolenaar      'match Group /todo/# comment',
25691966c248SBram Moolenaar      ], 'E488:')
25701966c248SBram Moolenaar  CheckScriptSuccess([
25711966c248SBram Moolenaar      'vim9script',
25721966c248SBram Moolenaar      'match # comment',
25731966c248SBram Moolenaar      ])
25741966c248SBram Moolenaar  CheckScriptFailure([
25751966c248SBram Moolenaar      'vim9script',
25761966c248SBram Moolenaar      'match# comment',
2577f8103f27SBram Moolenaar      ], 'E1144:')
25781966c248SBram Moolenaar  CheckScriptSuccess([
25791966c248SBram Moolenaar      'vim9script',
25801966c248SBram Moolenaar      'match none # comment',
25811966c248SBram Moolenaar      ])
25821966c248SBram Moolenaar  CheckScriptFailure([
25831966c248SBram Moolenaar      'vim9script',
25841966c248SBram Moolenaar      'match none# comment',
25851966c248SBram Moolenaar      ], 'E475:')
25861966c248SBram Moolenaar
25871966c248SBram Moolenaar  CheckScriptSuccess([
25881966c248SBram Moolenaar      'vim9script',
25891966c248SBram Moolenaar      'menutrans clear # comment',
25901966c248SBram Moolenaar      ])
25911966c248SBram Moolenaar  CheckScriptFailure([
25921966c248SBram Moolenaar      'vim9script',
25931966c248SBram Moolenaar      'menutrans clear# comment text',
25941966c248SBram Moolenaar      ], 'E474:')
25951966c248SBram Moolenaar
25961966c248SBram Moolenaar  CheckScriptSuccess([
25971966c248SBram Moolenaar      'vim9script',
25981966c248SBram Moolenaar      'syntax clear # comment',
25991966c248SBram Moolenaar      ])
26001966c248SBram Moolenaar  CheckScriptFailure([
26011966c248SBram Moolenaar      'vim9script',
26021966c248SBram Moolenaar      'syntax clear# comment text',
26031966c248SBram Moolenaar      ], 'E28:')
26041966c248SBram Moolenaar  CheckScriptSuccess([
26051966c248SBram Moolenaar      'vim9script',
26061966c248SBram Moolenaar      'syntax keyword Word some',
26071966c248SBram Moolenaar      'syntax clear Word # comment',
26081966c248SBram Moolenaar      ])
26091966c248SBram Moolenaar  CheckScriptFailure([
26101966c248SBram Moolenaar      'vim9script',
26111966c248SBram Moolenaar      'syntax keyword Word some',
26121966c248SBram Moolenaar      'syntax clear Word# comment text',
26131966c248SBram Moolenaar      ], 'E28:')
26141966c248SBram Moolenaar
26151966c248SBram Moolenaar  CheckScriptSuccess([
26161966c248SBram Moolenaar      'vim9script',
26171966c248SBram Moolenaar      'syntax list # comment',
26181966c248SBram Moolenaar      ])
26191966c248SBram Moolenaar  CheckScriptFailure([
26201966c248SBram Moolenaar      'vim9script',
26211966c248SBram Moolenaar      'syntax list# comment text',
26221966c248SBram Moolenaar      ], 'E28:')
26231966c248SBram Moolenaar
26241966c248SBram Moolenaar  CheckScriptSuccess([
26251966c248SBram Moolenaar      'vim9script',
26261966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
26271966c248SBram Moolenaar      ])
26281966c248SBram Moolenaar  CheckScriptFailure([
26291966c248SBram Moolenaar      'vim9script',
26301966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
26311966c248SBram Moolenaar      ], 'E475:')
26321966c248SBram Moolenaar
26331966c248SBram Moolenaar  CheckScriptSuccess([
26341966c248SBram Moolenaar      'vim9script',
26351966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
26361966c248SBram Moolenaar      ])
26371966c248SBram Moolenaar  CheckScriptFailure([
26381966c248SBram Moolenaar      'vim9script',
26391966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
26401966c248SBram Moolenaar      ], 'E789:')
26411966c248SBram Moolenaar
26421966c248SBram Moolenaar  CheckScriptSuccess([
26431966c248SBram Moolenaar      'vim9script',
26441966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
26451966c248SBram Moolenaar      ])
26461966c248SBram Moolenaar  CheckScriptFailure([
26471966c248SBram Moolenaar      'vim9script',
26481966c248SBram Moolenaar      'syntax match Word /pat/# comment',
26491966c248SBram Moolenaar      ], 'E402:')
26501966c248SBram Moolenaar
26511966c248SBram Moolenaar  CheckScriptSuccess([
26521966c248SBram Moolenaar      'vim9script',
26531966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
26541966c248SBram Moolenaar      ])
26551966c248SBram Moolenaar  CheckScriptFailure([
26561966c248SBram Moolenaar      'vim9script',
26571966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
26581966c248SBram Moolenaar      ], 'E475:')
26591966c248SBram Moolenaar  CheckScriptFailure([
26601966c248SBram Moolenaar      'vim9script',
26611966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
26621966c248SBram Moolenaar      ], 'E406:')
26631966c248SBram Moolenaar  CheckScriptFailure([
26641966c248SBram Moolenaar      'vim9script',
26651966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
26661966c248SBram Moolenaar      ], 'E475:')
26671966c248SBram Moolenaar
26681966c248SBram Moolenaar  CheckScriptSuccess([
26691966c248SBram Moolenaar      'vim9script',
26701966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
26711966c248SBram Moolenaar      ])
26721966c248SBram Moolenaar  CheckScriptFailure([
26731966c248SBram Moolenaar      'vim9script',
26741966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2675d032f34aSBram Moolenaar      ], 'E402:')
26761966c248SBram Moolenaar
26771966c248SBram Moolenaar  CheckScriptSuccess([
26781966c248SBram Moolenaar      'vim9script',
26791966c248SBram Moolenaar      'syntax sync # comment',
26801966c248SBram Moolenaar      ])
26811966c248SBram Moolenaar  CheckScriptFailure([
26821966c248SBram Moolenaar      'vim9script',
26831966c248SBram Moolenaar      'syntax sync# comment',
26841966c248SBram Moolenaar      ], 'E404:')
26851966c248SBram Moolenaar  CheckScriptSuccess([
26861966c248SBram Moolenaar      'vim9script',
26871966c248SBram Moolenaar      'syntax sync ccomment # comment',
26881966c248SBram Moolenaar      ])
26891966c248SBram Moolenaar  CheckScriptFailure([
26901966c248SBram Moolenaar      'vim9script',
26911966c248SBram Moolenaar      'syntax sync ccomment# comment',
26921966c248SBram Moolenaar      ], 'E404:')
26931966c248SBram Moolenaar
26941966c248SBram Moolenaar  CheckScriptSuccess([
26951966c248SBram Moolenaar      'vim9script',
26961966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
26971966c248SBram Moolenaar      ])
26981966c248SBram Moolenaar  CheckScriptFailure([
26991966c248SBram Moolenaar      'vim9script',
27001966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
27011966c248SBram Moolenaar      ], 'E475:')
2702a72cfb80SBram Moolenaar
2703a72cfb80SBram Moolenaar  CheckScriptSuccess([
2704a72cfb80SBram Moolenaar      'vim9script',
2705a72cfb80SBram Moolenaar      'command Echo echo # comment',
2706a72cfb80SBram Moolenaar      'command Echo # comment',
27072d870f8dSBram Moolenaar      'delcommand Echo',
2708a72cfb80SBram Moolenaar      ])
2709a72cfb80SBram Moolenaar  CheckScriptFailure([
2710a72cfb80SBram Moolenaar      'vim9script',
2711a72cfb80SBram Moolenaar      'command Echo echo# comment',
2712a72cfb80SBram Moolenaar      'Echo',
2713f8103f27SBram Moolenaar      ], 'E1144:')
27142d870f8dSBram Moolenaar  delcommand Echo
271570249ee8SBram Moolenaar
271670249ee8SBram Moolenaar  var curdir = getcwd()
271770249ee8SBram Moolenaar  CheckScriptSuccess([
271870249ee8SBram Moolenaar      'command Echo cd " comment',
271970249ee8SBram Moolenaar      'Echo',
272070249ee8SBram Moolenaar      'delcommand Echo',
272170249ee8SBram Moolenaar      ])
272270249ee8SBram Moolenaar  CheckScriptSuccess([
2723090728adSBram Moolenaar      'vim9script',
272470249ee8SBram Moolenaar      'command Echo cd # comment',
272570249ee8SBram Moolenaar      'Echo',
272670249ee8SBram Moolenaar      'delcommand Echo',
272770249ee8SBram Moolenaar      ])
272870249ee8SBram Moolenaar  CheckScriptFailure([
272970249ee8SBram Moolenaar      'vim9script',
273070249ee8SBram Moolenaar      'command Echo cd " comment',
273170249ee8SBram Moolenaar      'Echo',
273270249ee8SBram Moolenaar      ], 'E344:')
273370249ee8SBram Moolenaar  delcommand Echo
273470249ee8SBram Moolenaar  chdir(curdir)
273570249ee8SBram Moolenaar
2736a72cfb80SBram Moolenaar  CheckScriptFailure([
2737a72cfb80SBram Moolenaar      'vim9script',
2738a72cfb80SBram Moolenaar      'command Echo# comment',
2739a72cfb80SBram Moolenaar      ], 'E182:')
2740a72cfb80SBram Moolenaar  CheckScriptFailure([
2741a72cfb80SBram Moolenaar      'vim9script',
2742a72cfb80SBram Moolenaar      'command Echo echo',
2743a72cfb80SBram Moolenaar      'command Echo# comment',
2744a72cfb80SBram Moolenaar      ], 'E182:')
27452d870f8dSBram Moolenaar  delcommand Echo
2746a72cfb80SBram Moolenaar
2747a72cfb80SBram Moolenaar  CheckScriptSuccess([
2748a72cfb80SBram Moolenaar      'vim9script',
2749a72cfb80SBram Moolenaar      'function # comment',
2750a72cfb80SBram Moolenaar      ])
2751a72cfb80SBram Moolenaar  CheckScriptFailure([
2752a72cfb80SBram Moolenaar      'vim9script',
27539898107fSBram Moolenaar      'function " comment',
27549898107fSBram Moolenaar      ], 'E129:')
27559898107fSBram Moolenaar  CheckScriptFailure([
27569898107fSBram Moolenaar      'vim9script',
2757a72cfb80SBram Moolenaar      'function# comment',
2758f8103f27SBram Moolenaar      ], 'E1144:')
2759a72cfb80SBram Moolenaar  CheckScriptSuccess([
2760a72cfb80SBram Moolenaar      'vim9script',
2761a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2762a72cfb80SBram Moolenaar      ])
2763a72cfb80SBram Moolenaar  CheckScriptFailure([
2764a72cfb80SBram Moolenaar      'vim9script',
2765a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2766a72cfb80SBram Moolenaar      ], 'E488:')
2767a72cfb80SBram Moolenaar
2768a72cfb80SBram Moolenaar  CheckScriptSuccess([
2769a72cfb80SBram Moolenaar      'vim9script',
27704c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2771a72cfb80SBram Moolenaar      'endfunc',
27724c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2773a72cfb80SBram Moolenaar      ])
2774a72cfb80SBram Moolenaar  CheckScriptFailure([
2775a72cfb80SBram Moolenaar      'vim9script',
27764c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2777a72cfb80SBram Moolenaar      'endfunc',
27784c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2779a72cfb80SBram Moolenaar      ], 'E488:')
2780a72cfb80SBram Moolenaar
2781a72cfb80SBram Moolenaar  CheckScriptSuccess([
2782a72cfb80SBram Moolenaar      'vim9script',
2783a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2784a72cfb80SBram Moolenaar      ])
2785a72cfb80SBram Moolenaar  CheckScriptFailure([
2786a72cfb80SBram Moolenaar      'vim9script',
2787a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2788a72cfb80SBram Moolenaar      ], 'E488:')
2789e7e4838fSBram Moolenaar
2790e7e4838fSBram Moolenaar  CheckScriptFailure([
2791e7e4838fSBram Moolenaar      'def Test() " comment',
2792e7e4838fSBram Moolenaar      'enddef',
2793e7e4838fSBram Moolenaar      ], 'E488:')
2794e7e4838fSBram Moolenaar  CheckScriptFailure([
2795e7e4838fSBram Moolenaar      'vim9script',
2796e7e4838fSBram Moolenaar      'def Test() " comment',
2797e7e4838fSBram Moolenaar      'enddef',
2798e7e4838fSBram Moolenaar      ], 'E488:')
2799e7e4838fSBram Moolenaar
2800e7e4838fSBram Moolenaar  CheckScriptSuccess([
2801e7e4838fSBram Moolenaar      'func Test() " comment',
2802e7e4838fSBram Moolenaar      'endfunc',
28032d870f8dSBram Moolenaar      'delfunc Test',
2804e7e4838fSBram Moolenaar      ])
28059898107fSBram Moolenaar  CheckScriptSuccess([
2806e7e4838fSBram Moolenaar      'vim9script',
2807e7e4838fSBram Moolenaar      'func Test() " comment',
2808e7e4838fSBram Moolenaar      'endfunc',
28099898107fSBram Moolenaar      ])
2810e7e4838fSBram Moolenaar
2811e7e4838fSBram Moolenaar  CheckScriptSuccess([
2812e7e4838fSBram Moolenaar      'def Test() # comment',
2813e7e4838fSBram Moolenaar      'enddef',
2814e7e4838fSBram Moolenaar      ])
2815e7e4838fSBram Moolenaar  CheckScriptFailure([
2816e7e4838fSBram Moolenaar      'func Test() # comment',
2817e7e4838fSBram Moolenaar      'endfunc',
2818e7e4838fSBram Moolenaar      ], 'E488:')
28192c5ed4e3SBram Moolenaarenddef
28202c5ed4e3SBram Moolenaar
28212c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
28222c5ed4e3SBram Moolenaar  CheckCanRunGui
28232c5ed4e3SBram Moolenaar
28242c5ed4e3SBram Moolenaar  CheckScriptFailure([
28252c5ed4e3SBram Moolenaar      'vim9script',
28262c5ed4e3SBram Moolenaar      'gui#comment'
2827f8103f27SBram Moolenaar      ], 'E1144:')
28282c5ed4e3SBram Moolenaar  CheckScriptFailure([
28292c5ed4e3SBram Moolenaar      'vim9script',
28302c5ed4e3SBram Moolenaar      'gui -f#comment'
28312c5ed4e3SBram Moolenaar      ], 'E499:')
28327a092245SBram Moolenaarenddef
28337a092245SBram Moolenaar
2834a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
28356797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
28366797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2837a26b9700SBram Moolenaar
2838a26b9700SBram Moolenaar  edit test.vim
2839a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2840a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2841a26b9700SBram Moolenaar
2842a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2843a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2844a26b9700SBram Moolenaar
2845a26b9700SBram Moolenaar  g:entered = 0
2846a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2847a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2848a26b9700SBram Moolenaar
2849a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2850a26b9700SBram Moolenaar
2851a26b9700SBram Moolenaar  au! TabEnter
2852a26b9700SBram Moolenaar  unlet g:entered
2853d72c1bf0SBram Moolenaar
2854d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2855d72c1bf0SBram Moolenaar      'vim9script',
28566797966dSBram Moolenaar      'g:var = 123',
2857e55b1c09SBram Moolenaar      'b:var = 456',
2858e55b1c09SBram Moolenaar      'w:var = 777',
2859e55b1c09SBram Moolenaar      't:var = 888',
2860d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2861d72c1bf0SBram Moolenaar      ])
2862d72c1bf0SBram Moolenaar
2863d72c1bf0SBram Moolenaar  CheckScriptFailure([
2864d72c1bf0SBram Moolenaar      'vim9script',
2865cfcd011fSBram Moolenaar      'let var = 123',
2866cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2867cfcd011fSBram Moolenaar
2868cfcd011fSBram Moolenaar  CheckScriptFailure([
2869cfcd011fSBram Moolenaar      'vim9script',
2870cfcd011fSBram Moolenaar      'var g:var = 123',
2871e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2872e55b1c09SBram Moolenaar
2873e55b1c09SBram Moolenaar  CheckScriptFailure([
2874e55b1c09SBram Moolenaar      'vim9script',
2875cfcd011fSBram Moolenaar      'var b:var = 123',
2876e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2877e55b1c09SBram Moolenaar
2878e55b1c09SBram Moolenaar  CheckScriptFailure([
2879e55b1c09SBram Moolenaar      'vim9script',
2880cfcd011fSBram Moolenaar      'var w:var = 123',
2881e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2882e55b1c09SBram Moolenaar
2883e55b1c09SBram Moolenaar  CheckScriptFailure([
2884e55b1c09SBram Moolenaar      'vim9script',
2885cfcd011fSBram Moolenaar      'var t:var = 123',
2886e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2887e55b1c09SBram Moolenaar
2888e55b1c09SBram Moolenaar  CheckScriptFailure([
2889e55b1c09SBram Moolenaar      'vim9script',
2890cfcd011fSBram Moolenaar      'var v:version = 123',
2891e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2892e55b1c09SBram Moolenaar
2893e55b1c09SBram Moolenaar  CheckScriptFailure([
2894e55b1c09SBram Moolenaar      'vim9script',
2895cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2896e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
28976797966dSBram Moolenaar
28986797966dSBram Moolenaar  CheckScriptFailure([
28996797966dSBram Moolenaar      'vim9script',
29006797966dSBram Moolenaar      'g:var = 123',
290132e35117SBram Moolenaar      'unlet g:var# comment1',
2902d72c1bf0SBram Moolenaar      ], 'E108:')
2903d72c1bf0SBram Moolenaar
2904d72c1bf0SBram Moolenaar  CheckScriptFailure([
2905d72c1bf0SBram Moolenaar      'let g:var = 123',
2906d72c1bf0SBram Moolenaar      'unlet g:var # something',
2907d72c1bf0SBram Moolenaar      ], 'E488:')
2908faac4104SBram Moolenaar
2909faac4104SBram Moolenaar  CheckScriptSuccess([
2910faac4104SBram Moolenaar      'vim9script',
291132e35117SBram Moolenaar      'if 1 # comment2',
2912faac4104SBram Moolenaar      '  echo "yes"',
2913faac4104SBram Moolenaar      'elseif 2 #comment',
2914faac4104SBram Moolenaar      '  echo "no"',
2915faac4104SBram Moolenaar      'endif',
2916faac4104SBram Moolenaar      ])
2917faac4104SBram Moolenaar
2918faac4104SBram Moolenaar  CheckScriptFailure([
2919faac4104SBram Moolenaar      'vim9script',
292032e35117SBram Moolenaar      'if 1# comment3',
2921faac4104SBram Moolenaar      '  echo "yes"',
2922faac4104SBram Moolenaar      'endif',
2923faac4104SBram Moolenaar      ], 'E15:')
2924faac4104SBram Moolenaar
2925faac4104SBram Moolenaar  CheckScriptFailure([
2926faac4104SBram Moolenaar      'vim9script',
292732e35117SBram Moolenaar      'if 0 # comment4',
2928faac4104SBram Moolenaar      '  echo "yes"',
2929faac4104SBram Moolenaar      'elseif 2#comment',
2930faac4104SBram Moolenaar      '  echo "no"',
2931faac4104SBram Moolenaar      'endif',
2932faac4104SBram Moolenaar      ], 'E15:')
2933faac4104SBram Moolenaar
2934faac4104SBram Moolenaar  CheckScriptSuccess([
2935faac4104SBram Moolenaar      'vim9script',
2936cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2937faac4104SBram Moolenaar      ])
2938faac4104SBram Moolenaar
2939faac4104SBram Moolenaar  CheckScriptFailure([
2940faac4104SBram Moolenaar      'vim9script',
2941cfcd011fSBram Moolenaar      'var v = 1# comment6',
294232e35117SBram Moolenaar      ], 'E15:')
2943faac4104SBram Moolenaar
2944faac4104SBram Moolenaar  CheckScriptSuccess([
2945faac4104SBram Moolenaar      'vim9script',
2946faac4104SBram Moolenaar      'new'
2947d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2948df069eecSBram Moolenaar      ':$',
2949faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2950faac4104SBram Moolenaar      'bwipe!',
2951faac4104SBram Moolenaar      ])
2952faac4104SBram Moolenaar
2953f5be8cdbSBram Moolenaar  CheckScriptFailure([
2954f5be8cdbSBram Moolenaar      'vim9script',
2955f5be8cdbSBram Moolenaar      'new'
2956d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2957f5be8cdbSBram Moolenaar      ':$',
2958f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2959f5be8cdbSBram Moolenaar      'bwipe!',
2960f5be8cdbSBram Moolenaar      ], 'E488:')
2961f5be8cdbSBram Moolenaar
2962f5be8cdbSBram Moolenaar  CheckScriptFailure([
2963f5be8cdbSBram Moolenaar      'vim9script',
2964f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2965f5be8cdbSBram Moolenaar      ], 'E477:')
2966a26b9700SBram Moolenaarenddef
2967a26b9700SBram Moolenaar
29687e5bd91dSBram Moolenaardef Test_finish()
2969cfcd011fSBram Moolenaar  var lines =<< trim END
29707e5bd91dSBram Moolenaar    vim9script
29716797966dSBram Moolenaar    g:res = 'one'
29727e5bd91dSBram Moolenaar    if v:false | finish | endif
29736797966dSBram Moolenaar    g:res = 'two'
29747e5bd91dSBram Moolenaar    finish
29756797966dSBram Moolenaar    g:res = 'three'
29767e5bd91dSBram Moolenaar  END
29777e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
29787e5bd91dSBram Moolenaar  source Xfinished
29797e5bd91dSBram Moolenaar  assert_equal('two', g:res)
29807e5bd91dSBram Moolenaar
29817e5bd91dSBram Moolenaar  unlet g:res
29827e5bd91dSBram Moolenaar  delete('Xfinished')
29837e5bd91dSBram Moolenaarenddef
29847e5bd91dSBram Moolenaar
2985a5d0077eSBram Moolenaardef Test_forward_declaration()
2986cfcd011fSBram Moolenaar  var lines =<< trim END
2987a5d0077eSBram Moolenaar    vim9script
2988a5d0077eSBram Moolenaar    def GetValue(): string
2989a5d0077eSBram Moolenaar      return theVal
2990a5d0077eSBram Moolenaar    enddef
2991cfcd011fSBram Moolenaar    var theVal = 'something'
2992822ba247SBram Moolenaar    g:initVal = GetValue()
2993a5d0077eSBram Moolenaar    theVal = 'else'
2994a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2995a5d0077eSBram Moolenaar  END
2996a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2997a5d0077eSBram Moolenaar  source Xforward
2998a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2999a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3000a5d0077eSBram Moolenaar
3001a5d0077eSBram Moolenaar  unlet g:initVal
3002a5d0077eSBram Moolenaar  unlet g:laterVal
3003a5d0077eSBram Moolenaar  delete('Xforward')
3004a5d0077eSBram Moolenaarenddef
3005a5d0077eSBram Moolenaar
30069721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3007a6294955SBram Moolenaar  var vim9_lines =<< trim END
3008a6294955SBram Moolenaar    vim9script
3009a6294955SBram Moolenaar    var local = 'local'
3010a6294955SBram Moolenaar    g:global = 'global'
3011a6294955SBram Moolenaar    export var exported = 'exported'
3012a6294955SBram Moolenaar    export def GetText(): string
3013a6294955SBram Moolenaar       return 'text'
3014a6294955SBram Moolenaar    enddef
3015a6294955SBram Moolenaar  END
3016a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3017a6294955SBram Moolenaar
3018cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
30199721fb4eSBram Moolenaar    source Xvim9_script.vim
30209721fb4eSBram Moolenaar
30219721fb4eSBram Moolenaar    call assert_false(exists('local'))
30229721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30239721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
30249721fb4eSBram Moolenaar    call assert_equal('global', global)
30259721fb4eSBram Moolenaar    call assert_equal('global', g:global)
30269721fb4eSBram Moolenaar
30279721fb4eSBram Moolenaar    " imported variable becomes script-local
30289721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
30299721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
30309721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30319721fb4eSBram Moolenaar
30329721fb4eSBram Moolenaar    " imported function becomes script-local
30339721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
30349721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
30359721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
30369721fb4eSBram Moolenaar  END
30379721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
30389721fb4eSBram Moolenaar
30399721fb4eSBram Moolenaar  source Xlegacy_script.vim
30409721fb4eSBram Moolenaar  assert_equal('global', g:global)
3041f5be8cdbSBram Moolenaar  unlet g:global
30429721fb4eSBram Moolenaar
30439721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
30449721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
30459721fb4eSBram Moolenaarenddef
3046a5d0077eSBram Moolenaar
30477d699701SBram Moolenaarfunc Test_vim9script_not_global()
30487d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
30497d699701SBram Moolenaar  let vim9lines =<< trim END
30507d699701SBram Moolenaar    vim9script
3051cfcd011fSBram Moolenaar    var name = 'local'
30527d699701SBram Moolenaar    func TheFunc()
30537d699701SBram Moolenaar      echo 'local'
30547d699701SBram Moolenaar    endfunc
30557d699701SBram Moolenaar    def DefFunc()
30567d699701SBram Moolenaar      echo 'local'
30577d699701SBram Moolenaar    enddef
30587d699701SBram Moolenaar  END
30597d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
30607d699701SBram Moolenaar  source Xvim9script.vim
30617d699701SBram Moolenaar  try
30627d699701SBram Moolenaar    echo g:var
30637d699701SBram Moolenaar    assert_report('did not fail')
30647d699701SBram Moolenaar  catch /E121:/
30657d699701SBram Moolenaar    " caught
30667d699701SBram Moolenaar  endtry
30677d699701SBram Moolenaar  try
30687d699701SBram Moolenaar    call TheFunc()
30697d699701SBram Moolenaar    assert_report('did not fail')
30707d699701SBram Moolenaar  catch /E117:/
30717d699701SBram Moolenaar    " caught
30727d699701SBram Moolenaar  endtry
30737d699701SBram Moolenaar  try
30747d699701SBram Moolenaar    call DefFunc()
30757d699701SBram Moolenaar    assert_report('did not fail')
30767d699701SBram Moolenaar  catch /E117:/
30777d699701SBram Moolenaar    " caught
30787d699701SBram Moolenaar  endtry
30797d699701SBram Moolenaar
308025859dd7SBram Moolenaar  call delete('Xvim9script.vim')
30817d699701SBram Moolenaarendfunc
30827d699701SBram Moolenaar
3083eeb27bfeSBram Moolenaardef Test_vim9_copen()
3084eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3085eeb27bfeSBram Moolenaar  copen
3086eeb27bfeSBram Moolenaar  quit
3087eeb27bfeSBram Moolenaarenddef
3088eeb27bfeSBram Moolenaar
308903290b84SBram Moolenaar" test using an auto-loaded function and variable
30902d6b20d6SBram Moolenaardef Test_vim9_autoload()
3091cfcd011fSBram Moolenaar  var lines =<< trim END
30922d6b20d6SBram Moolenaar     vim9script
309303290b84SBram Moolenaar     def some#gettest(): string
309403290b84SBram Moolenaar       return 'test'
309503290b84SBram Moolenaar     enddef
309603290b84SBram Moolenaar     g:some#name = 'name'
309703290b84SBram Moolenaar  END
309803290b84SBram Moolenaar
309903290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
310003290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
310103290b84SBram Moolenaar  var save_rtp = &rtp
310203290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
310303290b84SBram Moolenaar
310403290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
310503290b84SBram Moolenaar  assert_equal('name', g:some#name)
310603290b84SBram Moolenaar  g:some#other = 'other'
310703290b84SBram Moolenaar  assert_equal('other', g:some#other)
310803290b84SBram Moolenaar
310917f700acSBram Moolenaar  # upper case script name works
311017f700acSBram Moolenaar  lines =<< trim END
311117f700acSBram Moolenaar     vim9script
311217f700acSBram Moolenaar     def Other#getOther(): string
311317f700acSBram Moolenaar       return 'other'
311417f700acSBram Moolenaar     enddef
311517f700acSBram Moolenaar  END
311617f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
311717f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
311817f700acSBram Moolenaar
311903290b84SBram Moolenaar  delete('Xdir', 'rf')
312003290b84SBram Moolenaar  &rtp = save_rtp
312103290b84SBram Moolenaarenddef
312203290b84SBram Moolenaar
312303290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
312403290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
312503290b84SBram Moolenaar  var lines =<< trim END
312603290b84SBram Moolenaar     vim9script
31272d6b20d6SBram Moolenaar     def foo#test()
31282d6b20d6SBram Moolenaar         echomsg getreg('"')
31292d6b20d6SBram Moolenaar     enddef
31302d6b20d6SBram Moolenaar  END
31312d6b20d6SBram Moolenaar
31322d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
31332d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3134cfcd011fSBram Moolenaar  var save_rtp = &rtp
31352d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
31362d6b20d6SBram Moolenaar  augroup test
31372d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
31382d6b20d6SBram Moolenaar  augroup END
31392d6b20d6SBram Moolenaar
31402d6b20d6SBram Moolenaar  normal Y
31412d6b20d6SBram Moolenaar
31422d6b20d6SBram Moolenaar  augroup test
31432d6b20d6SBram Moolenaar    autocmd!
31442d6b20d6SBram Moolenaar  augroup END
31452d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
31462d6b20d6SBram Moolenaar  &rtp = save_rtp
31472d6b20d6SBram Moolenaarenddef
31482d6b20d6SBram Moolenaar
314977e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
315077e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3151cfcd011fSBram Moolenaar  var lines =<< trim END
315277e5dcc3SBram Moolenaar      vim9script
315377e5dcc3SBram Moolenaar      def crash#func()
315477e5dcc3SBram Moolenaar          try
315577e5dcc3SBram Moolenaar              for x in List()
315677e5dcc3SBram Moolenaar              endfor
315777e5dcc3SBram Moolenaar          catch
315877e5dcc3SBram Moolenaar          endtry
315977e5dcc3SBram Moolenaar          g:ok = true
316077e5dcc3SBram Moolenaar      enddef
316177e5dcc3SBram Moolenaar      fu List()
316277e5dcc3SBram Moolenaar          invalid
316377e5dcc3SBram Moolenaar      endfu
316477e5dcc3SBram Moolenaar      try
316548e11c10SBram Moolenaar          alsoinvalid
316677e5dcc3SBram Moolenaar      catch /wontmatch/
316777e5dcc3SBram Moolenaar      endtry
316877e5dcc3SBram Moolenaar  END
316977e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
317077e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
317177e5dcc3SBram Moolenaar
317277e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
317377e5dcc3SBram Moolenaar  lines =<< trim END
317477e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
317577e5dcc3SBram Moolenaar    call crash#func()
317677e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
31779c4f5520SBram Moolenaar    qall!
317877e5dcc3SBram Moolenaar  END
317977e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
318077e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
318177e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
318277e5dcc3SBram Moolenaar
318377e5dcc3SBram Moolenaar  delete('Xdidit')
318477e5dcc3SBram Moolenaar  delete('Xscript')
318577e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
318603290b84SBram Moolenaar
318703290b84SBram Moolenaar  lines =<< trim END
318803290b84SBram Moolenaar    vim9script
318903290b84SBram Moolenaar    var foo#bar = 'asdf'
319003290b84SBram Moolenaar  END
319103290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
319277e5dcc3SBram Moolenaarenddef
319377e5dcc3SBram Moolenaar
319481e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
319581e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
319681e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3197cfcd011fSBram Moolenaar  var lines =<< trim END
319881e17fbeSBram Moolenaar    let s:counter = 1
319981e17fbeSBram Moolenaar    def s:Func()
320081e17fbeSBram Moolenaar      au! CursorHold
320181e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
320281e17fbeSBram Moolenaar    enddef
320381e17fbeSBram Moolenaar    call s:Func()
320481e17fbeSBram Moolenaar    doau CursorHold
320581e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
320681e17fbeSBram Moolenaar    au! CursorHold
320781e17fbeSBram Moolenaar  END
320881e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
320981e17fbeSBram Moolenaarenddef
321081e17fbeSBram Moolenaar
32113896a105SBram Moolenaardef Test_cmdline_win()
32123896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
32133896a105SBram Moolenaar  # the command line window.
32143896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3215cfcd011fSBram Moolenaar  var export_lines =<< trim END
32163896a105SBram Moolenaar    vim9script
3217cfcd011fSBram Moolenaar    export var That = 'yes'
32183896a105SBram Moolenaar  END
32193896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3220cfcd011fSBram Moolenaar  var import_lines =<< trim END
32213896a105SBram Moolenaar    vim9script
32223896a105SBram Moolenaar    import That from './Xexport.vim'
32233896a105SBram Moolenaar  END
32243896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3225cfcd011fSBram Moolenaar  var save_rtp = &rtp
32263896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
32273896a105SBram Moolenaar  syntax on
32283896a105SBram Moolenaar  augroup CmdWin
32293896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
32303896a105SBram Moolenaar  augroup END
32313896a105SBram Moolenaar  # this will open and also close the cmdline window
32323896a105SBram Moolenaar  feedkeys('q:', 'xt')
32333896a105SBram Moolenaar  assert_equal('yes', g:got_there)
32343896a105SBram Moolenaar
32353896a105SBram Moolenaar  augroup CmdWin
32363896a105SBram Moolenaar    au!
32373896a105SBram Moolenaar  augroup END
32383896a105SBram Moolenaar  &rtp = save_rtp
32393896a105SBram Moolenaar  delete('rtp', 'rf')
32403896a105SBram Moolenaarenddef
32413896a105SBram Moolenaar
3242e3d4685fSBram Moolenaardef Test_invalid_sid()
3243e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
324425859dd7SBram Moolenaar
32459c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3246d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3247e3d4685fSBram Moolenaar  endif
3248e3d4685fSBram Moolenaar  delete('Xdidit')
3249e3d4685fSBram Moolenaarenddef
3250e3d4685fSBram Moolenaar
32519ec7026fSBram Moolenaardef Test_restoring_cpo()
32529ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
32539ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
32549ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
32559ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
32569ec7026fSBram Moolenaar  endif
32579ec7026fSBram Moolenaar  delete('Xsourced')
32589ec7026fSBram Moolenaar  delete('Xclose')
3259090728adSBram Moolenaar  delete('Xdone')
32600123cc1eSBram Moolenaar
32610123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
32620123cc1eSBram Moolenaar  set cpo=aABceFsMny>
32630123cc1eSBram Moolenaar  edit XanotherScript
32640123cc1eSBram Moolenaar  so %
32650123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
32660123cc1eSBram Moolenaar  :1del
32670123cc1eSBram Moolenaar  w
32680123cc1eSBram Moolenaar  so %
32690123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
32700123cc1eSBram Moolenaar
32710123cc1eSBram Moolenaar  delete('XanotherScript')
32720123cc1eSBram Moolenaar  set cpo&vim
32739ec7026fSBram Moolenaarenddef
32749ec7026fSBram Moolenaar
32759ec7026fSBram Moolenaar
3276f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3277cfcd011fSBram Moolenaar  var lines =<< trim END
3278cfcd011fSBram Moolenaar    var name: any
3279cfcd011fSBram Moolenaar    assert_equal(0, name)
3280f0afd9e1SBram Moolenaar  END
3281f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3282f0afd9e1SBram Moolenaarenddef
3283f0afd9e1SBram Moolenaar
32847e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
328558dbef33SBram Moolenaar  CheckRunVimInTerminal
328658dbef33SBram Moolenaar
32877e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
32887e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
32897e9210eaSBram Moolenaarendfunc
32907e9210eaSBram Moolenaar
32917e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
32929c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3293cfcd011fSBram Moolenaar  var lines =<< trim END
32949c4f5520SBram Moolenaar    func CheckAndQuit()
32959c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
32969c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
32979c4f5520SBram Moolenaar    endfunc
32989c4f5520SBram Moolenaar  END
32999c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
33009c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3301e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
33029c4f5520SBram Moolenaar  # define Afunc() on the command line
33039c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
33049c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
33052949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
33069c4f5520SBram Moolenaar
33079c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
33089c4f5520SBram Moolenaar  delete('XcallFunc')
33099c4f5520SBram Moolenaar  delete('Xdidcmd')
33109c4f5520SBram Moolenaarenddef
33119c4f5520SBram Moolenaar
3312fcdc5d83SBram Moolenaardef Test_script_var_scope()
3313fcdc5d83SBram Moolenaar  var lines =<< trim END
3314fcdc5d83SBram Moolenaar      vim9script
3315fcdc5d83SBram Moolenaar      if true
3316fcdc5d83SBram Moolenaar        if true
3317fcdc5d83SBram Moolenaar          var one = 'one'
3318fcdc5d83SBram Moolenaar          echo one
3319fcdc5d83SBram Moolenaar        endif
3320fcdc5d83SBram Moolenaar        echo one
3321fcdc5d83SBram Moolenaar      endif
3322fcdc5d83SBram Moolenaar  END
3323fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3324fcdc5d83SBram Moolenaar
3325fcdc5d83SBram Moolenaar  lines =<< trim END
3326fcdc5d83SBram Moolenaar      vim9script
3327fcdc5d83SBram Moolenaar      if true
3328fcdc5d83SBram Moolenaar        if false
3329fcdc5d83SBram Moolenaar          var one = 'one'
3330fcdc5d83SBram Moolenaar          echo one
3331fcdc5d83SBram Moolenaar        else
3332fcdc5d83SBram Moolenaar          var one = 'one'
3333fcdc5d83SBram Moolenaar          echo one
3334fcdc5d83SBram Moolenaar        endif
3335fcdc5d83SBram Moolenaar        echo one
3336fcdc5d83SBram Moolenaar      endif
3337fcdc5d83SBram Moolenaar  END
3338fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3339fcdc5d83SBram Moolenaar
3340fcdc5d83SBram Moolenaar  lines =<< trim END
3341fcdc5d83SBram Moolenaar      vim9script
3342fcdc5d83SBram Moolenaar      while true
3343fcdc5d83SBram Moolenaar        var one = 'one'
3344fcdc5d83SBram Moolenaar        echo one
3345fcdc5d83SBram Moolenaar        break
3346fcdc5d83SBram Moolenaar      endwhile
3347fcdc5d83SBram Moolenaar      echo one
3348fcdc5d83SBram Moolenaar  END
3349fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3350fcdc5d83SBram Moolenaar
3351fcdc5d83SBram Moolenaar  lines =<< trim END
3352fcdc5d83SBram Moolenaar      vim9script
3353fcdc5d83SBram Moolenaar      for i in range(1)
3354fcdc5d83SBram Moolenaar        var one = 'one'
3355fcdc5d83SBram Moolenaar        echo one
3356fcdc5d83SBram Moolenaar      endfor
3357fcdc5d83SBram Moolenaar      echo one
3358fcdc5d83SBram Moolenaar  END
3359fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
33609becdf2bSBram Moolenaar
33619becdf2bSBram Moolenaar  lines =<< trim END
33629becdf2bSBram Moolenaar      vim9script
33639becdf2bSBram Moolenaar      {
33649becdf2bSBram Moolenaar        var one = 'one'
33659becdf2bSBram Moolenaar        assert_equal('one', one)
33669becdf2bSBram Moolenaar      }
33679becdf2bSBram Moolenaar      assert_false(exists('one'))
33689becdf2bSBram Moolenaar      assert_false(exists('s:one'))
33699becdf2bSBram Moolenaar  END
33709becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
33719becdf2bSBram Moolenaar
33729becdf2bSBram Moolenaar  lines =<< trim END
33739becdf2bSBram Moolenaar      vim9script
33749becdf2bSBram Moolenaar      {
33759becdf2bSBram Moolenaar        var one = 'one'
33769becdf2bSBram Moolenaar        echo one
33779becdf2bSBram Moolenaar      }
33789becdf2bSBram Moolenaar      echo one
33799becdf2bSBram Moolenaar  END
33809becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3381fcdc5d83SBram Moolenaarenddef
3382fcdc5d83SBram Moolenaar
3383352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3384352134bbSBram Moolenaar  var lines =<< trim END
3385352134bbSBram Moolenaar    vim9script
3386352134bbSBram Moolenaar    def Callback(...l: any)
3387352134bbSBram Moolenaar      try
3388352134bbSBram Moolenaar        var x: string
3389352134bbSBram Moolenaar        var y: string
3390352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3391352134bbSBram Moolenaar        [x, y] = ['']
3392352134bbSBram Moolenaar      catch
3393352134bbSBram Moolenaar        g:caught = 'yes'
3394352134bbSBram Moolenaar      endtry
3395352134bbSBram Moolenaar    enddef
3396e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3397352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3398352134bbSBram Moolenaar  END
3399352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3400352134bbSBram Moolenaar
3401352134bbSBram Moolenaar  unlet g:caught
3402352134bbSBram Moolenaarenddef
3403352134bbSBram Moolenaar
3404631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3405631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3406631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3407631e8f93SBram Moolenaar  endif
3408631e8f93SBram Moolenaar  var lines =<< trim END
3409631e8f93SBram Moolenaar      vim9script
3410631e8f93SBram Moolenaar      var source: list<number>
3411631e8f93SBram Moolenaar      def Out_cb(...l: any)
3412631e8f93SBram Moolenaar          eval [][0]
3413631e8f93SBram Moolenaar      enddef
3414631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3415631e8f93SBram Moolenaar          sleep 1m
3416631e8f93SBram Moolenaar          source += l
3417631e8f93SBram Moolenaar      enddef
3418e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
34196f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
34206f17a3f0SBram Moolenaar        sleep 10m
34216f17a3f0SBram Moolenaar      endwhile
3422206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3423206c2a6eSBram Moolenaar      sleep 100m
3424631e8f93SBram Moolenaar  END
3425631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3426631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3427631e8f93SBram Moolenaar  delete('Xdef')
3428631e8f93SBram Moolenaarenddef
3429631e8f93SBram Moolenaar
34304324d87aSBram Moolenaardef InvokeNormal()
34314324d87aSBram Moolenaar  exe "norm! :m+1\r"
34324324d87aSBram Moolenaarenddef
34334324d87aSBram Moolenaar
34344324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
34354324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
34364324d87aSBram Moolenaar  new
34374324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
34384324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
34394324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
34404324d87aSBram Moolenaar  xunmap <F3>
3441b5b9480eSBram Moolenaarenddef
3442b5b9480eSBram Moolenaar
3443b5b9480eSBram Moolenaardef Test_white_space_after_command()
3444b5b9480eSBram Moolenaar  var lines =<< trim END
3445b5b9480eSBram Moolenaar    exit_cb: Func})
3446b5b9480eSBram Moolenaar  END
3447b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3448f8103f27SBram Moolenaar
3449f8103f27SBram Moolenaar  lines =<< trim END
3450f8103f27SBram Moolenaar    e#
3451f8103f27SBram Moolenaar  END
3452f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
34534324d87aSBram Moolenaarenddef
34544324d87aSBram Moolenaar
34554aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
34564aab88d9SBram Moolenaar  var lines =<< trim END
34574aab88d9SBram Moolenaar      vim9script
34584aab88d9SBram Moolenaar      if exists('g:guard')
34594aab88d9SBram Moolenaar        finish
34604aab88d9SBram Moolenaar      endif
34614aab88d9SBram Moolenaar      g:guard = 1
34624aab88d9SBram Moolenaar      var name = 'thename'
34634aab88d9SBram Moolenaar      def g:GetName(): string
34644aab88d9SBram Moolenaar        return name
34654aab88d9SBram Moolenaar      enddef
34664aab88d9SBram Moolenaar      def g:SetName(arg: string)
34674aab88d9SBram Moolenaar        name = arg
34684aab88d9SBram Moolenaar      enddef
34694aab88d9SBram Moolenaar  END
34704aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
34714aab88d9SBram Moolenaar  so XscriptTwice.vim
34724aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
34734aab88d9SBram Moolenaar  g:SetName('newname')
34744aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
34754aab88d9SBram Moolenaar  so XscriptTwice.vim
34764aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
34774aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
34784aab88d9SBram Moolenaar
34794aab88d9SBram Moolenaar  delfunc g:GetName
34804aab88d9SBram Moolenaar  delfunc g:SetName
34814aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
34824aab88d9SBram Moolenaar  unlet g:guard
34834aab88d9SBram Moolenaarenddef
34844aab88d9SBram Moolenaar
34854aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
34864aab88d9SBram Moolenaar  var exportlines =<< trim END
34874aab88d9SBram Moolenaar      vim9script
34884aab88d9SBram Moolenaar      if exists('g:guard')
34894aab88d9SBram Moolenaar        finish
34904aab88d9SBram Moolenaar      endif
34914aab88d9SBram Moolenaar      g:guard = 1
34924aab88d9SBram Moolenaar      export var name = 'someName'
34934aab88d9SBram Moolenaar  END
34944aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
34954aab88d9SBram Moolenaar
34964aab88d9SBram Moolenaar  var lines =<< trim END
34974aab88d9SBram Moolenaar      vim9script
34984aab88d9SBram Moolenaar      import name from './XexportScript.vim'
34994aab88d9SBram Moolenaar      def g:GetName(): string
35004aab88d9SBram Moolenaar        return name
35014aab88d9SBram Moolenaar      enddef
35024aab88d9SBram Moolenaar  END
35034aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
35044aab88d9SBram Moolenaar  so XscriptImport.vim
35054aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
35064aab88d9SBram Moolenaar
35074aab88d9SBram Moolenaar  so XexportScript.vim
35084aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
35094aab88d9SBram Moolenaar
35104aab88d9SBram Moolenaar  delfunc g:GetName
35114aab88d9SBram Moolenaar  delete('XexportScript.vim')
35124aab88d9SBram Moolenaar  delete('XscriptImport.vim')
35134aab88d9SBram Moolenaar  unlet g:guard
35144aab88d9SBram Moolenaarenddef
35154aab88d9SBram Moolenaar
351610b9421fSBram Moolenaardef Test_unsupported_commands()
351710b9421fSBram Moolenaar  var lines =<< trim END
351810b9421fSBram Moolenaar      ka
351910b9421fSBram Moolenaar  END
352010b9421fSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1100:')
352110b9421fSBram Moolenaar
352210b9421fSBram Moolenaar  lines =<< trim END
3523ada1d870SBram Moolenaar      :1ka
3524ada1d870SBram Moolenaar  END
3525ada1d870SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E481:')
3526ada1d870SBram Moolenaar
3527ada1d870SBram Moolenaar  lines =<< trim END
352810b9421fSBram Moolenaar    t
352910b9421fSBram Moolenaar  END
353010b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
353110b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
353210b9421fSBram Moolenaar
353310b9421fSBram Moolenaar  lines =<< trim END
353410b9421fSBram Moolenaar    x
353510b9421fSBram Moolenaar  END
353610b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
353710b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
353810b9421fSBram Moolenaar
353910b9421fSBram Moolenaar  lines =<< trim END
354010b9421fSBram Moolenaar    xit
354110b9421fSBram Moolenaar  END
354210b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
354310b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
354410b9421fSBram Moolenaarenddef
354510b9421fSBram Moolenaar
3546585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3547585fea7bSBram Moolenaardef Test_substitute_cmd()
3548585fea7bSBram Moolenaar  new
3549585fea7bSBram Moolenaar  setline(1, 'something')
3550585fea7bSBram Moolenaar  :substitute(some(other(
3551585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3552585fea7bSBram Moolenaar  bwipe!
3553585fea7bSBram Moolenaar
3554f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3555cfcd011fSBram Moolenaar  var lines =<< trim END
3556585fea7bSBram Moolenaar    vim9script
3557585fea7bSBram Moolenaar    new
3558585fea7bSBram Moolenaar    setline(1, 'something')
3559585fea7bSBram Moolenaar    :substitute(some(other(
3560585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3561585fea7bSBram Moolenaar    bwipe!
3562585fea7bSBram Moolenaar  END
3563585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3564585fea7bSBram Moolenaar  source Xvim9lines
3565585fea7bSBram Moolenaar
3566585fea7bSBram Moolenaar  delete('Xvim9lines')
3567585fea7bSBram Moolenaarenddef
3568585fea7bSBram Moolenaar
35698a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3570