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
837294bd6SBram Moolenaarsource screendump.vim
98a7d6542SBram Moolenaar
105d72ce69SBram Moolenaardef Test_range_only()
115d72ce69SBram Moolenaar  new
125d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
135d72ce69SBram Moolenaar  :/Blah/
145d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
15c2af0affSBram Moolenaar  bwipe!
16c2af0affSBram Moolenaar
17c2af0affSBram Moolenaar  # without range commands use current line
18c2af0affSBram Moolenaar  new
19c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
20c2af0affSBram Moolenaar  :2
21c2af0affSBram Moolenaar  print
22c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
23c2af0affSBram Moolenaar  :3
24c2af0affSBram Moolenaar  list
25c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
26b8554304SBram Moolenaar
27b8554304SBram Moolenaar  # missing command does not print the line
28b8554304SBram Moolenaar  var lines =<< trim END
29b8554304SBram Moolenaar    vim9script
30b8554304SBram Moolenaar    :1|
31b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
32b8554304SBram Moolenaar    :|
33b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
34b8554304SBram Moolenaar  END
35b8554304SBram Moolenaar  CheckScriptSuccess(lines)
36b8554304SBram Moolenaar
37c2af0affSBram Moolenaar  bwipe!
38025cb1caSBram Moolenaar
39025cb1caSBram Moolenaar  # won't generate anything
40025cb1caSBram Moolenaar  if false
41025cb1caSBram Moolenaar    :123
42025cb1caSBram Moolenaar  endif
435d72ce69SBram Moolenaarenddef
445d72ce69SBram Moolenaar
45a6e67e4fSBram Moolenaarlet g:alist = [7]
46a6e67e4fSBram Moolenaarlet g:astring = 'text'
47f0b9f43cSBram Moolenaarlet g:anumber = 123
486e587dcbSBram Moolenaar
494c17ad94SBram Moolenaardef Test_delfunction()
50f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
514c17ad94SBram Moolenaar  CheckScriptSuccess([
524c17ad94SBram Moolenaar      'vim9script',
534c17ad94SBram Moolenaar      'func CheckMe()',
544c17ad94SBram Moolenaar      '  return 123',
554c17ad94SBram Moolenaar      'endfunc',
564c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
574c17ad94SBram Moolenaar      ])
584c17ad94SBram Moolenaar
59f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
604c17ad94SBram Moolenaar  CheckScriptFailure([
614c17ad94SBram Moolenaar      'vim9script',
624c17ad94SBram Moolenaar      'func DeleteMe1()',
634c17ad94SBram Moolenaar      'endfunc',
644c17ad94SBram Moolenaar      'delfunction DeleteMe1',
654c17ad94SBram Moolenaar      ], 'E1084:')
664c17ad94SBram Moolenaar  CheckScriptFailure([
674c17ad94SBram Moolenaar      'vim9script',
684c17ad94SBram Moolenaar      'func DeleteMe2()',
694c17ad94SBram Moolenaar      'endfunc',
704c17ad94SBram Moolenaar      'def DoThat()',
714c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
724c17ad94SBram Moolenaar      'enddef',
734c17ad94SBram Moolenaar      'DoThat()',
744c17ad94SBram Moolenaar      ], 'E1084:')
754c17ad94SBram Moolenaar  CheckScriptFailure([
764c17ad94SBram Moolenaar      'vim9script',
774c17ad94SBram Moolenaar      'def DeleteMe3()',
784c17ad94SBram Moolenaar      'enddef',
794c17ad94SBram Moolenaar      'delfunction DeleteMe3',
804c17ad94SBram Moolenaar      ], 'E1084:')
814c17ad94SBram Moolenaar  CheckScriptFailure([
824c17ad94SBram Moolenaar      'vim9script',
834c17ad94SBram Moolenaar      'def DeleteMe4()',
844c17ad94SBram Moolenaar      'enddef',
854c17ad94SBram Moolenaar      'def DoThat()',
864c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
874c17ad94SBram Moolenaar      'enddef',
884c17ad94SBram Moolenaar      'DoThat()',
894c17ad94SBram Moolenaar      ], 'E1084:')
90925e9fd6SBram Moolenaar
91925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
92cfcd011fSBram Moolenaar  var lines =<< trim END
93925e9fd6SBram Moolenaar      vim9script
94925e9fd6SBram Moolenaar      def g:Global(): string
95925e9fd6SBram Moolenaar        return "yes"
96925e9fd6SBram Moolenaar      enddef
97925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
98925e9fd6SBram Moolenaar      def! g:Global(): string
99925e9fd6SBram Moolenaar        return "no"
100925e9fd6SBram Moolenaar      enddef
101925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
102925e9fd6SBram Moolenaar      delfunc g:Global
103925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
104925e9fd6SBram Moolenaar  END
105925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
106925e9fd6SBram Moolenaar
107925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
108925e9fd6SBram Moolenaar  lines =<< trim END
109925e9fd6SBram Moolenaar      vim9script
110925e9fd6SBram Moolenaar      func g:Global()
111925e9fd6SBram Moolenaar        return "yes"
112925e9fd6SBram Moolenaar      endfunc
113925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
114925e9fd6SBram Moolenaar      def! g:Global(): string
115925e9fd6SBram Moolenaar        return "no"
116925e9fd6SBram Moolenaar      enddef
117925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
118925e9fd6SBram Moolenaar      delfunc g:Global
119925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
120925e9fd6SBram Moolenaar  END
121925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
122925e9fd6SBram Moolenaar
123925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
124925e9fd6SBram Moolenaar  lines =<< trim END
125925e9fd6SBram Moolenaar      vim9script
126925e9fd6SBram Moolenaar      def g:Global(): string
127925e9fd6SBram Moolenaar        return "yes"
128925e9fd6SBram Moolenaar      enddef
129925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
130925e9fd6SBram Moolenaar      func! g:Global()
131925e9fd6SBram Moolenaar        return "no"
132925e9fd6SBram Moolenaar      endfunc
133925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
134925e9fd6SBram Moolenaar      delfunc g:Global
135925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
136925e9fd6SBram Moolenaar  END
137925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1384c17ad94SBram Moolenaarenddef
1394c17ad94SBram Moolenaar
14008052228SBram Moolenaardef Test_wrong_type()
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
143cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
144cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
145599c89c8SBram Moolenaar
146cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
147cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
14842a480bfSBram Moolenaar
149cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
150cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
151cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
152cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
153cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
154cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
155cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
156cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
157cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
158cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
159cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
160a0a9f43aSBram Moolenaar
161cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
162cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
16308052228SBram Moolenaarenddef
1648a7d6542SBram Moolenaar
16510c65860SBram Moolenaardef Test_script_wrong_type()
16610c65860SBram Moolenaar  var lines =<< trim END
16710c65860SBram Moolenaar      vim9script
16810c65860SBram Moolenaar      var s:dict: dict<string>
16910c65860SBram Moolenaar      s:dict['a'] = ['x']
17010c65860SBram Moolenaar  END
17110c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
17210c65860SBram Moolenaarenddef
17310c65860SBram Moolenaar
17408052228SBram Moolenaardef Test_const()
175cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
176cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
177cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
17830fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
17930fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
180dbeecb2bSBram Moolenaar
181cfcd011fSBram Moolenaar  var lines =<< trim END
18230fd8204SBram Moolenaar    final list = [1, 2, 3]
183dbeecb2bSBram Moolenaar    list[0] = 4
1840b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
18530fd8204SBram Moolenaar    const other = [5, 6, 7]
1860b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
18771abe482SBram Moolenaar
188cfcd011fSBram Moolenaar    var varlist = [7, 8]
18930fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
19071abe482SBram Moolenaar    varlist[0] = 77
19171abe482SBram Moolenaar    # TODO: does not work yet
19271abe482SBram Moolenaar    # constlist[1][1] = 88
193cfcd011fSBram Moolenaar    var cl = constlist[1]
19471abe482SBram Moolenaar    cl[1] = 88
19571abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
19671abe482SBram Moolenaar
197e0de171eSBram Moolenaar    var vardict = {five: 5, six: 6}
198e0de171eSBram Moolenaar    const constdict = {one: 1, two: vardict, three: 3}
19971abe482SBram Moolenaar    vardict['five'] = 55
20071abe482SBram Moolenaar    # TODO: does not work yet
20171abe482SBram Moolenaar    # constdict['two']['six'] = 66
202cfcd011fSBram Moolenaar    var cd = constdict['two']
20371abe482SBram Moolenaar    cd['six'] = 66
204e0de171eSBram Moolenaar    constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
205dbeecb2bSBram Moolenaar  END
206dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
20708052228SBram Moolenaarenddef
2088a7d6542SBram Moolenaar
2090b4c66c6SBram Moolenaardef Test_const_bang()
210cfcd011fSBram Moolenaar  var lines =<< trim END
21130fd8204SBram Moolenaar      const var = 234
2120b4c66c6SBram Moolenaar      var = 99
2130b4c66c6SBram Moolenaar  END
2140b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
2150b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
2160b4c66c6SBram Moolenaar
2170b4c66c6SBram Moolenaar  lines =<< trim END
21830fd8204SBram Moolenaar      const ll = [2, 3, 4]
2190b4c66c6SBram Moolenaar      ll[0] = 99
2200b4c66c6SBram Moolenaar  END
2210b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2220b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2230b4c66c6SBram Moolenaar
2240b4c66c6SBram Moolenaar  lines =<< trim END
22530fd8204SBram Moolenaar      const ll = [2, 3, 4]
2260b4c66c6SBram Moolenaar      ll[3] = 99
2270b4c66c6SBram Moolenaar  END
2280b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2290b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2300b4c66c6SBram Moolenaar
2310b4c66c6SBram Moolenaar  lines =<< trim END
232e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2330b4c66c6SBram Moolenaar      dd["one"] = 99
2340b4c66c6SBram Moolenaar  END
2350b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2360b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2370b4c66c6SBram Moolenaar
2380b4c66c6SBram Moolenaar  lines =<< trim END
239e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2400b4c66c6SBram Moolenaar      dd["three"] = 99
2410b4c66c6SBram Moolenaar  END
2420b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2430b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2440b4c66c6SBram Moolenaarenddef
2450b4c66c6SBram Moolenaar
246df069eecSBram Moolenaardef Test_range_no_colon()
247d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
248d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
249d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
250d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
251df069eecSBram Moolenaarenddef
252df069eecSBram Moolenaar
253df069eecSBram Moolenaar
2548a7d6542SBram Moolenaardef Test_block()
255cfcd011fSBram Moolenaar  var outer = 1
2568a7d6542SBram Moolenaar  {
257cfcd011fSBram Moolenaar    var inner = 2
2588a7d6542SBram Moolenaar    assert_equal(1, outer)
2598a7d6542SBram Moolenaar    assert_equal(2, inner)
2608a7d6542SBram Moolenaar  }
2618a7d6542SBram Moolenaar  assert_equal(1, outer)
2623f1e9f00SBram Moolenaar
2633f1e9f00SBram Moolenaar  {|echo 'yes'|}
2648a7d6542SBram Moolenaarenddef
2658a7d6542SBram Moolenaar
26608052228SBram Moolenaardef Test_block_failure()
267cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
26808052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
26908052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
27008052228SBram Moolenaarenddef
2718a7d6542SBram Moolenaar
272fbbcd003SBram Moolenaardef Test_block_local_vars()
273fbbcd003SBram Moolenaar  var lines =<< trim END
274fbbcd003SBram Moolenaar      vim9script
275ed234f24SBram Moolenaar      v:testing = 1
276fbbcd003SBram Moolenaar      if true
277ed234f24SBram Moolenaar        var text = ['hello']
278ed234f24SBram Moolenaar        def SayHello(): list<string>
279fbbcd003SBram Moolenaar          return text
280fbbcd003SBram Moolenaar        enddef
281fbbcd003SBram Moolenaar        def SetText(v: string)
282ed234f24SBram Moolenaar          text = [v]
283fbbcd003SBram Moolenaar        enddef
284fbbcd003SBram Moolenaar      endif
285fbbcd003SBram Moolenaar
286fbbcd003SBram Moolenaar      if true
287ed234f24SBram Moolenaar        var text = ['again']
288ed234f24SBram Moolenaar        def SayAgain(): list<string>
289fbbcd003SBram Moolenaar          return text
290fbbcd003SBram Moolenaar        enddef
291fbbcd003SBram Moolenaar      endif
292ed234f24SBram Moolenaar
293ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
294ed234f24SBram Moolenaar      test_garbagecollect_now()
295ed234f24SBram Moolenaar
296fbbcd003SBram Moolenaar      defcompile
297fbbcd003SBram Moolenaar
298ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
299ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
300fbbcd003SBram Moolenaar
301fbbcd003SBram Moolenaar      SetText('foobar')
302ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
303ed234f24SBram Moolenaar
304ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
305ed234f24SBram Moolenaar      qall!
306fbbcd003SBram Moolenaar  END
307ed234f24SBram Moolenaar
308ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
309ed234f24SBram Moolenaar  # context gets garbage collected.
310ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
311ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
312ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
313ed234f24SBram Moolenaar
314ed234f24SBram Moolenaar  delete('Xscript')
315ed234f24SBram Moolenaar  delete('Xdidit')
316fbbcd003SBram Moolenaarenddef
317fbbcd003SBram Moolenaar
31839ca4127SBram Moolenaardef Test_block_local_vars_with_func()
31939ca4127SBram Moolenaar  var lines =<< trim END
32039ca4127SBram Moolenaar      vim9script
32139ca4127SBram Moolenaar      if true
32239ca4127SBram Moolenaar        var foo = 'foo'
32339ca4127SBram Moolenaar        if true
32439ca4127SBram Moolenaar          var bar = 'bar'
32539ca4127SBram Moolenaar          def Func(): list<string>
32639ca4127SBram Moolenaar            return [foo, bar]
32739ca4127SBram Moolenaar          enddef
32839ca4127SBram Moolenaar        endif
32939ca4127SBram Moolenaar      endif
33039ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
33139ca4127SBram Moolenaar      # "foo" and "bar"
33239ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
33339ca4127SBram Moolenaar  END
33439ca4127SBram Moolenaar  CheckScriptSuccess(lines)
33539ca4127SBram Moolenaarenddef
33639ca4127SBram Moolenaar
337d032f34aSBram Moolenaarfunc g:NoSuchFunc()
338d032f34aSBram Moolenaar  echo 'none'
339d032f34aSBram Moolenaarendfunc
340d032f34aSBram Moolenaar
3419e1d9e34SBram Moolenaardef Test_try_catch_throw()
342cfcd011fSBram Moolenaar  var l = []
3437a092245SBram Moolenaar  try # comment
3448a7d6542SBram Moolenaar    add(l, '1')
3458a7d6542SBram Moolenaar    throw 'wrong'
3468a7d6542SBram Moolenaar    add(l, '2')
3477a092245SBram Moolenaar  catch # comment
3488a7d6542SBram Moolenaar    add(l, v:exception)
3497a092245SBram Moolenaar  finally # comment
3508a7d6542SBram Moolenaar    add(l, '3')
3517a092245SBram Moolenaar  endtry # comment
3528a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
35368d130c6SBram Moolenaar
354e859312eSBram Moolenaar  l = []
355e859312eSBram Moolenaar  try
356e859312eSBram Moolenaar    try
357e859312eSBram Moolenaar      add(l, '1')
358e859312eSBram Moolenaar      throw 'wrong'
359e859312eSBram Moolenaar      add(l, '2')
360e859312eSBram Moolenaar    catch /right/
361e859312eSBram Moolenaar      add(l, v:exception)
362e859312eSBram Moolenaar    endtry
363e859312eSBram Moolenaar  catch /wrong/
364e859312eSBram Moolenaar    add(l, 'caught')
365373863edSBram Moolenaar  fina
366e859312eSBram Moolenaar    add(l, 'finally')
367e859312eSBram Moolenaar  endtry
368e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
369e859312eSBram Moolenaar
370cfcd011fSBram Moolenaar  var n: number
37168d130c6SBram Moolenaar  try
37268d130c6SBram Moolenaar    n = l[3]
37368d130c6SBram Moolenaar  catch /E684:/
37468d130c6SBram Moolenaar    n = 99
37568d130c6SBram Moolenaar  endtry
37668d130c6SBram Moolenaar  assert_equal(99, n)
37768d130c6SBram Moolenaar
37869f7050cSBram Moolenaar  var done = 'no'
37969f7050cSBram Moolenaar  if 0
38069f7050cSBram Moolenaar    try | catch | endtry
38169f7050cSBram Moolenaar  else
38269f7050cSBram Moolenaar    done = 'yes'
38369f7050cSBram Moolenaar  endif
38469f7050cSBram Moolenaar  assert_equal('yes', done)
38569f7050cSBram Moolenaar
38669f7050cSBram Moolenaar  done = 'no'
38769f7050cSBram Moolenaar  if 1
38869f7050cSBram Moolenaar    done = 'yes'
38969f7050cSBram Moolenaar  else
39069f7050cSBram Moolenaar    try | catch | endtry
39169f7050cSBram Moolenaar    done = 'never'
39269f7050cSBram Moolenaar  endif
39369f7050cSBram Moolenaar  assert_equal('yes', done)
39469f7050cSBram Moolenaar
39569f7050cSBram Moolenaar  if 1
39669f7050cSBram Moolenaar  else
39769f7050cSBram Moolenaar    try | catch /pat/ | endtry
39869f7050cSBram Moolenaar    try | catch /pat/
39969f7050cSBram Moolenaar    endtry
40069f7050cSBram Moolenaar    try
40169f7050cSBram Moolenaar    catch /pat/ | endtry
40269f7050cSBram Moolenaar    try
40369f7050cSBram Moolenaar    catch /pat/
40469f7050cSBram Moolenaar    endtry
40569f7050cSBram Moolenaar  endif
40669f7050cSBram Moolenaar
40768d130c6SBram Moolenaar  try
408cc673e74SBram Moolenaar    # string slice returns a string, not a number
40968d130c6SBram Moolenaar    n = g:astring[3]
4105e654230SBram Moolenaar  catch /E1012:/
41168d130c6SBram Moolenaar    n = 77
41268d130c6SBram Moolenaar  endtry
41368d130c6SBram Moolenaar  assert_equal(77, n)
41468d130c6SBram Moolenaar
41568d130c6SBram Moolenaar  try
41668d130c6SBram Moolenaar    n = l[g:astring]
4175e654230SBram Moolenaar  catch /E1012:/
41856acb094SBram Moolenaar    n = 88
41968d130c6SBram Moolenaar  endtry
42056acb094SBram Moolenaar  assert_equal(88, n)
42168d130c6SBram Moolenaar
42268d130c6SBram Moolenaar  try
42368d130c6SBram Moolenaar    n = s:does_not_exist
42468d130c6SBram Moolenaar  catch /E121:/
425f0b9f43cSBram Moolenaar    n = 111
426f0b9f43cSBram Moolenaar  endtry
427f0b9f43cSBram Moolenaar  assert_equal(111, n)
428f0b9f43cSBram Moolenaar
429f0b9f43cSBram Moolenaar  try
430f0b9f43cSBram Moolenaar    n = g:does_not_exist
431f0b9f43cSBram Moolenaar  catch /E121:/
43268d130c6SBram Moolenaar    n = 121
43368d130c6SBram Moolenaar  endtry
43468d130c6SBram Moolenaar  assert_equal(121, n)
43568d130c6SBram Moolenaar
436e0de171eSBram Moolenaar  var d = {one: 1}
43768d130c6SBram Moolenaar  try
43868d130c6SBram Moolenaar    n = d[g:astring]
43968d130c6SBram Moolenaar  catch /E716:/
44068d130c6SBram Moolenaar    n = 222
44168d130c6SBram Moolenaar  endtry
44268d130c6SBram Moolenaar  assert_equal(222, n)
443f0b9f43cSBram Moolenaar
444f0b9f43cSBram Moolenaar  try
445f0b9f43cSBram Moolenaar    n = -g:astring
446f0b9f43cSBram Moolenaar  catch /E39:/
447f0b9f43cSBram Moolenaar    n = 233
448f0b9f43cSBram Moolenaar  endtry
449f0b9f43cSBram Moolenaar  assert_equal(233, n)
450f0b9f43cSBram Moolenaar
451f0b9f43cSBram Moolenaar  try
452f0b9f43cSBram Moolenaar    n = +g:astring
453f0b9f43cSBram Moolenaar  catch /E1030:/
454f0b9f43cSBram Moolenaar    n = 244
455f0b9f43cSBram Moolenaar  endtry
456f0b9f43cSBram Moolenaar  assert_equal(244, n)
457f0b9f43cSBram Moolenaar
458f0b9f43cSBram Moolenaar  try
459f0b9f43cSBram Moolenaar    n = +g:alist
460f0b9f43cSBram Moolenaar  catch /E745:/
461f0b9f43cSBram Moolenaar    n = 255
462f0b9f43cSBram Moolenaar  endtry
463f0b9f43cSBram Moolenaar  assert_equal(255, n)
464f0b9f43cSBram Moolenaar
465cfcd011fSBram Moolenaar  var nd: dict<any>
466f0b9f43cSBram Moolenaar  try
4672e5910bfSBram Moolenaar    nd = {[g:alist]: 1}
4682e5910bfSBram Moolenaar  catch /E1105:/
469f0b9f43cSBram Moolenaar    n = 266
470f0b9f43cSBram Moolenaar  endtry
471f0b9f43cSBram Moolenaar  assert_equal(266, n)
472f0b9f43cSBram Moolenaar
473f0b9f43cSBram Moolenaar  try
474f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
475f0b9f43cSBram Moolenaar  catch /E1093:/
476f0b9f43cSBram Moolenaar    n = 277
477f0b9f43cSBram Moolenaar  endtry
478f0b9f43cSBram Moolenaar  assert_equal(277, n)
479f0b9f43cSBram Moolenaar
480e859312eSBram Moolenaar  try
481e859312eSBram Moolenaar    &ts = g:astring
4825e654230SBram Moolenaar  catch /E1012:/
483e859312eSBram Moolenaar    n = 288
484e859312eSBram Moolenaar  endtry
485e859312eSBram Moolenaar  assert_equal(288, n)
486e859312eSBram Moolenaar
487e859312eSBram Moolenaar  try
488e859312eSBram Moolenaar    &backspace = 'asdf'
489e859312eSBram Moolenaar  catch /E474:/
490e859312eSBram Moolenaar    n = 299
491e859312eSBram Moolenaar  endtry
492e859312eSBram Moolenaar  assert_equal(299, n)
493e859312eSBram Moolenaar
494e859312eSBram Moolenaar  l = [1]
495e859312eSBram Moolenaar  try
496e859312eSBram Moolenaar    l[3] = 3
497e859312eSBram Moolenaar  catch /E684:/
498e859312eSBram Moolenaar    n = 300
499e859312eSBram Moolenaar  endtry
500e859312eSBram Moolenaar  assert_equal(300, n)
501e859312eSBram Moolenaar
502e859312eSBram Moolenaar  try
503e859312eSBram Moolenaar    unlet g:does_not_exist
504e859312eSBram Moolenaar  catch /E108:/
505e859312eSBram Moolenaar    n = 322
506e859312eSBram Moolenaar  endtry
507e859312eSBram Moolenaar  assert_equal(322, n)
508e859312eSBram Moolenaar
509e859312eSBram Moolenaar  try
5102bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
511e859312eSBram Moolenaar  catch /E721:/
512e859312eSBram Moolenaar    n = 333
513e859312eSBram Moolenaar  endtry
514e859312eSBram Moolenaar  assert_equal(333, n)
515e859312eSBram Moolenaar
516e859312eSBram Moolenaar  try
517e859312eSBram Moolenaar    l = DeletedFunc()
518e859312eSBram Moolenaar  catch /E933:/
519e859312eSBram Moolenaar    n = 344
520e859312eSBram Moolenaar  endtry
521e859312eSBram Moolenaar  assert_equal(344, n)
522d032f34aSBram Moolenaar
523d032f34aSBram Moolenaar  try
524d032f34aSBram Moolenaar    echo len(v:true)
525d032f34aSBram Moolenaar  catch /E701:/
526d032f34aSBram Moolenaar    n = 355
527d032f34aSBram Moolenaar  endtry
528d032f34aSBram Moolenaar  assert_equal(355, n)
529d032f34aSBram Moolenaar
530cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
531d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
532d032f34aSBram Moolenaar  try
533d032f34aSBram Moolenaar    echo P()
534d032f34aSBram Moolenaar  catch /E117:/
535d032f34aSBram Moolenaar    n = 366
536d032f34aSBram Moolenaar  endtry
537d032f34aSBram Moolenaar  assert_equal(366, n)
538d032f34aSBram Moolenaar
539d032f34aSBram Moolenaar  try
540d032f34aSBram Moolenaar    echo g:NoSuchFunc()
541d032f34aSBram Moolenaar  catch /E117:/
542d032f34aSBram Moolenaar    n = 377
543d032f34aSBram Moolenaar  endtry
544d032f34aSBram Moolenaar  assert_equal(377, n)
545d032f34aSBram Moolenaar
546d032f34aSBram Moolenaar  try
547d032f34aSBram Moolenaar    echo g:alist + 4
548d032f34aSBram Moolenaar  catch /E745:/
549d032f34aSBram Moolenaar    n = 388
550d032f34aSBram Moolenaar  endtry
551d032f34aSBram Moolenaar  assert_equal(388, n)
552d032f34aSBram Moolenaar
553d032f34aSBram Moolenaar  try
554d032f34aSBram Moolenaar    echo 4 + g:alist
555d032f34aSBram Moolenaar  catch /E745:/
556d032f34aSBram Moolenaar    n = 399
557d032f34aSBram Moolenaar  endtry
558d032f34aSBram Moolenaar  assert_equal(399, n)
559d032f34aSBram Moolenaar
560d032f34aSBram Moolenaar  try
561d032f34aSBram Moolenaar    echo g:alist.member
562d032f34aSBram Moolenaar  catch /E715:/
563d032f34aSBram Moolenaar    n = 400
564d032f34aSBram Moolenaar  endtry
565d032f34aSBram Moolenaar  assert_equal(400, n)
566d032f34aSBram Moolenaar
567d032f34aSBram Moolenaar  try
568d032f34aSBram Moolenaar    echo d.member
569d032f34aSBram Moolenaar  catch /E716:/
570d032f34aSBram Moolenaar    n = 411
571d032f34aSBram Moolenaar  endtry
572d032f34aSBram Moolenaar  assert_equal(411, n)
573d9d7789bSBram Moolenaar
574d9d7789bSBram Moolenaar  var counter = 0
575d9d7789bSBram Moolenaar  for i in range(4)
576d9d7789bSBram Moolenaar    try
577d9d7789bSBram Moolenaar      eval [][0]
578d9d7789bSBram Moolenaar    catch
579d9d7789bSBram Moolenaar    endtry
580d9d7789bSBram Moolenaar    counter += 1
581d9d7789bSBram Moolenaar  endfor
582d9d7789bSBram Moolenaar  assert_equal(4, counter)
5837e82c5f3SBram Moolenaar
5847e82c5f3SBram Moolenaar  # return in finally after empty catch
5857e82c5f3SBram Moolenaar  def ReturnInFinally(): number
5867e82c5f3SBram Moolenaar    try
5877e82c5f3SBram Moolenaar    finally
5887e82c5f3SBram Moolenaar      return 4
5897e82c5f3SBram Moolenaar    endtry
5907e82c5f3SBram Moolenaar    return 2
5917e82c5f3SBram Moolenaar  enddef
5927e82c5f3SBram Moolenaar  assert_equal(4, ReturnInFinally())
5938a7d6542SBram Moolenaarenddef
5948a7d6542SBram Moolenaar
5952e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to
5962e34c34bSBram Moolenaardef TryContinueFunc()
5972e34c34bSBram Moolenaar while g:Count < 2
5982e34c34bSBram Moolenaar   g:sequence ..= 't'
5992e34c34bSBram Moolenaar    try
6002e34c34bSBram Moolenaar      echoerr 'Test'
6012e34c34bSBram Moolenaar    catch
6022e34c34bSBram Moolenaar      g:Count += 1
6032e34c34bSBram Moolenaar      g:sequence ..= 'c'
6042e34c34bSBram Moolenaar      continue
6052e34c34bSBram Moolenaar    endtry
6062e34c34bSBram Moolenaar    g:sequence ..= 'e'
6072e34c34bSBram Moolenaar    g:Count += 1
6082e34c34bSBram Moolenaar  endwhile
6092e34c34bSBram Moolenaarenddef
6102e34c34bSBram Moolenaar
6112e34c34bSBram Moolenaardef Test_continue_in_try_in_while()
6122e34c34bSBram Moolenaar  g:Count = 0
6132e34c34bSBram Moolenaar  g:sequence = ''
6142e34c34bSBram Moolenaar  TryContinueFunc()
6152e34c34bSBram Moolenaar  assert_equal('tctc', g:sequence)
6162e34c34bSBram Moolenaar  unlet g:Count
6172e34c34bSBram Moolenaar  unlet g:sequence
6182e34c34bSBram Moolenaarenddef
6192e34c34bSBram Moolenaar
6209cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
6219cb577a6SBram Moolenaar  # return in try block returns normally
6229cb577a6SBram Moolenaar  def ReturnInTry(): string
6239cb577a6SBram Moolenaar    try
6249cb577a6SBram Moolenaar      return '"some message"'
6259cb577a6SBram Moolenaar    catch
6269cb577a6SBram Moolenaar    endtry
6279cb577a6SBram Moolenaar    return 'not reached'
6289cb577a6SBram Moolenaar  enddef
6299cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
6309cb577a6SBram Moolenaarenddef
6319cb577a6SBram Moolenaar
6321430ceebSBram Moolenaardef Test_cnext_works_in_catch()
6331430ceebSBram Moolenaar  var lines =<< trim END
6341430ceebSBram Moolenaar      vim9script
6351430ceebSBram Moolenaar      au BufEnter * eval 0
6361430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
6371430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
6381430ceebSBram Moolenaar      var items = [
6391430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
6401430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
6411430ceebSBram Moolenaar        ]
6421430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
6431430ceebSBram Moolenaar      cwindow
6441430ceebSBram Moolenaar
6451430ceebSBram Moolenaar      def CnextOrCfirst()
6461430ceebSBram Moolenaar        # if cnext fails, cfirst is used
6471430ceebSBram Moolenaar        try
6481430ceebSBram Moolenaar          cnext
6491430ceebSBram Moolenaar        catch
6501430ceebSBram Moolenaar          cfirst
6511430ceebSBram Moolenaar        endtry
6521430ceebSBram Moolenaar      enddef
6531430ceebSBram Moolenaar
6541430ceebSBram Moolenaar      CnextOrCfirst()
6551430ceebSBram Moolenaar      CnextOrCfirst()
6561430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
6571430ceebSBram Moolenaar      qall
6581430ceebSBram Moolenaar  END
6591430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
6601430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
6611430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
6621430ceebSBram Moolenaar
6631430ceebSBram Moolenaar  delete('Xfile1')
6641430ceebSBram Moolenaar  delete('Xfile2')
6651430ceebSBram Moolenaar  delete('XCatchCnext')
6661430ceebSBram Moolenaar  delete('Xresult')
6671430ceebSBram Moolenaarenddef
6681430ceebSBram Moolenaar
6699e1d9e34SBram Moolenaardef Test_throw_skipped()
6709e1d9e34SBram Moolenaar  if 0
6719e1d9e34SBram Moolenaar    throw dontgethere
6729e1d9e34SBram Moolenaar  endif
6739e1d9e34SBram Moolenaarenddef
6749e1d9e34SBram Moolenaar
6758f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
6768f81b22eSBram Moolenaar  var lines =<< trim END
6778f81b22eSBram Moolenaar    vim9script
6788f81b22eSBram Moolenaar    def Func()
6798f81b22eSBram Moolenaar      throw 'error'
6808f81b22eSBram Moolenaar    enddef
6818f81b22eSBram Moolenaar    silent! Func()
6828f81b22eSBram Moolenaar  END
6838f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
6848f81b22eSBram Moolenaar  source XthrowSilenced
6858f81b22eSBram Moolenaar  delete('XthrowSilenced')
6868f81b22eSBram Moolenaarenddef
6878f81b22eSBram Moolenaar
688e859312eSBram Moolenaardef DeletedFunc(): list<any>
689e859312eSBram Moolenaar  return ['delete me']
690e859312eSBram Moolenaarenddef
691e859312eSBram Moolenaardefcompile
692e859312eSBram Moolenaardelfunc DeletedFunc
693e859312eSBram Moolenaar
694257cc5eeSBram Moolenaardef ThrowFromDef()
695a72cfb80SBram Moolenaar  throw "getout" # comment
696257cc5eeSBram Moolenaarenddef
697257cc5eeSBram Moolenaar
698257cc5eeSBram Moolenaarfunc CatchInFunc()
699257cc5eeSBram Moolenaar  try
700257cc5eeSBram Moolenaar    call ThrowFromDef()
701257cc5eeSBram Moolenaar  catch
702257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
703257cc5eeSBram Moolenaar  endtry
704257cc5eeSBram Moolenaarendfunc
705257cc5eeSBram Moolenaar
706257cc5eeSBram Moolenaardef CatchInDef()
707257cc5eeSBram Moolenaar  try
708257cc5eeSBram Moolenaar    ThrowFromDef()
709257cc5eeSBram Moolenaar  catch
710257cc5eeSBram Moolenaar    g:thrown_def = v:exception
711257cc5eeSBram Moolenaar  endtry
712257cc5eeSBram Moolenaarenddef
713257cc5eeSBram Moolenaar
714f575adffSBram Moolenaardef ReturnFinally(): string
715f575adffSBram Moolenaar  try
716f575adffSBram Moolenaar    return 'intry'
717373863edSBram Moolenaar  finall
718f575adffSBram Moolenaar    g:in_finally = 'finally'
719f575adffSBram Moolenaar  endtry
720f575adffSBram Moolenaar  return 'end'
721f575adffSBram Moolenaarenddef
722f575adffSBram Moolenaar
723257cc5eeSBram Moolenaardef Test_try_catch_nested()
724257cc5eeSBram Moolenaar  CatchInFunc()
725257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
726257cc5eeSBram Moolenaar
727257cc5eeSBram Moolenaar  CatchInDef()
728257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
729f575adffSBram Moolenaar
730f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
731f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
732f575adffSBram Moolenaarenddef
733f575adffSBram Moolenaar
7349939f57bSBram Moolenaardef TryOne(): number
7359939f57bSBram Moolenaar  try
7369939f57bSBram Moolenaar    return 0
7379939f57bSBram Moolenaar  catch
7389939f57bSBram Moolenaar  endtry
7399939f57bSBram Moolenaar  return 0
7409939f57bSBram Moolenaarenddef
7419939f57bSBram Moolenaar
7429939f57bSBram Moolenaardef TryTwo(n: number): string
7439939f57bSBram Moolenaar  try
744cfcd011fSBram Moolenaar    var x = {}
7459939f57bSBram Moolenaar  catch
7469939f57bSBram Moolenaar  endtry
7479939f57bSBram Moolenaar  return 'text'
7489939f57bSBram Moolenaarenddef
7499939f57bSBram Moolenaar
7509939f57bSBram Moolenaardef Test_try_catch_twice()
7519939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
7529939f57bSBram Moolenaarenddef
7539939f57bSBram Moolenaar
754f575adffSBram Moolenaardef Test_try_catch_match()
755cfcd011fSBram Moolenaar  var seq = 'a'
756f575adffSBram Moolenaar  try
757f575adffSBram Moolenaar    throw 'something'
758f575adffSBram Moolenaar  catch /nothing/
759f575adffSBram Moolenaar    seq ..= 'x'
760f575adffSBram Moolenaar  catch /some/
761f575adffSBram Moolenaar    seq ..= 'b'
762f575adffSBram Moolenaar  catch /asdf/
763f575adffSBram Moolenaar    seq ..= 'x'
764e8c4abbbSBram Moolenaar  catch ?a\?sdf?
765e8c4abbbSBram Moolenaar    seq ..= 'y'
766f575adffSBram Moolenaar  finally
767f575adffSBram Moolenaar    seq ..= 'c'
768f575adffSBram Moolenaar  endtry
769f575adffSBram Moolenaar  assert_equal('abc', seq)
770257cc5eeSBram Moolenaarenddef
771257cc5eeSBram Moolenaar
772e8c4abbbSBram Moolenaardef Test_try_catch_fails()
773d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
774d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
775d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
776d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
777d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
778d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
779d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
780d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
78113106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
782d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
783585fea7bSBram Moolenaar
784e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
785d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
786e8c4abbbSBram Moolenaarenddef
787e8c4abbbSBram Moolenaar
7887c5b3c03SBram Moolenaardef Try_catch_skipped()
7897c5b3c03SBram Moolenaar  var l = []
7907c5b3c03SBram Moolenaar  try
7917c5b3c03SBram Moolenaar  finally
7927c5b3c03SBram Moolenaar  endtry
7937c5b3c03SBram Moolenaar
7947c5b3c03SBram Moolenaar  if 1
7957c5b3c03SBram Moolenaar  else
7967c5b3c03SBram Moolenaar    try
7977c5b3c03SBram Moolenaar    endtry
7987c5b3c03SBram Moolenaar  endif
7997c5b3c03SBram Moolenaarenddef
8007c5b3c03SBram Moolenaar
8017c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
8027c5b3c03SBram Moolenaardef Test_try_catch_skipped()
8037c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
8047c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
8057c5b3c03SBram Moolenaarenddef
8067c5b3c03SBram Moolenaar
8077c5b3c03SBram Moolenaar
8087c5b3c03SBram Moolenaar
809006ad48bSBram Moolenaardef Test_throw_vimscript()
810f5be8cdbSBram Moolenaar  # only checks line continuation
811cfcd011fSBram Moolenaar  var lines =<< trim END
812006ad48bSBram Moolenaar      vim9script
813006ad48bSBram Moolenaar      try
814006ad48bSBram Moolenaar        throw 'one'
815006ad48bSBram Moolenaar              .. 'two'
816006ad48bSBram Moolenaar      catch
817006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
818006ad48bSBram Moolenaar      endtry
819006ad48bSBram Moolenaar  END
820006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
8211e021e63SBram Moolenaar
8221e021e63SBram Moolenaar  lines =<< trim END
8231e021e63SBram Moolenaar    vim9script
824352134bbSBram Moolenaar    @r = ''
8251e021e63SBram Moolenaar    def Func()
8261e021e63SBram Moolenaar      throw @r
8271e021e63SBram Moolenaar    enddef
8281e021e63SBram Moolenaar    var result = ''
8291e021e63SBram Moolenaar    try
8301e021e63SBram Moolenaar      Func()
8311e021e63SBram Moolenaar    catch /E1129:/
8321e021e63SBram Moolenaar      result = 'caught'
8331e021e63SBram Moolenaar    endtry
8341e021e63SBram Moolenaar    assert_equal('caught', result)
8351e021e63SBram Moolenaar  END
8361e021e63SBram Moolenaar  CheckScriptSuccess(lines)
837006ad48bSBram Moolenaarenddef
838006ad48bSBram Moolenaar
839ed677f55SBram Moolenaardef Test_error_in_nested_function()
84003dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
841cfcd011fSBram Moolenaar  var lines =<< trim END
842ed677f55SBram Moolenaar      vim9script
843ed677f55SBram Moolenaar      def Func()
844ed677f55SBram Moolenaar        Error()
845ed677f55SBram Moolenaar        g:test_var = 1
846ed677f55SBram Moolenaar      enddef
847ed677f55SBram Moolenaar      func Error() abort
848ed677f55SBram Moolenaar        eval [][0]
849ed677f55SBram Moolenaar      endfunc
850ed677f55SBram Moolenaar      Func()
851ed677f55SBram Moolenaar  END
852ed677f55SBram Moolenaar  g:test_var = 0
853ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
854ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
855ed677f55SBram Moolenaarenddef
856ed677f55SBram Moolenaar
857227c58a4SBram Moolenaardef Test_abort_after_error()
858227c58a4SBram Moolenaar  var lines =<< trim END
859227c58a4SBram Moolenaar      vim9script
860227c58a4SBram Moolenaar      while true
861227c58a4SBram Moolenaar        echo notfound
862227c58a4SBram Moolenaar      endwhile
863227c58a4SBram Moolenaar      g:gotthere = true
864227c58a4SBram Moolenaar  END
865227c58a4SBram Moolenaar  g:gotthere = false
866227c58a4SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
867227c58a4SBram Moolenaar  assert_false(g:gotthere)
868227c58a4SBram Moolenaar  unlet g:gotthere
869227c58a4SBram Moolenaarenddef
870227c58a4SBram Moolenaar
87137c83711SBram Moolenaardef Test_cexpr_vimscript()
872f5be8cdbSBram Moolenaar  # only checks line continuation
87337c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
874cfcd011fSBram Moolenaar  var lines =<< trim END
87537c83711SBram Moolenaar      vim9script
87637c83711SBram Moolenaar      cexpr 'File'
87737c83711SBram Moolenaar                .. ' someFile' ..
87837c83711SBram Moolenaar                   ' line 19'
87937c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
88037c83711SBram Moolenaar  END
88137c83711SBram Moolenaar  CheckScriptSuccess(lines)
88237c83711SBram Moolenaar  set errorformat&
88337c83711SBram Moolenaarenddef
88437c83711SBram Moolenaar
885c9edd6b5SBram Moolenaardef Test_statusline_syntax()
886c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
887cfcd011fSBram Moolenaar  var lines =<< trim END
888c9edd6b5SBram Moolenaar      vim9script
889c9edd6b5SBram Moolenaar      func g:Status()
890c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
891c9edd6b5SBram Moolenaar      endfunc
892c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
893c9edd6b5SBram Moolenaar      redrawstatus
894c9edd6b5SBram Moolenaar      set laststatus statusline=
895c9edd6b5SBram Moolenaar  END
896c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
897c9edd6b5SBram Moolenaarenddef
898c9edd6b5SBram Moolenaar
899b209750bSBram Moolenaardef Test_list_vimscript()
900b209750bSBram Moolenaar  # checks line continuation and comments
901cfcd011fSBram Moolenaar  var lines =<< trim END
902b209750bSBram Moolenaar      vim9script
903cfcd011fSBram Moolenaar      var mylist = [
904b209750bSBram Moolenaar            'one',
905b209750bSBram Moolenaar            # comment
906b209750bSBram Moolenaar            'two', # empty line follows
907b209750bSBram Moolenaar
908b209750bSBram Moolenaar            'three',
909b209750bSBram Moolenaar            ]
910b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
911b209750bSBram Moolenaar  END
912b209750bSBram Moolenaar  CheckScriptSuccess(lines)
91366250c93SBram Moolenaar
91466250c93SBram Moolenaar  # check all lines from heredoc are kept
91566250c93SBram Moolenaar  lines =<< trim END
91666250c93SBram Moolenaar      # comment 1
91766250c93SBram Moolenaar      two
91866250c93SBram Moolenaar      # comment 3
91966250c93SBram Moolenaar
92066250c93SBram Moolenaar      five
92166250c93SBram Moolenaar      # comment 6
92266250c93SBram Moolenaar  END
92366250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
9244bce26bbSBram Moolenaar
9254bce26bbSBram Moolenaar  lines =<< trim END
9264bce26bbSBram Moolenaar    [{
9274bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
9284bce26bbSBram Moolenaar  END
9294bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
930b209750bSBram Moolenaarenddef
931b209750bSBram Moolenaar
9322a1381c3SBram Moolenaarif has('channel')
93340ee466cSBram Moolenaar  let someJob = test_null_job()
93440ee466cSBram Moolenaar
93540ee466cSBram Moolenaar  def FuncWithError()
93640ee466cSBram Moolenaar    echomsg g:someJob
93740ee466cSBram Moolenaar  enddef
93840ee466cSBram Moolenaar
93940ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
94040ee466cSBram Moolenaar    try
94140ee466cSBram Moolenaar      call FuncWithError()
94240ee466cSBram Moolenaar    catch
94340ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
94440ee466cSBram Moolenaar    endtry
94540ee466cSBram Moolenaar  endfunc
9462a1381c3SBram Moolenaarendif
94740ee466cSBram Moolenaar
9488a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
9498a7d6542SBram Moolenaar  vim9script
950cfcd011fSBram Moolenaar  var name: string = 'bob'
9518a7d6542SBram Moolenaar  def Concat(arg: string): string
9528a7d6542SBram Moolenaar    return name .. arg
9538a7d6542SBram Moolenaar  enddef
954227a69deSBram Moolenaar  g:result = Concat('bie')
955227a69deSBram Moolenaar  g:localname = name
9568a7d6542SBram Moolenaar
9578a7d6542SBram Moolenaar  export const CONST = 1234
958cfcd011fSBram Moolenaar  export var exported = 9876
959cfcd011fSBram Moolenaar  export var exp_name = 'John'
9608a7d6542SBram Moolenaar  export def Exported(): string
9618a7d6542SBram Moolenaar    return 'Exported'
9628a7d6542SBram Moolenaar  enddef
9630f2a5cc6SBram Moolenaar  export final theList = [1]
9648a7d6542SBram MoolenaarEND
9658a7d6542SBram Moolenaar
966b3ca9824SBram Moolenaardef Undo_export_script_lines()
967b3ca9824SBram Moolenaar  unlet g:result
968b3ca9824SBram Moolenaar  unlet g:localname
969b3ca9824SBram Moolenaarenddef
970b3ca9824SBram Moolenaar
9715269bd2aSBram Moolenaardef Test_vim9_import_export()
972cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
9738a7d6542SBram Moolenaar    vim9script
9748a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
9758a7d6542SBram Moolenaar    g:imported = exported
9766e587dcbSBram Moolenaar    exported += 3
9776e587dcbSBram Moolenaar    g:imported_added = exported
9788a7d6542SBram Moolenaar    g:imported_func = Exported()
9796e587dcbSBram Moolenaar
98040f4f7a4SBram Moolenaar    def GetExported(): string
981e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
98240f4f7a4SBram Moolenaar      return local_dict.ref()
98340f4f7a4SBram Moolenaar    enddef
98440f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
98540f4f7a4SBram Moolenaar
9866e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
9876e587dcbSBram Moolenaar    g:imported_name = exp_name
9886e587dcbSBram Moolenaar    exp_name ..= ' Doe'
9896e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
9905381c7a1SBram Moolenaar    g:imported_later = exported
9910f2a5cc6SBram Moolenaar
9920f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
9930f2a5cc6SBram Moolenaar    theList->add(2)
9940f2a5cc6SBram Moolenaar    assert_equal([1, 2], theList)
9958a7d6542SBram Moolenaar  END
9968a7d6542SBram Moolenaar
9978a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
9988a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
9998a7d6542SBram Moolenaar
10008a7d6542SBram Moolenaar  source Ximport.vim
10018a7d6542SBram Moolenaar
10028a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
10038a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
10048a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
10056e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
10065381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
10078a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
100840f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
10096e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
10106e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
10118a7d6542SBram Moolenaar  assert_false(exists('g:name'))
10128a7d6542SBram Moolenaar
1013b3ca9824SBram Moolenaar  Undo_export_script_lines()
10148a7d6542SBram Moolenaar  unlet g:imported
10156e587dcbSBram Moolenaar  unlet g:imported_added
10165381c7a1SBram Moolenaar  unlet g:imported_later
10178a7d6542SBram Moolenaar  unlet g:imported_func
10186e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
10198a7d6542SBram Moolenaar  delete('Ximport.vim')
1020f2d5c240SBram Moolenaar
10211c991144SBram Moolenaar  # similar, with line breaks
1022cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
10231c991144SBram Moolenaar    vim9script
10241c991144SBram Moolenaar    import {
10251c991144SBram Moolenaar        exported,
10261c991144SBram Moolenaar        Exported,
10271c991144SBram Moolenaar        }
10281c991144SBram Moolenaar        from
10291c991144SBram Moolenaar        './Xexport.vim'
10301c991144SBram Moolenaar    g:imported = exported
10311c991144SBram Moolenaar    exported += 5
10321c991144SBram Moolenaar    g:imported_added = exported
10331c991144SBram Moolenaar    g:imported_func = Exported()
10341c991144SBram Moolenaar  END
10351c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
10361c991144SBram Moolenaar  source Ximport_lbr.vim
10371c991144SBram Moolenaar
10381c991144SBram Moolenaar  assert_equal(9876, g:imported)
10391c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
10401c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
10411c991144SBram Moolenaar
10421c991144SBram Moolenaar  # exported script not sourced again
10431c991144SBram Moolenaar  assert_false(exists('g:result'))
10441c991144SBram Moolenaar  unlet g:imported
10451c991144SBram Moolenaar  unlet g:imported_added
10461c991144SBram Moolenaar  unlet g:imported_func
10471c991144SBram Moolenaar  delete('Ximport_lbr.vim')
10481c991144SBram Moolenaar
10491c991144SBram Moolenaar  # import inside :def function
1050cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
10515381c7a1SBram Moolenaar    vim9script
10525381c7a1SBram Moolenaar    def ImportInDef()
10535381c7a1SBram Moolenaar      import exported from './Xexport.vim'
10545381c7a1SBram Moolenaar      g:imported = exported
10555381c7a1SBram Moolenaar      exported += 7
10565381c7a1SBram Moolenaar      g:imported_added = exported
10575381c7a1SBram Moolenaar    enddef
10585381c7a1SBram Moolenaar    ImportInDef()
10595381c7a1SBram Moolenaar  END
10605381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
10615381c7a1SBram Moolenaar  source Ximport2.vim
1062f5be8cdbSBram Moolenaar  # TODO: this should be 9879
10635381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
10645381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
10655381c7a1SBram Moolenaar  unlet g:imported
10665381c7a1SBram Moolenaar  unlet g:imported_added
10675381c7a1SBram Moolenaar  delete('Ximport2.vim')
10685381c7a1SBram Moolenaar
1069cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1070f2d5c240SBram Moolenaar    vim9script
1071f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1072f2d5c240SBram Moolenaar    def UseExport()
1073cb4e80faSBram Moolenaar      g:imported_def = Export.exported
1074f2d5c240SBram Moolenaar    enddef
1075cb4e80faSBram Moolenaar    g:imported_script = Export.exported
1076cb4e80faSBram Moolenaar    assert_equal(1, exists('Export.exported'))
1077cb4e80faSBram Moolenaar    assert_equal(0, exists('Export.notexported'))
1078f2d5c240SBram Moolenaar    UseExport()
1079f2d5c240SBram Moolenaar  END
1080f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1081f2d5c240SBram Moolenaar  source Ximport.vim
1082cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_def)
1083cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_script)
1084f2d5c240SBram Moolenaar
1085cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1086599c89c8SBram Moolenaar    vim9script
1087599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1088599c89c8SBram Moolenaar    def Func()
1089cfcd011fSBram Moolenaar      var dummy = 1
1090cfcd011fSBram Moolenaar      var imported = Export + dummy
1091599c89c8SBram Moolenaar    enddef
1092822ba247SBram Moolenaar    defcompile
1093599c89c8SBram Moolenaar  END
1094599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
109544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1096599c89c8SBram Moolenaar
1097cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1098599c89c8SBram Moolenaar    vim9script
1099599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1100599c89c8SBram Moolenaar    def Func()
1101cfcd011fSBram Moolenaar      var imported = Export . exported
1102599c89c8SBram Moolenaar    enddef
1103822ba247SBram Moolenaar    defcompile
1104599c89c8SBram Moolenaar  END
1105599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
110644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1107599c89c8SBram Moolenaar
1108a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1109a6294955SBram Moolenaar    vim9script
1110a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1111a6294955SBram Moolenaar    var some = 'other'
1112a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1113a6294955SBram Moolenaar    defcompile
1114a6294955SBram Moolenaar  END
1115a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1116a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1117a6294955SBram Moolenaar
1118cb4e80faSBram Moolenaar  var import_star_as_lines_script_no_dot =<< trim END
1119cb4e80faSBram Moolenaar    vim9script
1120cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1121cb4e80faSBram Moolenaar    g:imported_script = Export exported
1122cb4e80faSBram Moolenaar  END
1123cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
1124cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1029:')
1125cb4e80faSBram Moolenaar
1126cb4e80faSBram Moolenaar  var import_star_as_lines_script_space_after_dot =<< trim END
1127cb4e80faSBram Moolenaar    vim9script
1128cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1129cb4e80faSBram Moolenaar    g:imported_script = Export. exported
1130cb4e80faSBram Moolenaar  END
1131cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1132cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1133cb4e80faSBram Moolenaar
1134cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1135599c89c8SBram Moolenaar    vim9script
1136599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1137599c89c8SBram Moolenaar    def Func()
1138cfcd011fSBram Moolenaar      var imported = Export.
1139599c89c8SBram Moolenaar    enddef
1140822ba247SBram Moolenaar    defcompile
1141599c89c8SBram Moolenaar  END
1142599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
114344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1144599c89c8SBram Moolenaar
1145cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
11461c991144SBram Moolenaar    vim9script
11471c991144SBram Moolenaar    import *
11481c991144SBram Moolenaar        as Export
11491c991144SBram Moolenaar        from
11501c991144SBram Moolenaar        './Xexport.vim'
11511c991144SBram Moolenaar    def UseExport()
11521c991144SBram Moolenaar      g:imported = Export.exported
11531c991144SBram Moolenaar    enddef
11541c991144SBram Moolenaar    UseExport()
11551c991144SBram Moolenaar  END
11561c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
11571c991144SBram Moolenaar  source Ximport.vim
11581c991144SBram Moolenaar  assert_equal(9883, g:imported)
11591c991144SBram Moolenaar
1160cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1161f2d5c240SBram Moolenaar    vim9script
1162f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1163f2d5c240SBram Moolenaar  END
1164f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
116544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1166f2d5c240SBram Moolenaar
1167f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1168cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1169fa29c8abSBram Moolenaar    vim9script
1170fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1171fa29c8abSBram Moolenaar  END
1172fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
117344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1174fa29c8abSBram Moolenaar
1175f5be8cdbSBram Moolenaar  # try to import something that is already defined
1176cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
11775269bd2aSBram Moolenaar    vim9script
1178cfcd011fSBram Moolenaar    var exported = 'something'
11795269bd2aSBram Moolenaar    import exported from './Xexport.vim'
11805269bd2aSBram Moolenaar  END
11815269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1182057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11835269bd2aSBram Moolenaar
1184f5be8cdbSBram Moolenaar  # try to import something that is already defined
11855269bd2aSBram Moolenaar  import_already_defined =<< trim END
11865269bd2aSBram Moolenaar    vim9script
1187cfcd011fSBram Moolenaar    var exported = 'something'
11885269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
11895269bd2aSBram Moolenaar  END
11905269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1191057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11925269bd2aSBram Moolenaar
1193f5be8cdbSBram Moolenaar  # try to import something that is already defined
11945269bd2aSBram Moolenaar  import_already_defined =<< trim END
11955269bd2aSBram Moolenaar    vim9script
1196cfcd011fSBram Moolenaar    var exported = 'something'
11975269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
11985269bd2aSBram Moolenaar  END
11995269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1200057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
12015269bd2aSBram Moolenaar
1202918a4249SBram Moolenaar  # try changing an imported const
1203918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1204918a4249SBram Moolenaar    vim9script
1205918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1206918a4249SBram Moolenaar    def Assign()
1207918a4249SBram Moolenaar      CONST = 987
1208918a4249SBram Moolenaar    enddef
1209918a4249SBram Moolenaar    defcompile
1210918a4249SBram Moolenaar  END
1211918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1212918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1213918a4249SBram Moolenaar
12140f2a5cc6SBram Moolenaar  # try changing an imported final
12150f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
12160f2a5cc6SBram Moolenaar    vim9script
12170f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
12180f2a5cc6SBram Moolenaar    def Assign()
12190f2a5cc6SBram Moolenaar      theList = [2]
12200f2a5cc6SBram Moolenaar    enddef
12210f2a5cc6SBram Moolenaar    defcompile
12220f2a5cc6SBram Moolenaar  END
12230f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
12240f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
12250f2a5cc6SBram Moolenaar
1226f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1227cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1228fa29c8abSBram Moolenaar    vim9script
1229fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1230fa29c8abSBram Moolenaar  END
1231fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
123244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1233fa29c8abSBram Moolenaar
1234cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1235fa29c8abSBram Moolenaar    vim9script
1236fa29c8abSBram Moolenaar    import name './Xexport.vim'
1237fa29c8abSBram Moolenaar  END
1238fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
123944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1240fa29c8abSBram Moolenaar
1241cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1242fa29c8abSBram Moolenaar    vim9script
1243fa29c8abSBram Moolenaar    import name from Xexport.vim
1244fa29c8abSBram Moolenaar  END
1245fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
124644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1247fa29c8abSBram Moolenaar
1248cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1249fa29c8abSBram Moolenaar    vim9script
1250fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1251fa29c8abSBram Moolenaar  END
1252fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
125344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1254fa29c8abSBram Moolenaar
1255cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1256fa29c8abSBram Moolenaar    vim9script
1257fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1258fa29c8abSBram Moolenaar  END
12595269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
126044d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1261fa29c8abSBram Moolenaar
1262f2d5c240SBram Moolenaar  delete('Ximport.vim')
12635269bd2aSBram Moolenaar  delete('Ximport3.vim')
12648a7d6542SBram Moolenaar  delete('Xexport.vim')
12658a7d6542SBram Moolenaar
1266f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
12673e191694SBram Moolenaar  # Flags added or removed are also applied to the restored value.
12683e191694SBram Moolenaar  set cpo=abcd
1269cfcd011fSBram Moolenaar  var lines =<< trim END
1270750802b5SBram Moolenaar    vim9script
1271750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
12723e191694SBram Moolenaar    set cpo+=f
12733e191694SBram Moolenaar    set cpo-=c
12743e191694SBram Moolenaar    g:cpo_after_vim9script = &cpo
1275750802b5SBram Moolenaar  END
1276750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1277750802b5SBram Moolenaar  source Xvim9_script
12783e191694SBram Moolenaar  assert_equal('fabd', &cpo)
1279750802b5SBram Moolenaar  set cpo&vim
1280750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
12813e191694SBram Moolenaar  var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
12823e191694SBram Moolenaar  assert_equal(newcpo, g:cpo_after_vim9script)
12833e191694SBram Moolenaar
1284750802b5SBram Moolenaar  delete('Xvim9_script')
1285750802b5SBram Moolenaarenddef
1286750802b5SBram Moolenaar
12870a84284eSBram Moolenaardef Test_import_as()
12880a84284eSBram Moolenaar  var export_lines =<< trim END
12890a84284eSBram Moolenaar    vim9script
12900a84284eSBram Moolenaar    export var one = 1
12910a84284eSBram Moolenaar    export var yes = 'yes'
12920a84284eSBram Moolenaar  END
12930a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
12940a84284eSBram Moolenaar
12950a84284eSBram Moolenaar  var import_lines =<< trim END
12960a84284eSBram Moolenaar    vim9script
12976c7cc347SBram Moolenaar    var one = 'notused'
12986c7cc347SBram Moolenaar    var yes = 777
12990a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
13000a84284eSBram Moolenaar    assert_equal(1, thatOne)
13010a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
13020a84284eSBram Moolenaar    assert_equal('yes', yesYes)
13030a84284eSBram Moolenaar  END
13040a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
13050a84284eSBram Moolenaar
13060a84284eSBram Moolenaar  import_lines =<< trim END
13070a84284eSBram Moolenaar    vim9script
13080a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
13090a84284eSBram Moolenaar    assert_equal(1, thatOne)
13100a84284eSBram Moolenaar    assert_equal('yes', yesYes)
13110a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
13120a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
13130a84284eSBram Moolenaar  END
13140a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
13150a84284eSBram Moolenaar
13160a84284eSBram Moolenaar  delete('XexportAs')
13170a84284eSBram Moolenaarenddef
13180a84284eSBram Moolenaar
1319803af686SBram Moolenaarfunc g:Trigger()
1320803af686SBram Moolenaar  source Ximport.vim
1321803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1322803af686SBram Moolenaarendfunc
1323803af686SBram Moolenaar
1324803af686SBram Moolenaardef Test_import_export_expr_map()
1325803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1326cfcd011fSBram Moolenaar  var export_lines =<< trim END
1327803af686SBram Moolenaar    vim9script
1328803af686SBram Moolenaar    export def That(): string
1329803af686SBram Moolenaar      return 'yes'
1330803af686SBram Moolenaar    enddef
1331803af686SBram Moolenaar  END
1332803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1333803af686SBram Moolenaar
1334cfcd011fSBram Moolenaar  var import_lines =<< trim END
1335803af686SBram Moolenaar    vim9script
1336803af686SBram Moolenaar    import That from './Xexport_that.vim'
1337803af686SBram Moolenaar    assert_equal('yes', That())
1338803af686SBram Moolenaar  END
1339803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1340803af686SBram Moolenaar
1341803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1342803af686SBram Moolenaar  feedkeys('trigger', "xt")
1343803af686SBram Moolenaar
1344730b2483SBram Moolenaar  delete('Xexport_that.vim')
1345803af686SBram Moolenaar  delete('Ximport.vim')
1346803af686SBram Moolenaar  nunmap trigger
1347803af686SBram Moolenaarenddef
1348803af686SBram Moolenaar
13498e1986e3SBram Moolenaardef Test_import_in_filetype()
13508e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
13518e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1352cfcd011fSBram Moolenaar  var export_lines =<< trim END
13538e1986e3SBram Moolenaar    vim9script
1354cfcd011fSBram Moolenaar    export var That = 'yes'
13558e1986e3SBram Moolenaar  END
1356730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
13578e1986e3SBram Moolenaar
1358cfcd011fSBram Moolenaar  var import_lines =<< trim END
13598e1986e3SBram Moolenaar    vim9script
1360730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
13618e1986e3SBram Moolenaar    assert_equal('yes', That)
13628e1986e3SBram Moolenaar    g:did_load_mytpe = 1
13638e1986e3SBram Moolenaar  END
13648e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
13658e1986e3SBram Moolenaar
1366cfcd011fSBram Moolenaar  var save_rtp = &rtp
13678e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
13688e1986e3SBram Moolenaar
13698e1986e3SBram Moolenaar  filetype plugin on
13708e1986e3SBram Moolenaar  copen
13718e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
13728e1986e3SBram Moolenaar
13738e1986e3SBram Moolenaar  quit!
1374730b2483SBram Moolenaar  delete('Xexport_ft.vim')
13758e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
13768e1986e3SBram Moolenaar  &rtp = save_rtp
13778e1986e3SBram Moolenaarenddef
13788e1986e3SBram Moolenaar
1379efa94447SBram Moolenaardef Test_use_import_in_mapping()
1380cfcd011fSBram Moolenaar  var lines =<< trim END
1381efa94447SBram Moolenaar      vim9script
1382efa94447SBram Moolenaar      export def Funcx()
1383efa94447SBram Moolenaar        g:result = 42
1384efa94447SBram Moolenaar      enddef
1385efa94447SBram Moolenaar  END
1386efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1387efa94447SBram Moolenaar  lines =<< trim END
1388efa94447SBram Moolenaar      vim9script
1389efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1390b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1391efa94447SBram Moolenaar  END
1392efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1393efa94447SBram Moolenaar
1394efa94447SBram Moolenaar  source Xmapscript.vim
1395b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1396efa94447SBram Moolenaar  assert_equal(42, g:result)
1397efa94447SBram Moolenaar
1398efa94447SBram Moolenaar  unlet g:result
1399efa94447SBram Moolenaar  delete('XsomeExport.vim')
1400efa94447SBram Moolenaar  delete('Xmapscript.vim')
1401b3ca9824SBram Moolenaar  nunmap <F3>
1402efa94447SBram Moolenaarenddef
1403efa94447SBram Moolenaar
1404d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1405d3f8a9eeSBram Moolenaar  var lines =<< trim END
1406d3f8a9eeSBram Moolenaar    if has(g:feature)
1407d3f8a9eeSBram Moolenaar      " legacy script
1408d3f8a9eeSBram Moolenaar      let g:legacy = 1
1409d3f8a9eeSBram Moolenaar      finish
1410d3f8a9eeSBram Moolenaar    endif
1411d3f8a9eeSBram Moolenaar    vim9script
1412d3f8a9eeSBram Moolenaar    g:legacy = 0
1413d3f8a9eeSBram Moolenaar  END
1414d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1415d3f8a9eeSBram Moolenaar  g:legacy = -1
1416d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1417d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1418d3f8a9eeSBram Moolenaar
1419d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1420d3f8a9eeSBram Moolenaar  g:legacy = -1
1421d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1422d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1423d3f8a9eeSBram Moolenaarenddef
1424d3f8a9eeSBram Moolenaar
1425750802b5SBram Moolenaardef Test_vim9script_fails()
14268a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
14278a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1428cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
14299721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1430cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1431750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1432750802b5SBram Moolenaar
1433cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1434c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1435c785b9a7SBram Moolenaar
1436e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1437e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
14388a7d6542SBram Moolenaarenddef
14398a7d6542SBram Moolenaar
1440f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1441101f4810SBram Moolenaar  CheckRunVimInTerminal
1442101f4810SBram Moolenaar
14439bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1444c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
14459bb3eb3eSBram Moolenaarendfunc
14469bb3eb3eSBram Moolenaar
1447c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1448cfcd011fSBram Moolenaar  var export =<< trim END
1449101f4810SBram Moolenaar    vim9script
1450101f4810SBram Moolenaar    export def Foo(): number
1451101f4810SBram Moolenaar        return 0
1452101f4810SBram Moolenaar    enddef
1453101f4810SBram Moolenaar  END
1454730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1455101f4810SBram Moolenaar
1456e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
14579bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
14582949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1459101f4810SBram Moolenaar
1460730b2483SBram Moolenaar  delete('XexportCmd.vim')
14619bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
14629bb3eb3eSBram Moolenaarenddef
1463101f4810SBram Moolenaar
14642b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
14652b32700dSBram Moolenaar  var lines =<< trim END
1466a6294955SBram Moolenaar    vim9script
1467a6294955SBram Moolenaar    export var exported = 'thexport'
1468a6294955SBram Moolenaar  END
1469a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1470a6294955SBram Moolenaar  lines =<< trim END
14712b32700dSBram Moolenaar    vim9script noclear
14722b32700dSBram Moolenaar    g:loadCount += 1
14732b32700dSBram Moolenaar    var s:reloaded = 'init'
1474a6294955SBram Moolenaar    import exported from './XExportReload'
14752b32700dSBram Moolenaar
14762b32700dSBram Moolenaar    def Again(): string
14772b32700dSBram Moolenaar      return 'again'
14782b32700dSBram Moolenaar    enddef
14792b32700dSBram Moolenaar
14802b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
14812b32700dSBram Moolenaar    var s:loaded = true
14822b32700dSBram Moolenaar
14832b32700dSBram Moolenaar    var s:notReloaded = 'yes'
14842b32700dSBram Moolenaar    s:reloaded = 'first'
14852b32700dSBram Moolenaar    def g:Values(): list<string>
1486a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
14872b32700dSBram Moolenaar    enddef
14882b32700dSBram Moolenaar
14892b32700dSBram Moolenaar    def Once(): string
14902b32700dSBram Moolenaar      return 'once'
14912b32700dSBram Moolenaar    enddef
14922b32700dSBram Moolenaar  END
14932b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
14942b32700dSBram Moolenaar  g:loadCount = 0
14952b32700dSBram Moolenaar  source XReloaded
14962b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1497a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
14982b32700dSBram Moolenaar  source XReloaded
14992b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1500a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
15012b32700dSBram Moolenaar  source XReloaded
15022b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1503a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
15042b32700dSBram Moolenaar
150548e11c10SBram Moolenaar  delete('XReloaded')
1506a6294955SBram Moolenaar  delete('XExportReload')
15072b32700dSBram Moolenaar  delfunc g:Values
15082b32700dSBram Moolenaar  unlet g:loadCount
15092b32700dSBram Moolenaarenddef
15102b32700dSBram Moolenaar
15114c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1512cfcd011fSBram Moolenaar  var lines =<< trim END
15138a7d6542SBram Moolenaar    vim9script
15148a7d6542SBram Moolenaar    const var = ''
1515cfcd011fSBram Moolenaar    var valone = 1234
15168a7d6542SBram Moolenaar    def MyFunc(arg: string)
15178a7d6542SBram Moolenaar       valone = 5678
15188a7d6542SBram Moolenaar    enddef
15198a7d6542SBram Moolenaar  END
1520cfcd011fSBram Moolenaar  var morelines =<< trim END
1521cfcd011fSBram Moolenaar    var valtwo = 222
15228a7d6542SBram Moolenaar    export def GetValtwo(): number
15238a7d6542SBram Moolenaar      return valtwo
15248a7d6542SBram Moolenaar    enddef
15258a7d6542SBram Moolenaar  END
152603afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
15278a7d6542SBram Moolenaar  source Xreload.vim
15288a7d6542SBram Moolenaar  source Xreload.vim
15298a7d6542SBram Moolenaar  source Xreload.vim
15308a7d6542SBram Moolenaar
1531cfcd011fSBram Moolenaar  var testlines =<< trim END
15328a7d6542SBram Moolenaar    vim9script
15338a7d6542SBram Moolenaar    def TheFunc()
15348a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
15358a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
15368a7d6542SBram Moolenaar    enddef
15378a7d6542SBram Moolenaar    TheFunc()
15388a7d6542SBram Moolenaar  END
15398a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
15408a7d6542SBram Moolenaar  source Ximport.vim
15418a7d6542SBram Moolenaar
1542f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1543f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
15448a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15458a7d6542SBram Moolenaar  source Ximport.vim
15468a7d6542SBram Moolenaar
1547f5be8cdbSBram Moolenaar  # cannot declare a var twice
15488a7d6542SBram Moolenaar  lines =<< trim END
15498a7d6542SBram Moolenaar    vim9script
1550cfcd011fSBram Moolenaar    var valone = 1234
1551cfcd011fSBram Moolenaar    var valone = 5678
15528a7d6542SBram Moolenaar  END
15538a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
155444d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
15558a7d6542SBram Moolenaar
15568a7d6542SBram Moolenaar  delete('Xreload.vim')
15578a7d6542SBram Moolenaar  delete('Ximport.vim')
15588a7d6542SBram Moolenaarenddef
15598a7d6542SBram Moolenaar
156007a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
156107a65d26SBram Moolenaar" compiled function using that variable must fail.
156207a65d26SBram Moolenaardef Test_script_reload_change_type()
156307a65d26SBram Moolenaar  var lines =<< trim END
156407a65d26SBram Moolenaar    vim9script noclear
156507a65d26SBram Moolenaar    var str = 'string'
156607a65d26SBram Moolenaar    def g:GetStr(): string
156707a65d26SBram Moolenaar      return str .. 'xxx'
156807a65d26SBram Moolenaar    enddef
156907a65d26SBram Moolenaar  END
157007a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
157107a65d26SBram Moolenaar  source Xreload.vim
157207a65d26SBram Moolenaar  echo g:GetStr()
157307a65d26SBram Moolenaar
157407a65d26SBram Moolenaar  lines =<< trim END
157507a65d26SBram Moolenaar    vim9script noclear
157607a65d26SBram Moolenaar    var str = 1234
157707a65d26SBram Moolenaar  END
157807a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
157907a65d26SBram Moolenaar  source Xreload.vim
158007a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
158107a65d26SBram Moolenaar
158207a65d26SBram Moolenaar  delfunc g:GetStr
158307a65d26SBram Moolenaar  delete('Xreload.vim')
158407a65d26SBram Moolenaarenddef
158507a65d26SBram Moolenaar
1586c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled
1587c970e422SBram Moolenaarcommand CallFunc echo 'nop'
1588c970e422SBram Moolenaar
1589c970e422SBram Moolenaardef Test_script_reload_from_function()
1590c970e422SBram Moolenaar  var lines =<< trim END
1591c970e422SBram Moolenaar      vim9script
1592c970e422SBram Moolenaar
1593c970e422SBram Moolenaar      if exists('g:loaded')
1594c970e422SBram Moolenaar        finish
1595c970e422SBram Moolenaar      endif
1596c970e422SBram Moolenaar      g:loaded = 1
1597c970e422SBram Moolenaar      delcommand CallFunc
1598c970e422SBram Moolenaar      command CallFunc Func()
1599c970e422SBram Moolenaar      def Func()
1600a4c81beaSBram Moolenaar        so XreloadFunc.vim
1601c970e422SBram Moolenaar        g:didTheFunc = 1
1602c970e422SBram Moolenaar      enddef
1603c970e422SBram Moolenaar  END
1604c970e422SBram Moolenaar  writefile(lines, 'XreloadFunc.vim')
1605c970e422SBram Moolenaar  source XreloadFunc.vim
1606c970e422SBram Moolenaar  CallFunc
1607c970e422SBram Moolenaar  assert_equal(1, g:didTheFunc)
1608c970e422SBram Moolenaar
1609c970e422SBram Moolenaar  delete('XreloadFunc.vim')
1610c970e422SBram Moolenaar  delcommand CallFunc
1611c970e422SBram Moolenaar  unlet g:loaded
1612c970e422SBram Moolenaar  unlet g:didTheFunc
1613c970e422SBram Moolenaarenddef
1614c970e422SBram Moolenaar
16156c3843caSBram Moolenaardef Test_script_var_shadows_function()
16166c3843caSBram Moolenaar  var lines =<< trim END
16176c3843caSBram Moolenaar      vim9script
16186c3843caSBram Moolenaar      def Func(): number
16196c3843caSBram Moolenaar        return 123
16206c3843caSBram Moolenaar      enddef
16216c3843caSBram Moolenaar      var Func = 1
16226c3843caSBram Moolenaar  END
16236c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
16246c3843caSBram Moolenaarenddef
16256c3843caSBram Moolenaar
162695006e3dSBram Moolenaardef s:RetSome(): string
162795006e3dSBram Moolenaar  return 'some'
162895006e3dSBram Moolenaarenddef
162995006e3dSBram Moolenaar
1630fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1631fe465a01SBram Moolenaar" script-local name.
1632fe465a01SBram Moolenaardef Test_vim9script_funcref()
1633cfcd011fSBram Moolenaar  var sortlines =<< trim END
1634fe465a01SBram Moolenaar      vim9script
1635fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1636bed36b93SBram Moolenaar        return i2 - i1
1637fe465a01SBram Moolenaar      enddef
1638fe465a01SBram Moolenaar
1639fe465a01SBram Moolenaar      export def FastSort(): list<number>
1640fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1641fe465a01SBram Moolenaar      enddef
1642529fb5a5SBram Moolenaar
1643529fb5a5SBram Moolenaar      export def GetString(arg: string): string
1644529fb5a5SBram Moolenaar        return arg
1645529fb5a5SBram Moolenaar      enddef
1646fe465a01SBram Moolenaar  END
1647fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1648fe465a01SBram Moolenaar
1649cfcd011fSBram Moolenaar  var lines =<< trim END
1650fe465a01SBram Moolenaar    vim9script
1651fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1652fe465a01SBram Moolenaar    def Test()
1653fe465a01SBram Moolenaar      g:result = FastSort()
1654fe465a01SBram Moolenaar    enddef
1655fe465a01SBram Moolenaar    Test()
1656529fb5a5SBram Moolenaar
1657529fb5a5SBram Moolenaar    # using a function imported with "as"
1658529fb5a5SBram Moolenaar    import * as anAlias from './Xsort.vim'
1659529fb5a5SBram Moolenaar    assert_equal('yes', anAlias.GetString('yes'))
1660529fb5a5SBram Moolenaar
1661529fb5a5SBram Moolenaar    # using the function from a compiled function
1662529fb5a5SBram Moolenaar    def TestMore(): string
1663ca51cc0aSBram Moolenaar      var s = s:anAlias.GetString('foo')
1664ca51cc0aSBram Moolenaar      return s .. anAlias.GetString('bar')
1665529fb5a5SBram Moolenaar    enddef
1666ca51cc0aSBram Moolenaar    assert_equal('foobar', TestMore())
1667529fb5a5SBram Moolenaar
1668529fb5a5SBram Moolenaar    # error when using a function that isn't exported
1669529fb5a5SBram Moolenaar    assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1670fe465a01SBram Moolenaar  END
1671fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1672fe465a01SBram Moolenaar
1673fe465a01SBram Moolenaar  source Xscript.vim
1674fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1675fe465a01SBram Moolenaar
1676fe465a01SBram Moolenaar  unlet g:result
1677fe465a01SBram Moolenaar  delete('Xsort.vim')
1678fe465a01SBram Moolenaar  delete('Xscript.vim')
167995006e3dSBram Moolenaar
1680cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
168195006e3dSBram Moolenaar  assert_equal('some', Funcref())
1682fe465a01SBram Moolenaarenddef
1683fe465a01SBram Moolenaar
1684601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1685601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1686601e76acSBram Moolenaar" function reference.
1687c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1688cfcd011fSBram Moolenaar  var filterLines =<< trim END
1689c620c055SBram Moolenaar    vim9script
1690c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1691c620c055SBram Moolenaar      return idx % 2 == 1
1692c620c055SBram Moolenaar    enddef
1693c620c055SBram Moolenaar    export def FastFilter(): list<number>
1694c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1695c620c055SBram Moolenaar    enddef
1696601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1697601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1698601e76acSBram Moolenaar    enddef
1699c620c055SBram Moolenaar  END
1700c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1701c620c055SBram Moolenaar
1702cfcd011fSBram Moolenaar  var lines =<< trim END
1703c620c055SBram Moolenaar    vim9script
1704601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1705c620c055SBram Moolenaar    def Test()
1706cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1707c620c055SBram Moolenaar    enddef
1708c620c055SBram Moolenaar    Test()
1709601e76acSBram Moolenaar    def TestDirect()
1710cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1711601e76acSBram Moolenaar    enddef
1712601e76acSBram Moolenaar    TestDirect()
1713c620c055SBram Moolenaar  END
1714601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1715c620c055SBram Moolenaar  delete('Xfilter.vim')
1716c620c055SBram Moolenaarenddef
1717c620c055SBram Moolenaar
17184c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1719cfcd011fSBram Moolenaar  var first_lines =<< trim END
17204c17ad94SBram Moolenaar    vim9script
17214c17ad94SBram Moolenaar    def FuncYes(): string
17224c17ad94SBram Moolenaar      return 'yes'
17234c17ad94SBram Moolenaar    enddef
17244c17ad94SBram Moolenaar  END
1725cfcd011fSBram Moolenaar  var withno_lines =<< trim END
17264c17ad94SBram Moolenaar    def FuncNo(): string
17274c17ad94SBram Moolenaar      return 'no'
17284c17ad94SBram Moolenaar    enddef
17294c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
17304c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
17314c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
173203afdcf1SBram Moolenaar    enddef
173303afdcf1SBram Moolenaar  END
1734cfcd011fSBram Moolenaar  var nono_lines =<< trim END
173503afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
173603afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
173744d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
17384c17ad94SBram Moolenaar    enddef
17394c17ad94SBram Moolenaar  END
17404c17ad94SBram Moolenaar
17414c17ad94SBram Moolenaar  # FuncNo() is defined
174203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17434c17ad94SBram Moolenaar  source Xreloaded.vim
17444c17ad94SBram Moolenaar  g:DoCheck(true)
17454c17ad94SBram Moolenaar
17464c17ad94SBram Moolenaar  # FuncNo() is not redefined
174703afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
17484c17ad94SBram Moolenaar  source Xreloaded.vim
17495082471fSBram Moolenaar  g:DoCheck(false)
17504c17ad94SBram Moolenaar
17514c17ad94SBram Moolenaar  # FuncNo() is back
175203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17534c17ad94SBram Moolenaar  source Xreloaded.vim
17545082471fSBram Moolenaar  g:DoCheck(false)
17554c17ad94SBram Moolenaar
17564c17ad94SBram Moolenaar  delete('Xreloaded.vim')
17574c17ad94SBram Moolenaarenddef
17584c17ad94SBram Moolenaar
175989483d40SBram Moolenaardef Test_vim9script_reload_delvar()
176089483d40SBram Moolenaar  # write the script with a script-local variable
1761cfcd011fSBram Moolenaar  var lines =<< trim END
176289483d40SBram Moolenaar    vim9script
1763cfcd011fSBram Moolenaar    var name = 'string'
176489483d40SBram Moolenaar  END
176589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
176689483d40SBram Moolenaar  source XreloadVar.vim
176789483d40SBram Moolenaar
176889483d40SBram Moolenaar  # now write the script using the same variable locally - works
176989483d40SBram Moolenaar  lines =<< trim END
177089483d40SBram Moolenaar    vim9script
177189483d40SBram Moolenaar    def Func()
1772cfcd011fSBram Moolenaar      var name = 'string'
177389483d40SBram Moolenaar    enddef
177489483d40SBram Moolenaar  END
177589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
177689483d40SBram Moolenaar  source XreloadVar.vim
177789483d40SBram Moolenaar
177889483d40SBram Moolenaar  delete('XreloadVar.vim')
177989483d40SBram Moolenaarenddef
178089483d40SBram Moolenaar
17818a7d6542SBram Moolenaardef Test_import_absolute()
1782cfcd011fSBram Moolenaar  var import_lines = [
1783e6085c53SBram Moolenaar        'vim9script',
1784e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1785e6085c53SBram Moolenaar        'def UseExported()',
1786e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1787e6085c53SBram Moolenaar        '  exported = 8888',
1788e6085c53SBram Moolenaar        '  g:imported_after = exported',
1789e6085c53SBram Moolenaar        'enddef',
1790e6085c53SBram Moolenaar        'UseExported()',
1791e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1792e6085c53SBram Moolenaar        ]
17938a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
17948a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
17958a7d6542SBram Moolenaar
17968a7d6542SBram Moolenaar  source Ximport_abs.vim
17978a7d6542SBram Moolenaar
17988a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
17994e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1800fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1801fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1802fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1803fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1804fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1805fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1806fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1807fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1808fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1809fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1810e6085c53SBram Moolenaar        g:import_disassembled)
1811b3ca9824SBram Moolenaar
1812b3ca9824SBram Moolenaar  Undo_export_script_lines()
18138a7d6542SBram Moolenaar  unlet g:imported_abs
18144e12a5dfSBram Moolenaar  unlet g:import_disassembled
18158a7d6542SBram Moolenaar
18168a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
18178a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
18188a7d6542SBram Moolenaarenddef
18198a7d6542SBram Moolenaar
18208a7d6542SBram Moolenaardef Test_import_rtp()
1821cfcd011fSBram Moolenaar  var import_lines = [
1822e6085c53SBram Moolenaar        'vim9script',
1823e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1824e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1825e6085c53SBram Moolenaar        ]
18268a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
18278a7d6542SBram Moolenaar  mkdir('import')
18288a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
18298a7d6542SBram Moolenaar
1830cfcd011fSBram Moolenaar  var save_rtp = &rtp
18318a7d6542SBram Moolenaar  &rtp = getcwd()
18328a7d6542SBram Moolenaar  source Ximport_rtp.vim
18338a7d6542SBram Moolenaar  &rtp = save_rtp
18348a7d6542SBram Moolenaar
18358a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
18368a7d6542SBram Moolenaar
1837b3ca9824SBram Moolenaar  Undo_export_script_lines()
1838b3ca9824SBram Moolenaar  unlet g:imported_rtp
18398a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
184089483d40SBram Moolenaar  delete('import', 'rf')
18418a7d6542SBram Moolenaarenddef
18428a7d6542SBram Moolenaar
184325e0f586SBram Moolenaardef Test_import_compile_error()
1844cfcd011fSBram Moolenaar  var export_lines = [
184525e0f586SBram Moolenaar        'vim9script',
184625e0f586SBram Moolenaar        'export def ExpFunc(): string',
184725e0f586SBram Moolenaar        '  return notDefined',
184825e0f586SBram Moolenaar        'enddef',
184925e0f586SBram Moolenaar        ]
185025e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
185125e0f586SBram Moolenaar
1852cfcd011fSBram Moolenaar  var import_lines = [
185325e0f586SBram Moolenaar        'vim9script',
185425e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
185525e0f586SBram Moolenaar        'def ImpFunc()',
185625e0f586SBram Moolenaar        '  echo ExpFunc()',
185725e0f586SBram Moolenaar        'enddef',
185825e0f586SBram Moolenaar        'defcompile',
185925e0f586SBram Moolenaar        ]
186025e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
186125e0f586SBram Moolenaar
186225e0f586SBram Moolenaar  try
186325e0f586SBram Moolenaar    source Ximport.vim
186425e0f586SBram Moolenaar  catch /E1001/
1865f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
18667707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
186725e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
186825e0f586SBram Moolenaar  endtry
186925e0f586SBram Moolenaar
187025e0f586SBram Moolenaar  delete('Xexported.vim')
187125e0f586SBram Moolenaar  delete('Ximport.vim')
187225e0f586SBram Moolenaarenddef
187325e0f586SBram Moolenaar
1874c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1875cfcd011fSBram Moolenaar  var lines = [
1876c4ce36d4SBram Moolenaar        'vim9script',
1877c4ce36d4SBram Moolenaar        'def Func()',
1878c4ce36d4SBram Moolenaar        '  eval [][0]',
1879c4ce36d4SBram Moolenaar        'enddef',
1880c4ce36d4SBram Moolenaar        'Func()',
1881c4ce36d4SBram Moolenaar        ]
1882c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1883c4ce36d4SBram Moolenaar
1884c4ce36d4SBram Moolenaar  for count in range(3)
1885c4ce36d4SBram Moolenaar    try
1886c4ce36d4SBram Moolenaar      source Xtestscript.vim
1887c4ce36d4SBram Moolenaar    catch /E684/
1888c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1889c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1890c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1891c4ce36d4SBram Moolenaar    endtry
1892c4ce36d4SBram Moolenaar  endfor
1893c4ce36d4SBram Moolenaar
1894c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1895c4ce36d4SBram Moolenaarenddef
1896c4ce36d4SBram Moolenaar
1897eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1898cfcd011fSBram Moolenaar  var export_lines =<< trim END
1899eef2102eSBram Moolenaar      vim9script
1900eef2102eSBram Moolenaar      export def Func()
1901eef2102eSBram Moolenaar        echo 'imported'
1902eef2102eSBram Moolenaar      enddef
1903eef2102eSBram Moolenaar  END
1904eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1905eef2102eSBram Moolenaar
1906cfcd011fSBram Moolenaar  var lines =<< trim END
1907eef2102eSBram Moolenaar    vim9script
1908eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1909eef2102eSBram Moolenaar    def Func()
1910eef2102eSBram Moolenaar      echo 'local to function'
1911eef2102eSBram Moolenaar    enddef
1912eef2102eSBram Moolenaar  END
1913eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1914eef2102eSBram Moolenaar
1915eef2102eSBram Moolenaar  lines =<< trim END
1916eef2102eSBram Moolenaar    vim9script
1917eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1918eef2102eSBram Moolenaar    def Outer()
1919eef2102eSBram Moolenaar      def Func()
1920eef2102eSBram Moolenaar        echo 'local to function'
1921eef2102eSBram Moolenaar      enddef
1922eef2102eSBram Moolenaar    enddef
1923eef2102eSBram Moolenaar    defcompile
1924eef2102eSBram Moolenaar  END
1925eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1926eef2102eSBram Moolenaar
1927eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1928eef2102eSBram Moolenaarenddef
1929eef2102eSBram Moolenaar
1930b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1931cfcd011fSBram Moolenaar  var lines =<< trim END
1932b9a2cac3SBram Moolenaar    vim9script
1933b9a2cac3SBram Moolenaar    def Func()
1934b9a2cac3SBram Moolenaar      echo 'one'
1935b9a2cac3SBram Moolenaar    enddef
1936b9a2cac3SBram Moolenaar    def Func()
1937b9a2cac3SBram Moolenaar      echo 'two'
1938b9a2cac3SBram Moolenaar    enddef
1939b9a2cac3SBram Moolenaar  END
1940b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1941fa211f3cSBram Moolenaar
1942fa211f3cSBram Moolenaar  lines =<< trim END
1943fa211f3cSBram Moolenaar    vim9script
1944fa211f3cSBram Moolenaar    def Foo(): string
1945fa211f3cSBram Moolenaar      return 'foo'
1946fa211f3cSBram Moolenaar      enddef
1947fa211f3cSBram Moolenaar    def Func()
1948cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1949fa211f3cSBram Moolenaar    enddef
1950fa211f3cSBram Moolenaar    defcompile
1951fa211f3cSBram Moolenaar  END
1952fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1953b9a2cac3SBram Moolenaarenddef
1954b9a2cac3SBram Moolenaar
19558a7d6542SBram Moolenaardef Test_fixed_size_list()
1956f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1957cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
19588a7d6542SBram Moolenaar  l->remove(0)
19598a7d6542SBram Moolenaar  l->add(5)
19608a7d6542SBram Moolenaar  l->insert(99, 1)
19610f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
19628a7d6542SBram Moolenaarenddef
19638a7d6542SBram Moolenaar
1964ae616494SBram Moolenaardef Test_no_insert_xit()
1965d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1966d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1967d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1968d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1969d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1970ae616494SBram Moolenaar
1971ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1972ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1973ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1974ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1975f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1976f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
19776508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
19786508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
1979f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1980f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1981f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1982ae616494SBram Moolenaarenddef
1983ae616494SBram Moolenaar
1984158906cfSBram Moolenaardef IfElse(what: number): string
1985cfcd011fSBram Moolenaar  var res = ''
1986158906cfSBram Moolenaar  if what == 1
1987158906cfSBram Moolenaar    res = "one"
1988158906cfSBram Moolenaar  elseif what == 2
1989158906cfSBram Moolenaar    res = "two"
1990a259d8d3SBram Moolenaar  else
1991158906cfSBram Moolenaar    res = "three"
1992a259d8d3SBram Moolenaar  endif
1993158906cfSBram Moolenaar  return res
1994a259d8d3SBram Moolenaarenddef
1995a259d8d3SBram Moolenaar
1996158906cfSBram Moolenaardef Test_if_elseif_else()
1997158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1998158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1999158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
20000f18b6d1SBram Moolenaarenddef
20010f18b6d1SBram Moolenaar
2002e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2003d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2004d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2005d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2006ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
2007d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
20086628b7ebSBram Moolenaar
20096628b7ebSBram Moolenaar  var lines =<< trim END
20106628b7ebSBram Moolenaar      var s = ''
20116628b7ebSBram Moolenaar      if s = ''
20126628b7ebSBram Moolenaar      endif
20136628b7ebSBram Moolenaar  END
20146628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
20156628b7ebSBram Moolenaar
20166628b7ebSBram Moolenaar  lines =<< trim END
20176628b7ebSBram Moolenaar      var s = ''
20186628b7ebSBram Moolenaar      if s == ''
20196628b7ebSBram Moolenaar      elseif s = ''
20206628b7ebSBram Moolenaar      endif
20216628b7ebSBram Moolenaar  END
20226628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2023e8c4abbbSBram Moolenaarenddef
2024e8c4abbbSBram Moolenaar
20256d69bf60SBram Moolenaarlet g:bool_true = v:true
20266d69bf60SBram Moolenaarlet g:bool_false = v:false
20276d69bf60SBram Moolenaar
20286d69bf60SBram Moolenaardef Test_if_const_expr()
2029cfcd011fSBram Moolenaar  var res = false
20306d69bf60SBram Moolenaar  if true ? true : false
20316d69bf60SBram Moolenaar    res = true
20326d69bf60SBram Moolenaar  endif
20336d69bf60SBram Moolenaar  assert_equal(true, res)
20346d69bf60SBram Moolenaar
2035585fea7bSBram Moolenaar  g:glob = 2
2036585fea7bSBram Moolenaar  if false
20376797966dSBram Moolenaar    execute('g:glob = 3')
2038585fea7bSBram Moolenaar  endif
2039585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2040585fea7bSBram Moolenaar  if true
20416797966dSBram Moolenaar    execute('g:glob = 3')
2042585fea7bSBram Moolenaar  endif
2043585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2044585fea7bSBram Moolenaar
20456d69bf60SBram Moolenaar  res = false
20466d69bf60SBram Moolenaar  if g:bool_true ? true : false
20476d69bf60SBram Moolenaar    res = true
20486d69bf60SBram Moolenaar  endif
20496d69bf60SBram Moolenaar  assert_equal(true, res)
20506d69bf60SBram Moolenaar
20516d69bf60SBram Moolenaar  res = false
20526d69bf60SBram Moolenaar  if true ? g:bool_true : false
20536d69bf60SBram Moolenaar    res = true
20546d69bf60SBram Moolenaar  endif
20556d69bf60SBram Moolenaar  assert_equal(true, res)
20566d69bf60SBram Moolenaar
20576d69bf60SBram Moolenaar  res = false
20586d69bf60SBram Moolenaar  if true ? true : g:bool_false
20596d69bf60SBram Moolenaar    res = true
20606d69bf60SBram Moolenaar  endif
20616d69bf60SBram Moolenaar  assert_equal(true, res)
20626d69bf60SBram Moolenaar
20636d69bf60SBram Moolenaar  res = false
20646d69bf60SBram Moolenaar  if true ? false : true
20656d69bf60SBram Moolenaar    res = true
20666d69bf60SBram Moolenaar  endif
20676d69bf60SBram Moolenaar  assert_equal(false, res)
20686d69bf60SBram Moolenaar
20696d69bf60SBram Moolenaar  res = false
20706d69bf60SBram Moolenaar  if false ? false : true
20716d69bf60SBram Moolenaar    res = true
20726d69bf60SBram Moolenaar  endif
20736d69bf60SBram Moolenaar  assert_equal(true, res)
20746d69bf60SBram Moolenaar
20756d69bf60SBram Moolenaar  res = false
20766d69bf60SBram Moolenaar  if false ? true : false
20776d69bf60SBram Moolenaar    res = true
20786d69bf60SBram Moolenaar  endif
20796d69bf60SBram Moolenaar  assert_equal(false, res)
20806d69bf60SBram Moolenaar
20816d69bf60SBram Moolenaar  res = false
2082e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2083e8c4abbbSBram Moolenaar    res = true
2084e8c4abbbSBram Moolenaar  endif
2085e8c4abbbSBram Moolenaar  assert_equal(false, res)
2086e8c4abbbSBram Moolenaar
2087e8c4abbbSBram Moolenaar  res = false
20886d69bf60SBram Moolenaar  if true && true
20896d69bf60SBram Moolenaar    res = true
20906d69bf60SBram Moolenaar  endif
20916d69bf60SBram Moolenaar  assert_equal(true, res)
20926d69bf60SBram Moolenaar
20936d69bf60SBram Moolenaar  res = false
20946d69bf60SBram Moolenaar  if true && false
20956d69bf60SBram Moolenaar    res = true
20966d69bf60SBram Moolenaar  endif
20976d69bf60SBram Moolenaar  assert_equal(false, res)
20986d69bf60SBram Moolenaar
20996d69bf60SBram Moolenaar  res = false
21006d69bf60SBram Moolenaar  if g:bool_true && false
21016d69bf60SBram Moolenaar    res = true
21026d69bf60SBram Moolenaar  endif
21036d69bf60SBram Moolenaar  assert_equal(false, res)
21046d69bf60SBram Moolenaar
21056d69bf60SBram Moolenaar  res = false
21066d69bf60SBram Moolenaar  if true && g:bool_false
21076d69bf60SBram Moolenaar    res = true
21086d69bf60SBram Moolenaar  endif
21096d69bf60SBram Moolenaar  assert_equal(false, res)
21106d69bf60SBram Moolenaar
21116d69bf60SBram Moolenaar  res = false
21126d69bf60SBram Moolenaar  if false && false
21136d69bf60SBram Moolenaar    res = true
21146d69bf60SBram Moolenaar  endif
21156d69bf60SBram Moolenaar  assert_equal(false, res)
21166d69bf60SBram Moolenaar
21176d69bf60SBram Moolenaar  res = false
21186d69bf60SBram Moolenaar  if true || false
21196d69bf60SBram Moolenaar    res = true
21206d69bf60SBram Moolenaar  endif
21216d69bf60SBram Moolenaar  assert_equal(true, res)
21226d69bf60SBram Moolenaar
21236d69bf60SBram Moolenaar  res = false
21246d69bf60SBram Moolenaar  if g:bool_true || false
21256d69bf60SBram Moolenaar    res = true
21266d69bf60SBram Moolenaar  endif
21276d69bf60SBram Moolenaar  assert_equal(true, res)
21286d69bf60SBram Moolenaar
21296d69bf60SBram Moolenaar  res = false
21306d69bf60SBram Moolenaar  if true || g:bool_false
21316d69bf60SBram Moolenaar    res = true
21326d69bf60SBram Moolenaar  endif
21336d69bf60SBram Moolenaar  assert_equal(true, res)
21346d69bf60SBram Moolenaar
21356d69bf60SBram Moolenaar  res = false
21366d69bf60SBram Moolenaar  if false || false
21376d69bf60SBram Moolenaar    res = true
21386d69bf60SBram Moolenaar  endif
21396d69bf60SBram Moolenaar  assert_equal(false, res)
21403988f64fSBram Moolenaar
21413988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
21423988f64fSBram Moolenaar  if false | eval 0 | endif
21433988f64fSBram Moolenaar  if false | eval burp + 234 | endif
21443988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
21453988f64fSBram Moolenaar  if false
21463988f64fSBram Moolenaar    burp
21473988f64fSBram Moolenaar  endif
214880c34ca3SBram Moolenaarenddef
21496d69bf60SBram Moolenaar
215080c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2151d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2152d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2153d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2154d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
21556d69bf60SBram Moolenaarenddef
21566d69bf60SBram Moolenaar
215772abcf42SBram Moolenaardef RunNested(i: number): number
2158cfcd011fSBram Moolenaar  var x: number = 0
215972abcf42SBram Moolenaar  if i % 2
216072abcf42SBram Moolenaar    if 1
2161f5be8cdbSBram Moolenaar      # comment
216272abcf42SBram Moolenaar    else
2163f5be8cdbSBram Moolenaar      # comment
216472abcf42SBram Moolenaar    endif
216572abcf42SBram Moolenaar    x += 1
216672abcf42SBram Moolenaar  else
216772abcf42SBram Moolenaar    x += 1000
216872abcf42SBram Moolenaar  endif
216972abcf42SBram Moolenaar  return x
217072abcf42SBram Moolenaarenddef
217172abcf42SBram Moolenaar
217272abcf42SBram Moolenaardef Test_nested_if()
217372abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
217472abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
217572abcf42SBram Moolenaarenddef
217672abcf42SBram Moolenaar
2177ad39c094SBram Moolenaardef Test_execute_cmd()
2178e4984290SBram Moolenaar  # missing argument is ignored
2179e4984290SBram Moolenaar  execute
2180e4984290SBram Moolenaar  execute # comment
2181e4984290SBram Moolenaar
2182ad39c094SBram Moolenaar  new
2183ad39c094SBram Moolenaar  setline(1, 'default')
2184d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2185ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2186a72cfb80SBram Moolenaar
2187d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2188a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2189a72cfb80SBram Moolenaar
2190cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2191cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2192a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2193ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2194a72cfb80SBram Moolenaar
2195d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2196ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2197a72cfb80SBram Moolenaar
2198cfcd011fSBram Moolenaar  var cmd_first = 'call '
2199cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2200ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2201ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2202ad39c094SBram Moolenaar  bwipe!
2203585fea7bSBram Moolenaar
2204cfcd011fSBram Moolenaar  var n = true
22052d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
22062d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
22072d6b20d6SBram Moolenaar
2208e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2209e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2210e5abf7afSBram Moolenaar
2211d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2212d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2213d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2214ad39c094SBram Moolenaarenddef
2215ad39c094SBram Moolenaar
221647e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2217f5be8cdbSBram Moolenaar  # only checks line continuation
2218cfcd011fSBram Moolenaar  var lines =<< trim END
221947e880d6SBram Moolenaar      vim9script
222047e880d6SBram Moolenaar      execute 'g:someVar'
222147e880d6SBram Moolenaar                .. ' = ' ..
222247e880d6SBram Moolenaar                   '28'
222347e880d6SBram Moolenaar      assert_equal(28, g:someVar)
222447e880d6SBram Moolenaar      unlet g:someVar
222547e880d6SBram Moolenaar  END
222647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
222747e880d6SBram Moolenaarenddef
222847e880d6SBram Moolenaar
2229ad39c094SBram Moolenaardef Test_echo_cmd()
2230a72cfb80SBram Moolenaar  echo 'some' # comment
2231585fea7bSBram Moolenaar  echon 'thing'
2232ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2233ad39c094SBram Moolenaar
2234a72cfb80SBram Moolenaar  echo "some" # comment
2235a72cfb80SBram Moolenaar  echon "thing"
2236a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2237a72cfb80SBram Moolenaar
2238cfcd011fSBram Moolenaar  var str1 = 'some'
2239cfcd011fSBram Moolenaar  var str2 = 'more'
2240ad39c094SBram Moolenaar  echo str1 str2
2241ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2242a72cfb80SBram Moolenaar
2243d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2244ad39c094SBram Moolenaarenddef
2245ad39c094SBram Moolenaar
2246f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2247f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2248f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2249f93c7feaSBram Moolenaar  echo 'clear'
2250df069eecSBram Moolenaar  :1messages
2251f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2252f93c7feaSBram Moolenaar
2253d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2254f93c7feaSBram Moolenaarenddef
2255f93c7feaSBram Moolenaar
225647e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2257f5be8cdbSBram Moolenaar  # only checks line continuation
2258cfcd011fSBram Moolenaar  var lines =<< trim END
225947e880d6SBram Moolenaar      vim9script
226047e880d6SBram Moolenaar      echomsg 'here'
226147e880d6SBram Moolenaar                .. ' is ' ..
226247e880d6SBram Moolenaar                   'a message'
226347e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
226447e880d6SBram Moolenaar  END
226547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
226647e880d6SBram Moolenaarenddef
226747e880d6SBram Moolenaar
2268f93c7feaSBram Moolenaardef Test_echoerr_cmd()
226940ee466cSBram Moolenaar  try
227040ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
227140ee466cSBram Moolenaar  catch
227240ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
227340ee466cSBram Moolenaar  endtry
2274f93c7feaSBram Moolenaarenddef
2275f93c7feaSBram Moolenaar
227647e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2277f5be8cdbSBram Moolenaar  # only checks line continuation
2278cfcd011fSBram Moolenaar  var lines =<< trim END
227947e880d6SBram Moolenaar      vim9script
228047e880d6SBram Moolenaar      try
228147e880d6SBram Moolenaar        echoerr 'this'
228247e880d6SBram Moolenaar                .. ' is ' ..
228347e880d6SBram Moolenaar                   'wrong'
228447e880d6SBram Moolenaar      catch
228547e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
228647e880d6SBram Moolenaar      endtry
228747e880d6SBram Moolenaar  END
228847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
228947e880d6SBram Moolenaarenddef
229047e880d6SBram Moolenaar
229141fe0617SBram Moolenaardef Test_for_outside_of_function()
2292cfcd011fSBram Moolenaar  var lines =<< trim END
229341fe0617SBram Moolenaar    vim9script
229441fe0617SBram Moolenaar    new
229541fe0617SBram Moolenaar    for var in range(0, 3)
229641fe0617SBram Moolenaar      append(line('$'), var)
229741fe0617SBram Moolenaar    endfor
229841fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
229941fe0617SBram Moolenaar    bwipe!
2300522eefd9SBram Moolenaar
2301522eefd9SBram Moolenaar    var result = ''
2302522eefd9SBram Moolenaar    for i in [1, 2, 3]
2303522eefd9SBram Moolenaar      var loop = ' loop ' .. i
2304522eefd9SBram Moolenaar      result ..= loop
2305522eefd9SBram Moolenaar    endfor
2306522eefd9SBram Moolenaar    assert_equal(' loop 1 loop 2 loop 3', result)
230741fe0617SBram Moolenaar  END
230841fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
230941fe0617SBram Moolenaar  source Xvim9for.vim
231041fe0617SBram Moolenaar  delete('Xvim9for.vim')
231141fe0617SBram Moolenaarenddef
23128a7d6542SBram Moolenaar
2313e8c4abbbSBram Moolenaardef Test_for_loop()
2314f2253963SBram Moolenaar  var lines =<< trim END
2315cfcd011fSBram Moolenaar      var result = ''
2316e8c4abbbSBram Moolenaar      for cnt in range(7)
2317e8c4abbbSBram Moolenaar        if cnt == 4
2318e8c4abbbSBram Moolenaar          break
2319e8c4abbbSBram Moolenaar        endif
2320e8c4abbbSBram Moolenaar        if cnt == 2
2321e8c4abbbSBram Moolenaar          continue
2322e8c4abbbSBram Moolenaar        endif
2323e8c4abbbSBram Moolenaar        result ..= cnt .. '_'
2324e8c4abbbSBram Moolenaar      endfor
2325e8c4abbbSBram Moolenaar      assert_equal('0_1_3_', result)
23260ad3e894SBram Moolenaar
2327cfcd011fSBram Moolenaar      var concat = ''
23280ad3e894SBram Moolenaar      for str in eval('["one", "two"]')
23290ad3e894SBram Moolenaar        concat ..= str
23300ad3e894SBram Moolenaar      endfor
23310ad3e894SBram Moolenaar      assert_equal('onetwo', concat)
233238bd8de5SBram Moolenaar
233338bd8de5SBram Moolenaar      var total = 0
233438bd8de5SBram Moolenaar      for nr in
233538bd8de5SBram Moolenaar          [1, 2, 3]
233638bd8de5SBram Moolenaar        total += nr
233738bd8de5SBram Moolenaar      endfor
233838bd8de5SBram Moolenaar      assert_equal(6, total)
233938bd8de5SBram Moolenaar
234038bd8de5SBram Moolenaar      total = 0
234138bd8de5SBram Moolenaar      for nr
234238bd8de5SBram Moolenaar        in [1, 2, 3]
234338bd8de5SBram Moolenaar        total += nr
234438bd8de5SBram Moolenaar      endfor
234538bd8de5SBram Moolenaar      assert_equal(6, total)
234638bd8de5SBram Moolenaar
234738bd8de5SBram Moolenaar      total = 0
234838bd8de5SBram Moolenaar      for nr
234938bd8de5SBram Moolenaar        in
235038bd8de5SBram Moolenaar        [1, 2, 3]
235138bd8de5SBram Moolenaar        total += nr
235238bd8de5SBram Moolenaar      endfor
235338bd8de5SBram Moolenaar      assert_equal(6, total)
2354036d0714SBram Moolenaar
2355a3589a0dSBram Moolenaar      # with type
2356a3589a0dSBram Moolenaar      total = 0
2357a3589a0dSBram Moolenaar      for n: number in [1, 2, 3]
2358a3589a0dSBram Moolenaar        total += n
2359a3589a0dSBram Moolenaar      endfor
2360a3589a0dSBram Moolenaar      assert_equal(6, total)
2361a3589a0dSBram Moolenaar
2362fe090eb5SBram Moolenaar      var chars = ''
2363fe090eb5SBram Moolenaar      for s: string in 'foobar'
2364fe090eb5SBram Moolenaar        chars ..= s
2365fe090eb5SBram Moolenaar      endfor
2366fe090eb5SBram Moolenaar      assert_equal('foobar', chars)
2367fe090eb5SBram Moolenaar
2368a3589a0dSBram Moolenaar      # unpack with type
2369f2253963SBram Moolenaar      var res = ''
2370a3589a0dSBram Moolenaar      for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2371a3589a0dSBram Moolenaar        res ..= n .. s
2372a3589a0dSBram Moolenaar      endfor
2373a3589a0dSBram Moolenaar      assert_equal('1a2b', res)
2374a3589a0dSBram Moolenaar
2375a3589a0dSBram Moolenaar      # loop over string
2376a3589a0dSBram Moolenaar      res = ''
237774e54fcbSBram Moolenaar      for c in 'aéc̀d'
237874e54fcbSBram Moolenaar        res ..= c .. '-'
237974e54fcbSBram Moolenaar      endfor
238074e54fcbSBram Moolenaar      assert_equal('a-é-c̀-d-', res)
238174e54fcbSBram Moolenaar
238274e54fcbSBram Moolenaar      res = ''
238374e54fcbSBram Moolenaar      for c in ''
238474e54fcbSBram Moolenaar        res ..= c .. '-'
238574e54fcbSBram Moolenaar      endfor
238674e54fcbSBram Moolenaar      assert_equal('', res)
238774e54fcbSBram Moolenaar
238874e54fcbSBram Moolenaar      res = ''
238974e54fcbSBram Moolenaar      for c in test_null_string()
239074e54fcbSBram Moolenaar        res ..= c .. '-'
239174e54fcbSBram Moolenaar      endfor
239274e54fcbSBram Moolenaar      assert_equal('', res)
2393f2253963SBram Moolenaar
2394f2253963SBram Moolenaar      var foo: list<dict<any>> = [
2395f2253963SBram Moolenaar              {a: 'Cat'}
2396f2253963SBram Moolenaar            ]
2397f2253963SBram Moolenaar      for dd in foo
2398f2253963SBram Moolenaar        dd.counter = 12
2399f2253963SBram Moolenaar      endfor
2400f2253963SBram Moolenaar      assert_equal([{a: 'Cat', counter: 12}], foo)
2401f2253963SBram Moolenaar  END
2402f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2403e8c4abbbSBram Moolenaarenddef
2404e8c4abbbSBram Moolenaar
2405e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2406025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2407025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2408025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2409675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2410675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2411cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2412822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
24132d870f8dSBram Moolenaar  delfunc! g:Func
2414675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2415675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2416675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
241774e54fcbSBram Moolenaar
241874e54fcbSBram Moolenaar  # wrong type detected at compile time
241974e54fcbSBram Moolenaar  CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
242074e54fcbSBram Moolenaar
242174e54fcbSBram Moolenaar  # wrong type detected at runtime
242274e54fcbSBram Moolenaar  g:adict = {a: 1}
242374e54fcbSBram Moolenaar  CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
242474e54fcbSBram Moolenaar  unlet g:adict
2425f6a8d420SBram Moolenaar
2426f6a8d420SBram Moolenaar  var lines =<< trim END
2427f6a8d420SBram Moolenaar      var d: list<dict<any>> = [{a: 0}]
2428f6a8d420SBram Moolenaar      for e in d
2429f6a8d420SBram Moolenaar        e = {a: 0, b: ''}
2430f6a8d420SBram Moolenaar      endfor
2431f6a8d420SBram Moolenaar  END
2432f6a8d420SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3)
2433fe090eb5SBram Moolenaar
2434fe090eb5SBram Moolenaar  lines =<< trim END
2435fe090eb5SBram Moolenaar      for nr: number in ['foo']
2436fe090eb5SBram Moolenaar      endfor
2437fe090eb5SBram Moolenaar  END
2438fe090eb5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2439e8c4abbbSBram Moolenaarenddef
2440e8c4abbbSBram Moolenaar
2441ea87069dSBram Moolenaardef Test_for_loop_script_var()
2442ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2443ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2444ea87069dSBram Moolenaar
2445ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2446ea87069dSBram Moolenaar  var lines =<< trim END
2447ea87069dSBram Moolenaar    vim9script
2448ea87069dSBram Moolenaar    var total = 0
2449ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2450ea87069dSBram Moolenaar      total += s:var
2451ea87069dSBram Moolenaar    endfor
2452ea87069dSBram Moolenaar    assert_equal(6, total)
2453ea87069dSBram Moolenaar
2454ea87069dSBram Moolenaar    total = 0
2455ea87069dSBram Moolenaar    for var in [1, 2, 3]
2456ea87069dSBram Moolenaar      total += var
2457ea87069dSBram Moolenaar    endfor
2458ea87069dSBram Moolenaar    assert_equal(6, total)
2459ea87069dSBram Moolenaar  END
2460ea87069dSBram Moolenaarenddef
2461ea87069dSBram Moolenaar
2462792f786aSBram Moolenaardef Test_for_loop_unpack()
24634b8a0651SBram Moolenaar  var lines =<< trim END
2464792f786aSBram Moolenaar      var result = []
2465792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2466792f786aSBram Moolenaar        result->add(v1)
2467792f786aSBram Moolenaar        result->add(v2)
2468792f786aSBram Moolenaar      endfor
2469792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2470792f786aSBram Moolenaar
2471792f786aSBram Moolenaar      result = []
2472792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2473792f786aSBram Moolenaar        result->add(v1)
2474792f786aSBram Moolenaar        result->add(v2)
2475792f786aSBram Moolenaar        result->add(v3)
2476792f786aSBram Moolenaar      endfor
2477792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2478792f786aSBram Moolenaar
24794b8a0651SBram Moolenaar      result = []
24804b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
24814b8a0651SBram Moolenaar        result->add(&ts)
24824b8a0651SBram Moolenaar        result->add(&sw)
24834b8a0651SBram Moolenaar      endfor
24844b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
24854b8a0651SBram Moolenaar
24864b8a0651SBram Moolenaar      var slist: list<string>
24874b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
24884b8a0651SBram Moolenaar        slist->add($LOOPVAR)
24894b8a0651SBram Moolenaar        slist->add(@r)
24904b8a0651SBram Moolenaar        slist->add(v:errmsg)
24914b8a0651SBram Moolenaar      endfor
24924b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
24934b8a0651SBram Moolenaar
24944b8a0651SBram Moolenaar      slist = []
24954b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
24964b8a0651SBram Moolenaar        slist->add(g:globalvar)
24974b8a0651SBram Moolenaar        slist->add(b:bufvar)
24984b8a0651SBram Moolenaar        slist->add(w:winvar)
24994b8a0651SBram Moolenaar        slist->add(t:tabvar)
25004b8a0651SBram Moolenaar      endfor
25014b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2502f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
2503*b777da9bSBram Moolenaar
2504*b777da9bSBram Moolenaar      var res = []
2505*b777da9bSBram Moolenaar      for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2506*b777da9bSBram Moolenaar        res->add(n)
2507*b777da9bSBram Moolenaar      endfor
2508*b777da9bSBram Moolenaar      assert_equal([2, 5], res)
25094b8a0651SBram Moolenaar  END
25104b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
25114b8a0651SBram Moolenaar
25124b8a0651SBram Moolenaar  lines =<< trim END
2513792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2514792f786aSBram Moolenaar        echo v1 v2
2515792f786aSBram Moolenaar      endfor
2516792f786aSBram Moolenaar  END
2517792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2518792f786aSBram Moolenaar
2519792f786aSBram Moolenaar  lines =<< trim END
2520792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2521792f786aSBram Moolenaar        echo v1 v2
2522792f786aSBram Moolenaar      endfor
2523792f786aSBram Moolenaar  END
2524792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2525792f786aSBram Moolenaar
2526792f786aSBram Moolenaar  lines =<< trim END
2527792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2528792f786aSBram Moolenaar        echo v1
2529792f786aSBram Moolenaar      endfor
2530792f786aSBram Moolenaar  END
2531792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2532792f786aSBram Moolenaarenddef
2533792f786aSBram Moolenaar
2534c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2535f2253963SBram Moolenaar  var lines =<< trim END
2536c150c09eSBram Moolenaar      var looped = 0
2537c150c09eSBram Moolenaar      var cleanup = 0
2538c150c09eSBram Moolenaar      for i in range(3)
2539c150c09eSBram Moolenaar        looped += 1
2540c150c09eSBram Moolenaar        try
2541c150c09eSBram Moolenaar          eval [][0]
2542c150c09eSBram Moolenaar        catch
2543c150c09eSBram Moolenaar          continue
2544c150c09eSBram Moolenaar        finally
2545c150c09eSBram Moolenaar          cleanup += 1
2546c150c09eSBram Moolenaar        endtry
2547c150c09eSBram Moolenaar      endfor
2548c150c09eSBram Moolenaar      assert_equal(3, looped)
2549c150c09eSBram Moolenaar      assert_equal(3, cleanup)
2550f2253963SBram Moolenaar  END
2551f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2552c150c09eSBram Moolenaarenddef
2553c150c09eSBram Moolenaar
2554d0df1aacSBram Moolenaardef Test_while_loop()
2555cfcd011fSBram Moolenaar  var result = ''
2556cfcd011fSBram Moolenaar  var cnt = 0
2557d0df1aacSBram Moolenaar  while cnt < 555
2558d0df1aacSBram Moolenaar    if cnt == 3
2559d0df1aacSBram Moolenaar      break
2560d0df1aacSBram Moolenaar    endif
2561d0df1aacSBram Moolenaar    cnt += 1
2562d0df1aacSBram Moolenaar    if cnt == 2
2563d0df1aacSBram Moolenaar      continue
2564d0df1aacSBram Moolenaar    endif
2565d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2566d0df1aacSBram Moolenaar  endwhile
2567d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2568dee37dc7SBram Moolenaar
2569dee37dc7SBram Moolenaar  var s = ''
25700123cc1eSBram Moolenaar  while s == 'x' # {comment}
2571dee37dc7SBram Moolenaar  endwhile
2572d0df1aacSBram Moolenaarenddef
2573d0df1aacSBram Moolenaar
2574e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2575675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2576675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2577675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2578675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2579675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2580675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2581675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
25826628b7ebSBram Moolenaar
25836628b7ebSBram Moolenaar  var lines =<< trim END
25846628b7ebSBram Moolenaar      var s = ''
25856628b7ebSBram Moolenaar      while s = ''
25866628b7ebSBram Moolenaar      endwhile
25876628b7ebSBram Moolenaar  END
25886628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2589bd5da371SBram Moolenaarenddef
2590bd5da371SBram Moolenaar
25919645e2d9SBram Moolenaardef Test_interrupt_loop()
2592cfcd011fSBram Moolenaar  var caught = false
2593cfcd011fSBram Moolenaar  var x = 0
259497acfc78SBram Moolenaar  try
25959645e2d9SBram Moolenaar    while 1
25969645e2d9SBram Moolenaar      x += 1
25979645e2d9SBram Moolenaar      if x == 100
25989645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
25999645e2d9SBram Moolenaar      endif
26009645e2d9SBram Moolenaar    endwhile
260197acfc78SBram Moolenaar  catch
260297acfc78SBram Moolenaar    caught = true
260397acfc78SBram Moolenaar    assert_equal(100, x)
260497acfc78SBram Moolenaar  endtry
260597acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
260625859dd7SBram Moolenaar  # consume the CTRL-C
260725859dd7SBram Moolenaar  getchar(0)
26089645e2d9SBram Moolenaarenddef
260920431c9dSBram Moolenaar
26104fdae999SBram Moolenaardef Test_automatic_line_continuation()
2611cfcd011fSBram Moolenaar  var mylist = [
26124fdae999SBram Moolenaar      'one',
26134fdae999SBram Moolenaar      'two',
26144fdae999SBram Moolenaar      'three',
2615f5be8cdbSBram Moolenaar      ] # comment
26164fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
26174fdae999SBram Moolenaar
2618cfcd011fSBram Moolenaar  var mydict = {
2619e0de171eSBram Moolenaar      ['one']: 1,
2620e0de171eSBram Moolenaar      ['two']: 2,
2621e0de171eSBram Moolenaar      ['three']:
26224fdae999SBram Moolenaar          3,
2623f5be8cdbSBram Moolenaar      } # comment
2624e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2625e0de171eSBram Moolenaar  mydict = {
26262c330432SBram Moolenaar      one: 1,  # comment
26272c330432SBram Moolenaar      two:     # comment
26282c330432SBram Moolenaar           2,  # comment
26292c330432SBram Moolenaar      three: 3 # comment
26302c330432SBram Moolenaar      }
2631e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2632e0de171eSBram Moolenaar  mydict = {
26332c330432SBram Moolenaar      one: 1,
26344fdae999SBram Moolenaar      two:
26354fdae999SBram Moolenaar           2,
26362c330432SBram Moolenaar      three: 3
26374fdae999SBram Moolenaar      }
2638e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2639e6085c53SBram Moolenaar
2640e6085c53SBram Moolenaar  assert_equal(
2641e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2642e6085c53SBram Moolenaar        split('one two three')
2643e6085c53SBram Moolenaar        )
26444fdae999SBram Moolenaarenddef
26454fdae999SBram Moolenaar
26467a092245SBram Moolenaardef Test_vim9_comment()
26477a092245SBram Moolenaar  CheckScriptSuccess([
26487a092245SBram Moolenaar      'vim9script',
26497a092245SBram Moolenaar      '# something',
265093f82cbeSBram Moolenaar      '#something',
265193f82cbeSBram Moolenaar      '#{something',
26527a092245SBram Moolenaar      ])
265393f82cbeSBram Moolenaar
265493f82cbeSBram Moolenaar  split Xfile
265593f82cbeSBram Moolenaar  CheckScriptSuccess([
265693f82cbeSBram Moolenaar      'vim9script',
265793f82cbeSBram Moolenaar      'edit #something',
265893f82cbeSBram Moolenaar      ])
265993f82cbeSBram Moolenaar  CheckScriptSuccess([
266093f82cbeSBram Moolenaar      'vim9script',
266193f82cbeSBram Moolenaar      'edit #{something',
266293f82cbeSBram Moolenaar      ])
266393f82cbeSBram Moolenaar  close
266493f82cbeSBram Moolenaar
26657a092245SBram Moolenaar  CheckScriptFailure([
26667a092245SBram Moolenaar      'vim9script',
26677a092245SBram Moolenaar      ':# something',
26687a092245SBram Moolenaar      ], 'E488:')
26697a092245SBram Moolenaar  CheckScriptFailure([
26707a092245SBram Moolenaar      '# something',
26717a092245SBram Moolenaar      ], 'E488:')
26727a092245SBram Moolenaar  CheckScriptFailure([
26737a092245SBram Moolenaar      ':# something',
26747a092245SBram Moolenaar      ], 'E488:')
26757a092245SBram Moolenaar
26764a8d9f2eSBram Moolenaar  { # block start
26774a8d9f2eSBram Moolenaar  } # block end
26784a8d9f2eSBram Moolenaar  CheckDefFailure([
26794a8d9f2eSBram Moolenaar      '{# comment',
26804a8d9f2eSBram Moolenaar      ], 'E488:')
26814a8d9f2eSBram Moolenaar  CheckDefFailure([
26824a8d9f2eSBram Moolenaar      '{',
26834a8d9f2eSBram Moolenaar      '}# comment',
26844a8d9f2eSBram Moolenaar      ], 'E488:')
26854a8d9f2eSBram Moolenaar
26864a8d9f2eSBram Moolenaar  echo "yes" # comment
26874a8d9f2eSBram Moolenaar  CheckDefFailure([
26884a8d9f2eSBram Moolenaar      'echo "yes"# comment',
26894a8d9f2eSBram Moolenaar      ], 'E488:')
26907a092245SBram Moolenaar  CheckScriptSuccess([
26917a092245SBram Moolenaar      'vim9script',
26927a092245SBram Moolenaar      'echo "yes" # something',
26937a092245SBram Moolenaar      ])
26947a092245SBram Moolenaar  CheckScriptFailure([
26957a092245SBram Moolenaar      'vim9script',
26967a092245SBram Moolenaar      'echo "yes"# something',
26977a092245SBram Moolenaar      ], 'E121:')
26987a092245SBram Moolenaar  CheckScriptFailure([
26997a092245SBram Moolenaar      'vim9script',
27007a092245SBram Moolenaar      'echo# something',
2701f8103f27SBram Moolenaar      ], 'E1144:')
27027a092245SBram Moolenaar  CheckScriptFailure([
27037a092245SBram Moolenaar      'echo "yes" # something',
27047a092245SBram Moolenaar      ], 'E121:')
27057a092245SBram Moolenaar
27064a8d9f2eSBram Moolenaar  exe "echo" # comment
27074a8d9f2eSBram Moolenaar  CheckDefFailure([
27084a8d9f2eSBram Moolenaar      'exe "echo"# comment',
27094a8d9f2eSBram Moolenaar      ], 'E488:')
27104a8d9f2eSBram Moolenaar  CheckScriptSuccess([
27114a8d9f2eSBram Moolenaar      'vim9script',
27124a8d9f2eSBram Moolenaar      'exe "echo" # something',
27134a8d9f2eSBram Moolenaar      ])
27144a8d9f2eSBram Moolenaar  CheckScriptFailure([
27154a8d9f2eSBram Moolenaar      'vim9script',
27164a8d9f2eSBram Moolenaar      'exe "echo"# something',
27174a8d9f2eSBram Moolenaar      ], 'E121:')
27184a8d9f2eSBram Moolenaar  CheckScriptFailure([
27194a8d9f2eSBram Moolenaar      'vim9script',
27204a8d9f2eSBram Moolenaar      'exe# something',
2721f8103f27SBram Moolenaar      ], 'E1144:')
27224a8d9f2eSBram Moolenaar  CheckScriptFailure([
27234a8d9f2eSBram Moolenaar      'exe "echo" # something',
27244a8d9f2eSBram Moolenaar      ], 'E121:')
27254a8d9f2eSBram Moolenaar
27267a092245SBram Moolenaar  CheckDefFailure([
27277a092245SBram Moolenaar      'try# comment',
27287a092245SBram Moolenaar      '  echo "yes"',
27297a092245SBram Moolenaar      'catch',
27307a092245SBram Moolenaar      'endtry',
2731f8103f27SBram Moolenaar      ], 'E1144:')
27322c5ed4e3SBram Moolenaar  CheckScriptFailure([
27332c5ed4e3SBram Moolenaar      'vim9script',
27342c5ed4e3SBram Moolenaar      'try# comment',
27352c5ed4e3SBram Moolenaar      'echo "yes"',
2736f8103f27SBram Moolenaar      ], 'E1144:')
27377a092245SBram Moolenaar  CheckDefFailure([
27387a092245SBram Moolenaar      'try',
2739a72cfb80SBram Moolenaar      '  throw#comment',
2740a72cfb80SBram Moolenaar      'catch',
2741a72cfb80SBram Moolenaar      'endtry',
2742f8103f27SBram Moolenaar      ], 'E1144:')
2743a72cfb80SBram Moolenaar  CheckDefFailure([
2744a72cfb80SBram Moolenaar      'try',
2745a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2746a72cfb80SBram Moolenaar      'catch',
2747a72cfb80SBram Moolenaar      'endtry',
2748a72cfb80SBram Moolenaar      ], 'E488:')
2749a72cfb80SBram Moolenaar  CheckDefFailure([
2750a72cfb80SBram Moolenaar      'try',
27517a092245SBram Moolenaar      '  echo "yes"',
27527a092245SBram Moolenaar      'catch# comment',
27537a092245SBram Moolenaar      'endtry',
2754f8103f27SBram Moolenaar      ], 'E1144:')
27552c5ed4e3SBram Moolenaar  CheckScriptFailure([
27562c5ed4e3SBram Moolenaar      'vim9script',
27572c5ed4e3SBram Moolenaar      'try',
27582c5ed4e3SBram Moolenaar      '  echo "yes"',
27592c5ed4e3SBram Moolenaar      'catch# comment',
27602c5ed4e3SBram Moolenaar      'endtry',
2761f8103f27SBram Moolenaar      ], 'E1144:')
27622c5ed4e3SBram Moolenaar  CheckDefFailure([
27632c5ed4e3SBram Moolenaar      'try',
27642c5ed4e3SBram Moolenaar      '  echo "yes"',
27652c5ed4e3SBram Moolenaar      'catch /pat/# comment',
27662c5ed4e3SBram Moolenaar      'endtry',
27672c5ed4e3SBram Moolenaar      ], 'E488:')
27687a092245SBram Moolenaar  CheckDefFailure([
27697a092245SBram Moolenaar      'try',
27707a092245SBram Moolenaar      'echo "yes"',
27717a092245SBram Moolenaar      'catch',
27727a092245SBram Moolenaar      'endtry# comment',
2773f8103f27SBram Moolenaar      ], 'E1144:')
27742c5ed4e3SBram Moolenaar  CheckScriptFailure([
27752c5ed4e3SBram Moolenaar      'vim9script',
27762c5ed4e3SBram Moolenaar      'try',
27772c5ed4e3SBram Moolenaar      '  echo "yes"',
27782c5ed4e3SBram Moolenaar      'catch',
27792c5ed4e3SBram Moolenaar      'endtry# comment',
2780f8103f27SBram Moolenaar      ], 'E1144:')
27812c5ed4e3SBram Moolenaar
27822c5ed4e3SBram Moolenaar  CheckScriptSuccess([
27832c5ed4e3SBram Moolenaar      'vim9script',
27842c5ed4e3SBram Moolenaar      'hi # comment',
27852c5ed4e3SBram Moolenaar      ])
27862c5ed4e3SBram Moolenaar  CheckScriptFailure([
27872c5ed4e3SBram Moolenaar      'vim9script',
27882c5ed4e3SBram Moolenaar      'hi# comment',
2789f8103f27SBram Moolenaar      ], 'E1144:')
27901966c248SBram Moolenaar  CheckScriptSuccess([
27911966c248SBram Moolenaar      'vim9script',
27921966c248SBram Moolenaar      'hi Search # comment',
27931966c248SBram Moolenaar      ])
27941966c248SBram Moolenaar  CheckScriptFailure([
27951966c248SBram Moolenaar      'vim9script',
27961966c248SBram Moolenaar      'hi Search# comment',
27971966c248SBram Moolenaar      ], 'E416:')
27981966c248SBram Moolenaar  CheckScriptSuccess([
27991966c248SBram Moolenaar      'vim9script',
28001966c248SBram Moolenaar      'hi link This Search # comment',
28011966c248SBram Moolenaar      ])
28021966c248SBram Moolenaar  CheckScriptFailure([
28031966c248SBram Moolenaar      'vim9script',
28041966c248SBram Moolenaar      'hi link This That# comment',
28051966c248SBram Moolenaar      ], 'E413:')
28061966c248SBram Moolenaar  CheckScriptSuccess([
28071966c248SBram Moolenaar      'vim9script',
28081966c248SBram Moolenaar      'hi clear This # comment',
28091966c248SBram Moolenaar      'hi clear # comment',
28101966c248SBram Moolenaar      ])
2811f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2812f5be8cdbSBram Moolenaar  # hi clear This# comment',
28131966c248SBram Moolenaar  CheckScriptFailure([
28141966c248SBram Moolenaar      'vim9script',
28151966c248SBram Moolenaar      'hi clear# comment',
28161966c248SBram Moolenaar      ], 'E416:')
28171966c248SBram Moolenaar
28181966c248SBram Moolenaar  CheckScriptSuccess([
28191966c248SBram Moolenaar      'vim9script',
28201966c248SBram Moolenaar      'hi Group term=bold',
28211966c248SBram Moolenaar      'match Group /todo/ # comment',
28221966c248SBram Moolenaar      ])
28231966c248SBram Moolenaar  CheckScriptFailure([
28241966c248SBram Moolenaar      'vim9script',
28251966c248SBram Moolenaar      'hi Group term=bold',
28261966c248SBram Moolenaar      'match Group /todo/# comment',
28271966c248SBram Moolenaar      ], 'E488:')
28281966c248SBram Moolenaar  CheckScriptSuccess([
28291966c248SBram Moolenaar      'vim9script',
28301966c248SBram Moolenaar      'match # comment',
28311966c248SBram Moolenaar      ])
28321966c248SBram Moolenaar  CheckScriptFailure([
28331966c248SBram Moolenaar      'vim9script',
28341966c248SBram Moolenaar      'match# comment',
2835f8103f27SBram Moolenaar      ], 'E1144:')
28361966c248SBram Moolenaar  CheckScriptSuccess([
28371966c248SBram Moolenaar      'vim9script',
28381966c248SBram Moolenaar      'match none # comment',
28391966c248SBram Moolenaar      ])
28401966c248SBram Moolenaar  CheckScriptFailure([
28411966c248SBram Moolenaar      'vim9script',
28421966c248SBram Moolenaar      'match none# comment',
28431966c248SBram Moolenaar      ], 'E475:')
28441966c248SBram Moolenaar
28451966c248SBram Moolenaar  CheckScriptSuccess([
28461966c248SBram Moolenaar      'vim9script',
28471966c248SBram Moolenaar      'menutrans clear # comment',
28481966c248SBram Moolenaar      ])
28491966c248SBram Moolenaar  CheckScriptFailure([
28501966c248SBram Moolenaar      'vim9script',
28511966c248SBram Moolenaar      'menutrans clear# comment text',
28521966c248SBram Moolenaar      ], 'E474:')
28531966c248SBram Moolenaar
28541966c248SBram Moolenaar  CheckScriptSuccess([
28551966c248SBram Moolenaar      'vim9script',
28561966c248SBram Moolenaar      'syntax clear # comment',
28571966c248SBram Moolenaar      ])
28581966c248SBram Moolenaar  CheckScriptFailure([
28591966c248SBram Moolenaar      'vim9script',
28601966c248SBram Moolenaar      'syntax clear# comment text',
28611966c248SBram Moolenaar      ], 'E28:')
28621966c248SBram Moolenaar  CheckScriptSuccess([
28631966c248SBram Moolenaar      'vim9script',
28641966c248SBram Moolenaar      'syntax keyword Word some',
28651966c248SBram Moolenaar      'syntax clear Word # comment',
28661966c248SBram Moolenaar      ])
28671966c248SBram Moolenaar  CheckScriptFailure([
28681966c248SBram Moolenaar      'vim9script',
28691966c248SBram Moolenaar      'syntax keyword Word some',
28701966c248SBram Moolenaar      'syntax clear Word# comment text',
28711966c248SBram Moolenaar      ], 'E28:')
28721966c248SBram Moolenaar
28731966c248SBram Moolenaar  CheckScriptSuccess([
28741966c248SBram Moolenaar      'vim9script',
28751966c248SBram Moolenaar      'syntax list # comment',
28761966c248SBram Moolenaar      ])
28771966c248SBram Moolenaar  CheckScriptFailure([
28781966c248SBram Moolenaar      'vim9script',
28791966c248SBram Moolenaar      'syntax list# comment text',
28801966c248SBram Moolenaar      ], 'E28:')
28811966c248SBram Moolenaar
28821966c248SBram Moolenaar  CheckScriptSuccess([
28831966c248SBram Moolenaar      'vim9script',
28841966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
28851966c248SBram Moolenaar      ])
28861966c248SBram Moolenaar  CheckScriptFailure([
28871966c248SBram Moolenaar      'vim9script',
28881966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
28891966c248SBram Moolenaar      ], 'E475:')
28901966c248SBram Moolenaar
28911966c248SBram Moolenaar  CheckScriptSuccess([
28921966c248SBram Moolenaar      'vim9script',
28931966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
28941966c248SBram Moolenaar      ])
28951966c248SBram Moolenaar  CheckScriptFailure([
28961966c248SBram Moolenaar      'vim9script',
28971966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
28981966c248SBram Moolenaar      ], 'E789:')
28991966c248SBram Moolenaar
29001966c248SBram Moolenaar  CheckScriptSuccess([
29011966c248SBram Moolenaar      'vim9script',
29021966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
29031966c248SBram Moolenaar      ])
29041966c248SBram Moolenaar  CheckScriptFailure([
29051966c248SBram Moolenaar      'vim9script',
29061966c248SBram Moolenaar      'syntax match Word /pat/# comment',
29071966c248SBram Moolenaar      ], 'E402:')
29081966c248SBram Moolenaar
29091966c248SBram Moolenaar  CheckScriptSuccess([
29101966c248SBram Moolenaar      'vim9script',
29111966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
29121966c248SBram Moolenaar      ])
29131966c248SBram Moolenaar  CheckScriptFailure([
29141966c248SBram Moolenaar      'vim9script',
29151966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
29161966c248SBram Moolenaar      ], 'E475:')
29171966c248SBram Moolenaar  CheckScriptFailure([
29181966c248SBram Moolenaar      'vim9script',
29191966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
29201966c248SBram Moolenaar      ], 'E406:')
29211966c248SBram Moolenaar  CheckScriptFailure([
29221966c248SBram Moolenaar      'vim9script',
29231966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
29241966c248SBram Moolenaar      ], 'E475:')
29251966c248SBram Moolenaar
29261966c248SBram Moolenaar  CheckScriptSuccess([
29271966c248SBram Moolenaar      'vim9script',
29281966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
29291966c248SBram Moolenaar      ])
29301966c248SBram Moolenaar  CheckScriptFailure([
29311966c248SBram Moolenaar      'vim9script',
29321966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2933d032f34aSBram Moolenaar      ], 'E402:')
29341966c248SBram Moolenaar
29351966c248SBram Moolenaar  CheckScriptSuccess([
29361966c248SBram Moolenaar      'vim9script',
29371966c248SBram Moolenaar      'syntax sync # comment',
29381966c248SBram Moolenaar      ])
29391966c248SBram Moolenaar  CheckScriptFailure([
29401966c248SBram Moolenaar      'vim9script',
29411966c248SBram Moolenaar      'syntax sync# comment',
29421966c248SBram Moolenaar      ], 'E404:')
29431966c248SBram Moolenaar  CheckScriptSuccess([
29441966c248SBram Moolenaar      'vim9script',
29451966c248SBram Moolenaar      'syntax sync ccomment # comment',
29461966c248SBram Moolenaar      ])
29471966c248SBram Moolenaar  CheckScriptFailure([
29481966c248SBram Moolenaar      'vim9script',
29491966c248SBram Moolenaar      'syntax sync ccomment# comment',
29501966c248SBram Moolenaar      ], 'E404:')
29511966c248SBram Moolenaar
29521966c248SBram Moolenaar  CheckScriptSuccess([
29531966c248SBram Moolenaar      'vim9script',
29541966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
29551966c248SBram Moolenaar      ])
29561966c248SBram Moolenaar  CheckScriptFailure([
29571966c248SBram Moolenaar      'vim9script',
29581966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
29591966c248SBram Moolenaar      ], 'E475:')
2960a72cfb80SBram Moolenaar
2961a72cfb80SBram Moolenaar  CheckScriptSuccess([
2962a72cfb80SBram Moolenaar      'vim9script',
2963a72cfb80SBram Moolenaar      'command Echo echo # comment',
2964a72cfb80SBram Moolenaar      'command Echo # comment',
29652d870f8dSBram Moolenaar      'delcommand Echo',
2966a72cfb80SBram Moolenaar      ])
2967a72cfb80SBram Moolenaar  CheckScriptFailure([
2968a72cfb80SBram Moolenaar      'vim9script',
2969a72cfb80SBram Moolenaar      'command Echo echo# comment',
2970a72cfb80SBram Moolenaar      'Echo',
2971f8103f27SBram Moolenaar      ], 'E1144:')
29722d870f8dSBram Moolenaar  delcommand Echo
297370249ee8SBram Moolenaar
297470249ee8SBram Moolenaar  var curdir = getcwd()
297570249ee8SBram Moolenaar  CheckScriptSuccess([
297670249ee8SBram Moolenaar      'command Echo cd " comment',
297770249ee8SBram Moolenaar      'Echo',
297870249ee8SBram Moolenaar      'delcommand Echo',
297970249ee8SBram Moolenaar      ])
298070249ee8SBram Moolenaar  CheckScriptSuccess([
2981090728adSBram Moolenaar      'vim9script',
298270249ee8SBram Moolenaar      'command Echo cd # comment',
298370249ee8SBram Moolenaar      'Echo',
298470249ee8SBram Moolenaar      'delcommand Echo',
298570249ee8SBram Moolenaar      ])
298670249ee8SBram Moolenaar  CheckScriptFailure([
298770249ee8SBram Moolenaar      'vim9script',
298870249ee8SBram Moolenaar      'command Echo cd " comment',
298970249ee8SBram Moolenaar      'Echo',
299070249ee8SBram Moolenaar      ], 'E344:')
299170249ee8SBram Moolenaar  delcommand Echo
299270249ee8SBram Moolenaar  chdir(curdir)
299370249ee8SBram Moolenaar
2994a72cfb80SBram Moolenaar  CheckScriptFailure([
2995a72cfb80SBram Moolenaar      'vim9script',
2996a72cfb80SBram Moolenaar      'command Echo# comment',
2997a72cfb80SBram Moolenaar      ], 'E182:')
2998a72cfb80SBram Moolenaar  CheckScriptFailure([
2999a72cfb80SBram Moolenaar      'vim9script',
3000a72cfb80SBram Moolenaar      'command Echo echo',
3001a72cfb80SBram Moolenaar      'command Echo# comment',
3002a72cfb80SBram Moolenaar      ], 'E182:')
30032d870f8dSBram Moolenaar  delcommand Echo
3004a72cfb80SBram Moolenaar
3005a72cfb80SBram Moolenaar  CheckScriptSuccess([
3006a72cfb80SBram Moolenaar      'vim9script',
3007a72cfb80SBram Moolenaar      'function # comment',
3008a72cfb80SBram Moolenaar      ])
3009a72cfb80SBram Moolenaar  CheckScriptFailure([
3010a72cfb80SBram Moolenaar      'vim9script',
30119898107fSBram Moolenaar      'function " comment',
30129898107fSBram Moolenaar      ], 'E129:')
30139898107fSBram Moolenaar  CheckScriptFailure([
30149898107fSBram Moolenaar      'vim9script',
3015a72cfb80SBram Moolenaar      'function# comment',
3016f8103f27SBram Moolenaar      ], 'E1144:')
3017a72cfb80SBram Moolenaar  CheckScriptSuccess([
3018a72cfb80SBram Moolenaar      'vim9script',
3019a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
3020a72cfb80SBram Moolenaar      ])
3021a72cfb80SBram Moolenaar  CheckScriptFailure([
3022a72cfb80SBram Moolenaar      'vim9script',
3023a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
3024a72cfb80SBram Moolenaar      ], 'E488:')
3025a72cfb80SBram Moolenaar
3026a72cfb80SBram Moolenaar  CheckScriptSuccess([
3027a72cfb80SBram Moolenaar      'vim9script',
30284c17ad94SBram Moolenaar      'func g:DeleteMeA()',
3029a72cfb80SBram Moolenaar      'endfunc',
30304c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
3031a72cfb80SBram Moolenaar      ])
3032a72cfb80SBram Moolenaar  CheckScriptFailure([
3033a72cfb80SBram Moolenaar      'vim9script',
30344c17ad94SBram Moolenaar      'func g:DeleteMeB()',
3035a72cfb80SBram Moolenaar      'endfunc',
30364c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
3037a72cfb80SBram Moolenaar      ], 'E488:')
3038a72cfb80SBram Moolenaar
3039a72cfb80SBram Moolenaar  CheckScriptSuccess([
3040a72cfb80SBram Moolenaar      'vim9script',
3041a72cfb80SBram Moolenaar      'call execute("ls") # comment',
3042a72cfb80SBram Moolenaar      ])
3043a72cfb80SBram Moolenaar  CheckScriptFailure([
3044a72cfb80SBram Moolenaar      'vim9script',
3045a72cfb80SBram Moolenaar      'call execute("ls")# comment',
3046a72cfb80SBram Moolenaar      ], 'E488:')
3047e7e4838fSBram Moolenaar
3048e7e4838fSBram Moolenaar  CheckScriptFailure([
3049e7e4838fSBram Moolenaar      'def Test() " comment',
3050e7e4838fSBram Moolenaar      'enddef',
3051e7e4838fSBram Moolenaar      ], 'E488:')
3052e7e4838fSBram Moolenaar  CheckScriptFailure([
3053e7e4838fSBram Moolenaar      'vim9script',
3054e7e4838fSBram Moolenaar      'def Test() " comment',
3055e7e4838fSBram Moolenaar      'enddef',
3056e7e4838fSBram Moolenaar      ], 'E488:')
3057e7e4838fSBram Moolenaar
3058e7e4838fSBram Moolenaar  CheckScriptSuccess([
3059e7e4838fSBram Moolenaar      'func Test() " comment',
3060e7e4838fSBram Moolenaar      'endfunc',
30612d870f8dSBram Moolenaar      'delfunc Test',
3062e7e4838fSBram Moolenaar      ])
30639898107fSBram Moolenaar  CheckScriptSuccess([
3064e7e4838fSBram Moolenaar      'vim9script',
3065e7e4838fSBram Moolenaar      'func Test() " comment',
3066e7e4838fSBram Moolenaar      'endfunc',
30679898107fSBram Moolenaar      ])
3068e7e4838fSBram Moolenaar
3069e7e4838fSBram Moolenaar  CheckScriptSuccess([
3070e7e4838fSBram Moolenaar      'def Test() # comment',
3071e7e4838fSBram Moolenaar      'enddef',
3072e7e4838fSBram Moolenaar      ])
3073e7e4838fSBram Moolenaar  CheckScriptFailure([
3074e7e4838fSBram Moolenaar      'func Test() # comment',
3075e7e4838fSBram Moolenaar      'endfunc',
3076e7e4838fSBram Moolenaar      ], 'E488:')
30772c5ed4e3SBram Moolenaarenddef
30782c5ed4e3SBram Moolenaar
30792c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
30802c5ed4e3SBram Moolenaar  CheckCanRunGui
30812c5ed4e3SBram Moolenaar
30822c5ed4e3SBram Moolenaar  CheckScriptFailure([
30832c5ed4e3SBram Moolenaar      'vim9script',
30842c5ed4e3SBram Moolenaar      'gui#comment'
3085f8103f27SBram Moolenaar      ], 'E1144:')
30862c5ed4e3SBram Moolenaar  CheckScriptFailure([
30872c5ed4e3SBram Moolenaar      'vim9script',
30882c5ed4e3SBram Moolenaar      'gui -f#comment'
30892c5ed4e3SBram Moolenaar      ], 'E499:')
30907a092245SBram Moolenaarenddef
30917a092245SBram Moolenaar
3092a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
30936797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
30946797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3095a26b9700SBram Moolenaar
3096a26b9700SBram Moolenaar  edit test.vim
3097a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3098a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3099a26b9700SBram Moolenaar
3100a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3101a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3102a26b9700SBram Moolenaar
3103a26b9700SBram Moolenaar  g:entered = 0
3104a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3105a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3106a26b9700SBram Moolenaar
3107a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3108a26b9700SBram Moolenaar
3109a26b9700SBram Moolenaar  au! TabEnter
3110a26b9700SBram Moolenaar  unlet g:entered
3111d72c1bf0SBram Moolenaar
3112d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3113d72c1bf0SBram Moolenaar      'vim9script',
31146797966dSBram Moolenaar      'g:var = 123',
3115e55b1c09SBram Moolenaar      'b:var = 456',
3116e55b1c09SBram Moolenaar      'w:var = 777',
3117e55b1c09SBram Moolenaar      't:var = 888',
3118d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3119d72c1bf0SBram Moolenaar      ])
3120d72c1bf0SBram Moolenaar
3121d72c1bf0SBram Moolenaar  CheckScriptFailure([
3122d72c1bf0SBram Moolenaar      'vim9script',
3123cfcd011fSBram Moolenaar      'let var = 123',
3124cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3125cfcd011fSBram Moolenaar
3126cfcd011fSBram Moolenaar  CheckScriptFailure([
3127cfcd011fSBram Moolenaar      'vim9script',
3128cfcd011fSBram Moolenaar      'var g:var = 123',
3129e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3130e55b1c09SBram Moolenaar
3131e55b1c09SBram Moolenaar  CheckScriptFailure([
3132e55b1c09SBram Moolenaar      'vim9script',
3133cfcd011fSBram Moolenaar      'var b:var = 123',
3134e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3135e55b1c09SBram Moolenaar
3136e55b1c09SBram Moolenaar  CheckScriptFailure([
3137e55b1c09SBram Moolenaar      'vim9script',
3138cfcd011fSBram Moolenaar      'var w:var = 123',
3139e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3140e55b1c09SBram Moolenaar
3141e55b1c09SBram Moolenaar  CheckScriptFailure([
3142e55b1c09SBram Moolenaar      'vim9script',
3143cfcd011fSBram Moolenaar      'var t:var = 123',
3144e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3145e55b1c09SBram Moolenaar
3146e55b1c09SBram Moolenaar  CheckScriptFailure([
3147e55b1c09SBram Moolenaar      'vim9script',
3148cfcd011fSBram Moolenaar      'var v:version = 123',
3149e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3150e55b1c09SBram Moolenaar
3151e55b1c09SBram Moolenaar  CheckScriptFailure([
3152e55b1c09SBram Moolenaar      'vim9script',
3153cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3154e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
31556797966dSBram Moolenaar
31566797966dSBram Moolenaar  CheckScriptFailure([
31576797966dSBram Moolenaar      'vim9script',
31586797966dSBram Moolenaar      'g:var = 123',
315932e35117SBram Moolenaar      'unlet g:var# comment1',
3160d72c1bf0SBram Moolenaar      ], 'E108:')
3161d72c1bf0SBram Moolenaar
3162d72c1bf0SBram Moolenaar  CheckScriptFailure([
3163d72c1bf0SBram Moolenaar      'let g:var = 123',
3164d72c1bf0SBram Moolenaar      'unlet g:var # something',
3165d72c1bf0SBram Moolenaar      ], 'E488:')
3166faac4104SBram Moolenaar
3167faac4104SBram Moolenaar  CheckScriptSuccess([
3168faac4104SBram Moolenaar      'vim9script',
316932e35117SBram Moolenaar      'if 1 # comment2',
3170faac4104SBram Moolenaar      '  echo "yes"',
3171faac4104SBram Moolenaar      'elseif 2 #comment',
3172faac4104SBram Moolenaar      '  echo "no"',
3173faac4104SBram Moolenaar      'endif',
3174faac4104SBram Moolenaar      ])
3175faac4104SBram Moolenaar
3176faac4104SBram Moolenaar  CheckScriptFailure([
3177faac4104SBram Moolenaar      'vim9script',
317832e35117SBram Moolenaar      'if 1# comment3',
3179faac4104SBram Moolenaar      '  echo "yes"',
3180faac4104SBram Moolenaar      'endif',
3181faac4104SBram Moolenaar      ], 'E15:')
3182faac4104SBram Moolenaar
3183faac4104SBram Moolenaar  CheckScriptFailure([
3184faac4104SBram Moolenaar      'vim9script',
318532e35117SBram Moolenaar      'if 0 # comment4',
3186faac4104SBram Moolenaar      '  echo "yes"',
3187faac4104SBram Moolenaar      'elseif 2#comment',
3188faac4104SBram Moolenaar      '  echo "no"',
3189faac4104SBram Moolenaar      'endif',
3190faac4104SBram Moolenaar      ], 'E15:')
3191faac4104SBram Moolenaar
3192faac4104SBram Moolenaar  CheckScriptSuccess([
3193faac4104SBram Moolenaar      'vim9script',
3194cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3195faac4104SBram Moolenaar      ])
3196faac4104SBram Moolenaar
3197faac4104SBram Moolenaar  CheckScriptFailure([
3198faac4104SBram Moolenaar      'vim9script',
3199cfcd011fSBram Moolenaar      'var v = 1# comment6',
320032e35117SBram Moolenaar      ], 'E15:')
3201faac4104SBram Moolenaar
3202faac4104SBram Moolenaar  CheckScriptSuccess([
3203faac4104SBram Moolenaar      'vim9script',
3204faac4104SBram Moolenaar      'new'
3205d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3206df069eecSBram Moolenaar      ':$',
3207faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3208faac4104SBram Moolenaar      'bwipe!',
3209faac4104SBram Moolenaar      ])
3210faac4104SBram Moolenaar
3211f5be8cdbSBram Moolenaar  CheckScriptFailure([
3212f5be8cdbSBram Moolenaar      'vim9script',
3213f5be8cdbSBram Moolenaar      'new'
3214d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3215f5be8cdbSBram Moolenaar      ':$',
3216f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3217f5be8cdbSBram Moolenaar      'bwipe!',
3218f5be8cdbSBram Moolenaar      ], 'E488:')
3219f5be8cdbSBram Moolenaar
3220f5be8cdbSBram Moolenaar  CheckScriptFailure([
3221f5be8cdbSBram Moolenaar      'vim9script',
3222f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3223f5be8cdbSBram Moolenaar      ], 'E477:')
3224a26b9700SBram Moolenaarenddef
3225a26b9700SBram Moolenaar
32267e5bd91dSBram Moolenaardef Test_finish()
3227cfcd011fSBram Moolenaar  var lines =<< trim END
32287e5bd91dSBram Moolenaar    vim9script
32296797966dSBram Moolenaar    g:res = 'one'
32307e5bd91dSBram Moolenaar    if v:false | finish | endif
32316797966dSBram Moolenaar    g:res = 'two'
32327e5bd91dSBram Moolenaar    finish
32336797966dSBram Moolenaar    g:res = 'three'
32347e5bd91dSBram Moolenaar  END
32357e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
32367e5bd91dSBram Moolenaar  source Xfinished
32377e5bd91dSBram Moolenaar  assert_equal('two', g:res)
32387e5bd91dSBram Moolenaar
32397e5bd91dSBram Moolenaar  unlet g:res
32407e5bd91dSBram Moolenaar  delete('Xfinished')
32417e5bd91dSBram Moolenaarenddef
32427e5bd91dSBram Moolenaar
3243a5d0077eSBram Moolenaardef Test_forward_declaration()
3244cfcd011fSBram Moolenaar  var lines =<< trim END
3245a5d0077eSBram Moolenaar    vim9script
3246a5d0077eSBram Moolenaar    def GetValue(): string
3247a5d0077eSBram Moolenaar      return theVal
3248a5d0077eSBram Moolenaar    enddef
3249cfcd011fSBram Moolenaar    var theVal = 'something'
3250822ba247SBram Moolenaar    g:initVal = GetValue()
3251a5d0077eSBram Moolenaar    theVal = 'else'
3252a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3253a5d0077eSBram Moolenaar  END
3254a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3255a5d0077eSBram Moolenaar  source Xforward
3256a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3257a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3258a5d0077eSBram Moolenaar
3259a5d0077eSBram Moolenaar  unlet g:initVal
3260a5d0077eSBram Moolenaar  unlet g:laterVal
3261a5d0077eSBram Moolenaar  delete('Xforward')
3262a5d0077eSBram Moolenaarenddef
3263a5d0077eSBram Moolenaar
32649721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3265a6294955SBram Moolenaar  var vim9_lines =<< trim END
3266a6294955SBram Moolenaar    vim9script
3267a6294955SBram Moolenaar    var local = 'local'
3268a6294955SBram Moolenaar    g:global = 'global'
3269a6294955SBram Moolenaar    export var exported = 'exported'
3270a6294955SBram Moolenaar    export def GetText(): string
3271a6294955SBram Moolenaar       return 'text'
3272a6294955SBram Moolenaar    enddef
3273a6294955SBram Moolenaar  END
3274a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3275a6294955SBram Moolenaar
3276cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
32779721fb4eSBram Moolenaar    source Xvim9_script.vim
32789721fb4eSBram Moolenaar
32799721fb4eSBram Moolenaar    call assert_false(exists('local'))
32809721fb4eSBram Moolenaar    call assert_false(exists('exported'))
32819721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
32829721fb4eSBram Moolenaar    call assert_equal('global', global)
32839721fb4eSBram Moolenaar    call assert_equal('global', g:global)
32849721fb4eSBram Moolenaar
32859721fb4eSBram Moolenaar    " imported variable becomes script-local
32869721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
32879721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
32889721fb4eSBram Moolenaar    call assert_false(exists('exported'))
32899721fb4eSBram Moolenaar
32909721fb4eSBram Moolenaar    " imported function becomes script-local
32919721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
32929721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
32939721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
32949721fb4eSBram Moolenaar  END
32959721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
32969721fb4eSBram Moolenaar
32979721fb4eSBram Moolenaar  source Xlegacy_script.vim
32989721fb4eSBram Moolenaar  assert_equal('global', g:global)
3299f5be8cdbSBram Moolenaar  unlet g:global
33009721fb4eSBram Moolenaar
33019721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
33029721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
33039721fb4eSBram Moolenaarenddef
3304a5d0077eSBram Moolenaar
3305e535db86SBram Moolenaardef Test_declare_script_in_func()
3306e535db86SBram Moolenaar  var lines =<< trim END
3307e535db86SBram Moolenaar      vim9script
3308e535db86SBram Moolenaar      func Declare()
3309e535db86SBram Moolenaar        let s:local = 123
3310e535db86SBram Moolenaar      endfunc
3311e535db86SBram Moolenaar      Declare()
3312e535db86SBram Moolenaar      assert_equal(123, local)
3313e535db86SBram Moolenaar
3314e535db86SBram Moolenaar      var error: string
3315e535db86SBram Moolenaar      try
3316e535db86SBram Moolenaar        local = 'asdf'
3317e535db86SBram Moolenaar      catch
3318e535db86SBram Moolenaar        error = v:exception
3319e535db86SBram Moolenaar      endtry
3320e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3321e535db86SBram Moolenaar
3322e535db86SBram Moolenaar      lockvar local
3323e535db86SBram Moolenaar      try
3324e535db86SBram Moolenaar        local = 999
3325e535db86SBram Moolenaar      catch
3326e535db86SBram Moolenaar        error = v:exception
3327e535db86SBram Moolenaar      endtry
3328e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3329e535db86SBram Moolenaar  END
3330e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3331e535db86SBram Moolenaarenddef
3332e535db86SBram Moolenaar
3333e535db86SBram Moolenaar
33347d699701SBram Moolenaarfunc Test_vim9script_not_global()
33357d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
33367d699701SBram Moolenaar  let vim9lines =<< trim END
33377d699701SBram Moolenaar    vim9script
3338cfcd011fSBram Moolenaar    var name = 'local'
33397d699701SBram Moolenaar    func TheFunc()
33407d699701SBram Moolenaar      echo 'local'
33417d699701SBram Moolenaar    endfunc
33427d699701SBram Moolenaar    def DefFunc()
33437d699701SBram Moolenaar      echo 'local'
33447d699701SBram Moolenaar    enddef
33457d699701SBram Moolenaar  END
33467d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
33477d699701SBram Moolenaar  source Xvim9script.vim
33487d699701SBram Moolenaar  try
33497d699701SBram Moolenaar    echo g:var
33507d699701SBram Moolenaar    assert_report('did not fail')
33517d699701SBram Moolenaar  catch /E121:/
33527d699701SBram Moolenaar    " caught
33537d699701SBram Moolenaar  endtry
33547d699701SBram Moolenaar  try
33557d699701SBram Moolenaar    call TheFunc()
33567d699701SBram Moolenaar    assert_report('did not fail')
33577d699701SBram Moolenaar  catch /E117:/
33587d699701SBram Moolenaar    " caught
33597d699701SBram Moolenaar  endtry
33607d699701SBram Moolenaar  try
33617d699701SBram Moolenaar    call DefFunc()
33627d699701SBram Moolenaar    assert_report('did not fail')
33637d699701SBram Moolenaar  catch /E117:/
33647d699701SBram Moolenaar    " caught
33657d699701SBram Moolenaar  endtry
33667d699701SBram Moolenaar
336725859dd7SBram Moolenaar  call delete('Xvim9script.vim')
33687d699701SBram Moolenaarendfunc
33697d699701SBram Moolenaar
3370eeb27bfeSBram Moolenaardef Test_vim9_copen()
3371eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3372eeb27bfeSBram Moolenaar  copen
3373eeb27bfeSBram Moolenaar  quit
3374eeb27bfeSBram Moolenaarenddef
3375eeb27bfeSBram Moolenaar
337603290b84SBram Moolenaar" test using an auto-loaded function and variable
33772d6b20d6SBram Moolenaardef Test_vim9_autoload()
3378cfcd011fSBram Moolenaar  var lines =<< trim END
33792d6b20d6SBram Moolenaar     vim9script
338003290b84SBram Moolenaar     def some#gettest(): string
338103290b84SBram Moolenaar       return 'test'
338203290b84SBram Moolenaar     enddef
338303290b84SBram Moolenaar     g:some#name = 'name'
3384227c58a4SBram Moolenaar     g:some#dict = {key: 'value'}
3385e3ffcd99SBram Moolenaar
3386e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3387e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3388e3ffcd99SBram Moolenaar     enddef
338903290b84SBram Moolenaar  END
339003290b84SBram Moolenaar
339103290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
339203290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
339303290b84SBram Moolenaar  var save_rtp = &rtp
339403290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
339503290b84SBram Moolenaar
339603290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
339703290b84SBram Moolenaar  assert_equal('name', g:some#name)
3398227c58a4SBram Moolenaar  assert_equal('value', g:some#dict.key)
339903290b84SBram Moolenaar  g:some#other = 'other'
340003290b84SBram Moolenaar  assert_equal('other', g:some#other)
340103290b84SBram Moolenaar
3402e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3403e3ffcd99SBram Moolenaar
340417f700acSBram Moolenaar  # upper case script name works
340517f700acSBram Moolenaar  lines =<< trim END
340617f700acSBram Moolenaar     vim9script
340717f700acSBram Moolenaar     def Other#getOther(): string
340817f700acSBram Moolenaar       return 'other'
340917f700acSBram Moolenaar     enddef
341017f700acSBram Moolenaar  END
341117f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
341217f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
341317f700acSBram Moolenaar
341403290b84SBram Moolenaar  delete('Xdir', 'rf')
341503290b84SBram Moolenaar  &rtp = save_rtp
341603290b84SBram Moolenaarenddef
341703290b84SBram Moolenaar
341803290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
341903290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
342003290b84SBram Moolenaar  var lines =<< trim END
342103290b84SBram Moolenaar     vim9script
34222d6b20d6SBram Moolenaar     def foo#test()
34232d6b20d6SBram Moolenaar         echomsg getreg('"')
34242d6b20d6SBram Moolenaar     enddef
34252d6b20d6SBram Moolenaar  END
34262d6b20d6SBram Moolenaar
34272d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
34282d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3429cfcd011fSBram Moolenaar  var save_rtp = &rtp
34302d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
34312d6b20d6SBram Moolenaar  augroup test
34322d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
34332d6b20d6SBram Moolenaar  augroup END
34342d6b20d6SBram Moolenaar
34352d6b20d6SBram Moolenaar  normal Y
34362d6b20d6SBram Moolenaar
34372d6b20d6SBram Moolenaar  augroup test
34382d6b20d6SBram Moolenaar    autocmd!
34392d6b20d6SBram Moolenaar  augroup END
34402d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
34412d6b20d6SBram Moolenaar  &rtp = save_rtp
34422d6b20d6SBram Moolenaarenddef
34432d6b20d6SBram Moolenaar
344477e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
344577e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3446cfcd011fSBram Moolenaar  var lines =<< trim END
344777e5dcc3SBram Moolenaar      vim9script
344877e5dcc3SBram Moolenaar      def crash#func()
344977e5dcc3SBram Moolenaar          try
345077e5dcc3SBram Moolenaar              for x in List()
345177e5dcc3SBram Moolenaar              endfor
345277e5dcc3SBram Moolenaar          catch
345377e5dcc3SBram Moolenaar          endtry
345477e5dcc3SBram Moolenaar          g:ok = true
345577e5dcc3SBram Moolenaar      enddef
345677e5dcc3SBram Moolenaar      fu List()
345777e5dcc3SBram Moolenaar          invalid
345877e5dcc3SBram Moolenaar      endfu
345977e5dcc3SBram Moolenaar      try
346048e11c10SBram Moolenaar          alsoinvalid
346177e5dcc3SBram Moolenaar      catch /wontmatch/
346277e5dcc3SBram Moolenaar      endtry
346377e5dcc3SBram Moolenaar  END
346477e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
346577e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
346677e5dcc3SBram Moolenaar
346777e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
346877e5dcc3SBram Moolenaar  lines =<< trim END
346977e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
347077e5dcc3SBram Moolenaar    call crash#func()
347177e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
34729c4f5520SBram Moolenaar    qall!
347377e5dcc3SBram Moolenaar  END
347477e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
347577e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
347677e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
347777e5dcc3SBram Moolenaar
347877e5dcc3SBram Moolenaar  delete('Xdidit')
347977e5dcc3SBram Moolenaar  delete('Xscript')
348077e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
348103290b84SBram Moolenaar
348203290b84SBram Moolenaar  lines =<< trim END
348303290b84SBram Moolenaar    vim9script
348403290b84SBram Moolenaar    var foo#bar = 'asdf'
348503290b84SBram Moolenaar  END
348603290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
348777e5dcc3SBram Moolenaarenddef
348877e5dcc3SBram Moolenaar
348981e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
349081e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
349181e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3492cfcd011fSBram Moolenaar  var lines =<< trim END
349381e17fbeSBram Moolenaar    let s:counter = 1
349481e17fbeSBram Moolenaar    def s:Func()
349581e17fbeSBram Moolenaar      au! CursorHold
349681e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
349781e17fbeSBram Moolenaar    enddef
349881e17fbeSBram Moolenaar    call s:Func()
349981e17fbeSBram Moolenaar    doau CursorHold
350081e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
350181e17fbeSBram Moolenaar    au! CursorHold
350281e17fbeSBram Moolenaar  END
350381e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
350481e17fbeSBram Moolenaarenddef
350581e17fbeSBram Moolenaar
35063896a105SBram Moolenaardef Test_cmdline_win()
35073896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
35083896a105SBram Moolenaar  # the command line window.
35093896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3510cfcd011fSBram Moolenaar  var export_lines =<< trim END
35113896a105SBram Moolenaar    vim9script
3512cfcd011fSBram Moolenaar    export var That = 'yes'
35133896a105SBram Moolenaar  END
35143896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3515cfcd011fSBram Moolenaar  var import_lines =<< trim END
35163896a105SBram Moolenaar    vim9script
35173896a105SBram Moolenaar    import That from './Xexport.vim'
35183896a105SBram Moolenaar  END
35193896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3520cfcd011fSBram Moolenaar  var save_rtp = &rtp
35213896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
35223896a105SBram Moolenaar  syntax on
35233896a105SBram Moolenaar  augroup CmdWin
35243896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
35253896a105SBram Moolenaar  augroup END
35263896a105SBram Moolenaar  # this will open and also close the cmdline window
35273896a105SBram Moolenaar  feedkeys('q:', 'xt')
35283896a105SBram Moolenaar  assert_equal('yes', g:got_there)
35293896a105SBram Moolenaar
35303896a105SBram Moolenaar  augroup CmdWin
35313896a105SBram Moolenaar    au!
35323896a105SBram Moolenaar  augroup END
35333896a105SBram Moolenaar  &rtp = save_rtp
35343896a105SBram Moolenaar  delete('rtp', 'rf')
35353896a105SBram Moolenaarenddef
35363896a105SBram Moolenaar
3537e3d4685fSBram Moolenaardef Test_invalid_sid()
3538e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
353925859dd7SBram Moolenaar
35409c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3541d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3542e3d4685fSBram Moolenaar  endif
3543e3d4685fSBram Moolenaar  delete('Xdidit')
3544e3d4685fSBram Moolenaarenddef
3545e3d4685fSBram Moolenaar
35469ec7026fSBram Moolenaardef Test_restoring_cpo()
35479ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
35489ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
35499ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
35509ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
35519ec7026fSBram Moolenaar  endif
35529ec7026fSBram Moolenaar  delete('Xsourced')
35539ec7026fSBram Moolenaar  delete('Xclose')
3554090728adSBram Moolenaar  delete('Xdone')
35550123cc1eSBram Moolenaar
35560123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
35570123cc1eSBram Moolenaar  set cpo=aABceFsMny>
35580123cc1eSBram Moolenaar  edit XanotherScript
35590123cc1eSBram Moolenaar  so %
35600123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
35610123cc1eSBram Moolenaar  :1del
35620123cc1eSBram Moolenaar  w
35630123cc1eSBram Moolenaar  so %
35640123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
35650123cc1eSBram Moolenaar
35660123cc1eSBram Moolenaar  delete('XanotherScript')
35670123cc1eSBram Moolenaar  set cpo&vim
35689ec7026fSBram Moolenaarenddef
35699ec7026fSBram Moolenaar
3570ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3571ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
357237294bd6SBram Moolenaar  CheckScreendump
3573ffb7dcdbSBram Moolenaar  CheckFeature timers
357437294bd6SBram Moolenaar
3575ffb7dcdbSBram Moolenaar  let lines =<< trim END
357637294bd6SBram Moolenaar    vim9script
357737294bd6SBram Moolenaar    def script#func()
357837294bd6SBram Moolenaar    enddef
357937294bd6SBram Moolenaar  END
3580ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3581ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
358237294bd6SBram Moolenaar
3583ffb7dcdbSBram Moolenaar  let lines =<< trim END
358437294bd6SBram Moolenaar      vim9script
358537294bd6SBram Moolenaar      set cpo+=M
358637294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
3587767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
358837294bd6SBram Moolenaar      setline(1, 'some text')
358937294bd6SBram Moolenaar  END
3590ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3591ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3592ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3593ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
359437294bd6SBram Moolenaar
3595ffb7dcdbSBram Moolenaar  " clean up
3596ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3597ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3598ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3599ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3600ffb7dcdbSBram Moolenaarendfunc
360137294bd6SBram Moolenaar
36029ec7026fSBram Moolenaar
3603f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3604cfcd011fSBram Moolenaar  var lines =<< trim END
3605cfcd011fSBram Moolenaar    var name: any
3606cfcd011fSBram Moolenaar    assert_equal(0, name)
3607f0afd9e1SBram Moolenaar  END
3608f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3609f0afd9e1SBram Moolenaarenddef
3610f0afd9e1SBram Moolenaar
36117e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
361258dbef33SBram Moolenaar  CheckRunVimInTerminal
361358dbef33SBram Moolenaar
36147e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
36157e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
36167e9210eaSBram Moolenaarendfunc
36177e9210eaSBram Moolenaar
36187e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
36199c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3620cfcd011fSBram Moolenaar  var lines =<< trim END
36219c4f5520SBram Moolenaar    func CheckAndQuit()
36229c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
36239c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
36249c4f5520SBram Moolenaar    endfunc
36259c4f5520SBram Moolenaar  END
36269c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
36279c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3628e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
36299c4f5520SBram Moolenaar  # define Afunc() on the command line
36309c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
36319c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
36322949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
36339c4f5520SBram Moolenaar
36349c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
36359c4f5520SBram Moolenaar  delete('XcallFunc')
36369c4f5520SBram Moolenaar  delete('Xdidcmd')
36379c4f5520SBram Moolenaarenddef
36389c4f5520SBram Moolenaar
3639fcdc5d83SBram Moolenaardef Test_script_var_scope()
3640fcdc5d83SBram Moolenaar  var lines =<< trim END
3641fcdc5d83SBram Moolenaar      vim9script
3642fcdc5d83SBram Moolenaar      if true
3643fcdc5d83SBram Moolenaar        if true
3644fcdc5d83SBram Moolenaar          var one = 'one'
3645fcdc5d83SBram Moolenaar          echo one
3646fcdc5d83SBram Moolenaar        endif
3647fcdc5d83SBram Moolenaar        echo one
3648fcdc5d83SBram Moolenaar      endif
3649fcdc5d83SBram Moolenaar  END
3650fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3651fcdc5d83SBram Moolenaar
3652fcdc5d83SBram Moolenaar  lines =<< trim END
3653fcdc5d83SBram Moolenaar      vim9script
3654fcdc5d83SBram Moolenaar      if true
3655fcdc5d83SBram Moolenaar        if false
3656fcdc5d83SBram Moolenaar          var one = 'one'
3657fcdc5d83SBram Moolenaar          echo one
3658fcdc5d83SBram Moolenaar        else
3659fcdc5d83SBram Moolenaar          var one = 'one'
3660fcdc5d83SBram Moolenaar          echo one
3661fcdc5d83SBram Moolenaar        endif
3662fcdc5d83SBram Moolenaar        echo one
3663fcdc5d83SBram Moolenaar      endif
3664fcdc5d83SBram Moolenaar  END
3665fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3666fcdc5d83SBram Moolenaar
3667fcdc5d83SBram Moolenaar  lines =<< trim END
3668fcdc5d83SBram Moolenaar      vim9script
3669fcdc5d83SBram Moolenaar      while true
3670fcdc5d83SBram Moolenaar        var one = 'one'
3671fcdc5d83SBram Moolenaar        echo one
3672fcdc5d83SBram Moolenaar        break
3673fcdc5d83SBram Moolenaar      endwhile
3674fcdc5d83SBram Moolenaar      echo one
3675fcdc5d83SBram Moolenaar  END
3676fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3677fcdc5d83SBram Moolenaar
3678fcdc5d83SBram Moolenaar  lines =<< trim END
3679fcdc5d83SBram Moolenaar      vim9script
3680fcdc5d83SBram Moolenaar      for i in range(1)
3681fcdc5d83SBram Moolenaar        var one = 'one'
3682fcdc5d83SBram Moolenaar        echo one
3683fcdc5d83SBram Moolenaar      endfor
3684fcdc5d83SBram Moolenaar      echo one
3685fcdc5d83SBram Moolenaar  END
3686fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
36879becdf2bSBram Moolenaar
36889becdf2bSBram Moolenaar  lines =<< trim END
36899becdf2bSBram Moolenaar      vim9script
36909becdf2bSBram Moolenaar      {
36919becdf2bSBram Moolenaar        var one = 'one'
36929becdf2bSBram Moolenaar        assert_equal('one', one)
36939becdf2bSBram Moolenaar      }
36949becdf2bSBram Moolenaar      assert_false(exists('one'))
36959becdf2bSBram Moolenaar      assert_false(exists('s:one'))
36969becdf2bSBram Moolenaar  END
36979becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
36989becdf2bSBram Moolenaar
36999becdf2bSBram Moolenaar  lines =<< trim END
37009becdf2bSBram Moolenaar      vim9script
37019becdf2bSBram Moolenaar      {
37029becdf2bSBram Moolenaar        var one = 'one'
37039becdf2bSBram Moolenaar        echo one
37049becdf2bSBram Moolenaar      }
37059becdf2bSBram Moolenaar      echo one
37069becdf2bSBram Moolenaar  END
37079becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3708fcdc5d83SBram Moolenaarenddef
3709fcdc5d83SBram Moolenaar
3710352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3711352134bbSBram Moolenaar  var lines =<< trim END
3712352134bbSBram Moolenaar    vim9script
37132a38908bSBram Moolenaar    def Callback(...l: list<any>)
3714352134bbSBram Moolenaar      try
3715352134bbSBram Moolenaar        var x: string
3716352134bbSBram Moolenaar        var y: string
3717352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3718352134bbSBram Moolenaar        [x, y] = ['']
3719352134bbSBram Moolenaar      catch
3720352134bbSBram Moolenaar        g:caught = 'yes'
3721352134bbSBram Moolenaar      endtry
3722352134bbSBram Moolenaar    enddef
3723e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3724352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3725352134bbSBram Moolenaar  END
3726352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3727352134bbSBram Moolenaar
3728352134bbSBram Moolenaar  unlet g:caught
3729352134bbSBram Moolenaarenddef
3730352134bbSBram Moolenaar
3731631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3732631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3733631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3734631e8f93SBram Moolenaar  endif
3735631e8f93SBram Moolenaar  var lines =<< trim END
3736631e8f93SBram Moolenaar      vim9script
3737631e8f93SBram Moolenaar      var source: list<number>
37382a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
3739631e8f93SBram Moolenaar          eval [][0]
3740631e8f93SBram Moolenaar      enddef
37412a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
3742631e8f93SBram Moolenaar          sleep 1m
3743631e8f93SBram Moolenaar          source += l
3744631e8f93SBram Moolenaar      enddef
3745e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
37466f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
37476f17a3f0SBram Moolenaar        sleep 10m
37486f17a3f0SBram Moolenaar      endwhile
3749206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3750fe95b94fSBram Moolenaar      sleep 200m
3751631e8f93SBram Moolenaar  END
3752631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3753631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3754631e8f93SBram Moolenaar  delete('Xdef')
3755631e8f93SBram Moolenaarenddef
3756631e8f93SBram Moolenaar
37574324d87aSBram Moolenaardef InvokeNormal()
37584324d87aSBram Moolenaar  exe "norm! :m+1\r"
37594324d87aSBram Moolenaarenddef
37604324d87aSBram Moolenaar
37614324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
37624324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
37634324d87aSBram Moolenaar  new
37644324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
37654324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
37664324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
37674324d87aSBram Moolenaar  xunmap <F3>
3768b5b9480eSBram Moolenaarenddef
3769b5b9480eSBram Moolenaar
3770b5b9480eSBram Moolenaardef Test_white_space_after_command()
3771b5b9480eSBram Moolenaar  var lines =<< trim END
3772b5b9480eSBram Moolenaar    exit_cb: Func})
3773b5b9480eSBram Moolenaar  END
3774b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3775f8103f27SBram Moolenaar
3776f8103f27SBram Moolenaar  lines =<< trim END
3777f8103f27SBram Moolenaar    e#
3778f8103f27SBram Moolenaar  END
3779f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
37804324d87aSBram Moolenaarenddef
37814324d87aSBram Moolenaar
37824aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
37834aab88d9SBram Moolenaar  var lines =<< trim END
37844aab88d9SBram Moolenaar      vim9script
37854aab88d9SBram Moolenaar      if exists('g:guard')
37864aab88d9SBram Moolenaar        finish
37874aab88d9SBram Moolenaar      endif
37884aab88d9SBram Moolenaar      g:guard = 1
37894aab88d9SBram Moolenaar      var name = 'thename'
37904aab88d9SBram Moolenaar      def g:GetName(): string
37914aab88d9SBram Moolenaar        return name
37924aab88d9SBram Moolenaar      enddef
37934aab88d9SBram Moolenaar      def g:SetName(arg: string)
37944aab88d9SBram Moolenaar        name = arg
37954aab88d9SBram Moolenaar      enddef
37964aab88d9SBram Moolenaar  END
37974aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
37984aab88d9SBram Moolenaar  so XscriptTwice.vim
37994aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
38004aab88d9SBram Moolenaar  g:SetName('newname')
38014aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
38024aab88d9SBram Moolenaar  so XscriptTwice.vim
38034aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
38044aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
38054aab88d9SBram Moolenaar
38064aab88d9SBram Moolenaar  delfunc g:GetName
38074aab88d9SBram Moolenaar  delfunc g:SetName
38084aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
38094aab88d9SBram Moolenaar  unlet g:guard
38104aab88d9SBram Moolenaarenddef
38114aab88d9SBram Moolenaar
38124aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
38134aab88d9SBram Moolenaar  var exportlines =<< trim END
38144aab88d9SBram Moolenaar      vim9script
38154aab88d9SBram Moolenaar      if exists('g:guard')
38164aab88d9SBram Moolenaar        finish
38174aab88d9SBram Moolenaar      endif
38184aab88d9SBram Moolenaar      g:guard = 1
38194aab88d9SBram Moolenaar      export var name = 'someName'
38204aab88d9SBram Moolenaar  END
38214aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
38224aab88d9SBram Moolenaar
38234aab88d9SBram Moolenaar  var lines =<< trim END
38244aab88d9SBram Moolenaar      vim9script
38254aab88d9SBram Moolenaar      import name from './XexportScript.vim'
38264aab88d9SBram Moolenaar      def g:GetName(): string
38274aab88d9SBram Moolenaar        return name
38284aab88d9SBram Moolenaar      enddef
38294aab88d9SBram Moolenaar  END
38304aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
38314aab88d9SBram Moolenaar  so XscriptImport.vim
38324aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
38334aab88d9SBram Moolenaar
38344aab88d9SBram Moolenaar  so XexportScript.vim
38354aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
38364aab88d9SBram Moolenaar
38374aab88d9SBram Moolenaar  delfunc g:GetName
38384aab88d9SBram Moolenaar  delete('XexportScript.vim')
38394aab88d9SBram Moolenaar  delete('XscriptImport.vim')
38404aab88d9SBram Moolenaar  unlet g:guard
38414aab88d9SBram Moolenaarenddef
38424aab88d9SBram Moolenaar
384310b9421fSBram Moolenaardef Test_unsupported_commands()
384410b9421fSBram Moolenaar  var lines =<< trim END
384510b9421fSBram Moolenaar      ka
384610b9421fSBram Moolenaar  END
384710b9421fSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1100:')
384810b9421fSBram Moolenaar
384910b9421fSBram Moolenaar  lines =<< trim END
3850ada1d870SBram Moolenaar      :1ka
3851ada1d870SBram Moolenaar  END
3852ada1d870SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E481:')
3853ada1d870SBram Moolenaar
3854ada1d870SBram Moolenaar  lines =<< trim END
385510b9421fSBram Moolenaar    t
385610b9421fSBram Moolenaar  END
385710b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
385810b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
385910b9421fSBram Moolenaar
386010b9421fSBram Moolenaar  lines =<< trim END
386110b9421fSBram Moolenaar    x
386210b9421fSBram Moolenaar  END
386310b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
386410b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
386510b9421fSBram Moolenaar
386610b9421fSBram Moolenaar  lines =<< trim END
386710b9421fSBram Moolenaar    xit
386810b9421fSBram Moolenaar  END
386910b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
387010b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
387110b9421fSBram Moolenaarenddef
387210b9421fSBram Moolenaar
3873c70fe460SBram Moolenaardef Test_mapping_line_number()
3874c70fe460SBram Moolenaar  var lines =<< trim END
3875c70fe460SBram Moolenaar      vim9script
3876c70fe460SBram Moolenaar      def g:FuncA()
3877c70fe460SBram Moolenaar          # Some comment
3878c70fe460SBram Moolenaar          FuncB(0)
3879c70fe460SBram Moolenaar      enddef
3880c70fe460SBram Moolenaar          # Some comment
3881c70fe460SBram Moolenaar      def FuncB(
3882c70fe460SBram Moolenaar          # Some comment
3883c70fe460SBram Moolenaar          n: number
3884c70fe460SBram Moolenaar      )
3885c70fe460SBram Moolenaar          exe 'nno '
3886c70fe460SBram Moolenaar              # Some comment
3887c70fe460SBram Moolenaar              .. '<F3> a'
3888c70fe460SBram Moolenaar              .. 'b'
3889c70fe460SBram Moolenaar              .. 'c'
3890c70fe460SBram Moolenaar      enddef
3891c70fe460SBram Moolenaar  END
3892c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
3893c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
3894c70fe460SBram Moolenaar  assert_match('No mapping found', res)
3895c70fe460SBram Moolenaar
3896c70fe460SBram Moolenaar  g:FuncA()
3897c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
3898c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
3899c70fe460SBram Moolenaar
3900c70fe460SBram Moolenaar  nunmap <F3>
3901c70fe460SBram Moolenaar  delfunc g:FuncA
3902c70fe460SBram Moolenaarenddef
3903c70fe460SBram Moolenaar
3904585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3905585fea7bSBram Moolenaardef Test_substitute_cmd()
3906585fea7bSBram Moolenaar  new
3907585fea7bSBram Moolenaar  setline(1, 'something')
3908585fea7bSBram Moolenaar  :substitute(some(other(
3909585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3910585fea7bSBram Moolenaar  bwipe!
3911585fea7bSBram Moolenaar
3912f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3913cfcd011fSBram Moolenaar  var lines =<< trim END
3914585fea7bSBram Moolenaar    vim9script
3915585fea7bSBram Moolenaar    new
3916585fea7bSBram Moolenaar    setline(1, 'something')
3917585fea7bSBram Moolenaar    :substitute(some(other(
3918585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3919585fea7bSBram Moolenaar    bwipe!
3920585fea7bSBram Moolenaar  END
3921585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3922585fea7bSBram Moolenaar  source Xvim9lines
3923585fea7bSBram Moolenaar
3924585fea7bSBram Moolenaar  delete('Xvim9lines')
3925585fea7bSBram Moolenaarenddef
3926585fea7bSBram Moolenaar
39278a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3928