18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
7e3d4685fSBram Moolenaarsource shared.vim
837294bd6SBram Moolenaarsource screendump.vim
98a7d6542SBram Moolenaar
105d72ce69SBram Moolenaardef Test_range_only()
115d72ce69SBram Moolenaar  new
125d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
135d72ce69SBram Moolenaar  :/Blah/
145d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
15c2af0affSBram Moolenaar  bwipe!
16c2af0affSBram Moolenaar
17c2af0affSBram Moolenaar  # without range commands use current line
18c2af0affSBram Moolenaar  new
19c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
20c2af0affSBram Moolenaar  :2
21c2af0affSBram Moolenaar  print
22c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
23c2af0affSBram Moolenaar  :3
24c2af0affSBram Moolenaar  list
25c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
26b8554304SBram Moolenaar
27b8554304SBram Moolenaar  # missing command does not print the line
28b8554304SBram Moolenaar  var lines =<< trim END
29b8554304SBram Moolenaar    vim9script
30b8554304SBram Moolenaar    :1|
31b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
32b8554304SBram Moolenaar    :|
33b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
34b8554304SBram Moolenaar  END
35b8554304SBram Moolenaar  CheckScriptSuccess(lines)
36b8554304SBram Moolenaar
37c2af0affSBram Moolenaar  bwipe!
38025cb1caSBram Moolenaar
39025cb1caSBram Moolenaar  # won't generate anything
40025cb1caSBram Moolenaar  if false
41025cb1caSBram Moolenaar    :123
42025cb1caSBram Moolenaar  endif
435d72ce69SBram Moolenaarenddef
445d72ce69SBram Moolenaar
45a6e67e4fSBram Moolenaarlet g:alist = [7]
46a6e67e4fSBram Moolenaarlet g:astring = 'text'
47f0b9f43cSBram Moolenaarlet g:anumber = 123
486e587dcbSBram Moolenaar
494c17ad94SBram Moolenaardef Test_delfunction()
50f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
514c17ad94SBram Moolenaar  CheckScriptSuccess([
524c17ad94SBram Moolenaar      'vim9script',
534c17ad94SBram Moolenaar      'func CheckMe()',
544c17ad94SBram Moolenaar      '  return 123',
554c17ad94SBram Moolenaar      'endfunc',
564c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
574c17ad94SBram Moolenaar      ])
584c17ad94SBram Moolenaar
59f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
604c17ad94SBram Moolenaar  CheckScriptFailure([
614c17ad94SBram Moolenaar      'vim9script',
624c17ad94SBram Moolenaar      'func DeleteMe1()',
634c17ad94SBram Moolenaar      'endfunc',
644c17ad94SBram Moolenaar      'delfunction DeleteMe1',
654c17ad94SBram Moolenaar      ], 'E1084:')
664c17ad94SBram Moolenaar  CheckScriptFailure([
674c17ad94SBram Moolenaar      'vim9script',
684c17ad94SBram Moolenaar      'func DeleteMe2()',
694c17ad94SBram Moolenaar      'endfunc',
704c17ad94SBram Moolenaar      'def DoThat()',
714c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
724c17ad94SBram Moolenaar      'enddef',
734c17ad94SBram Moolenaar      'DoThat()',
744c17ad94SBram Moolenaar      ], 'E1084:')
754c17ad94SBram Moolenaar  CheckScriptFailure([
764c17ad94SBram Moolenaar      'vim9script',
774c17ad94SBram Moolenaar      'def DeleteMe3()',
784c17ad94SBram Moolenaar      'enddef',
794c17ad94SBram Moolenaar      'delfunction DeleteMe3',
804c17ad94SBram Moolenaar      ], 'E1084:')
814c17ad94SBram Moolenaar  CheckScriptFailure([
824c17ad94SBram Moolenaar      'vim9script',
834c17ad94SBram Moolenaar      'def DeleteMe4()',
844c17ad94SBram Moolenaar      'enddef',
854c17ad94SBram Moolenaar      'def DoThat()',
864c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
874c17ad94SBram Moolenaar      'enddef',
884c17ad94SBram Moolenaar      'DoThat()',
894c17ad94SBram Moolenaar      ], 'E1084:')
90925e9fd6SBram Moolenaar
91925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
92cfcd011fSBram Moolenaar  var lines =<< trim END
93925e9fd6SBram Moolenaar      vim9script
94925e9fd6SBram Moolenaar      def g:Global(): string
95925e9fd6SBram Moolenaar        return "yes"
96925e9fd6SBram Moolenaar      enddef
97925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
98925e9fd6SBram Moolenaar      def! g:Global(): string
99925e9fd6SBram Moolenaar        return "no"
100925e9fd6SBram Moolenaar      enddef
101925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
102925e9fd6SBram Moolenaar      delfunc g:Global
103925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
104925e9fd6SBram Moolenaar  END
105925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
106925e9fd6SBram Moolenaar
107925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
108925e9fd6SBram Moolenaar  lines =<< trim END
109925e9fd6SBram Moolenaar      vim9script
110925e9fd6SBram Moolenaar      func g:Global()
111925e9fd6SBram Moolenaar        return "yes"
112925e9fd6SBram Moolenaar      endfunc
113925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
114925e9fd6SBram Moolenaar      def! g:Global(): string
115925e9fd6SBram Moolenaar        return "no"
116925e9fd6SBram Moolenaar      enddef
117925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
118925e9fd6SBram Moolenaar      delfunc g:Global
119925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
120925e9fd6SBram Moolenaar  END
121925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
122925e9fd6SBram Moolenaar
123925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
124925e9fd6SBram Moolenaar  lines =<< trim END
125925e9fd6SBram Moolenaar      vim9script
126925e9fd6SBram Moolenaar      def g:Global(): string
127925e9fd6SBram Moolenaar        return "yes"
128925e9fd6SBram Moolenaar      enddef
129925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
130925e9fd6SBram Moolenaar      func! g:Global()
131925e9fd6SBram Moolenaar        return "no"
132925e9fd6SBram Moolenaar      endfunc
133925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
134925e9fd6SBram Moolenaar      delfunc g:Global
135925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
136925e9fd6SBram Moolenaar  END
137925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1384c17ad94SBram Moolenaarenddef
1394c17ad94SBram Moolenaar
14008052228SBram Moolenaardef Test_wrong_type()
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
143cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
144cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
145599c89c8SBram Moolenaar
146cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
147cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
14842a480bfSBram Moolenaar
149cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
150cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
151cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
152cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
153cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
154cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
155cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
156cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
157cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
158cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
159cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
160a0a9f43aSBram Moolenaar
161cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
162cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
16308052228SBram Moolenaarenddef
1648a7d6542SBram Moolenaar
16510c65860SBram Moolenaardef Test_script_wrong_type()
16610c65860SBram Moolenaar  var lines =<< trim END
16710c65860SBram Moolenaar      vim9script
16810c65860SBram Moolenaar      var s:dict: dict<string>
16910c65860SBram Moolenaar      s:dict['a'] = ['x']
17010c65860SBram Moolenaar  END
17110c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
17210c65860SBram Moolenaarenddef
17310c65860SBram Moolenaar
17408052228SBram Moolenaardef Test_const()
175cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
176cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
177cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
17830fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
17930fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
180dbeecb2bSBram Moolenaar
181cfcd011fSBram Moolenaar  var lines =<< trim END
18230fd8204SBram Moolenaar    final list = [1, 2, 3]
183dbeecb2bSBram Moolenaar    list[0] = 4
1840b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
18530fd8204SBram Moolenaar    const other = [5, 6, 7]
1860b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
18771abe482SBram Moolenaar
188cfcd011fSBram Moolenaar    var varlist = [7, 8]
18930fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
19071abe482SBram Moolenaar    varlist[0] = 77
19171abe482SBram Moolenaar    # TODO: does not work yet
19271abe482SBram Moolenaar    # constlist[1][1] = 88
193cfcd011fSBram Moolenaar    var cl = constlist[1]
19471abe482SBram Moolenaar    cl[1] = 88
19571abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
19671abe482SBram Moolenaar
197e0de171eSBram Moolenaar    var vardict = {five: 5, six: 6}
198e0de171eSBram Moolenaar    const constdict = {one: 1, two: vardict, three: 3}
19971abe482SBram Moolenaar    vardict['five'] = 55
20071abe482SBram Moolenaar    # TODO: does not work yet
20171abe482SBram Moolenaar    # constdict['two']['six'] = 66
202cfcd011fSBram Moolenaar    var cd = constdict['two']
20371abe482SBram Moolenaar    cd['six'] = 66
204e0de171eSBram Moolenaar    constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
205dbeecb2bSBram Moolenaar  END
206dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
20708052228SBram Moolenaarenddef
2088a7d6542SBram Moolenaar
2090b4c66c6SBram Moolenaardef Test_const_bang()
210cfcd011fSBram Moolenaar  var lines =<< trim END
21130fd8204SBram Moolenaar      const var = 234
2120b4c66c6SBram Moolenaar      var = 99
2130b4c66c6SBram Moolenaar  END
2140b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
2150b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
2160b4c66c6SBram Moolenaar
2170b4c66c6SBram Moolenaar  lines =<< trim END
21830fd8204SBram Moolenaar      const ll = [2, 3, 4]
2190b4c66c6SBram Moolenaar      ll[0] = 99
2200b4c66c6SBram Moolenaar  END
2210b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2220b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2230b4c66c6SBram Moolenaar
2240b4c66c6SBram Moolenaar  lines =<< trim END
22530fd8204SBram Moolenaar      const ll = [2, 3, 4]
2260b4c66c6SBram Moolenaar      ll[3] = 99
2270b4c66c6SBram Moolenaar  END
2280b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2290b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2300b4c66c6SBram Moolenaar
2310b4c66c6SBram Moolenaar  lines =<< trim END
232e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2330b4c66c6SBram Moolenaar      dd["one"] = 99
2340b4c66c6SBram Moolenaar  END
2350b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2360b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2370b4c66c6SBram Moolenaar
2380b4c66c6SBram Moolenaar  lines =<< trim END
239e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2400b4c66c6SBram Moolenaar      dd["three"] = 99
2410b4c66c6SBram Moolenaar  END
2420b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2430b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2440b4c66c6SBram Moolenaarenddef
2450b4c66c6SBram Moolenaar
246df069eecSBram Moolenaardef Test_range_no_colon()
247d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
248d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
249d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
250d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
251df069eecSBram Moolenaarenddef
252df069eecSBram Moolenaar
253df069eecSBram Moolenaar
2548a7d6542SBram Moolenaardef Test_block()
255cfcd011fSBram Moolenaar  var outer = 1
2568a7d6542SBram Moolenaar  {
257cfcd011fSBram Moolenaar    var inner = 2
2588a7d6542SBram Moolenaar    assert_equal(1, outer)
2598a7d6542SBram Moolenaar    assert_equal(2, inner)
2608a7d6542SBram Moolenaar  }
2618a7d6542SBram Moolenaar  assert_equal(1, outer)
2623f1e9f00SBram Moolenaar
2633f1e9f00SBram Moolenaar  {|echo 'yes'|}
2648a7d6542SBram Moolenaarenddef
2658a7d6542SBram Moolenaar
26608052228SBram Moolenaardef Test_block_failure()
267cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
26808052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
26908052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
27008052228SBram Moolenaarenddef
2718a7d6542SBram Moolenaar
272fbbcd003SBram Moolenaardef Test_block_local_vars()
273fbbcd003SBram Moolenaar  var lines =<< trim END
274fbbcd003SBram Moolenaar      vim9script
275ed234f24SBram Moolenaar      v:testing = 1
276fbbcd003SBram Moolenaar      if true
277ed234f24SBram Moolenaar        var text = ['hello']
278ed234f24SBram Moolenaar        def SayHello(): list<string>
279fbbcd003SBram Moolenaar          return text
280fbbcd003SBram Moolenaar        enddef
281fbbcd003SBram Moolenaar        def SetText(v: string)
282ed234f24SBram Moolenaar          text = [v]
283fbbcd003SBram Moolenaar        enddef
284fbbcd003SBram Moolenaar      endif
285fbbcd003SBram Moolenaar
286fbbcd003SBram Moolenaar      if true
287ed234f24SBram Moolenaar        var text = ['again']
288ed234f24SBram Moolenaar        def SayAgain(): list<string>
289fbbcd003SBram Moolenaar          return text
290fbbcd003SBram Moolenaar        enddef
291fbbcd003SBram Moolenaar      endif
292ed234f24SBram Moolenaar
293ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
294ed234f24SBram Moolenaar      test_garbagecollect_now()
295ed234f24SBram Moolenaar
296fbbcd003SBram Moolenaar      defcompile
297fbbcd003SBram Moolenaar
298ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
299ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
300fbbcd003SBram Moolenaar
301fbbcd003SBram Moolenaar      SetText('foobar')
302ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
303ed234f24SBram Moolenaar
304ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
305ed234f24SBram Moolenaar      qall!
306fbbcd003SBram Moolenaar  END
307ed234f24SBram Moolenaar
308ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
309ed234f24SBram Moolenaar  # context gets garbage collected.
310ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
311ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
312ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
313ed234f24SBram Moolenaar
314ed234f24SBram Moolenaar  delete('Xscript')
315ed234f24SBram Moolenaar  delete('Xdidit')
316fbbcd003SBram Moolenaarenddef
317fbbcd003SBram Moolenaar
31839ca4127SBram Moolenaardef Test_block_local_vars_with_func()
31939ca4127SBram Moolenaar  var lines =<< trim END
32039ca4127SBram Moolenaar      vim9script
32139ca4127SBram Moolenaar      if true
32239ca4127SBram Moolenaar        var foo = 'foo'
32339ca4127SBram Moolenaar        if true
32439ca4127SBram Moolenaar          var bar = 'bar'
32539ca4127SBram Moolenaar          def Func(): list<string>
32639ca4127SBram Moolenaar            return [foo, bar]
32739ca4127SBram Moolenaar          enddef
32839ca4127SBram Moolenaar        endif
32939ca4127SBram Moolenaar      endif
33039ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
33139ca4127SBram Moolenaar      # "foo" and "bar"
33239ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
33339ca4127SBram Moolenaar  END
33439ca4127SBram Moolenaar  CheckScriptSuccess(lines)
33539ca4127SBram Moolenaarenddef
33639ca4127SBram Moolenaar
337d032f34aSBram Moolenaarfunc g:NoSuchFunc()
338d032f34aSBram Moolenaar  echo 'none'
339d032f34aSBram Moolenaarendfunc
340d032f34aSBram Moolenaar
3419e1d9e34SBram Moolenaardef Test_try_catch_throw()
342cfcd011fSBram Moolenaar  var l = []
3437a092245SBram Moolenaar  try # comment
3448a7d6542SBram Moolenaar    add(l, '1')
3458a7d6542SBram Moolenaar    throw 'wrong'
3468a7d6542SBram Moolenaar    add(l, '2')
3477a092245SBram Moolenaar  catch # comment
3488a7d6542SBram Moolenaar    add(l, v:exception)
3497a092245SBram Moolenaar  finally # comment
3508a7d6542SBram Moolenaar    add(l, '3')
3517a092245SBram Moolenaar  endtry # comment
3528a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
35368d130c6SBram Moolenaar
354e859312eSBram Moolenaar  l = []
355e859312eSBram Moolenaar  try
356e859312eSBram Moolenaar    try
357e859312eSBram Moolenaar      add(l, '1')
358e859312eSBram Moolenaar      throw 'wrong'
359e859312eSBram Moolenaar      add(l, '2')
360e859312eSBram Moolenaar    catch /right/
361e859312eSBram Moolenaar      add(l, v:exception)
362e859312eSBram Moolenaar    endtry
363e859312eSBram Moolenaar  catch /wrong/
364e859312eSBram Moolenaar    add(l, 'caught')
365373863edSBram Moolenaar  fina
366e859312eSBram Moolenaar    add(l, 'finally')
367e859312eSBram Moolenaar  endtry
368e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
369e859312eSBram Moolenaar
370cfcd011fSBram Moolenaar  var n: number
37168d130c6SBram Moolenaar  try
37268d130c6SBram Moolenaar    n = l[3]
37368d130c6SBram Moolenaar  catch /E684:/
37468d130c6SBram Moolenaar    n = 99
37568d130c6SBram Moolenaar  endtry
37668d130c6SBram Moolenaar  assert_equal(99, n)
37768d130c6SBram Moolenaar
37869f7050cSBram Moolenaar  var done = 'no'
37969f7050cSBram Moolenaar  if 0
38069f7050cSBram Moolenaar    try | catch | endtry
38169f7050cSBram Moolenaar  else
38269f7050cSBram Moolenaar    done = 'yes'
38369f7050cSBram Moolenaar  endif
38469f7050cSBram Moolenaar  assert_equal('yes', done)
38569f7050cSBram Moolenaar
38669f7050cSBram Moolenaar  done = 'no'
38769f7050cSBram Moolenaar  if 1
38869f7050cSBram Moolenaar    done = 'yes'
38969f7050cSBram Moolenaar  else
39069f7050cSBram Moolenaar    try | catch | endtry
39169f7050cSBram Moolenaar    done = 'never'
39269f7050cSBram Moolenaar  endif
39369f7050cSBram Moolenaar  assert_equal('yes', done)
39469f7050cSBram Moolenaar
39569f7050cSBram Moolenaar  if 1
39669f7050cSBram Moolenaar  else
39769f7050cSBram Moolenaar    try | catch /pat/ | endtry
39869f7050cSBram Moolenaar    try | catch /pat/
39969f7050cSBram Moolenaar    endtry
40069f7050cSBram Moolenaar    try
40169f7050cSBram Moolenaar    catch /pat/ | endtry
40269f7050cSBram Moolenaar    try
40369f7050cSBram Moolenaar    catch /pat/
40469f7050cSBram Moolenaar    endtry
40569f7050cSBram Moolenaar  endif
40669f7050cSBram Moolenaar
40768d130c6SBram Moolenaar  try
408cc673e74SBram Moolenaar    # string slice returns a string, not a number
40968d130c6SBram Moolenaar    n = g:astring[3]
4105e654230SBram Moolenaar  catch /E1012:/
41168d130c6SBram Moolenaar    n = 77
41268d130c6SBram Moolenaar  endtry
41368d130c6SBram Moolenaar  assert_equal(77, n)
41468d130c6SBram Moolenaar
41568d130c6SBram Moolenaar  try
41668d130c6SBram Moolenaar    n = l[g:astring]
4175e654230SBram Moolenaar  catch /E1012:/
41856acb094SBram Moolenaar    n = 88
41968d130c6SBram Moolenaar  endtry
42056acb094SBram Moolenaar  assert_equal(88, n)
42168d130c6SBram Moolenaar
42268d130c6SBram Moolenaar  try
42368d130c6SBram Moolenaar    n = s:does_not_exist
42468d130c6SBram Moolenaar  catch /E121:/
425f0b9f43cSBram Moolenaar    n = 111
426f0b9f43cSBram Moolenaar  endtry
427f0b9f43cSBram Moolenaar  assert_equal(111, n)
428f0b9f43cSBram Moolenaar
429f0b9f43cSBram Moolenaar  try
430f0b9f43cSBram Moolenaar    n = g:does_not_exist
431f0b9f43cSBram Moolenaar  catch /E121:/
43268d130c6SBram Moolenaar    n = 121
43368d130c6SBram Moolenaar  endtry
43468d130c6SBram Moolenaar  assert_equal(121, n)
43568d130c6SBram Moolenaar
436e0de171eSBram Moolenaar  var d = {one: 1}
43768d130c6SBram Moolenaar  try
43868d130c6SBram Moolenaar    n = d[g:astring]
43968d130c6SBram Moolenaar  catch /E716:/
44068d130c6SBram Moolenaar    n = 222
44168d130c6SBram Moolenaar  endtry
44268d130c6SBram Moolenaar  assert_equal(222, n)
443f0b9f43cSBram Moolenaar
444f0b9f43cSBram Moolenaar  try
445f0b9f43cSBram Moolenaar    n = -g:astring
446f0b9f43cSBram Moolenaar  catch /E39:/
447f0b9f43cSBram Moolenaar    n = 233
448f0b9f43cSBram Moolenaar  endtry
449f0b9f43cSBram Moolenaar  assert_equal(233, n)
450f0b9f43cSBram Moolenaar
451f0b9f43cSBram Moolenaar  try
452f0b9f43cSBram Moolenaar    n = +g:astring
453f0b9f43cSBram Moolenaar  catch /E1030:/
454f0b9f43cSBram Moolenaar    n = 244
455f0b9f43cSBram Moolenaar  endtry
456f0b9f43cSBram Moolenaar  assert_equal(244, n)
457f0b9f43cSBram Moolenaar
458f0b9f43cSBram Moolenaar  try
459f0b9f43cSBram Moolenaar    n = +g:alist
460f0b9f43cSBram Moolenaar  catch /E745:/
461f0b9f43cSBram Moolenaar    n = 255
462f0b9f43cSBram Moolenaar  endtry
463f0b9f43cSBram Moolenaar  assert_equal(255, n)
464f0b9f43cSBram Moolenaar
465cfcd011fSBram Moolenaar  var nd: dict<any>
466f0b9f43cSBram Moolenaar  try
4672e5910bfSBram Moolenaar    nd = {[g:alist]: 1}
4682e5910bfSBram Moolenaar  catch /E1105:/
469f0b9f43cSBram Moolenaar    n = 266
470f0b9f43cSBram Moolenaar  endtry
471f0b9f43cSBram Moolenaar  assert_equal(266, n)
472f0b9f43cSBram Moolenaar
473f0b9f43cSBram Moolenaar  try
474f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
475f0b9f43cSBram Moolenaar  catch /E1093:/
476f0b9f43cSBram Moolenaar    n = 277
477f0b9f43cSBram Moolenaar  endtry
478f0b9f43cSBram Moolenaar  assert_equal(277, n)
479f0b9f43cSBram Moolenaar
480e859312eSBram Moolenaar  try
481e859312eSBram Moolenaar    &ts = g:astring
4825e654230SBram Moolenaar  catch /E1012:/
483e859312eSBram Moolenaar    n = 288
484e859312eSBram Moolenaar  endtry
485e859312eSBram Moolenaar  assert_equal(288, n)
486e859312eSBram Moolenaar
487e859312eSBram Moolenaar  try
488e859312eSBram Moolenaar    &backspace = 'asdf'
489e859312eSBram Moolenaar  catch /E474:/
490e859312eSBram Moolenaar    n = 299
491e859312eSBram Moolenaar  endtry
492e859312eSBram Moolenaar  assert_equal(299, n)
493e859312eSBram Moolenaar
494e859312eSBram Moolenaar  l = [1]
495e859312eSBram Moolenaar  try
496e859312eSBram Moolenaar    l[3] = 3
497e859312eSBram Moolenaar  catch /E684:/
498e859312eSBram Moolenaar    n = 300
499e859312eSBram Moolenaar  endtry
500e859312eSBram Moolenaar  assert_equal(300, n)
501e859312eSBram Moolenaar
502e859312eSBram Moolenaar  try
503e859312eSBram Moolenaar    unlet g:does_not_exist
504e859312eSBram Moolenaar  catch /E108:/
505e859312eSBram Moolenaar    n = 322
506e859312eSBram Moolenaar  endtry
507e859312eSBram Moolenaar  assert_equal(322, n)
508e859312eSBram Moolenaar
509e859312eSBram Moolenaar  try
5102bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
511e859312eSBram Moolenaar  catch /E721:/
512e859312eSBram Moolenaar    n = 333
513e859312eSBram Moolenaar  endtry
514e859312eSBram Moolenaar  assert_equal(333, n)
515e859312eSBram Moolenaar
516e859312eSBram Moolenaar  try
517e859312eSBram Moolenaar    l = DeletedFunc()
518e859312eSBram Moolenaar  catch /E933:/
519e859312eSBram Moolenaar    n = 344
520e859312eSBram Moolenaar  endtry
521e859312eSBram Moolenaar  assert_equal(344, n)
522d032f34aSBram Moolenaar
523d032f34aSBram Moolenaar  try
524d032f34aSBram Moolenaar    echo len(v:true)
525d032f34aSBram Moolenaar  catch /E701:/
526d032f34aSBram Moolenaar    n = 355
527d032f34aSBram Moolenaar  endtry
528d032f34aSBram Moolenaar  assert_equal(355, n)
529d032f34aSBram Moolenaar
530cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
531d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
532d032f34aSBram Moolenaar  try
533d032f34aSBram Moolenaar    echo P()
534d032f34aSBram Moolenaar  catch /E117:/
535d032f34aSBram Moolenaar    n = 366
536d032f34aSBram Moolenaar  endtry
537d032f34aSBram Moolenaar  assert_equal(366, n)
538d032f34aSBram Moolenaar
539d032f34aSBram Moolenaar  try
540d032f34aSBram Moolenaar    echo g:NoSuchFunc()
541d032f34aSBram Moolenaar  catch /E117:/
542d032f34aSBram Moolenaar    n = 377
543d032f34aSBram Moolenaar  endtry
544d032f34aSBram Moolenaar  assert_equal(377, n)
545d032f34aSBram Moolenaar
546d032f34aSBram Moolenaar  try
547d032f34aSBram Moolenaar    echo g:alist + 4
548d032f34aSBram Moolenaar  catch /E745:/
549d032f34aSBram Moolenaar    n = 388
550d032f34aSBram Moolenaar  endtry
551d032f34aSBram Moolenaar  assert_equal(388, n)
552d032f34aSBram Moolenaar
553d032f34aSBram Moolenaar  try
554d032f34aSBram Moolenaar    echo 4 + g:alist
555d032f34aSBram Moolenaar  catch /E745:/
556d032f34aSBram Moolenaar    n = 399
557d032f34aSBram Moolenaar  endtry
558d032f34aSBram Moolenaar  assert_equal(399, n)
559d032f34aSBram Moolenaar
560d032f34aSBram Moolenaar  try
561d032f34aSBram Moolenaar    echo g:alist.member
562d032f34aSBram Moolenaar  catch /E715:/
563d032f34aSBram Moolenaar    n = 400
564d032f34aSBram Moolenaar  endtry
565d032f34aSBram Moolenaar  assert_equal(400, n)
566d032f34aSBram Moolenaar
567d032f34aSBram Moolenaar  try
568d032f34aSBram Moolenaar    echo d.member
569d032f34aSBram Moolenaar  catch /E716:/
570d032f34aSBram Moolenaar    n = 411
571d032f34aSBram Moolenaar  endtry
572d032f34aSBram Moolenaar  assert_equal(411, n)
573d9d7789bSBram Moolenaar
574d9d7789bSBram Moolenaar  var counter = 0
575d9d7789bSBram Moolenaar  for i in range(4)
576d9d7789bSBram Moolenaar    try
577d9d7789bSBram Moolenaar      eval [][0]
578d9d7789bSBram Moolenaar    catch
579d9d7789bSBram Moolenaar    endtry
580d9d7789bSBram Moolenaar    counter += 1
581d9d7789bSBram Moolenaar  endfor
582d9d7789bSBram Moolenaar  assert_equal(4, counter)
5837e82c5f3SBram Moolenaar
5847e82c5f3SBram Moolenaar  # return in finally after empty catch
5857e82c5f3SBram Moolenaar  def ReturnInFinally(): number
5867e82c5f3SBram Moolenaar    try
5877e82c5f3SBram Moolenaar    finally
5887e82c5f3SBram Moolenaar      return 4
5897e82c5f3SBram Moolenaar    endtry
5907e82c5f3SBram Moolenaar    return 2
5917e82c5f3SBram Moolenaar  enddef
5927e82c5f3SBram Moolenaar  assert_equal(4, ReturnInFinally())
5938ac681a2SBram Moolenaar
5948ac681a2SBram Moolenaar  var lines =<< trim END
5958ac681a2SBram Moolenaar      vim9script
5968ac681a2SBram Moolenaar      try
5978ac681a2SBram Moolenaar        acos('0.5')
5988ac681a2SBram Moolenaar          ->setline(1)
5998ac681a2SBram Moolenaar      catch
6008ac681a2SBram Moolenaar        g:caught = v:exception
6018ac681a2SBram Moolenaar      endtry
6028ac681a2SBram Moolenaar  END
6038ac681a2SBram Moolenaar  CheckScriptSuccess(lines)
6048ac681a2SBram Moolenaar  assert_match('E808: Number or Float required', g:caught)
6058ac681a2SBram Moolenaar  unlet g:caught
606*4197828dSBram Moolenaar
607*4197828dSBram Moolenaar  # missing catch and/or finally
608*4197828dSBram Moolenaar  lines =<< trim END
609*4197828dSBram Moolenaar      vim9script
610*4197828dSBram Moolenaar      try
611*4197828dSBram Moolenaar        echo 'something'
612*4197828dSBram Moolenaar      endtry
613*4197828dSBram Moolenaar  END
614*4197828dSBram Moolenaar  CheckScriptFailure(lines, 'E1032:')
6158a7d6542SBram Moolenaarenddef
6168a7d6542SBram Moolenaar
6173f987b59SBram Moolenaardef Test_try_in_catch()
6183f987b59SBram Moolenaar  var lines =<< trim END
6193f987b59SBram Moolenaar      vim9script
6203f987b59SBram Moolenaar      var seq = []
6213f987b59SBram Moolenaar      def DoIt()
6223f987b59SBram Moolenaar        try
6233f987b59SBram Moolenaar          seq->add('throw 1')
6243f987b59SBram Moolenaar          eval [][0]
6253f987b59SBram Moolenaar          seq->add('notreached')
6263f987b59SBram Moolenaar        catch
6273f987b59SBram Moolenaar          seq->add('catch')
6283f987b59SBram Moolenaar          try
6293f987b59SBram Moolenaar            seq->add('throw 2')
6303f987b59SBram Moolenaar            eval [][0]
6313f987b59SBram Moolenaar            seq->add('notreached')
6323f987b59SBram Moolenaar          catch /nothing/
6333f987b59SBram Moolenaar            seq->add('notreached')
6343f987b59SBram Moolenaar          endtry
6353f987b59SBram Moolenaar          seq->add('done')
6363f987b59SBram Moolenaar        endtry
6373f987b59SBram Moolenaar      enddef
6383f987b59SBram Moolenaar      DoIt()
6393f987b59SBram Moolenaar      assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
6403f987b59SBram Moolenaar  END
6413f987b59SBram Moolenaarenddef
6423f987b59SBram Moolenaar
643d3d8feebSBram Moolenaardef Test_error_in_catch()
644d3d8feebSBram Moolenaar  var lines =<< trim END
645d3d8feebSBram Moolenaar      try
646d3d8feebSBram Moolenaar        eval [][0]
647d3d8feebSBram Moolenaar      catch /E684:/
648d3d8feebSBram Moolenaar        eval [][0]
649d3d8feebSBram Moolenaar      endtry
650d3d8feebSBram Moolenaar  END
651d3d8feebSBram Moolenaar  CheckDefExecFailure(lines, 'E684:', 4)
652d3d8feebSBram Moolenaarenddef
653d3d8feebSBram Moolenaar
6542e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to
6552e34c34bSBram Moolenaardef TryContinueFunc()
6562e34c34bSBram Moolenaar while g:Count < 2
6572e34c34bSBram Moolenaar   g:sequence ..= 't'
6582e34c34bSBram Moolenaar    try
6592e34c34bSBram Moolenaar      echoerr 'Test'
6602e34c34bSBram Moolenaar    catch
6612e34c34bSBram Moolenaar      g:Count += 1
6622e34c34bSBram Moolenaar      g:sequence ..= 'c'
6632e34c34bSBram Moolenaar      continue
6642e34c34bSBram Moolenaar    endtry
6652e34c34bSBram Moolenaar    g:sequence ..= 'e'
6662e34c34bSBram Moolenaar    g:Count += 1
6672e34c34bSBram Moolenaar  endwhile
6682e34c34bSBram Moolenaarenddef
6692e34c34bSBram Moolenaar
6702e34c34bSBram Moolenaardef Test_continue_in_try_in_while()
6712e34c34bSBram Moolenaar  g:Count = 0
6722e34c34bSBram Moolenaar  g:sequence = ''
6732e34c34bSBram Moolenaar  TryContinueFunc()
6742e34c34bSBram Moolenaar  assert_equal('tctc', g:sequence)
6752e34c34bSBram Moolenaar  unlet g:Count
6762e34c34bSBram Moolenaar  unlet g:sequence
6772e34c34bSBram Moolenaarenddef
6782e34c34bSBram Moolenaar
6799cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
6809cb577a6SBram Moolenaar  # return in try block returns normally
6819cb577a6SBram Moolenaar  def ReturnInTry(): string
6829cb577a6SBram Moolenaar    try
6839cb577a6SBram Moolenaar      return '"some message"'
6849cb577a6SBram Moolenaar    catch
6859cb577a6SBram Moolenaar    endtry
6869cb577a6SBram Moolenaar    return 'not reached'
6879cb577a6SBram Moolenaar  enddef
6889cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
6899cb577a6SBram Moolenaarenddef
6909cb577a6SBram Moolenaar
6911430ceebSBram Moolenaardef Test_cnext_works_in_catch()
6921430ceebSBram Moolenaar  var lines =<< trim END
6931430ceebSBram Moolenaar      vim9script
6941430ceebSBram Moolenaar      au BufEnter * eval 0
6951430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
6961430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
6971430ceebSBram Moolenaar      var items = [
6981430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
6991430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
7001430ceebSBram Moolenaar        ]
7011430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
7021430ceebSBram Moolenaar      cwindow
7031430ceebSBram Moolenaar
7041430ceebSBram Moolenaar      def CnextOrCfirst()
7051430ceebSBram Moolenaar        # if cnext fails, cfirst is used
7061430ceebSBram Moolenaar        try
7071430ceebSBram Moolenaar          cnext
7081430ceebSBram Moolenaar        catch
7091430ceebSBram Moolenaar          cfirst
7101430ceebSBram Moolenaar        endtry
7111430ceebSBram Moolenaar      enddef
7121430ceebSBram Moolenaar
7131430ceebSBram Moolenaar      CnextOrCfirst()
7141430ceebSBram Moolenaar      CnextOrCfirst()
7151430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
7161430ceebSBram Moolenaar      qall
7171430ceebSBram Moolenaar  END
7181430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
7191430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
7201430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
7211430ceebSBram Moolenaar
7221430ceebSBram Moolenaar  delete('Xfile1')
7231430ceebSBram Moolenaar  delete('Xfile2')
7241430ceebSBram Moolenaar  delete('XCatchCnext')
7251430ceebSBram Moolenaar  delete('Xresult')
7261430ceebSBram Moolenaarenddef
7271430ceebSBram Moolenaar
7289e1d9e34SBram Moolenaardef Test_throw_skipped()
7299e1d9e34SBram Moolenaar  if 0
7309e1d9e34SBram Moolenaar    throw dontgethere
7319e1d9e34SBram Moolenaar  endif
7329e1d9e34SBram Moolenaarenddef
7339e1d9e34SBram Moolenaar
7348f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
7358f81b22eSBram Moolenaar  var lines =<< trim END
7368f81b22eSBram Moolenaar    vim9script
7378f81b22eSBram Moolenaar    def Func()
7388f81b22eSBram Moolenaar      throw 'error'
7398f81b22eSBram Moolenaar    enddef
7408f81b22eSBram Moolenaar    silent! Func()
7418f81b22eSBram Moolenaar  END
7428f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
7438f81b22eSBram Moolenaar  source XthrowSilenced
7448f81b22eSBram Moolenaar  delete('XthrowSilenced')
7458f81b22eSBram Moolenaarenddef
7468f81b22eSBram Moolenaar
747e859312eSBram Moolenaardef DeletedFunc(): list<any>
748e859312eSBram Moolenaar  return ['delete me']
749e859312eSBram Moolenaarenddef
750e859312eSBram Moolenaardefcompile
751e859312eSBram Moolenaardelfunc DeletedFunc
752e859312eSBram Moolenaar
753257cc5eeSBram Moolenaardef ThrowFromDef()
754a72cfb80SBram Moolenaar  throw "getout" # comment
755257cc5eeSBram Moolenaarenddef
756257cc5eeSBram Moolenaar
757257cc5eeSBram Moolenaarfunc CatchInFunc()
758257cc5eeSBram Moolenaar  try
759257cc5eeSBram Moolenaar    call ThrowFromDef()
760257cc5eeSBram Moolenaar  catch
761257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
762257cc5eeSBram Moolenaar  endtry
763257cc5eeSBram Moolenaarendfunc
764257cc5eeSBram Moolenaar
765257cc5eeSBram Moolenaardef CatchInDef()
766257cc5eeSBram Moolenaar  try
767257cc5eeSBram Moolenaar    ThrowFromDef()
768257cc5eeSBram Moolenaar  catch
769257cc5eeSBram Moolenaar    g:thrown_def = v:exception
770257cc5eeSBram Moolenaar  endtry
771257cc5eeSBram Moolenaarenddef
772257cc5eeSBram Moolenaar
773f575adffSBram Moolenaardef ReturnFinally(): string
774f575adffSBram Moolenaar  try
775f575adffSBram Moolenaar    return 'intry'
776373863edSBram Moolenaar  finall
777f575adffSBram Moolenaar    g:in_finally = 'finally'
778f575adffSBram Moolenaar  endtry
779f575adffSBram Moolenaar  return 'end'
780f575adffSBram Moolenaarenddef
781f575adffSBram Moolenaar
782257cc5eeSBram Moolenaardef Test_try_catch_nested()
783257cc5eeSBram Moolenaar  CatchInFunc()
784257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
785257cc5eeSBram Moolenaar
786257cc5eeSBram Moolenaar  CatchInDef()
787257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
788f575adffSBram Moolenaar
789f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
790f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
791d3d8feebSBram Moolenaar
792d3d8feebSBram Moolenaar  var l = []
793d3d8feebSBram Moolenaar  try
794d3d8feebSBram Moolenaar    l->add('1')
795d3d8feebSBram Moolenaar    throw 'bad'
796d3d8feebSBram Moolenaar    l->add('x')
797d3d8feebSBram Moolenaar  catch /bad/
798d3d8feebSBram Moolenaar    l->add('2')
799d3d8feebSBram Moolenaar    try
800d3d8feebSBram Moolenaar      l->add('3')
801d3d8feebSBram Moolenaar      throw 'one'
802d3d8feebSBram Moolenaar      l->add('x')
803d3d8feebSBram Moolenaar    catch /one/
804d3d8feebSBram Moolenaar      l->add('4')
805d3d8feebSBram Moolenaar      try
806d3d8feebSBram Moolenaar        l->add('5')
807d3d8feebSBram Moolenaar        throw 'more'
808d3d8feebSBram Moolenaar        l->add('x')
809d3d8feebSBram Moolenaar      catch /more/
810d3d8feebSBram Moolenaar        l->add('6')
811d3d8feebSBram Moolenaar      endtry
812d3d8feebSBram Moolenaar    endtry
813d3d8feebSBram Moolenaar  endtry
814d3d8feebSBram Moolenaar  assert_equal(['1', '2', '3', '4', '5', '6'], l)
815834193afSBram Moolenaar
816834193afSBram Moolenaar  l = []
817834193afSBram Moolenaar  try
818834193afSBram Moolenaar    try
819834193afSBram Moolenaar      l->add('1')
820834193afSBram Moolenaar      throw 'foo'
821834193afSBram Moolenaar      l->add('x')
822834193afSBram Moolenaar    catch
823834193afSBram Moolenaar      l->add('2')
824834193afSBram Moolenaar      throw 'bar'
825834193afSBram Moolenaar      l->add('x')
826834193afSBram Moolenaar    finally
827834193afSBram Moolenaar      l->add('3')
828834193afSBram Moolenaar    endtry
829834193afSBram Moolenaar    l->add('x')
830834193afSBram Moolenaar  catch /bar/
831834193afSBram Moolenaar    l->add('4')
832834193afSBram Moolenaar  endtry
833834193afSBram Moolenaar  assert_equal(['1', '2', '3', '4'], l)
834f575adffSBram Moolenaarenddef
835f575adffSBram Moolenaar
8369939f57bSBram Moolenaardef TryOne(): number
8379939f57bSBram Moolenaar  try
8389939f57bSBram Moolenaar    return 0
8399939f57bSBram Moolenaar  catch
8409939f57bSBram Moolenaar  endtry
8419939f57bSBram Moolenaar  return 0
8429939f57bSBram Moolenaarenddef
8439939f57bSBram Moolenaar
8449939f57bSBram Moolenaardef TryTwo(n: number): string
8459939f57bSBram Moolenaar  try
846cfcd011fSBram Moolenaar    var x = {}
8479939f57bSBram Moolenaar  catch
8489939f57bSBram Moolenaar  endtry
8499939f57bSBram Moolenaar  return 'text'
8509939f57bSBram Moolenaarenddef
8519939f57bSBram Moolenaar
8529939f57bSBram Moolenaardef Test_try_catch_twice()
8539939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
8549939f57bSBram Moolenaarenddef
8559939f57bSBram Moolenaar
856f575adffSBram Moolenaardef Test_try_catch_match()
857cfcd011fSBram Moolenaar  var seq = 'a'
858f575adffSBram Moolenaar  try
859f575adffSBram Moolenaar    throw 'something'
860f575adffSBram Moolenaar  catch /nothing/
861f575adffSBram Moolenaar    seq ..= 'x'
862f575adffSBram Moolenaar  catch /some/
863f575adffSBram Moolenaar    seq ..= 'b'
864f575adffSBram Moolenaar  catch /asdf/
865f575adffSBram Moolenaar    seq ..= 'x'
866e8c4abbbSBram Moolenaar  catch ?a\?sdf?
867e8c4abbbSBram Moolenaar    seq ..= 'y'
868f575adffSBram Moolenaar  finally
869f575adffSBram Moolenaar    seq ..= 'c'
870f575adffSBram Moolenaar  endtry
871f575adffSBram Moolenaar  assert_equal('abc', seq)
872257cc5eeSBram Moolenaarenddef
873257cc5eeSBram Moolenaar
874e8c4abbbSBram Moolenaardef Test_try_catch_fails()
875d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
876d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
877d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
878d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
879d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
880d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
881d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
882d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
88313106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
884d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
885585fea7bSBram Moolenaar
886e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
887d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
888e8c4abbbSBram Moolenaarenddef
889e8c4abbbSBram Moolenaar
8907c5b3c03SBram Moolenaardef Try_catch_skipped()
8917c5b3c03SBram Moolenaar  var l = []
8927c5b3c03SBram Moolenaar  try
8937c5b3c03SBram Moolenaar  finally
8947c5b3c03SBram Moolenaar  endtry
8957c5b3c03SBram Moolenaar
8967c5b3c03SBram Moolenaar  if 1
8977c5b3c03SBram Moolenaar  else
8987c5b3c03SBram Moolenaar    try
8997c5b3c03SBram Moolenaar    endtry
9007c5b3c03SBram Moolenaar  endif
9017c5b3c03SBram Moolenaarenddef
9027c5b3c03SBram Moolenaar
9037c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
9047c5b3c03SBram Moolenaardef Test_try_catch_skipped()
9057c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
9067c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
9077c5b3c03SBram Moolenaarenddef
9087c5b3c03SBram Moolenaar
9097c5b3c03SBram Moolenaar
9107c5b3c03SBram Moolenaar
911006ad48bSBram Moolenaardef Test_throw_vimscript()
912f5be8cdbSBram Moolenaar  # only checks line continuation
913cfcd011fSBram Moolenaar  var lines =<< trim END
914006ad48bSBram Moolenaar      vim9script
915006ad48bSBram Moolenaar      try
916006ad48bSBram Moolenaar        throw 'one'
917006ad48bSBram Moolenaar              .. 'two'
918006ad48bSBram Moolenaar      catch
919006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
920006ad48bSBram Moolenaar      endtry
921006ad48bSBram Moolenaar  END
922006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
9231e021e63SBram Moolenaar
9241e021e63SBram Moolenaar  lines =<< trim END
9251e021e63SBram Moolenaar    vim9script
926352134bbSBram Moolenaar    @r = ''
9271e021e63SBram Moolenaar    def Func()
9281e021e63SBram Moolenaar      throw @r
9291e021e63SBram Moolenaar    enddef
9301e021e63SBram Moolenaar    var result = ''
9311e021e63SBram Moolenaar    try
9321e021e63SBram Moolenaar      Func()
9331e021e63SBram Moolenaar    catch /E1129:/
9341e021e63SBram Moolenaar      result = 'caught'
9351e021e63SBram Moolenaar    endtry
9361e021e63SBram Moolenaar    assert_equal('caught', result)
9371e021e63SBram Moolenaar  END
9381e021e63SBram Moolenaar  CheckScriptSuccess(lines)
939006ad48bSBram Moolenaarenddef
940006ad48bSBram Moolenaar
941ed677f55SBram Moolenaardef Test_error_in_nested_function()
94203dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
943cfcd011fSBram Moolenaar  var lines =<< trim END
944ed677f55SBram Moolenaar      vim9script
945ed677f55SBram Moolenaar      def Func()
946ed677f55SBram Moolenaar        Error()
947ed677f55SBram Moolenaar        g:test_var = 1
948ed677f55SBram Moolenaar      enddef
949ed677f55SBram Moolenaar      func Error() abort
950ed677f55SBram Moolenaar        eval [][0]
951ed677f55SBram Moolenaar      endfunc
952ed677f55SBram Moolenaar      Func()
953ed677f55SBram Moolenaar  END
954ed677f55SBram Moolenaar  g:test_var = 0
955ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
956ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
957ed677f55SBram Moolenaarenddef
958ed677f55SBram Moolenaar
959227c58a4SBram Moolenaardef Test_abort_after_error()
960227c58a4SBram Moolenaar  var lines =<< trim END
961227c58a4SBram Moolenaar      vim9script
962227c58a4SBram Moolenaar      while true
963227c58a4SBram Moolenaar        echo notfound
964227c58a4SBram Moolenaar      endwhile
965227c58a4SBram Moolenaar      g:gotthere = true
966227c58a4SBram Moolenaar  END
967227c58a4SBram Moolenaar  g:gotthere = false
968227c58a4SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
969227c58a4SBram Moolenaar  assert_false(g:gotthere)
970227c58a4SBram Moolenaar  unlet g:gotthere
971227c58a4SBram Moolenaarenddef
972227c58a4SBram Moolenaar
97337c83711SBram Moolenaardef Test_cexpr_vimscript()
974f5be8cdbSBram Moolenaar  # only checks line continuation
97537c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
976cfcd011fSBram Moolenaar  var lines =<< trim END
97737c83711SBram Moolenaar      vim9script
97837c83711SBram Moolenaar      cexpr 'File'
97937c83711SBram Moolenaar                .. ' someFile' ..
98037c83711SBram Moolenaar                   ' line 19'
98137c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
98237c83711SBram Moolenaar  END
98337c83711SBram Moolenaar  CheckScriptSuccess(lines)
98437c83711SBram Moolenaar  set errorformat&
98537c83711SBram Moolenaarenddef
98637c83711SBram Moolenaar
987c9edd6b5SBram Moolenaardef Test_statusline_syntax()
988c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
989cfcd011fSBram Moolenaar  var lines =<< trim END
990c9edd6b5SBram Moolenaar      vim9script
991c9edd6b5SBram Moolenaar      func g:Status()
992c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
993c9edd6b5SBram Moolenaar      endfunc
994c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
995c9edd6b5SBram Moolenaar      redrawstatus
996c9edd6b5SBram Moolenaar      set laststatus statusline=
997c9edd6b5SBram Moolenaar  END
998c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
999c9edd6b5SBram Moolenaarenddef
1000c9edd6b5SBram Moolenaar
1001b209750bSBram Moolenaardef Test_list_vimscript()
1002b209750bSBram Moolenaar  # checks line continuation and comments
1003cfcd011fSBram Moolenaar  var lines =<< trim END
1004b209750bSBram Moolenaar      vim9script
1005cfcd011fSBram Moolenaar      var mylist = [
1006b209750bSBram Moolenaar            'one',
1007b209750bSBram Moolenaar            # comment
1008b209750bSBram Moolenaar            'two', # empty line follows
1009b209750bSBram Moolenaar
1010b209750bSBram Moolenaar            'three',
1011b209750bSBram Moolenaar            ]
1012b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1013b209750bSBram Moolenaar  END
1014b209750bSBram Moolenaar  CheckScriptSuccess(lines)
101566250c93SBram Moolenaar
101666250c93SBram Moolenaar  # check all lines from heredoc are kept
101766250c93SBram Moolenaar  lines =<< trim END
101866250c93SBram Moolenaar      # comment 1
101966250c93SBram Moolenaar      two
102066250c93SBram Moolenaar      # comment 3
102166250c93SBram Moolenaar
102266250c93SBram Moolenaar      five
102366250c93SBram Moolenaar      # comment 6
102466250c93SBram Moolenaar  END
102566250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
10264bce26bbSBram Moolenaar
10274bce26bbSBram Moolenaar  lines =<< trim END
10284bce26bbSBram Moolenaar    [{
10294bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
10304bce26bbSBram Moolenaar  END
10314bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1032b209750bSBram Moolenaarenddef
1033b209750bSBram Moolenaar
10342a1381c3SBram Moolenaarif has('channel')
103540ee466cSBram Moolenaar  let someJob = test_null_job()
103640ee466cSBram Moolenaar
103740ee466cSBram Moolenaar  def FuncWithError()
103840ee466cSBram Moolenaar    echomsg g:someJob
103940ee466cSBram Moolenaar  enddef
104040ee466cSBram Moolenaar
104140ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
104240ee466cSBram Moolenaar    try
104340ee466cSBram Moolenaar      call FuncWithError()
104440ee466cSBram Moolenaar    catch
104540ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
104640ee466cSBram Moolenaar    endtry
104740ee466cSBram Moolenaar  endfunc
10482a1381c3SBram Moolenaarendif
104940ee466cSBram Moolenaar
10508a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
10518a7d6542SBram Moolenaar  vim9script
1052cfcd011fSBram Moolenaar  var name: string = 'bob'
10538a7d6542SBram Moolenaar  def Concat(arg: string): string
10548a7d6542SBram Moolenaar    return name .. arg
10558a7d6542SBram Moolenaar  enddef
1056227a69deSBram Moolenaar  g:result = Concat('bie')
1057227a69deSBram Moolenaar  g:localname = name
10588a7d6542SBram Moolenaar
10598a7d6542SBram Moolenaar  export const CONST = 1234
1060cfcd011fSBram Moolenaar  export var exported = 9876
1061cfcd011fSBram Moolenaar  export var exp_name = 'John'
10628a7d6542SBram Moolenaar  export def Exported(): string
10638a7d6542SBram Moolenaar    return 'Exported'
10648a7d6542SBram Moolenaar  enddef
10650f2a5cc6SBram Moolenaar  export final theList = [1]
10668a7d6542SBram MoolenaarEND
10678a7d6542SBram Moolenaar
1068b3ca9824SBram Moolenaardef Undo_export_script_lines()
1069b3ca9824SBram Moolenaar  unlet g:result
1070b3ca9824SBram Moolenaar  unlet g:localname
1071b3ca9824SBram Moolenaarenddef
1072b3ca9824SBram Moolenaar
10735269bd2aSBram Moolenaardef Test_vim9_import_export()
1074cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
10758a7d6542SBram Moolenaar    vim9script
10768a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
10778a7d6542SBram Moolenaar    g:imported = exported
10786e587dcbSBram Moolenaar    exported += 3
10796e587dcbSBram Moolenaar    g:imported_added = exported
10808a7d6542SBram Moolenaar    g:imported_func = Exported()
10816e587dcbSBram Moolenaar
108240f4f7a4SBram Moolenaar    def GetExported(): string
1083e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
108440f4f7a4SBram Moolenaar      return local_dict.ref()
108540f4f7a4SBram Moolenaar    enddef
108640f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
108740f4f7a4SBram Moolenaar
10886e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
10896e587dcbSBram Moolenaar    g:imported_name = exp_name
10906e587dcbSBram Moolenaar    exp_name ..= ' Doe'
10916e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
10925381c7a1SBram Moolenaar    g:imported_later = exported
10930f2a5cc6SBram Moolenaar
10940f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
10950f2a5cc6SBram Moolenaar    theList->add(2)
10960f2a5cc6SBram Moolenaar    assert_equal([1, 2], theList)
10978a7d6542SBram Moolenaar  END
10988a7d6542SBram Moolenaar
10998a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
11008a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
11018a7d6542SBram Moolenaar
11028a7d6542SBram Moolenaar  source Ximport.vim
11038a7d6542SBram Moolenaar
11048a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
11058a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
11068a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
11076e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
11085381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
11098a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
111040f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
11116e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
11126e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
11138a7d6542SBram Moolenaar  assert_false(exists('g:name'))
11148a7d6542SBram Moolenaar
1115b3ca9824SBram Moolenaar  Undo_export_script_lines()
11168a7d6542SBram Moolenaar  unlet g:imported
11176e587dcbSBram Moolenaar  unlet g:imported_added
11185381c7a1SBram Moolenaar  unlet g:imported_later
11198a7d6542SBram Moolenaar  unlet g:imported_func
11206e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
11218a7d6542SBram Moolenaar  delete('Ximport.vim')
1122f2d5c240SBram Moolenaar
11231c991144SBram Moolenaar  # similar, with line breaks
1124cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
11251c991144SBram Moolenaar    vim9script
11261c991144SBram Moolenaar    import {
11271c991144SBram Moolenaar        exported,
11281c991144SBram Moolenaar        Exported,
11291c991144SBram Moolenaar        }
11301c991144SBram Moolenaar        from
11311c991144SBram Moolenaar        './Xexport.vim'
11321c991144SBram Moolenaar    g:imported = exported
11331c991144SBram Moolenaar    exported += 5
11341c991144SBram Moolenaar    g:imported_added = exported
11351c991144SBram Moolenaar    g:imported_func = Exported()
11361c991144SBram Moolenaar  END
11371c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
11381c991144SBram Moolenaar  source Ximport_lbr.vim
11391c991144SBram Moolenaar
11401c991144SBram Moolenaar  assert_equal(9876, g:imported)
11411c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
11421c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
11431c991144SBram Moolenaar
11441c991144SBram Moolenaar  # exported script not sourced again
11451c991144SBram Moolenaar  assert_false(exists('g:result'))
11461c991144SBram Moolenaar  unlet g:imported
11471c991144SBram Moolenaar  unlet g:imported_added
11481c991144SBram Moolenaar  unlet g:imported_func
11491c991144SBram Moolenaar  delete('Ximport_lbr.vim')
11501c991144SBram Moolenaar
11511c991144SBram Moolenaar  # import inside :def function
1152cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
11535381c7a1SBram Moolenaar    vim9script
11545381c7a1SBram Moolenaar    def ImportInDef()
11555381c7a1SBram Moolenaar      import exported from './Xexport.vim'
11565381c7a1SBram Moolenaar      g:imported = exported
11575381c7a1SBram Moolenaar      exported += 7
11585381c7a1SBram Moolenaar      g:imported_added = exported
11595381c7a1SBram Moolenaar    enddef
11605381c7a1SBram Moolenaar    ImportInDef()
11615381c7a1SBram Moolenaar  END
11625381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
11635381c7a1SBram Moolenaar  source Ximport2.vim
1164f5be8cdbSBram Moolenaar  # TODO: this should be 9879
11655381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
11665381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
11675381c7a1SBram Moolenaar  unlet g:imported
11685381c7a1SBram Moolenaar  unlet g:imported_added
11695381c7a1SBram Moolenaar  delete('Ximport2.vim')
11705381c7a1SBram Moolenaar
1171cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1172f2d5c240SBram Moolenaar    vim9script
1173f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1174f2d5c240SBram Moolenaar    def UseExport()
1175cb4e80faSBram Moolenaar      g:imported_def = Export.exported
1176f2d5c240SBram Moolenaar    enddef
1177cb4e80faSBram Moolenaar    g:imported_script = Export.exported
1178cb4e80faSBram Moolenaar    assert_equal(1, exists('Export.exported'))
1179cb4e80faSBram Moolenaar    assert_equal(0, exists('Export.notexported'))
1180f2d5c240SBram Moolenaar    UseExport()
1181f2d5c240SBram Moolenaar  END
1182f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1183f2d5c240SBram Moolenaar  source Ximport.vim
1184cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_def)
1185cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_script)
1186f2d5c240SBram Moolenaar
1187cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1188599c89c8SBram Moolenaar    vim9script
1189599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1190599c89c8SBram Moolenaar    def Func()
1191cfcd011fSBram Moolenaar      var dummy = 1
1192cfcd011fSBram Moolenaar      var imported = Export + dummy
1193599c89c8SBram Moolenaar    enddef
1194822ba247SBram Moolenaar    defcompile
1195599c89c8SBram Moolenaar  END
1196599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
119744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1198599c89c8SBram Moolenaar
1199cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1200599c89c8SBram Moolenaar    vim9script
1201599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1202599c89c8SBram Moolenaar    def Func()
1203cfcd011fSBram Moolenaar      var imported = Export . exported
1204599c89c8SBram Moolenaar    enddef
1205822ba247SBram Moolenaar    defcompile
1206599c89c8SBram Moolenaar  END
1207599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
120844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1209599c89c8SBram Moolenaar
1210a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1211a6294955SBram Moolenaar    vim9script
1212a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1213a6294955SBram Moolenaar    var some = 'other'
1214a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1215a6294955SBram Moolenaar    defcompile
1216a6294955SBram Moolenaar  END
1217a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1218a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1219a6294955SBram Moolenaar
1220cb4e80faSBram Moolenaar  var import_star_as_lines_script_no_dot =<< trim END
1221cb4e80faSBram Moolenaar    vim9script
1222cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1223cb4e80faSBram Moolenaar    g:imported_script = Export exported
1224cb4e80faSBram Moolenaar  END
1225cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
1226cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1029:')
1227cb4e80faSBram Moolenaar
1228cb4e80faSBram Moolenaar  var import_star_as_lines_script_space_after_dot =<< trim END
1229cb4e80faSBram Moolenaar    vim9script
1230cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1231cb4e80faSBram Moolenaar    g:imported_script = Export. exported
1232cb4e80faSBram Moolenaar  END
1233cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1234cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1235cb4e80faSBram Moolenaar
1236cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1237599c89c8SBram Moolenaar    vim9script
1238599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1239599c89c8SBram Moolenaar    def Func()
1240cfcd011fSBram Moolenaar      var imported = Export.
1241599c89c8SBram Moolenaar    enddef
1242822ba247SBram Moolenaar    defcompile
1243599c89c8SBram Moolenaar  END
1244599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
124544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1246599c89c8SBram Moolenaar
1247cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
12481c991144SBram Moolenaar    vim9script
12491c991144SBram Moolenaar    import *
12501c991144SBram Moolenaar        as Export
12511c991144SBram Moolenaar        from
12521c991144SBram Moolenaar        './Xexport.vim'
12531c991144SBram Moolenaar    def UseExport()
12541c991144SBram Moolenaar      g:imported = Export.exported
12551c991144SBram Moolenaar    enddef
12561c991144SBram Moolenaar    UseExport()
12571c991144SBram Moolenaar  END
12581c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
12591c991144SBram Moolenaar  source Ximport.vim
12601c991144SBram Moolenaar  assert_equal(9883, g:imported)
12611c991144SBram Moolenaar
1262cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1263f2d5c240SBram Moolenaar    vim9script
1264f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1265f2d5c240SBram Moolenaar  END
1266f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
126744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1268f2d5c240SBram Moolenaar
1269f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1270cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1271fa29c8abSBram Moolenaar    vim9script
1272fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1273fa29c8abSBram Moolenaar  END
1274fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
127544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1276fa29c8abSBram Moolenaar
1277f5be8cdbSBram Moolenaar  # try to import something that is already defined
1278cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
12795269bd2aSBram Moolenaar    vim9script
1280cfcd011fSBram Moolenaar    var exported = 'something'
12815269bd2aSBram Moolenaar    import exported from './Xexport.vim'
12825269bd2aSBram Moolenaar  END
12835269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1284057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
12855269bd2aSBram Moolenaar
1286f5be8cdbSBram Moolenaar  # try to import something that is already defined
12875269bd2aSBram Moolenaar  import_already_defined =<< trim END
12885269bd2aSBram Moolenaar    vim9script
1289cfcd011fSBram Moolenaar    var exported = 'something'
12905269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
12915269bd2aSBram Moolenaar  END
12925269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1293057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
12945269bd2aSBram Moolenaar
1295f5be8cdbSBram Moolenaar  # try to import something that is already defined
12965269bd2aSBram Moolenaar  import_already_defined =<< trim END
12975269bd2aSBram Moolenaar    vim9script
1298cfcd011fSBram Moolenaar    var exported = 'something'
12995269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
13005269bd2aSBram Moolenaar  END
13015269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1302057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13035269bd2aSBram Moolenaar
1304918a4249SBram Moolenaar  # try changing an imported const
1305918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1306918a4249SBram Moolenaar    vim9script
1307918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1308918a4249SBram Moolenaar    def Assign()
1309918a4249SBram Moolenaar      CONST = 987
1310918a4249SBram Moolenaar    enddef
1311918a4249SBram Moolenaar    defcompile
1312918a4249SBram Moolenaar  END
1313918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1314918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1315918a4249SBram Moolenaar
13160f2a5cc6SBram Moolenaar  # try changing an imported final
13170f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
13180f2a5cc6SBram Moolenaar    vim9script
13190f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
13200f2a5cc6SBram Moolenaar    def Assign()
13210f2a5cc6SBram Moolenaar      theList = [2]
13220f2a5cc6SBram Moolenaar    enddef
13230f2a5cc6SBram Moolenaar    defcompile
13240f2a5cc6SBram Moolenaar  END
13250f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
13260f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
13270f2a5cc6SBram Moolenaar
1328f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1329cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1330fa29c8abSBram Moolenaar    vim9script
1331fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1332fa29c8abSBram Moolenaar  END
1333fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
133444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1335fa29c8abSBram Moolenaar
1336cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1337fa29c8abSBram Moolenaar    vim9script
1338fa29c8abSBram Moolenaar    import name './Xexport.vim'
1339fa29c8abSBram Moolenaar  END
1340fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
134144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1342fa29c8abSBram Moolenaar
1343cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1344fa29c8abSBram Moolenaar    vim9script
1345fa29c8abSBram Moolenaar    import name from Xexport.vim
1346fa29c8abSBram Moolenaar  END
1347fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
134844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1349fa29c8abSBram Moolenaar
1350cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1351fa29c8abSBram Moolenaar    vim9script
1352fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1353fa29c8abSBram Moolenaar  END
1354fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
135544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1356fa29c8abSBram Moolenaar
1357cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1358fa29c8abSBram Moolenaar    vim9script
1359fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1360fa29c8abSBram Moolenaar  END
13615269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
136244d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1363fa29c8abSBram Moolenaar
1364f2d5c240SBram Moolenaar  delete('Ximport.vim')
13655269bd2aSBram Moolenaar  delete('Ximport3.vim')
13668a7d6542SBram Moolenaar  delete('Xexport.vim')
13678a7d6542SBram Moolenaar
1368f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
13693e191694SBram Moolenaar  # Flags added or removed are also applied to the restored value.
13703e191694SBram Moolenaar  set cpo=abcd
1371cfcd011fSBram Moolenaar  var lines =<< trim END
1372750802b5SBram Moolenaar    vim9script
1373750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
13743e191694SBram Moolenaar    set cpo+=f
13753e191694SBram Moolenaar    set cpo-=c
13763e191694SBram Moolenaar    g:cpo_after_vim9script = &cpo
1377750802b5SBram Moolenaar  END
1378750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1379750802b5SBram Moolenaar  source Xvim9_script
13803e191694SBram Moolenaar  assert_equal('fabd', &cpo)
1381750802b5SBram Moolenaar  set cpo&vim
1382750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
13833e191694SBram Moolenaar  var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
13843e191694SBram Moolenaar  assert_equal(newcpo, g:cpo_after_vim9script)
13853e191694SBram Moolenaar
1386750802b5SBram Moolenaar  delete('Xvim9_script')
1387750802b5SBram Moolenaarenddef
1388750802b5SBram Moolenaar
13890a84284eSBram Moolenaardef Test_import_as()
13900a84284eSBram Moolenaar  var export_lines =<< trim END
13910a84284eSBram Moolenaar    vim9script
13920a84284eSBram Moolenaar    export var one = 1
13930a84284eSBram Moolenaar    export var yes = 'yes'
13940a84284eSBram Moolenaar  END
13950a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
13960a84284eSBram Moolenaar
13970a84284eSBram Moolenaar  var import_lines =<< trim END
13980a84284eSBram Moolenaar    vim9script
13996c7cc347SBram Moolenaar    var one = 'notused'
14006c7cc347SBram Moolenaar    var yes = 777
14010a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
14020a84284eSBram Moolenaar    assert_equal(1, thatOne)
14030a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
14040a84284eSBram Moolenaar    assert_equal('yes', yesYes)
14050a84284eSBram Moolenaar  END
14060a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
14070a84284eSBram Moolenaar
14080a84284eSBram Moolenaar  import_lines =<< trim END
14090a84284eSBram Moolenaar    vim9script
14100a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
14110a84284eSBram Moolenaar    assert_equal(1, thatOne)
14120a84284eSBram Moolenaar    assert_equal('yes', yesYes)
14130a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
14140a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
14150a84284eSBram Moolenaar  END
14160a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
14170a84284eSBram Moolenaar
14180a84284eSBram Moolenaar  delete('XexportAs')
14190a84284eSBram Moolenaarenddef
14200a84284eSBram Moolenaar
1421803af686SBram Moolenaarfunc g:Trigger()
1422803af686SBram Moolenaar  source Ximport.vim
1423803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1424803af686SBram Moolenaarendfunc
1425803af686SBram Moolenaar
1426803af686SBram Moolenaardef Test_import_export_expr_map()
1427803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1428cfcd011fSBram Moolenaar  var export_lines =<< trim END
1429803af686SBram Moolenaar    vim9script
1430803af686SBram Moolenaar    export def That(): string
1431803af686SBram Moolenaar      return 'yes'
1432803af686SBram Moolenaar    enddef
1433803af686SBram Moolenaar  END
1434803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1435803af686SBram Moolenaar
1436cfcd011fSBram Moolenaar  var import_lines =<< trim END
1437803af686SBram Moolenaar    vim9script
1438803af686SBram Moolenaar    import That from './Xexport_that.vim'
1439803af686SBram Moolenaar    assert_equal('yes', That())
1440803af686SBram Moolenaar  END
1441803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1442803af686SBram Moolenaar
1443803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1444803af686SBram Moolenaar  feedkeys('trigger', "xt")
1445803af686SBram Moolenaar
1446730b2483SBram Moolenaar  delete('Xexport_that.vim')
1447803af686SBram Moolenaar  delete('Ximport.vim')
1448803af686SBram Moolenaar  nunmap trigger
1449803af686SBram Moolenaarenddef
1450803af686SBram Moolenaar
14518e1986e3SBram Moolenaardef Test_import_in_filetype()
14528e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
14538e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1454cfcd011fSBram Moolenaar  var export_lines =<< trim END
14558e1986e3SBram Moolenaar    vim9script
1456cfcd011fSBram Moolenaar    export var That = 'yes'
14578e1986e3SBram Moolenaar  END
1458730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
14598e1986e3SBram Moolenaar
1460cfcd011fSBram Moolenaar  var import_lines =<< trim END
14618e1986e3SBram Moolenaar    vim9script
1462730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
14638e1986e3SBram Moolenaar    assert_equal('yes', That)
14648e1986e3SBram Moolenaar    g:did_load_mytpe = 1
14658e1986e3SBram Moolenaar  END
14668e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
14678e1986e3SBram Moolenaar
1468cfcd011fSBram Moolenaar  var save_rtp = &rtp
14698e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
14708e1986e3SBram Moolenaar
14718e1986e3SBram Moolenaar  filetype plugin on
14728e1986e3SBram Moolenaar  copen
14738e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
14748e1986e3SBram Moolenaar
14758e1986e3SBram Moolenaar  quit!
1476730b2483SBram Moolenaar  delete('Xexport_ft.vim')
14778e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
14788e1986e3SBram Moolenaar  &rtp = save_rtp
14798e1986e3SBram Moolenaarenddef
14808e1986e3SBram Moolenaar
1481efa94447SBram Moolenaardef Test_use_import_in_mapping()
1482cfcd011fSBram Moolenaar  var lines =<< trim END
1483efa94447SBram Moolenaar      vim9script
1484efa94447SBram Moolenaar      export def Funcx()
1485efa94447SBram Moolenaar        g:result = 42
1486efa94447SBram Moolenaar      enddef
1487efa94447SBram Moolenaar  END
1488efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1489efa94447SBram Moolenaar  lines =<< trim END
1490efa94447SBram Moolenaar      vim9script
1491efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1492b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1493efa94447SBram Moolenaar  END
1494efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1495efa94447SBram Moolenaar
1496efa94447SBram Moolenaar  source Xmapscript.vim
1497b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1498efa94447SBram Moolenaar  assert_equal(42, g:result)
1499efa94447SBram Moolenaar
1500efa94447SBram Moolenaar  unlet g:result
1501efa94447SBram Moolenaar  delete('XsomeExport.vim')
1502efa94447SBram Moolenaar  delete('Xmapscript.vim')
1503b3ca9824SBram Moolenaar  nunmap <F3>
1504efa94447SBram Moolenaarenddef
1505efa94447SBram Moolenaar
1506d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1507d3f8a9eeSBram Moolenaar  var lines =<< trim END
1508d3f8a9eeSBram Moolenaar    if has(g:feature)
1509d3f8a9eeSBram Moolenaar      " legacy script
1510d3f8a9eeSBram Moolenaar      let g:legacy = 1
1511d3f8a9eeSBram Moolenaar      finish
1512d3f8a9eeSBram Moolenaar    endif
1513d3f8a9eeSBram Moolenaar    vim9script
1514d3f8a9eeSBram Moolenaar    g:legacy = 0
1515d3f8a9eeSBram Moolenaar  END
1516d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1517d3f8a9eeSBram Moolenaar  g:legacy = -1
1518d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1519d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1520d3f8a9eeSBram Moolenaar
1521d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1522d3f8a9eeSBram Moolenaar  g:legacy = -1
1523d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1524d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1525d3f8a9eeSBram Moolenaarenddef
1526d3f8a9eeSBram Moolenaar
1527750802b5SBram Moolenaardef Test_vim9script_fails()
15288a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
15298a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1530cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
15319721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1532cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1533750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1534750802b5SBram Moolenaar
1535cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1536c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1537c785b9a7SBram Moolenaar
1538e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1539e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
15408a7d6542SBram Moolenaarenddef
15418a7d6542SBram Moolenaar
1542f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1543101f4810SBram Moolenaar  CheckRunVimInTerminal
1544101f4810SBram Moolenaar
15459bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1546c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
15479bb3eb3eSBram Moolenaarendfunc
15489bb3eb3eSBram Moolenaar
1549c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1550cfcd011fSBram Moolenaar  var export =<< trim END
1551101f4810SBram Moolenaar    vim9script
1552101f4810SBram Moolenaar    export def Foo(): number
1553101f4810SBram Moolenaar        return 0
1554101f4810SBram Moolenaar    enddef
1555101f4810SBram Moolenaar  END
1556730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1557101f4810SBram Moolenaar
1558e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
15599bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
15602949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1561101f4810SBram Moolenaar
1562730b2483SBram Moolenaar  delete('XexportCmd.vim')
15639bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
15649bb3eb3eSBram Moolenaarenddef
1565101f4810SBram Moolenaar
15662b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
15672b32700dSBram Moolenaar  var lines =<< trim END
1568a6294955SBram Moolenaar    vim9script
1569a6294955SBram Moolenaar    export var exported = 'thexport'
1570a6294955SBram Moolenaar  END
1571a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1572a6294955SBram Moolenaar  lines =<< trim END
15732b32700dSBram Moolenaar    vim9script noclear
15742b32700dSBram Moolenaar    g:loadCount += 1
15752b32700dSBram Moolenaar    var s:reloaded = 'init'
1576a6294955SBram Moolenaar    import exported from './XExportReload'
15772b32700dSBram Moolenaar
15782b32700dSBram Moolenaar    def Again(): string
15792b32700dSBram Moolenaar      return 'again'
15802b32700dSBram Moolenaar    enddef
15812b32700dSBram Moolenaar
15822b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
15832b32700dSBram Moolenaar    var s:loaded = true
15842b32700dSBram Moolenaar
15852b32700dSBram Moolenaar    var s:notReloaded = 'yes'
15862b32700dSBram Moolenaar    s:reloaded = 'first'
15872b32700dSBram Moolenaar    def g:Values(): list<string>
1588a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
15892b32700dSBram Moolenaar    enddef
15902b32700dSBram Moolenaar
15912b32700dSBram Moolenaar    def Once(): string
15922b32700dSBram Moolenaar      return 'once'
15932b32700dSBram Moolenaar    enddef
15942b32700dSBram Moolenaar  END
15952b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
15962b32700dSBram Moolenaar  g:loadCount = 0
15972b32700dSBram Moolenaar  source XReloaded
15982b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1599a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
16002b32700dSBram Moolenaar  source XReloaded
16012b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1602a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
16032b32700dSBram Moolenaar  source XReloaded
16042b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1605a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
16062b32700dSBram Moolenaar
160748e11c10SBram Moolenaar  delete('XReloaded')
1608a6294955SBram Moolenaar  delete('XExportReload')
16092b32700dSBram Moolenaar  delfunc g:Values
16102b32700dSBram Moolenaar  unlet g:loadCount
1611577dc93dSBram Moolenaar
1612577dc93dSBram Moolenaar  lines =<< trim END
1613577dc93dSBram Moolenaar      vim9script
1614577dc93dSBram Moolenaar      def Inner()
1615577dc93dSBram Moolenaar      enddef
1616577dc93dSBram Moolenaar  END
1617577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1618577dc93dSBram Moolenaar  source XreloadScript.vim
1619577dc93dSBram Moolenaar
1620577dc93dSBram Moolenaar  lines =<< trim END
1621577dc93dSBram Moolenaar      vim9script
1622577dc93dSBram Moolenaar      def Outer()
1623577dc93dSBram Moolenaar        def Inner()
1624577dc93dSBram Moolenaar        enddef
1625577dc93dSBram Moolenaar      enddef
1626577dc93dSBram Moolenaar      defcompile
1627577dc93dSBram Moolenaar  END
1628577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1629577dc93dSBram Moolenaar  source XreloadScript.vim
1630577dc93dSBram Moolenaar
1631577dc93dSBram Moolenaar  delete('XreloadScript.vim')
16322b32700dSBram Moolenaarenddef
16332b32700dSBram Moolenaar
16344c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1635cfcd011fSBram Moolenaar  var lines =<< trim END
16368a7d6542SBram Moolenaar    vim9script
16378a7d6542SBram Moolenaar    const var = ''
1638cfcd011fSBram Moolenaar    var valone = 1234
16398a7d6542SBram Moolenaar    def MyFunc(arg: string)
16408a7d6542SBram Moolenaar       valone = 5678
16418a7d6542SBram Moolenaar    enddef
16428a7d6542SBram Moolenaar  END
1643cfcd011fSBram Moolenaar  var morelines =<< trim END
1644cfcd011fSBram Moolenaar    var valtwo = 222
16458a7d6542SBram Moolenaar    export def GetValtwo(): number
16468a7d6542SBram Moolenaar      return valtwo
16478a7d6542SBram Moolenaar    enddef
16488a7d6542SBram Moolenaar  END
164903afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
16508a7d6542SBram Moolenaar  source Xreload.vim
16518a7d6542SBram Moolenaar  source Xreload.vim
16528a7d6542SBram Moolenaar  source Xreload.vim
16538a7d6542SBram Moolenaar
1654cfcd011fSBram Moolenaar  var testlines =<< trim END
16558a7d6542SBram Moolenaar    vim9script
16568a7d6542SBram Moolenaar    def TheFunc()
16578a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
16588a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
16598a7d6542SBram Moolenaar    enddef
16608a7d6542SBram Moolenaar    TheFunc()
16618a7d6542SBram Moolenaar  END
16628a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
16638a7d6542SBram Moolenaar  source Ximport.vim
16648a7d6542SBram Moolenaar
1665f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1666f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
16678a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
16688a7d6542SBram Moolenaar  source Ximport.vim
16698a7d6542SBram Moolenaar
1670f5be8cdbSBram Moolenaar  # cannot declare a var twice
16718a7d6542SBram Moolenaar  lines =<< trim END
16728a7d6542SBram Moolenaar    vim9script
1673cfcd011fSBram Moolenaar    var valone = 1234
1674cfcd011fSBram Moolenaar    var valone = 5678
16758a7d6542SBram Moolenaar  END
16768a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
167744d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
16788a7d6542SBram Moolenaar
16798a7d6542SBram Moolenaar  delete('Xreload.vim')
16808a7d6542SBram Moolenaar  delete('Ximport.vim')
16818a7d6542SBram Moolenaarenddef
16828a7d6542SBram Moolenaar
168307a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
168407a65d26SBram Moolenaar" compiled function using that variable must fail.
168507a65d26SBram Moolenaardef Test_script_reload_change_type()
168607a65d26SBram Moolenaar  var lines =<< trim END
168707a65d26SBram Moolenaar    vim9script noclear
168807a65d26SBram Moolenaar    var str = 'string'
168907a65d26SBram Moolenaar    def g:GetStr(): string
169007a65d26SBram Moolenaar      return str .. 'xxx'
169107a65d26SBram Moolenaar    enddef
169207a65d26SBram Moolenaar  END
169307a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
169407a65d26SBram Moolenaar  source Xreload.vim
169507a65d26SBram Moolenaar  echo g:GetStr()
169607a65d26SBram Moolenaar
169707a65d26SBram Moolenaar  lines =<< trim END
169807a65d26SBram Moolenaar    vim9script noclear
169907a65d26SBram Moolenaar    var str = 1234
170007a65d26SBram Moolenaar  END
170107a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
170207a65d26SBram Moolenaar  source Xreload.vim
170307a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
170407a65d26SBram Moolenaar
170507a65d26SBram Moolenaar  delfunc g:GetStr
170607a65d26SBram Moolenaar  delete('Xreload.vim')
170707a65d26SBram Moolenaarenddef
170807a65d26SBram Moolenaar
1709c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled
1710c970e422SBram Moolenaarcommand CallFunc echo 'nop'
1711c970e422SBram Moolenaar
1712c970e422SBram Moolenaardef Test_script_reload_from_function()
1713c970e422SBram Moolenaar  var lines =<< trim END
1714c970e422SBram Moolenaar      vim9script
1715c970e422SBram Moolenaar
1716c970e422SBram Moolenaar      if exists('g:loaded')
1717c970e422SBram Moolenaar        finish
1718c970e422SBram Moolenaar      endif
1719c970e422SBram Moolenaar      g:loaded = 1
1720c970e422SBram Moolenaar      delcommand CallFunc
1721c970e422SBram Moolenaar      command CallFunc Func()
1722c970e422SBram Moolenaar      def Func()
1723a4c81beaSBram Moolenaar        so XreloadFunc.vim
1724c970e422SBram Moolenaar        g:didTheFunc = 1
1725c970e422SBram Moolenaar      enddef
1726c970e422SBram Moolenaar  END
1727c970e422SBram Moolenaar  writefile(lines, 'XreloadFunc.vim')
1728c970e422SBram Moolenaar  source XreloadFunc.vim
1729c970e422SBram Moolenaar  CallFunc
1730c970e422SBram Moolenaar  assert_equal(1, g:didTheFunc)
1731c970e422SBram Moolenaar
1732c970e422SBram Moolenaar  delete('XreloadFunc.vim')
1733c970e422SBram Moolenaar  delcommand CallFunc
1734c970e422SBram Moolenaar  unlet g:loaded
1735c970e422SBram Moolenaar  unlet g:didTheFunc
1736c970e422SBram Moolenaarenddef
1737c970e422SBram Moolenaar
17386c3843caSBram Moolenaardef Test_script_var_shadows_function()
17396c3843caSBram Moolenaar  var lines =<< trim END
17406c3843caSBram Moolenaar      vim9script
17416c3843caSBram Moolenaar      def Func(): number
17426c3843caSBram Moolenaar        return 123
17436c3843caSBram Moolenaar      enddef
17446c3843caSBram Moolenaar      var Func = 1
17456c3843caSBram Moolenaar  END
17466c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
17476c3843caSBram Moolenaarenddef
17486c3843caSBram Moolenaar
174995006e3dSBram Moolenaardef s:RetSome(): string
175095006e3dSBram Moolenaar  return 'some'
175195006e3dSBram Moolenaarenddef
175295006e3dSBram Moolenaar
1753fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1754fe465a01SBram Moolenaar" script-local name.
1755fe465a01SBram Moolenaardef Test_vim9script_funcref()
1756cfcd011fSBram Moolenaar  var sortlines =<< trim END
1757fe465a01SBram Moolenaar      vim9script
1758fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1759bed36b93SBram Moolenaar        return i2 - i1
1760fe465a01SBram Moolenaar      enddef
1761fe465a01SBram Moolenaar
1762fe465a01SBram Moolenaar      export def FastSort(): list<number>
1763fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1764fe465a01SBram Moolenaar      enddef
1765529fb5a5SBram Moolenaar
1766529fb5a5SBram Moolenaar      export def GetString(arg: string): string
1767529fb5a5SBram Moolenaar        return arg
1768529fb5a5SBram Moolenaar      enddef
1769fe465a01SBram Moolenaar  END
1770fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1771fe465a01SBram Moolenaar
1772cfcd011fSBram Moolenaar  var lines =<< trim END
1773fe465a01SBram Moolenaar    vim9script
1774fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1775fe465a01SBram Moolenaar    def Test()
1776fe465a01SBram Moolenaar      g:result = FastSort()
1777fe465a01SBram Moolenaar    enddef
1778fe465a01SBram Moolenaar    Test()
1779529fb5a5SBram Moolenaar
1780529fb5a5SBram Moolenaar    # using a function imported with "as"
1781529fb5a5SBram Moolenaar    import * as anAlias from './Xsort.vim'
1782529fb5a5SBram Moolenaar    assert_equal('yes', anAlias.GetString('yes'))
1783529fb5a5SBram Moolenaar
1784529fb5a5SBram Moolenaar    # using the function from a compiled function
1785529fb5a5SBram Moolenaar    def TestMore(): string
1786ca51cc0aSBram Moolenaar      var s = s:anAlias.GetString('foo')
1787ca51cc0aSBram Moolenaar      return s .. anAlias.GetString('bar')
1788529fb5a5SBram Moolenaar    enddef
1789ca51cc0aSBram Moolenaar    assert_equal('foobar', TestMore())
1790529fb5a5SBram Moolenaar
1791529fb5a5SBram Moolenaar    # error when using a function that isn't exported
1792529fb5a5SBram Moolenaar    assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1793fe465a01SBram Moolenaar  END
1794fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1795fe465a01SBram Moolenaar
1796fe465a01SBram Moolenaar  source Xscript.vim
1797fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1798fe465a01SBram Moolenaar
1799fe465a01SBram Moolenaar  unlet g:result
1800fe465a01SBram Moolenaar  delete('Xsort.vim')
1801fe465a01SBram Moolenaar  delete('Xscript.vim')
180295006e3dSBram Moolenaar
1803cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
180495006e3dSBram Moolenaar  assert_equal('some', Funcref())
1805fe465a01SBram Moolenaarenddef
1806fe465a01SBram Moolenaar
1807601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1808601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1809601e76acSBram Moolenaar" function reference.
1810c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1811cfcd011fSBram Moolenaar  var filterLines =<< trim END
1812c620c055SBram Moolenaar    vim9script
1813c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1814c620c055SBram Moolenaar      return idx % 2 == 1
1815c620c055SBram Moolenaar    enddef
1816c620c055SBram Moolenaar    export def FastFilter(): list<number>
1817c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1818c620c055SBram Moolenaar    enddef
1819601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1820601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1821601e76acSBram Moolenaar    enddef
1822c620c055SBram Moolenaar  END
1823c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1824c620c055SBram Moolenaar
1825cfcd011fSBram Moolenaar  var lines =<< trim END
1826c620c055SBram Moolenaar    vim9script
1827601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1828c620c055SBram Moolenaar    def Test()
1829cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1830c620c055SBram Moolenaar    enddef
1831c620c055SBram Moolenaar    Test()
1832601e76acSBram Moolenaar    def TestDirect()
1833cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1834601e76acSBram Moolenaar    enddef
1835601e76acSBram Moolenaar    TestDirect()
1836c620c055SBram Moolenaar  END
1837601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1838c620c055SBram Moolenaar  delete('Xfilter.vim')
1839c620c055SBram Moolenaarenddef
1840c620c055SBram Moolenaar
18414c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1842cfcd011fSBram Moolenaar  var first_lines =<< trim END
18434c17ad94SBram Moolenaar    vim9script
18444c17ad94SBram Moolenaar    def FuncYes(): string
18454c17ad94SBram Moolenaar      return 'yes'
18464c17ad94SBram Moolenaar    enddef
18474c17ad94SBram Moolenaar  END
1848cfcd011fSBram Moolenaar  var withno_lines =<< trim END
18494c17ad94SBram Moolenaar    def FuncNo(): string
18504c17ad94SBram Moolenaar      return 'no'
18514c17ad94SBram Moolenaar    enddef
18524c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
18534c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
18544c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
185503afdcf1SBram Moolenaar    enddef
185603afdcf1SBram Moolenaar  END
1857cfcd011fSBram Moolenaar  var nono_lines =<< trim END
185803afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
185903afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
186044d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
18614c17ad94SBram Moolenaar    enddef
18624c17ad94SBram Moolenaar  END
18634c17ad94SBram Moolenaar
18644c17ad94SBram Moolenaar  # FuncNo() is defined
186503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
18664c17ad94SBram Moolenaar  source Xreloaded.vim
18674c17ad94SBram Moolenaar  g:DoCheck(true)
18684c17ad94SBram Moolenaar
18694c17ad94SBram Moolenaar  # FuncNo() is not redefined
187003afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
18714c17ad94SBram Moolenaar  source Xreloaded.vim
18725082471fSBram Moolenaar  g:DoCheck(false)
18734c17ad94SBram Moolenaar
18744c17ad94SBram Moolenaar  # FuncNo() is back
187503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
18764c17ad94SBram Moolenaar  source Xreloaded.vim
18775082471fSBram Moolenaar  g:DoCheck(false)
18784c17ad94SBram Moolenaar
18794c17ad94SBram Moolenaar  delete('Xreloaded.vim')
18804c17ad94SBram Moolenaarenddef
18814c17ad94SBram Moolenaar
188289483d40SBram Moolenaardef Test_vim9script_reload_delvar()
188389483d40SBram Moolenaar  # write the script with a script-local variable
1884cfcd011fSBram Moolenaar  var lines =<< trim END
188589483d40SBram Moolenaar    vim9script
1886cfcd011fSBram Moolenaar    var name = 'string'
188789483d40SBram Moolenaar  END
188889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
188989483d40SBram Moolenaar  source XreloadVar.vim
189089483d40SBram Moolenaar
189189483d40SBram Moolenaar  # now write the script using the same variable locally - works
189289483d40SBram Moolenaar  lines =<< trim END
189389483d40SBram Moolenaar    vim9script
189489483d40SBram Moolenaar    def Func()
1895cfcd011fSBram Moolenaar      var name = 'string'
189689483d40SBram Moolenaar    enddef
189789483d40SBram Moolenaar  END
189889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
189989483d40SBram Moolenaar  source XreloadVar.vim
190089483d40SBram Moolenaar
190189483d40SBram Moolenaar  delete('XreloadVar.vim')
190289483d40SBram Moolenaarenddef
190389483d40SBram Moolenaar
19048a7d6542SBram Moolenaardef Test_import_absolute()
1905cfcd011fSBram Moolenaar  var import_lines = [
1906e6085c53SBram Moolenaar        'vim9script',
1907e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1908e6085c53SBram Moolenaar        'def UseExported()',
1909e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1910e6085c53SBram Moolenaar        '  exported = 8888',
1911e6085c53SBram Moolenaar        '  g:imported_after = exported',
1912e6085c53SBram Moolenaar        'enddef',
1913e6085c53SBram Moolenaar        'UseExported()',
1914e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1915e6085c53SBram Moolenaar        ]
19168a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
19178a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
19188a7d6542SBram Moolenaar
19198a7d6542SBram Moolenaar  source Ximport_abs.vim
19208a7d6542SBram Moolenaar
19218a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
19224e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1923fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1924fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1925fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1926fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1927fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1928fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1929fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1930fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1931fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1932fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1933e6085c53SBram Moolenaar        g:import_disassembled)
1934b3ca9824SBram Moolenaar
1935b3ca9824SBram Moolenaar  Undo_export_script_lines()
19368a7d6542SBram Moolenaar  unlet g:imported_abs
19374e12a5dfSBram Moolenaar  unlet g:import_disassembled
19388a7d6542SBram Moolenaar
19398a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
19408a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
19418a7d6542SBram Moolenaarenddef
19428a7d6542SBram Moolenaar
19438a7d6542SBram Moolenaardef Test_import_rtp()
1944cfcd011fSBram Moolenaar  var import_lines = [
1945e6085c53SBram Moolenaar        'vim9script',
1946e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1947e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1948e6085c53SBram Moolenaar        ]
19498a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
19508a7d6542SBram Moolenaar  mkdir('import')
19518a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
19528a7d6542SBram Moolenaar
1953cfcd011fSBram Moolenaar  var save_rtp = &rtp
19548a7d6542SBram Moolenaar  &rtp = getcwd()
19558a7d6542SBram Moolenaar  source Ximport_rtp.vim
19568a7d6542SBram Moolenaar  &rtp = save_rtp
19578a7d6542SBram Moolenaar
19588a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
19598a7d6542SBram Moolenaar
1960b3ca9824SBram Moolenaar  Undo_export_script_lines()
1961b3ca9824SBram Moolenaar  unlet g:imported_rtp
19628a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
196389483d40SBram Moolenaar  delete('import', 'rf')
19648a7d6542SBram Moolenaarenddef
19658a7d6542SBram Moolenaar
196625e0f586SBram Moolenaardef Test_import_compile_error()
1967cfcd011fSBram Moolenaar  var export_lines = [
196825e0f586SBram Moolenaar        'vim9script',
196925e0f586SBram Moolenaar        'export def ExpFunc(): string',
197025e0f586SBram Moolenaar        '  return notDefined',
197125e0f586SBram Moolenaar        'enddef',
197225e0f586SBram Moolenaar        ]
197325e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
197425e0f586SBram Moolenaar
1975cfcd011fSBram Moolenaar  var import_lines = [
197625e0f586SBram Moolenaar        'vim9script',
197725e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
197825e0f586SBram Moolenaar        'def ImpFunc()',
197925e0f586SBram Moolenaar        '  echo ExpFunc()',
198025e0f586SBram Moolenaar        'enddef',
198125e0f586SBram Moolenaar        'defcompile',
198225e0f586SBram Moolenaar        ]
198325e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
198425e0f586SBram Moolenaar
198525e0f586SBram Moolenaar  try
198625e0f586SBram Moolenaar    source Ximport.vim
198725e0f586SBram Moolenaar  catch /E1001/
1988f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
19897707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
199025e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
199125e0f586SBram Moolenaar  endtry
199225e0f586SBram Moolenaar
199325e0f586SBram Moolenaar  delete('Xexported.vim')
199425e0f586SBram Moolenaar  delete('Ximport.vim')
199525e0f586SBram Moolenaarenddef
199625e0f586SBram Moolenaar
1997c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1998cfcd011fSBram Moolenaar  var lines = [
1999c4ce36d4SBram Moolenaar        'vim9script',
2000c4ce36d4SBram Moolenaar        'def Func()',
2001c4ce36d4SBram Moolenaar        '  eval [][0]',
2002c4ce36d4SBram Moolenaar        'enddef',
2003c4ce36d4SBram Moolenaar        'Func()',
2004c4ce36d4SBram Moolenaar        ]
2005c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
2006c4ce36d4SBram Moolenaar
2007c4ce36d4SBram Moolenaar  for count in range(3)
2008c4ce36d4SBram Moolenaar    try
2009c4ce36d4SBram Moolenaar      source Xtestscript.vim
2010c4ce36d4SBram Moolenaar    catch /E684/
2011c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
2012c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
2013c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
2014c4ce36d4SBram Moolenaar    endtry
2015c4ce36d4SBram Moolenaar  endfor
2016c4ce36d4SBram Moolenaar
2017c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
2018c4ce36d4SBram Moolenaarenddef
2019c4ce36d4SBram Moolenaar
2020eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
2021cfcd011fSBram Moolenaar  var export_lines =<< trim END
2022eef2102eSBram Moolenaar      vim9script
2023eef2102eSBram Moolenaar      export def Func()
2024eef2102eSBram Moolenaar        echo 'imported'
2025eef2102eSBram Moolenaar      enddef
2026eef2102eSBram Moolenaar  END
2027eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
2028eef2102eSBram Moolenaar
2029cfcd011fSBram Moolenaar  var lines =<< trim END
2030eef2102eSBram Moolenaar    vim9script
2031eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2032eef2102eSBram Moolenaar    def Func()
2033eef2102eSBram Moolenaar      echo 'local to function'
2034eef2102eSBram Moolenaar    enddef
2035eef2102eSBram Moolenaar  END
2036eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2037eef2102eSBram Moolenaar
2038eef2102eSBram Moolenaar  lines =<< trim END
2039eef2102eSBram Moolenaar    vim9script
2040eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2041eef2102eSBram Moolenaar    def Outer()
2042eef2102eSBram Moolenaar      def Func()
2043eef2102eSBram Moolenaar        echo 'local to function'
2044eef2102eSBram Moolenaar      enddef
2045eef2102eSBram Moolenaar    enddef
2046eef2102eSBram Moolenaar    defcompile
2047eef2102eSBram Moolenaar  END
2048eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2049eef2102eSBram Moolenaar
2050eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
2051eef2102eSBram Moolenaarenddef
2052eef2102eSBram Moolenaar
2053b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
2054cfcd011fSBram Moolenaar  var lines =<< trim END
2055b9a2cac3SBram Moolenaar    vim9script
2056b9a2cac3SBram Moolenaar    def Func()
2057b9a2cac3SBram Moolenaar      echo 'one'
2058b9a2cac3SBram Moolenaar    enddef
2059b9a2cac3SBram Moolenaar    def Func()
2060b9a2cac3SBram Moolenaar      echo 'two'
2061b9a2cac3SBram Moolenaar    enddef
2062b9a2cac3SBram Moolenaar  END
2063b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2064fa211f3cSBram Moolenaar
2065fa211f3cSBram Moolenaar  lines =<< trim END
2066fa211f3cSBram Moolenaar    vim9script
2067fa211f3cSBram Moolenaar    def Foo(): string
2068fa211f3cSBram Moolenaar      return 'foo'
2069fa211f3cSBram Moolenaar      enddef
2070fa211f3cSBram Moolenaar    def Func()
2071cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
2072fa211f3cSBram Moolenaar    enddef
2073fa211f3cSBram Moolenaar    defcompile
2074fa211f3cSBram Moolenaar  END
2075fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2076b9a2cac3SBram Moolenaarenddef
2077b9a2cac3SBram Moolenaar
20788a7d6542SBram Moolenaardef Test_fixed_size_list()
2079f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
2080cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
20818a7d6542SBram Moolenaar  l->remove(0)
20828a7d6542SBram Moolenaar  l->add(5)
20838a7d6542SBram Moolenaar  l->insert(99, 1)
20840f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
20858a7d6542SBram Moolenaarenddef
20868a7d6542SBram Moolenaar
2087ae616494SBram Moolenaardef Test_no_insert_xit()
2088d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2089d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2090d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2091d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2092d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2093ae616494SBram Moolenaar
2094ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2095ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2096ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2097ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2098f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2099f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
21006508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
21016508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
2102f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2103f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2104f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2105ae616494SBram Moolenaarenddef
2106ae616494SBram Moolenaar
2107158906cfSBram Moolenaardef IfElse(what: number): string
2108cfcd011fSBram Moolenaar  var res = ''
2109158906cfSBram Moolenaar  if what == 1
2110158906cfSBram Moolenaar    res = "one"
2111158906cfSBram Moolenaar  elseif what == 2
2112158906cfSBram Moolenaar    res = "two"
2113a259d8d3SBram Moolenaar  else
2114158906cfSBram Moolenaar    res = "three"
2115a259d8d3SBram Moolenaar  endif
2116158906cfSBram Moolenaar  return res
2117a259d8d3SBram Moolenaarenddef
2118a259d8d3SBram Moolenaar
2119158906cfSBram Moolenaardef Test_if_elseif_else()
2120158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2121158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2122158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
21230f18b6d1SBram Moolenaarenddef
21240f18b6d1SBram Moolenaar
2125e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2126d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2127d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2128d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2129ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
2130d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
21316628b7ebSBram Moolenaar
21326628b7ebSBram Moolenaar  var lines =<< trim END
21336628b7ebSBram Moolenaar      var s = ''
21346628b7ebSBram Moolenaar      if s = ''
21356628b7ebSBram Moolenaar      endif
21366628b7ebSBram Moolenaar  END
21376628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
21386628b7ebSBram Moolenaar
21396628b7ebSBram Moolenaar  lines =<< trim END
21406628b7ebSBram Moolenaar      var s = ''
21416628b7ebSBram Moolenaar      if s == ''
21426628b7ebSBram Moolenaar      elseif s = ''
21436628b7ebSBram Moolenaar      endif
21446628b7ebSBram Moolenaar  END
21456628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2146e8c4abbbSBram Moolenaarenddef
2147e8c4abbbSBram Moolenaar
21486d69bf60SBram Moolenaarlet g:bool_true = v:true
21496d69bf60SBram Moolenaarlet g:bool_false = v:false
21506d69bf60SBram Moolenaar
21516d69bf60SBram Moolenaardef Test_if_const_expr()
2152cfcd011fSBram Moolenaar  var res = false
21536d69bf60SBram Moolenaar  if true ? true : false
21546d69bf60SBram Moolenaar    res = true
21556d69bf60SBram Moolenaar  endif
21566d69bf60SBram Moolenaar  assert_equal(true, res)
21576d69bf60SBram Moolenaar
2158585fea7bSBram Moolenaar  g:glob = 2
2159585fea7bSBram Moolenaar  if false
21606797966dSBram Moolenaar    execute('g:glob = 3')
2161585fea7bSBram Moolenaar  endif
2162585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2163585fea7bSBram Moolenaar  if true
21646797966dSBram Moolenaar    execute('g:glob = 3')
2165585fea7bSBram Moolenaar  endif
2166585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2167585fea7bSBram Moolenaar
21686d69bf60SBram Moolenaar  res = false
21696d69bf60SBram Moolenaar  if g:bool_true ? true : false
21706d69bf60SBram Moolenaar    res = true
21716d69bf60SBram Moolenaar  endif
21726d69bf60SBram Moolenaar  assert_equal(true, res)
21736d69bf60SBram Moolenaar
21746d69bf60SBram Moolenaar  res = false
21756d69bf60SBram Moolenaar  if true ? g:bool_true : false
21766d69bf60SBram Moolenaar    res = true
21776d69bf60SBram Moolenaar  endif
21786d69bf60SBram Moolenaar  assert_equal(true, res)
21796d69bf60SBram Moolenaar
21806d69bf60SBram Moolenaar  res = false
21816d69bf60SBram Moolenaar  if true ? true : g:bool_false
21826d69bf60SBram Moolenaar    res = true
21836d69bf60SBram Moolenaar  endif
21846d69bf60SBram Moolenaar  assert_equal(true, res)
21856d69bf60SBram Moolenaar
21866d69bf60SBram Moolenaar  res = false
21876d69bf60SBram Moolenaar  if true ? false : true
21886d69bf60SBram Moolenaar    res = true
21896d69bf60SBram Moolenaar  endif
21906d69bf60SBram Moolenaar  assert_equal(false, res)
21916d69bf60SBram Moolenaar
21926d69bf60SBram Moolenaar  res = false
21936d69bf60SBram Moolenaar  if false ? false : true
21946d69bf60SBram Moolenaar    res = true
21956d69bf60SBram Moolenaar  endif
21966d69bf60SBram Moolenaar  assert_equal(true, res)
21976d69bf60SBram Moolenaar
21986d69bf60SBram Moolenaar  res = false
21996d69bf60SBram Moolenaar  if false ? true : false
22006d69bf60SBram Moolenaar    res = true
22016d69bf60SBram Moolenaar  endif
22026d69bf60SBram Moolenaar  assert_equal(false, res)
22036d69bf60SBram Moolenaar
22046d69bf60SBram Moolenaar  res = false
2205e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2206e8c4abbbSBram Moolenaar    res = true
2207e8c4abbbSBram Moolenaar  endif
2208e8c4abbbSBram Moolenaar  assert_equal(false, res)
2209e8c4abbbSBram Moolenaar
2210e8c4abbbSBram Moolenaar  res = false
22116d69bf60SBram Moolenaar  if true && true
22126d69bf60SBram Moolenaar    res = true
22136d69bf60SBram Moolenaar  endif
22146d69bf60SBram Moolenaar  assert_equal(true, res)
22156d69bf60SBram Moolenaar
22166d69bf60SBram Moolenaar  res = false
22176d69bf60SBram Moolenaar  if true && false
22186d69bf60SBram Moolenaar    res = true
22196d69bf60SBram Moolenaar  endif
22206d69bf60SBram Moolenaar  assert_equal(false, res)
22216d69bf60SBram Moolenaar
22226d69bf60SBram Moolenaar  res = false
22236d69bf60SBram Moolenaar  if g:bool_true && false
22246d69bf60SBram Moolenaar    res = true
22256d69bf60SBram Moolenaar  endif
22266d69bf60SBram Moolenaar  assert_equal(false, res)
22276d69bf60SBram Moolenaar
22286d69bf60SBram Moolenaar  res = false
22296d69bf60SBram Moolenaar  if true && g:bool_false
22306d69bf60SBram Moolenaar    res = true
22316d69bf60SBram Moolenaar  endif
22326d69bf60SBram Moolenaar  assert_equal(false, res)
22336d69bf60SBram Moolenaar
22346d69bf60SBram Moolenaar  res = false
22356d69bf60SBram Moolenaar  if false && false
22366d69bf60SBram Moolenaar    res = true
22376d69bf60SBram Moolenaar  endif
22386d69bf60SBram Moolenaar  assert_equal(false, res)
22396d69bf60SBram Moolenaar
22406d69bf60SBram Moolenaar  res = false
22416d69bf60SBram Moolenaar  if true || false
22426d69bf60SBram Moolenaar    res = true
22436d69bf60SBram Moolenaar  endif
22446d69bf60SBram Moolenaar  assert_equal(true, res)
22456d69bf60SBram Moolenaar
22466d69bf60SBram Moolenaar  res = false
22476d69bf60SBram Moolenaar  if g:bool_true || false
22486d69bf60SBram Moolenaar    res = true
22496d69bf60SBram Moolenaar  endif
22506d69bf60SBram Moolenaar  assert_equal(true, res)
22516d69bf60SBram Moolenaar
22526d69bf60SBram Moolenaar  res = false
22536d69bf60SBram Moolenaar  if true || g:bool_false
22546d69bf60SBram Moolenaar    res = true
22556d69bf60SBram Moolenaar  endif
22566d69bf60SBram Moolenaar  assert_equal(true, res)
22576d69bf60SBram Moolenaar
22586d69bf60SBram Moolenaar  res = false
22596d69bf60SBram Moolenaar  if false || false
22606d69bf60SBram Moolenaar    res = true
22616d69bf60SBram Moolenaar  endif
22626d69bf60SBram Moolenaar  assert_equal(false, res)
22633988f64fSBram Moolenaar
22643988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
22653988f64fSBram Moolenaar  if false | eval 0 | endif
22663988f64fSBram Moolenaar  if false | eval burp + 234 | endif
22673988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
22683988f64fSBram Moolenaar  if false
22693988f64fSBram Moolenaar    burp
22703988f64fSBram Moolenaar  endif
227180c34ca3SBram Moolenaarenddef
22726d69bf60SBram Moolenaar
227380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2274d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2275d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2276d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2277d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
22786d69bf60SBram Moolenaarenddef
22796d69bf60SBram Moolenaar
228072abcf42SBram Moolenaardef RunNested(i: number): number
2281cfcd011fSBram Moolenaar  var x: number = 0
228272abcf42SBram Moolenaar  if i % 2
228372abcf42SBram Moolenaar    if 1
2284f5be8cdbSBram Moolenaar      # comment
228572abcf42SBram Moolenaar    else
2286f5be8cdbSBram Moolenaar      # comment
228772abcf42SBram Moolenaar    endif
228872abcf42SBram Moolenaar    x += 1
228972abcf42SBram Moolenaar  else
229072abcf42SBram Moolenaar    x += 1000
229172abcf42SBram Moolenaar  endif
229272abcf42SBram Moolenaar  return x
229372abcf42SBram Moolenaarenddef
229472abcf42SBram Moolenaar
229572abcf42SBram Moolenaardef Test_nested_if()
229672abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
229772abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
229872abcf42SBram Moolenaarenddef
229972abcf42SBram Moolenaar
2300ad39c094SBram Moolenaardef Test_execute_cmd()
2301e4984290SBram Moolenaar  # missing argument is ignored
2302e4984290SBram Moolenaar  execute
2303e4984290SBram Moolenaar  execute # comment
2304e4984290SBram Moolenaar
2305ad39c094SBram Moolenaar  new
2306ad39c094SBram Moolenaar  setline(1, 'default')
2307d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2308ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2309a72cfb80SBram Moolenaar
2310d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2311a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2312a72cfb80SBram Moolenaar
2313cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2314cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2315a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2316ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2317a72cfb80SBram Moolenaar
2318d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2319ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2320a72cfb80SBram Moolenaar
2321cfcd011fSBram Moolenaar  var cmd_first = 'call '
2322cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2323ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2324ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2325ad39c094SBram Moolenaar  bwipe!
2326585fea7bSBram Moolenaar
2327cfcd011fSBram Moolenaar  var n = true
23282d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
23292d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
23302d6b20d6SBram Moolenaar
2331e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2332e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2333e5abf7afSBram Moolenaar
2334d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2335d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2336d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2337ad39c094SBram Moolenaarenddef
2338ad39c094SBram Moolenaar
233947e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2340f5be8cdbSBram Moolenaar  # only checks line continuation
2341cfcd011fSBram Moolenaar  var lines =<< trim END
234247e880d6SBram Moolenaar      vim9script
234347e880d6SBram Moolenaar      execute 'g:someVar'
234447e880d6SBram Moolenaar                .. ' = ' ..
234547e880d6SBram Moolenaar                   '28'
234647e880d6SBram Moolenaar      assert_equal(28, g:someVar)
234747e880d6SBram Moolenaar      unlet g:someVar
234847e880d6SBram Moolenaar  END
234947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
235047e880d6SBram Moolenaarenddef
235147e880d6SBram Moolenaar
2352ad39c094SBram Moolenaardef Test_echo_cmd()
2353a72cfb80SBram Moolenaar  echo 'some' # comment
2354585fea7bSBram Moolenaar  echon 'thing'
2355ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2356ad39c094SBram Moolenaar
2357a72cfb80SBram Moolenaar  echo "some" # comment
2358a72cfb80SBram Moolenaar  echon "thing"
2359a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2360a72cfb80SBram Moolenaar
2361cfcd011fSBram Moolenaar  var str1 = 'some'
2362cfcd011fSBram Moolenaar  var str2 = 'more'
2363ad39c094SBram Moolenaar  echo str1 str2
2364ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2365a72cfb80SBram Moolenaar
2366d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2367ad39c094SBram Moolenaarenddef
2368ad39c094SBram Moolenaar
2369f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2370f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2371f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2372f93c7feaSBram Moolenaar  echo 'clear'
2373df069eecSBram Moolenaar  :1messages
2374f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2375f93c7feaSBram Moolenaar
2376d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2377f93c7feaSBram Moolenaarenddef
2378f93c7feaSBram Moolenaar
237947e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2380f5be8cdbSBram Moolenaar  # only checks line continuation
2381cfcd011fSBram Moolenaar  var lines =<< trim END
238247e880d6SBram Moolenaar      vim9script
238347e880d6SBram Moolenaar      echomsg 'here'
238447e880d6SBram Moolenaar                .. ' is ' ..
238547e880d6SBram Moolenaar                   'a message'
238647e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
238747e880d6SBram Moolenaar  END
238847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
238947e880d6SBram Moolenaarenddef
239047e880d6SBram Moolenaar
2391f93c7feaSBram Moolenaardef Test_echoerr_cmd()
239240ee466cSBram Moolenaar  try
239340ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
239440ee466cSBram Moolenaar  catch
239540ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
239640ee466cSBram Moolenaar  endtry
2397f93c7feaSBram Moolenaarenddef
2398f93c7feaSBram Moolenaar
239947e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2400f5be8cdbSBram Moolenaar  # only checks line continuation
2401cfcd011fSBram Moolenaar  var lines =<< trim END
240247e880d6SBram Moolenaar      vim9script
240347e880d6SBram Moolenaar      try
240447e880d6SBram Moolenaar        echoerr 'this'
240547e880d6SBram Moolenaar                .. ' is ' ..
240647e880d6SBram Moolenaar                   'wrong'
240747e880d6SBram Moolenaar      catch
240847e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
240947e880d6SBram Moolenaar      endtry
241047e880d6SBram Moolenaar  END
241147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
241247e880d6SBram Moolenaarenddef
241347e880d6SBram Moolenaar
241441fe0617SBram Moolenaardef Test_for_outside_of_function()
2415cfcd011fSBram Moolenaar  var lines =<< trim END
241641fe0617SBram Moolenaar    vim9script
241741fe0617SBram Moolenaar    new
241841fe0617SBram Moolenaar    for var in range(0, 3)
241941fe0617SBram Moolenaar      append(line('$'), var)
242041fe0617SBram Moolenaar    endfor
242141fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
242241fe0617SBram Moolenaar    bwipe!
2423522eefd9SBram Moolenaar
2424522eefd9SBram Moolenaar    var result = ''
2425522eefd9SBram Moolenaar    for i in [1, 2, 3]
2426522eefd9SBram Moolenaar      var loop = ' loop ' .. i
2427522eefd9SBram Moolenaar      result ..= loop
2428522eefd9SBram Moolenaar    endfor
2429522eefd9SBram Moolenaar    assert_equal(' loop 1 loop 2 loop 3', result)
243041fe0617SBram Moolenaar  END
243141fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
243241fe0617SBram Moolenaar  source Xvim9for.vim
243341fe0617SBram Moolenaar  delete('Xvim9for.vim')
243441fe0617SBram Moolenaarenddef
24358a7d6542SBram Moolenaar
2436e8c4abbbSBram Moolenaardef Test_for_loop()
2437f2253963SBram Moolenaar  var lines =<< trim END
2438cfcd011fSBram Moolenaar      var result = ''
2439e8c4abbbSBram Moolenaar      for cnt in range(7)
2440e8c4abbbSBram Moolenaar        if cnt == 4
2441e8c4abbbSBram Moolenaar          break
2442e8c4abbbSBram Moolenaar        endif
2443e8c4abbbSBram Moolenaar        if cnt == 2
2444e8c4abbbSBram Moolenaar          continue
2445e8c4abbbSBram Moolenaar        endif
2446e8c4abbbSBram Moolenaar        result ..= cnt .. '_'
2447e8c4abbbSBram Moolenaar      endfor
2448e8c4abbbSBram Moolenaar      assert_equal('0_1_3_', result)
24490ad3e894SBram Moolenaar
2450cfcd011fSBram Moolenaar      var concat = ''
24510ad3e894SBram Moolenaar      for str in eval('["one", "two"]')
24520ad3e894SBram Moolenaar        concat ..= str
24530ad3e894SBram Moolenaar      endfor
24540ad3e894SBram Moolenaar      assert_equal('onetwo', concat)
245538bd8de5SBram Moolenaar
245638bd8de5SBram Moolenaar      var total = 0
245738bd8de5SBram Moolenaar      for nr in
245838bd8de5SBram Moolenaar          [1, 2, 3]
245938bd8de5SBram Moolenaar        total += nr
246038bd8de5SBram Moolenaar      endfor
246138bd8de5SBram Moolenaar      assert_equal(6, total)
246238bd8de5SBram Moolenaar
246338bd8de5SBram Moolenaar      total = 0
246438bd8de5SBram Moolenaar      for nr
246538bd8de5SBram Moolenaar        in [1, 2, 3]
246638bd8de5SBram Moolenaar        total += nr
246738bd8de5SBram Moolenaar      endfor
246838bd8de5SBram Moolenaar      assert_equal(6, total)
246938bd8de5SBram Moolenaar
247038bd8de5SBram Moolenaar      total = 0
247138bd8de5SBram Moolenaar      for nr
247238bd8de5SBram Moolenaar        in
247338bd8de5SBram Moolenaar        [1, 2, 3]
247438bd8de5SBram Moolenaar        total += nr
247538bd8de5SBram Moolenaar      endfor
247638bd8de5SBram Moolenaar      assert_equal(6, total)
2477036d0714SBram Moolenaar
2478a3589a0dSBram Moolenaar      # with type
2479a3589a0dSBram Moolenaar      total = 0
2480a3589a0dSBram Moolenaar      for n: number in [1, 2, 3]
2481a3589a0dSBram Moolenaar        total += n
2482a3589a0dSBram Moolenaar      endfor
2483a3589a0dSBram Moolenaar      assert_equal(6, total)
2484a3589a0dSBram Moolenaar
2485fe090eb5SBram Moolenaar      var chars = ''
2486fe090eb5SBram Moolenaar      for s: string in 'foobar'
2487fe090eb5SBram Moolenaar        chars ..= s
2488fe090eb5SBram Moolenaar      endfor
2489fe090eb5SBram Moolenaar      assert_equal('foobar', chars)
2490fe090eb5SBram Moolenaar
2491a3589a0dSBram Moolenaar      # unpack with type
2492f2253963SBram Moolenaar      var res = ''
2493a3589a0dSBram Moolenaar      for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2494a3589a0dSBram Moolenaar        res ..= n .. s
2495a3589a0dSBram Moolenaar      endfor
2496a3589a0dSBram Moolenaar      assert_equal('1a2b', res)
2497a3589a0dSBram Moolenaar
2498444d8783SBram Moolenaar      # unpack with one var
2499444d8783SBram Moolenaar      var reslist = []
2500444d8783SBram Moolenaar      for [x] in [['aaa'], ['bbb']]
2501444d8783SBram Moolenaar        reslist->add(x)
2502444d8783SBram Moolenaar      endfor
2503444d8783SBram Moolenaar      assert_equal(['aaa', 'bbb'], reslist)
2504444d8783SBram Moolenaar
2505a3589a0dSBram Moolenaar      # loop over string
2506a3589a0dSBram Moolenaar      res = ''
250774e54fcbSBram Moolenaar      for c in 'aéc̀d'
250874e54fcbSBram Moolenaar        res ..= c .. '-'
250974e54fcbSBram Moolenaar      endfor
251074e54fcbSBram Moolenaar      assert_equal('a-é-c̀-d-', res)
251174e54fcbSBram Moolenaar
251274e54fcbSBram Moolenaar      res = ''
251374e54fcbSBram Moolenaar      for c in ''
251474e54fcbSBram Moolenaar        res ..= c .. '-'
251574e54fcbSBram Moolenaar      endfor
251674e54fcbSBram Moolenaar      assert_equal('', res)
251774e54fcbSBram Moolenaar
251874e54fcbSBram Moolenaar      res = ''
251974e54fcbSBram Moolenaar      for c in test_null_string()
252074e54fcbSBram Moolenaar        res ..= c .. '-'
252174e54fcbSBram Moolenaar      endfor
252274e54fcbSBram Moolenaar      assert_equal('', res)
2523f2253963SBram Moolenaar
2524f2253963SBram Moolenaar      var foo: list<dict<any>> = [
2525f2253963SBram Moolenaar              {a: 'Cat'}
2526f2253963SBram Moolenaar            ]
2527f2253963SBram Moolenaar      for dd in foo
2528f2253963SBram Moolenaar        dd.counter = 12
2529f2253963SBram Moolenaar      endfor
2530f2253963SBram Moolenaar      assert_equal([{a: 'Cat', counter: 12}], foo)
2531f2253963SBram Moolenaar  END
2532f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2533e8c4abbbSBram Moolenaarenddef
2534e8c4abbbSBram Moolenaar
2535e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2536025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2537025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2538025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2539675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2540675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2541cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2542822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
25432d870f8dSBram Moolenaar  delfunc! g:Func
2544675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2545675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2546675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
254774e54fcbSBram Moolenaar
254874e54fcbSBram Moolenaar  # wrong type detected at compile time
254974e54fcbSBram Moolenaar  CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
255074e54fcbSBram Moolenaar
255174e54fcbSBram Moolenaar  # wrong type detected at runtime
255274e54fcbSBram Moolenaar  g:adict = {a: 1}
255374e54fcbSBram Moolenaar  CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
255474e54fcbSBram Moolenaar  unlet g:adict
2555f6a8d420SBram Moolenaar
2556f6a8d420SBram Moolenaar  var lines =<< trim END
2557f6a8d420SBram Moolenaar      var d: list<dict<any>> = [{a: 0}]
2558f6a8d420SBram Moolenaar      for e in d
2559f6a8d420SBram Moolenaar        e = {a: 0, b: ''}
2560f6a8d420SBram Moolenaar      endfor
2561f6a8d420SBram Moolenaar  END
2562f6a8d420SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3)
2563fe090eb5SBram Moolenaar
2564fe090eb5SBram Moolenaar  lines =<< trim END
2565fe090eb5SBram Moolenaar      for nr: number in ['foo']
2566fe090eb5SBram Moolenaar      endfor
2567fe090eb5SBram Moolenaar  END
2568fe090eb5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2569e8c4abbbSBram Moolenaarenddef
2570e8c4abbbSBram Moolenaar
2571ea87069dSBram Moolenaardef Test_for_loop_script_var()
2572ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2573ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2574ea87069dSBram Moolenaar
2575ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2576ea87069dSBram Moolenaar  var lines =<< trim END
2577ea87069dSBram Moolenaar    vim9script
2578ea87069dSBram Moolenaar    var total = 0
2579ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2580ea87069dSBram Moolenaar      total += s:var
2581ea87069dSBram Moolenaar    endfor
2582ea87069dSBram Moolenaar    assert_equal(6, total)
2583ea87069dSBram Moolenaar
2584ea87069dSBram Moolenaar    total = 0
2585ea87069dSBram Moolenaar    for var in [1, 2, 3]
2586ea87069dSBram Moolenaar      total += var
2587ea87069dSBram Moolenaar    endfor
2588ea87069dSBram Moolenaar    assert_equal(6, total)
2589ea87069dSBram Moolenaar  END
2590ea87069dSBram Moolenaarenddef
2591ea87069dSBram Moolenaar
2592792f786aSBram Moolenaardef Test_for_loop_unpack()
25934b8a0651SBram Moolenaar  var lines =<< trim END
2594792f786aSBram Moolenaar      var result = []
2595792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2596792f786aSBram Moolenaar        result->add(v1)
2597792f786aSBram Moolenaar        result->add(v2)
2598792f786aSBram Moolenaar      endfor
2599792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2600792f786aSBram Moolenaar
2601792f786aSBram Moolenaar      result = []
2602792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2603792f786aSBram Moolenaar        result->add(v1)
2604792f786aSBram Moolenaar        result->add(v2)
2605792f786aSBram Moolenaar        result->add(v3)
2606792f786aSBram Moolenaar      endfor
2607792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2608792f786aSBram Moolenaar
26094b8a0651SBram Moolenaar      result = []
26104b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
26114b8a0651SBram Moolenaar        result->add(&ts)
26124b8a0651SBram Moolenaar        result->add(&sw)
26134b8a0651SBram Moolenaar      endfor
26144b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
26154b8a0651SBram Moolenaar
26164b8a0651SBram Moolenaar      var slist: list<string>
26174b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
26184b8a0651SBram Moolenaar        slist->add($LOOPVAR)
26194b8a0651SBram Moolenaar        slist->add(@r)
26204b8a0651SBram Moolenaar        slist->add(v:errmsg)
26214b8a0651SBram Moolenaar      endfor
26224b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
26234b8a0651SBram Moolenaar
26244b8a0651SBram Moolenaar      slist = []
26254b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
26264b8a0651SBram Moolenaar        slist->add(g:globalvar)
26274b8a0651SBram Moolenaar        slist->add(b:bufvar)
26284b8a0651SBram Moolenaar        slist->add(w:winvar)
26294b8a0651SBram Moolenaar        slist->add(t:tabvar)
26304b8a0651SBram Moolenaar      endfor
26314b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2632f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
2633b777da9bSBram Moolenaar
2634b777da9bSBram Moolenaar      var res = []
2635b777da9bSBram Moolenaar      for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2636b777da9bSBram Moolenaar        res->add(n)
2637b777da9bSBram Moolenaar      endfor
2638b777da9bSBram Moolenaar      assert_equal([2, 5], res)
26394b8a0651SBram Moolenaar  END
26404b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
26414b8a0651SBram Moolenaar
26424b8a0651SBram Moolenaar  lines =<< trim END
2643792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2644792f786aSBram Moolenaar        echo v1 v2
2645792f786aSBram Moolenaar      endfor
2646792f786aSBram Moolenaar  END
2647792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2648792f786aSBram Moolenaar
2649792f786aSBram Moolenaar  lines =<< trim END
2650792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2651792f786aSBram Moolenaar        echo v1 v2
2652792f786aSBram Moolenaar      endfor
2653792f786aSBram Moolenaar  END
2654792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2655792f786aSBram Moolenaar
2656792f786aSBram Moolenaar  lines =<< trim END
2657792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2658792f786aSBram Moolenaar        echo v1
2659792f786aSBram Moolenaar      endfor
2660792f786aSBram Moolenaar  END
2661792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2662792f786aSBram Moolenaarenddef
2663792f786aSBram Moolenaar
2664c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2665f2253963SBram Moolenaar  var lines =<< trim END
2666c150c09eSBram Moolenaar      var looped = 0
2667c150c09eSBram Moolenaar      var cleanup = 0
2668c150c09eSBram Moolenaar      for i in range(3)
2669c150c09eSBram Moolenaar        looped += 1
2670c150c09eSBram Moolenaar        try
2671c150c09eSBram Moolenaar          eval [][0]
2672c150c09eSBram Moolenaar        catch
2673c150c09eSBram Moolenaar          continue
2674c150c09eSBram Moolenaar        finally
2675c150c09eSBram Moolenaar          cleanup += 1
2676c150c09eSBram Moolenaar        endtry
2677c150c09eSBram Moolenaar      endfor
2678c150c09eSBram Moolenaar      assert_equal(3, looped)
2679c150c09eSBram Moolenaar      assert_equal(3, cleanup)
2680f2253963SBram Moolenaar  END
2681f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2682c150c09eSBram Moolenaarenddef
2683c150c09eSBram Moolenaar
2684d0df1aacSBram Moolenaardef Test_while_loop()
2685cfcd011fSBram Moolenaar  var result = ''
2686cfcd011fSBram Moolenaar  var cnt = 0
2687d0df1aacSBram Moolenaar  while cnt < 555
2688d0df1aacSBram Moolenaar    if cnt == 3
2689d0df1aacSBram Moolenaar      break
2690d0df1aacSBram Moolenaar    endif
2691d0df1aacSBram Moolenaar    cnt += 1
2692d0df1aacSBram Moolenaar    if cnt == 2
2693d0df1aacSBram Moolenaar      continue
2694d0df1aacSBram Moolenaar    endif
2695d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2696d0df1aacSBram Moolenaar  endwhile
2697d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2698dee37dc7SBram Moolenaar
2699dee37dc7SBram Moolenaar  var s = ''
27000123cc1eSBram Moolenaar  while s == 'x' # {comment}
2701dee37dc7SBram Moolenaar  endwhile
2702d0df1aacSBram Moolenaarenddef
2703d0df1aacSBram Moolenaar
2704e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2705675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2706675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2707675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2708675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2709675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2710675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2711675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
27126628b7ebSBram Moolenaar
27136628b7ebSBram Moolenaar  var lines =<< trim END
27146628b7ebSBram Moolenaar      var s = ''
27156628b7ebSBram Moolenaar      while s = ''
27166628b7ebSBram Moolenaar      endwhile
27176628b7ebSBram Moolenaar  END
27186628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2719bd5da371SBram Moolenaarenddef
2720bd5da371SBram Moolenaar
27219645e2d9SBram Moolenaardef Test_interrupt_loop()
2722cfcd011fSBram Moolenaar  var caught = false
2723cfcd011fSBram Moolenaar  var x = 0
272497acfc78SBram Moolenaar  try
27259645e2d9SBram Moolenaar    while 1
27269645e2d9SBram Moolenaar      x += 1
27279645e2d9SBram Moolenaar      if x == 100
27289645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
27299645e2d9SBram Moolenaar      endif
27309645e2d9SBram Moolenaar    endwhile
273197acfc78SBram Moolenaar  catch
273297acfc78SBram Moolenaar    caught = true
273397acfc78SBram Moolenaar    assert_equal(100, x)
273497acfc78SBram Moolenaar  endtry
273597acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
273625859dd7SBram Moolenaar  # consume the CTRL-C
273725859dd7SBram Moolenaar  getchar(0)
27389645e2d9SBram Moolenaarenddef
273920431c9dSBram Moolenaar
27404fdae999SBram Moolenaardef Test_automatic_line_continuation()
2741cfcd011fSBram Moolenaar  var mylist = [
27424fdae999SBram Moolenaar      'one',
27434fdae999SBram Moolenaar      'two',
27444fdae999SBram Moolenaar      'three',
2745f5be8cdbSBram Moolenaar      ] # comment
27464fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
27474fdae999SBram Moolenaar
2748cfcd011fSBram Moolenaar  var mydict = {
2749e0de171eSBram Moolenaar      ['one']: 1,
2750e0de171eSBram Moolenaar      ['two']: 2,
2751e0de171eSBram Moolenaar      ['three']:
27524fdae999SBram Moolenaar          3,
2753f5be8cdbSBram Moolenaar      } # comment
2754e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2755e0de171eSBram Moolenaar  mydict = {
27562c330432SBram Moolenaar      one: 1,  # comment
27572c330432SBram Moolenaar      two:     # comment
27582c330432SBram Moolenaar           2,  # comment
27592c330432SBram Moolenaar      three: 3 # comment
27602c330432SBram Moolenaar      }
2761e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2762e0de171eSBram Moolenaar  mydict = {
27632c330432SBram Moolenaar      one: 1,
27644fdae999SBram Moolenaar      two:
27654fdae999SBram Moolenaar           2,
27662c330432SBram Moolenaar      three: 3
27674fdae999SBram Moolenaar      }
2768e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2769e6085c53SBram Moolenaar
2770e6085c53SBram Moolenaar  assert_equal(
2771e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2772e6085c53SBram Moolenaar        split('one two three')
2773e6085c53SBram Moolenaar        )
27744fdae999SBram Moolenaarenddef
27754fdae999SBram Moolenaar
27767a092245SBram Moolenaardef Test_vim9_comment()
27777a092245SBram Moolenaar  CheckScriptSuccess([
27787a092245SBram Moolenaar      'vim9script',
27797a092245SBram Moolenaar      '# something',
278093f82cbeSBram Moolenaar      '#something',
278193f82cbeSBram Moolenaar      '#{something',
27827a092245SBram Moolenaar      ])
278393f82cbeSBram Moolenaar
278493f82cbeSBram Moolenaar  split Xfile
278593f82cbeSBram Moolenaar  CheckScriptSuccess([
278693f82cbeSBram Moolenaar      'vim9script',
278793f82cbeSBram Moolenaar      'edit #something',
278893f82cbeSBram Moolenaar      ])
278993f82cbeSBram Moolenaar  CheckScriptSuccess([
279093f82cbeSBram Moolenaar      'vim9script',
279193f82cbeSBram Moolenaar      'edit #{something',
279293f82cbeSBram Moolenaar      ])
279393f82cbeSBram Moolenaar  close
279493f82cbeSBram Moolenaar
27957a092245SBram Moolenaar  CheckScriptFailure([
27967a092245SBram Moolenaar      'vim9script',
27977a092245SBram Moolenaar      ':# something',
27987a092245SBram Moolenaar      ], 'E488:')
27997a092245SBram Moolenaar  CheckScriptFailure([
28007a092245SBram Moolenaar      '# something',
28017a092245SBram Moolenaar      ], 'E488:')
28027a092245SBram Moolenaar  CheckScriptFailure([
28037a092245SBram Moolenaar      ':# something',
28047a092245SBram Moolenaar      ], 'E488:')
28057a092245SBram Moolenaar
28064a8d9f2eSBram Moolenaar  { # block start
28074a8d9f2eSBram Moolenaar  } # block end
28084a8d9f2eSBram Moolenaar  CheckDefFailure([
28094a8d9f2eSBram Moolenaar      '{# comment',
28104a8d9f2eSBram Moolenaar      ], 'E488:')
28114a8d9f2eSBram Moolenaar  CheckDefFailure([
28124a8d9f2eSBram Moolenaar      '{',
28134a8d9f2eSBram Moolenaar      '}# comment',
28144a8d9f2eSBram Moolenaar      ], 'E488:')
28154a8d9f2eSBram Moolenaar
28164a8d9f2eSBram Moolenaar  echo "yes" # comment
28174a8d9f2eSBram Moolenaar  CheckDefFailure([
28184a8d9f2eSBram Moolenaar      'echo "yes"# comment',
28194a8d9f2eSBram Moolenaar      ], 'E488:')
28207a092245SBram Moolenaar  CheckScriptSuccess([
28217a092245SBram Moolenaar      'vim9script',
28227a092245SBram Moolenaar      'echo "yes" # something',
28237a092245SBram Moolenaar      ])
28247a092245SBram Moolenaar  CheckScriptFailure([
28257a092245SBram Moolenaar      'vim9script',
28267a092245SBram Moolenaar      'echo "yes"# something',
28277a092245SBram Moolenaar      ], 'E121:')
28287a092245SBram Moolenaar  CheckScriptFailure([
28297a092245SBram Moolenaar      'vim9script',
28307a092245SBram Moolenaar      'echo# something',
2831f8103f27SBram Moolenaar      ], 'E1144:')
28327a092245SBram Moolenaar  CheckScriptFailure([
28337a092245SBram Moolenaar      'echo "yes" # something',
28347a092245SBram Moolenaar      ], 'E121:')
28357a092245SBram Moolenaar
28364a8d9f2eSBram Moolenaar  exe "echo" # comment
28374a8d9f2eSBram Moolenaar  CheckDefFailure([
28384a8d9f2eSBram Moolenaar      'exe "echo"# comment',
28394a8d9f2eSBram Moolenaar      ], 'E488:')
28404a8d9f2eSBram Moolenaar  CheckScriptSuccess([
28414a8d9f2eSBram Moolenaar      'vim9script',
28424a8d9f2eSBram Moolenaar      'exe "echo" # something',
28434a8d9f2eSBram Moolenaar      ])
28444a8d9f2eSBram Moolenaar  CheckScriptFailure([
28454a8d9f2eSBram Moolenaar      'vim9script',
28464a8d9f2eSBram Moolenaar      'exe "echo"# something',
28474a8d9f2eSBram Moolenaar      ], 'E121:')
28484a8d9f2eSBram Moolenaar  CheckScriptFailure([
28494a8d9f2eSBram Moolenaar      'vim9script',
28504a8d9f2eSBram Moolenaar      'exe# something',
2851f8103f27SBram Moolenaar      ], 'E1144:')
28524a8d9f2eSBram Moolenaar  CheckScriptFailure([
28534a8d9f2eSBram Moolenaar      'exe "echo" # something',
28544a8d9f2eSBram Moolenaar      ], 'E121:')
28554a8d9f2eSBram Moolenaar
28567a092245SBram Moolenaar  CheckDefFailure([
28577a092245SBram Moolenaar      'try# comment',
28587a092245SBram Moolenaar      '  echo "yes"',
28597a092245SBram Moolenaar      'catch',
28607a092245SBram Moolenaar      'endtry',
2861f8103f27SBram Moolenaar      ], 'E1144:')
28622c5ed4e3SBram Moolenaar  CheckScriptFailure([
28632c5ed4e3SBram Moolenaar      'vim9script',
28642c5ed4e3SBram Moolenaar      'try# comment',
28652c5ed4e3SBram Moolenaar      'echo "yes"',
2866f8103f27SBram Moolenaar      ], 'E1144:')
28677a092245SBram Moolenaar  CheckDefFailure([
28687a092245SBram Moolenaar      'try',
2869a72cfb80SBram Moolenaar      '  throw#comment',
2870a72cfb80SBram Moolenaar      'catch',
2871a72cfb80SBram Moolenaar      'endtry',
2872f8103f27SBram Moolenaar      ], 'E1144:')
2873a72cfb80SBram Moolenaar  CheckDefFailure([
2874a72cfb80SBram Moolenaar      'try',
2875a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2876a72cfb80SBram Moolenaar      'catch',
2877a72cfb80SBram Moolenaar      'endtry',
2878a72cfb80SBram Moolenaar      ], 'E488:')
2879a72cfb80SBram Moolenaar  CheckDefFailure([
2880a72cfb80SBram Moolenaar      'try',
28817a092245SBram Moolenaar      '  echo "yes"',
28827a092245SBram Moolenaar      'catch# comment',
28837a092245SBram Moolenaar      'endtry',
2884f8103f27SBram Moolenaar      ], 'E1144:')
28852c5ed4e3SBram Moolenaar  CheckScriptFailure([
28862c5ed4e3SBram Moolenaar      'vim9script',
28872c5ed4e3SBram Moolenaar      'try',
28882c5ed4e3SBram Moolenaar      '  echo "yes"',
28892c5ed4e3SBram Moolenaar      'catch# comment',
28902c5ed4e3SBram Moolenaar      'endtry',
2891f8103f27SBram Moolenaar      ], 'E1144:')
28922c5ed4e3SBram Moolenaar  CheckDefFailure([
28932c5ed4e3SBram Moolenaar      'try',
28942c5ed4e3SBram Moolenaar      '  echo "yes"',
28952c5ed4e3SBram Moolenaar      'catch /pat/# comment',
28962c5ed4e3SBram Moolenaar      'endtry',
28972c5ed4e3SBram Moolenaar      ], 'E488:')
28987a092245SBram Moolenaar  CheckDefFailure([
28997a092245SBram Moolenaar      'try',
29007a092245SBram Moolenaar      'echo "yes"',
29017a092245SBram Moolenaar      'catch',
29027a092245SBram Moolenaar      'endtry# comment',
2903f8103f27SBram Moolenaar      ], 'E1144:')
29042c5ed4e3SBram Moolenaar  CheckScriptFailure([
29052c5ed4e3SBram Moolenaar      'vim9script',
29062c5ed4e3SBram Moolenaar      'try',
29072c5ed4e3SBram Moolenaar      '  echo "yes"',
29082c5ed4e3SBram Moolenaar      'catch',
29092c5ed4e3SBram Moolenaar      'endtry# comment',
2910f8103f27SBram Moolenaar      ], 'E1144:')
29112c5ed4e3SBram Moolenaar
29122c5ed4e3SBram Moolenaar  CheckScriptSuccess([
29132c5ed4e3SBram Moolenaar      'vim9script',
29142c5ed4e3SBram Moolenaar      'hi # comment',
29152c5ed4e3SBram Moolenaar      ])
29162c5ed4e3SBram Moolenaar  CheckScriptFailure([
29172c5ed4e3SBram Moolenaar      'vim9script',
29182c5ed4e3SBram Moolenaar      'hi# comment',
2919f8103f27SBram Moolenaar      ], 'E1144:')
29201966c248SBram Moolenaar  CheckScriptSuccess([
29211966c248SBram Moolenaar      'vim9script',
29221966c248SBram Moolenaar      'hi Search # comment',
29231966c248SBram Moolenaar      ])
29241966c248SBram Moolenaar  CheckScriptFailure([
29251966c248SBram Moolenaar      'vim9script',
29261966c248SBram Moolenaar      'hi Search# comment',
29271966c248SBram Moolenaar      ], 'E416:')
29281966c248SBram Moolenaar  CheckScriptSuccess([
29291966c248SBram Moolenaar      'vim9script',
29301966c248SBram Moolenaar      'hi link This Search # comment',
29311966c248SBram Moolenaar      ])
29321966c248SBram Moolenaar  CheckScriptFailure([
29331966c248SBram Moolenaar      'vim9script',
29341966c248SBram Moolenaar      'hi link This That# comment',
29351966c248SBram Moolenaar      ], 'E413:')
29361966c248SBram Moolenaar  CheckScriptSuccess([
29371966c248SBram Moolenaar      'vim9script',
29381966c248SBram Moolenaar      'hi clear This # comment',
29391966c248SBram Moolenaar      'hi clear # comment',
29401966c248SBram Moolenaar      ])
2941f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2942f5be8cdbSBram Moolenaar  # hi clear This# comment',
29431966c248SBram Moolenaar  CheckScriptFailure([
29441966c248SBram Moolenaar      'vim9script',
29451966c248SBram Moolenaar      'hi clear# comment',
29461966c248SBram Moolenaar      ], 'E416:')
29471966c248SBram Moolenaar
29481966c248SBram Moolenaar  CheckScriptSuccess([
29491966c248SBram Moolenaar      'vim9script',
29501966c248SBram Moolenaar      'hi Group term=bold',
29511966c248SBram Moolenaar      'match Group /todo/ # comment',
29521966c248SBram Moolenaar      ])
29531966c248SBram Moolenaar  CheckScriptFailure([
29541966c248SBram Moolenaar      'vim9script',
29551966c248SBram Moolenaar      'hi Group term=bold',
29561966c248SBram Moolenaar      'match Group /todo/# comment',
29571966c248SBram Moolenaar      ], 'E488:')
29581966c248SBram Moolenaar  CheckScriptSuccess([
29591966c248SBram Moolenaar      'vim9script',
29601966c248SBram Moolenaar      'match # comment',
29611966c248SBram Moolenaar      ])
29621966c248SBram Moolenaar  CheckScriptFailure([
29631966c248SBram Moolenaar      'vim9script',
29641966c248SBram Moolenaar      'match# comment',
2965f8103f27SBram Moolenaar      ], 'E1144:')
29661966c248SBram Moolenaar  CheckScriptSuccess([
29671966c248SBram Moolenaar      'vim9script',
29681966c248SBram Moolenaar      'match none # comment',
29691966c248SBram Moolenaar      ])
29701966c248SBram Moolenaar  CheckScriptFailure([
29711966c248SBram Moolenaar      'vim9script',
29721966c248SBram Moolenaar      'match none# comment',
29731966c248SBram Moolenaar      ], 'E475:')
29741966c248SBram Moolenaar
29751966c248SBram Moolenaar  CheckScriptSuccess([
29761966c248SBram Moolenaar      'vim9script',
29771966c248SBram Moolenaar      'menutrans clear # comment',
29781966c248SBram Moolenaar      ])
29791966c248SBram Moolenaar  CheckScriptFailure([
29801966c248SBram Moolenaar      'vim9script',
29811966c248SBram Moolenaar      'menutrans clear# comment text',
29821966c248SBram Moolenaar      ], 'E474:')
29831966c248SBram Moolenaar
29841966c248SBram Moolenaar  CheckScriptSuccess([
29851966c248SBram Moolenaar      'vim9script',
29861966c248SBram Moolenaar      'syntax clear # comment',
29871966c248SBram Moolenaar      ])
29881966c248SBram Moolenaar  CheckScriptFailure([
29891966c248SBram Moolenaar      'vim9script',
29901966c248SBram Moolenaar      'syntax clear# comment text',
29911966c248SBram Moolenaar      ], 'E28:')
29921966c248SBram Moolenaar  CheckScriptSuccess([
29931966c248SBram Moolenaar      'vim9script',
29941966c248SBram Moolenaar      'syntax keyword Word some',
29951966c248SBram Moolenaar      'syntax clear Word # comment',
29961966c248SBram Moolenaar      ])
29971966c248SBram Moolenaar  CheckScriptFailure([
29981966c248SBram Moolenaar      'vim9script',
29991966c248SBram Moolenaar      'syntax keyword Word some',
30001966c248SBram Moolenaar      'syntax clear Word# comment text',
30011966c248SBram Moolenaar      ], 'E28:')
30021966c248SBram Moolenaar
30031966c248SBram Moolenaar  CheckScriptSuccess([
30041966c248SBram Moolenaar      'vim9script',
30051966c248SBram Moolenaar      'syntax list # comment',
30061966c248SBram Moolenaar      ])
30071966c248SBram Moolenaar  CheckScriptFailure([
30081966c248SBram Moolenaar      'vim9script',
30091966c248SBram Moolenaar      'syntax list# comment text',
30101966c248SBram Moolenaar      ], 'E28:')
30111966c248SBram Moolenaar
30121966c248SBram Moolenaar  CheckScriptSuccess([
30131966c248SBram Moolenaar      'vim9script',
30141966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
30151966c248SBram Moolenaar      ])
30161966c248SBram Moolenaar  CheckScriptFailure([
30171966c248SBram Moolenaar      'vim9script',
30181966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
30191966c248SBram Moolenaar      ], 'E475:')
30201966c248SBram Moolenaar
30211966c248SBram Moolenaar  CheckScriptSuccess([
30221966c248SBram Moolenaar      'vim9script',
30231966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
30241966c248SBram Moolenaar      ])
30251966c248SBram Moolenaar  CheckScriptFailure([
30261966c248SBram Moolenaar      'vim9script',
30271966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
30281966c248SBram Moolenaar      ], 'E789:')
30291966c248SBram Moolenaar
30301966c248SBram Moolenaar  CheckScriptSuccess([
30311966c248SBram Moolenaar      'vim9script',
30321966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
30331966c248SBram Moolenaar      ])
30341966c248SBram Moolenaar  CheckScriptFailure([
30351966c248SBram Moolenaar      'vim9script',
30361966c248SBram Moolenaar      'syntax match Word /pat/# comment',
30371966c248SBram Moolenaar      ], 'E402:')
30381966c248SBram Moolenaar
30391966c248SBram Moolenaar  CheckScriptSuccess([
30401966c248SBram Moolenaar      'vim9script',
30411966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
30421966c248SBram Moolenaar      ])
30431966c248SBram Moolenaar  CheckScriptFailure([
30441966c248SBram Moolenaar      'vim9script',
30451966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
30461966c248SBram Moolenaar      ], 'E475:')
30471966c248SBram Moolenaar  CheckScriptFailure([
30481966c248SBram Moolenaar      'vim9script',
30491966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
30501966c248SBram Moolenaar      ], 'E406:')
30511966c248SBram Moolenaar  CheckScriptFailure([
30521966c248SBram Moolenaar      'vim9script',
30531966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
30541966c248SBram Moolenaar      ], 'E475:')
30551966c248SBram Moolenaar
30561966c248SBram Moolenaar  CheckScriptSuccess([
30571966c248SBram Moolenaar      'vim9script',
30581966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
30591966c248SBram Moolenaar      ])
30601966c248SBram Moolenaar  CheckScriptFailure([
30611966c248SBram Moolenaar      'vim9script',
30621966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
3063d032f34aSBram Moolenaar      ], 'E402:')
30641966c248SBram Moolenaar
30651966c248SBram Moolenaar  CheckScriptSuccess([
30661966c248SBram Moolenaar      'vim9script',
30671966c248SBram Moolenaar      'syntax sync # comment',
30681966c248SBram Moolenaar      ])
30691966c248SBram Moolenaar  CheckScriptFailure([
30701966c248SBram Moolenaar      'vim9script',
30711966c248SBram Moolenaar      'syntax sync# comment',
30721966c248SBram Moolenaar      ], 'E404:')
30731966c248SBram Moolenaar  CheckScriptSuccess([
30741966c248SBram Moolenaar      'vim9script',
30751966c248SBram Moolenaar      'syntax sync ccomment # comment',
30761966c248SBram Moolenaar      ])
30771966c248SBram Moolenaar  CheckScriptFailure([
30781966c248SBram Moolenaar      'vim9script',
30791966c248SBram Moolenaar      'syntax sync ccomment# comment',
30801966c248SBram Moolenaar      ], 'E404:')
30811966c248SBram Moolenaar
30821966c248SBram Moolenaar  CheckScriptSuccess([
30831966c248SBram Moolenaar      'vim9script',
30841966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
30851966c248SBram Moolenaar      ])
30861966c248SBram Moolenaar  CheckScriptFailure([
30871966c248SBram Moolenaar      'vim9script',
30881966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
30891966c248SBram Moolenaar      ], 'E475:')
3090a72cfb80SBram Moolenaar
3091a72cfb80SBram Moolenaar  CheckScriptSuccess([
3092a72cfb80SBram Moolenaar      'vim9script',
3093a72cfb80SBram Moolenaar      'command Echo echo # comment',
3094a72cfb80SBram Moolenaar      'command Echo # comment',
30952d870f8dSBram Moolenaar      'delcommand Echo',
3096a72cfb80SBram Moolenaar      ])
3097a72cfb80SBram Moolenaar  CheckScriptFailure([
3098a72cfb80SBram Moolenaar      'vim9script',
3099a72cfb80SBram Moolenaar      'command Echo echo# comment',
3100a72cfb80SBram Moolenaar      'Echo',
3101f8103f27SBram Moolenaar      ], 'E1144:')
31022d870f8dSBram Moolenaar  delcommand Echo
310370249ee8SBram Moolenaar
310470249ee8SBram Moolenaar  var curdir = getcwd()
310570249ee8SBram Moolenaar  CheckScriptSuccess([
310670249ee8SBram Moolenaar      'command Echo cd " comment',
310770249ee8SBram Moolenaar      'Echo',
310870249ee8SBram Moolenaar      'delcommand Echo',
310970249ee8SBram Moolenaar      ])
311070249ee8SBram Moolenaar  CheckScriptSuccess([
3111090728adSBram Moolenaar      'vim9script',
311270249ee8SBram Moolenaar      'command Echo cd # comment',
311370249ee8SBram Moolenaar      'Echo',
311470249ee8SBram Moolenaar      'delcommand Echo',
311570249ee8SBram Moolenaar      ])
311670249ee8SBram Moolenaar  CheckScriptFailure([
311770249ee8SBram Moolenaar      'vim9script',
311870249ee8SBram Moolenaar      'command Echo cd " comment',
311970249ee8SBram Moolenaar      'Echo',
312070249ee8SBram Moolenaar      ], 'E344:')
312170249ee8SBram Moolenaar  delcommand Echo
312270249ee8SBram Moolenaar  chdir(curdir)
312370249ee8SBram Moolenaar
3124a72cfb80SBram Moolenaar  CheckScriptFailure([
3125a72cfb80SBram Moolenaar      'vim9script',
3126a72cfb80SBram Moolenaar      'command Echo# comment',
3127a72cfb80SBram Moolenaar      ], 'E182:')
3128a72cfb80SBram Moolenaar  CheckScriptFailure([
3129a72cfb80SBram Moolenaar      'vim9script',
3130a72cfb80SBram Moolenaar      'command Echo echo',
3131a72cfb80SBram Moolenaar      'command Echo# comment',
3132a72cfb80SBram Moolenaar      ], 'E182:')
31332d870f8dSBram Moolenaar  delcommand Echo
3134a72cfb80SBram Moolenaar
3135a72cfb80SBram Moolenaar  CheckScriptSuccess([
3136a72cfb80SBram Moolenaar      'vim9script',
3137a72cfb80SBram Moolenaar      'function # comment',
3138a72cfb80SBram Moolenaar      ])
3139a72cfb80SBram Moolenaar  CheckScriptFailure([
3140a72cfb80SBram Moolenaar      'vim9script',
31419898107fSBram Moolenaar      'function " comment',
31429898107fSBram Moolenaar      ], 'E129:')
31439898107fSBram Moolenaar  CheckScriptFailure([
31449898107fSBram Moolenaar      'vim9script',
3145a72cfb80SBram Moolenaar      'function# comment',
3146f8103f27SBram Moolenaar      ], 'E1144:')
3147a72cfb80SBram Moolenaar  CheckScriptSuccess([
3148a72cfb80SBram Moolenaar      'vim9script',
3149a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
3150a72cfb80SBram Moolenaar      ])
3151a72cfb80SBram Moolenaar  CheckScriptFailure([
3152a72cfb80SBram Moolenaar      'vim9script',
3153a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
3154a72cfb80SBram Moolenaar      ], 'E488:')
3155a72cfb80SBram Moolenaar
3156a72cfb80SBram Moolenaar  CheckScriptSuccess([
3157a72cfb80SBram Moolenaar      'vim9script',
31584c17ad94SBram Moolenaar      'func g:DeleteMeA()',
3159a72cfb80SBram Moolenaar      'endfunc',
31604c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
3161a72cfb80SBram Moolenaar      ])
3162a72cfb80SBram Moolenaar  CheckScriptFailure([
3163a72cfb80SBram Moolenaar      'vim9script',
31644c17ad94SBram Moolenaar      'func g:DeleteMeB()',
3165a72cfb80SBram Moolenaar      'endfunc',
31664c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
3167a72cfb80SBram Moolenaar      ], 'E488:')
3168a72cfb80SBram Moolenaar
3169a72cfb80SBram Moolenaar  CheckScriptSuccess([
3170a72cfb80SBram Moolenaar      'vim9script',
3171a72cfb80SBram Moolenaar      'call execute("ls") # comment',
3172a72cfb80SBram Moolenaar      ])
3173a72cfb80SBram Moolenaar  CheckScriptFailure([
3174a72cfb80SBram Moolenaar      'vim9script',
3175a72cfb80SBram Moolenaar      'call execute("ls")# comment',
3176a72cfb80SBram Moolenaar      ], 'E488:')
3177e7e4838fSBram Moolenaar
3178e7e4838fSBram Moolenaar  CheckScriptFailure([
3179e7e4838fSBram Moolenaar      'def Test() " comment',
3180e7e4838fSBram Moolenaar      'enddef',
3181e7e4838fSBram Moolenaar      ], 'E488:')
3182e7e4838fSBram Moolenaar  CheckScriptFailure([
3183e7e4838fSBram Moolenaar      'vim9script',
3184e7e4838fSBram Moolenaar      'def Test() " comment',
3185e7e4838fSBram Moolenaar      'enddef',
3186e7e4838fSBram Moolenaar      ], 'E488:')
3187e7e4838fSBram Moolenaar
3188e7e4838fSBram Moolenaar  CheckScriptSuccess([
3189e7e4838fSBram Moolenaar      'func Test() " comment',
3190e7e4838fSBram Moolenaar      'endfunc',
31912d870f8dSBram Moolenaar      'delfunc Test',
3192e7e4838fSBram Moolenaar      ])
31939898107fSBram Moolenaar  CheckScriptSuccess([
3194e7e4838fSBram Moolenaar      'vim9script',
3195e7e4838fSBram Moolenaar      'func Test() " comment',
3196e7e4838fSBram Moolenaar      'endfunc',
31979898107fSBram Moolenaar      ])
3198e7e4838fSBram Moolenaar
3199e7e4838fSBram Moolenaar  CheckScriptSuccess([
3200e7e4838fSBram Moolenaar      'def Test() # comment',
3201e7e4838fSBram Moolenaar      'enddef',
3202e7e4838fSBram Moolenaar      ])
3203e7e4838fSBram Moolenaar  CheckScriptFailure([
3204e7e4838fSBram Moolenaar      'func Test() # comment',
3205e7e4838fSBram Moolenaar      'endfunc',
3206e7e4838fSBram Moolenaar      ], 'E488:')
32070f37e356SBram Moolenaar
32080f37e356SBram Moolenaar  var lines =<< trim END
32090f37e356SBram Moolenaar      vim9script
32100f37e356SBram Moolenaar      syn region Text
32110f37e356SBram Moolenaar      \ start='foo'
32120f37e356SBram Moolenaar      #\ comment
32130f37e356SBram Moolenaar      \ end='bar'
32145072b47aSBram Moolenaar      syn region Text start='foo'
32155072b47aSBram Moolenaar      #\ comment
32165072b47aSBram Moolenaar      \ end='bar'
32170f37e356SBram Moolenaar  END
32180f37e356SBram Moolenaar  CheckScriptSuccess(lines)
32190f37e356SBram Moolenaar
32200f37e356SBram Moolenaar  lines =<< trim END
32210f37e356SBram Moolenaar      vim9script
32220f37e356SBram Moolenaar      syn region Text
32230f37e356SBram Moolenaar      \ start='foo'
32240f37e356SBram Moolenaar      "\ comment
32250f37e356SBram Moolenaar      \ end='bar'
32260f37e356SBram Moolenaar  END
32270f37e356SBram Moolenaar  CheckScriptFailure(lines, 'E399:')
32282c5ed4e3SBram Moolenaarenddef
32292c5ed4e3SBram Moolenaar
32302c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
32312c5ed4e3SBram Moolenaar  CheckCanRunGui
32322c5ed4e3SBram Moolenaar
32332c5ed4e3SBram Moolenaar  CheckScriptFailure([
32342c5ed4e3SBram Moolenaar      'vim9script',
32352c5ed4e3SBram Moolenaar      'gui#comment'
3236f8103f27SBram Moolenaar      ], 'E1144:')
32372c5ed4e3SBram Moolenaar  CheckScriptFailure([
32382c5ed4e3SBram Moolenaar      'vim9script',
32392c5ed4e3SBram Moolenaar      'gui -f#comment'
32402c5ed4e3SBram Moolenaar      ], 'E499:')
32417a092245SBram Moolenaarenddef
32427a092245SBram Moolenaar
3243a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
32446797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
32456797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3246a26b9700SBram Moolenaar
3247a26b9700SBram Moolenaar  edit test.vim
3248a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3249a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3250a26b9700SBram Moolenaar
3251a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3252a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3253a26b9700SBram Moolenaar
3254a26b9700SBram Moolenaar  g:entered = 0
3255a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3256a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3257a26b9700SBram Moolenaar
3258a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3259a26b9700SBram Moolenaar
3260a26b9700SBram Moolenaar  au! TabEnter
3261a26b9700SBram Moolenaar  unlet g:entered
3262d72c1bf0SBram Moolenaar
3263d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3264d72c1bf0SBram Moolenaar      'vim9script',
32656797966dSBram Moolenaar      'g:var = 123',
3266e55b1c09SBram Moolenaar      'b:var = 456',
3267e55b1c09SBram Moolenaar      'w:var = 777',
3268e55b1c09SBram Moolenaar      't:var = 888',
3269d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3270d72c1bf0SBram Moolenaar      ])
3271d72c1bf0SBram Moolenaar
3272d72c1bf0SBram Moolenaar  CheckScriptFailure([
3273d72c1bf0SBram Moolenaar      'vim9script',
3274cfcd011fSBram Moolenaar      'let var = 123',
3275cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3276cfcd011fSBram Moolenaar
3277cfcd011fSBram Moolenaar  CheckScriptFailure([
3278cfcd011fSBram Moolenaar      'vim9script',
3279cfcd011fSBram Moolenaar      'var g:var = 123',
3280e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3281e55b1c09SBram Moolenaar
3282e55b1c09SBram Moolenaar  CheckScriptFailure([
3283e55b1c09SBram Moolenaar      'vim9script',
3284cfcd011fSBram Moolenaar      'var b:var = 123',
3285e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3286e55b1c09SBram Moolenaar
3287e55b1c09SBram Moolenaar  CheckScriptFailure([
3288e55b1c09SBram Moolenaar      'vim9script',
3289cfcd011fSBram Moolenaar      'var w:var = 123',
3290e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3291e55b1c09SBram Moolenaar
3292e55b1c09SBram Moolenaar  CheckScriptFailure([
3293e55b1c09SBram Moolenaar      'vim9script',
3294cfcd011fSBram Moolenaar      'var t:var = 123',
3295e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3296e55b1c09SBram Moolenaar
3297e55b1c09SBram Moolenaar  CheckScriptFailure([
3298e55b1c09SBram Moolenaar      'vim9script',
3299cfcd011fSBram Moolenaar      'var v:version = 123',
3300e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3301e55b1c09SBram Moolenaar
3302e55b1c09SBram Moolenaar  CheckScriptFailure([
3303e55b1c09SBram Moolenaar      'vim9script',
3304cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3305e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
33066797966dSBram Moolenaar
33076797966dSBram Moolenaar  CheckScriptFailure([
33086797966dSBram Moolenaar      'vim9script',
33096797966dSBram Moolenaar      'g:var = 123',
331032e35117SBram Moolenaar      'unlet g:var# comment1',
3311d72c1bf0SBram Moolenaar      ], 'E108:')
3312d72c1bf0SBram Moolenaar
3313d72c1bf0SBram Moolenaar  CheckScriptFailure([
3314d72c1bf0SBram Moolenaar      'let g:var = 123',
3315d72c1bf0SBram Moolenaar      'unlet g:var # something',
3316d72c1bf0SBram Moolenaar      ], 'E488:')
3317faac4104SBram Moolenaar
3318faac4104SBram Moolenaar  CheckScriptSuccess([
3319faac4104SBram Moolenaar      'vim9script',
332032e35117SBram Moolenaar      'if 1 # comment2',
3321faac4104SBram Moolenaar      '  echo "yes"',
3322faac4104SBram Moolenaar      'elseif 2 #comment',
3323faac4104SBram Moolenaar      '  echo "no"',
3324faac4104SBram Moolenaar      'endif',
3325faac4104SBram Moolenaar      ])
3326faac4104SBram Moolenaar
3327faac4104SBram Moolenaar  CheckScriptFailure([
3328faac4104SBram Moolenaar      'vim9script',
332932e35117SBram Moolenaar      'if 1# comment3',
3330faac4104SBram Moolenaar      '  echo "yes"',
3331faac4104SBram Moolenaar      'endif',
3332fae55a9cSBram Moolenaar      ], 'E488:')
3333faac4104SBram Moolenaar
3334faac4104SBram Moolenaar  CheckScriptFailure([
3335faac4104SBram Moolenaar      'vim9script',
333632e35117SBram Moolenaar      'if 0 # comment4',
3337faac4104SBram Moolenaar      '  echo "yes"',
3338faac4104SBram Moolenaar      'elseif 2#comment',
3339faac4104SBram Moolenaar      '  echo "no"',
3340faac4104SBram Moolenaar      'endif',
3341fae55a9cSBram Moolenaar      ], 'E488:')
3342faac4104SBram Moolenaar
3343faac4104SBram Moolenaar  CheckScriptSuccess([
3344faac4104SBram Moolenaar      'vim9script',
3345cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3346faac4104SBram Moolenaar      ])
3347faac4104SBram Moolenaar
3348faac4104SBram Moolenaar  CheckScriptFailure([
3349faac4104SBram Moolenaar      'vim9script',
3350cfcd011fSBram Moolenaar      'var v = 1# comment6',
3351fae55a9cSBram Moolenaar      ], 'E488:')
3352faac4104SBram Moolenaar
3353faac4104SBram Moolenaar  CheckScriptSuccess([
3354faac4104SBram Moolenaar      'vim9script',
3355faac4104SBram Moolenaar      'new'
3356d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3357df069eecSBram Moolenaar      ':$',
3358faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3359faac4104SBram Moolenaar      'bwipe!',
3360faac4104SBram Moolenaar      ])
3361faac4104SBram Moolenaar
3362f5be8cdbSBram Moolenaar  CheckScriptFailure([
3363f5be8cdbSBram Moolenaar      'vim9script',
3364f5be8cdbSBram Moolenaar      'new'
3365d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3366f5be8cdbSBram Moolenaar      ':$',
3367f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3368f5be8cdbSBram Moolenaar      'bwipe!',
3369f5be8cdbSBram Moolenaar      ], 'E488:')
3370f5be8cdbSBram Moolenaar
3371f5be8cdbSBram Moolenaar  CheckScriptFailure([
3372f5be8cdbSBram Moolenaar      'vim9script',
3373f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3374f5be8cdbSBram Moolenaar      ], 'E477:')
3375a26b9700SBram Moolenaarenddef
3376a26b9700SBram Moolenaar
33777e5bd91dSBram Moolenaardef Test_finish()
3378cfcd011fSBram Moolenaar  var lines =<< trim END
33797e5bd91dSBram Moolenaar    vim9script
33806797966dSBram Moolenaar    g:res = 'one'
33817e5bd91dSBram Moolenaar    if v:false | finish | endif
33826797966dSBram Moolenaar    g:res = 'two'
33837e5bd91dSBram Moolenaar    finish
33846797966dSBram Moolenaar    g:res = 'three'
33857e5bd91dSBram Moolenaar  END
33867e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
33877e5bd91dSBram Moolenaar  source Xfinished
33887e5bd91dSBram Moolenaar  assert_equal('two', g:res)
33897e5bd91dSBram Moolenaar
33907e5bd91dSBram Moolenaar  unlet g:res
33917e5bd91dSBram Moolenaar  delete('Xfinished')
33927e5bd91dSBram Moolenaarenddef
33937e5bd91dSBram Moolenaar
3394a5d0077eSBram Moolenaardef Test_forward_declaration()
3395cfcd011fSBram Moolenaar  var lines =<< trim END
3396a5d0077eSBram Moolenaar    vim9script
3397a5d0077eSBram Moolenaar    def GetValue(): string
3398a5d0077eSBram Moolenaar      return theVal
3399a5d0077eSBram Moolenaar    enddef
3400cfcd011fSBram Moolenaar    var theVal = 'something'
3401822ba247SBram Moolenaar    g:initVal = GetValue()
3402a5d0077eSBram Moolenaar    theVal = 'else'
3403a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3404a5d0077eSBram Moolenaar  END
3405a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3406a5d0077eSBram Moolenaar  source Xforward
3407a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3408a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3409a5d0077eSBram Moolenaar
3410a5d0077eSBram Moolenaar  unlet g:initVal
3411a5d0077eSBram Moolenaar  unlet g:laterVal
3412a5d0077eSBram Moolenaar  delete('Xforward')
3413a5d0077eSBram Moolenaarenddef
3414a5d0077eSBram Moolenaar
34159721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3416a6294955SBram Moolenaar  var vim9_lines =<< trim END
3417a6294955SBram Moolenaar    vim9script
3418a6294955SBram Moolenaar    var local = 'local'
3419a6294955SBram Moolenaar    g:global = 'global'
3420a6294955SBram Moolenaar    export var exported = 'exported'
3421a6294955SBram Moolenaar    export def GetText(): string
3422a6294955SBram Moolenaar       return 'text'
3423a6294955SBram Moolenaar    enddef
3424a6294955SBram Moolenaar  END
3425a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3426a6294955SBram Moolenaar
3427cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
34289721fb4eSBram Moolenaar    source Xvim9_script.vim
34299721fb4eSBram Moolenaar
34309721fb4eSBram Moolenaar    call assert_false(exists('local'))
34319721fb4eSBram Moolenaar    call assert_false(exists('exported'))
34329721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
34339721fb4eSBram Moolenaar    call assert_equal('global', global)
34349721fb4eSBram Moolenaar    call assert_equal('global', g:global)
34359721fb4eSBram Moolenaar
34369721fb4eSBram Moolenaar    " imported variable becomes script-local
34379721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
34389721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
34399721fb4eSBram Moolenaar    call assert_false(exists('exported'))
34409721fb4eSBram Moolenaar
34419721fb4eSBram Moolenaar    " imported function becomes script-local
34429721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
34439721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
34449721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
34459721fb4eSBram Moolenaar  END
34469721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
34479721fb4eSBram Moolenaar
34489721fb4eSBram Moolenaar  source Xlegacy_script.vim
34499721fb4eSBram Moolenaar  assert_equal('global', g:global)
3450f5be8cdbSBram Moolenaar  unlet g:global
34519721fb4eSBram Moolenaar
34529721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
34539721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
34549721fb4eSBram Moolenaarenddef
3455a5d0077eSBram Moolenaar
3456e535db86SBram Moolenaardef Test_declare_script_in_func()
3457e535db86SBram Moolenaar  var lines =<< trim END
3458e535db86SBram Moolenaar      vim9script
3459e535db86SBram Moolenaar      func Declare()
3460e535db86SBram Moolenaar        let s:local = 123
3461e535db86SBram Moolenaar      endfunc
3462e535db86SBram Moolenaar      Declare()
3463e535db86SBram Moolenaar      assert_equal(123, local)
3464e535db86SBram Moolenaar
3465e535db86SBram Moolenaar      var error: string
3466e535db86SBram Moolenaar      try
3467e535db86SBram Moolenaar        local = 'asdf'
3468e535db86SBram Moolenaar      catch
3469e535db86SBram Moolenaar        error = v:exception
3470e535db86SBram Moolenaar      endtry
3471e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3472e535db86SBram Moolenaar
3473e535db86SBram Moolenaar      lockvar local
3474e535db86SBram Moolenaar      try
3475e535db86SBram Moolenaar        local = 999
3476e535db86SBram Moolenaar      catch
3477e535db86SBram Moolenaar        error = v:exception
3478e535db86SBram Moolenaar      endtry
3479e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3480e535db86SBram Moolenaar  END
3481e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3482e535db86SBram Moolenaarenddef
3483e535db86SBram Moolenaar
3484e535db86SBram Moolenaar
34857d699701SBram Moolenaarfunc Test_vim9script_not_global()
34867d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
34877d699701SBram Moolenaar  let vim9lines =<< trim END
34887d699701SBram Moolenaar    vim9script
3489cfcd011fSBram Moolenaar    var name = 'local'
34907d699701SBram Moolenaar    func TheFunc()
34917d699701SBram Moolenaar      echo 'local'
34927d699701SBram Moolenaar    endfunc
34937d699701SBram Moolenaar    def DefFunc()
34947d699701SBram Moolenaar      echo 'local'
34957d699701SBram Moolenaar    enddef
34967d699701SBram Moolenaar  END
34977d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
34987d699701SBram Moolenaar  source Xvim9script.vim
34997d699701SBram Moolenaar  try
35007d699701SBram Moolenaar    echo g:var
35017d699701SBram Moolenaar    assert_report('did not fail')
35027d699701SBram Moolenaar  catch /E121:/
35037d699701SBram Moolenaar    " caught
35047d699701SBram Moolenaar  endtry
35057d699701SBram Moolenaar  try
35067d699701SBram Moolenaar    call TheFunc()
35077d699701SBram Moolenaar    assert_report('did not fail')
35087d699701SBram Moolenaar  catch /E117:/
35097d699701SBram Moolenaar    " caught
35107d699701SBram Moolenaar  endtry
35117d699701SBram Moolenaar  try
35127d699701SBram Moolenaar    call DefFunc()
35137d699701SBram Moolenaar    assert_report('did not fail')
35147d699701SBram Moolenaar  catch /E117:/
35157d699701SBram Moolenaar    " caught
35167d699701SBram Moolenaar  endtry
35177d699701SBram Moolenaar
351825859dd7SBram Moolenaar  call delete('Xvim9script.vim')
35197d699701SBram Moolenaarendfunc
35207d699701SBram Moolenaar
3521eeb27bfeSBram Moolenaardef Test_vim9_copen()
3522eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3523eeb27bfeSBram Moolenaar  copen
3524eeb27bfeSBram Moolenaar  quit
3525eeb27bfeSBram Moolenaarenddef
3526eeb27bfeSBram Moolenaar
352703290b84SBram Moolenaar" test using an auto-loaded function and variable
35282d6b20d6SBram Moolenaardef Test_vim9_autoload()
3529cfcd011fSBram Moolenaar  var lines =<< trim END
35302d6b20d6SBram Moolenaar     vim9script
353103290b84SBram Moolenaar     def some#gettest(): string
353203290b84SBram Moolenaar       return 'test'
353303290b84SBram Moolenaar     enddef
353403290b84SBram Moolenaar     g:some#name = 'name'
3535227c58a4SBram Moolenaar     g:some#dict = {key: 'value'}
3536e3ffcd99SBram Moolenaar
3537e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3538e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3539e3ffcd99SBram Moolenaar     enddef
354003290b84SBram Moolenaar  END
354103290b84SBram Moolenaar
354203290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
354303290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
354403290b84SBram Moolenaar  var save_rtp = &rtp
354503290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
354603290b84SBram Moolenaar
354703290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
354803290b84SBram Moolenaar  assert_equal('name', g:some#name)
3549227c58a4SBram Moolenaar  assert_equal('value', g:some#dict.key)
355003290b84SBram Moolenaar  g:some#other = 'other'
355103290b84SBram Moolenaar  assert_equal('other', g:some#other)
355203290b84SBram Moolenaar
3553e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3554e3ffcd99SBram Moolenaar
355517f700acSBram Moolenaar  # upper case script name works
355617f700acSBram Moolenaar  lines =<< trim END
355717f700acSBram Moolenaar     vim9script
355817f700acSBram Moolenaar     def Other#getOther(): string
355917f700acSBram Moolenaar       return 'other'
356017f700acSBram Moolenaar     enddef
356117f700acSBram Moolenaar  END
356217f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
356317f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
356417f700acSBram Moolenaar
356503290b84SBram Moolenaar  delete('Xdir', 'rf')
356603290b84SBram Moolenaar  &rtp = save_rtp
356703290b84SBram Moolenaarenddef
356803290b84SBram Moolenaar
356903290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
357003290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
357103290b84SBram Moolenaar  var lines =<< trim END
357203290b84SBram Moolenaar     vim9script
35732d6b20d6SBram Moolenaar     def foo#test()
35742d6b20d6SBram Moolenaar         echomsg getreg('"')
35752d6b20d6SBram Moolenaar     enddef
35762d6b20d6SBram Moolenaar  END
35772d6b20d6SBram Moolenaar
35782d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
35792d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3580cfcd011fSBram Moolenaar  var save_rtp = &rtp
35812d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
35822d6b20d6SBram Moolenaar  augroup test
35832d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
35842d6b20d6SBram Moolenaar  augroup END
35852d6b20d6SBram Moolenaar
35862d6b20d6SBram Moolenaar  normal Y
35872d6b20d6SBram Moolenaar
35882d6b20d6SBram Moolenaar  augroup test
35892d6b20d6SBram Moolenaar    autocmd!
35902d6b20d6SBram Moolenaar  augroup END
35912d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
35922d6b20d6SBram Moolenaar  &rtp = save_rtp
35932d6b20d6SBram Moolenaarenddef
35942d6b20d6SBram Moolenaar
359577e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
359677e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3597cfcd011fSBram Moolenaar  var lines =<< trim END
359877e5dcc3SBram Moolenaar      vim9script
359977e5dcc3SBram Moolenaar      def crash#func()
360077e5dcc3SBram Moolenaar          try
360177e5dcc3SBram Moolenaar              for x in List()
360277e5dcc3SBram Moolenaar              endfor
360377e5dcc3SBram Moolenaar          catch
360477e5dcc3SBram Moolenaar          endtry
360577e5dcc3SBram Moolenaar          g:ok = true
360677e5dcc3SBram Moolenaar      enddef
360777e5dcc3SBram Moolenaar      fu List()
360877e5dcc3SBram Moolenaar          invalid
360977e5dcc3SBram Moolenaar      endfu
361077e5dcc3SBram Moolenaar      try
361148e11c10SBram Moolenaar          alsoinvalid
361277e5dcc3SBram Moolenaar      catch /wontmatch/
361377e5dcc3SBram Moolenaar      endtry
361477e5dcc3SBram Moolenaar  END
361577e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
361677e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
361777e5dcc3SBram Moolenaar
361877e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
361977e5dcc3SBram Moolenaar  lines =<< trim END
362077e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
362177e5dcc3SBram Moolenaar    call crash#func()
362277e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
36239c4f5520SBram Moolenaar    qall!
362477e5dcc3SBram Moolenaar  END
362577e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
362677e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
362777e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
362877e5dcc3SBram Moolenaar
362977e5dcc3SBram Moolenaar  delete('Xdidit')
363077e5dcc3SBram Moolenaar  delete('Xscript')
363177e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
363203290b84SBram Moolenaar
363303290b84SBram Moolenaar  lines =<< trim END
363403290b84SBram Moolenaar    vim9script
363503290b84SBram Moolenaar    var foo#bar = 'asdf'
363603290b84SBram Moolenaar  END
363703290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
363877e5dcc3SBram Moolenaarenddef
363977e5dcc3SBram Moolenaar
364081e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
364181e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
364281e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3643cfcd011fSBram Moolenaar  var lines =<< trim END
364481e17fbeSBram Moolenaar    let s:counter = 1
364581e17fbeSBram Moolenaar    def s:Func()
364681e17fbeSBram Moolenaar      au! CursorHold
364781e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
364881e17fbeSBram Moolenaar    enddef
364981e17fbeSBram Moolenaar    call s:Func()
365081e17fbeSBram Moolenaar    doau CursorHold
365181e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
365281e17fbeSBram Moolenaar    au! CursorHold
365381e17fbeSBram Moolenaar  END
365481e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
365581e17fbeSBram Moolenaarenddef
365681e17fbeSBram Moolenaar
36573896a105SBram Moolenaardef Test_cmdline_win()
36583896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
36593896a105SBram Moolenaar  # the command line window.
36603896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3661cfcd011fSBram Moolenaar  var export_lines =<< trim END
36623896a105SBram Moolenaar    vim9script
3663cfcd011fSBram Moolenaar    export var That = 'yes'
36643896a105SBram Moolenaar  END
36653896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3666cfcd011fSBram Moolenaar  var import_lines =<< trim END
36673896a105SBram Moolenaar    vim9script
36683896a105SBram Moolenaar    import That from './Xexport.vim'
36693896a105SBram Moolenaar  END
36703896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3671cfcd011fSBram Moolenaar  var save_rtp = &rtp
36723896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
36733896a105SBram Moolenaar  syntax on
36743896a105SBram Moolenaar  augroup CmdWin
36753896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
36763896a105SBram Moolenaar  augroup END
36773896a105SBram Moolenaar  # this will open and also close the cmdline window
36783896a105SBram Moolenaar  feedkeys('q:', 'xt')
36793896a105SBram Moolenaar  assert_equal('yes', g:got_there)
36803896a105SBram Moolenaar
36813896a105SBram Moolenaar  augroup CmdWin
36823896a105SBram Moolenaar    au!
36833896a105SBram Moolenaar  augroup END
36843896a105SBram Moolenaar  &rtp = save_rtp
36853896a105SBram Moolenaar  delete('rtp', 'rf')
36863896a105SBram Moolenaarenddef
36873896a105SBram Moolenaar
3688e3d4685fSBram Moolenaardef Test_invalid_sid()
3689e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
369025859dd7SBram Moolenaar
36919c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3692d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3693e3d4685fSBram Moolenaar  endif
3694e3d4685fSBram Moolenaar  delete('Xdidit')
3695e3d4685fSBram Moolenaarenddef
3696e3d4685fSBram Moolenaar
36979ec7026fSBram Moolenaardef Test_restoring_cpo()
36989ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
36999ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
37009ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
37019ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
37029ec7026fSBram Moolenaar  endif
37039ec7026fSBram Moolenaar  delete('Xsourced')
37049ec7026fSBram Moolenaar  delete('Xclose')
3705090728adSBram Moolenaar  delete('Xdone')
37060123cc1eSBram Moolenaar
37070123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
37080123cc1eSBram Moolenaar  set cpo=aABceFsMny>
37090123cc1eSBram Moolenaar  edit XanotherScript
37100123cc1eSBram Moolenaar  so %
37110123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
37120123cc1eSBram Moolenaar  :1del
37130123cc1eSBram Moolenaar  w
37140123cc1eSBram Moolenaar  so %
37150123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
37160123cc1eSBram Moolenaar
37170123cc1eSBram Moolenaar  delete('XanotherScript')
37180123cc1eSBram Moolenaar  set cpo&vim
37199ec7026fSBram Moolenaarenddef
37209ec7026fSBram Moolenaar
3721ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3722ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
372337294bd6SBram Moolenaar  CheckScreendump
3724ffb7dcdbSBram Moolenaar  CheckFeature timers
372537294bd6SBram Moolenaar
3726ffb7dcdbSBram Moolenaar  let lines =<< trim END
372737294bd6SBram Moolenaar    vim9script
372837294bd6SBram Moolenaar    def script#func()
372937294bd6SBram Moolenaar    enddef
373037294bd6SBram Moolenaar  END
3731ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3732ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
373337294bd6SBram Moolenaar
3734ffb7dcdbSBram Moolenaar  let lines =<< trim END
373537294bd6SBram Moolenaar      vim9script
373637294bd6SBram Moolenaar      set cpo+=M
373737294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
3738767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
373937294bd6SBram Moolenaar      setline(1, 'some text')
374037294bd6SBram Moolenaar  END
3741ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3742ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3743ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3744ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
374537294bd6SBram Moolenaar
3746ffb7dcdbSBram Moolenaar  " clean up
3747ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3748ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3749ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3750ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3751ffb7dcdbSBram Moolenaarendfunc
375237294bd6SBram Moolenaar
37539ec7026fSBram Moolenaar
3754f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3755cfcd011fSBram Moolenaar  var lines =<< trim END
3756cfcd011fSBram Moolenaar    var name: any
3757cfcd011fSBram Moolenaar    assert_equal(0, name)
3758f0afd9e1SBram Moolenaar  END
3759f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3760f0afd9e1SBram Moolenaarenddef
3761f0afd9e1SBram Moolenaar
37627e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
376358dbef33SBram Moolenaar  CheckRunVimInTerminal
376458dbef33SBram Moolenaar
37657e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
37667e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
37677e9210eaSBram Moolenaarendfunc
37687e9210eaSBram Moolenaar
37697e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
37709c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3771cfcd011fSBram Moolenaar  var lines =<< trim END
37729c4f5520SBram Moolenaar    func CheckAndQuit()
37739c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
37749c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
37759c4f5520SBram Moolenaar    endfunc
37769c4f5520SBram Moolenaar  END
37779c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
37789c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3779e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
37809c4f5520SBram Moolenaar  # define Afunc() on the command line
37819c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
37829c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
37832949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
37849c4f5520SBram Moolenaar
37859c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
37869c4f5520SBram Moolenaar  delete('XcallFunc')
37879c4f5520SBram Moolenaar  delete('Xdidcmd')
37889c4f5520SBram Moolenaarenddef
37899c4f5520SBram Moolenaar
3790fcdc5d83SBram Moolenaardef Test_script_var_scope()
3791fcdc5d83SBram Moolenaar  var lines =<< trim END
3792fcdc5d83SBram Moolenaar      vim9script
3793fcdc5d83SBram Moolenaar      if true
3794fcdc5d83SBram Moolenaar        if true
3795fcdc5d83SBram Moolenaar          var one = 'one'
3796fcdc5d83SBram Moolenaar          echo one
3797fcdc5d83SBram Moolenaar        endif
3798fcdc5d83SBram Moolenaar        echo one
3799fcdc5d83SBram Moolenaar      endif
3800fcdc5d83SBram Moolenaar  END
3801fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3802fcdc5d83SBram Moolenaar
3803fcdc5d83SBram Moolenaar  lines =<< trim END
3804fcdc5d83SBram Moolenaar      vim9script
3805fcdc5d83SBram Moolenaar      if true
3806fcdc5d83SBram Moolenaar        if false
3807fcdc5d83SBram Moolenaar          var one = 'one'
3808fcdc5d83SBram Moolenaar          echo one
3809fcdc5d83SBram Moolenaar        else
3810fcdc5d83SBram Moolenaar          var one = 'one'
3811fcdc5d83SBram Moolenaar          echo one
3812fcdc5d83SBram Moolenaar        endif
3813fcdc5d83SBram Moolenaar        echo one
3814fcdc5d83SBram Moolenaar      endif
3815fcdc5d83SBram Moolenaar  END
3816fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3817fcdc5d83SBram Moolenaar
3818fcdc5d83SBram Moolenaar  lines =<< trim END
3819fcdc5d83SBram Moolenaar      vim9script
3820fcdc5d83SBram Moolenaar      while true
3821fcdc5d83SBram Moolenaar        var one = 'one'
3822fcdc5d83SBram Moolenaar        echo one
3823fcdc5d83SBram Moolenaar        break
3824fcdc5d83SBram Moolenaar      endwhile
3825fcdc5d83SBram Moolenaar      echo one
3826fcdc5d83SBram Moolenaar  END
3827fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3828fcdc5d83SBram Moolenaar
3829fcdc5d83SBram Moolenaar  lines =<< trim END
3830fcdc5d83SBram Moolenaar      vim9script
3831fcdc5d83SBram Moolenaar      for i in range(1)
3832fcdc5d83SBram Moolenaar        var one = 'one'
3833fcdc5d83SBram Moolenaar        echo one
3834fcdc5d83SBram Moolenaar      endfor
3835fcdc5d83SBram Moolenaar      echo one
3836fcdc5d83SBram Moolenaar  END
3837fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
38389becdf2bSBram Moolenaar
38399becdf2bSBram Moolenaar  lines =<< trim END
38409becdf2bSBram Moolenaar      vim9script
38419becdf2bSBram Moolenaar      {
38429becdf2bSBram Moolenaar        var one = 'one'
38439becdf2bSBram Moolenaar        assert_equal('one', one)
38449becdf2bSBram Moolenaar      }
38459becdf2bSBram Moolenaar      assert_false(exists('one'))
38469becdf2bSBram Moolenaar      assert_false(exists('s:one'))
38479becdf2bSBram Moolenaar  END
38489becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
38499becdf2bSBram Moolenaar
38509becdf2bSBram Moolenaar  lines =<< trim END
38519becdf2bSBram Moolenaar      vim9script
38529becdf2bSBram Moolenaar      {
38539becdf2bSBram Moolenaar        var one = 'one'
38549becdf2bSBram Moolenaar        echo one
38559becdf2bSBram Moolenaar      }
38569becdf2bSBram Moolenaar      echo one
38579becdf2bSBram Moolenaar  END
38589becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3859fcdc5d83SBram Moolenaarenddef
3860fcdc5d83SBram Moolenaar
3861352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3862352134bbSBram Moolenaar  var lines =<< trim END
3863352134bbSBram Moolenaar    vim9script
38642a38908bSBram Moolenaar    def Callback(...l: list<any>)
3865352134bbSBram Moolenaar      try
3866352134bbSBram Moolenaar        var x: string
3867352134bbSBram Moolenaar        var y: string
3868352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3869352134bbSBram Moolenaar        [x, y] = ['']
3870352134bbSBram Moolenaar      catch
3871352134bbSBram Moolenaar        g:caught = 'yes'
3872352134bbSBram Moolenaar      endtry
3873352134bbSBram Moolenaar    enddef
3874e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3875352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3876352134bbSBram Moolenaar  END
3877352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3878352134bbSBram Moolenaar
3879352134bbSBram Moolenaar  unlet g:caught
3880352134bbSBram Moolenaarenddef
3881352134bbSBram Moolenaar
3882631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3883631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3884631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3885631e8f93SBram Moolenaar  endif
3886631e8f93SBram Moolenaar  var lines =<< trim END
3887631e8f93SBram Moolenaar      vim9script
3888631e8f93SBram Moolenaar      var source: list<number>
38892a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
3890631e8f93SBram Moolenaar          eval [][0]
3891631e8f93SBram Moolenaar      enddef
38922a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
3893631e8f93SBram Moolenaar          sleep 1m
3894631e8f93SBram Moolenaar          source += l
3895631e8f93SBram Moolenaar      enddef
3896e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
38976f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
38986f17a3f0SBram Moolenaar        sleep 10m
38996f17a3f0SBram Moolenaar      endwhile
3900206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3901fe95b94fSBram Moolenaar      sleep 200m
3902631e8f93SBram Moolenaar  END
3903631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3904631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3905631e8f93SBram Moolenaar  delete('Xdef')
3906631e8f93SBram Moolenaarenddef
3907631e8f93SBram Moolenaar
39084324d87aSBram Moolenaardef InvokeNormal()
39094324d87aSBram Moolenaar  exe "norm! :m+1\r"
39104324d87aSBram Moolenaarenddef
39114324d87aSBram Moolenaar
39124324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
39134324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
39144324d87aSBram Moolenaar  new
39154324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
39164324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
39174324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
39184324d87aSBram Moolenaar  xunmap <F3>
3919b5b9480eSBram Moolenaarenddef
3920b5b9480eSBram Moolenaar
3921b5b9480eSBram Moolenaardef Test_white_space_after_command()
3922b5b9480eSBram Moolenaar  var lines =<< trim END
3923b5b9480eSBram Moolenaar    exit_cb: Func})
3924b5b9480eSBram Moolenaar  END
3925b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3926f8103f27SBram Moolenaar
3927f8103f27SBram Moolenaar  lines =<< trim END
3928f8103f27SBram Moolenaar    e#
3929f8103f27SBram Moolenaar  END
3930f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
39314324d87aSBram Moolenaarenddef
39324324d87aSBram Moolenaar
39334aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
39344aab88d9SBram Moolenaar  var lines =<< trim END
39354aab88d9SBram Moolenaar      vim9script
39364aab88d9SBram Moolenaar      if exists('g:guard')
39374aab88d9SBram Moolenaar        finish
39384aab88d9SBram Moolenaar      endif
39394aab88d9SBram Moolenaar      g:guard = 1
39404aab88d9SBram Moolenaar      var name = 'thename'
39414aab88d9SBram Moolenaar      def g:GetName(): string
39424aab88d9SBram Moolenaar        return name
39434aab88d9SBram Moolenaar      enddef
39444aab88d9SBram Moolenaar      def g:SetName(arg: string)
39454aab88d9SBram Moolenaar        name = arg
39464aab88d9SBram Moolenaar      enddef
39474aab88d9SBram Moolenaar  END
39484aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
39494aab88d9SBram Moolenaar  so XscriptTwice.vim
39504aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
39514aab88d9SBram Moolenaar  g:SetName('newname')
39524aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
39534aab88d9SBram Moolenaar  so XscriptTwice.vim
39544aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
39554aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
39564aab88d9SBram Moolenaar
39574aab88d9SBram Moolenaar  delfunc g:GetName
39584aab88d9SBram Moolenaar  delfunc g:SetName
39594aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
39604aab88d9SBram Moolenaar  unlet g:guard
39614aab88d9SBram Moolenaarenddef
39624aab88d9SBram Moolenaar
39634aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
39644aab88d9SBram Moolenaar  var exportlines =<< trim END
39654aab88d9SBram Moolenaar      vim9script
39664aab88d9SBram Moolenaar      if exists('g:guard')
39674aab88d9SBram Moolenaar        finish
39684aab88d9SBram Moolenaar      endif
39694aab88d9SBram Moolenaar      g:guard = 1
39704aab88d9SBram Moolenaar      export var name = 'someName'
39714aab88d9SBram Moolenaar  END
39724aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
39734aab88d9SBram Moolenaar
39744aab88d9SBram Moolenaar  var lines =<< trim END
39754aab88d9SBram Moolenaar      vim9script
39764aab88d9SBram Moolenaar      import name from './XexportScript.vim'
39774aab88d9SBram Moolenaar      def g:GetName(): string
39784aab88d9SBram Moolenaar        return name
39794aab88d9SBram Moolenaar      enddef
39804aab88d9SBram Moolenaar  END
39814aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
39824aab88d9SBram Moolenaar  so XscriptImport.vim
39834aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
39844aab88d9SBram Moolenaar
39854aab88d9SBram Moolenaar  so XexportScript.vim
39864aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
39874aab88d9SBram Moolenaar
39884aab88d9SBram Moolenaar  delfunc g:GetName
39894aab88d9SBram Moolenaar  delete('XexportScript.vim')
39904aab88d9SBram Moolenaar  delete('XscriptImport.vim')
39914aab88d9SBram Moolenaar  unlet g:guard
39924aab88d9SBram Moolenaarenddef
39934aab88d9SBram Moolenaar
399410b9421fSBram Moolenaardef Test_unsupported_commands()
399510b9421fSBram Moolenaar  var lines =<< trim END
399610b9421fSBram Moolenaar      ka
399710b9421fSBram Moolenaar  END
39987d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
39997d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
400010b9421fSBram Moolenaar
400110b9421fSBram Moolenaar  lines =<< trim END
4002ada1d870SBram Moolenaar      :1ka
4003ada1d870SBram Moolenaar  END
40047d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
40057d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
4006ada1d870SBram Moolenaar
4007ada1d870SBram Moolenaar  lines =<< trim END
400810b9421fSBram Moolenaar    t
400910b9421fSBram Moolenaar  END
401010b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
401110b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
401210b9421fSBram Moolenaar
401310b9421fSBram Moolenaar  lines =<< trim END
401410b9421fSBram Moolenaar    x
401510b9421fSBram Moolenaar  END
401610b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
401710b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
401810b9421fSBram Moolenaar
401910b9421fSBram Moolenaar  lines =<< trim END
402010b9421fSBram Moolenaar    xit
402110b9421fSBram Moolenaar  END
402210b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
402310b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
402410b9421fSBram Moolenaarenddef
402510b9421fSBram Moolenaar
4026c70fe460SBram Moolenaardef Test_mapping_line_number()
4027c70fe460SBram Moolenaar  var lines =<< trim END
4028c70fe460SBram Moolenaar      vim9script
4029c70fe460SBram Moolenaar      def g:FuncA()
4030c70fe460SBram Moolenaar          # Some comment
4031c70fe460SBram Moolenaar          FuncB(0)
4032c70fe460SBram Moolenaar      enddef
4033c70fe460SBram Moolenaar          # Some comment
4034c70fe460SBram Moolenaar      def FuncB(
4035c70fe460SBram Moolenaar          # Some comment
4036c70fe460SBram Moolenaar          n: number
4037c70fe460SBram Moolenaar      )
4038c70fe460SBram Moolenaar          exe 'nno '
4039c70fe460SBram Moolenaar              # Some comment
4040c70fe460SBram Moolenaar              .. '<F3> a'
4041c70fe460SBram Moolenaar              .. 'b'
4042c70fe460SBram Moolenaar              .. 'c'
4043c70fe460SBram Moolenaar      enddef
4044c70fe460SBram Moolenaar  END
4045c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
4046c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
4047c70fe460SBram Moolenaar  assert_match('No mapping found', res)
4048c70fe460SBram Moolenaar
4049c70fe460SBram Moolenaar  g:FuncA()
4050c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
4051c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4052c70fe460SBram Moolenaar
4053c70fe460SBram Moolenaar  nunmap <F3>
4054c70fe460SBram Moolenaar  delfunc g:FuncA
4055c70fe460SBram Moolenaarenddef
4056c70fe460SBram Moolenaar
4057208f0b48SBram Moolenaardef Test_option_modifier()
4058208f0b48SBram Moolenaar  var lines =<< trim END
4059208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
4060208f0b48SBram Moolenaar      call assert_equal(1, &hlsearch)
4061208f0b48SBram Moolenaar  END
4062208f0b48SBram Moolenaar  CheckScriptSuccess(lines)
4063208f0b48SBram Moolenaar
4064208f0b48SBram Moolenaar  lines =<< trim END
4065208f0b48SBram Moolenaar      vim9script
4066208f0b48SBram Moolenaar      set hlsearch &
4067208f0b48SBram Moolenaar  END
4068208f0b48SBram Moolenaar  CheckScriptFailure(lines, 'E518:')
4069208f0b48SBram Moolenaar
4070208f0b48SBram Moolenaar  lines =<< trim END
4071208f0b48SBram Moolenaar      vim9script
4072208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
4073208f0b48SBram Moolenaar  END
4074208f0b48SBram Moolenaar  CheckScriptFailure(lines, 'E518:')
4075208f0b48SBram Moolenaarenddef
4076208f0b48SBram Moolenaar
4077585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
4078585fea7bSBram Moolenaardef Test_substitute_cmd()
4079585fea7bSBram Moolenaar  new
4080585fea7bSBram Moolenaar  setline(1, 'something')
4081585fea7bSBram Moolenaar  :substitute(some(other(
4082585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
4083585fea7bSBram Moolenaar  bwipe!
4084585fea7bSBram Moolenaar
4085f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
4086cfcd011fSBram Moolenaar  var lines =<< trim END
4087585fea7bSBram Moolenaar    vim9script
4088585fea7bSBram Moolenaar    new
4089585fea7bSBram Moolenaar    setline(1, 'something')
4090585fea7bSBram Moolenaar    :substitute(some(other(
4091585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
4092585fea7bSBram Moolenaar    bwipe!
4093585fea7bSBram Moolenaar  END
4094585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
4095585fea7bSBram Moolenaar  source Xvim9lines
4096585fea7bSBram Moolenaar
4097585fea7bSBram Moolenaar  delete('Xvim9lines')
4098585fea7bSBram Moolenaarenddef
4099585fea7bSBram Moolenaar
41008a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
4101