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)
607*4490ec4eSYegappan 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
1226a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1227a6294955SBram Moolenaar    vim9script
1228a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1229a6294955SBram Moolenaar    var some = 'other'
1230a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1231a6294955SBram Moolenaar    defcompile
1232a6294955SBram Moolenaar  END
1233a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1234a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1235a6294955SBram Moolenaar
1236cb4e80faSBram Moolenaar  var import_star_as_lines_script_no_dot =<< trim END
1237cb4e80faSBram Moolenaar    vim9script
1238cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1239cb4e80faSBram Moolenaar    g:imported_script = Export exported
1240cb4e80faSBram Moolenaar  END
1241cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
1242cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1029:')
1243cb4e80faSBram Moolenaar
1244cb4e80faSBram Moolenaar  var import_star_as_lines_script_space_after_dot =<< trim END
1245cb4e80faSBram Moolenaar    vim9script
1246cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1247cb4e80faSBram Moolenaar    g:imported_script = Export. exported
1248cb4e80faSBram Moolenaar  END
1249cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1250cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1251cb4e80faSBram Moolenaar
1252cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1253599c89c8SBram Moolenaar    vim9script
1254599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1255599c89c8SBram Moolenaar    def Func()
1256cfcd011fSBram Moolenaar      var imported = Export.
1257599c89c8SBram Moolenaar    enddef
1258822ba247SBram Moolenaar    defcompile
1259599c89c8SBram Moolenaar  END
1260599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
126144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1262599c89c8SBram Moolenaar
1263cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
12641c991144SBram Moolenaar    vim9script
12651c991144SBram Moolenaar    import *
12661c991144SBram Moolenaar        as Export
12671c991144SBram Moolenaar        from
12681c991144SBram Moolenaar        './Xexport.vim'
12691c991144SBram Moolenaar    def UseExport()
127024e93165SBram Moolenaar      g:exported = Export.exported
12711c991144SBram Moolenaar    enddef
12721c991144SBram Moolenaar    UseExport()
12731c991144SBram Moolenaar  END
12741c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
12751c991144SBram Moolenaar  source Ximport.vim
127624e93165SBram Moolenaar  assert_equal(18, g:exported)
127724e93165SBram Moolenaar  unlet g:exported
12781c991144SBram Moolenaar
1279cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1280f2d5c240SBram Moolenaar    vim9script
1281f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1282f2d5c240SBram Moolenaar  END
1283f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
128444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1285f2d5c240SBram Moolenaar
1286f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1287cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1288fa29c8abSBram Moolenaar    vim9script
1289fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1290fa29c8abSBram Moolenaar  END
1291fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
129244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1293fa29c8abSBram Moolenaar
1294f5be8cdbSBram Moolenaar  # try to import something that is already defined
1295cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
12965269bd2aSBram Moolenaar    vim9script
1297cfcd011fSBram Moolenaar    var exported = 'something'
12985269bd2aSBram Moolenaar    import exported from './Xexport.vim'
12995269bd2aSBram Moolenaar  END
13005269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1301057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13025269bd2aSBram Moolenaar
1303f5be8cdbSBram Moolenaar  # try to import something that is already defined
13045269bd2aSBram Moolenaar  import_already_defined =<< trim END
13055269bd2aSBram Moolenaar    vim9script
1306cfcd011fSBram Moolenaar    var exported = 'something'
13075269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
13085269bd2aSBram Moolenaar  END
13095269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1310057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13115269bd2aSBram Moolenaar
1312f5be8cdbSBram Moolenaar  # try to import something that is already defined
13135269bd2aSBram Moolenaar  import_already_defined =<< trim END
13145269bd2aSBram Moolenaar    vim9script
1315cfcd011fSBram Moolenaar    var exported = 'something'
13165269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
13175269bd2aSBram Moolenaar  END
13185269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1319057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13205269bd2aSBram Moolenaar
1321918a4249SBram Moolenaar  # try changing an imported const
1322918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1323918a4249SBram Moolenaar    vim9script
1324918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1325918a4249SBram Moolenaar    def Assign()
1326918a4249SBram Moolenaar      CONST = 987
1327918a4249SBram Moolenaar    enddef
1328918a4249SBram Moolenaar    defcompile
1329918a4249SBram Moolenaar  END
1330918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1331918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1332918a4249SBram Moolenaar
13330f2a5cc6SBram Moolenaar  # try changing an imported final
13340f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
13350f2a5cc6SBram Moolenaar    vim9script
13360f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
13370f2a5cc6SBram Moolenaar    def Assign()
13380f2a5cc6SBram Moolenaar      theList = [2]
13390f2a5cc6SBram Moolenaar    enddef
13400f2a5cc6SBram Moolenaar    defcompile
13410f2a5cc6SBram Moolenaar  END
13420f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
13430f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
13440f2a5cc6SBram Moolenaar
1345f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1346cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1347fa29c8abSBram Moolenaar    vim9script
1348fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1349fa29c8abSBram Moolenaar  END
1350fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
135144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1352fa29c8abSBram Moolenaar
1353cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1354fa29c8abSBram Moolenaar    vim9script
1355fa29c8abSBram Moolenaar    import name './Xexport.vim'
1356fa29c8abSBram Moolenaar  END
1357fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
135844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1359fa29c8abSBram Moolenaar
1360cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1361fa29c8abSBram Moolenaar    vim9script
1362fa29c8abSBram Moolenaar    import name from Xexport.vim
1363fa29c8abSBram Moolenaar  END
1364fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
13654db572eeSBram Moolenaar  assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim')
1366fa29c8abSBram Moolenaar
1367cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1368fa29c8abSBram Moolenaar    vim9script
1369fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1370fa29c8abSBram Moolenaar  END
1371fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
137244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1373fa29c8abSBram Moolenaar
1374cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1375fa29c8abSBram Moolenaar    vim9script
1376fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1377fa29c8abSBram Moolenaar  END
13785269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
137944d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1380fa29c8abSBram Moolenaar
138160579350SBram Moolenaar  var import_redefining_lines =<< trim END
138260579350SBram Moolenaar    vim9script
138360579350SBram Moolenaar    import exported from './Xexport.vim'
138460579350SBram Moolenaar    var exported = 5
138560579350SBram Moolenaar  END
138660579350SBram Moolenaar  writefile(import_redefining_lines, 'Ximport.vim')
138760579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3)
138860579350SBram Moolenaar
138960579350SBram Moolenaar  var import_assign_wrong_type_lines =<< trim END
139060579350SBram Moolenaar    vim9script
139160579350SBram Moolenaar    import exported from './Xexport.vim'
139260579350SBram Moolenaar    exported = 'xxx'
139360579350SBram Moolenaar  END
139460579350SBram Moolenaar  writefile(import_assign_wrong_type_lines, 'Ximport.vim')
139560579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3)
139660579350SBram Moolenaar
139760579350SBram Moolenaar  var import_assign_const_lines =<< trim END
139860579350SBram Moolenaar    vim9script
139960579350SBram Moolenaar    import CONST from './Xexport.vim'
140060579350SBram Moolenaar    CONST = 4321
140160579350SBram Moolenaar  END
140260579350SBram Moolenaar  writefile(import_assign_const_lines, 'Ximport.vim')
140360579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E741: Value is locked: CONST', '', 3)
140460579350SBram Moolenaar
1405f2d5c240SBram Moolenaar  delete('Ximport.vim')
14065269bd2aSBram Moolenaar  delete('Ximport3.vim')
14078a7d6542SBram Moolenaar  delete('Xexport.vim')
14088a7d6542SBram Moolenaar
1409f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
14103e191694SBram Moolenaar  # Flags added or removed are also applied to the restored value.
14113e191694SBram Moolenaar  set cpo=abcd
1412cfcd011fSBram Moolenaar  var lines =<< trim END
1413750802b5SBram Moolenaar    vim9script
1414750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
14153e191694SBram Moolenaar    set cpo+=f
14163e191694SBram Moolenaar    set cpo-=c
14173e191694SBram Moolenaar    g:cpo_after_vim9script = &cpo
1418750802b5SBram Moolenaar  END
1419750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1420750802b5SBram Moolenaar  source Xvim9_script
14213e191694SBram Moolenaar  assert_equal('fabd', &cpo)
1422750802b5SBram Moolenaar  set cpo&vim
1423750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
14243e191694SBram Moolenaar  var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
14253e191694SBram Moolenaar  assert_equal(newcpo, g:cpo_after_vim9script)
14263e191694SBram Moolenaar
1427750802b5SBram Moolenaar  delete('Xvim9_script')
1428750802b5SBram Moolenaarenddef
1429750802b5SBram Moolenaar
14300a84284eSBram Moolenaardef Test_import_as()
14310a84284eSBram Moolenaar  var export_lines =<< trim END
14320a84284eSBram Moolenaar    vim9script
14330a84284eSBram Moolenaar    export var one = 1
14340a84284eSBram Moolenaar    export var yes = 'yes'
1435c967d57aSBram Moolenaar    export var slist: list<string>
14360a84284eSBram Moolenaar  END
14370a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
14380a84284eSBram Moolenaar
14390a84284eSBram Moolenaar  var import_lines =<< trim END
14400a84284eSBram Moolenaar    vim9script
14416c7cc347SBram Moolenaar    var one = 'notused'
14426c7cc347SBram Moolenaar    var yes = 777
14430a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
14440a84284eSBram Moolenaar    assert_equal(1, thatOne)
14450a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
14460a84284eSBram Moolenaar    assert_equal('yes', yesYes)
14470a84284eSBram Moolenaar  END
14480a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
14490a84284eSBram Moolenaar
14500a84284eSBram Moolenaar  import_lines =<< trim END
14510a84284eSBram Moolenaar    vim9script
14520a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
14530a84284eSBram Moolenaar    assert_equal(1, thatOne)
14540a84284eSBram Moolenaar    assert_equal('yes', yesYes)
14550a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
14560a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
14570a84284eSBram Moolenaar  END
14580a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
14590a84284eSBram Moolenaar
1460c967d57aSBram Moolenaar  import_lines =<< trim END
1461c967d57aSBram Moolenaar    vim9script
1462c967d57aSBram Moolenaar    import {slist as impSlist} from './XexportAs'
1463c967d57aSBram Moolenaar    impSlist->add(123)
1464c967d57aSBram Moolenaar  END
1465c967d57aSBram Moolenaar  CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number')
1466c967d57aSBram Moolenaar
14670a84284eSBram Moolenaar  delete('XexportAs')
14680a84284eSBram Moolenaarenddef
14690a84284eSBram Moolenaar
1470803af686SBram Moolenaarfunc g:Trigger()
1471803af686SBram Moolenaar  source Ximport.vim
1472803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1473803af686SBram Moolenaarendfunc
1474803af686SBram Moolenaar
1475803af686SBram Moolenaardef Test_import_export_expr_map()
1476803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1477cfcd011fSBram Moolenaar  var export_lines =<< trim END
1478803af686SBram Moolenaar    vim9script
1479803af686SBram Moolenaar    export def That(): string
1480803af686SBram Moolenaar      return 'yes'
1481803af686SBram Moolenaar    enddef
1482803af686SBram Moolenaar  END
1483803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1484803af686SBram Moolenaar
1485cfcd011fSBram Moolenaar  var import_lines =<< trim END
1486803af686SBram Moolenaar    vim9script
1487803af686SBram Moolenaar    import That from './Xexport_that.vim'
1488803af686SBram Moolenaar    assert_equal('yes', That())
1489803af686SBram Moolenaar  END
1490803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1491803af686SBram Moolenaar
1492803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1493803af686SBram Moolenaar  feedkeys('trigger', "xt")
1494803af686SBram Moolenaar
1495730b2483SBram Moolenaar  delete('Xexport_that.vim')
1496803af686SBram Moolenaar  delete('Ximport.vim')
1497803af686SBram Moolenaar  nunmap trigger
1498803af686SBram Moolenaarenddef
1499803af686SBram Moolenaar
15008e1986e3SBram Moolenaardef Test_import_in_filetype()
15018e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
15028e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1503cfcd011fSBram Moolenaar  var export_lines =<< trim END
15048e1986e3SBram Moolenaar    vim9script
1505cfcd011fSBram Moolenaar    export var That = 'yes'
15068e1986e3SBram Moolenaar  END
1507730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
15088e1986e3SBram Moolenaar
1509cfcd011fSBram Moolenaar  var import_lines =<< trim END
15108e1986e3SBram Moolenaar    vim9script
1511730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
15128e1986e3SBram Moolenaar    assert_equal('yes', That)
15138e1986e3SBram Moolenaar    g:did_load_mytpe = 1
15148e1986e3SBram Moolenaar  END
15158e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
15168e1986e3SBram Moolenaar
1517cfcd011fSBram Moolenaar  var save_rtp = &rtp
15188e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
15198e1986e3SBram Moolenaar
15208e1986e3SBram Moolenaar  filetype plugin on
15218e1986e3SBram Moolenaar  copen
15228e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
15238e1986e3SBram Moolenaar
15248e1986e3SBram Moolenaar  quit!
1525730b2483SBram Moolenaar  delete('Xexport_ft.vim')
15268e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
15278e1986e3SBram Moolenaar  &rtp = save_rtp
15288e1986e3SBram Moolenaarenddef
15298e1986e3SBram Moolenaar
1530efa94447SBram Moolenaardef Test_use_import_in_mapping()
1531cfcd011fSBram Moolenaar  var lines =<< trim END
1532efa94447SBram Moolenaar      vim9script
1533efa94447SBram Moolenaar      export def Funcx()
1534efa94447SBram Moolenaar        g:result = 42
1535efa94447SBram Moolenaar      enddef
1536efa94447SBram Moolenaar  END
1537efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1538efa94447SBram Moolenaar  lines =<< trim END
1539efa94447SBram Moolenaar      vim9script
1540efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1541b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1542efa94447SBram Moolenaar  END
1543efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1544efa94447SBram Moolenaar
1545efa94447SBram Moolenaar  source Xmapscript.vim
1546b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1547efa94447SBram Moolenaar  assert_equal(42, g:result)
1548efa94447SBram Moolenaar
1549efa94447SBram Moolenaar  unlet g:result
1550efa94447SBram Moolenaar  delete('XsomeExport.vim')
1551efa94447SBram Moolenaar  delete('Xmapscript.vim')
1552b3ca9824SBram Moolenaar  nunmap <F3>
1553efa94447SBram Moolenaarenddef
1554efa94447SBram Moolenaar
1555d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1556d3f8a9eeSBram Moolenaar  var lines =<< trim END
1557d3f8a9eeSBram Moolenaar    if has(g:feature)
1558d3f8a9eeSBram Moolenaar      " legacy script
1559d3f8a9eeSBram Moolenaar      let g:legacy = 1
1560d3f8a9eeSBram Moolenaar      finish
1561d3f8a9eeSBram Moolenaar    endif
1562d3f8a9eeSBram Moolenaar    vim9script
1563d3f8a9eeSBram Moolenaar    g:legacy = 0
1564d3f8a9eeSBram Moolenaar  END
1565d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1566d3f8a9eeSBram Moolenaar  g:legacy = -1
1567d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1568d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1569d3f8a9eeSBram Moolenaar
1570d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1571d3f8a9eeSBram Moolenaar  g:legacy = -1
1572d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1573d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1574d3f8a9eeSBram Moolenaarenddef
1575d3f8a9eeSBram Moolenaar
1576750802b5SBram Moolenaardef Test_vim9script_fails()
15778a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
15788a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1579cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
15809721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1581cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1582750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1583750802b5SBram Moolenaar
1584cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1585c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1586c785b9a7SBram Moolenaar
1587e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1588e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
15898a7d6542SBram Moolenaarenddef
15908a7d6542SBram Moolenaar
1591f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1592101f4810SBram Moolenaar  CheckRunVimInTerminal
1593101f4810SBram Moolenaar
15949bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1595c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
15969bb3eb3eSBram Moolenaarendfunc
15979bb3eb3eSBram Moolenaar
1598c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1599cfcd011fSBram Moolenaar  var export =<< trim END
1600101f4810SBram Moolenaar    vim9script
1601101f4810SBram Moolenaar    export def Foo(): number
1602101f4810SBram Moolenaar        return 0
1603101f4810SBram Moolenaar    enddef
1604101f4810SBram Moolenaar  END
1605730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1606101f4810SBram Moolenaar
1607e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
16089bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
16092949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1610101f4810SBram Moolenaar
1611730b2483SBram Moolenaar  delete('XexportCmd.vim')
16129bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
16139bb3eb3eSBram Moolenaarenddef
1614101f4810SBram Moolenaar
16152b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
16162b32700dSBram Moolenaar  var lines =<< trim END
1617a6294955SBram Moolenaar    vim9script
1618a6294955SBram Moolenaar    export var exported = 'thexport'
1619a6294955SBram Moolenaar  END
1620a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1621a6294955SBram Moolenaar  lines =<< trim END
16222b32700dSBram Moolenaar    vim9script noclear
16232b32700dSBram Moolenaar    g:loadCount += 1
16242b32700dSBram Moolenaar    var s:reloaded = 'init'
1625a6294955SBram Moolenaar    import exported from './XExportReload'
16262b32700dSBram Moolenaar
16272b32700dSBram Moolenaar    def Again(): string
16282b32700dSBram Moolenaar      return 'again'
16292b32700dSBram Moolenaar    enddef
16302b32700dSBram Moolenaar
16312b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
16322b32700dSBram Moolenaar    var s:loaded = true
16332b32700dSBram Moolenaar
16342b32700dSBram Moolenaar    var s:notReloaded = 'yes'
16352b32700dSBram Moolenaar    s:reloaded = 'first'
16362b32700dSBram Moolenaar    def g:Values(): list<string>
1637a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
16382b32700dSBram Moolenaar    enddef
16392b32700dSBram Moolenaar
16402b32700dSBram Moolenaar    def Once(): string
16412b32700dSBram Moolenaar      return 'once'
16422b32700dSBram Moolenaar    enddef
16432b32700dSBram Moolenaar  END
16442b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
16452b32700dSBram Moolenaar  g:loadCount = 0
16462b32700dSBram Moolenaar  source XReloaded
16472b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1648a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
16492b32700dSBram Moolenaar  source XReloaded
16502b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1651a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
16522b32700dSBram Moolenaar  source XReloaded
16532b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1654a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
16552b32700dSBram Moolenaar
165648e11c10SBram Moolenaar  delete('XReloaded')
1657a6294955SBram Moolenaar  delete('XExportReload')
16582b32700dSBram Moolenaar  delfunc g:Values
16592b32700dSBram Moolenaar  unlet g:loadCount
1660577dc93dSBram Moolenaar
1661577dc93dSBram Moolenaar  lines =<< trim END
1662577dc93dSBram Moolenaar      vim9script
1663577dc93dSBram Moolenaar      def Inner()
1664577dc93dSBram Moolenaar      enddef
1665577dc93dSBram Moolenaar  END
1666577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1667577dc93dSBram Moolenaar  source XreloadScript.vim
1668577dc93dSBram Moolenaar
1669577dc93dSBram Moolenaar  lines =<< trim END
1670577dc93dSBram Moolenaar      vim9script
1671577dc93dSBram Moolenaar      def Outer()
1672577dc93dSBram Moolenaar        def Inner()
1673577dc93dSBram Moolenaar        enddef
1674577dc93dSBram Moolenaar      enddef
1675577dc93dSBram Moolenaar      defcompile
1676577dc93dSBram Moolenaar  END
1677577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1678577dc93dSBram Moolenaar  source XreloadScript.vim
1679577dc93dSBram Moolenaar
1680577dc93dSBram Moolenaar  delete('XreloadScript.vim')
16812b32700dSBram Moolenaarenddef
16822b32700dSBram Moolenaar
16834c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1684cfcd011fSBram Moolenaar  var lines =<< trim END
16858a7d6542SBram Moolenaar    vim9script
16868a7d6542SBram Moolenaar    const var = ''
1687cfcd011fSBram Moolenaar    var valone = 1234
16888a7d6542SBram Moolenaar    def MyFunc(arg: string)
16898a7d6542SBram Moolenaar       valone = 5678
16908a7d6542SBram Moolenaar    enddef
16918a7d6542SBram Moolenaar  END
1692cfcd011fSBram Moolenaar  var morelines =<< trim END
1693cfcd011fSBram Moolenaar    var valtwo = 222
16948a7d6542SBram Moolenaar    export def GetValtwo(): number
16958a7d6542SBram Moolenaar      return valtwo
16968a7d6542SBram Moolenaar    enddef
16978a7d6542SBram Moolenaar  END
169803afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
16998a7d6542SBram Moolenaar  source Xreload.vim
17008a7d6542SBram Moolenaar  source Xreload.vim
17018a7d6542SBram Moolenaar  source Xreload.vim
17028a7d6542SBram Moolenaar
1703f5be8cdbSBram Moolenaar  # cannot declare a var twice
17048a7d6542SBram Moolenaar  lines =<< trim END
17058a7d6542SBram Moolenaar    vim9script
1706cfcd011fSBram Moolenaar    var valone = 1234
1707cfcd011fSBram Moolenaar    var valone = 5678
17088a7d6542SBram Moolenaar  END
17098a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
171044d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
17118a7d6542SBram Moolenaar
17128a7d6542SBram Moolenaar  delete('Xreload.vim')
17138a7d6542SBram Moolenaar  delete('Ximport.vim')
17148a7d6542SBram Moolenaarenddef
17158a7d6542SBram Moolenaar
171607a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
171707a65d26SBram Moolenaar" compiled function using that variable must fail.
171807a65d26SBram Moolenaardef Test_script_reload_change_type()
171907a65d26SBram Moolenaar  var lines =<< trim END
172007a65d26SBram Moolenaar    vim9script noclear
172107a65d26SBram Moolenaar    var str = 'string'
172207a65d26SBram Moolenaar    def g:GetStr(): string
172307a65d26SBram Moolenaar      return str .. 'xxx'
172407a65d26SBram Moolenaar    enddef
172507a65d26SBram Moolenaar  END
172607a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
172707a65d26SBram Moolenaar  source Xreload.vim
172807a65d26SBram Moolenaar  echo g:GetStr()
172907a65d26SBram Moolenaar
173007a65d26SBram Moolenaar  lines =<< trim END
173107a65d26SBram Moolenaar    vim9script noclear
173207a65d26SBram Moolenaar    var str = 1234
173307a65d26SBram Moolenaar  END
173407a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
173507a65d26SBram Moolenaar  source Xreload.vim
173607a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
173707a65d26SBram Moolenaar
173807a65d26SBram Moolenaar  delfunc g:GetStr
173907a65d26SBram Moolenaar  delete('Xreload.vim')
174007a65d26SBram Moolenaarenddef
174107a65d26SBram Moolenaar
1742c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled
1743c970e422SBram Moolenaarcommand CallFunc echo 'nop'
1744c970e422SBram Moolenaar
1745c970e422SBram Moolenaardef Test_script_reload_from_function()
1746c970e422SBram Moolenaar  var lines =<< trim END
1747c970e422SBram Moolenaar      vim9script
1748c970e422SBram Moolenaar
1749c970e422SBram Moolenaar      if exists('g:loaded')
1750c970e422SBram Moolenaar        finish
1751c970e422SBram Moolenaar      endif
1752c970e422SBram Moolenaar      g:loaded = 1
1753c970e422SBram Moolenaar      delcommand CallFunc
1754c970e422SBram Moolenaar      command CallFunc Func()
1755c970e422SBram Moolenaar      def Func()
1756a4c81beaSBram Moolenaar        so XreloadFunc.vim
1757c970e422SBram Moolenaar        g:didTheFunc = 1
1758c970e422SBram Moolenaar      enddef
1759c970e422SBram Moolenaar  END
1760c970e422SBram Moolenaar  writefile(lines, 'XreloadFunc.vim')
1761c970e422SBram Moolenaar  source XreloadFunc.vim
1762c970e422SBram Moolenaar  CallFunc
1763c970e422SBram Moolenaar  assert_equal(1, g:didTheFunc)
1764c970e422SBram Moolenaar
1765c970e422SBram Moolenaar  delete('XreloadFunc.vim')
1766c970e422SBram Moolenaar  delcommand CallFunc
1767c970e422SBram Moolenaar  unlet g:loaded
1768c970e422SBram Moolenaar  unlet g:didTheFunc
1769c970e422SBram Moolenaarenddef
1770c970e422SBram Moolenaar
17716c3843caSBram Moolenaardef Test_script_var_shadows_function()
17726c3843caSBram Moolenaar  var lines =<< trim END
17736c3843caSBram Moolenaar      vim9script
17746c3843caSBram Moolenaar      def Func(): number
17756c3843caSBram Moolenaar        return 123
17766c3843caSBram Moolenaar      enddef
17776c3843caSBram Moolenaar      var Func = 1
17786c3843caSBram Moolenaar  END
17796c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
17806c3843caSBram Moolenaarenddef
17816c3843caSBram Moolenaar
1782c323527dSBram Moolenaardef Test_script_var_shadows_command()
1783c323527dSBram Moolenaar  var lines =<< trim END
1784c323527dSBram Moolenaar      var undo = 1
1785c323527dSBram Moolenaar      undo = 2
1786c323527dSBram Moolenaar      assert_equal(2, undo)
1787c323527dSBram Moolenaar  END
1788c323527dSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1789c323527dSBram Moolenaar
1790c323527dSBram Moolenaar  lines =<< trim END
1791c323527dSBram Moolenaar      var undo = 1
1792c323527dSBram Moolenaar      undo
1793c323527dSBram Moolenaar  END
1794c323527dSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1207:', 2)
1795c323527dSBram Moolenaarenddef
1796c323527dSBram Moolenaar
179795006e3dSBram Moolenaardef s:RetSome(): string
179895006e3dSBram Moolenaar  return 'some'
179995006e3dSBram Moolenaarenddef
180095006e3dSBram Moolenaar
1801fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1802fe465a01SBram Moolenaar" script-local name.
1803fe465a01SBram Moolenaardef Test_vim9script_funcref()
1804cfcd011fSBram Moolenaar  var sortlines =<< trim END
1805fe465a01SBram Moolenaar      vim9script
1806fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1807bed36b93SBram Moolenaar        return i2 - i1
1808fe465a01SBram Moolenaar      enddef
1809fe465a01SBram Moolenaar
1810fe465a01SBram Moolenaar      export def FastSort(): list<number>
1811fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1812fe465a01SBram Moolenaar      enddef
1813529fb5a5SBram Moolenaar
1814529fb5a5SBram Moolenaar      export def GetString(arg: string): string
1815529fb5a5SBram Moolenaar        return arg
1816529fb5a5SBram Moolenaar      enddef
1817fe465a01SBram Moolenaar  END
1818fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1819fe465a01SBram Moolenaar
1820cfcd011fSBram Moolenaar  var lines =<< trim END
1821fe465a01SBram Moolenaar    vim9script
1822fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1823fe465a01SBram Moolenaar    def Test()
1824fe465a01SBram Moolenaar      g:result = FastSort()
1825fe465a01SBram Moolenaar    enddef
1826fe465a01SBram Moolenaar    Test()
1827529fb5a5SBram Moolenaar
1828529fb5a5SBram Moolenaar    # using a function imported with "as"
1829529fb5a5SBram Moolenaar    import * as anAlias from './Xsort.vim'
1830529fb5a5SBram Moolenaar    assert_equal('yes', anAlias.GetString('yes'))
1831529fb5a5SBram Moolenaar
1832529fb5a5SBram Moolenaar    # using the function from a compiled function
1833529fb5a5SBram Moolenaar    def TestMore(): string
1834ca51cc0aSBram Moolenaar      var s = s:anAlias.GetString('foo')
1835ca51cc0aSBram Moolenaar      return s .. anAlias.GetString('bar')
1836529fb5a5SBram Moolenaar    enddef
1837ca51cc0aSBram Moolenaar    assert_equal('foobar', TestMore())
1838529fb5a5SBram Moolenaar
1839529fb5a5SBram Moolenaar    # error when using a function that isn't exported
1840529fb5a5SBram Moolenaar    assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1841fe465a01SBram Moolenaar  END
1842fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1843fe465a01SBram Moolenaar
1844fe465a01SBram Moolenaar  source Xscript.vim
1845fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1846fe465a01SBram Moolenaar
1847fe465a01SBram Moolenaar  unlet g:result
1848fe465a01SBram Moolenaar  delete('Xsort.vim')
1849fe465a01SBram Moolenaar  delete('Xscript.vim')
185095006e3dSBram Moolenaar
1851cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
185295006e3dSBram Moolenaar  assert_equal('some', Funcref())
1853fe465a01SBram Moolenaarenddef
1854fe465a01SBram Moolenaar
1855601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1856601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1857601e76acSBram Moolenaar" function reference.
1858c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1859cfcd011fSBram Moolenaar  var filterLines =<< trim END
1860c620c055SBram Moolenaar    vim9script
1861c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1862c620c055SBram Moolenaar      return idx % 2 == 1
1863c620c055SBram Moolenaar    enddef
1864c620c055SBram Moolenaar    export def FastFilter(): list<number>
1865c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1866c620c055SBram Moolenaar    enddef
1867601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1868601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1869601e76acSBram Moolenaar    enddef
1870c620c055SBram Moolenaar  END
1871c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1872c620c055SBram Moolenaar
1873cfcd011fSBram Moolenaar  var lines =<< trim END
1874c620c055SBram Moolenaar    vim9script
1875601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1876c620c055SBram Moolenaar    def Test()
1877cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1878c620c055SBram Moolenaar    enddef
1879c620c055SBram Moolenaar    Test()
1880601e76acSBram Moolenaar    def TestDirect()
1881cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1882601e76acSBram Moolenaar    enddef
1883601e76acSBram Moolenaar    TestDirect()
1884c620c055SBram Moolenaar  END
1885601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1886c620c055SBram Moolenaar  delete('Xfilter.vim')
1887c620c055SBram Moolenaarenddef
1888c620c055SBram Moolenaar
18894c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1890cfcd011fSBram Moolenaar  var first_lines =<< trim END
18914c17ad94SBram Moolenaar    vim9script
18924c17ad94SBram Moolenaar    def FuncYes(): string
18934c17ad94SBram Moolenaar      return 'yes'
18944c17ad94SBram Moolenaar    enddef
18954c17ad94SBram Moolenaar  END
1896cfcd011fSBram Moolenaar  var withno_lines =<< trim END
18974c17ad94SBram Moolenaar    def FuncNo(): string
18984c17ad94SBram Moolenaar      return 'no'
18994c17ad94SBram Moolenaar    enddef
19004c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
19014c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
19024c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
190303afdcf1SBram Moolenaar    enddef
190403afdcf1SBram Moolenaar  END
1905cfcd011fSBram Moolenaar  var nono_lines =<< trim END
190603afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
190703afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
190844d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
19094c17ad94SBram Moolenaar    enddef
19104c17ad94SBram Moolenaar  END
19114c17ad94SBram Moolenaar
19124c17ad94SBram Moolenaar  # FuncNo() is defined
191303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
19144c17ad94SBram Moolenaar  source Xreloaded.vim
19154c17ad94SBram Moolenaar  g:DoCheck(true)
19164c17ad94SBram Moolenaar
19174c17ad94SBram Moolenaar  # FuncNo() is not redefined
191803afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
19194c17ad94SBram Moolenaar  source Xreloaded.vim
19205082471fSBram Moolenaar  g:DoCheck(false)
19214c17ad94SBram Moolenaar
19224c17ad94SBram Moolenaar  # FuncNo() is back
192303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
19244c17ad94SBram Moolenaar  source Xreloaded.vim
19255082471fSBram Moolenaar  g:DoCheck(false)
19264c17ad94SBram Moolenaar
19274c17ad94SBram Moolenaar  delete('Xreloaded.vim')
19284c17ad94SBram Moolenaarenddef
19294c17ad94SBram Moolenaar
193089483d40SBram Moolenaardef Test_vim9script_reload_delvar()
193189483d40SBram Moolenaar  # write the script with a script-local variable
1932cfcd011fSBram Moolenaar  var lines =<< trim END
193389483d40SBram Moolenaar    vim9script
1934cfcd011fSBram Moolenaar    var name = 'string'
193589483d40SBram Moolenaar  END
193689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
193789483d40SBram Moolenaar  source XreloadVar.vim
193889483d40SBram Moolenaar
193989483d40SBram Moolenaar  # now write the script using the same variable locally - works
194089483d40SBram Moolenaar  lines =<< trim END
194189483d40SBram Moolenaar    vim9script
194289483d40SBram Moolenaar    def Func()
1943cfcd011fSBram Moolenaar      var name = 'string'
194489483d40SBram Moolenaar    enddef
194589483d40SBram Moolenaar  END
194689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
194789483d40SBram Moolenaar  source XreloadVar.vim
194889483d40SBram Moolenaar
194989483d40SBram Moolenaar  delete('XreloadVar.vim')
195089483d40SBram Moolenaarenddef
195189483d40SBram Moolenaar
19528a7d6542SBram Moolenaardef Test_import_absolute()
1953cfcd011fSBram Moolenaar  var import_lines = [
1954e6085c53SBram Moolenaar        'vim9script',
1955e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1956e6085c53SBram Moolenaar        'def UseExported()',
1957e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1958e6085c53SBram Moolenaar        '  exported = 8888',
1959e6085c53SBram Moolenaar        '  g:imported_after = exported',
1960e6085c53SBram Moolenaar        'enddef',
1961e6085c53SBram Moolenaar        'UseExported()',
1962e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1963e6085c53SBram Moolenaar        ]
19648a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
19658a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
19668a7d6542SBram Moolenaar
19678a7d6542SBram Moolenaar  source Ximport_abs.vim
19688a7d6542SBram Moolenaar
19698a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
19704e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1971fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1972fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1973fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1974fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1975fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1976fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1977fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1978fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1979fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1980fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1981e6085c53SBram Moolenaar        g:import_disassembled)
1982b3ca9824SBram Moolenaar
1983b3ca9824SBram Moolenaar  Undo_export_script_lines()
19848a7d6542SBram Moolenaar  unlet g:imported_abs
19854e12a5dfSBram Moolenaar  unlet g:import_disassembled
19868a7d6542SBram Moolenaar
19878a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
19888a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
19898a7d6542SBram Moolenaarenddef
19908a7d6542SBram Moolenaar
19918a7d6542SBram Moolenaardef Test_import_rtp()
1992cfcd011fSBram Moolenaar  var import_lines = [
1993e6085c53SBram Moolenaar        'vim9script',
1994e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1995e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1996e6085c53SBram Moolenaar        ]
19978a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
1998b885a7c7SBram Moolenaar  mkdir('import', 'p')
1999b885a7c7SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
20008a7d6542SBram Moolenaar
2001cfcd011fSBram Moolenaar  var save_rtp = &rtp
20028a7d6542SBram Moolenaar  &rtp = getcwd()
20038a7d6542SBram Moolenaar  source Ximport_rtp.vim
20048a7d6542SBram Moolenaar  &rtp = save_rtp
20058a7d6542SBram Moolenaar
20068a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
20078a7d6542SBram Moolenaar
2008b3ca9824SBram Moolenaar  Undo_export_script_lines()
2009b3ca9824SBram Moolenaar  unlet g:imported_rtp
20108a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
2011b885a7c7SBram Moolenaar  delete('import', 'rf')
20128a7d6542SBram Moolenaarenddef
20138a7d6542SBram Moolenaar
201425e0f586SBram Moolenaardef Test_import_compile_error()
2015cfcd011fSBram Moolenaar  var export_lines = [
201625e0f586SBram Moolenaar        'vim9script',
201725e0f586SBram Moolenaar        'export def ExpFunc(): string',
201825e0f586SBram Moolenaar        '  return notDefined',
201925e0f586SBram Moolenaar        'enddef',
202025e0f586SBram Moolenaar        ]
202125e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
202225e0f586SBram Moolenaar
2023cfcd011fSBram Moolenaar  var import_lines = [
202425e0f586SBram Moolenaar        'vim9script',
202525e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
202625e0f586SBram Moolenaar        'def ImpFunc()',
202725e0f586SBram Moolenaar        '  echo ExpFunc()',
202825e0f586SBram Moolenaar        'enddef',
202925e0f586SBram Moolenaar        'defcompile',
203025e0f586SBram Moolenaar        ]
203125e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
203225e0f586SBram Moolenaar
203325e0f586SBram Moolenaar  try
203425e0f586SBram Moolenaar    source Ximport.vim
203525e0f586SBram Moolenaar  catch /E1001/
2036f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
20377707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
203825e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
203925e0f586SBram Moolenaar  endtry
204025e0f586SBram Moolenaar
204125e0f586SBram Moolenaar  delete('Xexported.vim')
204225e0f586SBram Moolenaar  delete('Ximport.vim')
204325e0f586SBram Moolenaarenddef
204425e0f586SBram Moolenaar
2045c4ce36d4SBram Moolenaardef Test_func_redefine_error()
2046cfcd011fSBram Moolenaar  var lines = [
2047c4ce36d4SBram Moolenaar        'vim9script',
2048c4ce36d4SBram Moolenaar        'def Func()',
2049c4ce36d4SBram Moolenaar        '  eval [][0]',
2050c4ce36d4SBram Moolenaar        'enddef',
2051c4ce36d4SBram Moolenaar        'Func()',
2052c4ce36d4SBram Moolenaar        ]
2053c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
2054c4ce36d4SBram Moolenaar
2055c4ce36d4SBram Moolenaar  for count in range(3)
2056c4ce36d4SBram Moolenaar    try
2057c4ce36d4SBram Moolenaar      source Xtestscript.vim
2058c4ce36d4SBram Moolenaar    catch /E684/
2059c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
2060c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
2061c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
2062c4ce36d4SBram Moolenaar    endtry
2063c4ce36d4SBram Moolenaar  endfor
2064c4ce36d4SBram Moolenaar
2065c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
2066c4ce36d4SBram Moolenaarenddef
2067c4ce36d4SBram Moolenaar
2068eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
2069cfcd011fSBram Moolenaar  var export_lines =<< trim END
2070eef2102eSBram Moolenaar      vim9script
2071eef2102eSBram Moolenaar      export def Func()
2072eef2102eSBram Moolenaar        echo 'imported'
2073eef2102eSBram Moolenaar      enddef
2074eef2102eSBram Moolenaar  END
2075eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
2076eef2102eSBram Moolenaar
2077cfcd011fSBram Moolenaar  var lines =<< trim END
2078eef2102eSBram Moolenaar    vim9script
2079eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2080eef2102eSBram Moolenaar    def Func()
2081eef2102eSBram Moolenaar      echo 'local to function'
2082eef2102eSBram Moolenaar    enddef
2083eef2102eSBram Moolenaar  END
2084eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2085eef2102eSBram Moolenaar
2086eef2102eSBram Moolenaar  lines =<< trim END
2087eef2102eSBram Moolenaar    vim9script
2088eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2089eef2102eSBram Moolenaar    def Outer()
2090eef2102eSBram Moolenaar      def Func()
2091eef2102eSBram Moolenaar        echo 'local to function'
2092eef2102eSBram Moolenaar      enddef
2093eef2102eSBram Moolenaar    enddef
2094eef2102eSBram Moolenaar    defcompile
2095eef2102eSBram Moolenaar  END
2096eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2097eef2102eSBram Moolenaar
2098eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
2099eef2102eSBram Moolenaarenddef
2100eef2102eSBram Moolenaar
2101b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
2102cfcd011fSBram Moolenaar  var lines =<< trim END
2103b9a2cac3SBram Moolenaar    vim9script
2104b9a2cac3SBram Moolenaar    def Func()
2105b9a2cac3SBram Moolenaar      echo 'one'
2106b9a2cac3SBram Moolenaar    enddef
2107b9a2cac3SBram Moolenaar    def Func()
2108b9a2cac3SBram Moolenaar      echo 'two'
2109b9a2cac3SBram Moolenaar    enddef
2110b9a2cac3SBram Moolenaar  END
2111b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2112fa211f3cSBram Moolenaar
2113fa211f3cSBram Moolenaar  lines =<< trim END
2114fa211f3cSBram Moolenaar    vim9script
2115fa211f3cSBram Moolenaar    def Foo(): string
2116fa211f3cSBram Moolenaar      return 'foo'
2117fa211f3cSBram Moolenaar      enddef
2118fa211f3cSBram Moolenaar    def Func()
2119cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
2120fa211f3cSBram Moolenaar    enddef
2121fa211f3cSBram Moolenaar    defcompile
2122fa211f3cSBram Moolenaar  END
2123fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2124b9a2cac3SBram Moolenaarenddef
2125b9a2cac3SBram Moolenaar
21268a7d6542SBram Moolenaardef Test_fixed_size_list()
2127f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
2128cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
21298a7d6542SBram Moolenaar  l->remove(0)
21308a7d6542SBram Moolenaar  l->add(5)
21318a7d6542SBram Moolenaar  l->insert(99, 1)
21320f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
21338a7d6542SBram Moolenaarenddef
21348a7d6542SBram Moolenaar
2135ae616494SBram Moolenaardef Test_no_insert_xit()
2136d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2137d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2138d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2139d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2140d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2141ae616494SBram Moolenaar
2142ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2143ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2144ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2145ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2146f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2147f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
21486508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
21496508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
2150f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2151f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2152f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2153ae616494SBram Moolenaarenddef
2154ae616494SBram Moolenaar
2155158906cfSBram Moolenaardef IfElse(what: number): string
2156cfcd011fSBram Moolenaar  var res = ''
2157158906cfSBram Moolenaar  if what == 1
2158158906cfSBram Moolenaar    res = "one"
2159158906cfSBram Moolenaar  elseif what == 2
2160158906cfSBram Moolenaar    res = "two"
2161a259d8d3SBram Moolenaar  else
2162158906cfSBram Moolenaar    res = "three"
2163a259d8d3SBram Moolenaar  endif
2164158906cfSBram Moolenaar  return res
2165a259d8d3SBram Moolenaarenddef
2166a259d8d3SBram Moolenaar
2167158906cfSBram Moolenaardef Test_if_elseif_else()
2168158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2169158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2170158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
21710f18b6d1SBram Moolenaarenddef
21720f18b6d1SBram Moolenaar
2173e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2174d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2175d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2176d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2177ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
2178d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
21796628b7ebSBram Moolenaar
21806628b7ebSBram Moolenaar  var lines =<< trim END
21816628b7ebSBram Moolenaar      var s = ''
21826628b7ebSBram Moolenaar      if s = ''
21836628b7ebSBram Moolenaar      endif
21846628b7ebSBram Moolenaar  END
21856628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
21866628b7ebSBram Moolenaar
21876628b7ebSBram Moolenaar  lines =<< trim END
21886628b7ebSBram Moolenaar      var s = ''
21896628b7ebSBram Moolenaar      if s == ''
21906628b7ebSBram Moolenaar      elseif s = ''
21916628b7ebSBram Moolenaar      endif
21926628b7ebSBram Moolenaar  END
21936628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2194e8c4abbbSBram Moolenaarenddef
2195e8c4abbbSBram Moolenaar
21966d69bf60SBram Moolenaarlet g:bool_true = v:true
21976d69bf60SBram Moolenaarlet g:bool_false = v:false
21986d69bf60SBram Moolenaar
21996d69bf60SBram Moolenaardef Test_if_const_expr()
2200cfcd011fSBram Moolenaar  var res = false
22016d69bf60SBram Moolenaar  if true ? true : false
22026d69bf60SBram Moolenaar    res = true
22036d69bf60SBram Moolenaar  endif
22046d69bf60SBram Moolenaar  assert_equal(true, res)
22056d69bf60SBram Moolenaar
2206585fea7bSBram Moolenaar  g:glob = 2
2207585fea7bSBram Moolenaar  if false
22086797966dSBram Moolenaar    execute('g:glob = 3')
2209585fea7bSBram Moolenaar  endif
2210585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2211585fea7bSBram Moolenaar  if true
22126797966dSBram Moolenaar    execute('g:glob = 3')
2213585fea7bSBram Moolenaar  endif
2214585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2215585fea7bSBram Moolenaar
22166d69bf60SBram Moolenaar  res = false
22176d69bf60SBram Moolenaar  if g:bool_true ? true : false
22186d69bf60SBram Moolenaar    res = true
22196d69bf60SBram Moolenaar  endif
22206d69bf60SBram Moolenaar  assert_equal(true, res)
22216d69bf60SBram Moolenaar
22226d69bf60SBram Moolenaar  res = false
22236d69bf60SBram Moolenaar  if true ? g:bool_true : false
22246d69bf60SBram Moolenaar    res = true
22256d69bf60SBram Moolenaar  endif
22266d69bf60SBram Moolenaar  assert_equal(true, res)
22276d69bf60SBram Moolenaar
22286d69bf60SBram Moolenaar  res = false
22296d69bf60SBram Moolenaar  if true ? true : g:bool_false
22306d69bf60SBram Moolenaar    res = true
22316d69bf60SBram Moolenaar  endif
22326d69bf60SBram Moolenaar  assert_equal(true, res)
22336d69bf60SBram Moolenaar
22346d69bf60SBram Moolenaar  res = false
22356d69bf60SBram Moolenaar  if true ? false : true
22366d69bf60SBram Moolenaar    res = true
22376d69bf60SBram Moolenaar  endif
22386d69bf60SBram Moolenaar  assert_equal(false, res)
22396d69bf60SBram Moolenaar
22406d69bf60SBram Moolenaar  res = false
22416d69bf60SBram Moolenaar  if false ? false : true
22426d69bf60SBram Moolenaar    res = true
22436d69bf60SBram Moolenaar  endif
22446d69bf60SBram Moolenaar  assert_equal(true, res)
22456d69bf60SBram Moolenaar
22466d69bf60SBram Moolenaar  res = false
22476d69bf60SBram Moolenaar  if false ? true : false
22486d69bf60SBram Moolenaar    res = true
22496d69bf60SBram Moolenaar  endif
22506d69bf60SBram Moolenaar  assert_equal(false, res)
22516d69bf60SBram Moolenaar
22526d69bf60SBram Moolenaar  res = false
2253e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2254e8c4abbbSBram Moolenaar    res = true
2255e8c4abbbSBram Moolenaar  endif
2256e8c4abbbSBram Moolenaar  assert_equal(false, res)
2257e8c4abbbSBram Moolenaar
2258e8c4abbbSBram Moolenaar  res = false
22596d69bf60SBram Moolenaar  if true && true
22606d69bf60SBram Moolenaar    res = true
22616d69bf60SBram Moolenaar  endif
22626d69bf60SBram Moolenaar  assert_equal(true, res)
22636d69bf60SBram Moolenaar
22646d69bf60SBram Moolenaar  res = false
22656d69bf60SBram Moolenaar  if true && false
22666d69bf60SBram Moolenaar    res = true
22676d69bf60SBram Moolenaar  endif
22686d69bf60SBram Moolenaar  assert_equal(false, res)
22696d69bf60SBram Moolenaar
22706d69bf60SBram Moolenaar  res = false
22716d69bf60SBram Moolenaar  if g:bool_true && false
22726d69bf60SBram Moolenaar    res = true
22736d69bf60SBram Moolenaar  endif
22746d69bf60SBram Moolenaar  assert_equal(false, res)
22756d69bf60SBram Moolenaar
22766d69bf60SBram Moolenaar  res = false
22776d69bf60SBram Moolenaar  if true && g:bool_false
22786d69bf60SBram Moolenaar    res = true
22796d69bf60SBram Moolenaar  endif
22806d69bf60SBram Moolenaar  assert_equal(false, res)
22816d69bf60SBram Moolenaar
22826d69bf60SBram Moolenaar  res = false
22836d69bf60SBram Moolenaar  if false && false
22846d69bf60SBram Moolenaar    res = true
22856d69bf60SBram Moolenaar  endif
22866d69bf60SBram Moolenaar  assert_equal(false, res)
22876d69bf60SBram Moolenaar
22886d69bf60SBram Moolenaar  res = false
22896d69bf60SBram Moolenaar  if true || false
22906d69bf60SBram Moolenaar    res = true
22916d69bf60SBram Moolenaar  endif
22926d69bf60SBram Moolenaar  assert_equal(true, res)
22936d69bf60SBram Moolenaar
22946d69bf60SBram Moolenaar  res = false
22956d69bf60SBram Moolenaar  if g:bool_true || false
22966d69bf60SBram Moolenaar    res = true
22976d69bf60SBram Moolenaar  endif
22986d69bf60SBram Moolenaar  assert_equal(true, res)
22996d69bf60SBram Moolenaar
23006d69bf60SBram Moolenaar  res = false
23016d69bf60SBram Moolenaar  if true || g:bool_false
23026d69bf60SBram Moolenaar    res = true
23036d69bf60SBram Moolenaar  endif
23046d69bf60SBram Moolenaar  assert_equal(true, res)
23056d69bf60SBram Moolenaar
23066d69bf60SBram Moolenaar  res = false
23076d69bf60SBram Moolenaar  if false || false
23086d69bf60SBram Moolenaar    res = true
23096d69bf60SBram Moolenaar  endif
23106d69bf60SBram Moolenaar  assert_equal(false, res)
23113988f64fSBram Moolenaar
23123988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
2313c323527dSBram Moolenaar  if false | eval 1 + 2 | endif
23143988f64fSBram Moolenaar  if false | eval burp + 234 | endif
23153988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
23163988f64fSBram Moolenaar  if false
23173988f64fSBram Moolenaar    burp
23183988f64fSBram Moolenaar  endif
231980c34ca3SBram Moolenaarenddef
23206d69bf60SBram Moolenaar
232180c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2322d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2323d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2324d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2325d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
23266d69bf60SBram Moolenaarenddef
23276d69bf60SBram Moolenaar
232872abcf42SBram Moolenaardef RunNested(i: number): number
2329cfcd011fSBram Moolenaar  var x: number = 0
233072abcf42SBram Moolenaar  if i % 2
233172abcf42SBram Moolenaar    if 1
2332f5be8cdbSBram Moolenaar      # comment
233372abcf42SBram Moolenaar    else
2334f5be8cdbSBram Moolenaar      # comment
233572abcf42SBram Moolenaar    endif
233672abcf42SBram Moolenaar    x += 1
233772abcf42SBram Moolenaar  else
233872abcf42SBram Moolenaar    x += 1000
233972abcf42SBram Moolenaar  endif
234072abcf42SBram Moolenaar  return x
234172abcf42SBram Moolenaarenddef
234272abcf42SBram Moolenaar
234372abcf42SBram Moolenaardef Test_nested_if()
234472abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
234572abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
234672abcf42SBram Moolenaarenddef
234772abcf42SBram Moolenaar
2348ad39c094SBram Moolenaardef Test_execute_cmd()
2349e4984290SBram Moolenaar  # missing argument is ignored
2350e4984290SBram Moolenaar  execute
2351e4984290SBram Moolenaar  execute # comment
2352e4984290SBram Moolenaar
2353ad39c094SBram Moolenaar  new
2354ad39c094SBram Moolenaar  setline(1, 'default')
2355d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2356ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2357a72cfb80SBram Moolenaar
2358d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2359a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2360a72cfb80SBram Moolenaar
2361cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2362cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2363a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2364ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2365a72cfb80SBram Moolenaar
2366d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2367ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2368a72cfb80SBram Moolenaar
2369cfcd011fSBram Moolenaar  var cmd_first = 'call '
2370cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2371ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2372ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2373ad39c094SBram Moolenaar  bwipe!
2374585fea7bSBram Moolenaar
2375cfcd011fSBram Moolenaar  var n = true
23762d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
23772d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
23782d6b20d6SBram Moolenaar
2379e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2380e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2381e5abf7afSBram Moolenaar
2382d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2383d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2384d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2385ad39c094SBram Moolenaarenddef
2386ad39c094SBram Moolenaar
238747e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2388f5be8cdbSBram Moolenaar  # only checks line continuation
2389cfcd011fSBram Moolenaar  var lines =<< trim END
239047e880d6SBram Moolenaar      vim9script
239147e880d6SBram Moolenaar      execute 'g:someVar'
239247e880d6SBram Moolenaar                .. ' = ' ..
239347e880d6SBram Moolenaar                   '28'
239447e880d6SBram Moolenaar      assert_equal(28, g:someVar)
239547e880d6SBram Moolenaar      unlet g:someVar
239647e880d6SBram Moolenaar  END
239747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
239847e880d6SBram Moolenaarenddef
239947e880d6SBram Moolenaar
2400ad39c094SBram Moolenaardef Test_echo_cmd()
2401a72cfb80SBram Moolenaar  echo 'some' # comment
2402585fea7bSBram Moolenaar  echon 'thing'
2403ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2404ad39c094SBram Moolenaar
2405a72cfb80SBram Moolenaar  echo "some" # comment
2406a72cfb80SBram Moolenaar  echon "thing"
2407a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2408a72cfb80SBram Moolenaar
2409cfcd011fSBram Moolenaar  var str1 = 'some'
2410cfcd011fSBram Moolenaar  var str2 = 'more'
2411ad39c094SBram Moolenaar  echo str1 str2
2412ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2413a72cfb80SBram Moolenaar
2414d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2415ad39c094SBram Moolenaarenddef
2416ad39c094SBram Moolenaar
2417f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2418f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2419f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2420f93c7feaSBram Moolenaar  echo 'clear'
2421df069eecSBram Moolenaar  :1messages
2422f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2423f93c7feaSBram Moolenaar
2424d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2425f93c7feaSBram Moolenaarenddef
2426f93c7feaSBram Moolenaar
242747e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2428f5be8cdbSBram Moolenaar  # only checks line continuation
2429cfcd011fSBram Moolenaar  var lines =<< trim END
243047e880d6SBram Moolenaar      vim9script
243147e880d6SBram Moolenaar      echomsg 'here'
243247e880d6SBram Moolenaar                .. ' is ' ..
243347e880d6SBram Moolenaar                   'a message'
243447e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
243547e880d6SBram Moolenaar  END
243647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
243747e880d6SBram Moolenaarenddef
243847e880d6SBram Moolenaar
2439f93c7feaSBram Moolenaardef Test_echoerr_cmd()
244040ee466cSBram Moolenaar  try
244140ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
244240ee466cSBram Moolenaar  catch
244340ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
244440ee466cSBram Moolenaar  endtry
2445f93c7feaSBram Moolenaarenddef
2446f93c7feaSBram Moolenaar
244747e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2448f5be8cdbSBram Moolenaar  # only checks line continuation
2449cfcd011fSBram Moolenaar  var lines =<< trim END
245047e880d6SBram Moolenaar      vim9script
245147e880d6SBram Moolenaar      try
245247e880d6SBram Moolenaar        echoerr 'this'
245347e880d6SBram Moolenaar                .. ' is ' ..
245447e880d6SBram Moolenaar                   'wrong'
245547e880d6SBram Moolenaar      catch
245647e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
245747e880d6SBram Moolenaar      endtry
245847e880d6SBram Moolenaar  END
245947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
246047e880d6SBram Moolenaarenddef
246147e880d6SBram Moolenaar
246241fe0617SBram Moolenaardef Test_for_outside_of_function()
2463cfcd011fSBram Moolenaar  var lines =<< trim END
246441fe0617SBram Moolenaar    vim9script
246541fe0617SBram Moolenaar    new
246641fe0617SBram Moolenaar    for var in range(0, 3)
246741fe0617SBram Moolenaar      append(line('$'), var)
246841fe0617SBram Moolenaar    endfor
246941fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
247041fe0617SBram Moolenaar    bwipe!
2471522eefd9SBram Moolenaar
2472522eefd9SBram Moolenaar    var result = ''
2473522eefd9SBram Moolenaar    for i in [1, 2, 3]
2474522eefd9SBram Moolenaar      var loop = ' loop ' .. i
2475522eefd9SBram Moolenaar      result ..= loop
2476522eefd9SBram Moolenaar    endfor
2477522eefd9SBram Moolenaar    assert_equal(' loop 1 loop 2 loop 3', result)
247841fe0617SBram Moolenaar  END
247941fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
248041fe0617SBram Moolenaar  source Xvim9for.vim
248141fe0617SBram Moolenaar  delete('Xvim9for.vim')
248241fe0617SBram Moolenaarenddef
24838a7d6542SBram Moolenaar
2484e8c4abbbSBram Moolenaardef Test_for_loop()
2485f2253963SBram Moolenaar  var lines =<< trim END
2486cfcd011fSBram Moolenaar      var result = ''
2487e8c4abbbSBram Moolenaar      for cnt in range(7)
2488e8c4abbbSBram Moolenaar        if cnt == 4
2489e8c4abbbSBram Moolenaar          break
2490e8c4abbbSBram Moolenaar        endif
2491e8c4abbbSBram Moolenaar        if cnt == 2
2492e8c4abbbSBram Moolenaar          continue
2493e8c4abbbSBram Moolenaar        endif
2494e8c4abbbSBram Moolenaar        result ..= cnt .. '_'
2495e8c4abbbSBram Moolenaar      endfor
2496e8c4abbbSBram Moolenaar      assert_equal('0_1_3_', result)
24970ad3e894SBram Moolenaar
2498cfcd011fSBram Moolenaar      var concat = ''
24990ad3e894SBram Moolenaar      for str in eval('["one", "two"]')
25000ad3e894SBram Moolenaar        concat ..= str
25010ad3e894SBram Moolenaar      endfor
25020ad3e894SBram Moolenaar      assert_equal('onetwo', concat)
250338bd8de5SBram Moolenaar
250438bd8de5SBram Moolenaar      var total = 0
250538bd8de5SBram Moolenaar      for nr in
250638bd8de5SBram Moolenaar          [1, 2, 3]
250738bd8de5SBram Moolenaar        total += nr
250838bd8de5SBram Moolenaar      endfor
250938bd8de5SBram Moolenaar      assert_equal(6, total)
251038bd8de5SBram Moolenaar
251138bd8de5SBram Moolenaar      total = 0
251238bd8de5SBram Moolenaar      for nr
251338bd8de5SBram Moolenaar        in [1, 2, 3]
251438bd8de5SBram Moolenaar        total += nr
251538bd8de5SBram Moolenaar      endfor
251638bd8de5SBram Moolenaar      assert_equal(6, total)
251738bd8de5SBram Moolenaar
251838bd8de5SBram Moolenaar      total = 0
251938bd8de5SBram Moolenaar      for nr
252038bd8de5SBram Moolenaar        in
252138bd8de5SBram Moolenaar        [1, 2, 3]
252238bd8de5SBram Moolenaar        total += nr
252338bd8de5SBram Moolenaar      endfor
252438bd8de5SBram Moolenaar      assert_equal(6, total)
2525036d0714SBram Moolenaar
2526a3589a0dSBram Moolenaar      # with type
2527a3589a0dSBram Moolenaar      total = 0
2528a3589a0dSBram Moolenaar      for n: number in [1, 2, 3]
2529a3589a0dSBram Moolenaar        total += n
2530a3589a0dSBram Moolenaar      endfor
2531a3589a0dSBram Moolenaar      assert_equal(6, total)
2532a3589a0dSBram Moolenaar
2533fe090eb5SBram Moolenaar      var chars = ''
2534fe090eb5SBram Moolenaar      for s: string in 'foobar'
2535fe090eb5SBram Moolenaar        chars ..= s
2536fe090eb5SBram Moolenaar      endfor
2537fe090eb5SBram Moolenaar      assert_equal('foobar', chars)
2538fe090eb5SBram Moolenaar
25395ede5b23SBram Moolenaar      chars = ''
25405ede5b23SBram Moolenaar      for x: string in {a: 'a', b: 'b'}->values()
25415ede5b23SBram Moolenaar        chars ..= x
25425ede5b23SBram Moolenaar      endfor
25435ede5b23SBram Moolenaar      assert_equal('ab', chars)
25445ede5b23SBram Moolenaar
2545a3589a0dSBram Moolenaar      # unpack with type
2546f2253963SBram Moolenaar      var res = ''
2547a3589a0dSBram Moolenaar      for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2548a3589a0dSBram Moolenaar        res ..= n .. s
2549a3589a0dSBram Moolenaar      endfor
2550a3589a0dSBram Moolenaar      assert_equal('1a2b', res)
2551a3589a0dSBram Moolenaar
2552444d8783SBram Moolenaar      # unpack with one var
2553444d8783SBram Moolenaar      var reslist = []
2554444d8783SBram Moolenaar      for [x] in [['aaa'], ['bbb']]
2555444d8783SBram Moolenaar        reslist->add(x)
2556444d8783SBram Moolenaar      endfor
2557444d8783SBram Moolenaar      assert_equal(['aaa', 'bbb'], reslist)
2558444d8783SBram Moolenaar
2559a3589a0dSBram Moolenaar      # loop over string
2560a3589a0dSBram Moolenaar      res = ''
256174e54fcbSBram Moolenaar      for c in 'aéc̀d'
256274e54fcbSBram Moolenaar        res ..= c .. '-'
256374e54fcbSBram Moolenaar      endfor
256474e54fcbSBram Moolenaar      assert_equal('a-é-c̀-d-', res)
256574e54fcbSBram Moolenaar
256674e54fcbSBram Moolenaar      res = ''
256774e54fcbSBram Moolenaar      for c in ''
256874e54fcbSBram Moolenaar        res ..= c .. '-'
256974e54fcbSBram Moolenaar      endfor
257074e54fcbSBram Moolenaar      assert_equal('', res)
257174e54fcbSBram Moolenaar
257274e54fcbSBram Moolenaar      res = ''
257374e54fcbSBram Moolenaar      for c in test_null_string()
257474e54fcbSBram Moolenaar        res ..= c .. '-'
257574e54fcbSBram Moolenaar      endfor
257674e54fcbSBram Moolenaar      assert_equal('', res)
2577f2253963SBram Moolenaar
2578f2253963SBram Moolenaar      var foo: list<dict<any>> = [
2579f2253963SBram Moolenaar              {a: 'Cat'}
2580f2253963SBram Moolenaar            ]
2581f2253963SBram Moolenaar      for dd in foo
2582f2253963SBram Moolenaar        dd.counter = 12
2583f2253963SBram Moolenaar      endfor
2584f2253963SBram Moolenaar      assert_equal([{a: 'Cat', counter: 12}], foo)
2585ad2d4969SBram Moolenaar
2586ad2d4969SBram Moolenaar      reslist = []
2587ad2d4969SBram Moolenaar      for _ in range(3)
2588ad2d4969SBram Moolenaar        reslist->add('x')
2589ad2d4969SBram Moolenaar      endfor
2590ad2d4969SBram Moolenaar      assert_equal(['x', 'x', 'x'], reslist)
2591f2253963SBram Moolenaar  END
2592f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2593e8c4abbbSBram Moolenaarenddef
2594e8c4abbbSBram Moolenaar
25952eb6fc3bSBram Moolenaardef Test_for_loop_with_closure()
25962eb6fc3bSBram Moolenaar  var lines =<< trim END
25972eb6fc3bSBram Moolenaar      var flist: list<func>
25982eb6fc3bSBram Moolenaar      for i in range(5)
25992eb6fc3bSBram Moolenaar        var inloop = i
26002eb6fc3bSBram Moolenaar        flist[i] = () => inloop
26012eb6fc3bSBram Moolenaar      endfor
26022eb6fc3bSBram Moolenaar      for i in range(5)
26032eb6fc3bSBram Moolenaar        assert_equal(4, flist[i]())
26042eb6fc3bSBram Moolenaar      endfor
26052eb6fc3bSBram Moolenaar  END
26062eb6fc3bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
26072eb6fc3bSBram Moolenaar
26082eb6fc3bSBram Moolenaar  lines =<< trim END
26092eb6fc3bSBram Moolenaar      var flist: list<func>
26102eb6fc3bSBram Moolenaar      for i in range(5)
26112eb6fc3bSBram Moolenaar        var inloop = i
26122eb6fc3bSBram Moolenaar        flist[i] = () => {
26132eb6fc3bSBram Moolenaar              return inloop
26142eb6fc3bSBram Moolenaar            }
26152eb6fc3bSBram Moolenaar      endfor
26162eb6fc3bSBram Moolenaar      for i in range(5)
26172eb6fc3bSBram Moolenaar        assert_equal(4, flist[i]())
26182eb6fc3bSBram Moolenaar      endfor
26192eb6fc3bSBram Moolenaar  END
26202eb6fc3bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
26212eb6fc3bSBram Moolenaarenddef
26222eb6fc3bSBram Moolenaar
2623e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2624442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:')
2625442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:')
2626442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:')
2627442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2628442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2629442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:')
2630d4ab807dSBram Moolenaar  CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2631822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
26322d870f8dSBram Moolenaar  delfunc! g:Func
2633675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2634675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2635675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
263674e54fcbSBram Moolenaar
263774e54fcbSBram Moolenaar  # wrong type detected at compile time
263874e54fcbSBram Moolenaar  CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
263974e54fcbSBram Moolenaar
264074e54fcbSBram Moolenaar  # wrong type detected at runtime
264174e54fcbSBram Moolenaar  g:adict = {a: 1}
264274e54fcbSBram Moolenaar  CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
264374e54fcbSBram Moolenaar  unlet g:adict
2644f6a8d420SBram Moolenaar
2645f6a8d420SBram Moolenaar  var lines =<< trim END
2646f6a8d420SBram Moolenaar      var d: list<dict<any>> = [{a: 0}]
2647f6a8d420SBram Moolenaar      for e in d
2648f6a8d420SBram Moolenaar        e = {a: 0, b: ''}
2649f6a8d420SBram Moolenaar      endfor
2650f6a8d420SBram Moolenaar  END
2651f6a8d420SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3)
2652fe090eb5SBram Moolenaar
2653fe090eb5SBram Moolenaar  lines =<< trim END
2654fe090eb5SBram Moolenaar      for nr: number in ['foo']
2655fe090eb5SBram Moolenaar      endfor
2656fe090eb5SBram Moolenaar  END
2657fe090eb5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2658404557e6SBram Moolenaar
2659404557e6SBram Moolenaar  lines =<< trim END
2660404557e6SBram Moolenaar      for n : number in [1, 2]
2661404557e6SBram Moolenaar        echo n
2662404557e6SBram Moolenaar      endfor
2663404557e6SBram Moolenaar  END
2664404557e6SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1059:', 1)
2665efc5db52SBram Moolenaar
2666efc5db52SBram Moolenaar  lines =<< trim END
2667efc5db52SBram Moolenaar      var d: dict<number> = {a: 1, b: 2}
2668efc5db52SBram Moolenaar      for [k: job, v: job] in d->items()
2669efc5db52SBram Moolenaar        echo k v
2670efc5db52SBram Moolenaar      endfor
2671efc5db52SBram Moolenaar  END
2672efc5db52SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2)
2673e8c4abbbSBram Moolenaarenddef
2674e8c4abbbSBram Moolenaar
2675ea87069dSBram Moolenaardef Test_for_loop_script_var()
2676ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2677ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2678ea87069dSBram Moolenaar
2679ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2680ea87069dSBram Moolenaar  var lines =<< trim END
2681ea87069dSBram Moolenaar    vim9script
2682ea87069dSBram Moolenaar    var total = 0
2683ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2684ea87069dSBram Moolenaar      total += s:var
2685ea87069dSBram Moolenaar    endfor
2686ea87069dSBram Moolenaar    assert_equal(6, total)
2687ea87069dSBram Moolenaar
2688ea87069dSBram Moolenaar    total = 0
2689ea87069dSBram Moolenaar    for var in [1, 2, 3]
2690ea87069dSBram Moolenaar      total += var
2691ea87069dSBram Moolenaar    endfor
2692ea87069dSBram Moolenaar    assert_equal(6, total)
2693ea87069dSBram Moolenaar  END
2694ea87069dSBram Moolenaarenddef
2695ea87069dSBram Moolenaar
2696792f786aSBram Moolenaardef Test_for_loop_unpack()
26974b8a0651SBram Moolenaar  var lines =<< trim END
2698792f786aSBram Moolenaar      var result = []
2699792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2700792f786aSBram Moolenaar        result->add(v1)
2701792f786aSBram Moolenaar        result->add(v2)
2702792f786aSBram Moolenaar      endfor
2703792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2704792f786aSBram Moolenaar
2705792f786aSBram Moolenaar      result = []
2706792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2707792f786aSBram Moolenaar        result->add(v1)
2708792f786aSBram Moolenaar        result->add(v2)
2709792f786aSBram Moolenaar        result->add(v3)
2710792f786aSBram Moolenaar      endfor
2711792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2712792f786aSBram Moolenaar
27134b8a0651SBram Moolenaar      result = []
27144b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
27154b8a0651SBram Moolenaar        result->add(&ts)
27164b8a0651SBram Moolenaar        result->add(&sw)
27174b8a0651SBram Moolenaar      endfor
27184b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
27194b8a0651SBram Moolenaar
27204b8a0651SBram Moolenaar      var slist: list<string>
27214b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
27224b8a0651SBram Moolenaar        slist->add($LOOPVAR)
27234b8a0651SBram Moolenaar        slist->add(@r)
27244b8a0651SBram Moolenaar        slist->add(v:errmsg)
27254b8a0651SBram Moolenaar      endfor
27264b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
27274b8a0651SBram Moolenaar
27284b8a0651SBram Moolenaar      slist = []
27294b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
27304b8a0651SBram Moolenaar        slist->add(g:globalvar)
27314b8a0651SBram Moolenaar        slist->add(b:bufvar)
27324b8a0651SBram Moolenaar        slist->add(w:winvar)
27334b8a0651SBram Moolenaar        slist->add(t:tabvar)
27344b8a0651SBram Moolenaar      endfor
27354b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2736f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
2737b777da9bSBram Moolenaar
2738b777da9bSBram Moolenaar      var res = []
2739b777da9bSBram Moolenaar      for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2740b777da9bSBram Moolenaar        res->add(n)
2741b777da9bSBram Moolenaar      endfor
2742b777da9bSBram Moolenaar      assert_equal([2, 5], res)
27434b8a0651SBram Moolenaar  END
27444b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
27454b8a0651SBram Moolenaar
27464b8a0651SBram Moolenaar  lines =<< trim END
2747792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2748792f786aSBram Moolenaar        echo v1 v2
2749792f786aSBram Moolenaar      endfor
2750792f786aSBram Moolenaar  END
2751792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2752792f786aSBram Moolenaar
2753792f786aSBram Moolenaar  lines =<< trim END
2754792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2755792f786aSBram Moolenaar        echo v1 v2
2756792f786aSBram Moolenaar      endfor
2757792f786aSBram Moolenaar  END
2758792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2759792f786aSBram Moolenaar
2760792f786aSBram Moolenaar  lines =<< trim END
2761792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2762792f786aSBram Moolenaar        echo v1
2763792f786aSBram Moolenaar      endfor
2764792f786aSBram Moolenaar  END
2765792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2766792f786aSBram Moolenaarenddef
2767792f786aSBram Moolenaar
2768c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2769f2253963SBram Moolenaar  var lines =<< trim END
2770c150c09eSBram Moolenaar      var looped = 0
2771c150c09eSBram Moolenaar      var cleanup = 0
2772c150c09eSBram Moolenaar      for i in range(3)
2773c150c09eSBram Moolenaar        looped += 1
2774c150c09eSBram Moolenaar        try
2775c150c09eSBram Moolenaar          eval [][0]
2776c150c09eSBram Moolenaar        catch
2777c150c09eSBram Moolenaar          continue
2778c150c09eSBram Moolenaar        finally
2779c150c09eSBram Moolenaar          cleanup += 1
2780c150c09eSBram Moolenaar        endtry
2781c150c09eSBram Moolenaar      endfor
2782c150c09eSBram Moolenaar      assert_equal(3, looped)
2783c150c09eSBram Moolenaar      assert_equal(3, cleanup)
2784f2253963SBram Moolenaar  END
2785f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2786c150c09eSBram Moolenaarenddef
2787c150c09eSBram Moolenaar
2788d0df1aacSBram Moolenaardef Test_while_loop()
2789cfcd011fSBram Moolenaar  var result = ''
2790cfcd011fSBram Moolenaar  var cnt = 0
2791d0df1aacSBram Moolenaar  while cnt < 555
2792d0df1aacSBram Moolenaar    if cnt == 3
2793d0df1aacSBram Moolenaar      break
2794d0df1aacSBram Moolenaar    endif
2795d0df1aacSBram Moolenaar    cnt += 1
2796d0df1aacSBram Moolenaar    if cnt == 2
2797d0df1aacSBram Moolenaar      continue
2798d0df1aacSBram Moolenaar    endif
2799d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2800d0df1aacSBram Moolenaar  endwhile
2801d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2802dee37dc7SBram Moolenaar
2803dee37dc7SBram Moolenaar  var s = ''
28040123cc1eSBram Moolenaar  while s == 'x' # {comment}
2805dee37dc7SBram Moolenaar  endwhile
2806d0df1aacSBram Moolenaarenddef
2807d0df1aacSBram Moolenaar
2808e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2809675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2810675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2811675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2812675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2813675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2814675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2815675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
28166628b7ebSBram Moolenaar
28176628b7ebSBram Moolenaar  var lines =<< trim END
28186628b7ebSBram Moolenaar      var s = ''
28196628b7ebSBram Moolenaar      while s = ''
28206628b7ebSBram Moolenaar      endwhile
28216628b7ebSBram Moolenaar  END
28226628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2823bd5da371SBram Moolenaarenddef
2824bd5da371SBram Moolenaar
28259645e2d9SBram Moolenaardef Test_interrupt_loop()
2826cfcd011fSBram Moolenaar  var caught = false
2827cfcd011fSBram Moolenaar  var x = 0
282897acfc78SBram Moolenaar  try
28299645e2d9SBram Moolenaar    while 1
28309645e2d9SBram Moolenaar      x += 1
28319645e2d9SBram Moolenaar      if x == 100
28329645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
28339645e2d9SBram Moolenaar      endif
28349645e2d9SBram Moolenaar    endwhile
283597acfc78SBram Moolenaar  catch
283697acfc78SBram Moolenaar    caught = true
283797acfc78SBram Moolenaar    assert_equal(100, x)
283897acfc78SBram Moolenaar  endtry
283997acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
284025859dd7SBram Moolenaar  # consume the CTRL-C
284125859dd7SBram Moolenaar  getchar(0)
28429645e2d9SBram Moolenaarenddef
284320431c9dSBram Moolenaar
28444fdae999SBram Moolenaardef Test_automatic_line_continuation()
2845cfcd011fSBram Moolenaar  var mylist = [
28464fdae999SBram Moolenaar      'one',
28474fdae999SBram Moolenaar      'two',
28484fdae999SBram Moolenaar      'three',
2849f5be8cdbSBram Moolenaar      ] # comment
28504fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
28514fdae999SBram Moolenaar
2852cfcd011fSBram Moolenaar  var mydict = {
2853e0de171eSBram Moolenaar      ['one']: 1,
2854e0de171eSBram Moolenaar      ['two']: 2,
2855e0de171eSBram Moolenaar      ['three']:
28564fdae999SBram Moolenaar          3,
2857f5be8cdbSBram Moolenaar      } # comment
2858e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2859e0de171eSBram Moolenaar  mydict = {
28602c330432SBram Moolenaar      one: 1,  # comment
28612c330432SBram Moolenaar      two:     # comment
28622c330432SBram Moolenaar           2,  # comment
28632c330432SBram Moolenaar      three: 3 # comment
28642c330432SBram Moolenaar      }
2865e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2866e0de171eSBram Moolenaar  mydict = {
28672c330432SBram Moolenaar      one: 1,
28684fdae999SBram Moolenaar      two:
28694fdae999SBram Moolenaar           2,
28702c330432SBram Moolenaar      three: 3
28714fdae999SBram Moolenaar      }
2872e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2873e6085c53SBram Moolenaar
2874e6085c53SBram Moolenaar  assert_equal(
2875e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2876e6085c53SBram Moolenaar        split('one two three')
2877e6085c53SBram Moolenaar        )
28784fdae999SBram Moolenaarenddef
28794fdae999SBram Moolenaar
28807a092245SBram Moolenaardef Test_vim9_comment()
28817a092245SBram Moolenaar  CheckScriptSuccess([
28827a092245SBram Moolenaar      'vim9script',
28837a092245SBram Moolenaar      '# something',
288493f82cbeSBram Moolenaar      '#something',
288593f82cbeSBram Moolenaar      '#{something',
28867a092245SBram Moolenaar      ])
288793f82cbeSBram Moolenaar
288893f82cbeSBram Moolenaar  split Xfile
288993f82cbeSBram Moolenaar  CheckScriptSuccess([
289093f82cbeSBram Moolenaar      'vim9script',
289193f82cbeSBram Moolenaar      'edit #something',
289293f82cbeSBram Moolenaar      ])
289393f82cbeSBram Moolenaar  CheckScriptSuccess([
289493f82cbeSBram Moolenaar      'vim9script',
289593f82cbeSBram Moolenaar      'edit #{something',
289693f82cbeSBram Moolenaar      ])
289793f82cbeSBram Moolenaar  close
289893f82cbeSBram Moolenaar
28997a092245SBram Moolenaar  CheckScriptFailure([
29007a092245SBram Moolenaar      'vim9script',
29017a092245SBram Moolenaar      ':# something',
29027a092245SBram Moolenaar      ], 'E488:')
29037a092245SBram Moolenaar  CheckScriptFailure([
29047a092245SBram Moolenaar      '# something',
29057a092245SBram Moolenaar      ], 'E488:')
29067a092245SBram Moolenaar  CheckScriptFailure([
29077a092245SBram Moolenaar      ':# something',
29087a092245SBram Moolenaar      ], 'E488:')
29097a092245SBram Moolenaar
29104a8d9f2eSBram Moolenaar  { # block start
29114a8d9f2eSBram Moolenaar  } # block end
29124a8d9f2eSBram Moolenaar  CheckDefFailure([
29134a8d9f2eSBram Moolenaar      '{# comment',
29144a8d9f2eSBram Moolenaar      ], 'E488:')
29154a8d9f2eSBram Moolenaar  CheckDefFailure([
29164a8d9f2eSBram Moolenaar      '{',
29174a8d9f2eSBram Moolenaar      '}# comment',
29184a8d9f2eSBram Moolenaar      ], 'E488:')
29194a8d9f2eSBram Moolenaar
29204a8d9f2eSBram Moolenaar  echo "yes" # comment
29214a8d9f2eSBram Moolenaar  CheckDefFailure([
29224a8d9f2eSBram Moolenaar      'echo "yes"# comment',
29234a8d9f2eSBram Moolenaar      ], 'E488:')
29247a092245SBram Moolenaar  CheckScriptSuccess([
29257a092245SBram Moolenaar      'vim9script',
29267a092245SBram Moolenaar      'echo "yes" # something',
29277a092245SBram Moolenaar      ])
29287a092245SBram Moolenaar  CheckScriptFailure([
29297a092245SBram Moolenaar      'vim9script',
29307a092245SBram Moolenaar      'echo "yes"# something',
29317a092245SBram Moolenaar      ], 'E121:')
29327a092245SBram Moolenaar  CheckScriptFailure([
29337a092245SBram Moolenaar      'vim9script',
29347a092245SBram Moolenaar      'echo# something',
2935f8103f27SBram Moolenaar      ], 'E1144:')
29367a092245SBram Moolenaar  CheckScriptFailure([
29377a092245SBram Moolenaar      'echo "yes" # something',
29387a092245SBram Moolenaar      ], 'E121:')
29397a092245SBram Moolenaar
29404a8d9f2eSBram Moolenaar  exe "echo" # comment
29414a8d9f2eSBram Moolenaar  CheckDefFailure([
29424a8d9f2eSBram Moolenaar      'exe "echo"# comment',
29434a8d9f2eSBram Moolenaar      ], 'E488:')
29444a8d9f2eSBram Moolenaar  CheckScriptSuccess([
29454a8d9f2eSBram Moolenaar      'vim9script',
29464a8d9f2eSBram Moolenaar      'exe "echo" # something',
29474a8d9f2eSBram Moolenaar      ])
29484a8d9f2eSBram Moolenaar  CheckScriptFailure([
29494a8d9f2eSBram Moolenaar      'vim9script',
29504a8d9f2eSBram Moolenaar      'exe "echo"# something',
29514a8d9f2eSBram Moolenaar      ], 'E121:')
29524a8d9f2eSBram Moolenaar  CheckScriptFailure([
29534a8d9f2eSBram Moolenaar      'vim9script',
29544a8d9f2eSBram Moolenaar      'exe# something',
2955f8103f27SBram Moolenaar      ], 'E1144:')
29564a8d9f2eSBram Moolenaar  CheckScriptFailure([
29574a8d9f2eSBram Moolenaar      'exe "echo" # something',
29584a8d9f2eSBram Moolenaar      ], 'E121:')
29594a8d9f2eSBram Moolenaar
29607a092245SBram Moolenaar  CheckDefFailure([
29617a092245SBram Moolenaar      'try# comment',
29627a092245SBram Moolenaar      '  echo "yes"',
29637a092245SBram Moolenaar      'catch',
29647a092245SBram Moolenaar      'endtry',
2965f8103f27SBram Moolenaar      ], 'E1144:')
29662c5ed4e3SBram Moolenaar  CheckScriptFailure([
29672c5ed4e3SBram Moolenaar      'vim9script',
29682c5ed4e3SBram Moolenaar      'try# comment',
29692c5ed4e3SBram Moolenaar      'echo "yes"',
2970f8103f27SBram Moolenaar      ], 'E1144:')
29717a092245SBram Moolenaar  CheckDefFailure([
29727a092245SBram Moolenaar      'try',
2973a72cfb80SBram Moolenaar      '  throw#comment',
2974a72cfb80SBram Moolenaar      'catch',
2975a72cfb80SBram Moolenaar      'endtry',
2976f8103f27SBram Moolenaar      ], 'E1144:')
2977a72cfb80SBram Moolenaar  CheckDefFailure([
2978a72cfb80SBram Moolenaar      'try',
2979a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2980a72cfb80SBram Moolenaar      'catch',
2981a72cfb80SBram Moolenaar      'endtry',
2982a72cfb80SBram Moolenaar      ], 'E488:')
2983a72cfb80SBram Moolenaar  CheckDefFailure([
2984a72cfb80SBram Moolenaar      'try',
29857a092245SBram Moolenaar      '  echo "yes"',
29867a092245SBram Moolenaar      'catch# comment',
29877a092245SBram Moolenaar      'endtry',
2988f8103f27SBram Moolenaar      ], 'E1144:')
29892c5ed4e3SBram Moolenaar  CheckScriptFailure([
29902c5ed4e3SBram Moolenaar      'vim9script',
29912c5ed4e3SBram Moolenaar      'try',
29922c5ed4e3SBram Moolenaar      '  echo "yes"',
29932c5ed4e3SBram Moolenaar      'catch# comment',
29942c5ed4e3SBram Moolenaar      'endtry',
2995f8103f27SBram Moolenaar      ], 'E1144:')
29962c5ed4e3SBram Moolenaar  CheckDefFailure([
29972c5ed4e3SBram Moolenaar      'try',
29982c5ed4e3SBram Moolenaar      '  echo "yes"',
29992c5ed4e3SBram Moolenaar      'catch /pat/# comment',
30002c5ed4e3SBram Moolenaar      'endtry',
30012c5ed4e3SBram Moolenaar      ], 'E488:')
30027a092245SBram Moolenaar  CheckDefFailure([
30037a092245SBram Moolenaar      'try',
30047a092245SBram Moolenaar      'echo "yes"',
30057a092245SBram Moolenaar      'catch',
30067a092245SBram Moolenaar      'endtry# comment',
3007f8103f27SBram Moolenaar      ], 'E1144:')
30082c5ed4e3SBram Moolenaar  CheckScriptFailure([
30092c5ed4e3SBram Moolenaar      'vim9script',
30102c5ed4e3SBram Moolenaar      'try',
30112c5ed4e3SBram Moolenaar      '  echo "yes"',
30122c5ed4e3SBram Moolenaar      'catch',
30132c5ed4e3SBram Moolenaar      'endtry# comment',
3014f8103f27SBram Moolenaar      ], 'E1144:')
30152c5ed4e3SBram Moolenaar
30162c5ed4e3SBram Moolenaar  CheckScriptSuccess([
30172c5ed4e3SBram Moolenaar      'vim9script',
30182c5ed4e3SBram Moolenaar      'hi # comment',
30192c5ed4e3SBram Moolenaar      ])
30202c5ed4e3SBram Moolenaar  CheckScriptFailure([
30212c5ed4e3SBram Moolenaar      'vim9script',
30222c5ed4e3SBram Moolenaar      'hi# comment',
3023f8103f27SBram Moolenaar      ], 'E1144:')
30241966c248SBram Moolenaar  CheckScriptSuccess([
30251966c248SBram Moolenaar      'vim9script',
30261966c248SBram Moolenaar      'hi Search # comment',
30271966c248SBram Moolenaar      ])
30281966c248SBram Moolenaar  CheckScriptFailure([
30291966c248SBram Moolenaar      'vim9script',
30301966c248SBram Moolenaar      'hi Search# comment',
30311966c248SBram Moolenaar      ], 'E416:')
30321966c248SBram Moolenaar  CheckScriptSuccess([
30331966c248SBram Moolenaar      'vim9script',
30341966c248SBram Moolenaar      'hi link This Search # comment',
30351966c248SBram Moolenaar      ])
30361966c248SBram Moolenaar  CheckScriptFailure([
30371966c248SBram Moolenaar      'vim9script',
30381966c248SBram Moolenaar      'hi link This That# comment',
30391966c248SBram Moolenaar      ], 'E413:')
30401966c248SBram Moolenaar  CheckScriptSuccess([
30411966c248SBram Moolenaar      'vim9script',
30421966c248SBram Moolenaar      'hi clear This # comment',
30431966c248SBram Moolenaar      'hi clear # comment',
30441966c248SBram Moolenaar      ])
3045f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
3046f5be8cdbSBram Moolenaar  # hi clear This# comment',
30471966c248SBram Moolenaar  CheckScriptFailure([
30481966c248SBram Moolenaar      'vim9script',
30491966c248SBram Moolenaar      'hi clear# comment',
30501966c248SBram Moolenaar      ], 'E416:')
30511966c248SBram Moolenaar
30521966c248SBram Moolenaar  CheckScriptSuccess([
30531966c248SBram Moolenaar      'vim9script',
30541966c248SBram Moolenaar      'hi Group term=bold',
30551966c248SBram Moolenaar      'match Group /todo/ # comment',
30561966c248SBram Moolenaar      ])
30571966c248SBram Moolenaar  CheckScriptFailure([
30581966c248SBram Moolenaar      'vim9script',
30591966c248SBram Moolenaar      'hi Group term=bold',
30601966c248SBram Moolenaar      'match Group /todo/# comment',
30611966c248SBram Moolenaar      ], 'E488:')
30621966c248SBram Moolenaar  CheckScriptSuccess([
30631966c248SBram Moolenaar      'vim9script',
30641966c248SBram Moolenaar      'match # comment',
30651966c248SBram Moolenaar      ])
30661966c248SBram Moolenaar  CheckScriptFailure([
30671966c248SBram Moolenaar      'vim9script',
30681966c248SBram Moolenaar      'match# comment',
3069f8103f27SBram Moolenaar      ], 'E1144:')
30701966c248SBram Moolenaar  CheckScriptSuccess([
30711966c248SBram Moolenaar      'vim9script',
30721966c248SBram Moolenaar      'match none # comment',
30731966c248SBram Moolenaar      ])
30741966c248SBram Moolenaar  CheckScriptFailure([
30751966c248SBram Moolenaar      'vim9script',
30761966c248SBram Moolenaar      'match none# comment',
30771966c248SBram Moolenaar      ], 'E475:')
30781966c248SBram Moolenaar
30791966c248SBram Moolenaar  CheckScriptSuccess([
30801966c248SBram Moolenaar      'vim9script',
30811966c248SBram Moolenaar      'menutrans clear # comment',
30821966c248SBram Moolenaar      ])
30831966c248SBram Moolenaar  CheckScriptFailure([
30841966c248SBram Moolenaar      'vim9script',
30851966c248SBram Moolenaar      'menutrans clear# comment text',
30861966c248SBram Moolenaar      ], 'E474:')
30871966c248SBram Moolenaar
30881966c248SBram Moolenaar  CheckScriptSuccess([
30891966c248SBram Moolenaar      'vim9script',
30901966c248SBram Moolenaar      'syntax clear # comment',
30911966c248SBram Moolenaar      ])
30921966c248SBram Moolenaar  CheckScriptFailure([
30931966c248SBram Moolenaar      'vim9script',
30941966c248SBram Moolenaar      'syntax clear# comment text',
30951966c248SBram Moolenaar      ], 'E28:')
30961966c248SBram Moolenaar  CheckScriptSuccess([
30971966c248SBram Moolenaar      'vim9script',
30981966c248SBram Moolenaar      'syntax keyword Word some',
30991966c248SBram Moolenaar      'syntax clear Word # comment',
31001966c248SBram Moolenaar      ])
31011966c248SBram Moolenaar  CheckScriptFailure([
31021966c248SBram Moolenaar      'vim9script',
31031966c248SBram Moolenaar      'syntax keyword Word some',
31041966c248SBram Moolenaar      'syntax clear Word# comment text',
31051966c248SBram Moolenaar      ], 'E28:')
31061966c248SBram Moolenaar
31071966c248SBram Moolenaar  CheckScriptSuccess([
31081966c248SBram Moolenaar      'vim9script',
31091966c248SBram Moolenaar      'syntax list # comment',
31101966c248SBram Moolenaar      ])
31111966c248SBram Moolenaar  CheckScriptFailure([
31121966c248SBram Moolenaar      'vim9script',
31131966c248SBram Moolenaar      'syntax list# comment text',
31141966c248SBram Moolenaar      ], 'E28:')
31151966c248SBram Moolenaar
31161966c248SBram Moolenaar  CheckScriptSuccess([
31171966c248SBram Moolenaar      'vim9script',
31181966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
31191966c248SBram Moolenaar      ])
31201966c248SBram Moolenaar  CheckScriptFailure([
31211966c248SBram Moolenaar      'vim9script',
31221966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
31231966c248SBram Moolenaar      ], 'E475:')
31241966c248SBram Moolenaar
31251966c248SBram Moolenaar  CheckScriptSuccess([
31261966c248SBram Moolenaar      'vim9script',
31271966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
31281966c248SBram Moolenaar      ])
31291966c248SBram Moolenaar  CheckScriptFailure([
31301966c248SBram Moolenaar      'vim9script',
31311966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
31321966c248SBram Moolenaar      ], 'E789:')
31331966c248SBram Moolenaar
31341966c248SBram Moolenaar  CheckScriptSuccess([
31351966c248SBram Moolenaar      'vim9script',
31361966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
31371966c248SBram Moolenaar      ])
31381966c248SBram Moolenaar  CheckScriptFailure([
31391966c248SBram Moolenaar      'vim9script',
31401966c248SBram Moolenaar      'syntax match Word /pat/# comment',
31411966c248SBram Moolenaar      ], 'E402:')
31421966c248SBram Moolenaar
31431966c248SBram Moolenaar  CheckScriptSuccess([
31441966c248SBram Moolenaar      'vim9script',
31451966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
31461966c248SBram Moolenaar      ])
31471966c248SBram Moolenaar  CheckScriptFailure([
31481966c248SBram Moolenaar      'vim9script',
31491966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
31501966c248SBram Moolenaar      ], 'E475:')
31511966c248SBram Moolenaar  CheckScriptFailure([
31521966c248SBram Moolenaar      'vim9script',
31531966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
31541966c248SBram Moolenaar      ], 'E406:')
31551966c248SBram Moolenaar  CheckScriptFailure([
31561966c248SBram Moolenaar      'vim9script',
31571966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
31581966c248SBram Moolenaar      ], 'E475:')
31591966c248SBram Moolenaar
31601966c248SBram Moolenaar  CheckScriptSuccess([
31611966c248SBram Moolenaar      'vim9script',
31621966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
31631966c248SBram Moolenaar      ])
31641966c248SBram Moolenaar  CheckScriptFailure([
31651966c248SBram Moolenaar      'vim9script',
31661966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
3167d032f34aSBram Moolenaar      ], 'E402:')
31681966c248SBram Moolenaar
31691966c248SBram Moolenaar  CheckScriptSuccess([
31701966c248SBram Moolenaar      'vim9script',
31711966c248SBram Moolenaar      'syntax sync # comment',
31721966c248SBram Moolenaar      ])
31731966c248SBram Moolenaar  CheckScriptFailure([
31741966c248SBram Moolenaar      'vim9script',
31751966c248SBram Moolenaar      'syntax sync# comment',
31761966c248SBram Moolenaar      ], 'E404:')
31771966c248SBram Moolenaar  CheckScriptSuccess([
31781966c248SBram Moolenaar      'vim9script',
31791966c248SBram Moolenaar      'syntax sync ccomment # comment',
31801966c248SBram Moolenaar      ])
31811966c248SBram Moolenaar  CheckScriptFailure([
31821966c248SBram Moolenaar      'vim9script',
31831966c248SBram Moolenaar      'syntax sync ccomment# comment',
31841966c248SBram Moolenaar      ], 'E404:')
31851966c248SBram Moolenaar
31861966c248SBram Moolenaar  CheckScriptSuccess([
31871966c248SBram Moolenaar      'vim9script',
31881966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
31891966c248SBram Moolenaar      ])
31901966c248SBram Moolenaar  CheckScriptFailure([
31911966c248SBram Moolenaar      'vim9script',
31921966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
31931966c248SBram Moolenaar      ], 'E475:')
3194a72cfb80SBram Moolenaar
3195a72cfb80SBram Moolenaar  CheckScriptSuccess([
3196a72cfb80SBram Moolenaar      'vim9script',
3197a72cfb80SBram Moolenaar      'command Echo echo # comment',
3198a72cfb80SBram Moolenaar      'command Echo # comment',
31992d870f8dSBram Moolenaar      'delcommand Echo',
3200a72cfb80SBram Moolenaar      ])
3201a72cfb80SBram Moolenaar  CheckScriptFailure([
3202a72cfb80SBram Moolenaar      'vim9script',
3203a72cfb80SBram Moolenaar      'command Echo echo# comment',
3204a72cfb80SBram Moolenaar      'Echo',
3205f8103f27SBram Moolenaar      ], 'E1144:')
32062d870f8dSBram Moolenaar  delcommand Echo
320770249ee8SBram Moolenaar
320870249ee8SBram Moolenaar  var curdir = getcwd()
320970249ee8SBram Moolenaar  CheckScriptSuccess([
321070249ee8SBram Moolenaar      'command Echo cd " comment',
321170249ee8SBram Moolenaar      'Echo',
321270249ee8SBram Moolenaar      'delcommand Echo',
321370249ee8SBram Moolenaar      ])
321470249ee8SBram Moolenaar  CheckScriptSuccess([
3215090728adSBram Moolenaar      'vim9script',
321670249ee8SBram Moolenaar      'command Echo cd # comment',
321770249ee8SBram Moolenaar      'Echo',
321870249ee8SBram Moolenaar      'delcommand Echo',
321970249ee8SBram Moolenaar      ])
322070249ee8SBram Moolenaar  CheckScriptFailure([
322170249ee8SBram Moolenaar      'vim9script',
322270249ee8SBram Moolenaar      'command Echo cd " comment',
322370249ee8SBram Moolenaar      'Echo',
322470249ee8SBram Moolenaar      ], 'E344:')
322570249ee8SBram Moolenaar  delcommand Echo
322670249ee8SBram Moolenaar  chdir(curdir)
322770249ee8SBram Moolenaar
3228a72cfb80SBram Moolenaar  CheckScriptFailure([
3229a72cfb80SBram Moolenaar      'vim9script',
3230a72cfb80SBram Moolenaar      'command Echo# comment',
3231a72cfb80SBram Moolenaar      ], 'E182:')
3232a72cfb80SBram Moolenaar  CheckScriptFailure([
3233a72cfb80SBram Moolenaar      'vim9script',
3234a72cfb80SBram Moolenaar      'command Echo echo',
3235a72cfb80SBram Moolenaar      'command Echo# comment',
3236a72cfb80SBram Moolenaar      ], 'E182:')
32372d870f8dSBram Moolenaar  delcommand Echo
3238a72cfb80SBram Moolenaar
3239a72cfb80SBram Moolenaar  CheckScriptSuccess([
3240a72cfb80SBram Moolenaar      'vim9script',
3241a72cfb80SBram Moolenaar      'function # comment',
3242a72cfb80SBram Moolenaar      ])
3243a72cfb80SBram Moolenaar  CheckScriptFailure([
3244a72cfb80SBram Moolenaar      'vim9script',
32459898107fSBram Moolenaar      'function " comment',
32469898107fSBram Moolenaar      ], 'E129:')
32479898107fSBram Moolenaar  CheckScriptFailure([
32489898107fSBram Moolenaar      'vim9script',
3249a72cfb80SBram Moolenaar      'function# comment',
3250f8103f27SBram Moolenaar      ], 'E1144:')
3251a72cfb80SBram Moolenaar  CheckScriptSuccess([
3252a72cfb80SBram Moolenaar      'vim9script',
3253a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
3254a72cfb80SBram Moolenaar      ])
3255a72cfb80SBram Moolenaar  CheckScriptFailure([
3256a72cfb80SBram Moolenaar      'vim9script',
3257a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
3258a72cfb80SBram Moolenaar      ], 'E488:')
3259a72cfb80SBram Moolenaar
3260a72cfb80SBram Moolenaar  CheckScriptSuccess([
3261a72cfb80SBram Moolenaar      'vim9script',
32624c17ad94SBram Moolenaar      'func g:DeleteMeA()',
3263a72cfb80SBram Moolenaar      'endfunc',
32644c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
3265a72cfb80SBram Moolenaar      ])
3266a72cfb80SBram Moolenaar  CheckScriptFailure([
3267a72cfb80SBram Moolenaar      'vim9script',
32684c17ad94SBram Moolenaar      'func g:DeleteMeB()',
3269a72cfb80SBram Moolenaar      'endfunc',
32704c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
3271a72cfb80SBram Moolenaar      ], 'E488:')
3272a72cfb80SBram Moolenaar
3273a72cfb80SBram Moolenaar  CheckScriptSuccess([
3274a72cfb80SBram Moolenaar      'vim9script',
3275a72cfb80SBram Moolenaar      'call execute("ls") # comment',
3276a72cfb80SBram Moolenaar      ])
3277a72cfb80SBram Moolenaar  CheckScriptFailure([
3278a72cfb80SBram Moolenaar      'vim9script',
3279a72cfb80SBram Moolenaar      'call execute("ls")# comment',
3280a72cfb80SBram Moolenaar      ], 'E488:')
3281e7e4838fSBram Moolenaar
3282e7e4838fSBram Moolenaar  CheckScriptFailure([
3283e7e4838fSBram Moolenaar      'def Test() " comment',
3284e7e4838fSBram Moolenaar      'enddef',
3285e7e4838fSBram Moolenaar      ], 'E488:')
3286e7e4838fSBram Moolenaar  CheckScriptFailure([
3287e7e4838fSBram Moolenaar      'vim9script',
3288e7e4838fSBram Moolenaar      'def Test() " comment',
3289e7e4838fSBram Moolenaar      'enddef',
3290e7e4838fSBram Moolenaar      ], 'E488:')
3291e7e4838fSBram Moolenaar
3292e7e4838fSBram Moolenaar  CheckScriptSuccess([
3293e7e4838fSBram Moolenaar      'func Test() " comment',
3294e7e4838fSBram Moolenaar      'endfunc',
32952d870f8dSBram Moolenaar      'delfunc Test',
3296e7e4838fSBram Moolenaar      ])
32979898107fSBram Moolenaar  CheckScriptSuccess([
3298e7e4838fSBram Moolenaar      'vim9script',
3299e7e4838fSBram Moolenaar      'func Test() " comment',
3300e7e4838fSBram Moolenaar      'endfunc',
33019898107fSBram Moolenaar      ])
3302e7e4838fSBram Moolenaar
3303e7e4838fSBram Moolenaar  CheckScriptSuccess([
3304e7e4838fSBram Moolenaar      'def Test() # comment',
3305e7e4838fSBram Moolenaar      'enddef',
3306e7e4838fSBram Moolenaar      ])
3307e7e4838fSBram Moolenaar  CheckScriptFailure([
3308e7e4838fSBram Moolenaar      'func Test() # comment',
3309e7e4838fSBram Moolenaar      'endfunc',
3310e7e4838fSBram Moolenaar      ], 'E488:')
33110f37e356SBram Moolenaar
33120f37e356SBram Moolenaar  var lines =<< trim END
33130f37e356SBram Moolenaar      vim9script
33140f37e356SBram Moolenaar      syn region Text
33150f37e356SBram Moolenaar      \ start='foo'
33160f37e356SBram Moolenaar      #\ comment
33170f37e356SBram Moolenaar      \ end='bar'
33185072b47aSBram Moolenaar      syn region Text start='foo'
33195072b47aSBram Moolenaar      #\ comment
33205072b47aSBram Moolenaar      \ end='bar'
33210f37e356SBram Moolenaar  END
33220f37e356SBram Moolenaar  CheckScriptSuccess(lines)
33230f37e356SBram Moolenaar
33240f37e356SBram Moolenaar  lines =<< trim END
33250f37e356SBram Moolenaar      vim9script
33260f37e356SBram Moolenaar      syn region Text
33270f37e356SBram Moolenaar      \ start='foo'
33280f37e356SBram Moolenaar      "\ comment
33290f37e356SBram Moolenaar      \ end='bar'
33300f37e356SBram Moolenaar  END
33310f37e356SBram Moolenaar  CheckScriptFailure(lines, 'E399:')
33322c5ed4e3SBram Moolenaarenddef
33332c5ed4e3SBram Moolenaar
33342c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
33352c5ed4e3SBram Moolenaar  CheckCanRunGui
33362c5ed4e3SBram Moolenaar
33372c5ed4e3SBram Moolenaar  CheckScriptFailure([
33382c5ed4e3SBram Moolenaar      'vim9script',
33392c5ed4e3SBram Moolenaar      'gui#comment'
3340f8103f27SBram Moolenaar      ], 'E1144:')
33412c5ed4e3SBram Moolenaar  CheckScriptFailure([
33422c5ed4e3SBram Moolenaar      'vim9script',
33432c5ed4e3SBram Moolenaar      'gui -f#comment'
33442c5ed4e3SBram Moolenaar      ], 'E499:')
33457a092245SBram Moolenaarenddef
33467a092245SBram Moolenaar
3347a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
33486797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
33496797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3350a26b9700SBram Moolenaar
3351a26b9700SBram Moolenaar  edit test.vim
3352a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3353a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3354a26b9700SBram Moolenaar
3355a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3356a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3357a26b9700SBram Moolenaar
3358a26b9700SBram Moolenaar  g:entered = 0
3359a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3360a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3361a26b9700SBram Moolenaar
3362a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3363a26b9700SBram Moolenaar
3364a26b9700SBram Moolenaar  au! TabEnter
3365a26b9700SBram Moolenaar  unlet g:entered
3366d72c1bf0SBram Moolenaar
3367d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3368d72c1bf0SBram Moolenaar      'vim9script',
33696797966dSBram Moolenaar      'g:var = 123',
3370e55b1c09SBram Moolenaar      'b:var = 456',
3371e55b1c09SBram Moolenaar      'w:var = 777',
3372e55b1c09SBram Moolenaar      't:var = 888',
3373d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3374d72c1bf0SBram Moolenaar      ])
3375d72c1bf0SBram Moolenaar
3376d72c1bf0SBram Moolenaar  CheckScriptFailure([
3377d72c1bf0SBram Moolenaar      'vim9script',
3378cfcd011fSBram Moolenaar      'let var = 123',
3379cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3380cfcd011fSBram Moolenaar
3381cfcd011fSBram Moolenaar  CheckScriptFailure([
3382cfcd011fSBram Moolenaar      'vim9script',
3383cfcd011fSBram Moolenaar      'var g:var = 123',
3384e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3385e55b1c09SBram Moolenaar
3386e55b1c09SBram Moolenaar  CheckScriptFailure([
3387e55b1c09SBram Moolenaar      'vim9script',
3388cfcd011fSBram Moolenaar      'var b:var = 123',
3389e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3390e55b1c09SBram Moolenaar
3391e55b1c09SBram Moolenaar  CheckScriptFailure([
3392e55b1c09SBram Moolenaar      'vim9script',
3393cfcd011fSBram Moolenaar      'var w:var = 123',
3394e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3395e55b1c09SBram Moolenaar
3396e55b1c09SBram Moolenaar  CheckScriptFailure([
3397e55b1c09SBram Moolenaar      'vim9script',
3398cfcd011fSBram Moolenaar      'var t:var = 123',
3399e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3400e55b1c09SBram Moolenaar
3401e55b1c09SBram Moolenaar  CheckScriptFailure([
3402e55b1c09SBram Moolenaar      'vim9script',
3403cfcd011fSBram Moolenaar      'var v:version = 123',
3404e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3405e55b1c09SBram Moolenaar
3406e55b1c09SBram Moolenaar  CheckScriptFailure([
3407e55b1c09SBram Moolenaar      'vim9script',
3408cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3409e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
34106797966dSBram Moolenaar
34116797966dSBram Moolenaar  CheckScriptFailure([
34126797966dSBram Moolenaar      'vim9script',
34136797966dSBram Moolenaar      'g:var = 123',
341432e35117SBram Moolenaar      'unlet g:var# comment1',
3415d72c1bf0SBram Moolenaar      ], 'E108:')
3416d72c1bf0SBram Moolenaar
3417d72c1bf0SBram Moolenaar  CheckScriptFailure([
3418d72c1bf0SBram Moolenaar      'let g:var = 123',
3419d72c1bf0SBram Moolenaar      'unlet g:var # something',
3420d72c1bf0SBram Moolenaar      ], 'E488:')
3421faac4104SBram Moolenaar
3422faac4104SBram Moolenaar  CheckScriptSuccess([
3423faac4104SBram Moolenaar      'vim9script',
342432e35117SBram Moolenaar      'if 1 # comment2',
3425faac4104SBram Moolenaar      '  echo "yes"',
3426faac4104SBram Moolenaar      'elseif 2 #comment',
3427faac4104SBram Moolenaar      '  echo "no"',
3428faac4104SBram Moolenaar      'endif',
3429faac4104SBram Moolenaar      ])
3430faac4104SBram Moolenaar
3431faac4104SBram Moolenaar  CheckScriptFailure([
3432faac4104SBram Moolenaar      'vim9script',
343332e35117SBram Moolenaar      'if 1# comment3',
3434faac4104SBram Moolenaar      '  echo "yes"',
3435faac4104SBram Moolenaar      'endif',
3436fae55a9cSBram Moolenaar      ], 'E488:')
3437faac4104SBram Moolenaar
3438faac4104SBram Moolenaar  CheckScriptFailure([
3439faac4104SBram Moolenaar      'vim9script',
344032e35117SBram Moolenaar      'if 0 # comment4',
3441faac4104SBram Moolenaar      '  echo "yes"',
3442faac4104SBram Moolenaar      'elseif 2#comment',
3443faac4104SBram Moolenaar      '  echo "no"',
3444faac4104SBram Moolenaar      'endif',
3445fae55a9cSBram Moolenaar      ], 'E488:')
3446faac4104SBram Moolenaar
3447faac4104SBram Moolenaar  CheckScriptSuccess([
3448faac4104SBram Moolenaar      'vim9script',
3449cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3450faac4104SBram Moolenaar      ])
3451faac4104SBram Moolenaar
3452faac4104SBram Moolenaar  CheckScriptFailure([
3453faac4104SBram Moolenaar      'vim9script',
3454cfcd011fSBram Moolenaar      'var v = 1# comment6',
3455fae55a9cSBram Moolenaar      ], 'E488:')
3456faac4104SBram Moolenaar
3457faac4104SBram Moolenaar  CheckScriptSuccess([
3458faac4104SBram Moolenaar      'vim9script',
3459faac4104SBram Moolenaar      'new'
3460d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3461df069eecSBram Moolenaar      ':$',
3462faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3463faac4104SBram Moolenaar      'bwipe!',
3464faac4104SBram Moolenaar      ])
3465faac4104SBram Moolenaar
3466f5be8cdbSBram Moolenaar  CheckScriptFailure([
3467f5be8cdbSBram Moolenaar      'vim9script',
3468f5be8cdbSBram Moolenaar      'new'
3469d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3470f5be8cdbSBram Moolenaar      ':$',
3471f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3472f5be8cdbSBram Moolenaar      'bwipe!',
3473f5be8cdbSBram Moolenaar      ], 'E488:')
3474f5be8cdbSBram Moolenaar
3475f5be8cdbSBram Moolenaar  CheckScriptFailure([
3476f5be8cdbSBram Moolenaar      'vim9script',
3477f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3478f5be8cdbSBram Moolenaar      ], 'E477:')
3479a26b9700SBram Moolenaarenddef
3480a26b9700SBram Moolenaar
34817e5bd91dSBram Moolenaardef Test_finish()
3482cfcd011fSBram Moolenaar  var lines =<< trim END
34837e5bd91dSBram Moolenaar    vim9script
34846797966dSBram Moolenaar    g:res = 'one'
34857e5bd91dSBram Moolenaar    if v:false | finish | endif
34866797966dSBram Moolenaar    g:res = 'two'
34877e5bd91dSBram Moolenaar    finish
34886797966dSBram Moolenaar    g:res = 'three'
34897e5bd91dSBram Moolenaar  END
34907e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
34917e5bd91dSBram Moolenaar  source Xfinished
34927e5bd91dSBram Moolenaar  assert_equal('two', g:res)
34937e5bd91dSBram Moolenaar
34947e5bd91dSBram Moolenaar  unlet g:res
34957e5bd91dSBram Moolenaar  delete('Xfinished')
34967e5bd91dSBram Moolenaarenddef
34977e5bd91dSBram Moolenaar
3498a5d0077eSBram Moolenaardef Test_forward_declaration()
3499cfcd011fSBram Moolenaar  var lines =<< trim END
3500a5d0077eSBram Moolenaar    vim9script
3501a5d0077eSBram Moolenaar    def GetValue(): string
3502a5d0077eSBram Moolenaar      return theVal
3503a5d0077eSBram Moolenaar    enddef
3504cfcd011fSBram Moolenaar    var theVal = 'something'
3505822ba247SBram Moolenaar    g:initVal = GetValue()
3506a5d0077eSBram Moolenaar    theVal = 'else'
3507a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3508a5d0077eSBram Moolenaar  END
3509a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3510a5d0077eSBram Moolenaar  source Xforward
3511a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3512a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3513a5d0077eSBram Moolenaar
3514a5d0077eSBram Moolenaar  unlet g:initVal
3515a5d0077eSBram Moolenaar  unlet g:laterVal
3516a5d0077eSBram Moolenaar  delete('Xforward')
3517a5d0077eSBram Moolenaarenddef
3518a5d0077eSBram Moolenaar
35199721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3520a6294955SBram Moolenaar  var vim9_lines =<< trim END
3521a6294955SBram Moolenaar    vim9script
3522a6294955SBram Moolenaar    var local = 'local'
3523a6294955SBram Moolenaar    g:global = 'global'
3524a6294955SBram Moolenaar    export var exported = 'exported'
3525a6294955SBram Moolenaar    export def GetText(): string
3526a6294955SBram Moolenaar       return 'text'
3527a6294955SBram Moolenaar    enddef
3528a6294955SBram Moolenaar  END
3529a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3530a6294955SBram Moolenaar
3531cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
35329721fb4eSBram Moolenaar    source Xvim9_script.vim
35339721fb4eSBram Moolenaar
35349721fb4eSBram Moolenaar    call assert_false(exists('local'))
35359721fb4eSBram Moolenaar    call assert_false(exists('exported'))
35369721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
35379721fb4eSBram Moolenaar    call assert_equal('global', global)
35389721fb4eSBram Moolenaar    call assert_equal('global', g:global)
35399721fb4eSBram Moolenaar
35409721fb4eSBram Moolenaar    " imported variable becomes script-local
35419721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
35429721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
35439721fb4eSBram Moolenaar    call assert_false(exists('exported'))
35449721fb4eSBram Moolenaar
35459721fb4eSBram Moolenaar    " imported function becomes script-local
35469721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
35479721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
35489721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
35499721fb4eSBram Moolenaar  END
35509721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
35519721fb4eSBram Moolenaar
35529721fb4eSBram Moolenaar  source Xlegacy_script.vim
35539721fb4eSBram Moolenaar  assert_equal('global', g:global)
3554f5be8cdbSBram Moolenaar  unlet g:global
35559721fb4eSBram Moolenaar
35569721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
35579721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
35589721fb4eSBram Moolenaarenddef
3559a5d0077eSBram Moolenaar
3560e535db86SBram Moolenaardef Test_declare_script_in_func()
3561e535db86SBram Moolenaar  var lines =<< trim END
3562e535db86SBram Moolenaar      vim9script
3563e535db86SBram Moolenaar      func Declare()
3564e535db86SBram Moolenaar        let s:local = 123
3565e535db86SBram Moolenaar      endfunc
3566e535db86SBram Moolenaar      Declare()
3567e535db86SBram Moolenaar      assert_equal(123, local)
3568e535db86SBram Moolenaar
3569e535db86SBram Moolenaar      var error: string
3570e535db86SBram Moolenaar      try
3571e535db86SBram Moolenaar        local = 'asdf'
3572e535db86SBram Moolenaar      catch
3573e535db86SBram Moolenaar        error = v:exception
3574e535db86SBram Moolenaar      endtry
3575e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3576e535db86SBram Moolenaar
3577e535db86SBram Moolenaar      lockvar local
3578e535db86SBram Moolenaar      try
3579e535db86SBram Moolenaar        local = 999
3580e535db86SBram Moolenaar      catch
3581e535db86SBram Moolenaar        error = v:exception
3582e535db86SBram Moolenaar      endtry
3583e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3584e535db86SBram Moolenaar  END
3585e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3586e535db86SBram Moolenaarenddef
3587e535db86SBram Moolenaar
3588e535db86SBram Moolenaar
35897d699701SBram Moolenaarfunc Test_vim9script_not_global()
35907d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
35917d699701SBram Moolenaar  let vim9lines =<< trim END
35927d699701SBram Moolenaar    vim9script
3593cfcd011fSBram Moolenaar    var name = 'local'
35947d699701SBram Moolenaar    func TheFunc()
35957d699701SBram Moolenaar      echo 'local'
35967d699701SBram Moolenaar    endfunc
35977d699701SBram Moolenaar    def DefFunc()
35987d699701SBram Moolenaar      echo 'local'
35997d699701SBram Moolenaar    enddef
36007d699701SBram Moolenaar  END
36017d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
36027d699701SBram Moolenaar  source Xvim9script.vim
36037d699701SBram Moolenaar  try
36047d699701SBram Moolenaar    echo g:var
36057d699701SBram Moolenaar    assert_report('did not fail')
36067d699701SBram Moolenaar  catch /E121:/
36077d699701SBram Moolenaar    " caught
36087d699701SBram Moolenaar  endtry
36097d699701SBram Moolenaar  try
36107d699701SBram Moolenaar    call TheFunc()
36117d699701SBram Moolenaar    assert_report('did not fail')
36127d699701SBram Moolenaar  catch /E117:/
36137d699701SBram Moolenaar    " caught
36147d699701SBram Moolenaar  endtry
36157d699701SBram Moolenaar  try
36167d699701SBram Moolenaar    call DefFunc()
36177d699701SBram Moolenaar    assert_report('did not fail')
36187d699701SBram Moolenaar  catch /E117:/
36197d699701SBram Moolenaar    " caught
36207d699701SBram Moolenaar  endtry
36217d699701SBram Moolenaar
362225859dd7SBram Moolenaar  call delete('Xvim9script.vim')
36237d699701SBram Moolenaarendfunc
36247d699701SBram Moolenaar
3625eeb27bfeSBram Moolenaardef Test_vim9_copen()
3626eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3627eeb27bfeSBram Moolenaar  copen
3628eeb27bfeSBram Moolenaar  quit
3629eeb27bfeSBram Moolenaarenddef
3630eeb27bfeSBram Moolenaar
363103290b84SBram Moolenaar" test using an auto-loaded function and variable
36322d6b20d6SBram Moolenaardef Test_vim9_autoload()
3633cfcd011fSBram Moolenaar  var lines =<< trim END
36342d6b20d6SBram Moolenaar     vim9script
363503290b84SBram Moolenaar     def some#gettest(): string
363603290b84SBram Moolenaar       return 'test'
363703290b84SBram Moolenaar     enddef
363803290b84SBram Moolenaar     g:some#name = 'name'
3639227c58a4SBram Moolenaar     g:some#dict = {key: 'value'}
3640e3ffcd99SBram Moolenaar
3641e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3642e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3643e3ffcd99SBram Moolenaar     enddef
364403290b84SBram Moolenaar  END
364503290b84SBram Moolenaar
364603290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
364703290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
364803290b84SBram Moolenaar  var save_rtp = &rtp
364903290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
365003290b84SBram Moolenaar
365103290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
365203290b84SBram Moolenaar  assert_equal('name', g:some#name)
3653227c58a4SBram Moolenaar  assert_equal('value', g:some#dict.key)
365403290b84SBram Moolenaar  g:some#other = 'other'
365503290b84SBram Moolenaar  assert_equal('other', g:some#other)
365603290b84SBram Moolenaar
3657e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3658e3ffcd99SBram Moolenaar
365917f700acSBram Moolenaar  # upper case script name works
366017f700acSBram Moolenaar  lines =<< trim END
366117f700acSBram Moolenaar     vim9script
366217f700acSBram Moolenaar     def Other#getOther(): string
366317f700acSBram Moolenaar       return 'other'
366417f700acSBram Moolenaar     enddef
366517f700acSBram Moolenaar  END
366617f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
366717f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
366817f700acSBram Moolenaar
366903290b84SBram Moolenaar  delete('Xdir', 'rf')
367003290b84SBram Moolenaar  &rtp = save_rtp
367103290b84SBram Moolenaarenddef
367203290b84SBram Moolenaar
367303290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
367403290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
367503290b84SBram Moolenaar  var lines =<< trim END
367603290b84SBram Moolenaar     vim9script
36772d6b20d6SBram Moolenaar     def foo#test()
36782d6b20d6SBram Moolenaar         echomsg getreg('"')
36792d6b20d6SBram Moolenaar     enddef
36802d6b20d6SBram Moolenaar  END
36812d6b20d6SBram Moolenaar
36822d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
36832d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3684cfcd011fSBram Moolenaar  var save_rtp = &rtp
36852d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
36862d6b20d6SBram Moolenaar  augroup test
36872d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
36882d6b20d6SBram Moolenaar  augroup END
36892d6b20d6SBram Moolenaar
36902d6b20d6SBram Moolenaar  normal Y
36912d6b20d6SBram Moolenaar
36922d6b20d6SBram Moolenaar  augroup test
36932d6b20d6SBram Moolenaar    autocmd!
36942d6b20d6SBram Moolenaar  augroup END
36952d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
36962d6b20d6SBram Moolenaar  &rtp = save_rtp
36972d6b20d6SBram Moolenaarenddef
36982d6b20d6SBram Moolenaar
369977e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
370077e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3701cfcd011fSBram Moolenaar  var lines =<< trim END
370277e5dcc3SBram Moolenaar      vim9script
370377e5dcc3SBram Moolenaar      def crash#func()
370477e5dcc3SBram Moolenaar          try
370577e5dcc3SBram Moolenaar              for x in List()
370677e5dcc3SBram Moolenaar              endfor
370777e5dcc3SBram Moolenaar          catch
370877e5dcc3SBram Moolenaar          endtry
370977e5dcc3SBram Moolenaar          g:ok = true
371077e5dcc3SBram Moolenaar      enddef
371177e5dcc3SBram Moolenaar      fu List()
371277e5dcc3SBram Moolenaar          invalid
371377e5dcc3SBram Moolenaar      endfu
371477e5dcc3SBram Moolenaar      try
371548e11c10SBram Moolenaar          alsoinvalid
371677e5dcc3SBram Moolenaar      catch /wontmatch/
371777e5dcc3SBram Moolenaar      endtry
371877e5dcc3SBram Moolenaar  END
371977e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
372077e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
372177e5dcc3SBram Moolenaar
372277e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
372377e5dcc3SBram Moolenaar  lines =<< trim END
372477e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
372577e5dcc3SBram Moolenaar    call crash#func()
372677e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
37279c4f5520SBram Moolenaar    qall!
372877e5dcc3SBram Moolenaar  END
372977e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
373077e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
373177e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
373277e5dcc3SBram Moolenaar
373377e5dcc3SBram Moolenaar  delete('Xdidit')
373477e5dcc3SBram Moolenaar  delete('Xscript')
373577e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
373603290b84SBram Moolenaar
373703290b84SBram Moolenaar  lines =<< trim END
373803290b84SBram Moolenaar    vim9script
373903290b84SBram Moolenaar    var foo#bar = 'asdf'
374003290b84SBram Moolenaar  END
374103290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
374277e5dcc3SBram Moolenaarenddef
374377e5dcc3SBram Moolenaar
374481e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
374581e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
374681e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3747cfcd011fSBram Moolenaar  var lines =<< trim END
374881e17fbeSBram Moolenaar    let s:counter = 1
374981e17fbeSBram Moolenaar    def s:Func()
375081e17fbeSBram Moolenaar      au! CursorHold
375181e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
375281e17fbeSBram Moolenaar    enddef
375381e17fbeSBram Moolenaar    call s:Func()
375481e17fbeSBram Moolenaar    doau CursorHold
375581e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
375681e17fbeSBram Moolenaar    au! CursorHold
375781e17fbeSBram Moolenaar  END
375881e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
375981e17fbeSBram Moolenaarenddef
376081e17fbeSBram Moolenaar
3761b5841b99SBram Moolenaardef Test_error_in_autoload_script()
3762b5841b99SBram Moolenaar  var save_rtp = &rtp
3763b5841b99SBram Moolenaar  var dir = getcwd() .. '/Xruntime'
3764b5841b99SBram Moolenaar  &rtp = dir
3765b5841b99SBram Moolenaar  mkdir(dir .. '/autoload', 'p')
3766b5841b99SBram Moolenaar
3767b5841b99SBram Moolenaar  var lines =<< trim END
3768b5841b99SBram Moolenaar      vim9script noclear
3769b5841b99SBram Moolenaar      def script#autoloaded()
3770b5841b99SBram Moolenaar      enddef
3771b5841b99SBram Moolenaar      def Broken()
3772b5841b99SBram Moolenaar        var x: any = ''
3773b5841b99SBram Moolenaar        eval x != 0
3774b5841b99SBram Moolenaar      enddef
3775b5841b99SBram Moolenaar      Broken()
3776b5841b99SBram Moolenaar  END
3777b5841b99SBram Moolenaar  writefile(lines, dir .. '/autoload/script.vim')
3778b5841b99SBram Moolenaar
3779b5841b99SBram Moolenaar  lines =<< trim END
3780b5841b99SBram Moolenaar      vim9script
3781b5841b99SBram Moolenaar      def CallAutoloaded()
3782b5841b99SBram Moolenaar        script#autoloaded()
3783b5841b99SBram Moolenaar      enddef
3784b5841b99SBram Moolenaar
3785b5841b99SBram Moolenaar      function Legacy()
3786b5841b99SBram Moolenaar        try
3787b5841b99SBram Moolenaar          call s:CallAutoloaded()
3788b5841b99SBram Moolenaar        catch
3789b5841b99SBram Moolenaar          call assert_match('E1030: Using a String as a Number', v:exception)
3790b5841b99SBram Moolenaar        endtry
3791b5841b99SBram Moolenaar      endfunction
3792b5841b99SBram Moolenaar
3793b5841b99SBram Moolenaar      Legacy()
3794b5841b99SBram Moolenaar  END
3795b5841b99SBram Moolenaar  CheckScriptSuccess(lines)
3796b5841b99SBram Moolenaar
3797b5841b99SBram Moolenaar  &rtp = save_rtp
3798b5841b99SBram Moolenaar  delete(dir, 'rf')
3799b5841b99SBram Moolenaarenddef
3800b5841b99SBram Moolenaar
38013896a105SBram Moolenaardef Test_cmdline_win()
38023896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
38033896a105SBram Moolenaar  # the command line window.
38043896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3805cfcd011fSBram Moolenaar  var export_lines =<< trim END
38063896a105SBram Moolenaar    vim9script
3807cfcd011fSBram Moolenaar    export var That = 'yes'
38083896a105SBram Moolenaar  END
38093896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3810cfcd011fSBram Moolenaar  var import_lines =<< trim END
38113896a105SBram Moolenaar    vim9script
38123896a105SBram Moolenaar    import That from './Xexport.vim'
38133896a105SBram Moolenaar  END
38143896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3815cfcd011fSBram Moolenaar  var save_rtp = &rtp
38163896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
38173896a105SBram Moolenaar  syntax on
38183896a105SBram Moolenaar  augroup CmdWin
38193896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
38203896a105SBram Moolenaar  augroup END
38213896a105SBram Moolenaar  # this will open and also close the cmdline window
38223896a105SBram Moolenaar  feedkeys('q:', 'xt')
38233896a105SBram Moolenaar  assert_equal('yes', g:got_there)
38243896a105SBram Moolenaar
38253896a105SBram Moolenaar  augroup CmdWin
38263896a105SBram Moolenaar    au!
38273896a105SBram Moolenaar  augroup END
38283896a105SBram Moolenaar  &rtp = save_rtp
38293896a105SBram Moolenaar  delete('rtp', 'rf')
38303896a105SBram Moolenaarenddef
38313896a105SBram Moolenaar
3832e3d4685fSBram Moolenaardef Test_invalid_sid()
3833e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
383425859dd7SBram Moolenaar
38359c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3836d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3837e3d4685fSBram Moolenaar  endif
3838e3d4685fSBram Moolenaar  delete('Xdidit')
3839e3d4685fSBram Moolenaarenddef
3840e3d4685fSBram Moolenaar
38419ec7026fSBram Moolenaardef Test_restoring_cpo()
38429ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
38439ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
38449ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
38459ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
38469ec7026fSBram Moolenaar  endif
38479ec7026fSBram Moolenaar  delete('Xsourced')
38489ec7026fSBram Moolenaar  delete('Xclose')
3849090728adSBram Moolenaar  delete('Xdone')
38500123cc1eSBram Moolenaar
38510123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
38520123cc1eSBram Moolenaar  set cpo=aABceFsMny>
38530123cc1eSBram Moolenaar  edit XanotherScript
38540123cc1eSBram Moolenaar  so %
38550123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
38560123cc1eSBram Moolenaar  :1del
38570123cc1eSBram Moolenaar  w
38580123cc1eSBram Moolenaar  so %
38590123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
38600123cc1eSBram Moolenaar
38610123cc1eSBram Moolenaar  delete('XanotherScript')
38620123cc1eSBram Moolenaar  set cpo&vim
38639ec7026fSBram Moolenaarenddef
38649ec7026fSBram Moolenaar
3865ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3866ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
386737294bd6SBram Moolenaar  CheckScreendump
3868ffb7dcdbSBram Moolenaar  CheckFeature timers
386937294bd6SBram Moolenaar
3870ffb7dcdbSBram Moolenaar  let lines =<< trim END
387137294bd6SBram Moolenaar    vim9script
387237294bd6SBram Moolenaar    def script#func()
387337294bd6SBram Moolenaar    enddef
387437294bd6SBram Moolenaar  END
3875ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3876ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
387737294bd6SBram Moolenaar
3878ffb7dcdbSBram Moolenaar  let lines =<< trim END
387937294bd6SBram Moolenaar      vim9script
388037294bd6SBram Moolenaar      set cpo+=M
388137294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
3882767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
388337294bd6SBram Moolenaar      setline(1, 'some text')
388437294bd6SBram Moolenaar  END
3885ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3886ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3887ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3888ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
388937294bd6SBram Moolenaar
3890ffb7dcdbSBram Moolenaar  " clean up
3891ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3892ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3893ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3894ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3895ffb7dcdbSBram Moolenaarendfunc
389637294bd6SBram Moolenaar
38979ec7026fSBram Moolenaar
3898f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3899cfcd011fSBram Moolenaar  var lines =<< trim END
3900cfcd011fSBram Moolenaar    var name: any
3901cfcd011fSBram Moolenaar    assert_equal(0, name)
3902f0afd9e1SBram Moolenaar  END
3903f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3904f0afd9e1SBram Moolenaarenddef
3905f0afd9e1SBram Moolenaar
39067e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
390758dbef33SBram Moolenaar  CheckRunVimInTerminal
390858dbef33SBram Moolenaar
39097e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
39107e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
39117e9210eaSBram Moolenaarendfunc
39127e9210eaSBram Moolenaar
39137e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
39149c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3915cfcd011fSBram Moolenaar  var lines =<< trim END
39169c4f5520SBram Moolenaar    func CheckAndQuit()
39179c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
39189c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
39199c4f5520SBram Moolenaar    endfunc
39209c4f5520SBram Moolenaar  END
39219c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
39229c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3923e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
39249c4f5520SBram Moolenaar  # define Afunc() on the command line
39259c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
39269c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
39272949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
39289c4f5520SBram Moolenaar
39299c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
39309c4f5520SBram Moolenaar  delete('XcallFunc')
39319c4f5520SBram Moolenaar  delete('Xdidcmd')
39329c4f5520SBram Moolenaarenddef
39339c4f5520SBram Moolenaar
3934fcdc5d83SBram Moolenaardef Test_script_var_scope()
3935fcdc5d83SBram Moolenaar  var lines =<< trim END
3936fcdc5d83SBram Moolenaar      vim9script
3937fcdc5d83SBram Moolenaar      if true
3938fcdc5d83SBram Moolenaar        if true
3939fcdc5d83SBram Moolenaar          var one = 'one'
3940fcdc5d83SBram Moolenaar          echo one
3941fcdc5d83SBram Moolenaar        endif
3942fcdc5d83SBram Moolenaar        echo one
3943fcdc5d83SBram Moolenaar      endif
3944fcdc5d83SBram Moolenaar  END
3945fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3946fcdc5d83SBram Moolenaar
3947fcdc5d83SBram Moolenaar  lines =<< trim END
3948fcdc5d83SBram Moolenaar      vim9script
3949fcdc5d83SBram Moolenaar      if true
3950fcdc5d83SBram Moolenaar        if false
3951fcdc5d83SBram Moolenaar          var one = 'one'
3952fcdc5d83SBram Moolenaar          echo one
3953fcdc5d83SBram Moolenaar        else
3954fcdc5d83SBram Moolenaar          var one = 'one'
3955fcdc5d83SBram Moolenaar          echo one
3956fcdc5d83SBram Moolenaar        endif
3957fcdc5d83SBram Moolenaar        echo one
3958fcdc5d83SBram Moolenaar      endif
3959fcdc5d83SBram Moolenaar  END
3960fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3961fcdc5d83SBram Moolenaar
3962fcdc5d83SBram Moolenaar  lines =<< trim END
3963fcdc5d83SBram Moolenaar      vim9script
3964fcdc5d83SBram Moolenaar      while true
3965fcdc5d83SBram Moolenaar        var one = 'one'
3966fcdc5d83SBram Moolenaar        echo one
3967fcdc5d83SBram Moolenaar        break
3968fcdc5d83SBram Moolenaar      endwhile
3969fcdc5d83SBram Moolenaar      echo one
3970fcdc5d83SBram Moolenaar  END
3971fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3972fcdc5d83SBram Moolenaar
3973fcdc5d83SBram Moolenaar  lines =<< trim END
3974fcdc5d83SBram Moolenaar      vim9script
3975fcdc5d83SBram Moolenaar      for i in range(1)
3976fcdc5d83SBram Moolenaar        var one = 'one'
3977fcdc5d83SBram Moolenaar        echo one
3978fcdc5d83SBram Moolenaar      endfor
3979fcdc5d83SBram Moolenaar      echo one
3980fcdc5d83SBram Moolenaar  END
3981fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
39829becdf2bSBram Moolenaar
39839becdf2bSBram Moolenaar  lines =<< trim END
39849becdf2bSBram Moolenaar      vim9script
39859becdf2bSBram Moolenaar      {
39869becdf2bSBram Moolenaar        var one = 'one'
39879becdf2bSBram Moolenaar        assert_equal('one', one)
39889becdf2bSBram Moolenaar      }
39899becdf2bSBram Moolenaar      assert_false(exists('one'))
39909becdf2bSBram Moolenaar      assert_false(exists('s:one'))
39919becdf2bSBram Moolenaar  END
39929becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
39939becdf2bSBram Moolenaar
39949becdf2bSBram Moolenaar  lines =<< trim END
39959becdf2bSBram Moolenaar      vim9script
39969becdf2bSBram Moolenaar      {
39979becdf2bSBram Moolenaar        var one = 'one'
39989becdf2bSBram Moolenaar        echo one
39999becdf2bSBram Moolenaar      }
40009becdf2bSBram Moolenaar      echo one
40019becdf2bSBram Moolenaar  END
40029becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
4003fcdc5d83SBram Moolenaarenddef
4004fcdc5d83SBram Moolenaar
4005352134bbSBram Moolenaardef Test_catch_exception_in_callback()
4006352134bbSBram Moolenaar  var lines =<< trim END
4007352134bbSBram Moolenaar    vim9script
40082a38908bSBram Moolenaar    def Callback(...l: list<any>)
4009352134bbSBram Moolenaar      try
4010352134bbSBram Moolenaar        var x: string
4011352134bbSBram Moolenaar        var y: string
4012352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
4013352134bbSBram Moolenaar        [x, y] = ['']
4014352134bbSBram Moolenaar      catch
4015352134bbSBram Moolenaar        g:caught = 'yes'
4016352134bbSBram Moolenaar      endtry
4017352134bbSBram Moolenaar    enddef
4018e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
4019352134bbSBram Moolenaar    feedkeys("\r", 'xt')
4020352134bbSBram Moolenaar  END
4021352134bbSBram Moolenaar  CheckScriptSuccess(lines)
4022352134bbSBram Moolenaar
4023352134bbSBram Moolenaar  unlet g:caught
4024352134bbSBram Moolenaarenddef
4025352134bbSBram Moolenaar
4026631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
4027631e8f93SBram Moolenaar  if !has('unix') || !has('job')
4028631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
4029631e8f93SBram Moolenaar  endif
4030631e8f93SBram Moolenaar  var lines =<< trim END
4031631e8f93SBram Moolenaar      vim9script
4032631e8f93SBram Moolenaar      var source: list<number>
40332a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
4034631e8f93SBram Moolenaar          eval [][0]
4035631e8f93SBram Moolenaar      enddef
40362a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
4037631e8f93SBram Moolenaar          sleep 1m
4038631e8f93SBram Moolenaar          source += l
4039631e8f93SBram Moolenaar      enddef
4040e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
40416f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
40426f17a3f0SBram Moolenaar        sleep 10m
40436f17a3f0SBram Moolenaar      endwhile
4044206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
4045fe95b94fSBram Moolenaar      sleep 200m
4046631e8f93SBram Moolenaar  END
4047631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
4048631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
4049631e8f93SBram Moolenaar  delete('Xdef')
4050631e8f93SBram Moolenaarenddef
4051631e8f93SBram Moolenaar
40524324d87aSBram Moolenaardef InvokeNormal()
40534324d87aSBram Moolenaar  exe "norm! :m+1\r"
40544324d87aSBram Moolenaarenddef
40554324d87aSBram Moolenaar
40564324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
40574324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
40584324d87aSBram Moolenaar  new
40594324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
40604324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
40614324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
40624324d87aSBram Moolenaar  xunmap <F3>
4063b5b9480eSBram Moolenaarenddef
4064b5b9480eSBram Moolenaar
4065b5b9480eSBram Moolenaardef Test_white_space_after_command()
4066b5b9480eSBram Moolenaar  var lines =<< trim END
4067b5b9480eSBram Moolenaar    exit_cb: Func})
4068b5b9480eSBram Moolenaar  END
4069b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
4070f8103f27SBram Moolenaar
4071f8103f27SBram Moolenaar  lines =<< trim END
4072f8103f27SBram Moolenaar    e#
4073f8103f27SBram Moolenaar  END
4074f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
40754324d87aSBram Moolenaarenddef
40764324d87aSBram Moolenaar
40774aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
40784aab88d9SBram Moolenaar  var lines =<< trim END
40794aab88d9SBram Moolenaar      vim9script
40804aab88d9SBram Moolenaar      if exists('g:guard')
40814aab88d9SBram Moolenaar        finish
40824aab88d9SBram Moolenaar      endif
40834aab88d9SBram Moolenaar      g:guard = 1
40844aab88d9SBram Moolenaar      var name = 'thename'
40854aab88d9SBram Moolenaar      def g:GetName(): string
40864aab88d9SBram Moolenaar        return name
40874aab88d9SBram Moolenaar      enddef
40884aab88d9SBram Moolenaar      def g:SetName(arg: string)
40894aab88d9SBram Moolenaar        name = arg
40904aab88d9SBram Moolenaar      enddef
40914aab88d9SBram Moolenaar  END
40924aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
40934aab88d9SBram Moolenaar  so XscriptTwice.vim
40944aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
40954aab88d9SBram Moolenaar  g:SetName('newname')
40964aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
40974aab88d9SBram Moolenaar  so XscriptTwice.vim
40984aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
40994aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
41004aab88d9SBram Moolenaar
41014aab88d9SBram Moolenaar  delfunc g:GetName
41024aab88d9SBram Moolenaar  delfunc g:SetName
41034aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
41044aab88d9SBram Moolenaar  unlet g:guard
41054aab88d9SBram Moolenaarenddef
41064aab88d9SBram Moolenaar
41074aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
41084aab88d9SBram Moolenaar  var exportlines =<< trim END
41094aab88d9SBram Moolenaar      vim9script
41104aab88d9SBram Moolenaar      if exists('g:guard')
41114aab88d9SBram Moolenaar        finish
41124aab88d9SBram Moolenaar      endif
41134aab88d9SBram Moolenaar      g:guard = 1
41144aab88d9SBram Moolenaar      export var name = 'someName'
41154aab88d9SBram Moolenaar  END
41164aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
41174aab88d9SBram Moolenaar
41184aab88d9SBram Moolenaar  var lines =<< trim END
41194aab88d9SBram Moolenaar      vim9script
41204aab88d9SBram Moolenaar      import name from './XexportScript.vim'
41214aab88d9SBram Moolenaar      def g:GetName(): string
41224aab88d9SBram Moolenaar        return name
41234aab88d9SBram Moolenaar      enddef
41244aab88d9SBram Moolenaar  END
41254aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
41264aab88d9SBram Moolenaar  so XscriptImport.vim
41274aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
41284aab88d9SBram Moolenaar
41294aab88d9SBram Moolenaar  so XexportScript.vim
41304aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
41314aab88d9SBram Moolenaar
41324aab88d9SBram Moolenaar  delfunc g:GetName
41334aab88d9SBram Moolenaar  delete('XexportScript.vim')
41344aab88d9SBram Moolenaar  delete('XscriptImport.vim')
41354aab88d9SBram Moolenaar  unlet g:guard
41364aab88d9SBram Moolenaarenddef
41374aab88d9SBram Moolenaar
413810b9421fSBram Moolenaardef Test_unsupported_commands()
413910b9421fSBram Moolenaar  var lines =<< trim END
414010b9421fSBram Moolenaar      ka
414110b9421fSBram Moolenaar  END
41427d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
41437d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
414410b9421fSBram Moolenaar
414510b9421fSBram Moolenaar  lines =<< trim END
4146ada1d870SBram Moolenaar      :1ka
4147ada1d870SBram Moolenaar  END
41487d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
41497d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
4150ada1d870SBram Moolenaar
4151ada1d870SBram Moolenaar  lines =<< trim END
415210b9421fSBram Moolenaar    t
415310b9421fSBram Moolenaar  END
415410b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
415510b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
415610b9421fSBram Moolenaar
415710b9421fSBram Moolenaar  lines =<< trim END
415810b9421fSBram Moolenaar    x
415910b9421fSBram Moolenaar  END
416010b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
416110b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
416210b9421fSBram Moolenaar
416310b9421fSBram Moolenaar  lines =<< trim END
416410b9421fSBram Moolenaar    xit
416510b9421fSBram Moolenaar  END
416610b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
416710b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
416810b9421fSBram Moolenaarenddef
416910b9421fSBram Moolenaar
4170c70fe460SBram Moolenaardef Test_mapping_line_number()
4171c70fe460SBram Moolenaar  var lines =<< trim END
4172c70fe460SBram Moolenaar      vim9script
4173c70fe460SBram Moolenaar      def g:FuncA()
4174c70fe460SBram Moolenaar          # Some comment
4175c70fe460SBram Moolenaar          FuncB(0)
4176c70fe460SBram Moolenaar      enddef
4177c70fe460SBram Moolenaar          # Some comment
4178c70fe460SBram Moolenaar      def FuncB(
4179c70fe460SBram Moolenaar          # Some comment
4180c70fe460SBram Moolenaar          n: number
4181c70fe460SBram Moolenaar      )
4182c70fe460SBram Moolenaar          exe 'nno '
4183c70fe460SBram Moolenaar              # Some comment
4184c70fe460SBram Moolenaar              .. '<F3> a'
4185c70fe460SBram Moolenaar              .. 'b'
4186c70fe460SBram Moolenaar              .. 'c'
4187c70fe460SBram Moolenaar      enddef
4188c70fe460SBram Moolenaar  END
4189c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
4190c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
4191c70fe460SBram Moolenaar  assert_match('No mapping found', res)
4192c70fe460SBram Moolenaar
4193c70fe460SBram Moolenaar  g:FuncA()
4194c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
4195c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4196c70fe460SBram Moolenaar
4197c70fe460SBram Moolenaar  nunmap <F3>
4198c70fe460SBram Moolenaar  delfunc g:FuncA
4199c70fe460SBram Moolenaarenddef
4200c70fe460SBram Moolenaar
4201deb108baSBram Moolenaardef Test_option_set()
4202deb108baSBram Moolenaar  # legacy script allows for white space
4203deb108baSBram Moolenaar  var lines =<< trim END
4204deb108baSBram Moolenaar      set foldlevel  =11
4205deb108baSBram Moolenaar      call assert_equal(11, &foldlevel)
4206deb108baSBram Moolenaar  END
4207deb108baSBram Moolenaar  CheckScriptSuccess(lines)
4208deb108baSBram Moolenaar
4209deb108baSBram Moolenaar  set foldlevel
4210deb108baSBram Moolenaar  set foldlevel=12
4211deb108baSBram Moolenaar  assert_equal(12, &foldlevel)
4212deb108baSBram Moolenaar  set foldlevel+=2
4213deb108baSBram Moolenaar  assert_equal(14, &foldlevel)
4214deb108baSBram Moolenaar  set foldlevel-=3
4215deb108baSBram Moolenaar  assert_equal(11, &foldlevel)
4216deb108baSBram Moolenaar
4217deb108baSBram Moolenaar  lines =<< trim END
4218deb108baSBram Moolenaar      set foldlevel =1
4219deb108baSBram Moolenaar  END
4220deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
4221deb108baSBram Moolenaar
4222deb108baSBram Moolenaar  lines =<< trim END
4223deb108baSBram Moolenaar      set foldlevel +=1
4224deb108baSBram Moolenaar  END
4225deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
4226deb108baSBram Moolenaar
4227deb108baSBram Moolenaar  lines =<< trim END
4228deb108baSBram Moolenaar      set foldlevel ^=1
4229deb108baSBram Moolenaar  END
4230deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
4231deb108baSBram Moolenaar
4232deb108baSBram Moolenaar  lines =<< trim END
4233deb108baSBram Moolenaar      set foldlevel -=1
4234deb108baSBram Moolenaar  END
4235deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
4236deb108baSBram Moolenaar
4237deb108baSBram Moolenaar  set foldlevel&
4238deb108baSBram Moolenaarenddef
4239deb108baSBram Moolenaar
4240208f0b48SBram Moolenaardef Test_option_modifier()
42411594f313SBram Moolenaar  # legacy script allows for white space
4242208f0b48SBram Moolenaar  var lines =<< trim END
4243208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
4244208f0b48SBram Moolenaar      call assert_equal(1, &hlsearch)
4245208f0b48SBram Moolenaar  END
4246208f0b48SBram Moolenaar  CheckScriptSuccess(lines)
4247208f0b48SBram Moolenaar
42481594f313SBram Moolenaar  set hlsearch
42491594f313SBram Moolenaar  set hlsearch!
42501594f313SBram Moolenaar  assert_equal(false, &hlsearch)
42511594f313SBram Moolenaar
42521594f313SBram Moolenaar  set hlsearch
4253208f0b48SBram Moolenaar  set hlsearch&
42541594f313SBram Moolenaar  assert_equal(false, &hlsearch)
4255208f0b48SBram Moolenaar
4256208f0b48SBram Moolenaar  lines =<< trim END
42571594f313SBram Moolenaar      set hlsearch &
4258208f0b48SBram Moolenaar  END
42591594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
42601594f313SBram Moolenaar
42611594f313SBram Moolenaar  lines =<< trim END
42621594f313SBram Moolenaar      set hlsearch   !
42631594f313SBram Moolenaar  END
42641594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
42651594f313SBram Moolenaar
42661594f313SBram Moolenaar  set hlsearch&
4267208f0b48SBram Moolenaarenddef
4268208f0b48SBram Moolenaar
4269c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail
4270c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number()
4271c03fe66aSBram Moolenaar  var lines =<< trim END
4272c03fe66aSBram Moolenaar      echoerr 'some'
4273c03fe66aSBram Moolenaar         .. ' error'
4274c03fe66aSBram Moolenaar         .. ' continued'
4275c03fe66aSBram Moolenaar  END
4276c03fe66aSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
4277c03fe66aSBram Moolenaarenddef
4278c03fe66aSBram Moolenaar
4279648594eaSBram Moolenaardef ProfiledWithLambda()
4280d9162550SBram Moolenaar  var n = 3
4281d9162550SBram Moolenaar  echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4282d9162550SBram Moolenaarenddef
4283d9162550SBram Moolenaar
4284648594eaSBram Moolenaardef ProfiledNested()
4285648594eaSBram Moolenaar  var x = 0
4286648594eaSBram Moolenaar  def Nested(): any
4287648594eaSBram Moolenaar      return x
4288648594eaSBram Moolenaar  enddef
4289648594eaSBram Moolenaar  Nested()
4290648594eaSBram Moolenaarenddef
4291648594eaSBram Moolenaar
4292ffcfddc7SBram Moolenaardef ProfiledNestedProfiled()
4293ffcfddc7SBram Moolenaar  var x = 0
4294ffcfddc7SBram Moolenaar  def Nested(): any
4295ffcfddc7SBram Moolenaar      return x
4296ffcfddc7SBram Moolenaar  enddef
4297ffcfddc7SBram Moolenaar  Nested()
4298ffcfddc7SBram Moolenaarenddef
4299ffcfddc7SBram Moolenaar
4300d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists.
4301d9162550SBram Moolenaar" This only tests that it works, not the profiling output.
4302d9162550SBram Moolenaardef Test_xx_profile_with_lambda()
43034ece152aSBram Moolenaar  CheckFeature profile
43044ece152aSBram Moolenaar
4305d9162550SBram Moolenaar  profile start Xprofile.log
4306648594eaSBram Moolenaar  profile func ProfiledWithLambda
4307648594eaSBram Moolenaar  ProfiledWithLambda()
4308ffcfddc7SBram Moolenaar
4309648594eaSBram Moolenaar  profile func ProfiledNested
4310648594eaSBram Moolenaar  ProfiledNested()
4311ffcfddc7SBram Moolenaar
4312ffcfddc7SBram Moolenaar  # Also profile the nested function.  Use a different function, although the
4313ffcfddc7SBram Moolenaar  # contents is the same, to make sure it was not already compiled.
4314ffcfddc7SBram Moolenaar  profile func *
4315ffcfddc7SBram Moolenaar  ProfiledNestedProfiled()
4316ffcfddc7SBram Moolenaar
4317ffcfddc7SBram Moolenaar  profdel func *
4318ffcfddc7SBram Moolenaar  profile pause
4319d9162550SBram Moolenaarenddef
4320d9162550SBram Moolenaar
4321585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
4322585fea7bSBram Moolenaardef Test_substitute_cmd()
4323585fea7bSBram Moolenaar  new
4324585fea7bSBram Moolenaar  setline(1, 'something')
4325585fea7bSBram Moolenaar  :substitute(some(other(
4326585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
4327585fea7bSBram Moolenaar  bwipe!
4328585fea7bSBram Moolenaar
4329f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
4330cfcd011fSBram Moolenaar  var lines =<< trim END
4331585fea7bSBram Moolenaar    vim9script
4332585fea7bSBram Moolenaar    new
4333585fea7bSBram Moolenaar    setline(1, 'something')
4334585fea7bSBram Moolenaar    :substitute(some(other(
4335585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
4336585fea7bSBram Moolenaar    bwipe!
4337585fea7bSBram Moolenaar  END
4338585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
4339585fea7bSBram Moolenaar  source Xvim9lines
4340585fea7bSBram Moolenaar
4341585fea7bSBram Moolenaar  delete('Xvim9lines')
4342585fea7bSBram Moolenaarenddef
4343585fea7bSBram Moolenaar
43448a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
4345