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
2503b777da9bSBram Moolenaar
2504b777da9bSBram Moolenaar      var res = []
2505b777da9bSBram Moolenaar      for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2506b777da9bSBram Moolenaar        res->add(n)
2507b777da9bSBram Moolenaar      endfor
2508b777da9bSBram 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:')
3077*0f37e356SBram Moolenaar
3078*0f37e356SBram Moolenaar  var lines =<< trim END
3079*0f37e356SBram Moolenaar      vim9script
3080*0f37e356SBram Moolenaar      syn region Text
3081*0f37e356SBram Moolenaar      \ start='foo'
3082*0f37e356SBram Moolenaar      #\ comment
3083*0f37e356SBram Moolenaar      \ end='bar'
3084*0f37e356SBram Moolenaar  END
3085*0f37e356SBram Moolenaar  CheckScriptSuccess(lines)
3086*0f37e356SBram Moolenaar
3087*0f37e356SBram Moolenaar  lines =<< trim END
3088*0f37e356SBram Moolenaar      vim9script
3089*0f37e356SBram Moolenaar      syn region Text
3090*0f37e356SBram Moolenaar      \ start='foo'
3091*0f37e356SBram Moolenaar      "\ comment
3092*0f37e356SBram Moolenaar      \ end='bar'
3093*0f37e356SBram Moolenaar  END
3094*0f37e356SBram Moolenaar  CheckScriptFailure(lines, 'E399:')
30952c5ed4e3SBram Moolenaarenddef
30962c5ed4e3SBram Moolenaar
30972c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
30982c5ed4e3SBram Moolenaar  CheckCanRunGui
30992c5ed4e3SBram Moolenaar
31002c5ed4e3SBram Moolenaar  CheckScriptFailure([
31012c5ed4e3SBram Moolenaar      'vim9script',
31022c5ed4e3SBram Moolenaar      'gui#comment'
3103f8103f27SBram Moolenaar      ], 'E1144:')
31042c5ed4e3SBram Moolenaar  CheckScriptFailure([
31052c5ed4e3SBram Moolenaar      'vim9script',
31062c5ed4e3SBram Moolenaar      'gui -f#comment'
31072c5ed4e3SBram Moolenaar      ], 'E499:')
31087a092245SBram Moolenaarenddef
31097a092245SBram Moolenaar
3110a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
31116797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
31126797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3113a26b9700SBram Moolenaar
3114a26b9700SBram Moolenaar  edit test.vim
3115a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3116a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3117a26b9700SBram Moolenaar
3118a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3119a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3120a26b9700SBram Moolenaar
3121a26b9700SBram Moolenaar  g:entered = 0
3122a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3123a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3124a26b9700SBram Moolenaar
3125a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3126a26b9700SBram Moolenaar
3127a26b9700SBram Moolenaar  au! TabEnter
3128a26b9700SBram Moolenaar  unlet g:entered
3129d72c1bf0SBram Moolenaar
3130d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3131d72c1bf0SBram Moolenaar      'vim9script',
31326797966dSBram Moolenaar      'g:var = 123',
3133e55b1c09SBram Moolenaar      'b:var = 456',
3134e55b1c09SBram Moolenaar      'w:var = 777',
3135e55b1c09SBram Moolenaar      't:var = 888',
3136d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3137d72c1bf0SBram Moolenaar      ])
3138d72c1bf0SBram Moolenaar
3139d72c1bf0SBram Moolenaar  CheckScriptFailure([
3140d72c1bf0SBram Moolenaar      'vim9script',
3141cfcd011fSBram Moolenaar      'let var = 123',
3142cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3143cfcd011fSBram Moolenaar
3144cfcd011fSBram Moolenaar  CheckScriptFailure([
3145cfcd011fSBram Moolenaar      'vim9script',
3146cfcd011fSBram Moolenaar      'var g:var = 123',
3147e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3148e55b1c09SBram Moolenaar
3149e55b1c09SBram Moolenaar  CheckScriptFailure([
3150e55b1c09SBram Moolenaar      'vim9script',
3151cfcd011fSBram Moolenaar      'var b:var = 123',
3152e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3153e55b1c09SBram Moolenaar
3154e55b1c09SBram Moolenaar  CheckScriptFailure([
3155e55b1c09SBram Moolenaar      'vim9script',
3156cfcd011fSBram Moolenaar      'var w:var = 123',
3157e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3158e55b1c09SBram Moolenaar
3159e55b1c09SBram Moolenaar  CheckScriptFailure([
3160e55b1c09SBram Moolenaar      'vim9script',
3161cfcd011fSBram Moolenaar      'var t:var = 123',
3162e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3163e55b1c09SBram Moolenaar
3164e55b1c09SBram Moolenaar  CheckScriptFailure([
3165e55b1c09SBram Moolenaar      'vim9script',
3166cfcd011fSBram Moolenaar      'var v:version = 123',
3167e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3168e55b1c09SBram Moolenaar
3169e55b1c09SBram Moolenaar  CheckScriptFailure([
3170e55b1c09SBram Moolenaar      'vim9script',
3171cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3172e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
31736797966dSBram Moolenaar
31746797966dSBram Moolenaar  CheckScriptFailure([
31756797966dSBram Moolenaar      'vim9script',
31766797966dSBram Moolenaar      'g:var = 123',
317732e35117SBram Moolenaar      'unlet g:var# comment1',
3178d72c1bf0SBram Moolenaar      ], 'E108:')
3179d72c1bf0SBram Moolenaar
3180d72c1bf0SBram Moolenaar  CheckScriptFailure([
3181d72c1bf0SBram Moolenaar      'let g:var = 123',
3182d72c1bf0SBram Moolenaar      'unlet g:var # something',
3183d72c1bf0SBram Moolenaar      ], 'E488:')
3184faac4104SBram Moolenaar
3185faac4104SBram Moolenaar  CheckScriptSuccess([
3186faac4104SBram Moolenaar      'vim9script',
318732e35117SBram Moolenaar      'if 1 # comment2',
3188faac4104SBram Moolenaar      '  echo "yes"',
3189faac4104SBram Moolenaar      'elseif 2 #comment',
3190faac4104SBram Moolenaar      '  echo "no"',
3191faac4104SBram Moolenaar      'endif',
3192faac4104SBram Moolenaar      ])
3193faac4104SBram Moolenaar
3194faac4104SBram Moolenaar  CheckScriptFailure([
3195faac4104SBram Moolenaar      'vim9script',
319632e35117SBram Moolenaar      'if 1# comment3',
3197faac4104SBram Moolenaar      '  echo "yes"',
3198faac4104SBram Moolenaar      'endif',
3199faac4104SBram Moolenaar      ], 'E15:')
3200faac4104SBram Moolenaar
3201faac4104SBram Moolenaar  CheckScriptFailure([
3202faac4104SBram Moolenaar      'vim9script',
320332e35117SBram Moolenaar      'if 0 # comment4',
3204faac4104SBram Moolenaar      '  echo "yes"',
3205faac4104SBram Moolenaar      'elseif 2#comment',
3206faac4104SBram Moolenaar      '  echo "no"',
3207faac4104SBram Moolenaar      'endif',
3208faac4104SBram Moolenaar      ], 'E15:')
3209faac4104SBram Moolenaar
3210faac4104SBram Moolenaar  CheckScriptSuccess([
3211faac4104SBram Moolenaar      'vim9script',
3212cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3213faac4104SBram Moolenaar      ])
3214faac4104SBram Moolenaar
3215faac4104SBram Moolenaar  CheckScriptFailure([
3216faac4104SBram Moolenaar      'vim9script',
3217cfcd011fSBram Moolenaar      'var v = 1# comment6',
321832e35117SBram Moolenaar      ], 'E15:')
3219faac4104SBram Moolenaar
3220faac4104SBram Moolenaar  CheckScriptSuccess([
3221faac4104SBram Moolenaar      'vim9script',
3222faac4104SBram Moolenaar      'new'
3223d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3224df069eecSBram Moolenaar      ':$',
3225faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3226faac4104SBram Moolenaar      'bwipe!',
3227faac4104SBram Moolenaar      ])
3228faac4104SBram Moolenaar
3229f5be8cdbSBram Moolenaar  CheckScriptFailure([
3230f5be8cdbSBram Moolenaar      'vim9script',
3231f5be8cdbSBram Moolenaar      'new'
3232d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3233f5be8cdbSBram Moolenaar      ':$',
3234f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3235f5be8cdbSBram Moolenaar      'bwipe!',
3236f5be8cdbSBram Moolenaar      ], 'E488:')
3237f5be8cdbSBram Moolenaar
3238f5be8cdbSBram Moolenaar  CheckScriptFailure([
3239f5be8cdbSBram Moolenaar      'vim9script',
3240f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3241f5be8cdbSBram Moolenaar      ], 'E477:')
3242a26b9700SBram Moolenaarenddef
3243a26b9700SBram Moolenaar
32447e5bd91dSBram Moolenaardef Test_finish()
3245cfcd011fSBram Moolenaar  var lines =<< trim END
32467e5bd91dSBram Moolenaar    vim9script
32476797966dSBram Moolenaar    g:res = 'one'
32487e5bd91dSBram Moolenaar    if v:false | finish | endif
32496797966dSBram Moolenaar    g:res = 'two'
32507e5bd91dSBram Moolenaar    finish
32516797966dSBram Moolenaar    g:res = 'three'
32527e5bd91dSBram Moolenaar  END
32537e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
32547e5bd91dSBram Moolenaar  source Xfinished
32557e5bd91dSBram Moolenaar  assert_equal('two', g:res)
32567e5bd91dSBram Moolenaar
32577e5bd91dSBram Moolenaar  unlet g:res
32587e5bd91dSBram Moolenaar  delete('Xfinished')
32597e5bd91dSBram Moolenaarenddef
32607e5bd91dSBram Moolenaar
3261a5d0077eSBram Moolenaardef Test_forward_declaration()
3262cfcd011fSBram Moolenaar  var lines =<< trim END
3263a5d0077eSBram Moolenaar    vim9script
3264a5d0077eSBram Moolenaar    def GetValue(): string
3265a5d0077eSBram Moolenaar      return theVal
3266a5d0077eSBram Moolenaar    enddef
3267cfcd011fSBram Moolenaar    var theVal = 'something'
3268822ba247SBram Moolenaar    g:initVal = GetValue()
3269a5d0077eSBram Moolenaar    theVal = 'else'
3270a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3271a5d0077eSBram Moolenaar  END
3272a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3273a5d0077eSBram Moolenaar  source Xforward
3274a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3275a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3276a5d0077eSBram Moolenaar
3277a5d0077eSBram Moolenaar  unlet g:initVal
3278a5d0077eSBram Moolenaar  unlet g:laterVal
3279a5d0077eSBram Moolenaar  delete('Xforward')
3280a5d0077eSBram Moolenaarenddef
3281a5d0077eSBram Moolenaar
32829721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3283a6294955SBram Moolenaar  var vim9_lines =<< trim END
3284a6294955SBram Moolenaar    vim9script
3285a6294955SBram Moolenaar    var local = 'local'
3286a6294955SBram Moolenaar    g:global = 'global'
3287a6294955SBram Moolenaar    export var exported = 'exported'
3288a6294955SBram Moolenaar    export def GetText(): string
3289a6294955SBram Moolenaar       return 'text'
3290a6294955SBram Moolenaar    enddef
3291a6294955SBram Moolenaar  END
3292a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3293a6294955SBram Moolenaar
3294cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
32959721fb4eSBram Moolenaar    source Xvim9_script.vim
32969721fb4eSBram Moolenaar
32979721fb4eSBram Moolenaar    call assert_false(exists('local'))
32989721fb4eSBram Moolenaar    call assert_false(exists('exported'))
32999721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
33009721fb4eSBram Moolenaar    call assert_equal('global', global)
33019721fb4eSBram Moolenaar    call assert_equal('global', g:global)
33029721fb4eSBram Moolenaar
33039721fb4eSBram Moolenaar    " imported variable becomes script-local
33049721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
33059721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
33069721fb4eSBram Moolenaar    call assert_false(exists('exported'))
33079721fb4eSBram Moolenaar
33089721fb4eSBram Moolenaar    " imported function becomes script-local
33099721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
33109721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
33119721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
33129721fb4eSBram Moolenaar  END
33139721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
33149721fb4eSBram Moolenaar
33159721fb4eSBram Moolenaar  source Xlegacy_script.vim
33169721fb4eSBram Moolenaar  assert_equal('global', g:global)
3317f5be8cdbSBram Moolenaar  unlet g:global
33189721fb4eSBram Moolenaar
33199721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
33209721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
33219721fb4eSBram Moolenaarenddef
3322a5d0077eSBram Moolenaar
3323e535db86SBram Moolenaardef Test_declare_script_in_func()
3324e535db86SBram Moolenaar  var lines =<< trim END
3325e535db86SBram Moolenaar      vim9script
3326e535db86SBram Moolenaar      func Declare()
3327e535db86SBram Moolenaar        let s:local = 123
3328e535db86SBram Moolenaar      endfunc
3329e535db86SBram Moolenaar      Declare()
3330e535db86SBram Moolenaar      assert_equal(123, local)
3331e535db86SBram Moolenaar
3332e535db86SBram Moolenaar      var error: string
3333e535db86SBram Moolenaar      try
3334e535db86SBram Moolenaar        local = 'asdf'
3335e535db86SBram Moolenaar      catch
3336e535db86SBram Moolenaar        error = v:exception
3337e535db86SBram Moolenaar      endtry
3338e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3339e535db86SBram Moolenaar
3340e535db86SBram Moolenaar      lockvar local
3341e535db86SBram Moolenaar      try
3342e535db86SBram Moolenaar        local = 999
3343e535db86SBram Moolenaar      catch
3344e535db86SBram Moolenaar        error = v:exception
3345e535db86SBram Moolenaar      endtry
3346e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3347e535db86SBram Moolenaar  END
3348e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3349e535db86SBram Moolenaarenddef
3350e535db86SBram Moolenaar
3351e535db86SBram Moolenaar
33527d699701SBram Moolenaarfunc Test_vim9script_not_global()
33537d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
33547d699701SBram Moolenaar  let vim9lines =<< trim END
33557d699701SBram Moolenaar    vim9script
3356cfcd011fSBram Moolenaar    var name = 'local'
33577d699701SBram Moolenaar    func TheFunc()
33587d699701SBram Moolenaar      echo 'local'
33597d699701SBram Moolenaar    endfunc
33607d699701SBram Moolenaar    def DefFunc()
33617d699701SBram Moolenaar      echo 'local'
33627d699701SBram Moolenaar    enddef
33637d699701SBram Moolenaar  END
33647d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
33657d699701SBram Moolenaar  source Xvim9script.vim
33667d699701SBram Moolenaar  try
33677d699701SBram Moolenaar    echo g:var
33687d699701SBram Moolenaar    assert_report('did not fail')
33697d699701SBram Moolenaar  catch /E121:/
33707d699701SBram Moolenaar    " caught
33717d699701SBram Moolenaar  endtry
33727d699701SBram Moolenaar  try
33737d699701SBram Moolenaar    call TheFunc()
33747d699701SBram Moolenaar    assert_report('did not fail')
33757d699701SBram Moolenaar  catch /E117:/
33767d699701SBram Moolenaar    " caught
33777d699701SBram Moolenaar  endtry
33787d699701SBram Moolenaar  try
33797d699701SBram Moolenaar    call DefFunc()
33807d699701SBram Moolenaar    assert_report('did not fail')
33817d699701SBram Moolenaar  catch /E117:/
33827d699701SBram Moolenaar    " caught
33837d699701SBram Moolenaar  endtry
33847d699701SBram Moolenaar
338525859dd7SBram Moolenaar  call delete('Xvim9script.vim')
33867d699701SBram Moolenaarendfunc
33877d699701SBram Moolenaar
3388eeb27bfeSBram Moolenaardef Test_vim9_copen()
3389eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3390eeb27bfeSBram Moolenaar  copen
3391eeb27bfeSBram Moolenaar  quit
3392eeb27bfeSBram Moolenaarenddef
3393eeb27bfeSBram Moolenaar
339403290b84SBram Moolenaar" test using an auto-loaded function and variable
33952d6b20d6SBram Moolenaardef Test_vim9_autoload()
3396cfcd011fSBram Moolenaar  var lines =<< trim END
33972d6b20d6SBram Moolenaar     vim9script
339803290b84SBram Moolenaar     def some#gettest(): string
339903290b84SBram Moolenaar       return 'test'
340003290b84SBram Moolenaar     enddef
340103290b84SBram Moolenaar     g:some#name = 'name'
3402227c58a4SBram Moolenaar     g:some#dict = {key: 'value'}
3403e3ffcd99SBram Moolenaar
3404e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3405e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3406e3ffcd99SBram Moolenaar     enddef
340703290b84SBram Moolenaar  END
340803290b84SBram Moolenaar
340903290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
341003290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
341103290b84SBram Moolenaar  var save_rtp = &rtp
341203290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
341303290b84SBram Moolenaar
341403290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
341503290b84SBram Moolenaar  assert_equal('name', g:some#name)
3416227c58a4SBram Moolenaar  assert_equal('value', g:some#dict.key)
341703290b84SBram Moolenaar  g:some#other = 'other'
341803290b84SBram Moolenaar  assert_equal('other', g:some#other)
341903290b84SBram Moolenaar
3420e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3421e3ffcd99SBram Moolenaar
342217f700acSBram Moolenaar  # upper case script name works
342317f700acSBram Moolenaar  lines =<< trim END
342417f700acSBram Moolenaar     vim9script
342517f700acSBram Moolenaar     def Other#getOther(): string
342617f700acSBram Moolenaar       return 'other'
342717f700acSBram Moolenaar     enddef
342817f700acSBram Moolenaar  END
342917f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
343017f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
343117f700acSBram Moolenaar
343203290b84SBram Moolenaar  delete('Xdir', 'rf')
343303290b84SBram Moolenaar  &rtp = save_rtp
343403290b84SBram Moolenaarenddef
343503290b84SBram Moolenaar
343603290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
343703290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
343803290b84SBram Moolenaar  var lines =<< trim END
343903290b84SBram Moolenaar     vim9script
34402d6b20d6SBram Moolenaar     def foo#test()
34412d6b20d6SBram Moolenaar         echomsg getreg('"')
34422d6b20d6SBram Moolenaar     enddef
34432d6b20d6SBram Moolenaar  END
34442d6b20d6SBram Moolenaar
34452d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
34462d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3447cfcd011fSBram Moolenaar  var save_rtp = &rtp
34482d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
34492d6b20d6SBram Moolenaar  augroup test
34502d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
34512d6b20d6SBram Moolenaar  augroup END
34522d6b20d6SBram Moolenaar
34532d6b20d6SBram Moolenaar  normal Y
34542d6b20d6SBram Moolenaar
34552d6b20d6SBram Moolenaar  augroup test
34562d6b20d6SBram Moolenaar    autocmd!
34572d6b20d6SBram Moolenaar  augroup END
34582d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
34592d6b20d6SBram Moolenaar  &rtp = save_rtp
34602d6b20d6SBram Moolenaarenddef
34612d6b20d6SBram Moolenaar
346277e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
346377e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3464cfcd011fSBram Moolenaar  var lines =<< trim END
346577e5dcc3SBram Moolenaar      vim9script
346677e5dcc3SBram Moolenaar      def crash#func()
346777e5dcc3SBram Moolenaar          try
346877e5dcc3SBram Moolenaar              for x in List()
346977e5dcc3SBram Moolenaar              endfor
347077e5dcc3SBram Moolenaar          catch
347177e5dcc3SBram Moolenaar          endtry
347277e5dcc3SBram Moolenaar          g:ok = true
347377e5dcc3SBram Moolenaar      enddef
347477e5dcc3SBram Moolenaar      fu List()
347577e5dcc3SBram Moolenaar          invalid
347677e5dcc3SBram Moolenaar      endfu
347777e5dcc3SBram Moolenaar      try
347848e11c10SBram Moolenaar          alsoinvalid
347977e5dcc3SBram Moolenaar      catch /wontmatch/
348077e5dcc3SBram Moolenaar      endtry
348177e5dcc3SBram Moolenaar  END
348277e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
348377e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
348477e5dcc3SBram Moolenaar
348577e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
348677e5dcc3SBram Moolenaar  lines =<< trim END
348777e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
348877e5dcc3SBram Moolenaar    call crash#func()
348977e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
34909c4f5520SBram Moolenaar    qall!
349177e5dcc3SBram Moolenaar  END
349277e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
349377e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
349477e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
349577e5dcc3SBram Moolenaar
349677e5dcc3SBram Moolenaar  delete('Xdidit')
349777e5dcc3SBram Moolenaar  delete('Xscript')
349877e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
349903290b84SBram Moolenaar
350003290b84SBram Moolenaar  lines =<< trim END
350103290b84SBram Moolenaar    vim9script
350203290b84SBram Moolenaar    var foo#bar = 'asdf'
350303290b84SBram Moolenaar  END
350403290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
350577e5dcc3SBram Moolenaarenddef
350677e5dcc3SBram Moolenaar
350781e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
350881e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
350981e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3510cfcd011fSBram Moolenaar  var lines =<< trim END
351181e17fbeSBram Moolenaar    let s:counter = 1
351281e17fbeSBram Moolenaar    def s:Func()
351381e17fbeSBram Moolenaar      au! CursorHold
351481e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
351581e17fbeSBram Moolenaar    enddef
351681e17fbeSBram Moolenaar    call s:Func()
351781e17fbeSBram Moolenaar    doau CursorHold
351881e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
351981e17fbeSBram Moolenaar    au! CursorHold
352081e17fbeSBram Moolenaar  END
352181e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
352281e17fbeSBram Moolenaarenddef
352381e17fbeSBram Moolenaar
35243896a105SBram Moolenaardef Test_cmdline_win()
35253896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
35263896a105SBram Moolenaar  # the command line window.
35273896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3528cfcd011fSBram Moolenaar  var export_lines =<< trim END
35293896a105SBram Moolenaar    vim9script
3530cfcd011fSBram Moolenaar    export var That = 'yes'
35313896a105SBram Moolenaar  END
35323896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3533cfcd011fSBram Moolenaar  var import_lines =<< trim END
35343896a105SBram Moolenaar    vim9script
35353896a105SBram Moolenaar    import That from './Xexport.vim'
35363896a105SBram Moolenaar  END
35373896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3538cfcd011fSBram Moolenaar  var save_rtp = &rtp
35393896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
35403896a105SBram Moolenaar  syntax on
35413896a105SBram Moolenaar  augroup CmdWin
35423896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
35433896a105SBram Moolenaar  augroup END
35443896a105SBram Moolenaar  # this will open and also close the cmdline window
35453896a105SBram Moolenaar  feedkeys('q:', 'xt')
35463896a105SBram Moolenaar  assert_equal('yes', g:got_there)
35473896a105SBram Moolenaar
35483896a105SBram Moolenaar  augroup CmdWin
35493896a105SBram Moolenaar    au!
35503896a105SBram Moolenaar  augroup END
35513896a105SBram Moolenaar  &rtp = save_rtp
35523896a105SBram Moolenaar  delete('rtp', 'rf')
35533896a105SBram Moolenaarenddef
35543896a105SBram Moolenaar
3555e3d4685fSBram Moolenaardef Test_invalid_sid()
3556e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
355725859dd7SBram Moolenaar
35589c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3559d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3560e3d4685fSBram Moolenaar  endif
3561e3d4685fSBram Moolenaar  delete('Xdidit')
3562e3d4685fSBram Moolenaarenddef
3563e3d4685fSBram Moolenaar
35649ec7026fSBram Moolenaardef Test_restoring_cpo()
35659ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
35669ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
35679ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
35689ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
35699ec7026fSBram Moolenaar  endif
35709ec7026fSBram Moolenaar  delete('Xsourced')
35719ec7026fSBram Moolenaar  delete('Xclose')
3572090728adSBram Moolenaar  delete('Xdone')
35730123cc1eSBram Moolenaar
35740123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
35750123cc1eSBram Moolenaar  set cpo=aABceFsMny>
35760123cc1eSBram Moolenaar  edit XanotherScript
35770123cc1eSBram Moolenaar  so %
35780123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
35790123cc1eSBram Moolenaar  :1del
35800123cc1eSBram Moolenaar  w
35810123cc1eSBram Moolenaar  so %
35820123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
35830123cc1eSBram Moolenaar
35840123cc1eSBram Moolenaar  delete('XanotherScript')
35850123cc1eSBram Moolenaar  set cpo&vim
35869ec7026fSBram Moolenaarenddef
35879ec7026fSBram Moolenaar
3588ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3589ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
359037294bd6SBram Moolenaar  CheckScreendump
3591ffb7dcdbSBram Moolenaar  CheckFeature timers
359237294bd6SBram Moolenaar
3593ffb7dcdbSBram Moolenaar  let lines =<< trim END
359437294bd6SBram Moolenaar    vim9script
359537294bd6SBram Moolenaar    def script#func()
359637294bd6SBram Moolenaar    enddef
359737294bd6SBram Moolenaar  END
3598ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3599ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
360037294bd6SBram Moolenaar
3601ffb7dcdbSBram Moolenaar  let lines =<< trim END
360237294bd6SBram Moolenaar      vim9script
360337294bd6SBram Moolenaar      set cpo+=M
360437294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
3605767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
360637294bd6SBram Moolenaar      setline(1, 'some text')
360737294bd6SBram Moolenaar  END
3608ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3609ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3610ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3611ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
361237294bd6SBram Moolenaar
3613ffb7dcdbSBram Moolenaar  " clean up
3614ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3615ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3616ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3617ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3618ffb7dcdbSBram Moolenaarendfunc
361937294bd6SBram Moolenaar
36209ec7026fSBram Moolenaar
3621f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3622cfcd011fSBram Moolenaar  var lines =<< trim END
3623cfcd011fSBram Moolenaar    var name: any
3624cfcd011fSBram Moolenaar    assert_equal(0, name)
3625f0afd9e1SBram Moolenaar  END
3626f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3627f0afd9e1SBram Moolenaarenddef
3628f0afd9e1SBram Moolenaar
36297e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
363058dbef33SBram Moolenaar  CheckRunVimInTerminal
363158dbef33SBram Moolenaar
36327e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
36337e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
36347e9210eaSBram Moolenaarendfunc
36357e9210eaSBram Moolenaar
36367e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
36379c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3638cfcd011fSBram Moolenaar  var lines =<< trim END
36399c4f5520SBram Moolenaar    func CheckAndQuit()
36409c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
36419c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
36429c4f5520SBram Moolenaar    endfunc
36439c4f5520SBram Moolenaar  END
36449c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
36459c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3646e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
36479c4f5520SBram Moolenaar  # define Afunc() on the command line
36489c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
36499c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
36502949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
36519c4f5520SBram Moolenaar
36529c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
36539c4f5520SBram Moolenaar  delete('XcallFunc')
36549c4f5520SBram Moolenaar  delete('Xdidcmd')
36559c4f5520SBram Moolenaarenddef
36569c4f5520SBram Moolenaar
3657fcdc5d83SBram Moolenaardef Test_script_var_scope()
3658fcdc5d83SBram Moolenaar  var lines =<< trim END
3659fcdc5d83SBram Moolenaar      vim9script
3660fcdc5d83SBram Moolenaar      if true
3661fcdc5d83SBram Moolenaar        if true
3662fcdc5d83SBram Moolenaar          var one = 'one'
3663fcdc5d83SBram Moolenaar          echo one
3664fcdc5d83SBram Moolenaar        endif
3665fcdc5d83SBram Moolenaar        echo one
3666fcdc5d83SBram Moolenaar      endif
3667fcdc5d83SBram Moolenaar  END
3668fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3669fcdc5d83SBram Moolenaar
3670fcdc5d83SBram Moolenaar  lines =<< trim END
3671fcdc5d83SBram Moolenaar      vim9script
3672fcdc5d83SBram Moolenaar      if true
3673fcdc5d83SBram Moolenaar        if false
3674fcdc5d83SBram Moolenaar          var one = 'one'
3675fcdc5d83SBram Moolenaar          echo one
3676fcdc5d83SBram Moolenaar        else
3677fcdc5d83SBram Moolenaar          var one = 'one'
3678fcdc5d83SBram Moolenaar          echo one
3679fcdc5d83SBram Moolenaar        endif
3680fcdc5d83SBram Moolenaar        echo one
3681fcdc5d83SBram Moolenaar      endif
3682fcdc5d83SBram Moolenaar  END
3683fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3684fcdc5d83SBram Moolenaar
3685fcdc5d83SBram Moolenaar  lines =<< trim END
3686fcdc5d83SBram Moolenaar      vim9script
3687fcdc5d83SBram Moolenaar      while true
3688fcdc5d83SBram Moolenaar        var one = 'one'
3689fcdc5d83SBram Moolenaar        echo one
3690fcdc5d83SBram Moolenaar        break
3691fcdc5d83SBram Moolenaar      endwhile
3692fcdc5d83SBram Moolenaar      echo one
3693fcdc5d83SBram Moolenaar  END
3694fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3695fcdc5d83SBram Moolenaar
3696fcdc5d83SBram Moolenaar  lines =<< trim END
3697fcdc5d83SBram Moolenaar      vim9script
3698fcdc5d83SBram Moolenaar      for i in range(1)
3699fcdc5d83SBram Moolenaar        var one = 'one'
3700fcdc5d83SBram Moolenaar        echo one
3701fcdc5d83SBram Moolenaar      endfor
3702fcdc5d83SBram Moolenaar      echo one
3703fcdc5d83SBram Moolenaar  END
3704fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
37059becdf2bSBram Moolenaar
37069becdf2bSBram Moolenaar  lines =<< trim END
37079becdf2bSBram Moolenaar      vim9script
37089becdf2bSBram Moolenaar      {
37099becdf2bSBram Moolenaar        var one = 'one'
37109becdf2bSBram Moolenaar        assert_equal('one', one)
37119becdf2bSBram Moolenaar      }
37129becdf2bSBram Moolenaar      assert_false(exists('one'))
37139becdf2bSBram Moolenaar      assert_false(exists('s:one'))
37149becdf2bSBram Moolenaar  END
37159becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
37169becdf2bSBram Moolenaar
37179becdf2bSBram Moolenaar  lines =<< trim END
37189becdf2bSBram Moolenaar      vim9script
37199becdf2bSBram Moolenaar      {
37209becdf2bSBram Moolenaar        var one = 'one'
37219becdf2bSBram Moolenaar        echo one
37229becdf2bSBram Moolenaar      }
37239becdf2bSBram Moolenaar      echo one
37249becdf2bSBram Moolenaar  END
37259becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3726fcdc5d83SBram Moolenaarenddef
3727fcdc5d83SBram Moolenaar
3728352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3729352134bbSBram Moolenaar  var lines =<< trim END
3730352134bbSBram Moolenaar    vim9script
37312a38908bSBram Moolenaar    def Callback(...l: list<any>)
3732352134bbSBram Moolenaar      try
3733352134bbSBram Moolenaar        var x: string
3734352134bbSBram Moolenaar        var y: string
3735352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3736352134bbSBram Moolenaar        [x, y] = ['']
3737352134bbSBram Moolenaar      catch
3738352134bbSBram Moolenaar        g:caught = 'yes'
3739352134bbSBram Moolenaar      endtry
3740352134bbSBram Moolenaar    enddef
3741e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3742352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3743352134bbSBram Moolenaar  END
3744352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3745352134bbSBram Moolenaar
3746352134bbSBram Moolenaar  unlet g:caught
3747352134bbSBram Moolenaarenddef
3748352134bbSBram Moolenaar
3749631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3750631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3751631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3752631e8f93SBram Moolenaar  endif
3753631e8f93SBram Moolenaar  var lines =<< trim END
3754631e8f93SBram Moolenaar      vim9script
3755631e8f93SBram Moolenaar      var source: list<number>
37562a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
3757631e8f93SBram Moolenaar          eval [][0]
3758631e8f93SBram Moolenaar      enddef
37592a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
3760631e8f93SBram Moolenaar          sleep 1m
3761631e8f93SBram Moolenaar          source += l
3762631e8f93SBram Moolenaar      enddef
3763e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
37646f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
37656f17a3f0SBram Moolenaar        sleep 10m
37666f17a3f0SBram Moolenaar      endwhile
3767206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3768fe95b94fSBram Moolenaar      sleep 200m
3769631e8f93SBram Moolenaar  END
3770631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3771631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3772631e8f93SBram Moolenaar  delete('Xdef')
3773631e8f93SBram Moolenaarenddef
3774631e8f93SBram Moolenaar
37754324d87aSBram Moolenaardef InvokeNormal()
37764324d87aSBram Moolenaar  exe "norm! :m+1\r"
37774324d87aSBram Moolenaarenddef
37784324d87aSBram Moolenaar
37794324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
37804324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
37814324d87aSBram Moolenaar  new
37824324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
37834324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
37844324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
37854324d87aSBram Moolenaar  xunmap <F3>
3786b5b9480eSBram Moolenaarenddef
3787b5b9480eSBram Moolenaar
3788b5b9480eSBram Moolenaardef Test_white_space_after_command()
3789b5b9480eSBram Moolenaar  var lines =<< trim END
3790b5b9480eSBram Moolenaar    exit_cb: Func})
3791b5b9480eSBram Moolenaar  END
3792b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3793f8103f27SBram Moolenaar
3794f8103f27SBram Moolenaar  lines =<< trim END
3795f8103f27SBram Moolenaar    e#
3796f8103f27SBram Moolenaar  END
3797f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
37984324d87aSBram Moolenaarenddef
37994324d87aSBram Moolenaar
38004aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
38014aab88d9SBram Moolenaar  var lines =<< trim END
38024aab88d9SBram Moolenaar      vim9script
38034aab88d9SBram Moolenaar      if exists('g:guard')
38044aab88d9SBram Moolenaar        finish
38054aab88d9SBram Moolenaar      endif
38064aab88d9SBram Moolenaar      g:guard = 1
38074aab88d9SBram Moolenaar      var name = 'thename'
38084aab88d9SBram Moolenaar      def g:GetName(): string
38094aab88d9SBram Moolenaar        return name
38104aab88d9SBram Moolenaar      enddef
38114aab88d9SBram Moolenaar      def g:SetName(arg: string)
38124aab88d9SBram Moolenaar        name = arg
38134aab88d9SBram Moolenaar      enddef
38144aab88d9SBram Moolenaar  END
38154aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
38164aab88d9SBram Moolenaar  so XscriptTwice.vim
38174aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
38184aab88d9SBram Moolenaar  g:SetName('newname')
38194aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
38204aab88d9SBram Moolenaar  so XscriptTwice.vim
38214aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
38224aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
38234aab88d9SBram Moolenaar
38244aab88d9SBram Moolenaar  delfunc g:GetName
38254aab88d9SBram Moolenaar  delfunc g:SetName
38264aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
38274aab88d9SBram Moolenaar  unlet g:guard
38284aab88d9SBram Moolenaarenddef
38294aab88d9SBram Moolenaar
38304aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
38314aab88d9SBram Moolenaar  var exportlines =<< trim END
38324aab88d9SBram Moolenaar      vim9script
38334aab88d9SBram Moolenaar      if exists('g:guard')
38344aab88d9SBram Moolenaar        finish
38354aab88d9SBram Moolenaar      endif
38364aab88d9SBram Moolenaar      g:guard = 1
38374aab88d9SBram Moolenaar      export var name = 'someName'
38384aab88d9SBram Moolenaar  END
38394aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
38404aab88d9SBram Moolenaar
38414aab88d9SBram Moolenaar  var lines =<< trim END
38424aab88d9SBram Moolenaar      vim9script
38434aab88d9SBram Moolenaar      import name from './XexportScript.vim'
38444aab88d9SBram Moolenaar      def g:GetName(): string
38454aab88d9SBram Moolenaar        return name
38464aab88d9SBram Moolenaar      enddef
38474aab88d9SBram Moolenaar  END
38484aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
38494aab88d9SBram Moolenaar  so XscriptImport.vim
38504aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
38514aab88d9SBram Moolenaar
38524aab88d9SBram Moolenaar  so XexportScript.vim
38534aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
38544aab88d9SBram Moolenaar
38554aab88d9SBram Moolenaar  delfunc g:GetName
38564aab88d9SBram Moolenaar  delete('XexportScript.vim')
38574aab88d9SBram Moolenaar  delete('XscriptImport.vim')
38584aab88d9SBram Moolenaar  unlet g:guard
38594aab88d9SBram Moolenaarenddef
38604aab88d9SBram Moolenaar
386110b9421fSBram Moolenaardef Test_unsupported_commands()
386210b9421fSBram Moolenaar  var lines =<< trim END
386310b9421fSBram Moolenaar      ka
386410b9421fSBram Moolenaar  END
38657d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
38667d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
386710b9421fSBram Moolenaar
386810b9421fSBram Moolenaar  lines =<< trim END
3869ada1d870SBram Moolenaar      :1ka
3870ada1d870SBram Moolenaar  END
38717d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
38727d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
3873ada1d870SBram Moolenaar
3874ada1d870SBram Moolenaar  lines =<< trim END
387510b9421fSBram Moolenaar    t
387610b9421fSBram Moolenaar  END
387710b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
387810b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
387910b9421fSBram Moolenaar
388010b9421fSBram Moolenaar  lines =<< trim END
388110b9421fSBram Moolenaar    x
388210b9421fSBram Moolenaar  END
388310b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
388410b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
388510b9421fSBram Moolenaar
388610b9421fSBram Moolenaar  lines =<< trim END
388710b9421fSBram Moolenaar    xit
388810b9421fSBram Moolenaar  END
388910b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
389010b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
389110b9421fSBram Moolenaarenddef
389210b9421fSBram Moolenaar
3893c70fe460SBram Moolenaardef Test_mapping_line_number()
3894c70fe460SBram Moolenaar  var lines =<< trim END
3895c70fe460SBram Moolenaar      vim9script
3896c70fe460SBram Moolenaar      def g:FuncA()
3897c70fe460SBram Moolenaar          # Some comment
3898c70fe460SBram Moolenaar          FuncB(0)
3899c70fe460SBram Moolenaar      enddef
3900c70fe460SBram Moolenaar          # Some comment
3901c70fe460SBram Moolenaar      def FuncB(
3902c70fe460SBram Moolenaar          # Some comment
3903c70fe460SBram Moolenaar          n: number
3904c70fe460SBram Moolenaar      )
3905c70fe460SBram Moolenaar          exe 'nno '
3906c70fe460SBram Moolenaar              # Some comment
3907c70fe460SBram Moolenaar              .. '<F3> a'
3908c70fe460SBram Moolenaar              .. 'b'
3909c70fe460SBram Moolenaar              .. 'c'
3910c70fe460SBram Moolenaar      enddef
3911c70fe460SBram Moolenaar  END
3912c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
3913c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
3914c70fe460SBram Moolenaar  assert_match('No mapping found', res)
3915c70fe460SBram Moolenaar
3916c70fe460SBram Moolenaar  g:FuncA()
3917c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
3918c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
3919c70fe460SBram Moolenaar
3920c70fe460SBram Moolenaar  nunmap <F3>
3921c70fe460SBram Moolenaar  delfunc g:FuncA
3922c70fe460SBram Moolenaarenddef
3923c70fe460SBram Moolenaar
3924585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3925585fea7bSBram Moolenaardef Test_substitute_cmd()
3926585fea7bSBram Moolenaar  new
3927585fea7bSBram Moolenaar  setline(1, 'something')
3928585fea7bSBram Moolenaar  :substitute(some(other(
3929585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3930585fea7bSBram Moolenaar  bwipe!
3931585fea7bSBram Moolenaar
3932f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3933cfcd011fSBram Moolenaar  var lines =<< trim END
3934585fea7bSBram Moolenaar    vim9script
3935585fea7bSBram Moolenaar    new
3936585fea7bSBram Moolenaar    setline(1, 'something')
3937585fea7bSBram Moolenaar    :substitute(some(other(
3938585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3939585fea7bSBram Moolenaar    bwipe!
3940585fea7bSBram Moolenaar  END
3941585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3942585fea7bSBram Moolenaar  source Xvim9lines
3943585fea7bSBram Moolenaar
3944585fea7bSBram Moolenaar  delete('Xvim9lines')
3945585fea7bSBram Moolenaarenddef
3946585fea7bSBram Moolenaar
39478a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3948