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
524a764e73dSYegappan Lakshmanan    echo range(1, 2, 0)
525a764e73dSYegappan Lakshmanan  catch /E726:/
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
5849fa5dabeSBram Moolenaar  # no requirement for spaces before |
5859fa5dabeSBram Moolenaar  try|echo 0|catch|endtry
5869fa5dabeSBram Moolenaar
5877e82c5f3SBram Moolenaar  # return in finally after empty catch
5887e82c5f3SBram Moolenaar  def ReturnInFinally(): number
5897e82c5f3SBram Moolenaar    try
5907e82c5f3SBram Moolenaar    finally
5917e82c5f3SBram Moolenaar      return 4
5927e82c5f3SBram Moolenaar    endtry
5937e82c5f3SBram Moolenaar    return 2
5947e82c5f3SBram Moolenaar  enddef
5957e82c5f3SBram Moolenaar  assert_equal(4, ReturnInFinally())
5968ac681a2SBram Moolenaar
5978ac681a2SBram Moolenaar  var lines =<< trim END
5988ac681a2SBram Moolenaar      vim9script
5998ac681a2SBram Moolenaar      try
6008ac681a2SBram Moolenaar        acos('0.5')
6018ac681a2SBram Moolenaar          ->setline(1)
6028ac681a2SBram Moolenaar      catch
6038ac681a2SBram Moolenaar        g:caught = v:exception
6048ac681a2SBram Moolenaar      endtry
6058ac681a2SBram Moolenaar  END
6068ac681a2SBram Moolenaar  CheckScriptSuccess(lines)
6074490ec4eSYegappan Lakshmanan  assert_match('E1219: Float or Number required for argument 1', g:caught)
6088ac681a2SBram Moolenaar  unlet g:caught
6094197828dSBram Moolenaar
6104197828dSBram Moolenaar  # missing catch and/or finally
6114197828dSBram Moolenaar  lines =<< trim END
6124197828dSBram Moolenaar      vim9script
6134197828dSBram Moolenaar      try
6144197828dSBram Moolenaar        echo 'something'
6154197828dSBram Moolenaar      endtry
6164197828dSBram Moolenaar  END
6174197828dSBram Moolenaar  CheckScriptFailure(lines, 'E1032:')
6188a7d6542SBram Moolenaarenddef
6198a7d6542SBram Moolenaar
6203f987b59SBram Moolenaardef Test_try_in_catch()
6213f987b59SBram Moolenaar  var lines =<< trim END
6223f987b59SBram Moolenaar      vim9script
6233f987b59SBram Moolenaar      var seq = []
6243f987b59SBram Moolenaar      def DoIt()
6253f987b59SBram Moolenaar        try
6263f987b59SBram Moolenaar          seq->add('throw 1')
6273f987b59SBram Moolenaar          eval [][0]
6283f987b59SBram Moolenaar          seq->add('notreached')
6293f987b59SBram Moolenaar        catch
6303f987b59SBram Moolenaar          seq->add('catch')
6313f987b59SBram Moolenaar          try
6323f987b59SBram Moolenaar            seq->add('throw 2')
6333f987b59SBram Moolenaar            eval [][0]
6343f987b59SBram Moolenaar            seq->add('notreached')
6353f987b59SBram Moolenaar          catch /nothing/
6363f987b59SBram Moolenaar            seq->add('notreached')
6373f987b59SBram Moolenaar          endtry
6383f987b59SBram Moolenaar          seq->add('done')
6393f987b59SBram Moolenaar        endtry
6403f987b59SBram Moolenaar      enddef
6413f987b59SBram Moolenaar      DoIt()
6423f987b59SBram Moolenaar      assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
6433f987b59SBram Moolenaar  END
6443f987b59SBram Moolenaarenddef
6453f987b59SBram Moolenaar
646d3d8feebSBram Moolenaardef Test_error_in_catch()
647d3d8feebSBram Moolenaar  var lines =<< trim END
648d3d8feebSBram Moolenaar      try
649d3d8feebSBram Moolenaar        eval [][0]
650d3d8feebSBram Moolenaar      catch /E684:/
651d3d8feebSBram Moolenaar        eval [][0]
652d3d8feebSBram Moolenaar      endtry
653d3d8feebSBram Moolenaar  END
654d3d8feebSBram Moolenaar  CheckDefExecFailure(lines, 'E684:', 4)
655d3d8feebSBram Moolenaarenddef
656d3d8feebSBram Moolenaar
6572e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to
6582e34c34bSBram Moolenaardef TryContinueFunc()
6592e34c34bSBram Moolenaar while g:Count < 2
6602e34c34bSBram Moolenaar   g:sequence ..= 't'
6612e34c34bSBram Moolenaar    try
6622e34c34bSBram Moolenaar      echoerr 'Test'
6632e34c34bSBram Moolenaar    catch
6642e34c34bSBram Moolenaar      g:Count += 1
6652e34c34bSBram Moolenaar      g:sequence ..= 'c'
6662e34c34bSBram Moolenaar      continue
6672e34c34bSBram Moolenaar    endtry
6682e34c34bSBram Moolenaar    g:sequence ..= 'e'
6692e34c34bSBram Moolenaar    g:Count += 1
6702e34c34bSBram Moolenaar  endwhile
6712e34c34bSBram Moolenaarenddef
6722e34c34bSBram Moolenaar
6732e34c34bSBram Moolenaardef Test_continue_in_try_in_while()
6742e34c34bSBram Moolenaar  g:Count = 0
6752e34c34bSBram Moolenaar  g:sequence = ''
6762e34c34bSBram Moolenaar  TryContinueFunc()
6772e34c34bSBram Moolenaar  assert_equal('tctc', g:sequence)
6782e34c34bSBram Moolenaar  unlet g:Count
6792e34c34bSBram Moolenaar  unlet g:sequence
6802e34c34bSBram Moolenaarenddef
6812e34c34bSBram Moolenaar
6829cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
6839cb577a6SBram Moolenaar  # return in try block returns normally
6849cb577a6SBram Moolenaar  def ReturnInTry(): string
6859cb577a6SBram Moolenaar    try
6869cb577a6SBram Moolenaar      return '"some message"'
6879cb577a6SBram Moolenaar    catch
6889cb577a6SBram Moolenaar    endtry
6899cb577a6SBram Moolenaar    return 'not reached'
6909cb577a6SBram Moolenaar  enddef
6919cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
6929cb577a6SBram Moolenaarenddef
6939cb577a6SBram Moolenaar
6941430ceebSBram Moolenaardef Test_cnext_works_in_catch()
6951430ceebSBram Moolenaar  var lines =<< trim END
6961430ceebSBram Moolenaar      vim9script
697c323527dSBram Moolenaar      au BufEnter * eval 1 + 2
6981430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
6991430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
7001430ceebSBram Moolenaar      var items = [
7011430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
7021430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
7031430ceebSBram Moolenaar        ]
7041430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
7051430ceebSBram Moolenaar      cwindow
7061430ceebSBram Moolenaar
7071430ceebSBram Moolenaar      def CnextOrCfirst()
7081430ceebSBram Moolenaar        # if cnext fails, cfirst is used
7091430ceebSBram Moolenaar        try
7101430ceebSBram Moolenaar          cnext
7111430ceebSBram Moolenaar        catch
7121430ceebSBram Moolenaar          cfirst
7131430ceebSBram Moolenaar        endtry
7141430ceebSBram Moolenaar      enddef
7151430ceebSBram Moolenaar
7161430ceebSBram Moolenaar      CnextOrCfirst()
7171430ceebSBram Moolenaar      CnextOrCfirst()
7181430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
7191430ceebSBram Moolenaar      qall
7201430ceebSBram Moolenaar  END
7211430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
7221430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
7231430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
7241430ceebSBram Moolenaar
7251430ceebSBram Moolenaar  delete('Xfile1')
7261430ceebSBram Moolenaar  delete('Xfile2')
7271430ceebSBram Moolenaar  delete('XCatchCnext')
7281430ceebSBram Moolenaar  delete('Xresult')
7291430ceebSBram Moolenaarenddef
7301430ceebSBram Moolenaar
7319e1d9e34SBram Moolenaardef Test_throw_skipped()
7329e1d9e34SBram Moolenaar  if 0
7339e1d9e34SBram Moolenaar    throw dontgethere
7349e1d9e34SBram Moolenaar  endif
7359e1d9e34SBram Moolenaarenddef
7369e1d9e34SBram Moolenaar
7378f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
7388f81b22eSBram Moolenaar  var lines =<< trim END
7398f81b22eSBram Moolenaar    vim9script
7408f81b22eSBram Moolenaar    def Func()
7418f81b22eSBram Moolenaar      throw 'error'
7428f81b22eSBram Moolenaar    enddef
7438f81b22eSBram Moolenaar    silent! Func()
7448f81b22eSBram Moolenaar  END
7458f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
7468f81b22eSBram Moolenaar  source XthrowSilenced
7478f81b22eSBram Moolenaar  delete('XthrowSilenced')
7488f81b22eSBram Moolenaarenddef
7498f81b22eSBram Moolenaar
750e859312eSBram Moolenaardef DeletedFunc(): list<any>
751e859312eSBram Moolenaar  return ['delete me']
752e859312eSBram Moolenaarenddef
753e859312eSBram Moolenaardefcompile
754e859312eSBram Moolenaardelfunc DeletedFunc
755e859312eSBram Moolenaar
756257cc5eeSBram Moolenaardef ThrowFromDef()
757a72cfb80SBram Moolenaar  throw "getout" # comment
758257cc5eeSBram Moolenaarenddef
759257cc5eeSBram Moolenaar
760257cc5eeSBram Moolenaarfunc CatchInFunc()
761257cc5eeSBram Moolenaar  try
762257cc5eeSBram Moolenaar    call ThrowFromDef()
763257cc5eeSBram Moolenaar  catch
764257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
765257cc5eeSBram Moolenaar  endtry
766257cc5eeSBram Moolenaarendfunc
767257cc5eeSBram Moolenaar
768257cc5eeSBram Moolenaardef CatchInDef()
769257cc5eeSBram Moolenaar  try
770257cc5eeSBram Moolenaar    ThrowFromDef()
771257cc5eeSBram Moolenaar  catch
772257cc5eeSBram Moolenaar    g:thrown_def = v:exception
773257cc5eeSBram Moolenaar  endtry
774257cc5eeSBram Moolenaarenddef
775257cc5eeSBram Moolenaar
776f575adffSBram Moolenaardef ReturnFinally(): string
777f575adffSBram Moolenaar  try
778f575adffSBram Moolenaar    return 'intry'
779373863edSBram Moolenaar  finall
780f575adffSBram Moolenaar    g:in_finally = 'finally'
781f575adffSBram Moolenaar  endtry
782f575adffSBram Moolenaar  return 'end'
783f575adffSBram Moolenaarenddef
784f575adffSBram Moolenaar
785257cc5eeSBram Moolenaardef Test_try_catch_nested()
786257cc5eeSBram Moolenaar  CatchInFunc()
787257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
788257cc5eeSBram Moolenaar
789257cc5eeSBram Moolenaar  CatchInDef()
790257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
791f575adffSBram Moolenaar
792f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
793f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
794d3d8feebSBram Moolenaar
795d3d8feebSBram Moolenaar  var l = []
796d3d8feebSBram Moolenaar  try
797d3d8feebSBram Moolenaar    l->add('1')
798d3d8feebSBram Moolenaar    throw 'bad'
799d3d8feebSBram Moolenaar    l->add('x')
800d3d8feebSBram Moolenaar  catch /bad/
801d3d8feebSBram Moolenaar    l->add('2')
802d3d8feebSBram Moolenaar    try
803d3d8feebSBram Moolenaar      l->add('3')
804d3d8feebSBram Moolenaar      throw 'one'
805d3d8feebSBram Moolenaar      l->add('x')
806d3d8feebSBram Moolenaar    catch /one/
807d3d8feebSBram Moolenaar      l->add('4')
808d3d8feebSBram Moolenaar      try
809d3d8feebSBram Moolenaar        l->add('5')
810d3d8feebSBram Moolenaar        throw 'more'
811d3d8feebSBram Moolenaar        l->add('x')
812d3d8feebSBram Moolenaar      catch /more/
813d3d8feebSBram Moolenaar        l->add('6')
814d3d8feebSBram Moolenaar      endtry
815d3d8feebSBram Moolenaar    endtry
816d3d8feebSBram Moolenaar  endtry
817d3d8feebSBram Moolenaar  assert_equal(['1', '2', '3', '4', '5', '6'], l)
818834193afSBram Moolenaar
819834193afSBram Moolenaar  l = []
820834193afSBram Moolenaar  try
821834193afSBram Moolenaar    try
822834193afSBram Moolenaar      l->add('1')
823834193afSBram Moolenaar      throw 'foo'
824834193afSBram Moolenaar      l->add('x')
825834193afSBram Moolenaar    catch
826834193afSBram Moolenaar      l->add('2')
827834193afSBram Moolenaar      throw 'bar'
828834193afSBram Moolenaar      l->add('x')
829834193afSBram Moolenaar    finally
830834193afSBram Moolenaar      l->add('3')
831834193afSBram Moolenaar    endtry
832834193afSBram Moolenaar    l->add('x')
833834193afSBram Moolenaar  catch /bar/
834834193afSBram Moolenaar    l->add('4')
835834193afSBram Moolenaar  endtry
836834193afSBram Moolenaar  assert_equal(['1', '2', '3', '4'], l)
837f575adffSBram Moolenaarenddef
838f575adffSBram Moolenaar
8399939f57bSBram Moolenaardef TryOne(): number
8409939f57bSBram Moolenaar  try
8419939f57bSBram Moolenaar    return 0
8429939f57bSBram Moolenaar  catch
8439939f57bSBram Moolenaar  endtry
8449939f57bSBram Moolenaar  return 0
8459939f57bSBram Moolenaarenddef
8469939f57bSBram Moolenaar
8479939f57bSBram Moolenaardef TryTwo(n: number): string
8489939f57bSBram Moolenaar  try
849cfcd011fSBram Moolenaar    var x = {}
8509939f57bSBram Moolenaar  catch
8519939f57bSBram Moolenaar  endtry
8529939f57bSBram Moolenaar  return 'text'
8539939f57bSBram Moolenaarenddef
8549939f57bSBram Moolenaar
8559939f57bSBram Moolenaardef Test_try_catch_twice()
8569939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
8579939f57bSBram Moolenaarenddef
8589939f57bSBram Moolenaar
859f575adffSBram Moolenaardef Test_try_catch_match()
860cfcd011fSBram Moolenaar  var seq = 'a'
861f575adffSBram Moolenaar  try
862f575adffSBram Moolenaar    throw 'something'
863f575adffSBram Moolenaar  catch /nothing/
864f575adffSBram Moolenaar    seq ..= 'x'
865f575adffSBram Moolenaar  catch /some/
866f575adffSBram Moolenaar    seq ..= 'b'
867f575adffSBram Moolenaar  catch /asdf/
868f575adffSBram Moolenaar    seq ..= 'x'
869e8c4abbbSBram Moolenaar  catch ?a\?sdf?
870e8c4abbbSBram Moolenaar    seq ..= 'y'
871f575adffSBram Moolenaar  finally
872f575adffSBram Moolenaar    seq ..= 'c'
873f575adffSBram Moolenaar  endtry
874f575adffSBram Moolenaar  assert_equal('abc', seq)
875257cc5eeSBram Moolenaarenddef
876257cc5eeSBram Moolenaar
877e8c4abbbSBram Moolenaardef Test_try_catch_fails()
878d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
879d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
880d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
881d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
882d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
883d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
884d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
885d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
88613106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
887d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
888585fea7bSBram Moolenaar
889e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
890d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
891e8c4abbbSBram Moolenaarenddef
892e8c4abbbSBram Moolenaar
8937c5b3c03SBram Moolenaardef Try_catch_skipped()
8947c5b3c03SBram Moolenaar  var l = []
8957c5b3c03SBram Moolenaar  try
8967c5b3c03SBram Moolenaar  finally
8977c5b3c03SBram Moolenaar  endtry
8987c5b3c03SBram Moolenaar
8997c5b3c03SBram Moolenaar  if 1
9007c5b3c03SBram Moolenaar  else
9017c5b3c03SBram Moolenaar    try
9027c5b3c03SBram Moolenaar    endtry
9037c5b3c03SBram Moolenaar  endif
9047c5b3c03SBram Moolenaarenddef
9057c5b3c03SBram Moolenaar
9067c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
9077c5b3c03SBram Moolenaardef Test_try_catch_skipped()
9087c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
9097c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
9107c5b3c03SBram Moolenaarenddef
9117c5b3c03SBram Moolenaar
9127c5b3c03SBram Moolenaar
9137c5b3c03SBram Moolenaar
914006ad48bSBram Moolenaardef Test_throw_vimscript()
915f5be8cdbSBram Moolenaar  # only checks line continuation
916cfcd011fSBram Moolenaar  var lines =<< trim END
917006ad48bSBram Moolenaar      vim9script
918006ad48bSBram Moolenaar      try
919006ad48bSBram Moolenaar        throw 'one'
920006ad48bSBram Moolenaar              .. 'two'
921006ad48bSBram Moolenaar      catch
922006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
923006ad48bSBram Moolenaar      endtry
924006ad48bSBram Moolenaar  END
925006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
9261e021e63SBram Moolenaar
9271e021e63SBram Moolenaar  lines =<< trim END
9281e021e63SBram Moolenaar    vim9script
929352134bbSBram Moolenaar    @r = ''
9301e021e63SBram Moolenaar    def Func()
9311e021e63SBram Moolenaar      throw @r
9321e021e63SBram Moolenaar    enddef
9331e021e63SBram Moolenaar    var result = ''
9341e021e63SBram Moolenaar    try
9351e021e63SBram Moolenaar      Func()
9361e021e63SBram Moolenaar    catch /E1129:/
9371e021e63SBram Moolenaar      result = 'caught'
9381e021e63SBram Moolenaar    endtry
9391e021e63SBram Moolenaar    assert_equal('caught', result)
9401e021e63SBram Moolenaar  END
9411e021e63SBram Moolenaar  CheckScriptSuccess(lines)
942006ad48bSBram Moolenaarenddef
943006ad48bSBram Moolenaar
944ed677f55SBram Moolenaardef Test_error_in_nested_function()
94503dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
946cfcd011fSBram Moolenaar  var lines =<< trim END
947ed677f55SBram Moolenaar      vim9script
948ed677f55SBram Moolenaar      def Func()
949ed677f55SBram Moolenaar        Error()
950ed677f55SBram Moolenaar        g:test_var = 1
951ed677f55SBram Moolenaar      enddef
952ed677f55SBram Moolenaar      func Error() abort
953ed677f55SBram Moolenaar        eval [][0]
954ed677f55SBram Moolenaar      endfunc
955ed677f55SBram Moolenaar      Func()
956ed677f55SBram Moolenaar  END
957ed677f55SBram Moolenaar  g:test_var = 0
958ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
959ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
960ed677f55SBram Moolenaarenddef
961ed677f55SBram Moolenaar
962227c58a4SBram Moolenaardef Test_abort_after_error()
963227c58a4SBram Moolenaar  var lines =<< trim END
964227c58a4SBram Moolenaar      vim9script
965227c58a4SBram Moolenaar      while true
966227c58a4SBram Moolenaar        echo notfound
967227c58a4SBram Moolenaar      endwhile
968227c58a4SBram Moolenaar      g:gotthere = true
969227c58a4SBram Moolenaar  END
970227c58a4SBram Moolenaar  g:gotthere = false
971227c58a4SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
972227c58a4SBram Moolenaar  assert_false(g:gotthere)
973227c58a4SBram Moolenaar  unlet g:gotthere
974227c58a4SBram Moolenaarenddef
975227c58a4SBram Moolenaar
97637c83711SBram Moolenaardef Test_cexpr_vimscript()
977f5be8cdbSBram Moolenaar  # only checks line continuation
97837c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
979cfcd011fSBram Moolenaar  var lines =<< trim END
98037c83711SBram Moolenaar      vim9script
98137c83711SBram Moolenaar      cexpr 'File'
98237c83711SBram Moolenaar                .. ' someFile' ..
98337c83711SBram Moolenaar                   ' line 19'
98437c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
98537c83711SBram Moolenaar  END
98637c83711SBram Moolenaar  CheckScriptSuccess(lines)
98737c83711SBram Moolenaar  set errorformat&
98837c83711SBram Moolenaarenddef
98937c83711SBram Moolenaar
990c9edd6b5SBram Moolenaardef Test_statusline_syntax()
991c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
992cfcd011fSBram Moolenaar  var lines =<< trim END
993c9edd6b5SBram Moolenaar      vim9script
994c9edd6b5SBram Moolenaar      func g:Status()
995c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
996c9edd6b5SBram Moolenaar      endfunc
997c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
998c9edd6b5SBram Moolenaar      redrawstatus
999c9edd6b5SBram Moolenaar      set laststatus statusline=
1000c9edd6b5SBram Moolenaar  END
1001c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1002c9edd6b5SBram Moolenaarenddef
1003c9edd6b5SBram Moolenaar
1004b209750bSBram Moolenaardef Test_list_vimscript()
1005b209750bSBram Moolenaar  # checks line continuation and comments
1006cfcd011fSBram Moolenaar  var lines =<< trim END
1007b209750bSBram Moolenaar      vim9script
1008cfcd011fSBram Moolenaar      var mylist = [
1009b209750bSBram Moolenaar            'one',
1010b209750bSBram Moolenaar            # comment
1011b209750bSBram Moolenaar            'two', # empty line follows
1012b209750bSBram Moolenaar
1013b209750bSBram Moolenaar            'three',
1014b209750bSBram Moolenaar            ]
1015b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1016b209750bSBram Moolenaar  END
1017b209750bSBram Moolenaar  CheckScriptSuccess(lines)
101866250c93SBram Moolenaar
101966250c93SBram Moolenaar  # check all lines from heredoc are kept
102066250c93SBram Moolenaar  lines =<< trim END
102166250c93SBram Moolenaar      # comment 1
102266250c93SBram Moolenaar      two
102366250c93SBram Moolenaar      # comment 3
102466250c93SBram Moolenaar
102566250c93SBram Moolenaar      five
102666250c93SBram Moolenaar      # comment 6
102766250c93SBram Moolenaar  END
102866250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
10294bce26bbSBram Moolenaar
10304bce26bbSBram Moolenaar  lines =<< trim END
10314bce26bbSBram Moolenaar    [{
10324bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
10334bce26bbSBram Moolenaar  END
10344bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1035b209750bSBram Moolenaarenddef
1036b209750bSBram Moolenaar
10372a1381c3SBram Moolenaarif has('channel')
103840ee466cSBram Moolenaar  let someJob = test_null_job()
103940ee466cSBram Moolenaar
104040ee466cSBram Moolenaar  def FuncWithError()
104140ee466cSBram Moolenaar    echomsg g:someJob
104240ee466cSBram Moolenaar  enddef
104340ee466cSBram Moolenaar
104440ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
104540ee466cSBram Moolenaar    try
104640ee466cSBram Moolenaar      call FuncWithError()
104740ee466cSBram Moolenaar    catch
104840ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
104940ee466cSBram Moolenaar    endtry
105040ee466cSBram Moolenaar  endfunc
10512a1381c3SBram Moolenaarendif
105240ee466cSBram Moolenaar
10538a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
10548a7d6542SBram Moolenaar  vim9script
1055cfcd011fSBram Moolenaar  var name: string = 'bob'
10568a7d6542SBram Moolenaar  def Concat(arg: string): string
10578a7d6542SBram Moolenaar    return name .. arg
10588a7d6542SBram Moolenaar  enddef
1059227a69deSBram Moolenaar  g:result = Concat('bie')
1060227a69deSBram Moolenaar  g:localname = name
10618a7d6542SBram Moolenaar
10628a7d6542SBram Moolenaar  export const CONST = 1234
1063cfcd011fSBram Moolenaar  export var exported = 9876
1064cfcd011fSBram Moolenaar  export var exp_name = 'John'
10658a7d6542SBram Moolenaar  export def Exported(): string
10668a7d6542SBram Moolenaar    return 'Exported'
10678a7d6542SBram Moolenaar  enddef
106824e93165SBram Moolenaar  export def ExportedValue(): number
106924e93165SBram Moolenaar    return exported
107024e93165SBram Moolenaar  enddef
107124e93165SBram Moolenaar  export def ExportedInc()
107224e93165SBram Moolenaar    exported += 5
107324e93165SBram Moolenaar  enddef
10740f2a5cc6SBram Moolenaar  export final theList = [1]
10758a7d6542SBram MoolenaarEND
10768a7d6542SBram Moolenaar
1077b3ca9824SBram Moolenaardef Undo_export_script_lines()
1078b3ca9824SBram Moolenaar  unlet g:result
1079b3ca9824SBram Moolenaar  unlet g:localname
1080b3ca9824SBram Moolenaarenddef
1081b3ca9824SBram Moolenaar
10825269bd2aSBram Moolenaardef Test_vim9_import_export()
1083cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
10848a7d6542SBram Moolenaar    vim9script
108524e93165SBram Moolenaar    import {exported, Exported, ExportedValue} from './Xexport.vim'
108624e93165SBram Moolenaar    g:exported1 = exported
10876e587dcbSBram Moolenaar    exported += 3
108824e93165SBram Moolenaar    g:exported2 = exported
108924e93165SBram Moolenaar    g:exported3 = ExportedValue()
109024e93165SBram Moolenaar
109124e93165SBram Moolenaar    import ExportedInc from './Xexport.vim'
109224e93165SBram Moolenaar    ExportedInc()
109324e93165SBram Moolenaar    g:exported_i1 = exported
109424e93165SBram Moolenaar    g:exported_i2 = ExportedValue()
109524e93165SBram Moolenaar
109624e93165SBram Moolenaar    exported = 11
109724e93165SBram Moolenaar    g:exported_s1 = exported
109824e93165SBram Moolenaar    g:exported_s2 = ExportedValue()
109924e93165SBram Moolenaar
11008a7d6542SBram Moolenaar    g:imported_func = Exported()
11016e587dcbSBram Moolenaar
110240f4f7a4SBram Moolenaar    def GetExported(): string
1103e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
110440f4f7a4SBram Moolenaar      return local_dict.ref()
110540f4f7a4SBram Moolenaar    enddef
110640f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
110740f4f7a4SBram Moolenaar
11084db572eeSBram Moolenaar    var dir = './'
11094db572eeSBram Moolenaar    var ext = ".vim"
11104db572eeSBram Moolenaar    import {exp_name} from dir .. 'Xexport' .. ext
11116e587dcbSBram Moolenaar    g:imported_name = exp_name
11126e587dcbSBram Moolenaar    exp_name ..= ' Doe'
11136e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
111424e93165SBram Moolenaar    g:exported_later = exported
11150f2a5cc6SBram Moolenaar
11160f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
11170f2a5cc6SBram Moolenaar    theList->add(2)
11180f2a5cc6SBram Moolenaar    assert_equal([1, 2], theList)
11198a7d6542SBram Moolenaar  END
11208a7d6542SBram Moolenaar
11218a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
11228a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
11238a7d6542SBram Moolenaar
11248a7d6542SBram Moolenaar  source Ximport.vim
11258a7d6542SBram Moolenaar
11268a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
11278a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
112824e93165SBram Moolenaar  assert_equal(9876, g:exported1)
112924e93165SBram Moolenaar  assert_equal(9879, g:exported2)
113024e93165SBram Moolenaar  assert_equal(9879, g:exported3)
113124e93165SBram Moolenaar
113224e93165SBram Moolenaar  assert_equal(9884, g:exported_i1)
113324e93165SBram Moolenaar  assert_equal(9884, g:exported_i2)
113424e93165SBram Moolenaar
113524e93165SBram Moolenaar  assert_equal(11, g:exported_s1)
113624e93165SBram Moolenaar  assert_equal(11, g:exported_s2)
113724e93165SBram Moolenaar  assert_equal(11, g:exported_later)
113824e93165SBram Moolenaar
11398a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
114040f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
11416e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
11426e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
11438a7d6542SBram Moolenaar  assert_false(exists('g:name'))
11448a7d6542SBram Moolenaar
1145b3ca9824SBram Moolenaar  Undo_export_script_lines()
114624e93165SBram Moolenaar  unlet g:exported1
114724e93165SBram Moolenaar  unlet g:exported2
114824e93165SBram Moolenaar  unlet g:exported3
114924e93165SBram Moolenaar  unlet g:exported_i1
115024e93165SBram Moolenaar  unlet g:exported_i2
115124e93165SBram Moolenaar  unlet g:exported_later
11528a7d6542SBram Moolenaar  unlet g:imported_func
11536e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
11548a7d6542SBram Moolenaar  delete('Ximport.vim')
1155f2d5c240SBram Moolenaar
11561c991144SBram Moolenaar  # similar, with line breaks
1157cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
11581c991144SBram Moolenaar    vim9script
11591c991144SBram Moolenaar    import {
11601c991144SBram Moolenaar        exported,
11611c991144SBram Moolenaar        Exported,
11621c991144SBram Moolenaar        }
11631c991144SBram Moolenaar        from
11641c991144SBram Moolenaar        './Xexport.vim'
116524e93165SBram Moolenaar    g:exported = exported
116624e93165SBram Moolenaar    exported += 7
116724e93165SBram Moolenaar    g:exported_added = exported
11681c991144SBram Moolenaar    g:imported_func = Exported()
11691c991144SBram Moolenaar  END
11701c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
11711c991144SBram Moolenaar  source Ximport_lbr.vim
11721c991144SBram Moolenaar
117324e93165SBram Moolenaar  assert_equal(11, g:exported)
117424e93165SBram Moolenaar  assert_equal(18, g:exported_added)
11751c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
11761c991144SBram Moolenaar
11771c991144SBram Moolenaar  # exported script not sourced again
11781c991144SBram Moolenaar  assert_false(exists('g:result'))
117924e93165SBram Moolenaar  unlet g:exported
118024e93165SBram Moolenaar  unlet g:exported_added
11811c991144SBram Moolenaar  unlet g:imported_func
11821c991144SBram Moolenaar  delete('Ximport_lbr.vim')
11831c991144SBram Moolenaar
1184cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1185f2d5c240SBram Moolenaar    vim9script
1186f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1187f2d5c240SBram Moolenaar    def UseExport()
118824e93165SBram Moolenaar      g:exported_def = Export.exported
1189f2d5c240SBram Moolenaar    enddef
119024e93165SBram Moolenaar    g:exported_script = Export.exported
1191cb4e80faSBram Moolenaar    assert_equal(1, exists('Export.exported'))
1192cb4e80faSBram Moolenaar    assert_equal(0, exists('Export.notexported'))
1193f2d5c240SBram Moolenaar    UseExport()
1194f2d5c240SBram Moolenaar  END
1195f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1196f2d5c240SBram Moolenaar  source Ximport.vim
119724e93165SBram Moolenaar
119824e93165SBram Moolenaar  assert_equal(18, g:exported_def)
119924e93165SBram Moolenaar  assert_equal(18, g:exported_script)
120024e93165SBram Moolenaar  unlet g:exported_def
120124e93165SBram Moolenaar  unlet g:exported_script
1202f2d5c240SBram Moolenaar
1203cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1204599c89c8SBram Moolenaar    vim9script
1205599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1206599c89c8SBram Moolenaar    def Func()
1207cfcd011fSBram Moolenaar      var dummy = 1
1208cfcd011fSBram Moolenaar      var imported = Export + dummy
1209599c89c8SBram Moolenaar    enddef
1210822ba247SBram Moolenaar    defcompile
1211599c89c8SBram Moolenaar  END
1212599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
121344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1214599c89c8SBram Moolenaar
1215cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1216599c89c8SBram Moolenaar    vim9script
1217599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1218599c89c8SBram Moolenaar    def Func()
1219cfcd011fSBram Moolenaar      var imported = Export . exported
1220599c89c8SBram Moolenaar    enddef
1221822ba247SBram Moolenaar    defcompile
1222599c89c8SBram Moolenaar  END
1223599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
122444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1225599c89c8SBram Moolenaar
1226921ba529SBram Moolenaar  var import_func_duplicated =<< trim END
1227921ba529SBram Moolenaar    vim9script
1228921ba529SBram Moolenaar    import ExportedInc from './Xexport.vim'
1229921ba529SBram Moolenaar    import ExportedInc from './Xexport.vim'
1230921ba529SBram Moolenaar
1231921ba529SBram Moolenaar    ExportedInc()
1232921ba529SBram Moolenaar  END
1233921ba529SBram Moolenaar  writefile(import_func_duplicated, 'Ximport.vim')
1234921ba529SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
1235921ba529SBram Moolenaar
1236a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1237a6294955SBram Moolenaar    vim9script
1238a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1239a6294955SBram Moolenaar    var some = 'other'
1240a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1241a6294955SBram Moolenaar    defcompile
1242a6294955SBram Moolenaar  END
1243a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1244a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1245a6294955SBram Moolenaar
1246cb4e80faSBram Moolenaar  var import_star_as_lines_script_no_dot =<< trim END
1247cb4e80faSBram Moolenaar    vim9script
1248cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1249cb4e80faSBram Moolenaar    g:imported_script = Export exported
1250cb4e80faSBram Moolenaar  END
1251cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
1252cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1029:')
1253cb4e80faSBram Moolenaar
1254cb4e80faSBram Moolenaar  var import_star_as_lines_script_space_after_dot =<< trim END
1255cb4e80faSBram Moolenaar    vim9script
1256cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1257cb4e80faSBram Moolenaar    g:imported_script = Export. exported
1258cb4e80faSBram Moolenaar  END
1259cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1260cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1261cb4e80faSBram Moolenaar
1262cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1263599c89c8SBram Moolenaar    vim9script
1264599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1265599c89c8SBram Moolenaar    def Func()
1266cfcd011fSBram Moolenaar      var imported = Export.
1267599c89c8SBram Moolenaar    enddef
1268822ba247SBram Moolenaar    defcompile
1269599c89c8SBram Moolenaar  END
1270599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
127144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1272599c89c8SBram Moolenaar
1273cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
12741c991144SBram Moolenaar    vim9script
12751c991144SBram Moolenaar    import *
12761c991144SBram Moolenaar        as Export
12771c991144SBram Moolenaar        from
12781c991144SBram Moolenaar        './Xexport.vim'
12791c991144SBram Moolenaar    def UseExport()
128024e93165SBram Moolenaar      g:exported = Export.exported
12811c991144SBram Moolenaar    enddef
12821c991144SBram Moolenaar    UseExport()
12831c991144SBram Moolenaar  END
12841c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
12851c991144SBram Moolenaar  source Ximport.vim
128624e93165SBram Moolenaar  assert_equal(18, g:exported)
128724e93165SBram Moolenaar  unlet g:exported
12881c991144SBram Moolenaar
1289cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1290f2d5c240SBram Moolenaar    vim9script
1291f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1292f2d5c240SBram Moolenaar  END
1293f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
129444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1295f2d5c240SBram Moolenaar
1296f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1297cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1298fa29c8abSBram Moolenaar    vim9script
1299fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1300fa29c8abSBram Moolenaar  END
1301fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
130244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1303fa29c8abSBram Moolenaar
1304f5be8cdbSBram Moolenaar  # try to import something that is already defined
1305cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
13065269bd2aSBram Moolenaar    vim9script
1307cfcd011fSBram Moolenaar    var exported = 'something'
13085269bd2aSBram Moolenaar    import exported from './Xexport.vim'
13095269bd2aSBram Moolenaar  END
13105269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1311057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13125269bd2aSBram Moolenaar
1313f5be8cdbSBram Moolenaar  # try to import something that is already defined
13145269bd2aSBram Moolenaar  import_already_defined =<< trim END
13155269bd2aSBram Moolenaar    vim9script
1316cfcd011fSBram Moolenaar    var exported = 'something'
13175269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
13185269bd2aSBram Moolenaar  END
13195269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1320057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13215269bd2aSBram Moolenaar
1322f5be8cdbSBram Moolenaar  # try to import something that is already defined
13235269bd2aSBram Moolenaar  import_already_defined =<< trim END
13245269bd2aSBram Moolenaar    vim9script
1325cfcd011fSBram Moolenaar    var exported = 'something'
13265269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
13275269bd2aSBram Moolenaar  END
13285269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1329057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13305269bd2aSBram Moolenaar
1331918a4249SBram Moolenaar  # try changing an imported const
1332918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1333918a4249SBram Moolenaar    vim9script
1334918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1335918a4249SBram Moolenaar    def Assign()
1336918a4249SBram Moolenaar      CONST = 987
1337918a4249SBram Moolenaar    enddef
1338918a4249SBram Moolenaar    defcompile
1339918a4249SBram Moolenaar  END
1340918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1341918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1342918a4249SBram Moolenaar
13430f2a5cc6SBram Moolenaar  # try changing an imported final
13440f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
13450f2a5cc6SBram Moolenaar    vim9script
13460f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
13470f2a5cc6SBram Moolenaar    def Assign()
13480f2a5cc6SBram Moolenaar      theList = [2]
13490f2a5cc6SBram Moolenaar    enddef
13500f2a5cc6SBram Moolenaar    defcompile
13510f2a5cc6SBram Moolenaar  END
13520f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
13530f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
13540f2a5cc6SBram Moolenaar
1355f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1356cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1357fa29c8abSBram Moolenaar    vim9script
1358fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1359fa29c8abSBram Moolenaar  END
1360fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
136144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1362fa29c8abSBram Moolenaar
1363cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1364fa29c8abSBram Moolenaar    vim9script
1365fa29c8abSBram Moolenaar    import name './Xexport.vim'
1366fa29c8abSBram Moolenaar  END
1367fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
136844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1369fa29c8abSBram Moolenaar
1370cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1371fa29c8abSBram Moolenaar    vim9script
1372fa29c8abSBram Moolenaar    import name from Xexport.vim
1373fa29c8abSBram Moolenaar  END
1374fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
13754db572eeSBram Moolenaar  assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim')
1376fa29c8abSBram Moolenaar
1377cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1378fa29c8abSBram Moolenaar    vim9script
1379fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1380fa29c8abSBram Moolenaar  END
1381fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
138244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1383fa29c8abSBram Moolenaar
1384cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1385fa29c8abSBram Moolenaar    vim9script
1386fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1387fa29c8abSBram Moolenaar  END
13885269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
138944d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1390fa29c8abSBram Moolenaar
139160579350SBram Moolenaar  var import_redefining_lines =<< trim END
139260579350SBram Moolenaar    vim9script
139360579350SBram Moolenaar    import exported from './Xexport.vim'
139460579350SBram Moolenaar    var exported = 5
139560579350SBram Moolenaar  END
139660579350SBram Moolenaar  writefile(import_redefining_lines, 'Ximport.vim')
139760579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3)
139860579350SBram Moolenaar
139960579350SBram Moolenaar  var import_assign_wrong_type_lines =<< trim END
140060579350SBram Moolenaar    vim9script
140160579350SBram Moolenaar    import exported from './Xexport.vim'
140260579350SBram Moolenaar    exported = 'xxx'
140360579350SBram Moolenaar  END
140460579350SBram Moolenaar  writefile(import_assign_wrong_type_lines, 'Ximport.vim')
140560579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3)
140660579350SBram Moolenaar
140760579350SBram Moolenaar  var import_assign_const_lines =<< trim END
140860579350SBram Moolenaar    vim9script
140960579350SBram Moolenaar    import CONST from './Xexport.vim'
141060579350SBram Moolenaar    CONST = 4321
141160579350SBram Moolenaar  END
141260579350SBram Moolenaar  writefile(import_assign_const_lines, 'Ximport.vim')
141360579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E741: Value is locked: CONST', '', 3)
141460579350SBram Moolenaar
1415f2d5c240SBram Moolenaar  delete('Ximport.vim')
14165269bd2aSBram Moolenaar  delete('Ximport3.vim')
14178a7d6542SBram Moolenaar  delete('Xexport.vim')
14188a7d6542SBram Moolenaar
1419f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
14203e191694SBram Moolenaar  # Flags added or removed are also applied to the restored value.
14213e191694SBram Moolenaar  set cpo=abcd
1422cfcd011fSBram Moolenaar  var lines =<< trim END
1423750802b5SBram Moolenaar    vim9script
1424750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
14253e191694SBram Moolenaar    set cpo+=f
14263e191694SBram Moolenaar    set cpo-=c
14273e191694SBram Moolenaar    g:cpo_after_vim9script = &cpo
1428750802b5SBram Moolenaar  END
1429750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1430750802b5SBram Moolenaar  source Xvim9_script
14313e191694SBram Moolenaar  assert_equal('fabd', &cpo)
1432750802b5SBram Moolenaar  set cpo&vim
1433750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
14343e191694SBram Moolenaar  var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
14353e191694SBram Moolenaar  assert_equal(newcpo, g:cpo_after_vim9script)
14363e191694SBram Moolenaar
1437750802b5SBram Moolenaar  delete('Xvim9_script')
1438750802b5SBram Moolenaarenddef
1439750802b5SBram Moolenaar
14400a84284eSBram Moolenaardef Test_import_as()
14410a84284eSBram Moolenaar  var export_lines =<< trim END
14420a84284eSBram Moolenaar    vim9script
14430a84284eSBram Moolenaar    export var one = 1
14440a84284eSBram Moolenaar    export var yes = 'yes'
1445c967d57aSBram Moolenaar    export var slist: list<string>
14460a84284eSBram Moolenaar  END
14470a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
14480a84284eSBram Moolenaar
14490a84284eSBram Moolenaar  var import_lines =<< trim END
14500a84284eSBram Moolenaar    vim9script
14516c7cc347SBram Moolenaar    var one = 'notused'
14526c7cc347SBram Moolenaar    var yes = 777
14530a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
14540a84284eSBram Moolenaar    assert_equal(1, thatOne)
14550a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
14560a84284eSBram Moolenaar    assert_equal('yes', yesYes)
14570a84284eSBram Moolenaar  END
14580a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
14590a84284eSBram Moolenaar
14600a84284eSBram Moolenaar  import_lines =<< trim END
14610a84284eSBram Moolenaar    vim9script
14620a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
14630a84284eSBram Moolenaar    assert_equal(1, thatOne)
14640a84284eSBram Moolenaar    assert_equal('yes', yesYes)
14650a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
14660a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
14670a84284eSBram Moolenaar  END
14680a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
14690a84284eSBram Moolenaar
1470c967d57aSBram Moolenaar  import_lines =<< trim END
1471c967d57aSBram Moolenaar    vim9script
1472c967d57aSBram Moolenaar    import {slist as impSlist} from './XexportAs'
1473c967d57aSBram Moolenaar    impSlist->add(123)
1474c967d57aSBram Moolenaar  END
1475c967d57aSBram Moolenaar  CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number')
1476c967d57aSBram Moolenaar
14770a84284eSBram Moolenaar  delete('XexportAs')
14780a84284eSBram Moolenaarenddef
14790a84284eSBram Moolenaar
1480803af686SBram Moolenaarfunc g:Trigger()
1481803af686SBram Moolenaar  source Ximport.vim
1482803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1483803af686SBram Moolenaarendfunc
1484803af686SBram Moolenaar
1485803af686SBram Moolenaardef Test_import_export_expr_map()
1486803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1487cfcd011fSBram Moolenaar  var export_lines =<< trim END
1488803af686SBram Moolenaar    vim9script
1489803af686SBram Moolenaar    export def That(): string
1490803af686SBram Moolenaar      return 'yes'
1491803af686SBram Moolenaar    enddef
1492803af686SBram Moolenaar  END
1493803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1494803af686SBram Moolenaar
1495cfcd011fSBram Moolenaar  var import_lines =<< trim END
1496803af686SBram Moolenaar    vim9script
1497803af686SBram Moolenaar    import That from './Xexport_that.vim'
1498803af686SBram Moolenaar    assert_equal('yes', That())
1499803af686SBram Moolenaar  END
1500803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1501803af686SBram Moolenaar
1502803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1503803af686SBram Moolenaar  feedkeys('trigger', "xt")
1504803af686SBram Moolenaar
1505730b2483SBram Moolenaar  delete('Xexport_that.vim')
1506803af686SBram Moolenaar  delete('Ximport.vim')
1507803af686SBram Moolenaar  nunmap trigger
1508803af686SBram Moolenaarenddef
1509803af686SBram Moolenaar
15108e1986e3SBram Moolenaardef Test_import_in_filetype()
15118e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
15128e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1513cfcd011fSBram Moolenaar  var export_lines =<< trim END
15148e1986e3SBram Moolenaar    vim9script
1515cfcd011fSBram Moolenaar    export var That = 'yes'
15168e1986e3SBram Moolenaar  END
1517730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
15188e1986e3SBram Moolenaar
1519cfcd011fSBram Moolenaar  var import_lines =<< trim END
15208e1986e3SBram Moolenaar    vim9script
1521730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
15228e1986e3SBram Moolenaar    assert_equal('yes', That)
15238e1986e3SBram Moolenaar    g:did_load_mytpe = 1
15248e1986e3SBram Moolenaar  END
15258e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
15268e1986e3SBram Moolenaar
1527cfcd011fSBram Moolenaar  var save_rtp = &rtp
15288e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
15298e1986e3SBram Moolenaar
15308e1986e3SBram Moolenaar  filetype plugin on
15318e1986e3SBram Moolenaar  copen
15328e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
15338e1986e3SBram Moolenaar
15348e1986e3SBram Moolenaar  quit!
1535730b2483SBram Moolenaar  delete('Xexport_ft.vim')
15368e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
15378e1986e3SBram Moolenaar  &rtp = save_rtp
15388e1986e3SBram Moolenaarenddef
15398e1986e3SBram Moolenaar
1540efa94447SBram Moolenaardef Test_use_import_in_mapping()
1541cfcd011fSBram Moolenaar  var lines =<< trim END
1542efa94447SBram Moolenaar      vim9script
1543efa94447SBram Moolenaar      export def Funcx()
1544efa94447SBram Moolenaar        g:result = 42
1545efa94447SBram Moolenaar      enddef
1546efa94447SBram Moolenaar  END
1547efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1548efa94447SBram Moolenaar  lines =<< trim END
1549efa94447SBram Moolenaar      vim9script
1550efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1551b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1552efa94447SBram Moolenaar  END
1553efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1554efa94447SBram Moolenaar
1555efa94447SBram Moolenaar  source Xmapscript.vim
1556b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1557efa94447SBram Moolenaar  assert_equal(42, g:result)
1558efa94447SBram Moolenaar
1559efa94447SBram Moolenaar  unlet g:result
1560efa94447SBram Moolenaar  delete('XsomeExport.vim')
1561efa94447SBram Moolenaar  delete('Xmapscript.vim')
1562b3ca9824SBram Moolenaar  nunmap <F3>
1563efa94447SBram Moolenaarenddef
1564efa94447SBram Moolenaar
1565d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1566d3f8a9eeSBram Moolenaar  var lines =<< trim END
1567d3f8a9eeSBram Moolenaar    if has(g:feature)
1568d3f8a9eeSBram Moolenaar      " legacy script
1569d3f8a9eeSBram Moolenaar      let g:legacy = 1
1570d3f8a9eeSBram Moolenaar      finish
1571d3f8a9eeSBram Moolenaar    endif
1572d3f8a9eeSBram Moolenaar    vim9script
1573d3f8a9eeSBram Moolenaar    g:legacy = 0
1574d3f8a9eeSBram Moolenaar  END
1575d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1576d3f8a9eeSBram Moolenaar  g:legacy = -1
1577d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1578d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1579d3f8a9eeSBram Moolenaar
1580d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1581d3f8a9eeSBram Moolenaar  g:legacy = -1
1582d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1583d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1584d3f8a9eeSBram Moolenaarenddef
1585d3f8a9eeSBram Moolenaar
1586750802b5SBram Moolenaardef Test_vim9script_fails()
15878a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
15888a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1589cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
15909721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1591cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1592750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1593750802b5SBram Moolenaar
1594cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1595c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1596c785b9a7SBram Moolenaar
1597e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1598e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
15998a7d6542SBram Moolenaarenddef
16008a7d6542SBram Moolenaar
1601f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1602101f4810SBram Moolenaar  CheckRunVimInTerminal
1603101f4810SBram Moolenaar
16049bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1605c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
16069bb3eb3eSBram Moolenaarendfunc
16079bb3eb3eSBram Moolenaar
1608c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1609cfcd011fSBram Moolenaar  var export =<< trim END
1610101f4810SBram Moolenaar    vim9script
1611101f4810SBram Moolenaar    export def Foo(): number
1612101f4810SBram Moolenaar        return 0
1613101f4810SBram Moolenaar    enddef
1614101f4810SBram Moolenaar  END
1615730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1616101f4810SBram Moolenaar
1617e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
16189bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
16192949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1620101f4810SBram Moolenaar
1621730b2483SBram Moolenaar  delete('XexportCmd.vim')
16229bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
16239bb3eb3eSBram Moolenaarenddef
1624101f4810SBram Moolenaar
16252b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
16262b32700dSBram Moolenaar  var lines =<< trim END
1627a6294955SBram Moolenaar    vim9script
1628a6294955SBram Moolenaar    export var exported = 'thexport'
1629*60dc8274SBram Moolenaar
1630*60dc8274SBram Moolenaar    export def TheFunc(x = 0)
1631*60dc8274SBram Moolenaar    enddef
1632a6294955SBram Moolenaar  END
1633a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1634a6294955SBram Moolenaar  lines =<< trim END
16352b32700dSBram Moolenaar    vim9script noclear
16362b32700dSBram Moolenaar    g:loadCount += 1
16372b32700dSBram Moolenaar    var s:reloaded = 'init'
1638a6294955SBram Moolenaar    import exported from './XExportReload'
16392b32700dSBram Moolenaar
16402b32700dSBram Moolenaar    def Again(): string
16412b32700dSBram Moolenaar      return 'again'
16422b32700dSBram Moolenaar    enddef
16432b32700dSBram Moolenaar
1644*60dc8274SBram Moolenaar    import TheFunc from './XExportReload'
1645*60dc8274SBram Moolenaar    TheFunc()
1646*60dc8274SBram Moolenaar
16472b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
16482b32700dSBram Moolenaar    var s:loaded = true
16492b32700dSBram Moolenaar
16502b32700dSBram Moolenaar    var s:notReloaded = 'yes'
16512b32700dSBram Moolenaar    s:reloaded = 'first'
16522b32700dSBram Moolenaar    def g:Values(): list<string>
1653a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
16542b32700dSBram Moolenaar    enddef
16552b32700dSBram Moolenaar
16562b32700dSBram Moolenaar    def Once(): string
16572b32700dSBram Moolenaar      return 'once'
16582b32700dSBram Moolenaar    enddef
16592b32700dSBram Moolenaar  END
16602b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
16612b32700dSBram Moolenaar  g:loadCount = 0
16622b32700dSBram Moolenaar  source XReloaded
16632b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1664a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
16652b32700dSBram Moolenaar  source XReloaded
16662b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1667a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
16682b32700dSBram Moolenaar  source XReloaded
16692b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1670a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
16712b32700dSBram Moolenaar
167248e11c10SBram Moolenaar  delete('XReloaded')
1673a6294955SBram Moolenaar  delete('XExportReload')
16742b32700dSBram Moolenaar  delfunc g:Values
16752b32700dSBram Moolenaar  unlet g:loadCount
1676577dc93dSBram Moolenaar
1677577dc93dSBram Moolenaar  lines =<< trim END
1678577dc93dSBram Moolenaar      vim9script
1679577dc93dSBram Moolenaar      def Inner()
1680577dc93dSBram Moolenaar      enddef
1681577dc93dSBram Moolenaar  END
1682577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1683577dc93dSBram Moolenaar  source XreloadScript.vim
1684577dc93dSBram Moolenaar
1685577dc93dSBram Moolenaar  lines =<< trim END
1686577dc93dSBram Moolenaar      vim9script
1687577dc93dSBram Moolenaar      def Outer()
1688577dc93dSBram Moolenaar        def Inner()
1689577dc93dSBram Moolenaar        enddef
1690577dc93dSBram Moolenaar      enddef
1691577dc93dSBram Moolenaar      defcompile
1692577dc93dSBram Moolenaar  END
1693577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1694577dc93dSBram Moolenaar  source XreloadScript.vim
1695577dc93dSBram Moolenaar
1696577dc93dSBram Moolenaar  delete('XreloadScript.vim')
16972b32700dSBram Moolenaarenddef
16982b32700dSBram Moolenaar
16994c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1700cfcd011fSBram Moolenaar  var lines =<< trim END
17018a7d6542SBram Moolenaar    vim9script
17028a7d6542SBram Moolenaar    const var = ''
1703cfcd011fSBram Moolenaar    var valone = 1234
17048a7d6542SBram Moolenaar    def MyFunc(arg: string)
17058a7d6542SBram Moolenaar       valone = 5678
17068a7d6542SBram Moolenaar    enddef
17078a7d6542SBram Moolenaar  END
1708cfcd011fSBram Moolenaar  var morelines =<< trim END
1709cfcd011fSBram Moolenaar    var valtwo = 222
17108a7d6542SBram Moolenaar    export def GetValtwo(): number
17118a7d6542SBram Moolenaar      return valtwo
17128a7d6542SBram Moolenaar    enddef
17138a7d6542SBram Moolenaar  END
171403afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
17158a7d6542SBram Moolenaar  source Xreload.vim
17168a7d6542SBram Moolenaar  source Xreload.vim
17178a7d6542SBram Moolenaar  source Xreload.vim
17188a7d6542SBram Moolenaar
1719f5be8cdbSBram Moolenaar  # cannot declare a var twice
17208a7d6542SBram Moolenaar  lines =<< trim END
17218a7d6542SBram Moolenaar    vim9script
1722cfcd011fSBram Moolenaar    var valone = 1234
1723cfcd011fSBram Moolenaar    var valone = 5678
17248a7d6542SBram Moolenaar  END
17258a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
172644d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
17278a7d6542SBram Moolenaar
17288a7d6542SBram Moolenaar  delete('Xreload.vim')
17298a7d6542SBram Moolenaar  delete('Ximport.vim')
17308a7d6542SBram Moolenaarenddef
17318a7d6542SBram Moolenaar
173207a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
173307a65d26SBram Moolenaar" compiled function using that variable must fail.
173407a65d26SBram Moolenaardef Test_script_reload_change_type()
173507a65d26SBram Moolenaar  var lines =<< trim END
173607a65d26SBram Moolenaar    vim9script noclear
173707a65d26SBram Moolenaar    var str = 'string'
173807a65d26SBram Moolenaar    def g:GetStr(): string
173907a65d26SBram Moolenaar      return str .. 'xxx'
174007a65d26SBram Moolenaar    enddef
174107a65d26SBram Moolenaar  END
174207a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
174307a65d26SBram Moolenaar  source Xreload.vim
174407a65d26SBram Moolenaar  echo g:GetStr()
174507a65d26SBram Moolenaar
174607a65d26SBram Moolenaar  lines =<< trim END
174707a65d26SBram Moolenaar    vim9script noclear
174807a65d26SBram Moolenaar    var str = 1234
174907a65d26SBram Moolenaar  END
175007a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
175107a65d26SBram Moolenaar  source Xreload.vim
175207a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
175307a65d26SBram Moolenaar
175407a65d26SBram Moolenaar  delfunc g:GetStr
175507a65d26SBram Moolenaar  delete('Xreload.vim')
175607a65d26SBram Moolenaarenddef
175707a65d26SBram Moolenaar
1758c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled
1759c970e422SBram Moolenaarcommand CallFunc echo 'nop'
1760c970e422SBram Moolenaar
1761c970e422SBram Moolenaardef Test_script_reload_from_function()
1762c970e422SBram Moolenaar  var lines =<< trim END
1763c970e422SBram Moolenaar      vim9script
1764c970e422SBram Moolenaar
1765c970e422SBram Moolenaar      if exists('g:loaded')
1766c970e422SBram Moolenaar        finish
1767c970e422SBram Moolenaar      endif
1768c970e422SBram Moolenaar      g:loaded = 1
1769c970e422SBram Moolenaar      delcommand CallFunc
1770c970e422SBram Moolenaar      command CallFunc Func()
1771c970e422SBram Moolenaar      def Func()
1772a4c81beaSBram Moolenaar        so XreloadFunc.vim
1773c970e422SBram Moolenaar        g:didTheFunc = 1
1774c970e422SBram Moolenaar      enddef
1775c970e422SBram Moolenaar  END
1776c970e422SBram Moolenaar  writefile(lines, 'XreloadFunc.vim')
1777c970e422SBram Moolenaar  source XreloadFunc.vim
1778c970e422SBram Moolenaar  CallFunc
1779c970e422SBram Moolenaar  assert_equal(1, g:didTheFunc)
1780c970e422SBram Moolenaar
1781c970e422SBram Moolenaar  delete('XreloadFunc.vim')
1782c970e422SBram Moolenaar  delcommand CallFunc
1783c970e422SBram Moolenaar  unlet g:loaded
1784c970e422SBram Moolenaar  unlet g:didTheFunc
1785c970e422SBram Moolenaarenddef
1786c970e422SBram Moolenaar
17876c3843caSBram Moolenaardef Test_script_var_shadows_function()
17886c3843caSBram Moolenaar  var lines =<< trim END
17896c3843caSBram Moolenaar      vim9script
17906c3843caSBram Moolenaar      def Func(): number
17916c3843caSBram Moolenaar        return 123
17926c3843caSBram Moolenaar      enddef
17936c3843caSBram Moolenaar      var Func = 1
17946c3843caSBram Moolenaar  END
17956c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
17966c3843caSBram Moolenaarenddef
17976c3843caSBram Moolenaar
1798c323527dSBram Moolenaardef Test_script_var_shadows_command()
1799c323527dSBram Moolenaar  var lines =<< trim END
1800c323527dSBram Moolenaar      var undo = 1
1801c323527dSBram Moolenaar      undo = 2
1802c323527dSBram Moolenaar      assert_equal(2, undo)
1803c323527dSBram Moolenaar  END
1804c323527dSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1805c323527dSBram Moolenaar
1806c323527dSBram Moolenaar  lines =<< trim END
1807c323527dSBram Moolenaar      var undo = 1
1808c323527dSBram Moolenaar      undo
1809c323527dSBram Moolenaar  END
1810c323527dSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1207:', 2)
1811c323527dSBram Moolenaarenddef
1812c323527dSBram Moolenaar
181395006e3dSBram Moolenaardef s:RetSome(): string
181495006e3dSBram Moolenaar  return 'some'
181595006e3dSBram Moolenaarenddef
181695006e3dSBram Moolenaar
1817fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1818fe465a01SBram Moolenaar" script-local name.
1819fe465a01SBram Moolenaardef Test_vim9script_funcref()
1820cfcd011fSBram Moolenaar  var sortlines =<< trim END
1821fe465a01SBram Moolenaar      vim9script
1822fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1823bed36b93SBram Moolenaar        return i2 - i1
1824fe465a01SBram Moolenaar      enddef
1825fe465a01SBram Moolenaar
1826fe465a01SBram Moolenaar      export def FastSort(): list<number>
1827fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1828fe465a01SBram Moolenaar      enddef
1829529fb5a5SBram Moolenaar
1830529fb5a5SBram Moolenaar      export def GetString(arg: string): string
1831529fb5a5SBram Moolenaar        return arg
1832529fb5a5SBram Moolenaar      enddef
1833fe465a01SBram Moolenaar  END
1834fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1835fe465a01SBram Moolenaar
1836cfcd011fSBram Moolenaar  var lines =<< trim END
1837fe465a01SBram Moolenaar    vim9script
1838fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1839fe465a01SBram Moolenaar    def Test()
1840fe465a01SBram Moolenaar      g:result = FastSort()
1841fe465a01SBram Moolenaar    enddef
1842fe465a01SBram Moolenaar    Test()
1843529fb5a5SBram Moolenaar
1844529fb5a5SBram Moolenaar    # using a function imported with "as"
1845529fb5a5SBram Moolenaar    import * as anAlias from './Xsort.vim'
1846529fb5a5SBram Moolenaar    assert_equal('yes', anAlias.GetString('yes'))
1847529fb5a5SBram Moolenaar
1848529fb5a5SBram Moolenaar    # using the function from a compiled function
1849529fb5a5SBram Moolenaar    def TestMore(): string
1850ca51cc0aSBram Moolenaar      var s = s:anAlias.GetString('foo')
1851ca51cc0aSBram Moolenaar      return s .. anAlias.GetString('bar')
1852529fb5a5SBram Moolenaar    enddef
1853ca51cc0aSBram Moolenaar    assert_equal('foobar', TestMore())
1854529fb5a5SBram Moolenaar
1855529fb5a5SBram Moolenaar    # error when using a function that isn't exported
1856529fb5a5SBram Moolenaar    assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1857fe465a01SBram Moolenaar  END
1858fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1859fe465a01SBram Moolenaar
1860fe465a01SBram Moolenaar  source Xscript.vim
1861fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1862fe465a01SBram Moolenaar
1863fe465a01SBram Moolenaar  unlet g:result
1864fe465a01SBram Moolenaar  delete('Xsort.vim')
1865fe465a01SBram Moolenaar  delete('Xscript.vim')
186695006e3dSBram Moolenaar
1867cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
186895006e3dSBram Moolenaar  assert_equal('some', Funcref())
1869fe465a01SBram Moolenaarenddef
1870fe465a01SBram Moolenaar
1871601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1872601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1873601e76acSBram Moolenaar" function reference.
1874c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1875cfcd011fSBram Moolenaar  var filterLines =<< trim END
1876c620c055SBram Moolenaar    vim9script
1877c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1878c620c055SBram Moolenaar      return idx % 2 == 1
1879c620c055SBram Moolenaar    enddef
1880c620c055SBram Moolenaar    export def FastFilter(): list<number>
1881c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1882c620c055SBram Moolenaar    enddef
1883601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1884601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1885601e76acSBram Moolenaar    enddef
1886c620c055SBram Moolenaar  END
1887c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1888c620c055SBram Moolenaar
1889cfcd011fSBram Moolenaar  var lines =<< trim END
1890c620c055SBram Moolenaar    vim9script
1891601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1892c620c055SBram Moolenaar    def Test()
1893cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1894c620c055SBram Moolenaar    enddef
1895c620c055SBram Moolenaar    Test()
1896601e76acSBram Moolenaar    def TestDirect()
1897cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1898601e76acSBram Moolenaar    enddef
1899601e76acSBram Moolenaar    TestDirect()
1900c620c055SBram Moolenaar  END
1901601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1902c620c055SBram Moolenaar  delete('Xfilter.vim')
1903c620c055SBram Moolenaarenddef
1904c620c055SBram Moolenaar
19054c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1906cfcd011fSBram Moolenaar  var first_lines =<< trim END
19074c17ad94SBram Moolenaar    vim9script
19084c17ad94SBram Moolenaar    def FuncYes(): string
19094c17ad94SBram Moolenaar      return 'yes'
19104c17ad94SBram Moolenaar    enddef
19114c17ad94SBram Moolenaar  END
1912cfcd011fSBram Moolenaar  var withno_lines =<< trim END
19134c17ad94SBram Moolenaar    def FuncNo(): string
19144c17ad94SBram Moolenaar      return 'no'
19154c17ad94SBram Moolenaar    enddef
19164c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
19174c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
19184c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
191903afdcf1SBram Moolenaar    enddef
192003afdcf1SBram Moolenaar  END
1921cfcd011fSBram Moolenaar  var nono_lines =<< trim END
192203afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
192303afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
192444d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
19254c17ad94SBram Moolenaar    enddef
19264c17ad94SBram Moolenaar  END
19274c17ad94SBram Moolenaar
19284c17ad94SBram Moolenaar  # FuncNo() is defined
192903afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
19304c17ad94SBram Moolenaar  source Xreloaded.vim
19314c17ad94SBram Moolenaar  g:DoCheck(true)
19324c17ad94SBram Moolenaar
19334c17ad94SBram Moolenaar  # FuncNo() is not redefined
193403afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
19354c17ad94SBram Moolenaar  source Xreloaded.vim
19365082471fSBram Moolenaar  g:DoCheck(false)
19374c17ad94SBram Moolenaar
19384c17ad94SBram Moolenaar  # FuncNo() is back
193903afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
19404c17ad94SBram Moolenaar  source Xreloaded.vim
19415082471fSBram Moolenaar  g:DoCheck(false)
19424c17ad94SBram Moolenaar
19434c17ad94SBram Moolenaar  delete('Xreloaded.vim')
19444c17ad94SBram Moolenaarenddef
19454c17ad94SBram Moolenaar
194689483d40SBram Moolenaardef Test_vim9script_reload_delvar()
194789483d40SBram Moolenaar  # write the script with a script-local variable
1948cfcd011fSBram Moolenaar  var lines =<< trim END
194989483d40SBram Moolenaar    vim9script
1950cfcd011fSBram Moolenaar    var name = 'string'
195189483d40SBram Moolenaar  END
195289483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
195389483d40SBram Moolenaar  source XreloadVar.vim
195489483d40SBram Moolenaar
195589483d40SBram Moolenaar  # now write the script using the same variable locally - works
195689483d40SBram Moolenaar  lines =<< trim END
195789483d40SBram Moolenaar    vim9script
195889483d40SBram Moolenaar    def Func()
1959cfcd011fSBram Moolenaar      var name = 'string'
196089483d40SBram Moolenaar    enddef
196189483d40SBram Moolenaar  END
196289483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
196389483d40SBram Moolenaar  source XreloadVar.vim
196489483d40SBram Moolenaar
196589483d40SBram Moolenaar  delete('XreloadVar.vim')
196689483d40SBram Moolenaarenddef
196789483d40SBram Moolenaar
19688a7d6542SBram Moolenaardef Test_import_absolute()
1969cfcd011fSBram Moolenaar  var import_lines = [
1970e6085c53SBram Moolenaar        'vim9script',
1971e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1972e6085c53SBram Moolenaar        'def UseExported()',
1973e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1974e6085c53SBram Moolenaar        '  exported = 8888',
1975e6085c53SBram Moolenaar        '  g:imported_after = exported',
1976e6085c53SBram Moolenaar        'enddef',
1977e6085c53SBram Moolenaar        'UseExported()',
1978e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1979e6085c53SBram Moolenaar        ]
19808a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
19818a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
19828a7d6542SBram Moolenaar
19838a7d6542SBram Moolenaar  source Ximport_abs.vim
19848a7d6542SBram Moolenaar
19858a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
19864e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1987fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1988fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1989fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1990fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1991fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1992fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1993fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1994fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1995fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1996fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1997e6085c53SBram Moolenaar        g:import_disassembled)
1998b3ca9824SBram Moolenaar
1999b3ca9824SBram Moolenaar  Undo_export_script_lines()
20008a7d6542SBram Moolenaar  unlet g:imported_abs
20014e12a5dfSBram Moolenaar  unlet g:import_disassembled
20028a7d6542SBram Moolenaar
20038a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
20048a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
20058a7d6542SBram Moolenaarenddef
20068a7d6542SBram Moolenaar
20078a7d6542SBram Moolenaardef Test_import_rtp()
2008cfcd011fSBram Moolenaar  var import_lines = [
2009e6085c53SBram Moolenaar        'vim9script',
2010e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
2011e6085c53SBram Moolenaar        'g:imported_rtp = exported',
2012e6085c53SBram Moolenaar        ]
20138a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
2014b885a7c7SBram Moolenaar  mkdir('import', 'p')
2015b885a7c7SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
20168a7d6542SBram Moolenaar
2017cfcd011fSBram Moolenaar  var save_rtp = &rtp
20188a7d6542SBram Moolenaar  &rtp = getcwd()
20198a7d6542SBram Moolenaar  source Ximport_rtp.vim
20208a7d6542SBram Moolenaar  &rtp = save_rtp
20218a7d6542SBram Moolenaar
20228a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
20238a7d6542SBram Moolenaar
2024b3ca9824SBram Moolenaar  Undo_export_script_lines()
2025b3ca9824SBram Moolenaar  unlet g:imported_rtp
20268a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
2027b885a7c7SBram Moolenaar  delete('import', 'rf')
20288a7d6542SBram Moolenaarenddef
20298a7d6542SBram Moolenaar
203025e0f586SBram Moolenaardef Test_import_compile_error()
2031cfcd011fSBram Moolenaar  var export_lines = [
203225e0f586SBram Moolenaar        'vim9script',
203325e0f586SBram Moolenaar        'export def ExpFunc(): string',
203425e0f586SBram Moolenaar        '  return notDefined',
203525e0f586SBram Moolenaar        'enddef',
203625e0f586SBram Moolenaar        ]
203725e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
203825e0f586SBram Moolenaar
2039cfcd011fSBram Moolenaar  var import_lines = [
204025e0f586SBram Moolenaar        'vim9script',
204125e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
204225e0f586SBram Moolenaar        'def ImpFunc()',
204325e0f586SBram Moolenaar        '  echo ExpFunc()',
204425e0f586SBram Moolenaar        'enddef',
204525e0f586SBram Moolenaar        'defcompile',
204625e0f586SBram Moolenaar        ]
204725e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
204825e0f586SBram Moolenaar
204925e0f586SBram Moolenaar  try
205025e0f586SBram Moolenaar    source Ximport.vim
205125e0f586SBram Moolenaar  catch /E1001/
2052f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
20537707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
205425e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
205525e0f586SBram Moolenaar  endtry
205625e0f586SBram Moolenaar
205725e0f586SBram Moolenaar  delete('Xexported.vim')
205825e0f586SBram Moolenaar  delete('Ximport.vim')
205925e0f586SBram Moolenaarenddef
206025e0f586SBram Moolenaar
2061c4ce36d4SBram Moolenaardef Test_func_redefine_error()
2062cfcd011fSBram Moolenaar  var lines = [
2063c4ce36d4SBram Moolenaar        'vim9script',
2064c4ce36d4SBram Moolenaar        'def Func()',
2065c4ce36d4SBram Moolenaar        '  eval [][0]',
2066c4ce36d4SBram Moolenaar        'enddef',
2067c4ce36d4SBram Moolenaar        'Func()',
2068c4ce36d4SBram Moolenaar        ]
2069c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
2070c4ce36d4SBram Moolenaar
2071c4ce36d4SBram Moolenaar  for count in range(3)
2072c4ce36d4SBram Moolenaar    try
2073c4ce36d4SBram Moolenaar      source Xtestscript.vim
2074c4ce36d4SBram Moolenaar    catch /E684/
2075c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
2076c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
2077c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
2078c4ce36d4SBram Moolenaar    endtry
2079c4ce36d4SBram Moolenaar  endfor
2080c4ce36d4SBram Moolenaar
2081c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
2082c4ce36d4SBram Moolenaarenddef
2083c4ce36d4SBram Moolenaar
2084eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
2085cfcd011fSBram Moolenaar  var export_lines =<< trim END
2086eef2102eSBram Moolenaar      vim9script
2087eef2102eSBram Moolenaar      export def Func()
2088eef2102eSBram Moolenaar        echo 'imported'
2089eef2102eSBram Moolenaar      enddef
2090eef2102eSBram Moolenaar  END
2091eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
2092eef2102eSBram Moolenaar
2093cfcd011fSBram Moolenaar  var lines =<< trim END
2094eef2102eSBram Moolenaar    vim9script
2095eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2096eef2102eSBram Moolenaar    def Func()
2097eef2102eSBram Moolenaar      echo 'local to function'
2098eef2102eSBram Moolenaar    enddef
2099eef2102eSBram Moolenaar  END
2100eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2101eef2102eSBram Moolenaar
2102eef2102eSBram Moolenaar  lines =<< trim END
2103eef2102eSBram Moolenaar    vim9script
2104eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2105eef2102eSBram Moolenaar    def Outer()
2106eef2102eSBram Moolenaar      def Func()
2107eef2102eSBram Moolenaar        echo 'local to function'
2108eef2102eSBram Moolenaar      enddef
2109eef2102eSBram Moolenaar    enddef
2110eef2102eSBram Moolenaar    defcompile
2111eef2102eSBram Moolenaar  END
2112eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2113eef2102eSBram Moolenaar
2114eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
2115eef2102eSBram Moolenaarenddef
2116eef2102eSBram Moolenaar
2117b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
2118cfcd011fSBram Moolenaar  var lines =<< trim END
2119b9a2cac3SBram Moolenaar    vim9script
2120b9a2cac3SBram Moolenaar    def Func()
2121b9a2cac3SBram Moolenaar      echo 'one'
2122b9a2cac3SBram Moolenaar    enddef
2123b9a2cac3SBram Moolenaar    def Func()
2124b9a2cac3SBram Moolenaar      echo 'two'
2125b9a2cac3SBram Moolenaar    enddef
2126b9a2cac3SBram Moolenaar  END
2127b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2128fa211f3cSBram Moolenaar
2129fa211f3cSBram Moolenaar  lines =<< trim END
2130fa211f3cSBram Moolenaar    vim9script
2131fa211f3cSBram Moolenaar    def Foo(): string
2132fa211f3cSBram Moolenaar      return 'foo'
2133fa211f3cSBram Moolenaar      enddef
2134fa211f3cSBram Moolenaar    def Func()
2135cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
2136fa211f3cSBram Moolenaar    enddef
2137fa211f3cSBram Moolenaar    defcompile
2138fa211f3cSBram Moolenaar  END
2139fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2140b9a2cac3SBram Moolenaarenddef
2141b9a2cac3SBram Moolenaar
21428a7d6542SBram Moolenaardef Test_fixed_size_list()
2143f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
2144cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
21458a7d6542SBram Moolenaar  l->remove(0)
21468a7d6542SBram Moolenaar  l->add(5)
21478a7d6542SBram Moolenaar  l->insert(99, 1)
21480f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
21498a7d6542SBram Moolenaarenddef
21508a7d6542SBram Moolenaar
2151ae616494SBram Moolenaardef Test_no_insert_xit()
2152d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2153d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2154d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2155d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2156d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2157ae616494SBram Moolenaar
2158ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2159ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2160ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2161ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2162f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2163f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
21646508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
21656508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
2166f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2167f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2168f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2169ae616494SBram Moolenaarenddef
2170ae616494SBram Moolenaar
2171158906cfSBram Moolenaardef IfElse(what: number): string
2172cfcd011fSBram Moolenaar  var res = ''
2173158906cfSBram Moolenaar  if what == 1
2174158906cfSBram Moolenaar    res = "one"
2175158906cfSBram Moolenaar  elseif what == 2
2176158906cfSBram Moolenaar    res = "two"
2177a259d8d3SBram Moolenaar  else
2178158906cfSBram Moolenaar    res = "three"
2179a259d8d3SBram Moolenaar  endif
2180158906cfSBram Moolenaar  return res
2181a259d8d3SBram Moolenaarenddef
2182a259d8d3SBram Moolenaar
2183158906cfSBram Moolenaardef Test_if_elseif_else()
2184158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2185158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2186158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
21870f18b6d1SBram Moolenaarenddef
21880f18b6d1SBram Moolenaar
2189e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2190d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2191d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2192d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2193ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
2194d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
21956628b7ebSBram Moolenaar
21966628b7ebSBram Moolenaar  var lines =<< trim END
21976628b7ebSBram Moolenaar      var s = ''
21986628b7ebSBram Moolenaar      if s = ''
21996628b7ebSBram Moolenaar      endif
22006628b7ebSBram Moolenaar  END
22016628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
22026628b7ebSBram Moolenaar
22036628b7ebSBram Moolenaar  lines =<< trim END
22046628b7ebSBram Moolenaar      var s = ''
22056628b7ebSBram Moolenaar      if s == ''
22066628b7ebSBram Moolenaar      elseif s = ''
22076628b7ebSBram Moolenaar      endif
22086628b7ebSBram Moolenaar  END
22096628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2210e8c4abbbSBram Moolenaarenddef
2211e8c4abbbSBram Moolenaar
22126d69bf60SBram Moolenaarlet g:bool_true = v:true
22136d69bf60SBram Moolenaarlet g:bool_false = v:false
22146d69bf60SBram Moolenaar
22156d69bf60SBram Moolenaardef Test_if_const_expr()
2216cfcd011fSBram Moolenaar  var res = false
22176d69bf60SBram Moolenaar  if true ? true : false
22186d69bf60SBram Moolenaar    res = true
22196d69bf60SBram Moolenaar  endif
22206d69bf60SBram Moolenaar  assert_equal(true, res)
22216d69bf60SBram Moolenaar
2222585fea7bSBram Moolenaar  g:glob = 2
2223585fea7bSBram Moolenaar  if false
22246797966dSBram Moolenaar    execute('g:glob = 3')
2225585fea7bSBram Moolenaar  endif
2226585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2227585fea7bSBram Moolenaar  if true
22286797966dSBram Moolenaar    execute('g:glob = 3')
2229585fea7bSBram Moolenaar  endif
2230585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2231585fea7bSBram Moolenaar
22326d69bf60SBram Moolenaar  res = false
22336d69bf60SBram Moolenaar  if g:bool_true ? true : false
22346d69bf60SBram Moolenaar    res = true
22356d69bf60SBram Moolenaar  endif
22366d69bf60SBram Moolenaar  assert_equal(true, res)
22376d69bf60SBram Moolenaar
22386d69bf60SBram Moolenaar  res = false
22396d69bf60SBram Moolenaar  if true ? g:bool_true : false
22406d69bf60SBram Moolenaar    res = true
22416d69bf60SBram Moolenaar  endif
22426d69bf60SBram Moolenaar  assert_equal(true, res)
22436d69bf60SBram Moolenaar
22446d69bf60SBram Moolenaar  res = false
22456d69bf60SBram Moolenaar  if true ? true : g:bool_false
22466d69bf60SBram Moolenaar    res = true
22476d69bf60SBram Moolenaar  endif
22486d69bf60SBram Moolenaar  assert_equal(true, res)
22496d69bf60SBram Moolenaar
22506d69bf60SBram Moolenaar  res = false
22516d69bf60SBram Moolenaar  if true ? false : true
22526d69bf60SBram Moolenaar    res = true
22536d69bf60SBram Moolenaar  endif
22546d69bf60SBram Moolenaar  assert_equal(false, res)
22556d69bf60SBram Moolenaar
22566d69bf60SBram Moolenaar  res = false
22576d69bf60SBram Moolenaar  if false ? false : true
22586d69bf60SBram Moolenaar    res = true
22596d69bf60SBram Moolenaar  endif
22606d69bf60SBram Moolenaar  assert_equal(true, res)
22616d69bf60SBram Moolenaar
22626d69bf60SBram Moolenaar  res = false
22636d69bf60SBram Moolenaar  if false ? true : false
22646d69bf60SBram Moolenaar    res = true
22656d69bf60SBram Moolenaar  endif
22666d69bf60SBram Moolenaar  assert_equal(false, res)
22676d69bf60SBram Moolenaar
22686d69bf60SBram Moolenaar  res = false
2269e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2270e8c4abbbSBram Moolenaar    res = true
2271e8c4abbbSBram Moolenaar  endif
2272e8c4abbbSBram Moolenaar  assert_equal(false, res)
2273e8c4abbbSBram Moolenaar
2274e8c4abbbSBram Moolenaar  res = false
22756d69bf60SBram Moolenaar  if true && true
22766d69bf60SBram Moolenaar    res = true
22776d69bf60SBram Moolenaar  endif
22786d69bf60SBram Moolenaar  assert_equal(true, res)
22796d69bf60SBram Moolenaar
22806d69bf60SBram Moolenaar  res = false
22816d69bf60SBram Moolenaar  if true && false
22826d69bf60SBram Moolenaar    res = true
22836d69bf60SBram Moolenaar  endif
22846d69bf60SBram Moolenaar  assert_equal(false, res)
22856d69bf60SBram Moolenaar
22866d69bf60SBram Moolenaar  res = false
22876d69bf60SBram Moolenaar  if g:bool_true && false
22886d69bf60SBram Moolenaar    res = true
22896d69bf60SBram Moolenaar  endif
22906d69bf60SBram Moolenaar  assert_equal(false, res)
22916d69bf60SBram Moolenaar
22926d69bf60SBram Moolenaar  res = false
22936d69bf60SBram Moolenaar  if true && g:bool_false
22946d69bf60SBram Moolenaar    res = true
22956d69bf60SBram Moolenaar  endif
22966d69bf60SBram Moolenaar  assert_equal(false, res)
22976d69bf60SBram Moolenaar
22986d69bf60SBram Moolenaar  res = false
22996d69bf60SBram Moolenaar  if false && false
23006d69bf60SBram Moolenaar    res = true
23016d69bf60SBram Moolenaar  endif
23026d69bf60SBram Moolenaar  assert_equal(false, res)
23036d69bf60SBram Moolenaar
23046d69bf60SBram Moolenaar  res = false
23056d69bf60SBram Moolenaar  if true || false
23066d69bf60SBram Moolenaar    res = true
23076d69bf60SBram Moolenaar  endif
23086d69bf60SBram Moolenaar  assert_equal(true, res)
23096d69bf60SBram Moolenaar
23106d69bf60SBram Moolenaar  res = false
23116d69bf60SBram Moolenaar  if g:bool_true || false
23126d69bf60SBram Moolenaar    res = true
23136d69bf60SBram Moolenaar  endif
23146d69bf60SBram Moolenaar  assert_equal(true, res)
23156d69bf60SBram Moolenaar
23166d69bf60SBram Moolenaar  res = false
23176d69bf60SBram Moolenaar  if true || g:bool_false
23186d69bf60SBram Moolenaar    res = true
23196d69bf60SBram Moolenaar  endif
23206d69bf60SBram Moolenaar  assert_equal(true, res)
23216d69bf60SBram Moolenaar
23226d69bf60SBram Moolenaar  res = false
23236d69bf60SBram Moolenaar  if false || false
23246d69bf60SBram Moolenaar    res = true
23256d69bf60SBram Moolenaar  endif
23266d69bf60SBram Moolenaar  assert_equal(false, res)
23273988f64fSBram Moolenaar
23283988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
2329c323527dSBram Moolenaar  if false | eval 1 + 2 | endif
23303988f64fSBram Moolenaar  if false | eval burp + 234 | endif
23313988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
23323988f64fSBram Moolenaar  if false
23333988f64fSBram Moolenaar    burp
23343988f64fSBram Moolenaar  endif
233580c34ca3SBram Moolenaarenddef
23366d69bf60SBram Moolenaar
233780c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2338d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2339d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2340d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2341d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
23426d69bf60SBram Moolenaarenddef
23436d69bf60SBram Moolenaar
234472abcf42SBram Moolenaardef RunNested(i: number): number
2345cfcd011fSBram Moolenaar  var x: number = 0
234672abcf42SBram Moolenaar  if i % 2
234772abcf42SBram Moolenaar    if 1
2348f5be8cdbSBram Moolenaar      # comment
234972abcf42SBram Moolenaar    else
2350f5be8cdbSBram Moolenaar      # comment
235172abcf42SBram Moolenaar    endif
235272abcf42SBram Moolenaar    x += 1
235372abcf42SBram Moolenaar  else
235472abcf42SBram Moolenaar    x += 1000
235572abcf42SBram Moolenaar  endif
235672abcf42SBram Moolenaar  return x
235772abcf42SBram Moolenaarenddef
235872abcf42SBram Moolenaar
235972abcf42SBram Moolenaardef Test_nested_if()
236072abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
236172abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
236272abcf42SBram Moolenaarenddef
236372abcf42SBram Moolenaar
2364ad39c094SBram Moolenaardef Test_execute_cmd()
2365e4984290SBram Moolenaar  # missing argument is ignored
2366e4984290SBram Moolenaar  execute
2367e4984290SBram Moolenaar  execute # comment
2368e4984290SBram Moolenaar
2369ad39c094SBram Moolenaar  new
2370ad39c094SBram Moolenaar  setline(1, 'default')
2371d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2372ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2373a72cfb80SBram Moolenaar
2374d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2375a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2376a72cfb80SBram Moolenaar
2377cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2378cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2379a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2380ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2381a72cfb80SBram Moolenaar
2382d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2383ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2384a72cfb80SBram Moolenaar
2385cfcd011fSBram Moolenaar  var cmd_first = 'call '
2386cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2387ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2388ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2389ad39c094SBram Moolenaar  bwipe!
2390585fea7bSBram Moolenaar
2391cfcd011fSBram Moolenaar  var n = true
23922d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
23932d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
23942d6b20d6SBram Moolenaar
2395e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2396e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2397e5abf7afSBram Moolenaar
2398d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2399d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2400d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2401ad39c094SBram Moolenaarenddef
2402ad39c094SBram Moolenaar
240347e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2404f5be8cdbSBram Moolenaar  # only checks line continuation
2405cfcd011fSBram Moolenaar  var lines =<< trim END
240647e880d6SBram Moolenaar      vim9script
240747e880d6SBram Moolenaar      execute 'g:someVar'
240847e880d6SBram Moolenaar                .. ' = ' ..
240947e880d6SBram Moolenaar                   '28'
241047e880d6SBram Moolenaar      assert_equal(28, g:someVar)
241147e880d6SBram Moolenaar      unlet g:someVar
241247e880d6SBram Moolenaar  END
241347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
241447e880d6SBram Moolenaarenddef
241547e880d6SBram Moolenaar
2416ad39c094SBram Moolenaardef Test_echo_cmd()
2417a72cfb80SBram Moolenaar  echo 'some' # comment
2418585fea7bSBram Moolenaar  echon 'thing'
2419ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2420ad39c094SBram Moolenaar
2421a72cfb80SBram Moolenaar  echo "some" # comment
2422a72cfb80SBram Moolenaar  echon "thing"
2423a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2424a72cfb80SBram Moolenaar
2425cfcd011fSBram Moolenaar  var str1 = 'some'
2426cfcd011fSBram Moolenaar  var str2 = 'more'
2427ad39c094SBram Moolenaar  echo str1 str2
2428ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2429a72cfb80SBram Moolenaar
2430d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2431ad39c094SBram Moolenaarenddef
2432ad39c094SBram Moolenaar
2433f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2434f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2435f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2436f93c7feaSBram Moolenaar  echo 'clear'
2437df069eecSBram Moolenaar  :1messages
2438f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2439f93c7feaSBram Moolenaar
2440d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2441f93c7feaSBram Moolenaarenddef
2442f93c7feaSBram Moolenaar
244347e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2444f5be8cdbSBram Moolenaar  # only checks line continuation
2445cfcd011fSBram Moolenaar  var lines =<< trim END
244647e880d6SBram Moolenaar      vim9script
244747e880d6SBram Moolenaar      echomsg 'here'
244847e880d6SBram Moolenaar                .. ' is ' ..
244947e880d6SBram Moolenaar                   'a message'
245047e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
245147e880d6SBram Moolenaar  END
245247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
245347e880d6SBram Moolenaarenddef
245447e880d6SBram Moolenaar
2455f93c7feaSBram Moolenaardef Test_echoerr_cmd()
245640ee466cSBram Moolenaar  try
245740ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
245840ee466cSBram Moolenaar  catch
245940ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
246040ee466cSBram Moolenaar  endtry
2461f93c7feaSBram Moolenaarenddef
2462f93c7feaSBram Moolenaar
246347e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2464f5be8cdbSBram Moolenaar  # only checks line continuation
2465cfcd011fSBram Moolenaar  var lines =<< trim END
246647e880d6SBram Moolenaar      vim9script
246747e880d6SBram Moolenaar      try
246847e880d6SBram Moolenaar        echoerr 'this'
246947e880d6SBram Moolenaar                .. ' is ' ..
247047e880d6SBram Moolenaar                   'wrong'
247147e880d6SBram Moolenaar      catch
247247e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
247347e880d6SBram Moolenaar      endtry
247447e880d6SBram Moolenaar  END
247547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
247647e880d6SBram Moolenaarenddef
247747e880d6SBram Moolenaar
247841fe0617SBram Moolenaardef Test_for_outside_of_function()
2479cfcd011fSBram Moolenaar  var lines =<< trim END
248041fe0617SBram Moolenaar    vim9script
248141fe0617SBram Moolenaar    new
248241fe0617SBram Moolenaar    for var in range(0, 3)
248341fe0617SBram Moolenaar      append(line('$'), var)
248441fe0617SBram Moolenaar    endfor
248541fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
248641fe0617SBram Moolenaar    bwipe!
2487522eefd9SBram Moolenaar
2488522eefd9SBram Moolenaar    var result = ''
2489522eefd9SBram Moolenaar    for i in [1, 2, 3]
2490522eefd9SBram Moolenaar      var loop = ' loop ' .. i
2491522eefd9SBram Moolenaar      result ..= loop
2492522eefd9SBram Moolenaar    endfor
2493522eefd9SBram Moolenaar    assert_equal(' loop 1 loop 2 loop 3', result)
249441fe0617SBram Moolenaar  END
249541fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
249641fe0617SBram Moolenaar  source Xvim9for.vim
249741fe0617SBram Moolenaar  delete('Xvim9for.vim')
249841fe0617SBram Moolenaarenddef
24998a7d6542SBram Moolenaar
2500e8c4abbbSBram Moolenaardef Test_for_loop()
2501f2253963SBram Moolenaar  var lines =<< trim END
2502cfcd011fSBram Moolenaar      var result = ''
2503e8c4abbbSBram Moolenaar      for cnt in range(7)
2504e8c4abbbSBram Moolenaar        if cnt == 4
2505e8c4abbbSBram Moolenaar          break
2506e8c4abbbSBram Moolenaar        endif
2507e8c4abbbSBram Moolenaar        if cnt == 2
2508e8c4abbbSBram Moolenaar          continue
2509e8c4abbbSBram Moolenaar        endif
2510e8c4abbbSBram Moolenaar        result ..= cnt .. '_'
2511e8c4abbbSBram Moolenaar      endfor
2512e8c4abbbSBram Moolenaar      assert_equal('0_1_3_', result)
25130ad3e894SBram Moolenaar
2514cfcd011fSBram Moolenaar      var concat = ''
25150ad3e894SBram Moolenaar      for str in eval('["one", "two"]')
25160ad3e894SBram Moolenaar        concat ..= str
25170ad3e894SBram Moolenaar      endfor
25180ad3e894SBram Moolenaar      assert_equal('onetwo', concat)
251938bd8de5SBram Moolenaar
252038bd8de5SBram Moolenaar      var total = 0
252138bd8de5SBram Moolenaar      for nr in
252238bd8de5SBram Moolenaar          [1, 2, 3]
252338bd8de5SBram Moolenaar        total += nr
252438bd8de5SBram Moolenaar      endfor
252538bd8de5SBram Moolenaar      assert_equal(6, total)
252638bd8de5SBram Moolenaar
252738bd8de5SBram Moolenaar      total = 0
252838bd8de5SBram Moolenaar      for nr
252938bd8de5SBram Moolenaar        in [1, 2, 3]
253038bd8de5SBram Moolenaar        total += nr
253138bd8de5SBram Moolenaar      endfor
253238bd8de5SBram Moolenaar      assert_equal(6, total)
253338bd8de5SBram Moolenaar
253438bd8de5SBram Moolenaar      total = 0
253538bd8de5SBram Moolenaar      for nr
253638bd8de5SBram Moolenaar        in
253738bd8de5SBram Moolenaar        [1, 2, 3]
253838bd8de5SBram Moolenaar        total += nr
253938bd8de5SBram Moolenaar      endfor
254038bd8de5SBram Moolenaar      assert_equal(6, total)
2541036d0714SBram Moolenaar
2542a3589a0dSBram Moolenaar      # with type
2543a3589a0dSBram Moolenaar      total = 0
2544a3589a0dSBram Moolenaar      for n: number in [1, 2, 3]
2545a3589a0dSBram Moolenaar        total += n
2546a3589a0dSBram Moolenaar      endfor
2547a3589a0dSBram Moolenaar      assert_equal(6, total)
2548a3589a0dSBram Moolenaar
2549fe090eb5SBram Moolenaar      var chars = ''
2550fe090eb5SBram Moolenaar      for s: string in 'foobar'
2551fe090eb5SBram Moolenaar        chars ..= s
2552fe090eb5SBram Moolenaar      endfor
2553fe090eb5SBram Moolenaar      assert_equal('foobar', chars)
2554fe090eb5SBram Moolenaar
25555ede5b23SBram Moolenaar      chars = ''
25565ede5b23SBram Moolenaar      for x: string in {a: 'a', b: 'b'}->values()
25575ede5b23SBram Moolenaar        chars ..= x
25585ede5b23SBram Moolenaar      endfor
25595ede5b23SBram Moolenaar      assert_equal('ab', chars)
25605ede5b23SBram Moolenaar
2561a3589a0dSBram Moolenaar      # unpack with type
2562f2253963SBram Moolenaar      var res = ''
2563a3589a0dSBram Moolenaar      for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2564a3589a0dSBram Moolenaar        res ..= n .. s
2565a3589a0dSBram Moolenaar      endfor
2566a3589a0dSBram Moolenaar      assert_equal('1a2b', res)
2567a3589a0dSBram Moolenaar
2568444d8783SBram Moolenaar      # unpack with one var
2569444d8783SBram Moolenaar      var reslist = []
2570444d8783SBram Moolenaar      for [x] in [['aaa'], ['bbb']]
2571444d8783SBram Moolenaar        reslist->add(x)
2572444d8783SBram Moolenaar      endfor
2573444d8783SBram Moolenaar      assert_equal(['aaa', 'bbb'], reslist)
2574444d8783SBram Moolenaar
2575a3589a0dSBram Moolenaar      # loop over string
2576a3589a0dSBram Moolenaar      res = ''
257774e54fcbSBram Moolenaar      for c in 'aéc̀d'
257874e54fcbSBram Moolenaar        res ..= c .. '-'
257974e54fcbSBram Moolenaar      endfor
258074e54fcbSBram Moolenaar      assert_equal('a-é-c̀-d-', res)
258174e54fcbSBram Moolenaar
258274e54fcbSBram Moolenaar      res = ''
258374e54fcbSBram Moolenaar      for c in ''
258474e54fcbSBram Moolenaar        res ..= c .. '-'
258574e54fcbSBram Moolenaar      endfor
258674e54fcbSBram Moolenaar      assert_equal('', res)
258774e54fcbSBram Moolenaar
258874e54fcbSBram Moolenaar      res = ''
258974e54fcbSBram Moolenaar      for c in test_null_string()
259074e54fcbSBram Moolenaar        res ..= c .. '-'
259174e54fcbSBram Moolenaar      endfor
259274e54fcbSBram Moolenaar      assert_equal('', res)
2593f2253963SBram Moolenaar
2594f2253963SBram Moolenaar      var foo: list<dict<any>> = [
2595f2253963SBram Moolenaar              {a: 'Cat'}
2596f2253963SBram Moolenaar            ]
2597f2253963SBram Moolenaar      for dd in foo
2598f2253963SBram Moolenaar        dd.counter = 12
2599f2253963SBram Moolenaar      endfor
2600f2253963SBram Moolenaar      assert_equal([{a: 'Cat', counter: 12}], foo)
2601ad2d4969SBram Moolenaar
2602ad2d4969SBram Moolenaar      reslist = []
2603ad2d4969SBram Moolenaar      for _ in range(3)
2604ad2d4969SBram Moolenaar        reslist->add('x')
2605ad2d4969SBram Moolenaar      endfor
2606ad2d4969SBram Moolenaar      assert_equal(['x', 'x', 'x'], reslist)
2607f2253963SBram Moolenaar  END
2608f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2609e8c4abbbSBram Moolenaarenddef
2610e8c4abbbSBram Moolenaar
26112eb6fc3bSBram Moolenaardef Test_for_loop_with_closure()
26122eb6fc3bSBram Moolenaar  var lines =<< trim END
26132eb6fc3bSBram Moolenaar      var flist: list<func>
26142eb6fc3bSBram Moolenaar      for i in range(5)
26152eb6fc3bSBram Moolenaar        var inloop = i
26162eb6fc3bSBram Moolenaar        flist[i] = () => inloop
26172eb6fc3bSBram Moolenaar      endfor
26182eb6fc3bSBram Moolenaar      for i in range(5)
26192eb6fc3bSBram Moolenaar        assert_equal(4, flist[i]())
26202eb6fc3bSBram Moolenaar      endfor
26212eb6fc3bSBram Moolenaar  END
26222eb6fc3bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
26232eb6fc3bSBram Moolenaar
26242eb6fc3bSBram Moolenaar  lines =<< trim END
26252eb6fc3bSBram Moolenaar      var flist: list<func>
26262eb6fc3bSBram Moolenaar      for i in range(5)
26272eb6fc3bSBram Moolenaar        var inloop = i
26282eb6fc3bSBram Moolenaar        flist[i] = () => {
26292eb6fc3bSBram Moolenaar              return inloop
26302eb6fc3bSBram Moolenaar            }
26312eb6fc3bSBram Moolenaar      endfor
26322eb6fc3bSBram Moolenaar      for i in range(5)
26332eb6fc3bSBram Moolenaar        assert_equal(4, flist[i]())
26342eb6fc3bSBram Moolenaar      endfor
26352eb6fc3bSBram Moolenaar  END
26362eb6fc3bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
26372eb6fc3bSBram Moolenaarenddef
26382eb6fc3bSBram Moolenaar
2639e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2640442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:')
2641442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:')
2642442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:')
2643442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2644442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2645442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:')
2646d4ab807dSBram Moolenaar  CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2647822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
26482d870f8dSBram Moolenaar  delfunc! g:Func
2649675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2650675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2651675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
265274e54fcbSBram Moolenaar
265374e54fcbSBram Moolenaar  # wrong type detected at compile time
265474e54fcbSBram Moolenaar  CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
265574e54fcbSBram Moolenaar
265674e54fcbSBram Moolenaar  # wrong type detected at runtime
265774e54fcbSBram Moolenaar  g:adict = {a: 1}
265874e54fcbSBram Moolenaar  CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
265974e54fcbSBram Moolenaar  unlet g:adict
2660f6a8d420SBram Moolenaar
2661f6a8d420SBram Moolenaar  var lines =<< trim END
2662f6a8d420SBram Moolenaar      var d: list<dict<any>> = [{a: 0}]
2663f6a8d420SBram Moolenaar      for e in d
2664f6a8d420SBram Moolenaar        e = {a: 0, b: ''}
2665f6a8d420SBram Moolenaar      endfor
2666f6a8d420SBram Moolenaar  END
2667f6a8d420SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3)
2668fe090eb5SBram Moolenaar
2669fe090eb5SBram Moolenaar  lines =<< trim END
2670fe090eb5SBram Moolenaar      for nr: number in ['foo']
2671fe090eb5SBram Moolenaar      endfor
2672fe090eb5SBram Moolenaar  END
2673fe090eb5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2674404557e6SBram Moolenaar
2675404557e6SBram Moolenaar  lines =<< trim END
2676404557e6SBram Moolenaar      for n : number in [1, 2]
2677404557e6SBram Moolenaar        echo n
2678404557e6SBram Moolenaar      endfor
2679404557e6SBram Moolenaar  END
2680404557e6SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1059:', 1)
2681efc5db52SBram Moolenaar
2682efc5db52SBram Moolenaar  lines =<< trim END
2683efc5db52SBram Moolenaar      var d: dict<number> = {a: 1, b: 2}
2684efc5db52SBram Moolenaar      for [k: job, v: job] in d->items()
2685efc5db52SBram Moolenaar        echo k v
2686efc5db52SBram Moolenaar      endfor
2687efc5db52SBram Moolenaar  END
2688efc5db52SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2)
2689e8c4abbbSBram Moolenaarenddef
2690e8c4abbbSBram Moolenaar
2691ea87069dSBram Moolenaardef Test_for_loop_script_var()
2692ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2693ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2694ea87069dSBram Moolenaar
2695ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2696ea87069dSBram Moolenaar  var lines =<< trim END
2697ea87069dSBram Moolenaar    vim9script
2698ea87069dSBram Moolenaar    var total = 0
2699ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2700ea87069dSBram Moolenaar      total += s:var
2701ea87069dSBram Moolenaar    endfor
2702ea87069dSBram Moolenaar    assert_equal(6, total)
2703ea87069dSBram Moolenaar
2704ea87069dSBram Moolenaar    total = 0
2705ea87069dSBram Moolenaar    for var in [1, 2, 3]
2706ea87069dSBram Moolenaar      total += var
2707ea87069dSBram Moolenaar    endfor
2708ea87069dSBram Moolenaar    assert_equal(6, total)
2709ea87069dSBram Moolenaar  END
2710ea87069dSBram Moolenaarenddef
2711ea87069dSBram Moolenaar
2712792f786aSBram Moolenaardef Test_for_loop_unpack()
27134b8a0651SBram Moolenaar  var lines =<< trim END
2714792f786aSBram Moolenaar      var result = []
2715792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2716792f786aSBram Moolenaar        result->add(v1)
2717792f786aSBram Moolenaar        result->add(v2)
2718792f786aSBram Moolenaar      endfor
2719792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2720792f786aSBram Moolenaar
2721792f786aSBram Moolenaar      result = []
2722792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2723792f786aSBram Moolenaar        result->add(v1)
2724792f786aSBram Moolenaar        result->add(v2)
2725792f786aSBram Moolenaar        result->add(v3)
2726792f786aSBram Moolenaar      endfor
2727792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2728792f786aSBram Moolenaar
27294b8a0651SBram Moolenaar      result = []
27304b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
27314b8a0651SBram Moolenaar        result->add(&ts)
27324b8a0651SBram Moolenaar        result->add(&sw)
27334b8a0651SBram Moolenaar      endfor
27344b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
27354b8a0651SBram Moolenaar
27364b8a0651SBram Moolenaar      var slist: list<string>
27374b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
27384b8a0651SBram Moolenaar        slist->add($LOOPVAR)
27394b8a0651SBram Moolenaar        slist->add(@r)
27404b8a0651SBram Moolenaar        slist->add(v:errmsg)
27414b8a0651SBram Moolenaar      endfor
27424b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
27434b8a0651SBram Moolenaar
27444b8a0651SBram Moolenaar      slist = []
27454b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
27464b8a0651SBram Moolenaar        slist->add(g:globalvar)
27474b8a0651SBram Moolenaar        slist->add(b:bufvar)
27484b8a0651SBram Moolenaar        slist->add(w:winvar)
27494b8a0651SBram Moolenaar        slist->add(t:tabvar)
27504b8a0651SBram Moolenaar      endfor
27514b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2752f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
2753b777da9bSBram Moolenaar
2754b777da9bSBram Moolenaar      var res = []
2755b777da9bSBram Moolenaar      for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2756b777da9bSBram Moolenaar        res->add(n)
2757b777da9bSBram Moolenaar      endfor
2758b777da9bSBram Moolenaar      assert_equal([2, 5], res)
27594b8a0651SBram Moolenaar  END
27604b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
27614b8a0651SBram Moolenaar
27624b8a0651SBram Moolenaar  lines =<< trim END
2763792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2764792f786aSBram Moolenaar        echo v1 v2
2765792f786aSBram Moolenaar      endfor
2766792f786aSBram Moolenaar  END
2767792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2768792f786aSBram Moolenaar
2769792f786aSBram Moolenaar  lines =<< trim END
2770792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2771792f786aSBram Moolenaar        echo v1 v2
2772792f786aSBram Moolenaar      endfor
2773792f786aSBram Moolenaar  END
2774792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2775792f786aSBram Moolenaar
2776792f786aSBram Moolenaar  lines =<< trim END
2777792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2778792f786aSBram Moolenaar        echo v1
2779792f786aSBram Moolenaar      endfor
2780792f786aSBram Moolenaar  END
2781792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2782792f786aSBram Moolenaarenddef
2783792f786aSBram Moolenaar
2784c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2785f2253963SBram Moolenaar  var lines =<< trim END
2786c150c09eSBram Moolenaar      var looped = 0
2787c150c09eSBram Moolenaar      var cleanup = 0
2788c150c09eSBram Moolenaar      for i in range(3)
2789c150c09eSBram Moolenaar        looped += 1
2790c150c09eSBram Moolenaar        try
2791c150c09eSBram Moolenaar          eval [][0]
2792c150c09eSBram Moolenaar        catch
2793c150c09eSBram Moolenaar          continue
2794c150c09eSBram Moolenaar        finally
2795c150c09eSBram Moolenaar          cleanup += 1
2796c150c09eSBram Moolenaar        endtry
2797c150c09eSBram Moolenaar      endfor
2798c150c09eSBram Moolenaar      assert_equal(3, looped)
2799c150c09eSBram Moolenaar      assert_equal(3, cleanup)
2800f2253963SBram Moolenaar  END
2801f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2802c150c09eSBram Moolenaarenddef
2803c150c09eSBram Moolenaar
2804d0df1aacSBram Moolenaardef Test_while_loop()
2805cfcd011fSBram Moolenaar  var result = ''
2806cfcd011fSBram Moolenaar  var cnt = 0
2807d0df1aacSBram Moolenaar  while cnt < 555
2808d0df1aacSBram Moolenaar    if cnt == 3
2809d0df1aacSBram Moolenaar      break
2810d0df1aacSBram Moolenaar    endif
2811d0df1aacSBram Moolenaar    cnt += 1
2812d0df1aacSBram Moolenaar    if cnt == 2
2813d0df1aacSBram Moolenaar      continue
2814d0df1aacSBram Moolenaar    endif
2815d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2816d0df1aacSBram Moolenaar  endwhile
2817d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2818dee37dc7SBram Moolenaar
2819dee37dc7SBram Moolenaar  var s = ''
28200123cc1eSBram Moolenaar  while s == 'x' # {comment}
2821dee37dc7SBram Moolenaar  endwhile
2822d0df1aacSBram Moolenaarenddef
2823d0df1aacSBram Moolenaar
2824e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2825675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2826675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2827675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2828675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2829675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2830675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2831675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
28326628b7ebSBram Moolenaar
28336628b7ebSBram Moolenaar  var lines =<< trim END
28346628b7ebSBram Moolenaar      var s = ''
28356628b7ebSBram Moolenaar      while s = ''
28366628b7ebSBram Moolenaar      endwhile
28376628b7ebSBram Moolenaar  END
28386628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2839bd5da371SBram Moolenaarenddef
2840bd5da371SBram Moolenaar
28419645e2d9SBram Moolenaardef Test_interrupt_loop()
2842cfcd011fSBram Moolenaar  var caught = false
2843cfcd011fSBram Moolenaar  var x = 0
284497acfc78SBram Moolenaar  try
28459645e2d9SBram Moolenaar    while 1
28469645e2d9SBram Moolenaar      x += 1
28479645e2d9SBram Moolenaar      if x == 100
28489645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
28499645e2d9SBram Moolenaar      endif
28509645e2d9SBram Moolenaar    endwhile
285197acfc78SBram Moolenaar  catch
285297acfc78SBram Moolenaar    caught = true
285397acfc78SBram Moolenaar    assert_equal(100, x)
285497acfc78SBram Moolenaar  endtry
285597acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
285625859dd7SBram Moolenaar  # consume the CTRL-C
285725859dd7SBram Moolenaar  getchar(0)
28589645e2d9SBram Moolenaarenddef
285920431c9dSBram Moolenaar
28604fdae999SBram Moolenaardef Test_automatic_line_continuation()
2861cfcd011fSBram Moolenaar  var mylist = [
28624fdae999SBram Moolenaar      'one',
28634fdae999SBram Moolenaar      'two',
28644fdae999SBram Moolenaar      'three',
2865f5be8cdbSBram Moolenaar      ] # comment
28664fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
28674fdae999SBram Moolenaar
2868cfcd011fSBram Moolenaar  var mydict = {
2869e0de171eSBram Moolenaar      ['one']: 1,
2870e0de171eSBram Moolenaar      ['two']: 2,
2871e0de171eSBram Moolenaar      ['three']:
28724fdae999SBram Moolenaar          3,
2873f5be8cdbSBram Moolenaar      } # comment
2874e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2875e0de171eSBram Moolenaar  mydict = {
28762c330432SBram Moolenaar      one: 1,  # comment
28772c330432SBram Moolenaar      two:     # comment
28782c330432SBram Moolenaar           2,  # comment
28792c330432SBram Moolenaar      three: 3 # comment
28802c330432SBram Moolenaar      }
2881e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2882e0de171eSBram Moolenaar  mydict = {
28832c330432SBram Moolenaar      one: 1,
28844fdae999SBram Moolenaar      two:
28854fdae999SBram Moolenaar           2,
28862c330432SBram Moolenaar      three: 3
28874fdae999SBram Moolenaar      }
2888e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2889e6085c53SBram Moolenaar
2890e6085c53SBram Moolenaar  assert_equal(
2891e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2892e6085c53SBram Moolenaar        split('one two three')
2893e6085c53SBram Moolenaar        )
28944fdae999SBram Moolenaarenddef
28954fdae999SBram Moolenaar
28967a092245SBram Moolenaardef Test_vim9_comment()
28977a092245SBram Moolenaar  CheckScriptSuccess([
28987a092245SBram Moolenaar      'vim9script',
28997a092245SBram Moolenaar      '# something',
290093f82cbeSBram Moolenaar      '#something',
290193f82cbeSBram Moolenaar      '#{something',
29027a092245SBram Moolenaar      ])
290393f82cbeSBram Moolenaar
290493f82cbeSBram Moolenaar  split Xfile
290593f82cbeSBram Moolenaar  CheckScriptSuccess([
290693f82cbeSBram Moolenaar      'vim9script',
290793f82cbeSBram Moolenaar      'edit #something',
290893f82cbeSBram Moolenaar      ])
290993f82cbeSBram Moolenaar  CheckScriptSuccess([
291093f82cbeSBram Moolenaar      'vim9script',
291193f82cbeSBram Moolenaar      'edit #{something',
291293f82cbeSBram Moolenaar      ])
291393f82cbeSBram Moolenaar  close
291493f82cbeSBram Moolenaar
29157a092245SBram Moolenaar  CheckScriptFailure([
29167a092245SBram Moolenaar      'vim9script',
29177a092245SBram Moolenaar      ':# something',
29187a092245SBram Moolenaar      ], 'E488:')
29197a092245SBram Moolenaar  CheckScriptFailure([
29207a092245SBram Moolenaar      '# something',
29217a092245SBram Moolenaar      ], 'E488:')
29227a092245SBram Moolenaar  CheckScriptFailure([
29237a092245SBram Moolenaar      ':# something',
29247a092245SBram Moolenaar      ], 'E488:')
29257a092245SBram Moolenaar
29264a8d9f2eSBram Moolenaar  { # block start
29274a8d9f2eSBram Moolenaar  } # block end
29284a8d9f2eSBram Moolenaar  CheckDefFailure([
29294a8d9f2eSBram Moolenaar      '{# comment',
29304a8d9f2eSBram Moolenaar      ], 'E488:')
29314a8d9f2eSBram Moolenaar  CheckDefFailure([
29324a8d9f2eSBram Moolenaar      '{',
29334a8d9f2eSBram Moolenaar      '}# comment',
29344a8d9f2eSBram Moolenaar      ], 'E488:')
29354a8d9f2eSBram Moolenaar
29364a8d9f2eSBram Moolenaar  echo "yes" # comment
29374a8d9f2eSBram Moolenaar  CheckDefFailure([
29384a8d9f2eSBram Moolenaar      'echo "yes"# comment',
29394a8d9f2eSBram Moolenaar      ], 'E488:')
29407a092245SBram Moolenaar  CheckScriptSuccess([
29417a092245SBram Moolenaar      'vim9script',
29427a092245SBram Moolenaar      'echo "yes" # something',
29437a092245SBram Moolenaar      ])
29447a092245SBram Moolenaar  CheckScriptFailure([
29457a092245SBram Moolenaar      'vim9script',
29467a092245SBram Moolenaar      'echo "yes"# something',
29477a092245SBram Moolenaar      ], 'E121:')
29487a092245SBram Moolenaar  CheckScriptFailure([
29497a092245SBram Moolenaar      'vim9script',
29507a092245SBram Moolenaar      'echo# something',
2951f8103f27SBram Moolenaar      ], 'E1144:')
29527a092245SBram Moolenaar  CheckScriptFailure([
29537a092245SBram Moolenaar      'echo "yes" # something',
29547a092245SBram Moolenaar      ], 'E121:')
29557a092245SBram Moolenaar
29564a8d9f2eSBram Moolenaar  exe "echo" # comment
29574a8d9f2eSBram Moolenaar  CheckDefFailure([
29584a8d9f2eSBram Moolenaar      'exe "echo"# comment',
29594a8d9f2eSBram Moolenaar      ], 'E488:')
29604a8d9f2eSBram Moolenaar  CheckScriptSuccess([
29614a8d9f2eSBram Moolenaar      'vim9script',
29624a8d9f2eSBram Moolenaar      'exe "echo" # something',
29634a8d9f2eSBram Moolenaar      ])
29644a8d9f2eSBram Moolenaar  CheckScriptFailure([
29654a8d9f2eSBram Moolenaar      'vim9script',
29664a8d9f2eSBram Moolenaar      'exe "echo"# something',
29674a8d9f2eSBram Moolenaar      ], 'E121:')
29684a8d9f2eSBram Moolenaar  CheckScriptFailure([
29694a8d9f2eSBram Moolenaar      'vim9script',
29704a8d9f2eSBram Moolenaar      'exe# something',
2971f8103f27SBram Moolenaar      ], 'E1144:')
29724a8d9f2eSBram Moolenaar  CheckScriptFailure([
29734a8d9f2eSBram Moolenaar      'exe "echo" # something',
29744a8d9f2eSBram Moolenaar      ], 'E121:')
29754a8d9f2eSBram Moolenaar
29767a092245SBram Moolenaar  CheckDefFailure([
29777a092245SBram Moolenaar      'try# comment',
29787a092245SBram Moolenaar      '  echo "yes"',
29797a092245SBram Moolenaar      'catch',
29807a092245SBram Moolenaar      'endtry',
2981f8103f27SBram Moolenaar      ], 'E1144:')
29822c5ed4e3SBram Moolenaar  CheckScriptFailure([
29832c5ed4e3SBram Moolenaar      'vim9script',
29842c5ed4e3SBram Moolenaar      'try# comment',
29852c5ed4e3SBram Moolenaar      'echo "yes"',
2986f8103f27SBram Moolenaar      ], 'E1144:')
29877a092245SBram Moolenaar  CheckDefFailure([
29887a092245SBram Moolenaar      'try',
2989a72cfb80SBram Moolenaar      '  throw#comment',
2990a72cfb80SBram Moolenaar      'catch',
2991a72cfb80SBram Moolenaar      'endtry',
2992f8103f27SBram Moolenaar      ], 'E1144:')
2993a72cfb80SBram Moolenaar  CheckDefFailure([
2994a72cfb80SBram Moolenaar      'try',
2995a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2996a72cfb80SBram Moolenaar      'catch',
2997a72cfb80SBram Moolenaar      'endtry',
2998a72cfb80SBram Moolenaar      ], 'E488:')
2999a72cfb80SBram Moolenaar  CheckDefFailure([
3000a72cfb80SBram Moolenaar      'try',
30017a092245SBram Moolenaar      '  echo "yes"',
30027a092245SBram Moolenaar      'catch# comment',
30037a092245SBram Moolenaar      'endtry',
3004f8103f27SBram Moolenaar      ], 'E1144:')
30052c5ed4e3SBram Moolenaar  CheckScriptFailure([
30062c5ed4e3SBram Moolenaar      'vim9script',
30072c5ed4e3SBram Moolenaar      'try',
30082c5ed4e3SBram Moolenaar      '  echo "yes"',
30092c5ed4e3SBram Moolenaar      'catch# comment',
30102c5ed4e3SBram Moolenaar      'endtry',
3011f8103f27SBram Moolenaar      ], 'E1144:')
30122c5ed4e3SBram Moolenaar  CheckDefFailure([
30132c5ed4e3SBram Moolenaar      'try',
30142c5ed4e3SBram Moolenaar      '  echo "yes"',
30152c5ed4e3SBram Moolenaar      'catch /pat/# comment',
30162c5ed4e3SBram Moolenaar      'endtry',
30172c5ed4e3SBram Moolenaar      ], 'E488:')
30187a092245SBram Moolenaar  CheckDefFailure([
30197a092245SBram Moolenaar      'try',
30207a092245SBram Moolenaar      'echo "yes"',
30217a092245SBram Moolenaar      'catch',
30227a092245SBram Moolenaar      'endtry# comment',
3023f8103f27SBram Moolenaar      ], 'E1144:')
30242c5ed4e3SBram Moolenaar  CheckScriptFailure([
30252c5ed4e3SBram Moolenaar      'vim9script',
30262c5ed4e3SBram Moolenaar      'try',
30272c5ed4e3SBram Moolenaar      '  echo "yes"',
30282c5ed4e3SBram Moolenaar      'catch',
30292c5ed4e3SBram Moolenaar      'endtry# comment',
3030f8103f27SBram Moolenaar      ], 'E1144:')
30312c5ed4e3SBram Moolenaar
30322c5ed4e3SBram Moolenaar  CheckScriptSuccess([
30332c5ed4e3SBram Moolenaar      'vim9script',
30342c5ed4e3SBram Moolenaar      'hi # comment',
30352c5ed4e3SBram Moolenaar      ])
30362c5ed4e3SBram Moolenaar  CheckScriptFailure([
30372c5ed4e3SBram Moolenaar      'vim9script',
30382c5ed4e3SBram Moolenaar      'hi# comment',
3039f8103f27SBram Moolenaar      ], 'E1144:')
30401966c248SBram Moolenaar  CheckScriptSuccess([
30411966c248SBram Moolenaar      'vim9script',
30421966c248SBram Moolenaar      'hi Search # comment',
30431966c248SBram Moolenaar      ])
30441966c248SBram Moolenaar  CheckScriptFailure([
30451966c248SBram Moolenaar      'vim9script',
30461966c248SBram Moolenaar      'hi Search# comment',
30471966c248SBram Moolenaar      ], 'E416:')
30481966c248SBram Moolenaar  CheckScriptSuccess([
30491966c248SBram Moolenaar      'vim9script',
30501966c248SBram Moolenaar      'hi link This Search # comment',
30511966c248SBram Moolenaar      ])
30521966c248SBram Moolenaar  CheckScriptFailure([
30531966c248SBram Moolenaar      'vim9script',
30541966c248SBram Moolenaar      'hi link This That# comment',
30551966c248SBram Moolenaar      ], 'E413:')
30561966c248SBram Moolenaar  CheckScriptSuccess([
30571966c248SBram Moolenaar      'vim9script',
30581966c248SBram Moolenaar      'hi clear This # comment',
30591966c248SBram Moolenaar      'hi clear # comment',
30601966c248SBram Moolenaar      ])
3061f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
3062f5be8cdbSBram Moolenaar  # hi clear This# comment',
30631966c248SBram Moolenaar  CheckScriptFailure([
30641966c248SBram Moolenaar      'vim9script',
30651966c248SBram Moolenaar      'hi clear# comment',
30661966c248SBram Moolenaar      ], 'E416:')
30671966c248SBram Moolenaar
30681966c248SBram Moolenaar  CheckScriptSuccess([
30691966c248SBram Moolenaar      'vim9script',
30701966c248SBram Moolenaar      'hi Group term=bold',
30711966c248SBram Moolenaar      'match Group /todo/ # comment',
30721966c248SBram Moolenaar      ])
30731966c248SBram Moolenaar  CheckScriptFailure([
30741966c248SBram Moolenaar      'vim9script',
30751966c248SBram Moolenaar      'hi Group term=bold',
30761966c248SBram Moolenaar      'match Group /todo/# comment',
30771966c248SBram Moolenaar      ], 'E488:')
30781966c248SBram Moolenaar  CheckScriptSuccess([
30791966c248SBram Moolenaar      'vim9script',
30801966c248SBram Moolenaar      'match # comment',
30811966c248SBram Moolenaar      ])
30821966c248SBram Moolenaar  CheckScriptFailure([
30831966c248SBram Moolenaar      'vim9script',
30841966c248SBram Moolenaar      'match# comment',
3085f8103f27SBram Moolenaar      ], 'E1144:')
30861966c248SBram Moolenaar  CheckScriptSuccess([
30871966c248SBram Moolenaar      'vim9script',
30881966c248SBram Moolenaar      'match none # comment',
30891966c248SBram Moolenaar      ])
30901966c248SBram Moolenaar  CheckScriptFailure([
30911966c248SBram Moolenaar      'vim9script',
30921966c248SBram Moolenaar      'match none# comment',
30931966c248SBram Moolenaar      ], 'E475:')
30941966c248SBram Moolenaar
30951966c248SBram Moolenaar  CheckScriptSuccess([
30961966c248SBram Moolenaar      'vim9script',
30971966c248SBram Moolenaar      'menutrans clear # comment',
30981966c248SBram Moolenaar      ])
30991966c248SBram Moolenaar  CheckScriptFailure([
31001966c248SBram Moolenaar      'vim9script',
31011966c248SBram Moolenaar      'menutrans clear# comment text',
31021966c248SBram Moolenaar      ], 'E474:')
31031966c248SBram Moolenaar
31041966c248SBram Moolenaar  CheckScriptSuccess([
31051966c248SBram Moolenaar      'vim9script',
31061966c248SBram Moolenaar      'syntax clear # comment',
31071966c248SBram Moolenaar      ])
31081966c248SBram Moolenaar  CheckScriptFailure([
31091966c248SBram Moolenaar      'vim9script',
31101966c248SBram Moolenaar      'syntax clear# comment text',
31111966c248SBram Moolenaar      ], 'E28:')
31121966c248SBram Moolenaar  CheckScriptSuccess([
31131966c248SBram Moolenaar      'vim9script',
31141966c248SBram Moolenaar      'syntax keyword Word some',
31151966c248SBram Moolenaar      'syntax clear Word # comment',
31161966c248SBram Moolenaar      ])
31171966c248SBram Moolenaar  CheckScriptFailure([
31181966c248SBram Moolenaar      'vim9script',
31191966c248SBram Moolenaar      'syntax keyword Word some',
31201966c248SBram Moolenaar      'syntax clear Word# comment text',
31211966c248SBram Moolenaar      ], 'E28:')
31221966c248SBram Moolenaar
31231966c248SBram Moolenaar  CheckScriptSuccess([
31241966c248SBram Moolenaar      'vim9script',
31251966c248SBram Moolenaar      'syntax list # comment',
31261966c248SBram Moolenaar      ])
31271966c248SBram Moolenaar  CheckScriptFailure([
31281966c248SBram Moolenaar      'vim9script',
31291966c248SBram Moolenaar      'syntax list# comment text',
31301966c248SBram Moolenaar      ], 'E28:')
31311966c248SBram Moolenaar
31321966c248SBram Moolenaar  CheckScriptSuccess([
31331966c248SBram Moolenaar      'vim9script',
31341966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
31351966c248SBram Moolenaar      ])
31361966c248SBram Moolenaar  CheckScriptFailure([
31371966c248SBram Moolenaar      'vim9script',
31381966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
31391966c248SBram Moolenaar      ], 'E475:')
31401966c248SBram Moolenaar
31411966c248SBram Moolenaar  CheckScriptSuccess([
31421966c248SBram Moolenaar      'vim9script',
31431966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
31441966c248SBram Moolenaar      ])
31451966c248SBram Moolenaar  CheckScriptFailure([
31461966c248SBram Moolenaar      'vim9script',
31471966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
31481966c248SBram Moolenaar      ], 'E789:')
31491966c248SBram Moolenaar
31501966c248SBram Moolenaar  CheckScriptSuccess([
31511966c248SBram Moolenaar      'vim9script',
31521966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
31531966c248SBram Moolenaar      ])
31541966c248SBram Moolenaar  CheckScriptFailure([
31551966c248SBram Moolenaar      'vim9script',
31561966c248SBram Moolenaar      'syntax match Word /pat/# comment',
31571966c248SBram Moolenaar      ], 'E402:')
31581966c248SBram Moolenaar
31591966c248SBram Moolenaar  CheckScriptSuccess([
31601966c248SBram Moolenaar      'vim9script',
31611966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
31621966c248SBram Moolenaar      ])
31631966c248SBram Moolenaar  CheckScriptFailure([
31641966c248SBram Moolenaar      'vim9script',
31651966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
31661966c248SBram Moolenaar      ], 'E475:')
31671966c248SBram Moolenaar  CheckScriptFailure([
31681966c248SBram Moolenaar      'vim9script',
31691966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
31701966c248SBram Moolenaar      ], 'E406:')
31711966c248SBram Moolenaar  CheckScriptFailure([
31721966c248SBram Moolenaar      'vim9script',
31731966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
31741966c248SBram Moolenaar      ], 'E475:')
31751966c248SBram Moolenaar
31761966c248SBram Moolenaar  CheckScriptSuccess([
31771966c248SBram Moolenaar      'vim9script',
31781966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
31791966c248SBram Moolenaar      ])
31801966c248SBram Moolenaar  CheckScriptFailure([
31811966c248SBram Moolenaar      'vim9script',
31821966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
3183d032f34aSBram Moolenaar      ], 'E402:')
31841966c248SBram Moolenaar
31851966c248SBram Moolenaar  CheckScriptSuccess([
31861966c248SBram Moolenaar      'vim9script',
31871966c248SBram Moolenaar      'syntax sync # comment',
31881966c248SBram Moolenaar      ])
31891966c248SBram Moolenaar  CheckScriptFailure([
31901966c248SBram Moolenaar      'vim9script',
31911966c248SBram Moolenaar      'syntax sync# comment',
31921966c248SBram Moolenaar      ], 'E404:')
31931966c248SBram Moolenaar  CheckScriptSuccess([
31941966c248SBram Moolenaar      'vim9script',
31951966c248SBram Moolenaar      'syntax sync ccomment # comment',
31961966c248SBram Moolenaar      ])
31971966c248SBram Moolenaar  CheckScriptFailure([
31981966c248SBram Moolenaar      'vim9script',
31991966c248SBram Moolenaar      'syntax sync ccomment# comment',
32001966c248SBram Moolenaar      ], 'E404:')
32011966c248SBram Moolenaar
32021966c248SBram Moolenaar  CheckScriptSuccess([
32031966c248SBram Moolenaar      'vim9script',
32041966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
32051966c248SBram Moolenaar      ])
32061966c248SBram Moolenaar  CheckScriptFailure([
32071966c248SBram Moolenaar      'vim9script',
32081966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
32091966c248SBram Moolenaar      ], 'E475:')
3210a72cfb80SBram Moolenaar
3211a72cfb80SBram Moolenaar  CheckScriptSuccess([
3212a72cfb80SBram Moolenaar      'vim9script',
3213a72cfb80SBram Moolenaar      'command Echo echo # comment',
3214a72cfb80SBram Moolenaar      'command Echo # comment',
32152d870f8dSBram Moolenaar      'delcommand Echo',
3216a72cfb80SBram Moolenaar      ])
3217a72cfb80SBram Moolenaar  CheckScriptFailure([
3218a72cfb80SBram Moolenaar      'vim9script',
3219a72cfb80SBram Moolenaar      'command Echo echo# comment',
3220a72cfb80SBram Moolenaar      'Echo',
3221f8103f27SBram Moolenaar      ], 'E1144:')
32222d870f8dSBram Moolenaar  delcommand Echo
322370249ee8SBram Moolenaar
322470249ee8SBram Moolenaar  var curdir = getcwd()
322570249ee8SBram Moolenaar  CheckScriptSuccess([
322670249ee8SBram Moolenaar      'command Echo cd " comment',
322770249ee8SBram Moolenaar      'Echo',
322870249ee8SBram Moolenaar      'delcommand Echo',
322970249ee8SBram Moolenaar      ])
323070249ee8SBram Moolenaar  CheckScriptSuccess([
3231090728adSBram Moolenaar      'vim9script',
323270249ee8SBram Moolenaar      'command Echo cd # comment',
323370249ee8SBram Moolenaar      'Echo',
323470249ee8SBram Moolenaar      'delcommand Echo',
323570249ee8SBram Moolenaar      ])
323670249ee8SBram Moolenaar  CheckScriptFailure([
323770249ee8SBram Moolenaar      'vim9script',
323870249ee8SBram Moolenaar      'command Echo cd " comment',
323970249ee8SBram Moolenaar      'Echo',
324070249ee8SBram Moolenaar      ], 'E344:')
324170249ee8SBram Moolenaar  delcommand Echo
324270249ee8SBram Moolenaar  chdir(curdir)
324370249ee8SBram Moolenaar
3244a72cfb80SBram Moolenaar  CheckScriptFailure([
3245a72cfb80SBram Moolenaar      'vim9script',
3246a72cfb80SBram Moolenaar      'command Echo# comment',
3247a72cfb80SBram Moolenaar      ], 'E182:')
3248a72cfb80SBram Moolenaar  CheckScriptFailure([
3249a72cfb80SBram Moolenaar      'vim9script',
3250a72cfb80SBram Moolenaar      'command Echo echo',
3251a72cfb80SBram Moolenaar      'command Echo# comment',
3252a72cfb80SBram Moolenaar      ], 'E182:')
32532d870f8dSBram Moolenaar  delcommand Echo
3254a72cfb80SBram Moolenaar
3255a72cfb80SBram Moolenaar  CheckScriptSuccess([
3256a72cfb80SBram Moolenaar      'vim9script',
3257a72cfb80SBram Moolenaar      'function # comment',
3258a72cfb80SBram Moolenaar      ])
3259a72cfb80SBram Moolenaar  CheckScriptFailure([
3260a72cfb80SBram Moolenaar      'vim9script',
32619898107fSBram Moolenaar      'function " comment',
32629898107fSBram Moolenaar      ], 'E129:')
32639898107fSBram Moolenaar  CheckScriptFailure([
32649898107fSBram Moolenaar      'vim9script',
3265a72cfb80SBram Moolenaar      'function# comment',
3266f8103f27SBram Moolenaar      ], 'E1144:')
3267a72cfb80SBram Moolenaar  CheckScriptSuccess([
3268a72cfb80SBram Moolenaar      'vim9script',
3269a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
3270a72cfb80SBram Moolenaar      ])
3271a72cfb80SBram Moolenaar  CheckScriptFailure([
3272a72cfb80SBram Moolenaar      'vim9script',
3273a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
3274a72cfb80SBram Moolenaar      ], 'E488:')
3275a72cfb80SBram Moolenaar
3276a72cfb80SBram Moolenaar  CheckScriptSuccess([
3277a72cfb80SBram Moolenaar      'vim9script',
32784c17ad94SBram Moolenaar      'func g:DeleteMeA()',
3279a72cfb80SBram Moolenaar      'endfunc',
32804c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
3281a72cfb80SBram Moolenaar      ])
3282a72cfb80SBram Moolenaar  CheckScriptFailure([
3283a72cfb80SBram Moolenaar      'vim9script',
32844c17ad94SBram Moolenaar      'func g:DeleteMeB()',
3285a72cfb80SBram Moolenaar      'endfunc',
32864c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
3287a72cfb80SBram Moolenaar      ], 'E488:')
3288a72cfb80SBram Moolenaar
3289a72cfb80SBram Moolenaar  CheckScriptSuccess([
3290a72cfb80SBram Moolenaar      'vim9script',
3291a72cfb80SBram Moolenaar      'call execute("ls") # comment',
3292a72cfb80SBram Moolenaar      ])
3293a72cfb80SBram Moolenaar  CheckScriptFailure([
3294a72cfb80SBram Moolenaar      'vim9script',
3295a72cfb80SBram Moolenaar      'call execute("ls")# comment',
3296a72cfb80SBram Moolenaar      ], 'E488:')
3297e7e4838fSBram Moolenaar
3298e7e4838fSBram Moolenaar  CheckScriptFailure([
3299e7e4838fSBram Moolenaar      'def Test() " comment',
3300e7e4838fSBram Moolenaar      'enddef',
3301e7e4838fSBram Moolenaar      ], 'E488:')
3302e7e4838fSBram Moolenaar  CheckScriptFailure([
3303e7e4838fSBram Moolenaar      'vim9script',
3304e7e4838fSBram Moolenaar      'def Test() " comment',
3305e7e4838fSBram Moolenaar      'enddef',
3306e7e4838fSBram Moolenaar      ], 'E488:')
3307e7e4838fSBram Moolenaar
3308e7e4838fSBram Moolenaar  CheckScriptSuccess([
3309e7e4838fSBram Moolenaar      'func Test() " comment',
3310e7e4838fSBram Moolenaar      'endfunc',
33112d870f8dSBram Moolenaar      'delfunc Test',
3312e7e4838fSBram Moolenaar      ])
33139898107fSBram Moolenaar  CheckScriptSuccess([
3314e7e4838fSBram Moolenaar      'vim9script',
3315e7e4838fSBram Moolenaar      'func Test() " comment',
3316e7e4838fSBram Moolenaar      'endfunc',
33179898107fSBram Moolenaar      ])
3318e7e4838fSBram Moolenaar
3319e7e4838fSBram Moolenaar  CheckScriptSuccess([
3320e7e4838fSBram Moolenaar      'def Test() # comment',
3321e7e4838fSBram Moolenaar      'enddef',
3322e7e4838fSBram Moolenaar      ])
3323e7e4838fSBram Moolenaar  CheckScriptFailure([
3324e7e4838fSBram Moolenaar      'func Test() # comment',
3325e7e4838fSBram Moolenaar      'endfunc',
3326e7e4838fSBram Moolenaar      ], 'E488:')
33270f37e356SBram Moolenaar
33280f37e356SBram Moolenaar  var lines =<< trim END
33290f37e356SBram Moolenaar      vim9script
33300f37e356SBram Moolenaar      syn region Text
33310f37e356SBram Moolenaar      \ start='foo'
33320f37e356SBram Moolenaar      #\ comment
33330f37e356SBram Moolenaar      \ end='bar'
33345072b47aSBram Moolenaar      syn region Text start='foo'
33355072b47aSBram Moolenaar      #\ comment
33365072b47aSBram Moolenaar      \ end='bar'
33370f37e356SBram Moolenaar  END
33380f37e356SBram Moolenaar  CheckScriptSuccess(lines)
33390f37e356SBram Moolenaar
33400f37e356SBram Moolenaar  lines =<< trim END
33410f37e356SBram Moolenaar      vim9script
33420f37e356SBram Moolenaar      syn region Text
33430f37e356SBram Moolenaar      \ start='foo'
33440f37e356SBram Moolenaar      "\ comment
33450f37e356SBram Moolenaar      \ end='bar'
33460f37e356SBram Moolenaar  END
33470f37e356SBram Moolenaar  CheckScriptFailure(lines, 'E399:')
33482c5ed4e3SBram Moolenaarenddef
33492c5ed4e3SBram Moolenaar
33502c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
33512c5ed4e3SBram Moolenaar  CheckCanRunGui
33522c5ed4e3SBram Moolenaar
33532c5ed4e3SBram Moolenaar  CheckScriptFailure([
33542c5ed4e3SBram Moolenaar      'vim9script',
33552c5ed4e3SBram Moolenaar      'gui#comment'
3356f8103f27SBram Moolenaar      ], 'E1144:')
33572c5ed4e3SBram Moolenaar  CheckScriptFailure([
33582c5ed4e3SBram Moolenaar      'vim9script',
33592c5ed4e3SBram Moolenaar      'gui -f#comment'
33602c5ed4e3SBram Moolenaar      ], 'E499:')
33617a092245SBram Moolenaarenddef
33627a092245SBram Moolenaar
3363a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
33646797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
33656797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3366a26b9700SBram Moolenaar
3367a26b9700SBram Moolenaar  edit test.vim
3368a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3369a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3370a26b9700SBram Moolenaar
3371a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3372a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3373a26b9700SBram Moolenaar
3374a26b9700SBram Moolenaar  g:entered = 0
3375a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3376a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3377a26b9700SBram Moolenaar
3378a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3379a26b9700SBram Moolenaar
3380a26b9700SBram Moolenaar  au! TabEnter
3381a26b9700SBram Moolenaar  unlet g:entered
3382d72c1bf0SBram Moolenaar
3383d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3384d72c1bf0SBram Moolenaar      'vim9script',
33856797966dSBram Moolenaar      'g:var = 123',
3386e55b1c09SBram Moolenaar      'b:var = 456',
3387e55b1c09SBram Moolenaar      'w:var = 777',
3388e55b1c09SBram Moolenaar      't:var = 888',
3389d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3390d72c1bf0SBram Moolenaar      ])
3391d72c1bf0SBram Moolenaar
3392d72c1bf0SBram Moolenaar  CheckScriptFailure([
3393d72c1bf0SBram Moolenaar      'vim9script',
3394cfcd011fSBram Moolenaar      'let var = 123',
3395cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3396cfcd011fSBram Moolenaar
3397cfcd011fSBram Moolenaar  CheckScriptFailure([
3398cfcd011fSBram Moolenaar      'vim9script',
3399cfcd011fSBram Moolenaar      'var g:var = 123',
3400e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3401e55b1c09SBram Moolenaar
3402e55b1c09SBram Moolenaar  CheckScriptFailure([
3403e55b1c09SBram Moolenaar      'vim9script',
3404cfcd011fSBram Moolenaar      'var b:var = 123',
3405e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3406e55b1c09SBram Moolenaar
3407e55b1c09SBram Moolenaar  CheckScriptFailure([
3408e55b1c09SBram Moolenaar      'vim9script',
3409cfcd011fSBram Moolenaar      'var w:var = 123',
3410e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3411e55b1c09SBram Moolenaar
3412e55b1c09SBram Moolenaar  CheckScriptFailure([
3413e55b1c09SBram Moolenaar      'vim9script',
3414cfcd011fSBram Moolenaar      'var t:var = 123',
3415e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3416e55b1c09SBram Moolenaar
3417e55b1c09SBram Moolenaar  CheckScriptFailure([
3418e55b1c09SBram Moolenaar      'vim9script',
3419cfcd011fSBram Moolenaar      'var v:version = 123',
3420e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3421e55b1c09SBram Moolenaar
3422e55b1c09SBram Moolenaar  CheckScriptFailure([
3423e55b1c09SBram Moolenaar      'vim9script',
3424cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3425e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
34266797966dSBram Moolenaar
34276797966dSBram Moolenaar  CheckScriptFailure([
34286797966dSBram Moolenaar      'vim9script',
34296797966dSBram Moolenaar      'g:var = 123',
343032e35117SBram Moolenaar      'unlet g:var# comment1',
3431d72c1bf0SBram Moolenaar      ], 'E108:')
3432d72c1bf0SBram Moolenaar
3433d72c1bf0SBram Moolenaar  CheckScriptFailure([
3434d72c1bf0SBram Moolenaar      'let g:var = 123',
3435d72c1bf0SBram Moolenaar      'unlet g:var # something',
3436d72c1bf0SBram Moolenaar      ], 'E488:')
3437faac4104SBram Moolenaar
3438faac4104SBram Moolenaar  CheckScriptSuccess([
3439faac4104SBram Moolenaar      'vim9script',
344032e35117SBram Moolenaar      'if 1 # comment2',
3441faac4104SBram Moolenaar      '  echo "yes"',
3442faac4104SBram Moolenaar      'elseif 2 #comment',
3443faac4104SBram Moolenaar      '  echo "no"',
3444faac4104SBram Moolenaar      'endif',
3445faac4104SBram Moolenaar      ])
3446faac4104SBram Moolenaar
3447faac4104SBram Moolenaar  CheckScriptFailure([
3448faac4104SBram Moolenaar      'vim9script',
344932e35117SBram Moolenaar      'if 1# comment3',
3450faac4104SBram Moolenaar      '  echo "yes"',
3451faac4104SBram Moolenaar      'endif',
3452fae55a9cSBram Moolenaar      ], 'E488:')
3453faac4104SBram Moolenaar
3454faac4104SBram Moolenaar  CheckScriptFailure([
3455faac4104SBram Moolenaar      'vim9script',
345632e35117SBram Moolenaar      'if 0 # comment4',
3457faac4104SBram Moolenaar      '  echo "yes"',
3458faac4104SBram Moolenaar      'elseif 2#comment',
3459faac4104SBram Moolenaar      '  echo "no"',
3460faac4104SBram Moolenaar      'endif',
3461fae55a9cSBram Moolenaar      ], 'E488:')
3462faac4104SBram Moolenaar
3463faac4104SBram Moolenaar  CheckScriptSuccess([
3464faac4104SBram Moolenaar      'vim9script',
3465cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3466faac4104SBram Moolenaar      ])
3467faac4104SBram Moolenaar
3468faac4104SBram Moolenaar  CheckScriptFailure([
3469faac4104SBram Moolenaar      'vim9script',
3470cfcd011fSBram Moolenaar      'var v = 1# comment6',
3471fae55a9cSBram Moolenaar      ], 'E488:')
3472faac4104SBram Moolenaar
3473faac4104SBram Moolenaar  CheckScriptSuccess([
3474faac4104SBram Moolenaar      'vim9script',
3475faac4104SBram Moolenaar      'new'
3476d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3477df069eecSBram Moolenaar      ':$',
3478faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3479faac4104SBram Moolenaar      'bwipe!',
3480faac4104SBram Moolenaar      ])
3481faac4104SBram Moolenaar
3482f5be8cdbSBram Moolenaar  CheckScriptFailure([
3483f5be8cdbSBram Moolenaar      'vim9script',
3484f5be8cdbSBram Moolenaar      'new'
3485d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3486f5be8cdbSBram Moolenaar      ':$',
3487f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3488f5be8cdbSBram Moolenaar      'bwipe!',
3489f5be8cdbSBram Moolenaar      ], 'E488:')
3490f5be8cdbSBram Moolenaar
3491f5be8cdbSBram Moolenaar  CheckScriptFailure([
3492f5be8cdbSBram Moolenaar      'vim9script',
3493f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3494f5be8cdbSBram Moolenaar      ], 'E477:')
3495a26b9700SBram Moolenaarenddef
3496a26b9700SBram Moolenaar
34977e5bd91dSBram Moolenaardef Test_finish()
3498cfcd011fSBram Moolenaar  var lines =<< trim END
34997e5bd91dSBram Moolenaar    vim9script
35006797966dSBram Moolenaar    g:res = 'one'
35017e5bd91dSBram Moolenaar    if v:false | finish | endif
35026797966dSBram Moolenaar    g:res = 'two'
35037e5bd91dSBram Moolenaar    finish
35046797966dSBram Moolenaar    g:res = 'three'
35057e5bd91dSBram Moolenaar  END
35067e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
35077e5bd91dSBram Moolenaar  source Xfinished
35087e5bd91dSBram Moolenaar  assert_equal('two', g:res)
35097e5bd91dSBram Moolenaar
35107e5bd91dSBram Moolenaar  unlet g:res
35117e5bd91dSBram Moolenaar  delete('Xfinished')
35127e5bd91dSBram Moolenaarenddef
35137e5bd91dSBram Moolenaar
3514a5d0077eSBram Moolenaardef Test_forward_declaration()
3515cfcd011fSBram Moolenaar  var lines =<< trim END
3516a5d0077eSBram Moolenaar    vim9script
3517a5d0077eSBram Moolenaar    def GetValue(): string
3518a5d0077eSBram Moolenaar      return theVal
3519a5d0077eSBram Moolenaar    enddef
3520cfcd011fSBram Moolenaar    var theVal = 'something'
3521822ba247SBram Moolenaar    g:initVal = GetValue()
3522a5d0077eSBram Moolenaar    theVal = 'else'
3523a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3524a5d0077eSBram Moolenaar  END
3525a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3526a5d0077eSBram Moolenaar  source Xforward
3527a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3528a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3529a5d0077eSBram Moolenaar
3530a5d0077eSBram Moolenaar  unlet g:initVal
3531a5d0077eSBram Moolenaar  unlet g:laterVal
3532a5d0077eSBram Moolenaar  delete('Xforward')
3533a5d0077eSBram Moolenaarenddef
3534a5d0077eSBram Moolenaar
35359721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3536a6294955SBram Moolenaar  var vim9_lines =<< trim END
3537a6294955SBram Moolenaar    vim9script
3538a6294955SBram Moolenaar    var local = 'local'
3539a6294955SBram Moolenaar    g:global = 'global'
3540a6294955SBram Moolenaar    export var exported = 'exported'
3541a6294955SBram Moolenaar    export def GetText(): string
3542a6294955SBram Moolenaar       return 'text'
3543a6294955SBram Moolenaar    enddef
3544a6294955SBram Moolenaar  END
3545a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3546a6294955SBram Moolenaar
3547cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
35489721fb4eSBram Moolenaar    source Xvim9_script.vim
35499721fb4eSBram Moolenaar
35509721fb4eSBram Moolenaar    call assert_false(exists('local'))
35519721fb4eSBram Moolenaar    call assert_false(exists('exported'))
35529721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
35539721fb4eSBram Moolenaar    call assert_equal('global', global)
35549721fb4eSBram Moolenaar    call assert_equal('global', g:global)
35559721fb4eSBram Moolenaar
35569721fb4eSBram Moolenaar    " imported variable becomes script-local
35579721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
35589721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
35599721fb4eSBram Moolenaar    call assert_false(exists('exported'))
35609721fb4eSBram Moolenaar
35619721fb4eSBram Moolenaar    " imported function becomes script-local
35629721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
35639721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
35649721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
35659721fb4eSBram Moolenaar  END
35669721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
35679721fb4eSBram Moolenaar
35689721fb4eSBram Moolenaar  source Xlegacy_script.vim
35699721fb4eSBram Moolenaar  assert_equal('global', g:global)
3570f5be8cdbSBram Moolenaar  unlet g:global
35719721fb4eSBram Moolenaar
35729721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
35739721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
35749721fb4eSBram Moolenaarenddef
3575a5d0077eSBram Moolenaar
3576e535db86SBram Moolenaardef Test_declare_script_in_func()
3577e535db86SBram Moolenaar  var lines =<< trim END
3578e535db86SBram Moolenaar      vim9script
3579e535db86SBram Moolenaar      func Declare()
3580e535db86SBram Moolenaar        let s:local = 123
3581e535db86SBram Moolenaar      endfunc
3582e535db86SBram Moolenaar      Declare()
3583e535db86SBram Moolenaar      assert_equal(123, local)
3584e535db86SBram Moolenaar
3585e535db86SBram Moolenaar      var error: string
3586e535db86SBram Moolenaar      try
3587e535db86SBram Moolenaar        local = 'asdf'
3588e535db86SBram Moolenaar      catch
3589e535db86SBram Moolenaar        error = v:exception
3590e535db86SBram Moolenaar      endtry
3591e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3592e535db86SBram Moolenaar
3593e535db86SBram Moolenaar      lockvar local
3594e535db86SBram Moolenaar      try
3595e535db86SBram Moolenaar        local = 999
3596e535db86SBram Moolenaar      catch
3597e535db86SBram Moolenaar        error = v:exception
3598e535db86SBram Moolenaar      endtry
3599e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3600e535db86SBram Moolenaar  END
3601e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3602e535db86SBram Moolenaarenddef
3603e535db86SBram Moolenaar
3604e535db86SBram Moolenaar
36057d699701SBram Moolenaarfunc Test_vim9script_not_global()
36067d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
36077d699701SBram Moolenaar  let vim9lines =<< trim END
36087d699701SBram Moolenaar    vim9script
3609cfcd011fSBram Moolenaar    var name = 'local'
36107d699701SBram Moolenaar    func TheFunc()
36117d699701SBram Moolenaar      echo 'local'
36127d699701SBram Moolenaar    endfunc
36137d699701SBram Moolenaar    def DefFunc()
36147d699701SBram Moolenaar      echo 'local'
36157d699701SBram Moolenaar    enddef
36167d699701SBram Moolenaar  END
36177d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
36187d699701SBram Moolenaar  source Xvim9script.vim
36197d699701SBram Moolenaar  try
36207d699701SBram Moolenaar    echo g:var
36217d699701SBram Moolenaar    assert_report('did not fail')
36227d699701SBram Moolenaar  catch /E121:/
36237d699701SBram Moolenaar    " caught
36247d699701SBram Moolenaar  endtry
36257d699701SBram Moolenaar  try
36267d699701SBram Moolenaar    call TheFunc()
36277d699701SBram Moolenaar    assert_report('did not fail')
36287d699701SBram Moolenaar  catch /E117:/
36297d699701SBram Moolenaar    " caught
36307d699701SBram Moolenaar  endtry
36317d699701SBram Moolenaar  try
36327d699701SBram Moolenaar    call DefFunc()
36337d699701SBram Moolenaar    assert_report('did not fail')
36347d699701SBram Moolenaar  catch /E117:/
36357d699701SBram Moolenaar    " caught
36367d699701SBram Moolenaar  endtry
36377d699701SBram Moolenaar
363825859dd7SBram Moolenaar  call delete('Xvim9script.vim')
36397d699701SBram Moolenaarendfunc
36407d699701SBram Moolenaar
3641eeb27bfeSBram Moolenaardef Test_vim9_copen()
3642eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3643eeb27bfeSBram Moolenaar  copen
3644eeb27bfeSBram Moolenaar  quit
3645eeb27bfeSBram Moolenaarenddef
3646eeb27bfeSBram Moolenaar
364703290b84SBram Moolenaar" test using an auto-loaded function and variable
36482d6b20d6SBram Moolenaardef Test_vim9_autoload()
3649cfcd011fSBram Moolenaar  var lines =<< trim END
36502d6b20d6SBram Moolenaar     vim9script
365103290b84SBram Moolenaar     def some#gettest(): string
365203290b84SBram Moolenaar       return 'test'
365303290b84SBram Moolenaar     enddef
365403290b84SBram Moolenaar     g:some#name = 'name'
3655227c58a4SBram Moolenaar     g:some#dict = {key: 'value'}
3656e3ffcd99SBram Moolenaar
3657e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3658e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3659e3ffcd99SBram Moolenaar     enddef
366003290b84SBram Moolenaar  END
366103290b84SBram Moolenaar
366203290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
366303290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
366403290b84SBram Moolenaar  var save_rtp = &rtp
366503290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
366603290b84SBram Moolenaar
366703290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
366803290b84SBram Moolenaar  assert_equal('name', g:some#name)
3669227c58a4SBram Moolenaar  assert_equal('value', g:some#dict.key)
367003290b84SBram Moolenaar  g:some#other = 'other'
367103290b84SBram Moolenaar  assert_equal('other', g:some#other)
367203290b84SBram Moolenaar
3673e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3674e3ffcd99SBram Moolenaar
367517f700acSBram Moolenaar  # upper case script name works
367617f700acSBram Moolenaar  lines =<< trim END
367717f700acSBram Moolenaar     vim9script
367817f700acSBram Moolenaar     def Other#getOther(): string
367917f700acSBram Moolenaar       return 'other'
368017f700acSBram Moolenaar     enddef
368117f700acSBram Moolenaar  END
368217f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
368317f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
368417f700acSBram Moolenaar
368503290b84SBram Moolenaar  delete('Xdir', 'rf')
368603290b84SBram Moolenaar  &rtp = save_rtp
368703290b84SBram Moolenaarenddef
368803290b84SBram Moolenaar
368903290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
369003290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
369103290b84SBram Moolenaar  var lines =<< trim END
369203290b84SBram Moolenaar     vim9script
36932d6b20d6SBram Moolenaar     def foo#test()
36942d6b20d6SBram Moolenaar         echomsg getreg('"')
36952d6b20d6SBram Moolenaar     enddef
36962d6b20d6SBram Moolenaar  END
36972d6b20d6SBram Moolenaar
36982d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
36992d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3700cfcd011fSBram Moolenaar  var save_rtp = &rtp
37012d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
37022d6b20d6SBram Moolenaar  augroup test
37032d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
37042d6b20d6SBram Moolenaar  augroup END
37052d6b20d6SBram Moolenaar
37062d6b20d6SBram Moolenaar  normal Y
37072d6b20d6SBram Moolenaar
37082d6b20d6SBram Moolenaar  augroup test
37092d6b20d6SBram Moolenaar    autocmd!
37102d6b20d6SBram Moolenaar  augroup END
37112d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
37122d6b20d6SBram Moolenaar  &rtp = save_rtp
37132d6b20d6SBram Moolenaarenddef
37142d6b20d6SBram Moolenaar
371577e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
371677e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3717cfcd011fSBram Moolenaar  var lines =<< trim END
371877e5dcc3SBram Moolenaar      vim9script
371977e5dcc3SBram Moolenaar      def crash#func()
372077e5dcc3SBram Moolenaar          try
372177e5dcc3SBram Moolenaar              for x in List()
372277e5dcc3SBram Moolenaar              endfor
372377e5dcc3SBram Moolenaar          catch
372477e5dcc3SBram Moolenaar          endtry
372577e5dcc3SBram Moolenaar          g:ok = true
372677e5dcc3SBram Moolenaar      enddef
372777e5dcc3SBram Moolenaar      fu List()
372877e5dcc3SBram Moolenaar          invalid
372977e5dcc3SBram Moolenaar      endfu
373077e5dcc3SBram Moolenaar      try
373148e11c10SBram Moolenaar          alsoinvalid
373277e5dcc3SBram Moolenaar      catch /wontmatch/
373377e5dcc3SBram Moolenaar      endtry
373477e5dcc3SBram Moolenaar  END
373577e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
373677e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
373777e5dcc3SBram Moolenaar
373877e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
373977e5dcc3SBram Moolenaar  lines =<< trim END
374077e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
374177e5dcc3SBram Moolenaar    call crash#func()
374277e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
37439c4f5520SBram Moolenaar    qall!
374477e5dcc3SBram Moolenaar  END
374577e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
374677e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
374777e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
374877e5dcc3SBram Moolenaar
374977e5dcc3SBram Moolenaar  delete('Xdidit')
375077e5dcc3SBram Moolenaar  delete('Xscript')
375177e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
375203290b84SBram Moolenaar
375303290b84SBram Moolenaar  lines =<< trim END
375403290b84SBram Moolenaar    vim9script
375503290b84SBram Moolenaar    var foo#bar = 'asdf'
375603290b84SBram Moolenaar  END
375703290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
375877e5dcc3SBram Moolenaarenddef
375977e5dcc3SBram Moolenaar
376081e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
376181e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
376281e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3763cfcd011fSBram Moolenaar  var lines =<< trim END
376481e17fbeSBram Moolenaar    let s:counter = 1
376581e17fbeSBram Moolenaar    def s:Func()
376681e17fbeSBram Moolenaar      au! CursorHold
376781e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
376881e17fbeSBram Moolenaar    enddef
376981e17fbeSBram Moolenaar    call s:Func()
377081e17fbeSBram Moolenaar    doau CursorHold
377181e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
377281e17fbeSBram Moolenaar    au! CursorHold
377381e17fbeSBram Moolenaar  END
377481e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
377581e17fbeSBram Moolenaarenddef
377681e17fbeSBram Moolenaar
3777b5841b99SBram Moolenaardef Test_error_in_autoload_script()
3778b5841b99SBram Moolenaar  var save_rtp = &rtp
3779b5841b99SBram Moolenaar  var dir = getcwd() .. '/Xruntime'
3780b5841b99SBram Moolenaar  &rtp = dir
3781b5841b99SBram Moolenaar  mkdir(dir .. '/autoload', 'p')
3782b5841b99SBram Moolenaar
3783b5841b99SBram Moolenaar  var lines =<< trim END
3784b5841b99SBram Moolenaar      vim9script noclear
3785b5841b99SBram Moolenaar      def script#autoloaded()
3786b5841b99SBram Moolenaar      enddef
3787b5841b99SBram Moolenaar      def Broken()
3788b5841b99SBram Moolenaar        var x: any = ''
3789b5841b99SBram Moolenaar        eval x != 0
3790b5841b99SBram Moolenaar      enddef
3791b5841b99SBram Moolenaar      Broken()
3792b5841b99SBram Moolenaar  END
3793b5841b99SBram Moolenaar  writefile(lines, dir .. '/autoload/script.vim')
3794b5841b99SBram Moolenaar
3795b5841b99SBram Moolenaar  lines =<< trim END
3796b5841b99SBram Moolenaar      vim9script
3797b5841b99SBram Moolenaar      def CallAutoloaded()
3798b5841b99SBram Moolenaar        script#autoloaded()
3799b5841b99SBram Moolenaar      enddef
3800b5841b99SBram Moolenaar
3801b5841b99SBram Moolenaar      function Legacy()
3802b5841b99SBram Moolenaar        try
3803b5841b99SBram Moolenaar          call s:CallAutoloaded()
3804b5841b99SBram Moolenaar        catch
3805b5841b99SBram Moolenaar          call assert_match('E1030: Using a String as a Number', v:exception)
3806b5841b99SBram Moolenaar        endtry
3807b5841b99SBram Moolenaar      endfunction
3808b5841b99SBram Moolenaar
3809b5841b99SBram Moolenaar      Legacy()
3810b5841b99SBram Moolenaar  END
3811b5841b99SBram Moolenaar  CheckScriptSuccess(lines)
3812b5841b99SBram Moolenaar
3813b5841b99SBram Moolenaar  &rtp = save_rtp
3814b5841b99SBram Moolenaar  delete(dir, 'rf')
3815b5841b99SBram Moolenaarenddef
3816b5841b99SBram Moolenaar
38173896a105SBram Moolenaardef Test_cmdline_win()
38183896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
38193896a105SBram Moolenaar  # the command line window.
38203896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3821cfcd011fSBram Moolenaar  var export_lines =<< trim END
38223896a105SBram Moolenaar    vim9script
3823cfcd011fSBram Moolenaar    export var That = 'yes'
38243896a105SBram Moolenaar  END
38253896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3826cfcd011fSBram Moolenaar  var import_lines =<< trim END
38273896a105SBram Moolenaar    vim9script
38283896a105SBram Moolenaar    import That from './Xexport.vim'
38293896a105SBram Moolenaar  END
38303896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3831cfcd011fSBram Moolenaar  var save_rtp = &rtp
38323896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
38333896a105SBram Moolenaar  syntax on
38343896a105SBram Moolenaar  augroup CmdWin
38353896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
38363896a105SBram Moolenaar  augroup END
38373896a105SBram Moolenaar  # this will open and also close the cmdline window
38383896a105SBram Moolenaar  feedkeys('q:', 'xt')
38393896a105SBram Moolenaar  assert_equal('yes', g:got_there)
38403896a105SBram Moolenaar
38413896a105SBram Moolenaar  augroup CmdWin
38423896a105SBram Moolenaar    au!
38433896a105SBram Moolenaar  augroup END
38443896a105SBram Moolenaar  &rtp = save_rtp
38453896a105SBram Moolenaar  delete('rtp', 'rf')
38463896a105SBram Moolenaarenddef
38473896a105SBram Moolenaar
3848e3d4685fSBram Moolenaardef Test_invalid_sid()
3849e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
385025859dd7SBram Moolenaar
38519c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3852d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3853e3d4685fSBram Moolenaar  endif
3854e3d4685fSBram Moolenaar  delete('Xdidit')
3855e3d4685fSBram Moolenaarenddef
3856e3d4685fSBram Moolenaar
38579ec7026fSBram Moolenaardef Test_restoring_cpo()
38589ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
38599ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
38609ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
38619ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
38629ec7026fSBram Moolenaar  endif
38639ec7026fSBram Moolenaar  delete('Xsourced')
38649ec7026fSBram Moolenaar  delete('Xclose')
3865090728adSBram Moolenaar  delete('Xdone')
38660123cc1eSBram Moolenaar
38670123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
38680123cc1eSBram Moolenaar  set cpo=aABceFsMny>
38690123cc1eSBram Moolenaar  edit XanotherScript
38700123cc1eSBram Moolenaar  so %
38710123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
38720123cc1eSBram Moolenaar  :1del
38730123cc1eSBram Moolenaar  w
38740123cc1eSBram Moolenaar  so %
38750123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
38760123cc1eSBram Moolenaar
38770123cc1eSBram Moolenaar  delete('XanotherScript')
38780123cc1eSBram Moolenaar  set cpo&vim
38799ec7026fSBram Moolenaarenddef
38809ec7026fSBram Moolenaar
3881ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3882ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
388337294bd6SBram Moolenaar  CheckScreendump
3884ffb7dcdbSBram Moolenaar  CheckFeature timers
388537294bd6SBram Moolenaar
3886ffb7dcdbSBram Moolenaar  let lines =<< trim END
388737294bd6SBram Moolenaar    vim9script
388837294bd6SBram Moolenaar    def script#func()
388937294bd6SBram Moolenaar    enddef
389037294bd6SBram Moolenaar  END
3891ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3892ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
389337294bd6SBram Moolenaar
3894ffb7dcdbSBram Moolenaar  let lines =<< trim END
389537294bd6SBram Moolenaar      vim9script
389637294bd6SBram Moolenaar      set cpo+=M
389737294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
3898767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
389937294bd6SBram Moolenaar      setline(1, 'some text')
390037294bd6SBram Moolenaar  END
3901ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3902ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3903ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3904ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
390537294bd6SBram Moolenaar
3906ffb7dcdbSBram Moolenaar  " clean up
3907ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3908ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3909ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3910ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3911ffb7dcdbSBram Moolenaarendfunc
391237294bd6SBram Moolenaar
39139ec7026fSBram Moolenaar
3914f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3915cfcd011fSBram Moolenaar  var lines =<< trim END
3916cfcd011fSBram Moolenaar    var name: any
3917cfcd011fSBram Moolenaar    assert_equal(0, name)
3918f0afd9e1SBram Moolenaar  END
3919f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3920f0afd9e1SBram Moolenaarenddef
3921f0afd9e1SBram Moolenaar
39227e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
392358dbef33SBram Moolenaar  CheckRunVimInTerminal
392458dbef33SBram Moolenaar
39257e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
39267e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
39277e9210eaSBram Moolenaarendfunc
39287e9210eaSBram Moolenaar
39297e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
39309c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3931cfcd011fSBram Moolenaar  var lines =<< trim END
39329c4f5520SBram Moolenaar    func CheckAndQuit()
39339c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
39349c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
39359c4f5520SBram Moolenaar    endfunc
39369c4f5520SBram Moolenaar  END
39379c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
39389c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3939e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
39409c4f5520SBram Moolenaar  # define Afunc() on the command line
39419c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
39429c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
39432949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
39449c4f5520SBram Moolenaar
39459c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
39469c4f5520SBram Moolenaar  delete('XcallFunc')
39479c4f5520SBram Moolenaar  delete('Xdidcmd')
39489c4f5520SBram Moolenaarenddef
39499c4f5520SBram Moolenaar
3950fcdc5d83SBram Moolenaardef Test_script_var_scope()
3951fcdc5d83SBram Moolenaar  var lines =<< trim END
3952fcdc5d83SBram Moolenaar      vim9script
3953fcdc5d83SBram Moolenaar      if true
3954fcdc5d83SBram Moolenaar        if true
3955fcdc5d83SBram Moolenaar          var one = 'one'
3956fcdc5d83SBram Moolenaar          echo one
3957fcdc5d83SBram Moolenaar        endif
3958fcdc5d83SBram Moolenaar        echo one
3959fcdc5d83SBram Moolenaar      endif
3960fcdc5d83SBram Moolenaar  END
3961fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3962fcdc5d83SBram Moolenaar
3963fcdc5d83SBram Moolenaar  lines =<< trim END
3964fcdc5d83SBram Moolenaar      vim9script
3965fcdc5d83SBram Moolenaar      if true
3966fcdc5d83SBram Moolenaar        if false
3967fcdc5d83SBram Moolenaar          var one = 'one'
3968fcdc5d83SBram Moolenaar          echo one
3969fcdc5d83SBram Moolenaar        else
3970fcdc5d83SBram Moolenaar          var one = 'one'
3971fcdc5d83SBram Moolenaar          echo one
3972fcdc5d83SBram Moolenaar        endif
3973fcdc5d83SBram Moolenaar        echo one
3974fcdc5d83SBram Moolenaar      endif
3975fcdc5d83SBram Moolenaar  END
3976fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3977fcdc5d83SBram Moolenaar
3978fcdc5d83SBram Moolenaar  lines =<< trim END
3979fcdc5d83SBram Moolenaar      vim9script
3980fcdc5d83SBram Moolenaar      while true
3981fcdc5d83SBram Moolenaar        var one = 'one'
3982fcdc5d83SBram Moolenaar        echo one
3983fcdc5d83SBram Moolenaar        break
3984fcdc5d83SBram Moolenaar      endwhile
3985fcdc5d83SBram Moolenaar      echo one
3986fcdc5d83SBram Moolenaar  END
3987fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3988fcdc5d83SBram Moolenaar
3989fcdc5d83SBram Moolenaar  lines =<< trim END
3990fcdc5d83SBram Moolenaar      vim9script
3991fcdc5d83SBram Moolenaar      for i in range(1)
3992fcdc5d83SBram Moolenaar        var one = 'one'
3993fcdc5d83SBram Moolenaar        echo one
3994fcdc5d83SBram Moolenaar      endfor
3995fcdc5d83SBram Moolenaar      echo one
3996fcdc5d83SBram Moolenaar  END
3997fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
39989becdf2bSBram Moolenaar
39999becdf2bSBram Moolenaar  lines =<< trim END
40009becdf2bSBram Moolenaar      vim9script
40019becdf2bSBram Moolenaar      {
40029becdf2bSBram Moolenaar        var one = 'one'
40039becdf2bSBram Moolenaar        assert_equal('one', one)
40049becdf2bSBram Moolenaar      }
40059becdf2bSBram Moolenaar      assert_false(exists('one'))
40069becdf2bSBram Moolenaar      assert_false(exists('s:one'))
40079becdf2bSBram Moolenaar  END
40089becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
40099becdf2bSBram Moolenaar
40109becdf2bSBram Moolenaar  lines =<< trim END
40119becdf2bSBram Moolenaar      vim9script
40129becdf2bSBram Moolenaar      {
40139becdf2bSBram Moolenaar        var one = 'one'
40149becdf2bSBram Moolenaar        echo one
40159becdf2bSBram Moolenaar      }
40169becdf2bSBram Moolenaar      echo one
40179becdf2bSBram Moolenaar  END
40189becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
4019fcdc5d83SBram Moolenaarenddef
4020fcdc5d83SBram Moolenaar
4021352134bbSBram Moolenaardef Test_catch_exception_in_callback()
4022352134bbSBram Moolenaar  var lines =<< trim END
4023352134bbSBram Moolenaar    vim9script
40242a38908bSBram Moolenaar    def Callback(...l: list<any>)
4025352134bbSBram Moolenaar      try
4026352134bbSBram Moolenaar        var x: string
4027352134bbSBram Moolenaar        var y: string
4028352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
4029352134bbSBram Moolenaar        [x, y] = ['']
4030352134bbSBram Moolenaar      catch
4031352134bbSBram Moolenaar        g:caught = 'yes'
4032352134bbSBram Moolenaar      endtry
4033352134bbSBram Moolenaar    enddef
4034e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
4035352134bbSBram Moolenaar    feedkeys("\r", 'xt')
4036352134bbSBram Moolenaar  END
4037352134bbSBram Moolenaar  CheckScriptSuccess(lines)
4038352134bbSBram Moolenaar
4039352134bbSBram Moolenaar  unlet g:caught
4040352134bbSBram Moolenaarenddef
4041352134bbSBram Moolenaar
4042631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
4043631e8f93SBram Moolenaar  if !has('unix') || !has('job')
4044631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
4045631e8f93SBram Moolenaar  endif
4046631e8f93SBram Moolenaar  var lines =<< trim END
4047631e8f93SBram Moolenaar      vim9script
4048631e8f93SBram Moolenaar      var source: list<number>
40492a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
4050631e8f93SBram Moolenaar          eval [][0]
4051631e8f93SBram Moolenaar      enddef
40522a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
4053631e8f93SBram Moolenaar          sleep 1m
4054631e8f93SBram Moolenaar          source += l
4055631e8f93SBram Moolenaar      enddef
4056e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
40576f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
40586f17a3f0SBram Moolenaar        sleep 10m
40596f17a3f0SBram Moolenaar      endwhile
4060206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
4061fe95b94fSBram Moolenaar      sleep 200m
4062631e8f93SBram Moolenaar  END
4063631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
4064631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
4065631e8f93SBram Moolenaar  delete('Xdef')
4066631e8f93SBram Moolenaarenddef
4067631e8f93SBram Moolenaar
40684324d87aSBram Moolenaardef InvokeNormal()
40694324d87aSBram Moolenaar  exe "norm! :m+1\r"
40704324d87aSBram Moolenaarenddef
40714324d87aSBram Moolenaar
40724324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
40734324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
40744324d87aSBram Moolenaar  new
40754324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
40764324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
40774324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
40784324d87aSBram Moolenaar  xunmap <F3>
4079b5b9480eSBram Moolenaarenddef
4080b5b9480eSBram Moolenaar
4081b5b9480eSBram Moolenaardef Test_white_space_after_command()
4082b5b9480eSBram Moolenaar  var lines =<< trim END
4083b5b9480eSBram Moolenaar    exit_cb: Func})
4084b5b9480eSBram Moolenaar  END
4085b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
4086f8103f27SBram Moolenaar
4087f8103f27SBram Moolenaar  lines =<< trim END
4088f8103f27SBram Moolenaar    e#
4089f8103f27SBram Moolenaar  END
4090f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
40914324d87aSBram Moolenaarenddef
40924324d87aSBram Moolenaar
40934aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
40944aab88d9SBram Moolenaar  var lines =<< trim END
40954aab88d9SBram Moolenaar      vim9script
40964aab88d9SBram Moolenaar      if exists('g:guard')
40974aab88d9SBram Moolenaar        finish
40984aab88d9SBram Moolenaar      endif
40994aab88d9SBram Moolenaar      g:guard = 1
41004aab88d9SBram Moolenaar      var name = 'thename'
41014aab88d9SBram Moolenaar      def g:GetName(): string
41024aab88d9SBram Moolenaar        return name
41034aab88d9SBram Moolenaar      enddef
41044aab88d9SBram Moolenaar      def g:SetName(arg: string)
41054aab88d9SBram Moolenaar        name = arg
41064aab88d9SBram Moolenaar      enddef
41074aab88d9SBram Moolenaar  END
41084aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
41094aab88d9SBram Moolenaar  so XscriptTwice.vim
41104aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
41114aab88d9SBram Moolenaar  g:SetName('newname')
41124aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
41134aab88d9SBram Moolenaar  so XscriptTwice.vim
41144aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
41154aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
41164aab88d9SBram Moolenaar
41174aab88d9SBram Moolenaar  delfunc g:GetName
41184aab88d9SBram Moolenaar  delfunc g:SetName
41194aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
41204aab88d9SBram Moolenaar  unlet g:guard
41214aab88d9SBram Moolenaarenddef
41224aab88d9SBram Moolenaar
41234aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
41244aab88d9SBram Moolenaar  var exportlines =<< trim END
41254aab88d9SBram Moolenaar      vim9script
41264aab88d9SBram Moolenaar      if exists('g:guard')
41274aab88d9SBram Moolenaar        finish
41284aab88d9SBram Moolenaar      endif
41294aab88d9SBram Moolenaar      g:guard = 1
41304aab88d9SBram Moolenaar      export var name = 'someName'
41314aab88d9SBram Moolenaar  END
41324aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
41334aab88d9SBram Moolenaar
41344aab88d9SBram Moolenaar  var lines =<< trim END
41354aab88d9SBram Moolenaar      vim9script
41364aab88d9SBram Moolenaar      import name from './XexportScript.vim'
41374aab88d9SBram Moolenaar      def g:GetName(): string
41384aab88d9SBram Moolenaar        return name
41394aab88d9SBram Moolenaar      enddef
41404aab88d9SBram Moolenaar  END
41414aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
41424aab88d9SBram Moolenaar  so XscriptImport.vim
41434aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
41444aab88d9SBram Moolenaar
41454aab88d9SBram Moolenaar  so XexportScript.vim
41464aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
41474aab88d9SBram Moolenaar
41484aab88d9SBram Moolenaar  delfunc g:GetName
41494aab88d9SBram Moolenaar  delete('XexportScript.vim')
41504aab88d9SBram Moolenaar  delete('XscriptImport.vim')
41514aab88d9SBram Moolenaar  unlet g:guard
41524aab88d9SBram Moolenaarenddef
41534aab88d9SBram Moolenaar
415410b9421fSBram Moolenaardef Test_unsupported_commands()
415510b9421fSBram Moolenaar  var lines =<< trim END
415610b9421fSBram Moolenaar      ka
415710b9421fSBram Moolenaar  END
41587d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
41597d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
416010b9421fSBram Moolenaar
416110b9421fSBram Moolenaar  lines =<< trim END
4162ada1d870SBram Moolenaar      :1ka
4163ada1d870SBram Moolenaar  END
41647d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
41657d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
4166ada1d870SBram Moolenaar
4167ada1d870SBram Moolenaar  lines =<< trim END
416810b9421fSBram Moolenaar    t
416910b9421fSBram Moolenaar  END
417010b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
417110b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
417210b9421fSBram Moolenaar
417310b9421fSBram Moolenaar  lines =<< trim END
417410b9421fSBram Moolenaar    x
417510b9421fSBram Moolenaar  END
417610b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
417710b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
417810b9421fSBram Moolenaar
417910b9421fSBram Moolenaar  lines =<< trim END
418010b9421fSBram Moolenaar    xit
418110b9421fSBram Moolenaar  END
418210b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
418310b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
418410b9421fSBram Moolenaarenddef
418510b9421fSBram Moolenaar
4186c70fe460SBram Moolenaardef Test_mapping_line_number()
4187c70fe460SBram Moolenaar  var lines =<< trim END
4188c70fe460SBram Moolenaar      vim9script
4189c70fe460SBram Moolenaar      def g:FuncA()
4190c70fe460SBram Moolenaar          # Some comment
4191c70fe460SBram Moolenaar          FuncB(0)
4192c70fe460SBram Moolenaar      enddef
4193c70fe460SBram Moolenaar          # Some comment
4194c70fe460SBram Moolenaar      def FuncB(
4195c70fe460SBram Moolenaar          # Some comment
4196c70fe460SBram Moolenaar          n: number
4197c70fe460SBram Moolenaar      )
4198c70fe460SBram Moolenaar          exe 'nno '
4199c70fe460SBram Moolenaar              # Some comment
4200c70fe460SBram Moolenaar              .. '<F3> a'
4201c70fe460SBram Moolenaar              .. 'b'
4202c70fe460SBram Moolenaar              .. 'c'
4203c70fe460SBram Moolenaar      enddef
4204c70fe460SBram Moolenaar  END
4205c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
4206c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
4207c70fe460SBram Moolenaar  assert_match('No mapping found', res)
4208c70fe460SBram Moolenaar
4209c70fe460SBram Moolenaar  g:FuncA()
4210c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
4211c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4212c70fe460SBram Moolenaar
4213c70fe460SBram Moolenaar  nunmap <F3>
4214c70fe460SBram Moolenaar  delfunc g:FuncA
4215c70fe460SBram Moolenaarenddef
4216c70fe460SBram Moolenaar
4217deb108baSBram Moolenaardef Test_option_set()
4218deb108baSBram Moolenaar  # legacy script allows for white space
4219deb108baSBram Moolenaar  var lines =<< trim END
4220deb108baSBram Moolenaar      set foldlevel  =11
4221deb108baSBram Moolenaar      call assert_equal(11, &foldlevel)
4222deb108baSBram Moolenaar  END
4223deb108baSBram Moolenaar  CheckScriptSuccess(lines)
4224deb108baSBram Moolenaar
4225deb108baSBram Moolenaar  set foldlevel
4226deb108baSBram Moolenaar  set foldlevel=12
4227deb108baSBram Moolenaar  assert_equal(12, &foldlevel)
4228deb108baSBram Moolenaar  set foldlevel+=2
4229deb108baSBram Moolenaar  assert_equal(14, &foldlevel)
4230deb108baSBram Moolenaar  set foldlevel-=3
4231deb108baSBram Moolenaar  assert_equal(11, &foldlevel)
4232deb108baSBram Moolenaar
4233deb108baSBram Moolenaar  lines =<< trim END
4234deb108baSBram Moolenaar      set foldlevel =1
4235deb108baSBram Moolenaar  END
4236deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
4237deb108baSBram Moolenaar
4238deb108baSBram Moolenaar  lines =<< trim END
4239deb108baSBram Moolenaar      set foldlevel +=1
4240deb108baSBram Moolenaar  END
4241deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
4242deb108baSBram Moolenaar
4243deb108baSBram Moolenaar  lines =<< trim END
4244deb108baSBram Moolenaar      set foldlevel ^=1
4245deb108baSBram Moolenaar  END
4246deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
4247deb108baSBram Moolenaar
4248deb108baSBram Moolenaar  lines =<< trim END
4249deb108baSBram Moolenaar      set foldlevel -=1
4250deb108baSBram Moolenaar  END
4251deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
4252deb108baSBram Moolenaar
4253deb108baSBram Moolenaar  set foldlevel&
4254deb108baSBram Moolenaarenddef
4255deb108baSBram Moolenaar
4256208f0b48SBram Moolenaardef Test_option_modifier()
42571594f313SBram Moolenaar  # legacy script allows for white space
4258208f0b48SBram Moolenaar  var lines =<< trim END
4259208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
4260208f0b48SBram Moolenaar      call assert_equal(1, &hlsearch)
4261208f0b48SBram Moolenaar  END
4262208f0b48SBram Moolenaar  CheckScriptSuccess(lines)
4263208f0b48SBram Moolenaar
42641594f313SBram Moolenaar  set hlsearch
42651594f313SBram Moolenaar  set hlsearch!
42661594f313SBram Moolenaar  assert_equal(false, &hlsearch)
42671594f313SBram Moolenaar
42681594f313SBram Moolenaar  set hlsearch
4269208f0b48SBram Moolenaar  set hlsearch&
42701594f313SBram Moolenaar  assert_equal(false, &hlsearch)
4271208f0b48SBram Moolenaar
4272208f0b48SBram Moolenaar  lines =<< trim END
42731594f313SBram Moolenaar      set hlsearch &
4274208f0b48SBram Moolenaar  END
42751594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
42761594f313SBram Moolenaar
42771594f313SBram Moolenaar  lines =<< trim END
42781594f313SBram Moolenaar      set hlsearch   !
42791594f313SBram Moolenaar  END
42801594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
42811594f313SBram Moolenaar
42821594f313SBram Moolenaar  set hlsearch&
4283208f0b48SBram Moolenaarenddef
4284208f0b48SBram Moolenaar
4285c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail
4286c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number()
4287c03fe66aSBram Moolenaar  var lines =<< trim END
4288c03fe66aSBram Moolenaar      echoerr 'some'
4289c03fe66aSBram Moolenaar         .. ' error'
4290c03fe66aSBram Moolenaar         .. ' continued'
4291c03fe66aSBram Moolenaar  END
4292c03fe66aSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
4293c03fe66aSBram Moolenaarenddef
4294c03fe66aSBram Moolenaar
4295648594eaSBram Moolenaardef ProfiledWithLambda()
4296d9162550SBram Moolenaar  var n = 3
4297d9162550SBram Moolenaar  echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4298d9162550SBram Moolenaarenddef
4299d9162550SBram Moolenaar
4300648594eaSBram Moolenaardef ProfiledNested()
4301648594eaSBram Moolenaar  var x = 0
4302648594eaSBram Moolenaar  def Nested(): any
4303648594eaSBram Moolenaar      return x
4304648594eaSBram Moolenaar  enddef
4305648594eaSBram Moolenaar  Nested()
4306648594eaSBram Moolenaarenddef
4307648594eaSBram Moolenaar
4308ffcfddc7SBram Moolenaardef ProfiledNestedProfiled()
4309ffcfddc7SBram Moolenaar  var x = 0
4310ffcfddc7SBram Moolenaar  def Nested(): any
4311ffcfddc7SBram Moolenaar      return x
4312ffcfddc7SBram Moolenaar  enddef
4313ffcfddc7SBram Moolenaar  Nested()
4314ffcfddc7SBram Moolenaarenddef
4315ffcfddc7SBram Moolenaar
4316d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists.
4317d9162550SBram Moolenaar" This only tests that it works, not the profiling output.
4318d9162550SBram Moolenaardef Test_xx_profile_with_lambda()
43194ece152aSBram Moolenaar  CheckFeature profile
43204ece152aSBram Moolenaar
4321d9162550SBram Moolenaar  profile start Xprofile.log
4322648594eaSBram Moolenaar  profile func ProfiledWithLambda
4323648594eaSBram Moolenaar  ProfiledWithLambda()
4324ffcfddc7SBram Moolenaar
4325648594eaSBram Moolenaar  profile func ProfiledNested
4326648594eaSBram Moolenaar  ProfiledNested()
4327ffcfddc7SBram Moolenaar
4328ffcfddc7SBram Moolenaar  # Also profile the nested function.  Use a different function, although the
4329ffcfddc7SBram Moolenaar  # contents is the same, to make sure it was not already compiled.
4330ffcfddc7SBram Moolenaar  profile func *
4331ffcfddc7SBram Moolenaar  ProfiledNestedProfiled()
4332ffcfddc7SBram Moolenaar
4333ffcfddc7SBram Moolenaar  profdel func *
4334ffcfddc7SBram Moolenaar  profile pause
4335d9162550SBram Moolenaarenddef
4336d9162550SBram Moolenaar
4337585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
4338585fea7bSBram Moolenaardef Test_substitute_cmd()
4339585fea7bSBram Moolenaar  new
4340585fea7bSBram Moolenaar  setline(1, 'something')
4341585fea7bSBram Moolenaar  :substitute(some(other(
4342585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
4343585fea7bSBram Moolenaar  bwipe!
4344585fea7bSBram Moolenaar
4345f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
4346cfcd011fSBram Moolenaar  var lines =<< trim END
4347585fea7bSBram Moolenaar    vim9script
4348585fea7bSBram Moolenaar    new
4349585fea7bSBram Moolenaar    setline(1, 'something')
4350585fea7bSBram Moolenaar    :substitute(some(other(
4351585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
4352585fea7bSBram Moolenaar    bwipe!
4353585fea7bSBram Moolenaar  END
4354585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
4355585fea7bSBram Moolenaar  source Xvim9lines
4356585fea7bSBram Moolenaar
4357585fea7bSBram Moolenaar  delete('Xvim9lines')
4358585fea7bSBram Moolenaarenddef
4359585fea7bSBram Moolenaar
43608a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
4361