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
6068a7d6542SBram Moolenaarenddef
6078a7d6542SBram Moolenaar
6083f987b59SBram Moolenaardef Test_try_in_catch()
6093f987b59SBram Moolenaar  var lines =<< trim END
6103f987b59SBram Moolenaar      vim9script
6113f987b59SBram Moolenaar      var seq = []
6123f987b59SBram Moolenaar      def DoIt()
6133f987b59SBram Moolenaar        try
6143f987b59SBram Moolenaar          seq->add('throw 1')
6153f987b59SBram Moolenaar          eval [][0]
6163f987b59SBram Moolenaar          seq->add('notreached')
6173f987b59SBram Moolenaar        catch
6183f987b59SBram Moolenaar          seq->add('catch')
6193f987b59SBram Moolenaar          try
6203f987b59SBram Moolenaar            seq->add('throw 2')
6213f987b59SBram Moolenaar            eval [][0]
6223f987b59SBram Moolenaar            seq->add('notreached')
6233f987b59SBram Moolenaar          catch /nothing/
6243f987b59SBram Moolenaar            seq->add('notreached')
6253f987b59SBram Moolenaar          endtry
6263f987b59SBram Moolenaar          seq->add('done')
6273f987b59SBram Moolenaar        endtry
6283f987b59SBram Moolenaar      enddef
6293f987b59SBram Moolenaar      DoIt()
6303f987b59SBram Moolenaar      assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
6313f987b59SBram Moolenaar  END
6323f987b59SBram Moolenaarenddef
6333f987b59SBram Moolenaar
634*d3d8feebSBram Moolenaardef Test_error_in_catch()
635*d3d8feebSBram Moolenaar  var lines =<< trim END
636*d3d8feebSBram Moolenaar      try
637*d3d8feebSBram Moolenaar        eval [][0]
638*d3d8feebSBram Moolenaar      catch /E684:/
639*d3d8feebSBram Moolenaar        eval [][0]
640*d3d8feebSBram Moolenaar      endtry
641*d3d8feebSBram Moolenaar  END
642*d3d8feebSBram Moolenaar  CheckDefExecFailure(lines, 'E684:', 4)
643*d3d8feebSBram Moolenaarenddef
644*d3d8feebSBram Moolenaar
6452e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to
6462e34c34bSBram Moolenaardef TryContinueFunc()
6472e34c34bSBram Moolenaar while g:Count < 2
6482e34c34bSBram Moolenaar   g:sequence ..= 't'
6492e34c34bSBram Moolenaar    try
6502e34c34bSBram Moolenaar      echoerr 'Test'
6512e34c34bSBram Moolenaar    catch
6522e34c34bSBram Moolenaar      g:Count += 1
6532e34c34bSBram Moolenaar      g:sequence ..= 'c'
6542e34c34bSBram Moolenaar      continue
6552e34c34bSBram Moolenaar    endtry
6562e34c34bSBram Moolenaar    g:sequence ..= 'e'
6572e34c34bSBram Moolenaar    g:Count += 1
6582e34c34bSBram Moolenaar  endwhile
6592e34c34bSBram Moolenaarenddef
6602e34c34bSBram Moolenaar
6612e34c34bSBram Moolenaardef Test_continue_in_try_in_while()
6622e34c34bSBram Moolenaar  g:Count = 0
6632e34c34bSBram Moolenaar  g:sequence = ''
6642e34c34bSBram Moolenaar  TryContinueFunc()
6652e34c34bSBram Moolenaar  assert_equal('tctc', g:sequence)
6662e34c34bSBram Moolenaar  unlet g:Count
6672e34c34bSBram Moolenaar  unlet g:sequence
6682e34c34bSBram Moolenaarenddef
6692e34c34bSBram Moolenaar
6709cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
6719cb577a6SBram Moolenaar  # return in try block returns normally
6729cb577a6SBram Moolenaar  def ReturnInTry(): string
6739cb577a6SBram Moolenaar    try
6749cb577a6SBram Moolenaar      return '"some message"'
6759cb577a6SBram Moolenaar    catch
6769cb577a6SBram Moolenaar    endtry
6779cb577a6SBram Moolenaar    return 'not reached'
6789cb577a6SBram Moolenaar  enddef
6799cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
6809cb577a6SBram Moolenaarenddef
6819cb577a6SBram Moolenaar
6821430ceebSBram Moolenaardef Test_cnext_works_in_catch()
6831430ceebSBram Moolenaar  var lines =<< trim END
6841430ceebSBram Moolenaar      vim9script
6851430ceebSBram Moolenaar      au BufEnter * eval 0
6861430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
6871430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
6881430ceebSBram Moolenaar      var items = [
6891430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
6901430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
6911430ceebSBram Moolenaar        ]
6921430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
6931430ceebSBram Moolenaar      cwindow
6941430ceebSBram Moolenaar
6951430ceebSBram Moolenaar      def CnextOrCfirst()
6961430ceebSBram Moolenaar        # if cnext fails, cfirst is used
6971430ceebSBram Moolenaar        try
6981430ceebSBram Moolenaar          cnext
6991430ceebSBram Moolenaar        catch
7001430ceebSBram Moolenaar          cfirst
7011430ceebSBram Moolenaar        endtry
7021430ceebSBram Moolenaar      enddef
7031430ceebSBram Moolenaar
7041430ceebSBram Moolenaar      CnextOrCfirst()
7051430ceebSBram Moolenaar      CnextOrCfirst()
7061430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
7071430ceebSBram Moolenaar      qall
7081430ceebSBram Moolenaar  END
7091430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
7101430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
7111430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
7121430ceebSBram Moolenaar
7131430ceebSBram Moolenaar  delete('Xfile1')
7141430ceebSBram Moolenaar  delete('Xfile2')
7151430ceebSBram Moolenaar  delete('XCatchCnext')
7161430ceebSBram Moolenaar  delete('Xresult')
7171430ceebSBram Moolenaarenddef
7181430ceebSBram Moolenaar
7199e1d9e34SBram Moolenaardef Test_throw_skipped()
7209e1d9e34SBram Moolenaar  if 0
7219e1d9e34SBram Moolenaar    throw dontgethere
7229e1d9e34SBram Moolenaar  endif
7239e1d9e34SBram Moolenaarenddef
7249e1d9e34SBram Moolenaar
7258f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
7268f81b22eSBram Moolenaar  var lines =<< trim END
7278f81b22eSBram Moolenaar    vim9script
7288f81b22eSBram Moolenaar    def Func()
7298f81b22eSBram Moolenaar      throw 'error'
7308f81b22eSBram Moolenaar    enddef
7318f81b22eSBram Moolenaar    silent! Func()
7328f81b22eSBram Moolenaar  END
7338f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
7348f81b22eSBram Moolenaar  source XthrowSilenced
7358f81b22eSBram Moolenaar  delete('XthrowSilenced')
7368f81b22eSBram Moolenaarenddef
7378f81b22eSBram Moolenaar
738e859312eSBram Moolenaardef DeletedFunc(): list<any>
739e859312eSBram Moolenaar  return ['delete me']
740e859312eSBram Moolenaarenddef
741e859312eSBram Moolenaardefcompile
742e859312eSBram Moolenaardelfunc DeletedFunc
743e859312eSBram Moolenaar
744257cc5eeSBram Moolenaardef ThrowFromDef()
745a72cfb80SBram Moolenaar  throw "getout" # comment
746257cc5eeSBram Moolenaarenddef
747257cc5eeSBram Moolenaar
748257cc5eeSBram Moolenaarfunc CatchInFunc()
749257cc5eeSBram Moolenaar  try
750257cc5eeSBram Moolenaar    call ThrowFromDef()
751257cc5eeSBram Moolenaar  catch
752257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
753257cc5eeSBram Moolenaar  endtry
754257cc5eeSBram Moolenaarendfunc
755257cc5eeSBram Moolenaar
756257cc5eeSBram Moolenaardef CatchInDef()
757257cc5eeSBram Moolenaar  try
758257cc5eeSBram Moolenaar    ThrowFromDef()
759257cc5eeSBram Moolenaar  catch
760257cc5eeSBram Moolenaar    g:thrown_def = v:exception
761257cc5eeSBram Moolenaar  endtry
762257cc5eeSBram Moolenaarenddef
763257cc5eeSBram Moolenaar
764f575adffSBram Moolenaardef ReturnFinally(): string
765f575adffSBram Moolenaar  try
766f575adffSBram Moolenaar    return 'intry'
767373863edSBram Moolenaar  finall
768f575adffSBram Moolenaar    g:in_finally = 'finally'
769f575adffSBram Moolenaar  endtry
770f575adffSBram Moolenaar  return 'end'
771f575adffSBram Moolenaarenddef
772f575adffSBram Moolenaar
773257cc5eeSBram Moolenaardef Test_try_catch_nested()
774257cc5eeSBram Moolenaar  CatchInFunc()
775257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
776257cc5eeSBram Moolenaar
777257cc5eeSBram Moolenaar  CatchInDef()
778257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
779f575adffSBram Moolenaar
780f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
781f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
782*d3d8feebSBram Moolenaar
783*d3d8feebSBram Moolenaar  var l = []
784*d3d8feebSBram Moolenaar  try
785*d3d8feebSBram Moolenaar    l->add('1')
786*d3d8feebSBram Moolenaar    throw 'bad'
787*d3d8feebSBram Moolenaar    l->add('x')
788*d3d8feebSBram Moolenaar  catch /bad/
789*d3d8feebSBram Moolenaar    l->add('2')
790*d3d8feebSBram Moolenaar    try
791*d3d8feebSBram Moolenaar      l->add('3')
792*d3d8feebSBram Moolenaar      throw 'one'
793*d3d8feebSBram Moolenaar      l->add('x')
794*d3d8feebSBram Moolenaar    catch /one/
795*d3d8feebSBram Moolenaar      l->add('4')
796*d3d8feebSBram Moolenaar      try
797*d3d8feebSBram Moolenaar        l->add('5')
798*d3d8feebSBram Moolenaar        throw 'more'
799*d3d8feebSBram Moolenaar        l->add('x')
800*d3d8feebSBram Moolenaar      catch /more/
801*d3d8feebSBram Moolenaar        l->add('6')
802*d3d8feebSBram Moolenaar      endtry
803*d3d8feebSBram Moolenaar    endtry
804*d3d8feebSBram Moolenaar  endtry
805*d3d8feebSBram Moolenaar  assert_equal(['1', '2', '3', '4', '5', '6'], l)
806f575adffSBram Moolenaarenddef
807f575adffSBram Moolenaar
8089939f57bSBram Moolenaardef TryOne(): number
8099939f57bSBram Moolenaar  try
8109939f57bSBram Moolenaar    return 0
8119939f57bSBram Moolenaar  catch
8129939f57bSBram Moolenaar  endtry
8139939f57bSBram Moolenaar  return 0
8149939f57bSBram Moolenaarenddef
8159939f57bSBram Moolenaar
8169939f57bSBram Moolenaardef TryTwo(n: number): string
8179939f57bSBram Moolenaar  try
818cfcd011fSBram Moolenaar    var x = {}
8199939f57bSBram Moolenaar  catch
8209939f57bSBram Moolenaar  endtry
8219939f57bSBram Moolenaar  return 'text'
8229939f57bSBram Moolenaarenddef
8239939f57bSBram Moolenaar
8249939f57bSBram Moolenaardef Test_try_catch_twice()
8259939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
8269939f57bSBram Moolenaarenddef
8279939f57bSBram Moolenaar
828f575adffSBram Moolenaardef Test_try_catch_match()
829cfcd011fSBram Moolenaar  var seq = 'a'
830f575adffSBram Moolenaar  try
831f575adffSBram Moolenaar    throw 'something'
832f575adffSBram Moolenaar  catch /nothing/
833f575adffSBram Moolenaar    seq ..= 'x'
834f575adffSBram Moolenaar  catch /some/
835f575adffSBram Moolenaar    seq ..= 'b'
836f575adffSBram Moolenaar  catch /asdf/
837f575adffSBram Moolenaar    seq ..= 'x'
838e8c4abbbSBram Moolenaar  catch ?a\?sdf?
839e8c4abbbSBram Moolenaar    seq ..= 'y'
840f575adffSBram Moolenaar  finally
841f575adffSBram Moolenaar    seq ..= 'c'
842f575adffSBram Moolenaar  endtry
843f575adffSBram Moolenaar  assert_equal('abc', seq)
844257cc5eeSBram Moolenaarenddef
845257cc5eeSBram Moolenaar
846e8c4abbbSBram Moolenaardef Test_try_catch_fails()
847d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
848d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
849d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
850d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
851d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
852d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
853d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
854d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
85513106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
856d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
857585fea7bSBram Moolenaar
858e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
859d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
860e8c4abbbSBram Moolenaarenddef
861e8c4abbbSBram Moolenaar
8627c5b3c03SBram Moolenaardef Try_catch_skipped()
8637c5b3c03SBram Moolenaar  var l = []
8647c5b3c03SBram Moolenaar  try
8657c5b3c03SBram Moolenaar  finally
8667c5b3c03SBram Moolenaar  endtry
8677c5b3c03SBram Moolenaar
8687c5b3c03SBram Moolenaar  if 1
8697c5b3c03SBram Moolenaar  else
8707c5b3c03SBram Moolenaar    try
8717c5b3c03SBram Moolenaar    endtry
8727c5b3c03SBram Moolenaar  endif
8737c5b3c03SBram Moolenaarenddef
8747c5b3c03SBram Moolenaar
8757c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
8767c5b3c03SBram Moolenaardef Test_try_catch_skipped()
8777c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
8787c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
8797c5b3c03SBram Moolenaarenddef
8807c5b3c03SBram Moolenaar
8817c5b3c03SBram Moolenaar
8827c5b3c03SBram Moolenaar
883006ad48bSBram Moolenaardef Test_throw_vimscript()
884f5be8cdbSBram Moolenaar  # only checks line continuation
885cfcd011fSBram Moolenaar  var lines =<< trim END
886006ad48bSBram Moolenaar      vim9script
887006ad48bSBram Moolenaar      try
888006ad48bSBram Moolenaar        throw 'one'
889006ad48bSBram Moolenaar              .. 'two'
890006ad48bSBram Moolenaar      catch
891006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
892006ad48bSBram Moolenaar      endtry
893006ad48bSBram Moolenaar  END
894006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
8951e021e63SBram Moolenaar
8961e021e63SBram Moolenaar  lines =<< trim END
8971e021e63SBram Moolenaar    vim9script
898352134bbSBram Moolenaar    @r = ''
8991e021e63SBram Moolenaar    def Func()
9001e021e63SBram Moolenaar      throw @r
9011e021e63SBram Moolenaar    enddef
9021e021e63SBram Moolenaar    var result = ''
9031e021e63SBram Moolenaar    try
9041e021e63SBram Moolenaar      Func()
9051e021e63SBram Moolenaar    catch /E1129:/
9061e021e63SBram Moolenaar      result = 'caught'
9071e021e63SBram Moolenaar    endtry
9081e021e63SBram Moolenaar    assert_equal('caught', result)
9091e021e63SBram Moolenaar  END
9101e021e63SBram Moolenaar  CheckScriptSuccess(lines)
911006ad48bSBram Moolenaarenddef
912006ad48bSBram Moolenaar
913ed677f55SBram Moolenaardef Test_error_in_nested_function()
91403dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
915cfcd011fSBram Moolenaar  var lines =<< trim END
916ed677f55SBram Moolenaar      vim9script
917ed677f55SBram Moolenaar      def Func()
918ed677f55SBram Moolenaar        Error()
919ed677f55SBram Moolenaar        g:test_var = 1
920ed677f55SBram Moolenaar      enddef
921ed677f55SBram Moolenaar      func Error() abort
922ed677f55SBram Moolenaar        eval [][0]
923ed677f55SBram Moolenaar      endfunc
924ed677f55SBram Moolenaar      Func()
925ed677f55SBram Moolenaar  END
926ed677f55SBram Moolenaar  g:test_var = 0
927ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
928ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
929ed677f55SBram Moolenaarenddef
930ed677f55SBram Moolenaar
931227c58a4SBram Moolenaardef Test_abort_after_error()
932227c58a4SBram Moolenaar  var lines =<< trim END
933227c58a4SBram Moolenaar      vim9script
934227c58a4SBram Moolenaar      while true
935227c58a4SBram Moolenaar        echo notfound
936227c58a4SBram Moolenaar      endwhile
937227c58a4SBram Moolenaar      g:gotthere = true
938227c58a4SBram Moolenaar  END
939227c58a4SBram Moolenaar  g:gotthere = false
940227c58a4SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
941227c58a4SBram Moolenaar  assert_false(g:gotthere)
942227c58a4SBram Moolenaar  unlet g:gotthere
943227c58a4SBram Moolenaarenddef
944227c58a4SBram Moolenaar
94537c83711SBram Moolenaardef Test_cexpr_vimscript()
946f5be8cdbSBram Moolenaar  # only checks line continuation
94737c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
948cfcd011fSBram Moolenaar  var lines =<< trim END
94937c83711SBram Moolenaar      vim9script
95037c83711SBram Moolenaar      cexpr 'File'
95137c83711SBram Moolenaar                .. ' someFile' ..
95237c83711SBram Moolenaar                   ' line 19'
95337c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
95437c83711SBram Moolenaar  END
95537c83711SBram Moolenaar  CheckScriptSuccess(lines)
95637c83711SBram Moolenaar  set errorformat&
95737c83711SBram Moolenaarenddef
95837c83711SBram Moolenaar
959c9edd6b5SBram Moolenaardef Test_statusline_syntax()
960c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
961cfcd011fSBram Moolenaar  var lines =<< trim END
962c9edd6b5SBram Moolenaar      vim9script
963c9edd6b5SBram Moolenaar      func g:Status()
964c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
965c9edd6b5SBram Moolenaar      endfunc
966c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
967c9edd6b5SBram Moolenaar      redrawstatus
968c9edd6b5SBram Moolenaar      set laststatus statusline=
969c9edd6b5SBram Moolenaar  END
970c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
971c9edd6b5SBram Moolenaarenddef
972c9edd6b5SBram Moolenaar
973b209750bSBram Moolenaardef Test_list_vimscript()
974b209750bSBram Moolenaar  # checks line continuation and comments
975cfcd011fSBram Moolenaar  var lines =<< trim END
976b209750bSBram Moolenaar      vim9script
977cfcd011fSBram Moolenaar      var mylist = [
978b209750bSBram Moolenaar            'one',
979b209750bSBram Moolenaar            # comment
980b209750bSBram Moolenaar            'two', # empty line follows
981b209750bSBram Moolenaar
982b209750bSBram Moolenaar            'three',
983b209750bSBram Moolenaar            ]
984b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
985b209750bSBram Moolenaar  END
986b209750bSBram Moolenaar  CheckScriptSuccess(lines)
98766250c93SBram Moolenaar
98866250c93SBram Moolenaar  # check all lines from heredoc are kept
98966250c93SBram Moolenaar  lines =<< trim END
99066250c93SBram Moolenaar      # comment 1
99166250c93SBram Moolenaar      two
99266250c93SBram Moolenaar      # comment 3
99366250c93SBram Moolenaar
99466250c93SBram Moolenaar      five
99566250c93SBram Moolenaar      # comment 6
99666250c93SBram Moolenaar  END
99766250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
9984bce26bbSBram Moolenaar
9994bce26bbSBram Moolenaar  lines =<< trim END
10004bce26bbSBram Moolenaar    [{
10014bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
10024bce26bbSBram Moolenaar  END
10034bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1004b209750bSBram Moolenaarenddef
1005b209750bSBram Moolenaar
10062a1381c3SBram Moolenaarif has('channel')
100740ee466cSBram Moolenaar  let someJob = test_null_job()
100840ee466cSBram Moolenaar
100940ee466cSBram Moolenaar  def FuncWithError()
101040ee466cSBram Moolenaar    echomsg g:someJob
101140ee466cSBram Moolenaar  enddef
101240ee466cSBram Moolenaar
101340ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
101440ee466cSBram Moolenaar    try
101540ee466cSBram Moolenaar      call FuncWithError()
101640ee466cSBram Moolenaar    catch
101740ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
101840ee466cSBram Moolenaar    endtry
101940ee466cSBram Moolenaar  endfunc
10202a1381c3SBram Moolenaarendif
102140ee466cSBram Moolenaar
10228a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
10238a7d6542SBram Moolenaar  vim9script
1024cfcd011fSBram Moolenaar  var name: string = 'bob'
10258a7d6542SBram Moolenaar  def Concat(arg: string): string
10268a7d6542SBram Moolenaar    return name .. arg
10278a7d6542SBram Moolenaar  enddef
1028227a69deSBram Moolenaar  g:result = Concat('bie')
1029227a69deSBram Moolenaar  g:localname = name
10308a7d6542SBram Moolenaar
10318a7d6542SBram Moolenaar  export const CONST = 1234
1032cfcd011fSBram Moolenaar  export var exported = 9876
1033cfcd011fSBram Moolenaar  export var exp_name = 'John'
10348a7d6542SBram Moolenaar  export def Exported(): string
10358a7d6542SBram Moolenaar    return 'Exported'
10368a7d6542SBram Moolenaar  enddef
10370f2a5cc6SBram Moolenaar  export final theList = [1]
10388a7d6542SBram MoolenaarEND
10398a7d6542SBram Moolenaar
1040b3ca9824SBram Moolenaardef Undo_export_script_lines()
1041b3ca9824SBram Moolenaar  unlet g:result
1042b3ca9824SBram Moolenaar  unlet g:localname
1043b3ca9824SBram Moolenaarenddef
1044b3ca9824SBram Moolenaar
10455269bd2aSBram Moolenaardef Test_vim9_import_export()
1046cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
10478a7d6542SBram Moolenaar    vim9script
10488a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
10498a7d6542SBram Moolenaar    g:imported = exported
10506e587dcbSBram Moolenaar    exported += 3
10516e587dcbSBram Moolenaar    g:imported_added = exported
10528a7d6542SBram Moolenaar    g:imported_func = Exported()
10536e587dcbSBram Moolenaar
105440f4f7a4SBram Moolenaar    def GetExported(): string
1055e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
105640f4f7a4SBram Moolenaar      return local_dict.ref()
105740f4f7a4SBram Moolenaar    enddef
105840f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
105940f4f7a4SBram Moolenaar
10606e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
10616e587dcbSBram Moolenaar    g:imported_name = exp_name
10626e587dcbSBram Moolenaar    exp_name ..= ' Doe'
10636e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
10645381c7a1SBram Moolenaar    g:imported_later = exported
10650f2a5cc6SBram Moolenaar
10660f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
10670f2a5cc6SBram Moolenaar    theList->add(2)
10680f2a5cc6SBram Moolenaar    assert_equal([1, 2], theList)
10698a7d6542SBram Moolenaar  END
10708a7d6542SBram Moolenaar
10718a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
10728a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
10738a7d6542SBram Moolenaar
10748a7d6542SBram Moolenaar  source Ximport.vim
10758a7d6542SBram Moolenaar
10768a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
10778a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
10788a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
10796e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
10805381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
10818a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
108240f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
10836e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
10846e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
10858a7d6542SBram Moolenaar  assert_false(exists('g:name'))
10868a7d6542SBram Moolenaar
1087b3ca9824SBram Moolenaar  Undo_export_script_lines()
10888a7d6542SBram Moolenaar  unlet g:imported
10896e587dcbSBram Moolenaar  unlet g:imported_added
10905381c7a1SBram Moolenaar  unlet g:imported_later
10918a7d6542SBram Moolenaar  unlet g:imported_func
10926e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
10938a7d6542SBram Moolenaar  delete('Ximport.vim')
1094f2d5c240SBram Moolenaar
10951c991144SBram Moolenaar  # similar, with line breaks
1096cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
10971c991144SBram Moolenaar    vim9script
10981c991144SBram Moolenaar    import {
10991c991144SBram Moolenaar        exported,
11001c991144SBram Moolenaar        Exported,
11011c991144SBram Moolenaar        }
11021c991144SBram Moolenaar        from
11031c991144SBram Moolenaar        './Xexport.vim'
11041c991144SBram Moolenaar    g:imported = exported
11051c991144SBram Moolenaar    exported += 5
11061c991144SBram Moolenaar    g:imported_added = exported
11071c991144SBram Moolenaar    g:imported_func = Exported()
11081c991144SBram Moolenaar  END
11091c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
11101c991144SBram Moolenaar  source Ximport_lbr.vim
11111c991144SBram Moolenaar
11121c991144SBram Moolenaar  assert_equal(9876, g:imported)
11131c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
11141c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
11151c991144SBram Moolenaar
11161c991144SBram Moolenaar  # exported script not sourced again
11171c991144SBram Moolenaar  assert_false(exists('g:result'))
11181c991144SBram Moolenaar  unlet g:imported
11191c991144SBram Moolenaar  unlet g:imported_added
11201c991144SBram Moolenaar  unlet g:imported_func
11211c991144SBram Moolenaar  delete('Ximport_lbr.vim')
11221c991144SBram Moolenaar
11231c991144SBram Moolenaar  # import inside :def function
1124cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
11255381c7a1SBram Moolenaar    vim9script
11265381c7a1SBram Moolenaar    def ImportInDef()
11275381c7a1SBram Moolenaar      import exported from './Xexport.vim'
11285381c7a1SBram Moolenaar      g:imported = exported
11295381c7a1SBram Moolenaar      exported += 7
11305381c7a1SBram Moolenaar      g:imported_added = exported
11315381c7a1SBram Moolenaar    enddef
11325381c7a1SBram Moolenaar    ImportInDef()
11335381c7a1SBram Moolenaar  END
11345381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
11355381c7a1SBram Moolenaar  source Ximport2.vim
1136f5be8cdbSBram Moolenaar  # TODO: this should be 9879
11375381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
11385381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
11395381c7a1SBram Moolenaar  unlet g:imported
11405381c7a1SBram Moolenaar  unlet g:imported_added
11415381c7a1SBram Moolenaar  delete('Ximport2.vim')
11425381c7a1SBram Moolenaar
1143cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1144f2d5c240SBram Moolenaar    vim9script
1145f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1146f2d5c240SBram Moolenaar    def UseExport()
1147cb4e80faSBram Moolenaar      g:imported_def = Export.exported
1148f2d5c240SBram Moolenaar    enddef
1149cb4e80faSBram Moolenaar    g:imported_script = Export.exported
1150cb4e80faSBram Moolenaar    assert_equal(1, exists('Export.exported'))
1151cb4e80faSBram Moolenaar    assert_equal(0, exists('Export.notexported'))
1152f2d5c240SBram Moolenaar    UseExport()
1153f2d5c240SBram Moolenaar  END
1154f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1155f2d5c240SBram Moolenaar  source Ximport.vim
1156cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_def)
1157cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_script)
1158f2d5c240SBram Moolenaar
1159cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1160599c89c8SBram Moolenaar    vim9script
1161599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1162599c89c8SBram Moolenaar    def Func()
1163cfcd011fSBram Moolenaar      var dummy = 1
1164cfcd011fSBram Moolenaar      var imported = Export + dummy
1165599c89c8SBram Moolenaar    enddef
1166822ba247SBram Moolenaar    defcompile
1167599c89c8SBram Moolenaar  END
1168599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
116944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1170599c89c8SBram Moolenaar
1171cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1172599c89c8SBram Moolenaar    vim9script
1173599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1174599c89c8SBram Moolenaar    def Func()
1175cfcd011fSBram Moolenaar      var imported = Export . exported
1176599c89c8SBram Moolenaar    enddef
1177822ba247SBram Moolenaar    defcompile
1178599c89c8SBram Moolenaar  END
1179599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
118044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1181599c89c8SBram Moolenaar
1182a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1183a6294955SBram Moolenaar    vim9script
1184a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1185a6294955SBram Moolenaar    var some = 'other'
1186a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1187a6294955SBram Moolenaar    defcompile
1188a6294955SBram Moolenaar  END
1189a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1190a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1191a6294955SBram Moolenaar
1192cb4e80faSBram Moolenaar  var import_star_as_lines_script_no_dot =<< trim END
1193cb4e80faSBram Moolenaar    vim9script
1194cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1195cb4e80faSBram Moolenaar    g:imported_script = Export exported
1196cb4e80faSBram Moolenaar  END
1197cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
1198cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1029:')
1199cb4e80faSBram Moolenaar
1200cb4e80faSBram Moolenaar  var import_star_as_lines_script_space_after_dot =<< trim END
1201cb4e80faSBram Moolenaar    vim9script
1202cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1203cb4e80faSBram Moolenaar    g:imported_script = Export. exported
1204cb4e80faSBram Moolenaar  END
1205cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1206cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1207cb4e80faSBram Moolenaar
1208cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1209599c89c8SBram Moolenaar    vim9script
1210599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1211599c89c8SBram Moolenaar    def Func()
1212cfcd011fSBram Moolenaar      var imported = Export.
1213599c89c8SBram Moolenaar    enddef
1214822ba247SBram Moolenaar    defcompile
1215599c89c8SBram Moolenaar  END
1216599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
121744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1218599c89c8SBram Moolenaar
1219cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
12201c991144SBram Moolenaar    vim9script
12211c991144SBram Moolenaar    import *
12221c991144SBram Moolenaar        as Export
12231c991144SBram Moolenaar        from
12241c991144SBram Moolenaar        './Xexport.vim'
12251c991144SBram Moolenaar    def UseExport()
12261c991144SBram Moolenaar      g:imported = Export.exported
12271c991144SBram Moolenaar    enddef
12281c991144SBram Moolenaar    UseExport()
12291c991144SBram Moolenaar  END
12301c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
12311c991144SBram Moolenaar  source Ximport.vim
12321c991144SBram Moolenaar  assert_equal(9883, g:imported)
12331c991144SBram Moolenaar
1234cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1235f2d5c240SBram Moolenaar    vim9script
1236f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1237f2d5c240SBram Moolenaar  END
1238f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
123944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1240f2d5c240SBram Moolenaar
1241f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1242cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1243fa29c8abSBram Moolenaar    vim9script
1244fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1245fa29c8abSBram Moolenaar  END
1246fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
124744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1248fa29c8abSBram Moolenaar
1249f5be8cdbSBram Moolenaar  # try to import something that is already defined
1250cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
12515269bd2aSBram Moolenaar    vim9script
1252cfcd011fSBram Moolenaar    var exported = 'something'
12535269bd2aSBram Moolenaar    import exported from './Xexport.vim'
12545269bd2aSBram Moolenaar  END
12555269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1256057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
12575269bd2aSBram Moolenaar
1258f5be8cdbSBram Moolenaar  # try to import something that is already defined
12595269bd2aSBram Moolenaar  import_already_defined =<< trim END
12605269bd2aSBram Moolenaar    vim9script
1261cfcd011fSBram Moolenaar    var exported = 'something'
12625269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
12635269bd2aSBram Moolenaar  END
12645269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1265057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
12665269bd2aSBram Moolenaar
1267f5be8cdbSBram Moolenaar  # try to import something that is already defined
12685269bd2aSBram Moolenaar  import_already_defined =<< trim END
12695269bd2aSBram Moolenaar    vim9script
1270cfcd011fSBram Moolenaar    var exported = 'something'
12715269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
12725269bd2aSBram Moolenaar  END
12735269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1274057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
12755269bd2aSBram Moolenaar
1276918a4249SBram Moolenaar  # try changing an imported const
1277918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1278918a4249SBram Moolenaar    vim9script
1279918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1280918a4249SBram Moolenaar    def Assign()
1281918a4249SBram Moolenaar      CONST = 987
1282918a4249SBram Moolenaar    enddef
1283918a4249SBram Moolenaar    defcompile
1284918a4249SBram Moolenaar  END
1285918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1286918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1287918a4249SBram Moolenaar
12880f2a5cc6SBram Moolenaar  # try changing an imported final
12890f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
12900f2a5cc6SBram Moolenaar    vim9script
12910f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
12920f2a5cc6SBram Moolenaar    def Assign()
12930f2a5cc6SBram Moolenaar      theList = [2]
12940f2a5cc6SBram Moolenaar    enddef
12950f2a5cc6SBram Moolenaar    defcompile
12960f2a5cc6SBram Moolenaar  END
12970f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
12980f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
12990f2a5cc6SBram Moolenaar
1300f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1301cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1302fa29c8abSBram Moolenaar    vim9script
1303fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1304fa29c8abSBram Moolenaar  END
1305fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
130644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1307fa29c8abSBram Moolenaar
1308cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1309fa29c8abSBram Moolenaar    vim9script
1310fa29c8abSBram Moolenaar    import name './Xexport.vim'
1311fa29c8abSBram Moolenaar  END
1312fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
131344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1314fa29c8abSBram Moolenaar
1315cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1316fa29c8abSBram Moolenaar    vim9script
1317fa29c8abSBram Moolenaar    import name from Xexport.vim
1318fa29c8abSBram Moolenaar  END
1319fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
132044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1321fa29c8abSBram Moolenaar
1322cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1323fa29c8abSBram Moolenaar    vim9script
1324fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1325fa29c8abSBram Moolenaar  END
1326fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
132744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1328fa29c8abSBram Moolenaar
1329cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1330fa29c8abSBram Moolenaar    vim9script
1331fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1332fa29c8abSBram Moolenaar  END
13335269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
133444d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1335fa29c8abSBram Moolenaar
1336f2d5c240SBram Moolenaar  delete('Ximport.vim')
13375269bd2aSBram Moolenaar  delete('Ximport3.vim')
13388a7d6542SBram Moolenaar  delete('Xexport.vim')
13398a7d6542SBram Moolenaar
1340f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
13413e191694SBram Moolenaar  # Flags added or removed are also applied to the restored value.
13423e191694SBram Moolenaar  set cpo=abcd
1343cfcd011fSBram Moolenaar  var lines =<< trim END
1344750802b5SBram Moolenaar    vim9script
1345750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
13463e191694SBram Moolenaar    set cpo+=f
13473e191694SBram Moolenaar    set cpo-=c
13483e191694SBram Moolenaar    g:cpo_after_vim9script = &cpo
1349750802b5SBram Moolenaar  END
1350750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1351750802b5SBram Moolenaar  source Xvim9_script
13523e191694SBram Moolenaar  assert_equal('fabd', &cpo)
1353750802b5SBram Moolenaar  set cpo&vim
1354750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
13553e191694SBram Moolenaar  var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
13563e191694SBram Moolenaar  assert_equal(newcpo, g:cpo_after_vim9script)
13573e191694SBram Moolenaar
1358750802b5SBram Moolenaar  delete('Xvim9_script')
1359750802b5SBram Moolenaarenddef
1360750802b5SBram Moolenaar
13610a84284eSBram Moolenaardef Test_import_as()
13620a84284eSBram Moolenaar  var export_lines =<< trim END
13630a84284eSBram Moolenaar    vim9script
13640a84284eSBram Moolenaar    export var one = 1
13650a84284eSBram Moolenaar    export var yes = 'yes'
13660a84284eSBram Moolenaar  END
13670a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
13680a84284eSBram Moolenaar
13690a84284eSBram Moolenaar  var import_lines =<< trim END
13700a84284eSBram Moolenaar    vim9script
13716c7cc347SBram Moolenaar    var one = 'notused'
13726c7cc347SBram Moolenaar    var yes = 777
13730a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
13740a84284eSBram Moolenaar    assert_equal(1, thatOne)
13750a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
13760a84284eSBram Moolenaar    assert_equal('yes', yesYes)
13770a84284eSBram Moolenaar  END
13780a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
13790a84284eSBram Moolenaar
13800a84284eSBram Moolenaar  import_lines =<< trim END
13810a84284eSBram Moolenaar    vim9script
13820a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
13830a84284eSBram Moolenaar    assert_equal(1, thatOne)
13840a84284eSBram Moolenaar    assert_equal('yes', yesYes)
13850a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
13860a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
13870a84284eSBram Moolenaar  END
13880a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
13890a84284eSBram Moolenaar
13900a84284eSBram Moolenaar  delete('XexportAs')
13910a84284eSBram Moolenaarenddef
13920a84284eSBram Moolenaar
1393803af686SBram Moolenaarfunc g:Trigger()
1394803af686SBram Moolenaar  source Ximport.vim
1395803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1396803af686SBram Moolenaarendfunc
1397803af686SBram Moolenaar
1398803af686SBram Moolenaardef Test_import_export_expr_map()
1399803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1400cfcd011fSBram Moolenaar  var export_lines =<< trim END
1401803af686SBram Moolenaar    vim9script
1402803af686SBram Moolenaar    export def That(): string
1403803af686SBram Moolenaar      return 'yes'
1404803af686SBram Moolenaar    enddef
1405803af686SBram Moolenaar  END
1406803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1407803af686SBram Moolenaar
1408cfcd011fSBram Moolenaar  var import_lines =<< trim END
1409803af686SBram Moolenaar    vim9script
1410803af686SBram Moolenaar    import That from './Xexport_that.vim'
1411803af686SBram Moolenaar    assert_equal('yes', That())
1412803af686SBram Moolenaar  END
1413803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1414803af686SBram Moolenaar
1415803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1416803af686SBram Moolenaar  feedkeys('trigger', "xt")
1417803af686SBram Moolenaar
1418730b2483SBram Moolenaar  delete('Xexport_that.vim')
1419803af686SBram Moolenaar  delete('Ximport.vim')
1420803af686SBram Moolenaar  nunmap trigger
1421803af686SBram Moolenaarenddef
1422803af686SBram Moolenaar
14238e1986e3SBram Moolenaardef Test_import_in_filetype()
14248e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
14258e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1426cfcd011fSBram Moolenaar  var export_lines =<< trim END
14278e1986e3SBram Moolenaar    vim9script
1428cfcd011fSBram Moolenaar    export var That = 'yes'
14298e1986e3SBram Moolenaar  END
1430730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
14318e1986e3SBram Moolenaar
1432cfcd011fSBram Moolenaar  var import_lines =<< trim END
14338e1986e3SBram Moolenaar    vim9script
1434730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
14358e1986e3SBram Moolenaar    assert_equal('yes', That)
14368e1986e3SBram Moolenaar    g:did_load_mytpe = 1
14378e1986e3SBram Moolenaar  END
14388e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
14398e1986e3SBram Moolenaar
1440cfcd011fSBram Moolenaar  var save_rtp = &rtp
14418e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
14428e1986e3SBram Moolenaar
14438e1986e3SBram Moolenaar  filetype plugin on
14448e1986e3SBram Moolenaar  copen
14458e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
14468e1986e3SBram Moolenaar
14478e1986e3SBram Moolenaar  quit!
1448730b2483SBram Moolenaar  delete('Xexport_ft.vim')
14498e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
14508e1986e3SBram Moolenaar  &rtp = save_rtp
14518e1986e3SBram Moolenaarenddef
14528e1986e3SBram Moolenaar
1453efa94447SBram Moolenaardef Test_use_import_in_mapping()
1454cfcd011fSBram Moolenaar  var lines =<< trim END
1455efa94447SBram Moolenaar      vim9script
1456efa94447SBram Moolenaar      export def Funcx()
1457efa94447SBram Moolenaar        g:result = 42
1458efa94447SBram Moolenaar      enddef
1459efa94447SBram Moolenaar  END
1460efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1461efa94447SBram Moolenaar  lines =<< trim END
1462efa94447SBram Moolenaar      vim9script
1463efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1464b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1465efa94447SBram Moolenaar  END
1466efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1467efa94447SBram Moolenaar
1468efa94447SBram Moolenaar  source Xmapscript.vim
1469b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1470efa94447SBram Moolenaar  assert_equal(42, g:result)
1471efa94447SBram Moolenaar
1472efa94447SBram Moolenaar  unlet g:result
1473efa94447SBram Moolenaar  delete('XsomeExport.vim')
1474efa94447SBram Moolenaar  delete('Xmapscript.vim')
1475b3ca9824SBram Moolenaar  nunmap <F3>
1476efa94447SBram Moolenaarenddef
1477efa94447SBram Moolenaar
1478d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1479d3f8a9eeSBram Moolenaar  var lines =<< trim END
1480d3f8a9eeSBram Moolenaar    if has(g:feature)
1481d3f8a9eeSBram Moolenaar      " legacy script
1482d3f8a9eeSBram Moolenaar      let g:legacy = 1
1483d3f8a9eeSBram Moolenaar      finish
1484d3f8a9eeSBram Moolenaar    endif
1485d3f8a9eeSBram Moolenaar    vim9script
1486d3f8a9eeSBram Moolenaar    g:legacy = 0
1487d3f8a9eeSBram Moolenaar  END
1488d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1489d3f8a9eeSBram Moolenaar  g:legacy = -1
1490d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1491d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1492d3f8a9eeSBram Moolenaar
1493d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1494d3f8a9eeSBram Moolenaar  g:legacy = -1
1495d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1496d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1497d3f8a9eeSBram Moolenaarenddef
1498d3f8a9eeSBram Moolenaar
1499750802b5SBram Moolenaardef Test_vim9script_fails()
15008a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
15018a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1502cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
15039721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1504cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1505750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1506750802b5SBram Moolenaar
1507cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1508c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1509c785b9a7SBram Moolenaar
1510e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1511e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
15128a7d6542SBram Moolenaarenddef
15138a7d6542SBram Moolenaar
1514f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1515101f4810SBram Moolenaar  CheckRunVimInTerminal
1516101f4810SBram Moolenaar
15179bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1518c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
15199bb3eb3eSBram Moolenaarendfunc
15209bb3eb3eSBram Moolenaar
1521c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1522cfcd011fSBram Moolenaar  var export =<< trim END
1523101f4810SBram Moolenaar    vim9script
1524101f4810SBram Moolenaar    export def Foo(): number
1525101f4810SBram Moolenaar        return 0
1526101f4810SBram Moolenaar    enddef
1527101f4810SBram Moolenaar  END
1528730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1529101f4810SBram Moolenaar
1530e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
15319bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
15322949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1533101f4810SBram Moolenaar
1534730b2483SBram Moolenaar  delete('XexportCmd.vim')
15359bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
15369bb3eb3eSBram Moolenaarenddef
1537101f4810SBram Moolenaar
15382b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
15392b32700dSBram Moolenaar  var lines =<< trim END
1540a6294955SBram Moolenaar    vim9script
1541a6294955SBram Moolenaar    export var exported = 'thexport'
1542a6294955SBram Moolenaar  END
1543a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1544a6294955SBram Moolenaar  lines =<< trim END
15452b32700dSBram Moolenaar    vim9script noclear
15462b32700dSBram Moolenaar    g:loadCount += 1
15472b32700dSBram Moolenaar    var s:reloaded = 'init'
1548a6294955SBram Moolenaar    import exported from './XExportReload'
15492b32700dSBram Moolenaar
15502b32700dSBram Moolenaar    def Again(): string
15512b32700dSBram Moolenaar      return 'again'
15522b32700dSBram Moolenaar    enddef
15532b32700dSBram Moolenaar
15542b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
15552b32700dSBram Moolenaar    var s:loaded = true
15562b32700dSBram Moolenaar
15572b32700dSBram Moolenaar    var s:notReloaded = 'yes'
15582b32700dSBram Moolenaar    s:reloaded = 'first'
15592b32700dSBram Moolenaar    def g:Values(): list<string>
1560a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
15612b32700dSBram Moolenaar    enddef
15622b32700dSBram Moolenaar
15632b32700dSBram Moolenaar    def Once(): string
15642b32700dSBram Moolenaar      return 'once'
15652b32700dSBram Moolenaar    enddef
15662b32700dSBram Moolenaar  END
15672b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
15682b32700dSBram Moolenaar  g:loadCount = 0
15692b32700dSBram Moolenaar  source XReloaded
15702b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1571a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
15722b32700dSBram Moolenaar  source XReloaded
15732b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1574a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
15752b32700dSBram Moolenaar  source XReloaded
15762b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1577a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
15782b32700dSBram Moolenaar
157948e11c10SBram Moolenaar  delete('XReloaded')
1580a6294955SBram Moolenaar  delete('XExportReload')
15812b32700dSBram Moolenaar  delfunc g:Values
15822b32700dSBram Moolenaar  unlet g:loadCount
1583577dc93dSBram Moolenaar
1584577dc93dSBram Moolenaar  lines =<< trim END
1585577dc93dSBram Moolenaar      vim9script
1586577dc93dSBram Moolenaar      def Inner()
1587577dc93dSBram Moolenaar      enddef
1588577dc93dSBram Moolenaar  END
1589577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1590577dc93dSBram Moolenaar  source XreloadScript.vim
1591577dc93dSBram Moolenaar
1592577dc93dSBram Moolenaar  lines =<< trim END
1593577dc93dSBram Moolenaar      vim9script
1594577dc93dSBram Moolenaar      def Outer()
1595577dc93dSBram Moolenaar        def Inner()
1596577dc93dSBram Moolenaar        enddef
1597577dc93dSBram Moolenaar      enddef
1598577dc93dSBram Moolenaar      defcompile
1599577dc93dSBram Moolenaar  END
1600577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1601577dc93dSBram Moolenaar  source XreloadScript.vim
1602577dc93dSBram Moolenaar
1603577dc93dSBram Moolenaar  delete('XreloadScript.vim')
16042b32700dSBram Moolenaarenddef
16052b32700dSBram Moolenaar
16064c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1607cfcd011fSBram Moolenaar  var lines =<< trim END
16088a7d6542SBram Moolenaar    vim9script
16098a7d6542SBram Moolenaar    const var = ''
1610cfcd011fSBram Moolenaar    var valone = 1234
16118a7d6542SBram Moolenaar    def MyFunc(arg: string)
16128a7d6542SBram Moolenaar       valone = 5678
16138a7d6542SBram Moolenaar    enddef
16148a7d6542SBram Moolenaar  END
1615cfcd011fSBram Moolenaar  var morelines =<< trim END
1616cfcd011fSBram Moolenaar    var valtwo = 222
16178a7d6542SBram Moolenaar    export def GetValtwo(): number
16188a7d6542SBram Moolenaar      return valtwo
16198a7d6542SBram Moolenaar    enddef
16208a7d6542SBram Moolenaar  END
162103afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
16228a7d6542SBram Moolenaar  source Xreload.vim
16238a7d6542SBram Moolenaar  source Xreload.vim
16248a7d6542SBram Moolenaar  source Xreload.vim
16258a7d6542SBram Moolenaar
1626cfcd011fSBram Moolenaar  var testlines =<< trim END
16278a7d6542SBram Moolenaar    vim9script
16288a7d6542SBram Moolenaar    def TheFunc()
16298a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
16308a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
16318a7d6542SBram Moolenaar    enddef
16328a7d6542SBram Moolenaar    TheFunc()
16338a7d6542SBram Moolenaar  END
16348a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
16358a7d6542SBram Moolenaar  source Ximport.vim
16368a7d6542SBram Moolenaar
1637f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1638f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
16398a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
16408a7d6542SBram Moolenaar  source Ximport.vim
16418a7d6542SBram Moolenaar
1642f5be8cdbSBram Moolenaar  # cannot declare a var twice
16438a7d6542SBram Moolenaar  lines =<< trim END
16448a7d6542SBram Moolenaar    vim9script
1645cfcd011fSBram Moolenaar    var valone = 1234
1646cfcd011fSBram Moolenaar    var valone = 5678
16478a7d6542SBram Moolenaar  END
16488a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
164944d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
16508a7d6542SBram Moolenaar
16518a7d6542SBram Moolenaar  delete('Xreload.vim')
16528a7d6542SBram Moolenaar  delete('Ximport.vim')
16538a7d6542SBram Moolenaarenddef
16548a7d6542SBram Moolenaar
165507a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
165607a65d26SBram Moolenaar" compiled function using that variable must fail.
165707a65d26SBram Moolenaardef Test_script_reload_change_type()
165807a65d26SBram Moolenaar  var lines =<< trim END
165907a65d26SBram Moolenaar    vim9script noclear
166007a65d26SBram Moolenaar    var str = 'string'
166107a65d26SBram Moolenaar    def g:GetStr(): string
166207a65d26SBram Moolenaar      return str .. 'xxx'
166307a65d26SBram Moolenaar    enddef
166407a65d26SBram Moolenaar  END
166507a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
166607a65d26SBram Moolenaar  source Xreload.vim
166707a65d26SBram Moolenaar  echo g:GetStr()
166807a65d26SBram Moolenaar
166907a65d26SBram Moolenaar  lines =<< trim END
167007a65d26SBram Moolenaar    vim9script noclear
167107a65d26SBram Moolenaar    var str = 1234
167207a65d26SBram Moolenaar  END
167307a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
167407a65d26SBram Moolenaar  source Xreload.vim
167507a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
167607a65d26SBram Moolenaar
167707a65d26SBram Moolenaar  delfunc g:GetStr
167807a65d26SBram Moolenaar  delete('Xreload.vim')
167907a65d26SBram Moolenaarenddef
168007a65d26SBram Moolenaar
1681c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled
1682c970e422SBram Moolenaarcommand CallFunc echo 'nop'
1683c970e422SBram Moolenaar
1684c970e422SBram Moolenaardef Test_script_reload_from_function()
1685c970e422SBram Moolenaar  var lines =<< trim END
1686c970e422SBram Moolenaar      vim9script
1687c970e422SBram Moolenaar
1688c970e422SBram Moolenaar      if exists('g:loaded')
1689c970e422SBram Moolenaar        finish
1690c970e422SBram Moolenaar      endif
1691c970e422SBram Moolenaar      g:loaded = 1
1692c970e422SBram Moolenaar      delcommand CallFunc
1693c970e422SBram Moolenaar      command CallFunc Func()
1694c970e422SBram Moolenaar      def Func()
1695a4c81beaSBram Moolenaar        so XreloadFunc.vim
1696c970e422SBram Moolenaar        g:didTheFunc = 1
1697c970e422SBram Moolenaar      enddef
1698c970e422SBram Moolenaar  END
1699c970e422SBram Moolenaar  writefile(lines, 'XreloadFunc.vim')
1700c970e422SBram Moolenaar  source XreloadFunc.vim
1701c970e422SBram Moolenaar  CallFunc
1702c970e422SBram Moolenaar  assert_equal(1, g:didTheFunc)
1703c970e422SBram Moolenaar
1704c970e422SBram Moolenaar  delete('XreloadFunc.vim')
1705c970e422SBram Moolenaar  delcommand CallFunc
1706c970e422SBram Moolenaar  unlet g:loaded
1707c970e422SBram Moolenaar  unlet g:didTheFunc
1708c970e422SBram Moolenaarenddef
1709c970e422SBram Moolenaar
17106c3843caSBram Moolenaardef Test_script_var_shadows_function()
17116c3843caSBram Moolenaar  var lines =<< trim END
17126c3843caSBram Moolenaar      vim9script
17136c3843caSBram Moolenaar      def Func(): number
17146c3843caSBram Moolenaar        return 123
17156c3843caSBram Moolenaar      enddef
17166c3843caSBram Moolenaar      var Func = 1
17176c3843caSBram Moolenaar  END
17186c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
17196c3843caSBram Moolenaarenddef
17206c3843caSBram Moolenaar
172195006e3dSBram Moolenaardef s:RetSome(): string
172295006e3dSBram Moolenaar  return 'some'
172395006e3dSBram Moolenaarenddef
172495006e3dSBram Moolenaar
1725fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1726fe465a01SBram Moolenaar" script-local name.
1727fe465a01SBram Moolenaardef Test_vim9script_funcref()
1728cfcd011fSBram Moolenaar  var sortlines =<< trim END
1729fe465a01SBram Moolenaar      vim9script
1730fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1731bed36b93SBram Moolenaar        return i2 - i1
1732fe465a01SBram Moolenaar      enddef
1733fe465a01SBram Moolenaar
1734fe465a01SBram Moolenaar      export def FastSort(): list<number>
1735fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1736fe465a01SBram Moolenaar      enddef
1737529fb5a5SBram Moolenaar
1738529fb5a5SBram Moolenaar      export def GetString(arg: string): string
1739529fb5a5SBram Moolenaar        return arg
1740529fb5a5SBram Moolenaar      enddef
1741fe465a01SBram Moolenaar  END
1742fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1743fe465a01SBram Moolenaar
1744cfcd011fSBram Moolenaar  var lines =<< trim END
1745fe465a01SBram Moolenaar    vim9script
1746fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1747fe465a01SBram Moolenaar    def Test()
1748fe465a01SBram Moolenaar      g:result = FastSort()
1749fe465a01SBram Moolenaar    enddef
1750fe465a01SBram Moolenaar    Test()
1751529fb5a5SBram Moolenaar
1752529fb5a5SBram Moolenaar    # using a function imported with "as"
1753529fb5a5SBram Moolenaar    import * as anAlias from './Xsort.vim'
1754529fb5a5SBram Moolenaar    assert_equal('yes', anAlias.GetString('yes'))
1755529fb5a5SBram Moolenaar
1756529fb5a5SBram Moolenaar    # using the function from a compiled function
1757529fb5a5SBram Moolenaar    def TestMore(): string
1758ca51cc0aSBram Moolenaar      var s = s:anAlias.GetString('foo')
1759ca51cc0aSBram Moolenaar      return s .. anAlias.GetString('bar')
1760529fb5a5SBram Moolenaar    enddef
1761ca51cc0aSBram Moolenaar    assert_equal('foobar', TestMore())
1762529fb5a5SBram Moolenaar
1763529fb5a5SBram Moolenaar    # error when using a function that isn't exported
1764529fb5a5SBram Moolenaar    assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1765fe465a01SBram Moolenaar  END
1766fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1767fe465a01SBram Moolenaar
1768fe465a01SBram Moolenaar  source Xscript.vim
1769fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1770fe465a01SBram Moolenaar
1771fe465a01SBram Moolenaar  unlet g:result
1772fe465a01SBram Moolenaar  delete('Xsort.vim')
1773fe465a01SBram Moolenaar  delete('Xscript.vim')
177495006e3dSBram Moolenaar
1775cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
177695006e3dSBram Moolenaar  assert_equal('some', Funcref())
1777fe465a01SBram Moolenaarenddef
1778fe465a01SBram Moolenaar
1779601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1780601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1781601e76acSBram Moolenaar" function reference.
1782c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1783cfcd011fSBram Moolenaar  var filterLines =<< trim END
1784c620c055SBram Moolenaar    vim9script
1785c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1786c620c055SBram Moolenaar      return idx % 2 == 1
1787c620c055SBram Moolenaar    enddef
1788c620c055SBram Moolenaar    export def FastFilter(): list<number>
1789c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1790c620c055SBram Moolenaar    enddef
1791601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1792601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1793601e76acSBram Moolenaar    enddef
1794c620c055SBram Moolenaar  END
1795c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1796c620c055SBram Moolenaar
1797cfcd011fSBram Moolenaar  var lines =<< trim END
1798c620c055SBram Moolenaar    vim9script
1799601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1800c620c055SBram Moolenaar    def Test()
1801cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1802c620c055SBram Moolenaar    enddef
1803c620c055SBram Moolenaar    Test()
1804601e76acSBram Moolenaar    def TestDirect()
1805cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1806601e76acSBram Moolenaar    enddef
1807601e76acSBram Moolenaar    TestDirect()
1808c620c055SBram Moolenaar  END
1809601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1810c620c055SBram Moolenaar  delete('Xfilter.vim')
1811c620c055SBram Moolenaarenddef
1812c620c055SBram Moolenaar
18134c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1814cfcd011fSBram Moolenaar  var first_lines =<< trim END
18154c17ad94SBram Moolenaar    vim9script
18164c17ad94SBram Moolenaar    def FuncYes(): string
18174c17ad94SBram Moolenaar      return 'yes'
18184c17ad94SBram Moolenaar    enddef
18194c17ad94SBram Moolenaar  END
1820cfcd011fSBram Moolenaar  var withno_lines =<< trim END
18214c17ad94SBram Moolenaar    def FuncNo(): string
18224c17ad94SBram Moolenaar      return 'no'
18234c17ad94SBram Moolenaar    enddef
18244c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
18254c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
18264c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
182703afdcf1SBram Moolenaar    enddef
182803afdcf1SBram Moolenaar  END
1829cfcd011fSBram Moolenaar  var nono_lines =<< trim END
183003afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
183103afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
183244d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
18334c17ad94SBram Moolenaar    enddef
18344c17ad94SBram Moolenaar  END
18354c17ad94SBram Moolenaar
18364c17ad94SBram Moolenaar  # FuncNo() is defined
183703afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
18384c17ad94SBram Moolenaar  source Xreloaded.vim
18394c17ad94SBram Moolenaar  g:DoCheck(true)
18404c17ad94SBram Moolenaar
18414c17ad94SBram Moolenaar  # FuncNo() is not redefined
184203afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
18434c17ad94SBram Moolenaar  source Xreloaded.vim
18445082471fSBram Moolenaar  g:DoCheck(false)
18454c17ad94SBram Moolenaar
18464c17ad94SBram Moolenaar  # FuncNo() is back
184703afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
18484c17ad94SBram Moolenaar  source Xreloaded.vim
18495082471fSBram Moolenaar  g:DoCheck(false)
18504c17ad94SBram Moolenaar
18514c17ad94SBram Moolenaar  delete('Xreloaded.vim')
18524c17ad94SBram Moolenaarenddef
18534c17ad94SBram Moolenaar
185489483d40SBram Moolenaardef Test_vim9script_reload_delvar()
185589483d40SBram Moolenaar  # write the script with a script-local variable
1856cfcd011fSBram Moolenaar  var lines =<< trim END
185789483d40SBram Moolenaar    vim9script
1858cfcd011fSBram Moolenaar    var name = 'string'
185989483d40SBram Moolenaar  END
186089483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
186189483d40SBram Moolenaar  source XreloadVar.vim
186289483d40SBram Moolenaar
186389483d40SBram Moolenaar  # now write the script using the same variable locally - works
186489483d40SBram Moolenaar  lines =<< trim END
186589483d40SBram Moolenaar    vim9script
186689483d40SBram Moolenaar    def Func()
1867cfcd011fSBram Moolenaar      var name = 'string'
186889483d40SBram Moolenaar    enddef
186989483d40SBram Moolenaar  END
187089483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
187189483d40SBram Moolenaar  source XreloadVar.vim
187289483d40SBram Moolenaar
187389483d40SBram Moolenaar  delete('XreloadVar.vim')
187489483d40SBram Moolenaarenddef
187589483d40SBram Moolenaar
18768a7d6542SBram Moolenaardef Test_import_absolute()
1877cfcd011fSBram Moolenaar  var import_lines = [
1878e6085c53SBram Moolenaar        'vim9script',
1879e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1880e6085c53SBram Moolenaar        'def UseExported()',
1881e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1882e6085c53SBram Moolenaar        '  exported = 8888',
1883e6085c53SBram Moolenaar        '  g:imported_after = exported',
1884e6085c53SBram Moolenaar        'enddef',
1885e6085c53SBram Moolenaar        'UseExported()',
1886e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1887e6085c53SBram Moolenaar        ]
18888a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
18898a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
18908a7d6542SBram Moolenaar
18918a7d6542SBram Moolenaar  source Ximport_abs.vim
18928a7d6542SBram Moolenaar
18938a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
18944e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1895fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1896fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1897fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1898fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1899fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1900fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1901fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1902fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1903fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1904fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1905e6085c53SBram Moolenaar        g:import_disassembled)
1906b3ca9824SBram Moolenaar
1907b3ca9824SBram Moolenaar  Undo_export_script_lines()
19088a7d6542SBram Moolenaar  unlet g:imported_abs
19094e12a5dfSBram Moolenaar  unlet g:import_disassembled
19108a7d6542SBram Moolenaar
19118a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
19128a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
19138a7d6542SBram Moolenaarenddef
19148a7d6542SBram Moolenaar
19158a7d6542SBram Moolenaardef Test_import_rtp()
1916cfcd011fSBram Moolenaar  var import_lines = [
1917e6085c53SBram Moolenaar        'vim9script',
1918e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1919e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1920e6085c53SBram Moolenaar        ]
19218a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
19228a7d6542SBram Moolenaar  mkdir('import')
19238a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
19248a7d6542SBram Moolenaar
1925cfcd011fSBram Moolenaar  var save_rtp = &rtp
19268a7d6542SBram Moolenaar  &rtp = getcwd()
19278a7d6542SBram Moolenaar  source Ximport_rtp.vim
19288a7d6542SBram Moolenaar  &rtp = save_rtp
19298a7d6542SBram Moolenaar
19308a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
19318a7d6542SBram Moolenaar
1932b3ca9824SBram Moolenaar  Undo_export_script_lines()
1933b3ca9824SBram Moolenaar  unlet g:imported_rtp
19348a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
193589483d40SBram Moolenaar  delete('import', 'rf')
19368a7d6542SBram Moolenaarenddef
19378a7d6542SBram Moolenaar
193825e0f586SBram Moolenaardef Test_import_compile_error()
1939cfcd011fSBram Moolenaar  var export_lines = [
194025e0f586SBram Moolenaar        'vim9script',
194125e0f586SBram Moolenaar        'export def ExpFunc(): string',
194225e0f586SBram Moolenaar        '  return notDefined',
194325e0f586SBram Moolenaar        'enddef',
194425e0f586SBram Moolenaar        ]
194525e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
194625e0f586SBram Moolenaar
1947cfcd011fSBram Moolenaar  var import_lines = [
194825e0f586SBram Moolenaar        'vim9script',
194925e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
195025e0f586SBram Moolenaar        'def ImpFunc()',
195125e0f586SBram Moolenaar        '  echo ExpFunc()',
195225e0f586SBram Moolenaar        'enddef',
195325e0f586SBram Moolenaar        'defcompile',
195425e0f586SBram Moolenaar        ]
195525e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
195625e0f586SBram Moolenaar
195725e0f586SBram Moolenaar  try
195825e0f586SBram Moolenaar    source Ximport.vim
195925e0f586SBram Moolenaar  catch /E1001/
1960f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
19617707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
196225e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
196325e0f586SBram Moolenaar  endtry
196425e0f586SBram Moolenaar
196525e0f586SBram Moolenaar  delete('Xexported.vim')
196625e0f586SBram Moolenaar  delete('Ximport.vim')
196725e0f586SBram Moolenaarenddef
196825e0f586SBram Moolenaar
1969c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1970cfcd011fSBram Moolenaar  var lines = [
1971c4ce36d4SBram Moolenaar        'vim9script',
1972c4ce36d4SBram Moolenaar        'def Func()',
1973c4ce36d4SBram Moolenaar        '  eval [][0]',
1974c4ce36d4SBram Moolenaar        'enddef',
1975c4ce36d4SBram Moolenaar        'Func()',
1976c4ce36d4SBram Moolenaar        ]
1977c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1978c4ce36d4SBram Moolenaar
1979c4ce36d4SBram Moolenaar  for count in range(3)
1980c4ce36d4SBram Moolenaar    try
1981c4ce36d4SBram Moolenaar      source Xtestscript.vim
1982c4ce36d4SBram Moolenaar    catch /E684/
1983c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1984c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1985c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1986c4ce36d4SBram Moolenaar    endtry
1987c4ce36d4SBram Moolenaar  endfor
1988c4ce36d4SBram Moolenaar
1989c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1990c4ce36d4SBram Moolenaarenddef
1991c4ce36d4SBram Moolenaar
1992eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1993cfcd011fSBram Moolenaar  var export_lines =<< trim END
1994eef2102eSBram Moolenaar      vim9script
1995eef2102eSBram Moolenaar      export def Func()
1996eef2102eSBram Moolenaar        echo 'imported'
1997eef2102eSBram Moolenaar      enddef
1998eef2102eSBram Moolenaar  END
1999eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
2000eef2102eSBram Moolenaar
2001cfcd011fSBram Moolenaar  var lines =<< trim END
2002eef2102eSBram Moolenaar    vim9script
2003eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2004eef2102eSBram Moolenaar    def Func()
2005eef2102eSBram Moolenaar      echo 'local to function'
2006eef2102eSBram Moolenaar    enddef
2007eef2102eSBram Moolenaar  END
2008eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2009eef2102eSBram Moolenaar
2010eef2102eSBram Moolenaar  lines =<< trim END
2011eef2102eSBram Moolenaar    vim9script
2012eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2013eef2102eSBram Moolenaar    def Outer()
2014eef2102eSBram Moolenaar      def Func()
2015eef2102eSBram Moolenaar        echo 'local to function'
2016eef2102eSBram Moolenaar      enddef
2017eef2102eSBram Moolenaar    enddef
2018eef2102eSBram Moolenaar    defcompile
2019eef2102eSBram Moolenaar  END
2020eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2021eef2102eSBram Moolenaar
2022eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
2023eef2102eSBram Moolenaarenddef
2024eef2102eSBram Moolenaar
2025b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
2026cfcd011fSBram Moolenaar  var lines =<< trim END
2027b9a2cac3SBram Moolenaar    vim9script
2028b9a2cac3SBram Moolenaar    def Func()
2029b9a2cac3SBram Moolenaar      echo 'one'
2030b9a2cac3SBram Moolenaar    enddef
2031b9a2cac3SBram Moolenaar    def Func()
2032b9a2cac3SBram Moolenaar      echo 'two'
2033b9a2cac3SBram Moolenaar    enddef
2034b9a2cac3SBram Moolenaar  END
2035b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2036fa211f3cSBram Moolenaar
2037fa211f3cSBram Moolenaar  lines =<< trim END
2038fa211f3cSBram Moolenaar    vim9script
2039fa211f3cSBram Moolenaar    def Foo(): string
2040fa211f3cSBram Moolenaar      return 'foo'
2041fa211f3cSBram Moolenaar      enddef
2042fa211f3cSBram Moolenaar    def Func()
2043cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
2044fa211f3cSBram Moolenaar    enddef
2045fa211f3cSBram Moolenaar    defcompile
2046fa211f3cSBram Moolenaar  END
2047fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2048b9a2cac3SBram Moolenaarenddef
2049b9a2cac3SBram Moolenaar
20508a7d6542SBram Moolenaardef Test_fixed_size_list()
2051f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
2052cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
20538a7d6542SBram Moolenaar  l->remove(0)
20548a7d6542SBram Moolenaar  l->add(5)
20558a7d6542SBram Moolenaar  l->insert(99, 1)
20560f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
20578a7d6542SBram Moolenaarenddef
20588a7d6542SBram Moolenaar
2059ae616494SBram Moolenaardef Test_no_insert_xit()
2060d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2061d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2062d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2063d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2064d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2065ae616494SBram Moolenaar
2066ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2067ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2068ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2069ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2070f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2071f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
20726508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
20736508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
2074f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2075f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2076f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2077ae616494SBram Moolenaarenddef
2078ae616494SBram Moolenaar
2079158906cfSBram Moolenaardef IfElse(what: number): string
2080cfcd011fSBram Moolenaar  var res = ''
2081158906cfSBram Moolenaar  if what == 1
2082158906cfSBram Moolenaar    res = "one"
2083158906cfSBram Moolenaar  elseif what == 2
2084158906cfSBram Moolenaar    res = "two"
2085a259d8d3SBram Moolenaar  else
2086158906cfSBram Moolenaar    res = "three"
2087a259d8d3SBram Moolenaar  endif
2088158906cfSBram Moolenaar  return res
2089a259d8d3SBram Moolenaarenddef
2090a259d8d3SBram Moolenaar
2091158906cfSBram Moolenaardef Test_if_elseif_else()
2092158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2093158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2094158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
20950f18b6d1SBram Moolenaarenddef
20960f18b6d1SBram Moolenaar
2097e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2098d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2099d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2100d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2101ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
2102d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
21036628b7ebSBram Moolenaar
21046628b7ebSBram Moolenaar  var lines =<< trim END
21056628b7ebSBram Moolenaar      var s = ''
21066628b7ebSBram Moolenaar      if s = ''
21076628b7ebSBram Moolenaar      endif
21086628b7ebSBram Moolenaar  END
21096628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
21106628b7ebSBram Moolenaar
21116628b7ebSBram Moolenaar  lines =<< trim END
21126628b7ebSBram Moolenaar      var s = ''
21136628b7ebSBram Moolenaar      if s == ''
21146628b7ebSBram Moolenaar      elseif s = ''
21156628b7ebSBram Moolenaar      endif
21166628b7ebSBram Moolenaar  END
21176628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2118e8c4abbbSBram Moolenaarenddef
2119e8c4abbbSBram Moolenaar
21206d69bf60SBram Moolenaarlet g:bool_true = v:true
21216d69bf60SBram Moolenaarlet g:bool_false = v:false
21226d69bf60SBram Moolenaar
21236d69bf60SBram Moolenaardef Test_if_const_expr()
2124cfcd011fSBram Moolenaar  var res = false
21256d69bf60SBram Moolenaar  if true ? true : false
21266d69bf60SBram Moolenaar    res = true
21276d69bf60SBram Moolenaar  endif
21286d69bf60SBram Moolenaar  assert_equal(true, res)
21296d69bf60SBram Moolenaar
2130585fea7bSBram Moolenaar  g:glob = 2
2131585fea7bSBram Moolenaar  if false
21326797966dSBram Moolenaar    execute('g:glob = 3')
2133585fea7bSBram Moolenaar  endif
2134585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2135585fea7bSBram Moolenaar  if true
21366797966dSBram Moolenaar    execute('g:glob = 3')
2137585fea7bSBram Moolenaar  endif
2138585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2139585fea7bSBram Moolenaar
21406d69bf60SBram Moolenaar  res = false
21416d69bf60SBram Moolenaar  if g:bool_true ? true : false
21426d69bf60SBram Moolenaar    res = true
21436d69bf60SBram Moolenaar  endif
21446d69bf60SBram Moolenaar  assert_equal(true, res)
21456d69bf60SBram Moolenaar
21466d69bf60SBram Moolenaar  res = false
21476d69bf60SBram Moolenaar  if true ? g:bool_true : false
21486d69bf60SBram Moolenaar    res = true
21496d69bf60SBram Moolenaar  endif
21506d69bf60SBram Moolenaar  assert_equal(true, res)
21516d69bf60SBram Moolenaar
21526d69bf60SBram Moolenaar  res = false
21536d69bf60SBram Moolenaar  if true ? true : g:bool_false
21546d69bf60SBram Moolenaar    res = true
21556d69bf60SBram Moolenaar  endif
21566d69bf60SBram Moolenaar  assert_equal(true, res)
21576d69bf60SBram Moolenaar
21586d69bf60SBram Moolenaar  res = false
21596d69bf60SBram Moolenaar  if true ? false : true
21606d69bf60SBram Moolenaar    res = true
21616d69bf60SBram Moolenaar  endif
21626d69bf60SBram Moolenaar  assert_equal(false, res)
21636d69bf60SBram Moolenaar
21646d69bf60SBram Moolenaar  res = false
21656d69bf60SBram Moolenaar  if false ? false : true
21666d69bf60SBram Moolenaar    res = true
21676d69bf60SBram Moolenaar  endif
21686d69bf60SBram Moolenaar  assert_equal(true, res)
21696d69bf60SBram Moolenaar
21706d69bf60SBram Moolenaar  res = false
21716d69bf60SBram Moolenaar  if false ? true : false
21726d69bf60SBram Moolenaar    res = true
21736d69bf60SBram Moolenaar  endif
21746d69bf60SBram Moolenaar  assert_equal(false, res)
21756d69bf60SBram Moolenaar
21766d69bf60SBram Moolenaar  res = false
2177e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2178e8c4abbbSBram Moolenaar    res = true
2179e8c4abbbSBram Moolenaar  endif
2180e8c4abbbSBram Moolenaar  assert_equal(false, res)
2181e8c4abbbSBram Moolenaar
2182e8c4abbbSBram Moolenaar  res = false
21836d69bf60SBram Moolenaar  if true && true
21846d69bf60SBram Moolenaar    res = true
21856d69bf60SBram Moolenaar  endif
21866d69bf60SBram Moolenaar  assert_equal(true, res)
21876d69bf60SBram Moolenaar
21886d69bf60SBram Moolenaar  res = false
21896d69bf60SBram Moolenaar  if true && false
21906d69bf60SBram Moolenaar    res = true
21916d69bf60SBram Moolenaar  endif
21926d69bf60SBram Moolenaar  assert_equal(false, res)
21936d69bf60SBram Moolenaar
21946d69bf60SBram Moolenaar  res = false
21956d69bf60SBram Moolenaar  if g:bool_true && false
21966d69bf60SBram Moolenaar    res = true
21976d69bf60SBram Moolenaar  endif
21986d69bf60SBram Moolenaar  assert_equal(false, res)
21996d69bf60SBram Moolenaar
22006d69bf60SBram Moolenaar  res = false
22016d69bf60SBram Moolenaar  if true && g:bool_false
22026d69bf60SBram Moolenaar    res = true
22036d69bf60SBram Moolenaar  endif
22046d69bf60SBram Moolenaar  assert_equal(false, res)
22056d69bf60SBram Moolenaar
22066d69bf60SBram Moolenaar  res = false
22076d69bf60SBram Moolenaar  if false && false
22086d69bf60SBram Moolenaar    res = true
22096d69bf60SBram Moolenaar  endif
22106d69bf60SBram Moolenaar  assert_equal(false, res)
22116d69bf60SBram Moolenaar
22126d69bf60SBram Moolenaar  res = false
22136d69bf60SBram Moolenaar  if true || false
22146d69bf60SBram Moolenaar    res = true
22156d69bf60SBram Moolenaar  endif
22166d69bf60SBram Moolenaar  assert_equal(true, res)
22176d69bf60SBram Moolenaar
22186d69bf60SBram Moolenaar  res = false
22196d69bf60SBram Moolenaar  if g:bool_true || false
22206d69bf60SBram Moolenaar    res = true
22216d69bf60SBram Moolenaar  endif
22226d69bf60SBram Moolenaar  assert_equal(true, res)
22236d69bf60SBram Moolenaar
22246d69bf60SBram Moolenaar  res = false
22256d69bf60SBram Moolenaar  if true || g:bool_false
22266d69bf60SBram Moolenaar    res = true
22276d69bf60SBram Moolenaar  endif
22286d69bf60SBram Moolenaar  assert_equal(true, res)
22296d69bf60SBram Moolenaar
22306d69bf60SBram Moolenaar  res = false
22316d69bf60SBram Moolenaar  if false || false
22326d69bf60SBram Moolenaar    res = true
22336d69bf60SBram Moolenaar  endif
22346d69bf60SBram Moolenaar  assert_equal(false, res)
22353988f64fSBram Moolenaar
22363988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
22373988f64fSBram Moolenaar  if false | eval 0 | endif
22383988f64fSBram Moolenaar  if false | eval burp + 234 | endif
22393988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
22403988f64fSBram Moolenaar  if false
22413988f64fSBram Moolenaar    burp
22423988f64fSBram Moolenaar  endif
224380c34ca3SBram Moolenaarenddef
22446d69bf60SBram Moolenaar
224580c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2246d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2247d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2248d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2249d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
22506d69bf60SBram Moolenaarenddef
22516d69bf60SBram Moolenaar
225272abcf42SBram Moolenaardef RunNested(i: number): number
2253cfcd011fSBram Moolenaar  var x: number = 0
225472abcf42SBram Moolenaar  if i % 2
225572abcf42SBram Moolenaar    if 1
2256f5be8cdbSBram Moolenaar      # comment
225772abcf42SBram Moolenaar    else
2258f5be8cdbSBram Moolenaar      # comment
225972abcf42SBram Moolenaar    endif
226072abcf42SBram Moolenaar    x += 1
226172abcf42SBram Moolenaar  else
226272abcf42SBram Moolenaar    x += 1000
226372abcf42SBram Moolenaar  endif
226472abcf42SBram Moolenaar  return x
226572abcf42SBram Moolenaarenddef
226672abcf42SBram Moolenaar
226772abcf42SBram Moolenaardef Test_nested_if()
226872abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
226972abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
227072abcf42SBram Moolenaarenddef
227172abcf42SBram Moolenaar
2272ad39c094SBram Moolenaardef Test_execute_cmd()
2273e4984290SBram Moolenaar  # missing argument is ignored
2274e4984290SBram Moolenaar  execute
2275e4984290SBram Moolenaar  execute # comment
2276e4984290SBram Moolenaar
2277ad39c094SBram Moolenaar  new
2278ad39c094SBram Moolenaar  setline(1, 'default')
2279d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2280ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2281a72cfb80SBram Moolenaar
2282d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2283a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2284a72cfb80SBram Moolenaar
2285cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2286cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2287a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2288ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2289a72cfb80SBram Moolenaar
2290d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2291ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2292a72cfb80SBram Moolenaar
2293cfcd011fSBram Moolenaar  var cmd_first = 'call '
2294cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2295ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2296ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2297ad39c094SBram Moolenaar  bwipe!
2298585fea7bSBram Moolenaar
2299cfcd011fSBram Moolenaar  var n = true
23002d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
23012d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
23022d6b20d6SBram Moolenaar
2303e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2304e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2305e5abf7afSBram Moolenaar
2306d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2307d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2308d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2309ad39c094SBram Moolenaarenddef
2310ad39c094SBram Moolenaar
231147e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2312f5be8cdbSBram Moolenaar  # only checks line continuation
2313cfcd011fSBram Moolenaar  var lines =<< trim END
231447e880d6SBram Moolenaar      vim9script
231547e880d6SBram Moolenaar      execute 'g:someVar'
231647e880d6SBram Moolenaar                .. ' = ' ..
231747e880d6SBram Moolenaar                   '28'
231847e880d6SBram Moolenaar      assert_equal(28, g:someVar)
231947e880d6SBram Moolenaar      unlet g:someVar
232047e880d6SBram Moolenaar  END
232147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
232247e880d6SBram Moolenaarenddef
232347e880d6SBram Moolenaar
2324ad39c094SBram Moolenaardef Test_echo_cmd()
2325a72cfb80SBram Moolenaar  echo 'some' # comment
2326585fea7bSBram Moolenaar  echon 'thing'
2327ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2328ad39c094SBram Moolenaar
2329a72cfb80SBram Moolenaar  echo "some" # comment
2330a72cfb80SBram Moolenaar  echon "thing"
2331a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2332a72cfb80SBram Moolenaar
2333cfcd011fSBram Moolenaar  var str1 = 'some'
2334cfcd011fSBram Moolenaar  var str2 = 'more'
2335ad39c094SBram Moolenaar  echo str1 str2
2336ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2337a72cfb80SBram Moolenaar
2338d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2339ad39c094SBram Moolenaarenddef
2340ad39c094SBram Moolenaar
2341f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2342f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2343f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2344f93c7feaSBram Moolenaar  echo 'clear'
2345df069eecSBram Moolenaar  :1messages
2346f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2347f93c7feaSBram Moolenaar
2348d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2349f93c7feaSBram Moolenaarenddef
2350f93c7feaSBram Moolenaar
235147e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2352f5be8cdbSBram Moolenaar  # only checks line continuation
2353cfcd011fSBram Moolenaar  var lines =<< trim END
235447e880d6SBram Moolenaar      vim9script
235547e880d6SBram Moolenaar      echomsg 'here'
235647e880d6SBram Moolenaar                .. ' is ' ..
235747e880d6SBram Moolenaar                   'a message'
235847e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
235947e880d6SBram Moolenaar  END
236047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
236147e880d6SBram Moolenaarenddef
236247e880d6SBram Moolenaar
2363f93c7feaSBram Moolenaardef Test_echoerr_cmd()
236440ee466cSBram Moolenaar  try
236540ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
236640ee466cSBram Moolenaar  catch
236740ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
236840ee466cSBram Moolenaar  endtry
2369f93c7feaSBram Moolenaarenddef
2370f93c7feaSBram Moolenaar
237147e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2372f5be8cdbSBram Moolenaar  # only checks line continuation
2373cfcd011fSBram Moolenaar  var lines =<< trim END
237447e880d6SBram Moolenaar      vim9script
237547e880d6SBram Moolenaar      try
237647e880d6SBram Moolenaar        echoerr 'this'
237747e880d6SBram Moolenaar                .. ' is ' ..
237847e880d6SBram Moolenaar                   'wrong'
237947e880d6SBram Moolenaar      catch
238047e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
238147e880d6SBram Moolenaar      endtry
238247e880d6SBram Moolenaar  END
238347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
238447e880d6SBram Moolenaarenddef
238547e880d6SBram Moolenaar
238641fe0617SBram Moolenaardef Test_for_outside_of_function()
2387cfcd011fSBram Moolenaar  var lines =<< trim END
238841fe0617SBram Moolenaar    vim9script
238941fe0617SBram Moolenaar    new
239041fe0617SBram Moolenaar    for var in range(0, 3)
239141fe0617SBram Moolenaar      append(line('$'), var)
239241fe0617SBram Moolenaar    endfor
239341fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
239441fe0617SBram Moolenaar    bwipe!
2395522eefd9SBram Moolenaar
2396522eefd9SBram Moolenaar    var result = ''
2397522eefd9SBram Moolenaar    for i in [1, 2, 3]
2398522eefd9SBram Moolenaar      var loop = ' loop ' .. i
2399522eefd9SBram Moolenaar      result ..= loop
2400522eefd9SBram Moolenaar    endfor
2401522eefd9SBram Moolenaar    assert_equal(' loop 1 loop 2 loop 3', result)
240241fe0617SBram Moolenaar  END
240341fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
240441fe0617SBram Moolenaar  source Xvim9for.vim
240541fe0617SBram Moolenaar  delete('Xvim9for.vim')
240641fe0617SBram Moolenaarenddef
24078a7d6542SBram Moolenaar
2408e8c4abbbSBram Moolenaardef Test_for_loop()
2409f2253963SBram Moolenaar  var lines =<< trim END
2410cfcd011fSBram Moolenaar      var result = ''
2411e8c4abbbSBram Moolenaar      for cnt in range(7)
2412e8c4abbbSBram Moolenaar        if cnt == 4
2413e8c4abbbSBram Moolenaar          break
2414e8c4abbbSBram Moolenaar        endif
2415e8c4abbbSBram Moolenaar        if cnt == 2
2416e8c4abbbSBram Moolenaar          continue
2417e8c4abbbSBram Moolenaar        endif
2418e8c4abbbSBram Moolenaar        result ..= cnt .. '_'
2419e8c4abbbSBram Moolenaar      endfor
2420e8c4abbbSBram Moolenaar      assert_equal('0_1_3_', result)
24210ad3e894SBram Moolenaar
2422cfcd011fSBram Moolenaar      var concat = ''
24230ad3e894SBram Moolenaar      for str in eval('["one", "two"]')
24240ad3e894SBram Moolenaar        concat ..= str
24250ad3e894SBram Moolenaar      endfor
24260ad3e894SBram Moolenaar      assert_equal('onetwo', concat)
242738bd8de5SBram Moolenaar
242838bd8de5SBram Moolenaar      var total = 0
242938bd8de5SBram Moolenaar      for nr in
243038bd8de5SBram Moolenaar          [1, 2, 3]
243138bd8de5SBram Moolenaar        total += nr
243238bd8de5SBram Moolenaar      endfor
243338bd8de5SBram Moolenaar      assert_equal(6, total)
243438bd8de5SBram Moolenaar
243538bd8de5SBram Moolenaar      total = 0
243638bd8de5SBram Moolenaar      for nr
243738bd8de5SBram Moolenaar        in [1, 2, 3]
243838bd8de5SBram Moolenaar        total += nr
243938bd8de5SBram Moolenaar      endfor
244038bd8de5SBram Moolenaar      assert_equal(6, total)
244138bd8de5SBram Moolenaar
244238bd8de5SBram Moolenaar      total = 0
244338bd8de5SBram Moolenaar      for nr
244438bd8de5SBram Moolenaar        in
244538bd8de5SBram Moolenaar        [1, 2, 3]
244638bd8de5SBram Moolenaar        total += nr
244738bd8de5SBram Moolenaar      endfor
244838bd8de5SBram Moolenaar      assert_equal(6, total)
2449036d0714SBram Moolenaar
2450a3589a0dSBram Moolenaar      # with type
2451a3589a0dSBram Moolenaar      total = 0
2452a3589a0dSBram Moolenaar      for n: number in [1, 2, 3]
2453a3589a0dSBram Moolenaar        total += n
2454a3589a0dSBram Moolenaar      endfor
2455a3589a0dSBram Moolenaar      assert_equal(6, total)
2456a3589a0dSBram Moolenaar
2457fe090eb5SBram Moolenaar      var chars = ''
2458fe090eb5SBram Moolenaar      for s: string in 'foobar'
2459fe090eb5SBram Moolenaar        chars ..= s
2460fe090eb5SBram Moolenaar      endfor
2461fe090eb5SBram Moolenaar      assert_equal('foobar', chars)
2462fe090eb5SBram Moolenaar
2463a3589a0dSBram Moolenaar      # unpack with type
2464f2253963SBram Moolenaar      var res = ''
2465a3589a0dSBram Moolenaar      for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2466a3589a0dSBram Moolenaar        res ..= n .. s
2467a3589a0dSBram Moolenaar      endfor
2468a3589a0dSBram Moolenaar      assert_equal('1a2b', res)
2469a3589a0dSBram Moolenaar
2470444d8783SBram Moolenaar      # unpack with one var
2471444d8783SBram Moolenaar      var reslist = []
2472444d8783SBram Moolenaar      for [x] in [['aaa'], ['bbb']]
2473444d8783SBram Moolenaar        reslist->add(x)
2474444d8783SBram Moolenaar      endfor
2475444d8783SBram Moolenaar      assert_equal(['aaa', 'bbb'], reslist)
2476444d8783SBram Moolenaar
2477a3589a0dSBram Moolenaar      # loop over string
2478a3589a0dSBram Moolenaar      res = ''
247974e54fcbSBram Moolenaar      for c in 'aéc̀d'
248074e54fcbSBram Moolenaar        res ..= c .. '-'
248174e54fcbSBram Moolenaar      endfor
248274e54fcbSBram Moolenaar      assert_equal('a-é-c̀-d-', res)
248374e54fcbSBram Moolenaar
248474e54fcbSBram Moolenaar      res = ''
248574e54fcbSBram Moolenaar      for c in ''
248674e54fcbSBram Moolenaar        res ..= c .. '-'
248774e54fcbSBram Moolenaar      endfor
248874e54fcbSBram Moolenaar      assert_equal('', res)
248974e54fcbSBram Moolenaar
249074e54fcbSBram Moolenaar      res = ''
249174e54fcbSBram Moolenaar      for c in test_null_string()
249274e54fcbSBram Moolenaar        res ..= c .. '-'
249374e54fcbSBram Moolenaar      endfor
249474e54fcbSBram Moolenaar      assert_equal('', res)
2495f2253963SBram Moolenaar
2496f2253963SBram Moolenaar      var foo: list<dict<any>> = [
2497f2253963SBram Moolenaar              {a: 'Cat'}
2498f2253963SBram Moolenaar            ]
2499f2253963SBram Moolenaar      for dd in foo
2500f2253963SBram Moolenaar        dd.counter = 12
2501f2253963SBram Moolenaar      endfor
2502f2253963SBram Moolenaar      assert_equal([{a: 'Cat', counter: 12}], foo)
2503f2253963SBram Moolenaar  END
2504f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2505e8c4abbbSBram Moolenaarenddef
2506e8c4abbbSBram Moolenaar
2507e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2508025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2509025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2510025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2511675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2512675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2513cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2514822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
25152d870f8dSBram Moolenaar  delfunc! g:Func
2516675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2517675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2518675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
251974e54fcbSBram Moolenaar
252074e54fcbSBram Moolenaar  # wrong type detected at compile time
252174e54fcbSBram Moolenaar  CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
252274e54fcbSBram Moolenaar
252374e54fcbSBram Moolenaar  # wrong type detected at runtime
252474e54fcbSBram Moolenaar  g:adict = {a: 1}
252574e54fcbSBram Moolenaar  CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
252674e54fcbSBram Moolenaar  unlet g:adict
2527f6a8d420SBram Moolenaar
2528f6a8d420SBram Moolenaar  var lines =<< trim END
2529f6a8d420SBram Moolenaar      var d: list<dict<any>> = [{a: 0}]
2530f6a8d420SBram Moolenaar      for e in d
2531f6a8d420SBram Moolenaar        e = {a: 0, b: ''}
2532f6a8d420SBram Moolenaar      endfor
2533f6a8d420SBram Moolenaar  END
2534f6a8d420SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3)
2535fe090eb5SBram Moolenaar
2536fe090eb5SBram Moolenaar  lines =<< trim END
2537fe090eb5SBram Moolenaar      for nr: number in ['foo']
2538fe090eb5SBram Moolenaar      endfor
2539fe090eb5SBram Moolenaar  END
2540fe090eb5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2541e8c4abbbSBram Moolenaarenddef
2542e8c4abbbSBram Moolenaar
2543ea87069dSBram Moolenaardef Test_for_loop_script_var()
2544ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2545ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2546ea87069dSBram Moolenaar
2547ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2548ea87069dSBram Moolenaar  var lines =<< trim END
2549ea87069dSBram Moolenaar    vim9script
2550ea87069dSBram Moolenaar    var total = 0
2551ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2552ea87069dSBram Moolenaar      total += s:var
2553ea87069dSBram Moolenaar    endfor
2554ea87069dSBram Moolenaar    assert_equal(6, total)
2555ea87069dSBram Moolenaar
2556ea87069dSBram Moolenaar    total = 0
2557ea87069dSBram Moolenaar    for var in [1, 2, 3]
2558ea87069dSBram Moolenaar      total += var
2559ea87069dSBram Moolenaar    endfor
2560ea87069dSBram Moolenaar    assert_equal(6, total)
2561ea87069dSBram Moolenaar  END
2562ea87069dSBram Moolenaarenddef
2563ea87069dSBram Moolenaar
2564792f786aSBram Moolenaardef Test_for_loop_unpack()
25654b8a0651SBram Moolenaar  var lines =<< trim END
2566792f786aSBram Moolenaar      var result = []
2567792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2568792f786aSBram Moolenaar        result->add(v1)
2569792f786aSBram Moolenaar        result->add(v2)
2570792f786aSBram Moolenaar      endfor
2571792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2572792f786aSBram Moolenaar
2573792f786aSBram Moolenaar      result = []
2574792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2575792f786aSBram Moolenaar        result->add(v1)
2576792f786aSBram Moolenaar        result->add(v2)
2577792f786aSBram Moolenaar        result->add(v3)
2578792f786aSBram Moolenaar      endfor
2579792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2580792f786aSBram Moolenaar
25814b8a0651SBram Moolenaar      result = []
25824b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
25834b8a0651SBram Moolenaar        result->add(&ts)
25844b8a0651SBram Moolenaar        result->add(&sw)
25854b8a0651SBram Moolenaar      endfor
25864b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
25874b8a0651SBram Moolenaar
25884b8a0651SBram Moolenaar      var slist: list<string>
25894b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
25904b8a0651SBram Moolenaar        slist->add($LOOPVAR)
25914b8a0651SBram Moolenaar        slist->add(@r)
25924b8a0651SBram Moolenaar        slist->add(v:errmsg)
25934b8a0651SBram Moolenaar      endfor
25944b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
25954b8a0651SBram Moolenaar
25964b8a0651SBram Moolenaar      slist = []
25974b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
25984b8a0651SBram Moolenaar        slist->add(g:globalvar)
25994b8a0651SBram Moolenaar        slist->add(b:bufvar)
26004b8a0651SBram Moolenaar        slist->add(w:winvar)
26014b8a0651SBram Moolenaar        slist->add(t:tabvar)
26024b8a0651SBram Moolenaar      endfor
26034b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2604f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
2605b777da9bSBram Moolenaar
2606b777da9bSBram Moolenaar      var res = []
2607b777da9bSBram Moolenaar      for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2608b777da9bSBram Moolenaar        res->add(n)
2609b777da9bSBram Moolenaar      endfor
2610b777da9bSBram Moolenaar      assert_equal([2, 5], res)
26114b8a0651SBram Moolenaar  END
26124b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
26134b8a0651SBram Moolenaar
26144b8a0651SBram Moolenaar  lines =<< trim END
2615792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2616792f786aSBram Moolenaar        echo v1 v2
2617792f786aSBram Moolenaar      endfor
2618792f786aSBram Moolenaar  END
2619792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2620792f786aSBram Moolenaar
2621792f786aSBram Moolenaar  lines =<< trim END
2622792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2623792f786aSBram Moolenaar        echo v1 v2
2624792f786aSBram Moolenaar      endfor
2625792f786aSBram Moolenaar  END
2626792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2627792f786aSBram Moolenaar
2628792f786aSBram Moolenaar  lines =<< trim END
2629792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2630792f786aSBram Moolenaar        echo v1
2631792f786aSBram Moolenaar      endfor
2632792f786aSBram Moolenaar  END
2633792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2634792f786aSBram Moolenaarenddef
2635792f786aSBram Moolenaar
2636c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2637f2253963SBram Moolenaar  var lines =<< trim END
2638c150c09eSBram Moolenaar      var looped = 0
2639c150c09eSBram Moolenaar      var cleanup = 0
2640c150c09eSBram Moolenaar      for i in range(3)
2641c150c09eSBram Moolenaar        looped += 1
2642c150c09eSBram Moolenaar        try
2643c150c09eSBram Moolenaar          eval [][0]
2644c150c09eSBram Moolenaar        catch
2645c150c09eSBram Moolenaar          continue
2646c150c09eSBram Moolenaar        finally
2647c150c09eSBram Moolenaar          cleanup += 1
2648c150c09eSBram Moolenaar        endtry
2649c150c09eSBram Moolenaar      endfor
2650c150c09eSBram Moolenaar      assert_equal(3, looped)
2651c150c09eSBram Moolenaar      assert_equal(3, cleanup)
2652f2253963SBram Moolenaar  END
2653f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2654c150c09eSBram Moolenaarenddef
2655c150c09eSBram Moolenaar
2656d0df1aacSBram Moolenaardef Test_while_loop()
2657cfcd011fSBram Moolenaar  var result = ''
2658cfcd011fSBram Moolenaar  var cnt = 0
2659d0df1aacSBram Moolenaar  while cnt < 555
2660d0df1aacSBram Moolenaar    if cnt == 3
2661d0df1aacSBram Moolenaar      break
2662d0df1aacSBram Moolenaar    endif
2663d0df1aacSBram Moolenaar    cnt += 1
2664d0df1aacSBram Moolenaar    if cnt == 2
2665d0df1aacSBram Moolenaar      continue
2666d0df1aacSBram Moolenaar    endif
2667d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2668d0df1aacSBram Moolenaar  endwhile
2669d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2670dee37dc7SBram Moolenaar
2671dee37dc7SBram Moolenaar  var s = ''
26720123cc1eSBram Moolenaar  while s == 'x' # {comment}
2673dee37dc7SBram Moolenaar  endwhile
2674d0df1aacSBram Moolenaarenddef
2675d0df1aacSBram Moolenaar
2676e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2677675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2678675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2679675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2680675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2681675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2682675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2683675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
26846628b7ebSBram Moolenaar
26856628b7ebSBram Moolenaar  var lines =<< trim END
26866628b7ebSBram Moolenaar      var s = ''
26876628b7ebSBram Moolenaar      while s = ''
26886628b7ebSBram Moolenaar      endwhile
26896628b7ebSBram Moolenaar  END
26906628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2691bd5da371SBram Moolenaarenddef
2692bd5da371SBram Moolenaar
26939645e2d9SBram Moolenaardef Test_interrupt_loop()
2694cfcd011fSBram Moolenaar  var caught = false
2695cfcd011fSBram Moolenaar  var x = 0
269697acfc78SBram Moolenaar  try
26979645e2d9SBram Moolenaar    while 1
26989645e2d9SBram Moolenaar      x += 1
26999645e2d9SBram Moolenaar      if x == 100
27009645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
27019645e2d9SBram Moolenaar      endif
27029645e2d9SBram Moolenaar    endwhile
270397acfc78SBram Moolenaar  catch
270497acfc78SBram Moolenaar    caught = true
270597acfc78SBram Moolenaar    assert_equal(100, x)
270697acfc78SBram Moolenaar  endtry
270797acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
270825859dd7SBram Moolenaar  # consume the CTRL-C
270925859dd7SBram Moolenaar  getchar(0)
27109645e2d9SBram Moolenaarenddef
271120431c9dSBram Moolenaar
27124fdae999SBram Moolenaardef Test_automatic_line_continuation()
2713cfcd011fSBram Moolenaar  var mylist = [
27144fdae999SBram Moolenaar      'one',
27154fdae999SBram Moolenaar      'two',
27164fdae999SBram Moolenaar      'three',
2717f5be8cdbSBram Moolenaar      ] # comment
27184fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
27194fdae999SBram Moolenaar
2720cfcd011fSBram Moolenaar  var mydict = {
2721e0de171eSBram Moolenaar      ['one']: 1,
2722e0de171eSBram Moolenaar      ['two']: 2,
2723e0de171eSBram Moolenaar      ['three']:
27244fdae999SBram Moolenaar          3,
2725f5be8cdbSBram Moolenaar      } # comment
2726e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2727e0de171eSBram Moolenaar  mydict = {
27282c330432SBram Moolenaar      one: 1,  # comment
27292c330432SBram Moolenaar      two:     # comment
27302c330432SBram Moolenaar           2,  # comment
27312c330432SBram Moolenaar      three: 3 # comment
27322c330432SBram Moolenaar      }
2733e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2734e0de171eSBram Moolenaar  mydict = {
27352c330432SBram Moolenaar      one: 1,
27364fdae999SBram Moolenaar      two:
27374fdae999SBram Moolenaar           2,
27382c330432SBram Moolenaar      three: 3
27394fdae999SBram Moolenaar      }
2740e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2741e6085c53SBram Moolenaar
2742e6085c53SBram Moolenaar  assert_equal(
2743e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2744e6085c53SBram Moolenaar        split('one two three')
2745e6085c53SBram Moolenaar        )
27464fdae999SBram Moolenaarenddef
27474fdae999SBram Moolenaar
27487a092245SBram Moolenaardef Test_vim9_comment()
27497a092245SBram Moolenaar  CheckScriptSuccess([
27507a092245SBram Moolenaar      'vim9script',
27517a092245SBram Moolenaar      '# something',
275293f82cbeSBram Moolenaar      '#something',
275393f82cbeSBram Moolenaar      '#{something',
27547a092245SBram Moolenaar      ])
275593f82cbeSBram Moolenaar
275693f82cbeSBram Moolenaar  split Xfile
275793f82cbeSBram Moolenaar  CheckScriptSuccess([
275893f82cbeSBram Moolenaar      'vim9script',
275993f82cbeSBram Moolenaar      'edit #something',
276093f82cbeSBram Moolenaar      ])
276193f82cbeSBram Moolenaar  CheckScriptSuccess([
276293f82cbeSBram Moolenaar      'vim9script',
276393f82cbeSBram Moolenaar      'edit #{something',
276493f82cbeSBram Moolenaar      ])
276593f82cbeSBram Moolenaar  close
276693f82cbeSBram Moolenaar
27677a092245SBram Moolenaar  CheckScriptFailure([
27687a092245SBram Moolenaar      'vim9script',
27697a092245SBram Moolenaar      ':# something',
27707a092245SBram Moolenaar      ], 'E488:')
27717a092245SBram Moolenaar  CheckScriptFailure([
27727a092245SBram Moolenaar      '# something',
27737a092245SBram Moolenaar      ], 'E488:')
27747a092245SBram Moolenaar  CheckScriptFailure([
27757a092245SBram Moolenaar      ':# something',
27767a092245SBram Moolenaar      ], 'E488:')
27777a092245SBram Moolenaar
27784a8d9f2eSBram Moolenaar  { # block start
27794a8d9f2eSBram Moolenaar  } # block end
27804a8d9f2eSBram Moolenaar  CheckDefFailure([
27814a8d9f2eSBram Moolenaar      '{# comment',
27824a8d9f2eSBram Moolenaar      ], 'E488:')
27834a8d9f2eSBram Moolenaar  CheckDefFailure([
27844a8d9f2eSBram Moolenaar      '{',
27854a8d9f2eSBram Moolenaar      '}# comment',
27864a8d9f2eSBram Moolenaar      ], 'E488:')
27874a8d9f2eSBram Moolenaar
27884a8d9f2eSBram Moolenaar  echo "yes" # comment
27894a8d9f2eSBram Moolenaar  CheckDefFailure([
27904a8d9f2eSBram Moolenaar      'echo "yes"# comment',
27914a8d9f2eSBram Moolenaar      ], 'E488:')
27927a092245SBram Moolenaar  CheckScriptSuccess([
27937a092245SBram Moolenaar      'vim9script',
27947a092245SBram Moolenaar      'echo "yes" # something',
27957a092245SBram Moolenaar      ])
27967a092245SBram Moolenaar  CheckScriptFailure([
27977a092245SBram Moolenaar      'vim9script',
27987a092245SBram Moolenaar      'echo "yes"# something',
27997a092245SBram Moolenaar      ], 'E121:')
28007a092245SBram Moolenaar  CheckScriptFailure([
28017a092245SBram Moolenaar      'vim9script',
28027a092245SBram Moolenaar      'echo# something',
2803f8103f27SBram Moolenaar      ], 'E1144:')
28047a092245SBram Moolenaar  CheckScriptFailure([
28057a092245SBram Moolenaar      'echo "yes" # something',
28067a092245SBram Moolenaar      ], 'E121:')
28077a092245SBram Moolenaar
28084a8d9f2eSBram Moolenaar  exe "echo" # comment
28094a8d9f2eSBram Moolenaar  CheckDefFailure([
28104a8d9f2eSBram Moolenaar      'exe "echo"# comment',
28114a8d9f2eSBram Moolenaar      ], 'E488:')
28124a8d9f2eSBram Moolenaar  CheckScriptSuccess([
28134a8d9f2eSBram Moolenaar      'vim9script',
28144a8d9f2eSBram Moolenaar      'exe "echo" # something',
28154a8d9f2eSBram Moolenaar      ])
28164a8d9f2eSBram Moolenaar  CheckScriptFailure([
28174a8d9f2eSBram Moolenaar      'vim9script',
28184a8d9f2eSBram Moolenaar      'exe "echo"# something',
28194a8d9f2eSBram Moolenaar      ], 'E121:')
28204a8d9f2eSBram Moolenaar  CheckScriptFailure([
28214a8d9f2eSBram Moolenaar      'vim9script',
28224a8d9f2eSBram Moolenaar      'exe# something',
2823f8103f27SBram Moolenaar      ], 'E1144:')
28244a8d9f2eSBram Moolenaar  CheckScriptFailure([
28254a8d9f2eSBram Moolenaar      'exe "echo" # something',
28264a8d9f2eSBram Moolenaar      ], 'E121:')
28274a8d9f2eSBram Moolenaar
28287a092245SBram Moolenaar  CheckDefFailure([
28297a092245SBram Moolenaar      'try# comment',
28307a092245SBram Moolenaar      '  echo "yes"',
28317a092245SBram Moolenaar      'catch',
28327a092245SBram Moolenaar      'endtry',
2833f8103f27SBram Moolenaar      ], 'E1144:')
28342c5ed4e3SBram Moolenaar  CheckScriptFailure([
28352c5ed4e3SBram Moolenaar      'vim9script',
28362c5ed4e3SBram Moolenaar      'try# comment',
28372c5ed4e3SBram Moolenaar      'echo "yes"',
2838f8103f27SBram Moolenaar      ], 'E1144:')
28397a092245SBram Moolenaar  CheckDefFailure([
28407a092245SBram Moolenaar      'try',
2841a72cfb80SBram Moolenaar      '  throw#comment',
2842a72cfb80SBram Moolenaar      'catch',
2843a72cfb80SBram Moolenaar      'endtry',
2844f8103f27SBram Moolenaar      ], 'E1144:')
2845a72cfb80SBram Moolenaar  CheckDefFailure([
2846a72cfb80SBram Moolenaar      'try',
2847a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2848a72cfb80SBram Moolenaar      'catch',
2849a72cfb80SBram Moolenaar      'endtry',
2850a72cfb80SBram Moolenaar      ], 'E488:')
2851a72cfb80SBram Moolenaar  CheckDefFailure([
2852a72cfb80SBram Moolenaar      'try',
28537a092245SBram Moolenaar      '  echo "yes"',
28547a092245SBram Moolenaar      'catch# comment',
28557a092245SBram Moolenaar      'endtry',
2856f8103f27SBram Moolenaar      ], 'E1144:')
28572c5ed4e3SBram Moolenaar  CheckScriptFailure([
28582c5ed4e3SBram Moolenaar      'vim9script',
28592c5ed4e3SBram Moolenaar      'try',
28602c5ed4e3SBram Moolenaar      '  echo "yes"',
28612c5ed4e3SBram Moolenaar      'catch# comment',
28622c5ed4e3SBram Moolenaar      'endtry',
2863f8103f27SBram Moolenaar      ], 'E1144:')
28642c5ed4e3SBram Moolenaar  CheckDefFailure([
28652c5ed4e3SBram Moolenaar      'try',
28662c5ed4e3SBram Moolenaar      '  echo "yes"',
28672c5ed4e3SBram Moolenaar      'catch /pat/# comment',
28682c5ed4e3SBram Moolenaar      'endtry',
28692c5ed4e3SBram Moolenaar      ], 'E488:')
28707a092245SBram Moolenaar  CheckDefFailure([
28717a092245SBram Moolenaar      'try',
28727a092245SBram Moolenaar      'echo "yes"',
28737a092245SBram Moolenaar      'catch',
28747a092245SBram Moolenaar      'endtry# comment',
2875f8103f27SBram Moolenaar      ], 'E1144:')
28762c5ed4e3SBram Moolenaar  CheckScriptFailure([
28772c5ed4e3SBram Moolenaar      'vim9script',
28782c5ed4e3SBram Moolenaar      'try',
28792c5ed4e3SBram Moolenaar      '  echo "yes"',
28802c5ed4e3SBram Moolenaar      'catch',
28812c5ed4e3SBram Moolenaar      'endtry# comment',
2882f8103f27SBram Moolenaar      ], 'E1144:')
28832c5ed4e3SBram Moolenaar
28842c5ed4e3SBram Moolenaar  CheckScriptSuccess([
28852c5ed4e3SBram Moolenaar      'vim9script',
28862c5ed4e3SBram Moolenaar      'hi # comment',
28872c5ed4e3SBram Moolenaar      ])
28882c5ed4e3SBram Moolenaar  CheckScriptFailure([
28892c5ed4e3SBram Moolenaar      'vim9script',
28902c5ed4e3SBram Moolenaar      'hi# comment',
2891f8103f27SBram Moolenaar      ], 'E1144:')
28921966c248SBram Moolenaar  CheckScriptSuccess([
28931966c248SBram Moolenaar      'vim9script',
28941966c248SBram Moolenaar      'hi Search # comment',
28951966c248SBram Moolenaar      ])
28961966c248SBram Moolenaar  CheckScriptFailure([
28971966c248SBram Moolenaar      'vim9script',
28981966c248SBram Moolenaar      'hi Search# comment',
28991966c248SBram Moolenaar      ], 'E416:')
29001966c248SBram Moolenaar  CheckScriptSuccess([
29011966c248SBram Moolenaar      'vim9script',
29021966c248SBram Moolenaar      'hi link This Search # comment',
29031966c248SBram Moolenaar      ])
29041966c248SBram Moolenaar  CheckScriptFailure([
29051966c248SBram Moolenaar      'vim9script',
29061966c248SBram Moolenaar      'hi link This That# comment',
29071966c248SBram Moolenaar      ], 'E413:')
29081966c248SBram Moolenaar  CheckScriptSuccess([
29091966c248SBram Moolenaar      'vim9script',
29101966c248SBram Moolenaar      'hi clear This # comment',
29111966c248SBram Moolenaar      'hi clear # comment',
29121966c248SBram Moolenaar      ])
2913f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2914f5be8cdbSBram Moolenaar  # hi clear This# comment',
29151966c248SBram Moolenaar  CheckScriptFailure([
29161966c248SBram Moolenaar      'vim9script',
29171966c248SBram Moolenaar      'hi clear# comment',
29181966c248SBram Moolenaar      ], 'E416:')
29191966c248SBram Moolenaar
29201966c248SBram Moolenaar  CheckScriptSuccess([
29211966c248SBram Moolenaar      'vim9script',
29221966c248SBram Moolenaar      'hi Group term=bold',
29231966c248SBram Moolenaar      'match Group /todo/ # comment',
29241966c248SBram Moolenaar      ])
29251966c248SBram Moolenaar  CheckScriptFailure([
29261966c248SBram Moolenaar      'vim9script',
29271966c248SBram Moolenaar      'hi Group term=bold',
29281966c248SBram Moolenaar      'match Group /todo/# comment',
29291966c248SBram Moolenaar      ], 'E488:')
29301966c248SBram Moolenaar  CheckScriptSuccess([
29311966c248SBram Moolenaar      'vim9script',
29321966c248SBram Moolenaar      'match # comment',
29331966c248SBram Moolenaar      ])
29341966c248SBram Moolenaar  CheckScriptFailure([
29351966c248SBram Moolenaar      'vim9script',
29361966c248SBram Moolenaar      'match# comment',
2937f8103f27SBram Moolenaar      ], 'E1144:')
29381966c248SBram Moolenaar  CheckScriptSuccess([
29391966c248SBram Moolenaar      'vim9script',
29401966c248SBram Moolenaar      'match none # comment',
29411966c248SBram Moolenaar      ])
29421966c248SBram Moolenaar  CheckScriptFailure([
29431966c248SBram Moolenaar      'vim9script',
29441966c248SBram Moolenaar      'match none# comment',
29451966c248SBram Moolenaar      ], 'E475:')
29461966c248SBram Moolenaar
29471966c248SBram Moolenaar  CheckScriptSuccess([
29481966c248SBram Moolenaar      'vim9script',
29491966c248SBram Moolenaar      'menutrans clear # comment',
29501966c248SBram Moolenaar      ])
29511966c248SBram Moolenaar  CheckScriptFailure([
29521966c248SBram Moolenaar      'vim9script',
29531966c248SBram Moolenaar      'menutrans clear# comment text',
29541966c248SBram Moolenaar      ], 'E474:')
29551966c248SBram Moolenaar
29561966c248SBram Moolenaar  CheckScriptSuccess([
29571966c248SBram Moolenaar      'vim9script',
29581966c248SBram Moolenaar      'syntax clear # comment',
29591966c248SBram Moolenaar      ])
29601966c248SBram Moolenaar  CheckScriptFailure([
29611966c248SBram Moolenaar      'vim9script',
29621966c248SBram Moolenaar      'syntax clear# comment text',
29631966c248SBram Moolenaar      ], 'E28:')
29641966c248SBram Moolenaar  CheckScriptSuccess([
29651966c248SBram Moolenaar      'vim9script',
29661966c248SBram Moolenaar      'syntax keyword Word some',
29671966c248SBram Moolenaar      'syntax clear Word # comment',
29681966c248SBram Moolenaar      ])
29691966c248SBram Moolenaar  CheckScriptFailure([
29701966c248SBram Moolenaar      'vim9script',
29711966c248SBram Moolenaar      'syntax keyword Word some',
29721966c248SBram Moolenaar      'syntax clear Word# comment text',
29731966c248SBram Moolenaar      ], 'E28:')
29741966c248SBram Moolenaar
29751966c248SBram Moolenaar  CheckScriptSuccess([
29761966c248SBram Moolenaar      'vim9script',
29771966c248SBram Moolenaar      'syntax list # comment',
29781966c248SBram Moolenaar      ])
29791966c248SBram Moolenaar  CheckScriptFailure([
29801966c248SBram Moolenaar      'vim9script',
29811966c248SBram Moolenaar      'syntax list# comment text',
29821966c248SBram Moolenaar      ], 'E28:')
29831966c248SBram Moolenaar
29841966c248SBram Moolenaar  CheckScriptSuccess([
29851966c248SBram Moolenaar      'vim9script',
29861966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
29871966c248SBram Moolenaar      ])
29881966c248SBram Moolenaar  CheckScriptFailure([
29891966c248SBram Moolenaar      'vim9script',
29901966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
29911966c248SBram Moolenaar      ], 'E475:')
29921966c248SBram Moolenaar
29931966c248SBram Moolenaar  CheckScriptSuccess([
29941966c248SBram Moolenaar      'vim9script',
29951966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
29961966c248SBram Moolenaar      ])
29971966c248SBram Moolenaar  CheckScriptFailure([
29981966c248SBram Moolenaar      'vim9script',
29991966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
30001966c248SBram Moolenaar      ], 'E789:')
30011966c248SBram Moolenaar
30021966c248SBram Moolenaar  CheckScriptSuccess([
30031966c248SBram Moolenaar      'vim9script',
30041966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
30051966c248SBram Moolenaar      ])
30061966c248SBram Moolenaar  CheckScriptFailure([
30071966c248SBram Moolenaar      'vim9script',
30081966c248SBram Moolenaar      'syntax match Word /pat/# comment',
30091966c248SBram Moolenaar      ], 'E402:')
30101966c248SBram Moolenaar
30111966c248SBram Moolenaar  CheckScriptSuccess([
30121966c248SBram Moolenaar      'vim9script',
30131966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
30141966c248SBram Moolenaar      ])
30151966c248SBram Moolenaar  CheckScriptFailure([
30161966c248SBram Moolenaar      'vim9script',
30171966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
30181966c248SBram Moolenaar      ], 'E475:')
30191966c248SBram Moolenaar  CheckScriptFailure([
30201966c248SBram Moolenaar      'vim9script',
30211966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
30221966c248SBram Moolenaar      ], 'E406:')
30231966c248SBram Moolenaar  CheckScriptFailure([
30241966c248SBram Moolenaar      'vim9script',
30251966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
30261966c248SBram Moolenaar      ], 'E475:')
30271966c248SBram Moolenaar
30281966c248SBram Moolenaar  CheckScriptSuccess([
30291966c248SBram Moolenaar      'vim9script',
30301966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
30311966c248SBram Moolenaar      ])
30321966c248SBram Moolenaar  CheckScriptFailure([
30331966c248SBram Moolenaar      'vim9script',
30341966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
3035d032f34aSBram Moolenaar      ], 'E402:')
30361966c248SBram Moolenaar
30371966c248SBram Moolenaar  CheckScriptSuccess([
30381966c248SBram Moolenaar      'vim9script',
30391966c248SBram Moolenaar      'syntax sync # comment',
30401966c248SBram Moolenaar      ])
30411966c248SBram Moolenaar  CheckScriptFailure([
30421966c248SBram Moolenaar      'vim9script',
30431966c248SBram Moolenaar      'syntax sync# comment',
30441966c248SBram Moolenaar      ], 'E404:')
30451966c248SBram Moolenaar  CheckScriptSuccess([
30461966c248SBram Moolenaar      'vim9script',
30471966c248SBram Moolenaar      'syntax sync ccomment # comment',
30481966c248SBram Moolenaar      ])
30491966c248SBram Moolenaar  CheckScriptFailure([
30501966c248SBram Moolenaar      'vim9script',
30511966c248SBram Moolenaar      'syntax sync ccomment# comment',
30521966c248SBram Moolenaar      ], 'E404:')
30531966c248SBram Moolenaar
30541966c248SBram Moolenaar  CheckScriptSuccess([
30551966c248SBram Moolenaar      'vim9script',
30561966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
30571966c248SBram Moolenaar      ])
30581966c248SBram Moolenaar  CheckScriptFailure([
30591966c248SBram Moolenaar      'vim9script',
30601966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
30611966c248SBram Moolenaar      ], 'E475:')
3062a72cfb80SBram Moolenaar
3063a72cfb80SBram Moolenaar  CheckScriptSuccess([
3064a72cfb80SBram Moolenaar      'vim9script',
3065a72cfb80SBram Moolenaar      'command Echo echo # comment',
3066a72cfb80SBram Moolenaar      'command Echo # comment',
30672d870f8dSBram Moolenaar      'delcommand Echo',
3068a72cfb80SBram Moolenaar      ])
3069a72cfb80SBram Moolenaar  CheckScriptFailure([
3070a72cfb80SBram Moolenaar      'vim9script',
3071a72cfb80SBram Moolenaar      'command Echo echo# comment',
3072a72cfb80SBram Moolenaar      'Echo',
3073f8103f27SBram Moolenaar      ], 'E1144:')
30742d870f8dSBram Moolenaar  delcommand Echo
307570249ee8SBram Moolenaar
307670249ee8SBram Moolenaar  var curdir = getcwd()
307770249ee8SBram Moolenaar  CheckScriptSuccess([
307870249ee8SBram Moolenaar      'command Echo cd " comment',
307970249ee8SBram Moolenaar      'Echo',
308070249ee8SBram Moolenaar      'delcommand Echo',
308170249ee8SBram Moolenaar      ])
308270249ee8SBram Moolenaar  CheckScriptSuccess([
3083090728adSBram Moolenaar      'vim9script',
308470249ee8SBram Moolenaar      'command Echo cd # comment',
308570249ee8SBram Moolenaar      'Echo',
308670249ee8SBram Moolenaar      'delcommand Echo',
308770249ee8SBram Moolenaar      ])
308870249ee8SBram Moolenaar  CheckScriptFailure([
308970249ee8SBram Moolenaar      'vim9script',
309070249ee8SBram Moolenaar      'command Echo cd " comment',
309170249ee8SBram Moolenaar      'Echo',
309270249ee8SBram Moolenaar      ], 'E344:')
309370249ee8SBram Moolenaar  delcommand Echo
309470249ee8SBram Moolenaar  chdir(curdir)
309570249ee8SBram Moolenaar
3096a72cfb80SBram Moolenaar  CheckScriptFailure([
3097a72cfb80SBram Moolenaar      'vim9script',
3098a72cfb80SBram Moolenaar      'command Echo# comment',
3099a72cfb80SBram Moolenaar      ], 'E182:')
3100a72cfb80SBram Moolenaar  CheckScriptFailure([
3101a72cfb80SBram Moolenaar      'vim9script',
3102a72cfb80SBram Moolenaar      'command Echo echo',
3103a72cfb80SBram Moolenaar      'command Echo# comment',
3104a72cfb80SBram Moolenaar      ], 'E182:')
31052d870f8dSBram Moolenaar  delcommand Echo
3106a72cfb80SBram Moolenaar
3107a72cfb80SBram Moolenaar  CheckScriptSuccess([
3108a72cfb80SBram Moolenaar      'vim9script',
3109a72cfb80SBram Moolenaar      'function # comment',
3110a72cfb80SBram Moolenaar      ])
3111a72cfb80SBram Moolenaar  CheckScriptFailure([
3112a72cfb80SBram Moolenaar      'vim9script',
31139898107fSBram Moolenaar      'function " comment',
31149898107fSBram Moolenaar      ], 'E129:')
31159898107fSBram Moolenaar  CheckScriptFailure([
31169898107fSBram Moolenaar      'vim9script',
3117a72cfb80SBram Moolenaar      'function# comment',
3118f8103f27SBram Moolenaar      ], 'E1144:')
3119a72cfb80SBram Moolenaar  CheckScriptSuccess([
3120a72cfb80SBram Moolenaar      'vim9script',
3121a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
3122a72cfb80SBram Moolenaar      ])
3123a72cfb80SBram Moolenaar  CheckScriptFailure([
3124a72cfb80SBram Moolenaar      'vim9script',
3125a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
3126a72cfb80SBram Moolenaar      ], 'E488:')
3127a72cfb80SBram Moolenaar
3128a72cfb80SBram Moolenaar  CheckScriptSuccess([
3129a72cfb80SBram Moolenaar      'vim9script',
31304c17ad94SBram Moolenaar      'func g:DeleteMeA()',
3131a72cfb80SBram Moolenaar      'endfunc',
31324c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
3133a72cfb80SBram Moolenaar      ])
3134a72cfb80SBram Moolenaar  CheckScriptFailure([
3135a72cfb80SBram Moolenaar      'vim9script',
31364c17ad94SBram Moolenaar      'func g:DeleteMeB()',
3137a72cfb80SBram Moolenaar      'endfunc',
31384c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
3139a72cfb80SBram Moolenaar      ], 'E488:')
3140a72cfb80SBram Moolenaar
3141a72cfb80SBram Moolenaar  CheckScriptSuccess([
3142a72cfb80SBram Moolenaar      'vim9script',
3143a72cfb80SBram Moolenaar      'call execute("ls") # comment',
3144a72cfb80SBram Moolenaar      ])
3145a72cfb80SBram Moolenaar  CheckScriptFailure([
3146a72cfb80SBram Moolenaar      'vim9script',
3147a72cfb80SBram Moolenaar      'call execute("ls")# comment',
3148a72cfb80SBram Moolenaar      ], 'E488:')
3149e7e4838fSBram Moolenaar
3150e7e4838fSBram Moolenaar  CheckScriptFailure([
3151e7e4838fSBram Moolenaar      'def Test() " comment',
3152e7e4838fSBram Moolenaar      'enddef',
3153e7e4838fSBram Moolenaar      ], 'E488:')
3154e7e4838fSBram Moolenaar  CheckScriptFailure([
3155e7e4838fSBram Moolenaar      'vim9script',
3156e7e4838fSBram Moolenaar      'def Test() " comment',
3157e7e4838fSBram Moolenaar      'enddef',
3158e7e4838fSBram Moolenaar      ], 'E488:')
3159e7e4838fSBram Moolenaar
3160e7e4838fSBram Moolenaar  CheckScriptSuccess([
3161e7e4838fSBram Moolenaar      'func Test() " comment',
3162e7e4838fSBram Moolenaar      'endfunc',
31632d870f8dSBram Moolenaar      'delfunc Test',
3164e7e4838fSBram Moolenaar      ])
31659898107fSBram Moolenaar  CheckScriptSuccess([
3166e7e4838fSBram Moolenaar      'vim9script',
3167e7e4838fSBram Moolenaar      'func Test() " comment',
3168e7e4838fSBram Moolenaar      'endfunc',
31699898107fSBram Moolenaar      ])
3170e7e4838fSBram Moolenaar
3171e7e4838fSBram Moolenaar  CheckScriptSuccess([
3172e7e4838fSBram Moolenaar      'def Test() # comment',
3173e7e4838fSBram Moolenaar      'enddef',
3174e7e4838fSBram Moolenaar      ])
3175e7e4838fSBram Moolenaar  CheckScriptFailure([
3176e7e4838fSBram Moolenaar      'func Test() # comment',
3177e7e4838fSBram Moolenaar      'endfunc',
3178e7e4838fSBram Moolenaar      ], 'E488:')
31790f37e356SBram Moolenaar
31800f37e356SBram Moolenaar  var lines =<< trim END
31810f37e356SBram Moolenaar      vim9script
31820f37e356SBram Moolenaar      syn region Text
31830f37e356SBram Moolenaar      \ start='foo'
31840f37e356SBram Moolenaar      #\ comment
31850f37e356SBram Moolenaar      \ end='bar'
31865072b47aSBram Moolenaar      syn region Text start='foo'
31875072b47aSBram Moolenaar      #\ comment
31885072b47aSBram Moolenaar      \ end='bar'
31890f37e356SBram Moolenaar  END
31900f37e356SBram Moolenaar  CheckScriptSuccess(lines)
31910f37e356SBram Moolenaar
31920f37e356SBram Moolenaar  lines =<< trim END
31930f37e356SBram Moolenaar      vim9script
31940f37e356SBram Moolenaar      syn region Text
31950f37e356SBram Moolenaar      \ start='foo'
31960f37e356SBram Moolenaar      "\ comment
31970f37e356SBram Moolenaar      \ end='bar'
31980f37e356SBram Moolenaar  END
31990f37e356SBram Moolenaar  CheckScriptFailure(lines, 'E399:')
32002c5ed4e3SBram Moolenaarenddef
32012c5ed4e3SBram Moolenaar
32022c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
32032c5ed4e3SBram Moolenaar  CheckCanRunGui
32042c5ed4e3SBram Moolenaar
32052c5ed4e3SBram Moolenaar  CheckScriptFailure([
32062c5ed4e3SBram Moolenaar      'vim9script',
32072c5ed4e3SBram Moolenaar      'gui#comment'
3208f8103f27SBram Moolenaar      ], 'E1144:')
32092c5ed4e3SBram Moolenaar  CheckScriptFailure([
32102c5ed4e3SBram Moolenaar      'vim9script',
32112c5ed4e3SBram Moolenaar      'gui -f#comment'
32122c5ed4e3SBram Moolenaar      ], 'E499:')
32137a092245SBram Moolenaarenddef
32147a092245SBram Moolenaar
3215a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
32166797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
32176797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3218a26b9700SBram Moolenaar
3219a26b9700SBram Moolenaar  edit test.vim
3220a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3221a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3222a26b9700SBram Moolenaar
3223a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3224a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3225a26b9700SBram Moolenaar
3226a26b9700SBram Moolenaar  g:entered = 0
3227a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3228a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3229a26b9700SBram Moolenaar
3230a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3231a26b9700SBram Moolenaar
3232a26b9700SBram Moolenaar  au! TabEnter
3233a26b9700SBram Moolenaar  unlet g:entered
3234d72c1bf0SBram Moolenaar
3235d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3236d72c1bf0SBram Moolenaar      'vim9script',
32376797966dSBram Moolenaar      'g:var = 123',
3238e55b1c09SBram Moolenaar      'b:var = 456',
3239e55b1c09SBram Moolenaar      'w:var = 777',
3240e55b1c09SBram Moolenaar      't:var = 888',
3241d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3242d72c1bf0SBram Moolenaar      ])
3243d72c1bf0SBram Moolenaar
3244d72c1bf0SBram Moolenaar  CheckScriptFailure([
3245d72c1bf0SBram Moolenaar      'vim9script',
3246cfcd011fSBram Moolenaar      'let var = 123',
3247cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3248cfcd011fSBram Moolenaar
3249cfcd011fSBram Moolenaar  CheckScriptFailure([
3250cfcd011fSBram Moolenaar      'vim9script',
3251cfcd011fSBram Moolenaar      'var g:var = 123',
3252e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3253e55b1c09SBram Moolenaar
3254e55b1c09SBram Moolenaar  CheckScriptFailure([
3255e55b1c09SBram Moolenaar      'vim9script',
3256cfcd011fSBram Moolenaar      'var b:var = 123',
3257e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3258e55b1c09SBram Moolenaar
3259e55b1c09SBram Moolenaar  CheckScriptFailure([
3260e55b1c09SBram Moolenaar      'vim9script',
3261cfcd011fSBram Moolenaar      'var w:var = 123',
3262e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3263e55b1c09SBram Moolenaar
3264e55b1c09SBram Moolenaar  CheckScriptFailure([
3265e55b1c09SBram Moolenaar      'vim9script',
3266cfcd011fSBram Moolenaar      'var t:var = 123',
3267e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3268e55b1c09SBram Moolenaar
3269e55b1c09SBram Moolenaar  CheckScriptFailure([
3270e55b1c09SBram Moolenaar      'vim9script',
3271cfcd011fSBram Moolenaar      'var v:version = 123',
3272e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3273e55b1c09SBram Moolenaar
3274e55b1c09SBram Moolenaar  CheckScriptFailure([
3275e55b1c09SBram Moolenaar      'vim9script',
3276cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3277e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
32786797966dSBram Moolenaar
32796797966dSBram Moolenaar  CheckScriptFailure([
32806797966dSBram Moolenaar      'vim9script',
32816797966dSBram Moolenaar      'g:var = 123',
328232e35117SBram Moolenaar      'unlet g:var# comment1',
3283d72c1bf0SBram Moolenaar      ], 'E108:')
3284d72c1bf0SBram Moolenaar
3285d72c1bf0SBram Moolenaar  CheckScriptFailure([
3286d72c1bf0SBram Moolenaar      'let g:var = 123',
3287d72c1bf0SBram Moolenaar      'unlet g:var # something',
3288d72c1bf0SBram Moolenaar      ], 'E488:')
3289faac4104SBram Moolenaar
3290faac4104SBram Moolenaar  CheckScriptSuccess([
3291faac4104SBram Moolenaar      'vim9script',
329232e35117SBram Moolenaar      'if 1 # comment2',
3293faac4104SBram Moolenaar      '  echo "yes"',
3294faac4104SBram Moolenaar      'elseif 2 #comment',
3295faac4104SBram Moolenaar      '  echo "no"',
3296faac4104SBram Moolenaar      'endif',
3297faac4104SBram Moolenaar      ])
3298faac4104SBram Moolenaar
3299faac4104SBram Moolenaar  CheckScriptFailure([
3300faac4104SBram Moolenaar      'vim9script',
330132e35117SBram Moolenaar      'if 1# comment3',
3302faac4104SBram Moolenaar      '  echo "yes"',
3303faac4104SBram Moolenaar      'endif',
3304fae55a9cSBram Moolenaar      ], 'E488:')
3305faac4104SBram Moolenaar
3306faac4104SBram Moolenaar  CheckScriptFailure([
3307faac4104SBram Moolenaar      'vim9script',
330832e35117SBram Moolenaar      'if 0 # comment4',
3309faac4104SBram Moolenaar      '  echo "yes"',
3310faac4104SBram Moolenaar      'elseif 2#comment',
3311faac4104SBram Moolenaar      '  echo "no"',
3312faac4104SBram Moolenaar      'endif',
3313fae55a9cSBram Moolenaar      ], 'E488:')
3314faac4104SBram Moolenaar
3315faac4104SBram Moolenaar  CheckScriptSuccess([
3316faac4104SBram Moolenaar      'vim9script',
3317cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3318faac4104SBram Moolenaar      ])
3319faac4104SBram Moolenaar
3320faac4104SBram Moolenaar  CheckScriptFailure([
3321faac4104SBram Moolenaar      'vim9script',
3322cfcd011fSBram Moolenaar      'var v = 1# comment6',
3323fae55a9cSBram Moolenaar      ], 'E488:')
3324faac4104SBram Moolenaar
3325faac4104SBram Moolenaar  CheckScriptSuccess([
3326faac4104SBram Moolenaar      'vim9script',
3327faac4104SBram Moolenaar      'new'
3328d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3329df069eecSBram Moolenaar      ':$',
3330faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3331faac4104SBram Moolenaar      'bwipe!',
3332faac4104SBram Moolenaar      ])
3333faac4104SBram Moolenaar
3334f5be8cdbSBram Moolenaar  CheckScriptFailure([
3335f5be8cdbSBram Moolenaar      'vim9script',
3336f5be8cdbSBram Moolenaar      'new'
3337d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3338f5be8cdbSBram Moolenaar      ':$',
3339f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3340f5be8cdbSBram Moolenaar      'bwipe!',
3341f5be8cdbSBram Moolenaar      ], 'E488:')
3342f5be8cdbSBram Moolenaar
3343f5be8cdbSBram Moolenaar  CheckScriptFailure([
3344f5be8cdbSBram Moolenaar      'vim9script',
3345f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3346f5be8cdbSBram Moolenaar      ], 'E477:')
3347a26b9700SBram Moolenaarenddef
3348a26b9700SBram Moolenaar
33497e5bd91dSBram Moolenaardef Test_finish()
3350cfcd011fSBram Moolenaar  var lines =<< trim END
33517e5bd91dSBram Moolenaar    vim9script
33526797966dSBram Moolenaar    g:res = 'one'
33537e5bd91dSBram Moolenaar    if v:false | finish | endif
33546797966dSBram Moolenaar    g:res = 'two'
33557e5bd91dSBram Moolenaar    finish
33566797966dSBram Moolenaar    g:res = 'three'
33577e5bd91dSBram Moolenaar  END
33587e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
33597e5bd91dSBram Moolenaar  source Xfinished
33607e5bd91dSBram Moolenaar  assert_equal('two', g:res)
33617e5bd91dSBram Moolenaar
33627e5bd91dSBram Moolenaar  unlet g:res
33637e5bd91dSBram Moolenaar  delete('Xfinished')
33647e5bd91dSBram Moolenaarenddef
33657e5bd91dSBram Moolenaar
3366a5d0077eSBram Moolenaardef Test_forward_declaration()
3367cfcd011fSBram Moolenaar  var lines =<< trim END
3368a5d0077eSBram Moolenaar    vim9script
3369a5d0077eSBram Moolenaar    def GetValue(): string
3370a5d0077eSBram Moolenaar      return theVal
3371a5d0077eSBram Moolenaar    enddef
3372cfcd011fSBram Moolenaar    var theVal = 'something'
3373822ba247SBram Moolenaar    g:initVal = GetValue()
3374a5d0077eSBram Moolenaar    theVal = 'else'
3375a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3376a5d0077eSBram Moolenaar  END
3377a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3378a5d0077eSBram Moolenaar  source Xforward
3379a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3380a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3381a5d0077eSBram Moolenaar
3382a5d0077eSBram Moolenaar  unlet g:initVal
3383a5d0077eSBram Moolenaar  unlet g:laterVal
3384a5d0077eSBram Moolenaar  delete('Xforward')
3385a5d0077eSBram Moolenaarenddef
3386a5d0077eSBram Moolenaar
33879721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3388a6294955SBram Moolenaar  var vim9_lines =<< trim END
3389a6294955SBram Moolenaar    vim9script
3390a6294955SBram Moolenaar    var local = 'local'
3391a6294955SBram Moolenaar    g:global = 'global'
3392a6294955SBram Moolenaar    export var exported = 'exported'
3393a6294955SBram Moolenaar    export def GetText(): string
3394a6294955SBram Moolenaar       return 'text'
3395a6294955SBram Moolenaar    enddef
3396a6294955SBram Moolenaar  END
3397a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3398a6294955SBram Moolenaar
3399cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
34009721fb4eSBram Moolenaar    source Xvim9_script.vim
34019721fb4eSBram Moolenaar
34029721fb4eSBram Moolenaar    call assert_false(exists('local'))
34039721fb4eSBram Moolenaar    call assert_false(exists('exported'))
34049721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
34059721fb4eSBram Moolenaar    call assert_equal('global', global)
34069721fb4eSBram Moolenaar    call assert_equal('global', g:global)
34079721fb4eSBram Moolenaar
34089721fb4eSBram Moolenaar    " imported variable becomes script-local
34099721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
34109721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
34119721fb4eSBram Moolenaar    call assert_false(exists('exported'))
34129721fb4eSBram Moolenaar
34139721fb4eSBram Moolenaar    " imported function becomes script-local
34149721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
34159721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
34169721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
34179721fb4eSBram Moolenaar  END
34189721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
34199721fb4eSBram Moolenaar
34209721fb4eSBram Moolenaar  source Xlegacy_script.vim
34219721fb4eSBram Moolenaar  assert_equal('global', g:global)
3422f5be8cdbSBram Moolenaar  unlet g:global
34239721fb4eSBram Moolenaar
34249721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
34259721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
34269721fb4eSBram Moolenaarenddef
3427a5d0077eSBram Moolenaar
3428e535db86SBram Moolenaardef Test_declare_script_in_func()
3429e535db86SBram Moolenaar  var lines =<< trim END
3430e535db86SBram Moolenaar      vim9script
3431e535db86SBram Moolenaar      func Declare()
3432e535db86SBram Moolenaar        let s:local = 123
3433e535db86SBram Moolenaar      endfunc
3434e535db86SBram Moolenaar      Declare()
3435e535db86SBram Moolenaar      assert_equal(123, local)
3436e535db86SBram Moolenaar
3437e535db86SBram Moolenaar      var error: string
3438e535db86SBram Moolenaar      try
3439e535db86SBram Moolenaar        local = 'asdf'
3440e535db86SBram Moolenaar      catch
3441e535db86SBram Moolenaar        error = v:exception
3442e535db86SBram Moolenaar      endtry
3443e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3444e535db86SBram Moolenaar
3445e535db86SBram Moolenaar      lockvar local
3446e535db86SBram Moolenaar      try
3447e535db86SBram Moolenaar        local = 999
3448e535db86SBram Moolenaar      catch
3449e535db86SBram Moolenaar        error = v:exception
3450e535db86SBram Moolenaar      endtry
3451e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3452e535db86SBram Moolenaar  END
3453e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3454e535db86SBram Moolenaarenddef
3455e535db86SBram Moolenaar
3456e535db86SBram Moolenaar
34577d699701SBram Moolenaarfunc Test_vim9script_not_global()
34587d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
34597d699701SBram Moolenaar  let vim9lines =<< trim END
34607d699701SBram Moolenaar    vim9script
3461cfcd011fSBram Moolenaar    var name = 'local'
34627d699701SBram Moolenaar    func TheFunc()
34637d699701SBram Moolenaar      echo 'local'
34647d699701SBram Moolenaar    endfunc
34657d699701SBram Moolenaar    def DefFunc()
34667d699701SBram Moolenaar      echo 'local'
34677d699701SBram Moolenaar    enddef
34687d699701SBram Moolenaar  END
34697d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
34707d699701SBram Moolenaar  source Xvim9script.vim
34717d699701SBram Moolenaar  try
34727d699701SBram Moolenaar    echo g:var
34737d699701SBram Moolenaar    assert_report('did not fail')
34747d699701SBram Moolenaar  catch /E121:/
34757d699701SBram Moolenaar    " caught
34767d699701SBram Moolenaar  endtry
34777d699701SBram Moolenaar  try
34787d699701SBram Moolenaar    call TheFunc()
34797d699701SBram Moolenaar    assert_report('did not fail')
34807d699701SBram Moolenaar  catch /E117:/
34817d699701SBram Moolenaar    " caught
34827d699701SBram Moolenaar  endtry
34837d699701SBram Moolenaar  try
34847d699701SBram Moolenaar    call DefFunc()
34857d699701SBram Moolenaar    assert_report('did not fail')
34867d699701SBram Moolenaar  catch /E117:/
34877d699701SBram Moolenaar    " caught
34887d699701SBram Moolenaar  endtry
34897d699701SBram Moolenaar
349025859dd7SBram Moolenaar  call delete('Xvim9script.vim')
34917d699701SBram Moolenaarendfunc
34927d699701SBram Moolenaar
3493eeb27bfeSBram Moolenaardef Test_vim9_copen()
3494eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3495eeb27bfeSBram Moolenaar  copen
3496eeb27bfeSBram Moolenaar  quit
3497eeb27bfeSBram Moolenaarenddef
3498eeb27bfeSBram Moolenaar
349903290b84SBram Moolenaar" test using an auto-loaded function and variable
35002d6b20d6SBram Moolenaardef Test_vim9_autoload()
3501cfcd011fSBram Moolenaar  var lines =<< trim END
35022d6b20d6SBram Moolenaar     vim9script
350303290b84SBram Moolenaar     def some#gettest(): string
350403290b84SBram Moolenaar       return 'test'
350503290b84SBram Moolenaar     enddef
350603290b84SBram Moolenaar     g:some#name = 'name'
3507227c58a4SBram Moolenaar     g:some#dict = {key: 'value'}
3508e3ffcd99SBram Moolenaar
3509e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3510e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3511e3ffcd99SBram Moolenaar     enddef
351203290b84SBram Moolenaar  END
351303290b84SBram Moolenaar
351403290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
351503290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
351603290b84SBram Moolenaar  var save_rtp = &rtp
351703290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
351803290b84SBram Moolenaar
351903290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
352003290b84SBram Moolenaar  assert_equal('name', g:some#name)
3521227c58a4SBram Moolenaar  assert_equal('value', g:some#dict.key)
352203290b84SBram Moolenaar  g:some#other = 'other'
352303290b84SBram Moolenaar  assert_equal('other', g:some#other)
352403290b84SBram Moolenaar
3525e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3526e3ffcd99SBram Moolenaar
352717f700acSBram Moolenaar  # upper case script name works
352817f700acSBram Moolenaar  lines =<< trim END
352917f700acSBram Moolenaar     vim9script
353017f700acSBram Moolenaar     def Other#getOther(): string
353117f700acSBram Moolenaar       return 'other'
353217f700acSBram Moolenaar     enddef
353317f700acSBram Moolenaar  END
353417f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
353517f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
353617f700acSBram Moolenaar
353703290b84SBram Moolenaar  delete('Xdir', 'rf')
353803290b84SBram Moolenaar  &rtp = save_rtp
353903290b84SBram Moolenaarenddef
354003290b84SBram Moolenaar
354103290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
354203290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
354303290b84SBram Moolenaar  var lines =<< trim END
354403290b84SBram Moolenaar     vim9script
35452d6b20d6SBram Moolenaar     def foo#test()
35462d6b20d6SBram Moolenaar         echomsg getreg('"')
35472d6b20d6SBram Moolenaar     enddef
35482d6b20d6SBram Moolenaar  END
35492d6b20d6SBram Moolenaar
35502d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
35512d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3552cfcd011fSBram Moolenaar  var save_rtp = &rtp
35532d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
35542d6b20d6SBram Moolenaar  augroup test
35552d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
35562d6b20d6SBram Moolenaar  augroup END
35572d6b20d6SBram Moolenaar
35582d6b20d6SBram Moolenaar  normal Y
35592d6b20d6SBram Moolenaar
35602d6b20d6SBram Moolenaar  augroup test
35612d6b20d6SBram Moolenaar    autocmd!
35622d6b20d6SBram Moolenaar  augroup END
35632d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
35642d6b20d6SBram Moolenaar  &rtp = save_rtp
35652d6b20d6SBram Moolenaarenddef
35662d6b20d6SBram Moolenaar
356777e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
356877e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3569cfcd011fSBram Moolenaar  var lines =<< trim END
357077e5dcc3SBram Moolenaar      vim9script
357177e5dcc3SBram Moolenaar      def crash#func()
357277e5dcc3SBram Moolenaar          try
357377e5dcc3SBram Moolenaar              for x in List()
357477e5dcc3SBram Moolenaar              endfor
357577e5dcc3SBram Moolenaar          catch
357677e5dcc3SBram Moolenaar          endtry
357777e5dcc3SBram Moolenaar          g:ok = true
357877e5dcc3SBram Moolenaar      enddef
357977e5dcc3SBram Moolenaar      fu List()
358077e5dcc3SBram Moolenaar          invalid
358177e5dcc3SBram Moolenaar      endfu
358277e5dcc3SBram Moolenaar      try
358348e11c10SBram Moolenaar          alsoinvalid
358477e5dcc3SBram Moolenaar      catch /wontmatch/
358577e5dcc3SBram Moolenaar      endtry
358677e5dcc3SBram Moolenaar  END
358777e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
358877e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
358977e5dcc3SBram Moolenaar
359077e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
359177e5dcc3SBram Moolenaar  lines =<< trim END
359277e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
359377e5dcc3SBram Moolenaar    call crash#func()
359477e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
35959c4f5520SBram Moolenaar    qall!
359677e5dcc3SBram Moolenaar  END
359777e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
359877e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
359977e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
360077e5dcc3SBram Moolenaar
360177e5dcc3SBram Moolenaar  delete('Xdidit')
360277e5dcc3SBram Moolenaar  delete('Xscript')
360377e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
360403290b84SBram Moolenaar
360503290b84SBram Moolenaar  lines =<< trim END
360603290b84SBram Moolenaar    vim9script
360703290b84SBram Moolenaar    var foo#bar = 'asdf'
360803290b84SBram Moolenaar  END
360903290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
361077e5dcc3SBram Moolenaarenddef
361177e5dcc3SBram Moolenaar
361281e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
361381e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
361481e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3615cfcd011fSBram Moolenaar  var lines =<< trim END
361681e17fbeSBram Moolenaar    let s:counter = 1
361781e17fbeSBram Moolenaar    def s:Func()
361881e17fbeSBram Moolenaar      au! CursorHold
361981e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
362081e17fbeSBram Moolenaar    enddef
362181e17fbeSBram Moolenaar    call s:Func()
362281e17fbeSBram Moolenaar    doau CursorHold
362381e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
362481e17fbeSBram Moolenaar    au! CursorHold
362581e17fbeSBram Moolenaar  END
362681e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
362781e17fbeSBram Moolenaarenddef
362881e17fbeSBram Moolenaar
36293896a105SBram Moolenaardef Test_cmdline_win()
36303896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
36313896a105SBram Moolenaar  # the command line window.
36323896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3633cfcd011fSBram Moolenaar  var export_lines =<< trim END
36343896a105SBram Moolenaar    vim9script
3635cfcd011fSBram Moolenaar    export var That = 'yes'
36363896a105SBram Moolenaar  END
36373896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3638cfcd011fSBram Moolenaar  var import_lines =<< trim END
36393896a105SBram Moolenaar    vim9script
36403896a105SBram Moolenaar    import That from './Xexport.vim'
36413896a105SBram Moolenaar  END
36423896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3643cfcd011fSBram Moolenaar  var save_rtp = &rtp
36443896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
36453896a105SBram Moolenaar  syntax on
36463896a105SBram Moolenaar  augroup CmdWin
36473896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
36483896a105SBram Moolenaar  augroup END
36493896a105SBram Moolenaar  # this will open and also close the cmdline window
36503896a105SBram Moolenaar  feedkeys('q:', 'xt')
36513896a105SBram Moolenaar  assert_equal('yes', g:got_there)
36523896a105SBram Moolenaar
36533896a105SBram Moolenaar  augroup CmdWin
36543896a105SBram Moolenaar    au!
36553896a105SBram Moolenaar  augroup END
36563896a105SBram Moolenaar  &rtp = save_rtp
36573896a105SBram Moolenaar  delete('rtp', 'rf')
36583896a105SBram Moolenaarenddef
36593896a105SBram Moolenaar
3660e3d4685fSBram Moolenaardef Test_invalid_sid()
3661e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
366225859dd7SBram Moolenaar
36639c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3664d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3665e3d4685fSBram Moolenaar  endif
3666e3d4685fSBram Moolenaar  delete('Xdidit')
3667e3d4685fSBram Moolenaarenddef
3668e3d4685fSBram Moolenaar
36699ec7026fSBram Moolenaardef Test_restoring_cpo()
36709ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
36719ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
36729ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
36739ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
36749ec7026fSBram Moolenaar  endif
36759ec7026fSBram Moolenaar  delete('Xsourced')
36769ec7026fSBram Moolenaar  delete('Xclose')
3677090728adSBram Moolenaar  delete('Xdone')
36780123cc1eSBram Moolenaar
36790123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
36800123cc1eSBram Moolenaar  set cpo=aABceFsMny>
36810123cc1eSBram Moolenaar  edit XanotherScript
36820123cc1eSBram Moolenaar  so %
36830123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
36840123cc1eSBram Moolenaar  :1del
36850123cc1eSBram Moolenaar  w
36860123cc1eSBram Moolenaar  so %
36870123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
36880123cc1eSBram Moolenaar
36890123cc1eSBram Moolenaar  delete('XanotherScript')
36900123cc1eSBram Moolenaar  set cpo&vim
36919ec7026fSBram Moolenaarenddef
36929ec7026fSBram Moolenaar
3693ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3694ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
369537294bd6SBram Moolenaar  CheckScreendump
3696ffb7dcdbSBram Moolenaar  CheckFeature timers
369737294bd6SBram Moolenaar
3698ffb7dcdbSBram Moolenaar  let lines =<< trim END
369937294bd6SBram Moolenaar    vim9script
370037294bd6SBram Moolenaar    def script#func()
370137294bd6SBram Moolenaar    enddef
370237294bd6SBram Moolenaar  END
3703ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3704ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
370537294bd6SBram Moolenaar
3706ffb7dcdbSBram Moolenaar  let lines =<< trim END
370737294bd6SBram Moolenaar      vim9script
370837294bd6SBram Moolenaar      set cpo+=M
370937294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
3710767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
371137294bd6SBram Moolenaar      setline(1, 'some text')
371237294bd6SBram Moolenaar  END
3713ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3714ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3715ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3716ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
371737294bd6SBram Moolenaar
3718ffb7dcdbSBram Moolenaar  " clean up
3719ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3720ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3721ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3722ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3723ffb7dcdbSBram Moolenaarendfunc
372437294bd6SBram Moolenaar
37259ec7026fSBram Moolenaar
3726f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3727cfcd011fSBram Moolenaar  var lines =<< trim END
3728cfcd011fSBram Moolenaar    var name: any
3729cfcd011fSBram Moolenaar    assert_equal(0, name)
3730f0afd9e1SBram Moolenaar  END
3731f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3732f0afd9e1SBram Moolenaarenddef
3733f0afd9e1SBram Moolenaar
37347e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
373558dbef33SBram Moolenaar  CheckRunVimInTerminal
373658dbef33SBram Moolenaar
37377e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
37387e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
37397e9210eaSBram Moolenaarendfunc
37407e9210eaSBram Moolenaar
37417e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
37429c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3743cfcd011fSBram Moolenaar  var lines =<< trim END
37449c4f5520SBram Moolenaar    func CheckAndQuit()
37459c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
37469c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
37479c4f5520SBram Moolenaar    endfunc
37489c4f5520SBram Moolenaar  END
37499c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
37509c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3751e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
37529c4f5520SBram Moolenaar  # define Afunc() on the command line
37539c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
37549c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
37552949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
37569c4f5520SBram Moolenaar
37579c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
37589c4f5520SBram Moolenaar  delete('XcallFunc')
37599c4f5520SBram Moolenaar  delete('Xdidcmd')
37609c4f5520SBram Moolenaarenddef
37619c4f5520SBram Moolenaar
3762fcdc5d83SBram Moolenaardef Test_script_var_scope()
3763fcdc5d83SBram Moolenaar  var lines =<< trim END
3764fcdc5d83SBram Moolenaar      vim9script
3765fcdc5d83SBram Moolenaar      if true
3766fcdc5d83SBram Moolenaar        if true
3767fcdc5d83SBram Moolenaar          var one = 'one'
3768fcdc5d83SBram Moolenaar          echo one
3769fcdc5d83SBram Moolenaar        endif
3770fcdc5d83SBram Moolenaar        echo one
3771fcdc5d83SBram Moolenaar      endif
3772fcdc5d83SBram Moolenaar  END
3773fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3774fcdc5d83SBram Moolenaar
3775fcdc5d83SBram Moolenaar  lines =<< trim END
3776fcdc5d83SBram Moolenaar      vim9script
3777fcdc5d83SBram Moolenaar      if true
3778fcdc5d83SBram Moolenaar        if false
3779fcdc5d83SBram Moolenaar          var one = 'one'
3780fcdc5d83SBram Moolenaar          echo one
3781fcdc5d83SBram Moolenaar        else
3782fcdc5d83SBram Moolenaar          var one = 'one'
3783fcdc5d83SBram Moolenaar          echo one
3784fcdc5d83SBram Moolenaar        endif
3785fcdc5d83SBram Moolenaar        echo one
3786fcdc5d83SBram Moolenaar      endif
3787fcdc5d83SBram Moolenaar  END
3788fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3789fcdc5d83SBram Moolenaar
3790fcdc5d83SBram Moolenaar  lines =<< trim END
3791fcdc5d83SBram Moolenaar      vim9script
3792fcdc5d83SBram Moolenaar      while true
3793fcdc5d83SBram Moolenaar        var one = 'one'
3794fcdc5d83SBram Moolenaar        echo one
3795fcdc5d83SBram Moolenaar        break
3796fcdc5d83SBram Moolenaar      endwhile
3797fcdc5d83SBram Moolenaar      echo one
3798fcdc5d83SBram Moolenaar  END
3799fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3800fcdc5d83SBram Moolenaar
3801fcdc5d83SBram Moolenaar  lines =<< trim END
3802fcdc5d83SBram Moolenaar      vim9script
3803fcdc5d83SBram Moolenaar      for i in range(1)
3804fcdc5d83SBram Moolenaar        var one = 'one'
3805fcdc5d83SBram Moolenaar        echo one
3806fcdc5d83SBram Moolenaar      endfor
3807fcdc5d83SBram Moolenaar      echo one
3808fcdc5d83SBram Moolenaar  END
3809fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
38109becdf2bSBram Moolenaar
38119becdf2bSBram Moolenaar  lines =<< trim END
38129becdf2bSBram Moolenaar      vim9script
38139becdf2bSBram Moolenaar      {
38149becdf2bSBram Moolenaar        var one = 'one'
38159becdf2bSBram Moolenaar        assert_equal('one', one)
38169becdf2bSBram Moolenaar      }
38179becdf2bSBram Moolenaar      assert_false(exists('one'))
38189becdf2bSBram Moolenaar      assert_false(exists('s:one'))
38199becdf2bSBram Moolenaar  END
38209becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
38219becdf2bSBram Moolenaar
38229becdf2bSBram Moolenaar  lines =<< trim END
38239becdf2bSBram Moolenaar      vim9script
38249becdf2bSBram Moolenaar      {
38259becdf2bSBram Moolenaar        var one = 'one'
38269becdf2bSBram Moolenaar        echo one
38279becdf2bSBram Moolenaar      }
38289becdf2bSBram Moolenaar      echo one
38299becdf2bSBram Moolenaar  END
38309becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3831fcdc5d83SBram Moolenaarenddef
3832fcdc5d83SBram Moolenaar
3833352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3834352134bbSBram Moolenaar  var lines =<< trim END
3835352134bbSBram Moolenaar    vim9script
38362a38908bSBram Moolenaar    def Callback(...l: list<any>)
3837352134bbSBram Moolenaar      try
3838352134bbSBram Moolenaar        var x: string
3839352134bbSBram Moolenaar        var y: string
3840352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3841352134bbSBram Moolenaar        [x, y] = ['']
3842352134bbSBram Moolenaar      catch
3843352134bbSBram Moolenaar        g:caught = 'yes'
3844352134bbSBram Moolenaar      endtry
3845352134bbSBram Moolenaar    enddef
3846e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3847352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3848352134bbSBram Moolenaar  END
3849352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3850352134bbSBram Moolenaar
3851352134bbSBram Moolenaar  unlet g:caught
3852352134bbSBram Moolenaarenddef
3853352134bbSBram Moolenaar
3854631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3855631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3856631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3857631e8f93SBram Moolenaar  endif
3858631e8f93SBram Moolenaar  var lines =<< trim END
3859631e8f93SBram Moolenaar      vim9script
3860631e8f93SBram Moolenaar      var source: list<number>
38612a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
3862631e8f93SBram Moolenaar          eval [][0]
3863631e8f93SBram Moolenaar      enddef
38642a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
3865631e8f93SBram Moolenaar          sleep 1m
3866631e8f93SBram Moolenaar          source += l
3867631e8f93SBram Moolenaar      enddef
3868e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
38696f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
38706f17a3f0SBram Moolenaar        sleep 10m
38716f17a3f0SBram Moolenaar      endwhile
3872206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3873fe95b94fSBram Moolenaar      sleep 200m
3874631e8f93SBram Moolenaar  END
3875631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3876631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3877631e8f93SBram Moolenaar  delete('Xdef')
3878631e8f93SBram Moolenaarenddef
3879631e8f93SBram Moolenaar
38804324d87aSBram Moolenaardef InvokeNormal()
38814324d87aSBram Moolenaar  exe "norm! :m+1\r"
38824324d87aSBram Moolenaarenddef
38834324d87aSBram Moolenaar
38844324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
38854324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
38864324d87aSBram Moolenaar  new
38874324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
38884324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
38894324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
38904324d87aSBram Moolenaar  xunmap <F3>
3891b5b9480eSBram Moolenaarenddef
3892b5b9480eSBram Moolenaar
3893b5b9480eSBram Moolenaardef Test_white_space_after_command()
3894b5b9480eSBram Moolenaar  var lines =<< trim END
3895b5b9480eSBram Moolenaar    exit_cb: Func})
3896b5b9480eSBram Moolenaar  END
3897b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3898f8103f27SBram Moolenaar
3899f8103f27SBram Moolenaar  lines =<< trim END
3900f8103f27SBram Moolenaar    e#
3901f8103f27SBram Moolenaar  END
3902f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
39034324d87aSBram Moolenaarenddef
39044324d87aSBram Moolenaar
39054aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
39064aab88d9SBram Moolenaar  var lines =<< trim END
39074aab88d9SBram Moolenaar      vim9script
39084aab88d9SBram Moolenaar      if exists('g:guard')
39094aab88d9SBram Moolenaar        finish
39104aab88d9SBram Moolenaar      endif
39114aab88d9SBram Moolenaar      g:guard = 1
39124aab88d9SBram Moolenaar      var name = 'thename'
39134aab88d9SBram Moolenaar      def g:GetName(): string
39144aab88d9SBram Moolenaar        return name
39154aab88d9SBram Moolenaar      enddef
39164aab88d9SBram Moolenaar      def g:SetName(arg: string)
39174aab88d9SBram Moolenaar        name = arg
39184aab88d9SBram Moolenaar      enddef
39194aab88d9SBram Moolenaar  END
39204aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
39214aab88d9SBram Moolenaar  so XscriptTwice.vim
39224aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
39234aab88d9SBram Moolenaar  g:SetName('newname')
39244aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
39254aab88d9SBram Moolenaar  so XscriptTwice.vim
39264aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
39274aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
39284aab88d9SBram Moolenaar
39294aab88d9SBram Moolenaar  delfunc g:GetName
39304aab88d9SBram Moolenaar  delfunc g:SetName
39314aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
39324aab88d9SBram Moolenaar  unlet g:guard
39334aab88d9SBram Moolenaarenddef
39344aab88d9SBram Moolenaar
39354aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
39364aab88d9SBram Moolenaar  var exportlines =<< trim END
39374aab88d9SBram Moolenaar      vim9script
39384aab88d9SBram Moolenaar      if exists('g:guard')
39394aab88d9SBram Moolenaar        finish
39404aab88d9SBram Moolenaar      endif
39414aab88d9SBram Moolenaar      g:guard = 1
39424aab88d9SBram Moolenaar      export var name = 'someName'
39434aab88d9SBram Moolenaar  END
39444aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
39454aab88d9SBram Moolenaar
39464aab88d9SBram Moolenaar  var lines =<< trim END
39474aab88d9SBram Moolenaar      vim9script
39484aab88d9SBram Moolenaar      import name from './XexportScript.vim'
39494aab88d9SBram Moolenaar      def g:GetName(): string
39504aab88d9SBram Moolenaar        return name
39514aab88d9SBram Moolenaar      enddef
39524aab88d9SBram Moolenaar  END
39534aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
39544aab88d9SBram Moolenaar  so XscriptImport.vim
39554aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
39564aab88d9SBram Moolenaar
39574aab88d9SBram Moolenaar  so XexportScript.vim
39584aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
39594aab88d9SBram Moolenaar
39604aab88d9SBram Moolenaar  delfunc g:GetName
39614aab88d9SBram Moolenaar  delete('XexportScript.vim')
39624aab88d9SBram Moolenaar  delete('XscriptImport.vim')
39634aab88d9SBram Moolenaar  unlet g:guard
39644aab88d9SBram Moolenaarenddef
39654aab88d9SBram Moolenaar
396610b9421fSBram Moolenaardef Test_unsupported_commands()
396710b9421fSBram Moolenaar  var lines =<< trim END
396810b9421fSBram Moolenaar      ka
396910b9421fSBram Moolenaar  END
39707d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
39717d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
397210b9421fSBram Moolenaar
397310b9421fSBram Moolenaar  lines =<< trim END
3974ada1d870SBram Moolenaar      :1ka
3975ada1d870SBram Moolenaar  END
39767d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
39777d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
3978ada1d870SBram Moolenaar
3979ada1d870SBram Moolenaar  lines =<< trim END
398010b9421fSBram Moolenaar    t
398110b9421fSBram Moolenaar  END
398210b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
398310b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
398410b9421fSBram Moolenaar
398510b9421fSBram Moolenaar  lines =<< trim END
398610b9421fSBram Moolenaar    x
398710b9421fSBram Moolenaar  END
398810b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
398910b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
399010b9421fSBram Moolenaar
399110b9421fSBram Moolenaar  lines =<< trim END
399210b9421fSBram Moolenaar    xit
399310b9421fSBram Moolenaar  END
399410b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
399510b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
399610b9421fSBram Moolenaarenddef
399710b9421fSBram Moolenaar
3998c70fe460SBram Moolenaardef Test_mapping_line_number()
3999c70fe460SBram Moolenaar  var lines =<< trim END
4000c70fe460SBram Moolenaar      vim9script
4001c70fe460SBram Moolenaar      def g:FuncA()
4002c70fe460SBram Moolenaar          # Some comment
4003c70fe460SBram Moolenaar          FuncB(0)
4004c70fe460SBram Moolenaar      enddef
4005c70fe460SBram Moolenaar          # Some comment
4006c70fe460SBram Moolenaar      def FuncB(
4007c70fe460SBram Moolenaar          # Some comment
4008c70fe460SBram Moolenaar          n: number
4009c70fe460SBram Moolenaar      )
4010c70fe460SBram Moolenaar          exe 'nno '
4011c70fe460SBram Moolenaar              # Some comment
4012c70fe460SBram Moolenaar              .. '<F3> a'
4013c70fe460SBram Moolenaar              .. 'b'
4014c70fe460SBram Moolenaar              .. 'c'
4015c70fe460SBram Moolenaar      enddef
4016c70fe460SBram Moolenaar  END
4017c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
4018c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
4019c70fe460SBram Moolenaar  assert_match('No mapping found', res)
4020c70fe460SBram Moolenaar
4021c70fe460SBram Moolenaar  g:FuncA()
4022c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
4023c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4024c70fe460SBram Moolenaar
4025c70fe460SBram Moolenaar  nunmap <F3>
4026c70fe460SBram Moolenaar  delfunc g:FuncA
4027c70fe460SBram Moolenaarenddef
4028c70fe460SBram Moolenaar
4029208f0b48SBram Moolenaardef Test_option_modifier()
4030208f0b48SBram Moolenaar  var lines =<< trim END
4031208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
4032208f0b48SBram Moolenaar      call assert_equal(1, &hlsearch)
4033208f0b48SBram Moolenaar  END
4034208f0b48SBram Moolenaar  CheckScriptSuccess(lines)
4035208f0b48SBram Moolenaar
4036208f0b48SBram Moolenaar  lines =<< trim END
4037208f0b48SBram Moolenaar      vim9script
4038208f0b48SBram Moolenaar      set hlsearch &
4039208f0b48SBram Moolenaar  END
4040208f0b48SBram Moolenaar  CheckScriptFailure(lines, 'E518:')
4041208f0b48SBram Moolenaar
4042208f0b48SBram Moolenaar  lines =<< trim END
4043208f0b48SBram Moolenaar      vim9script
4044208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
4045208f0b48SBram Moolenaar  END
4046208f0b48SBram Moolenaar  CheckScriptFailure(lines, 'E518:')
4047208f0b48SBram Moolenaarenddef
4048208f0b48SBram Moolenaar
4049585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
4050585fea7bSBram Moolenaardef Test_substitute_cmd()
4051585fea7bSBram Moolenaar  new
4052585fea7bSBram Moolenaar  setline(1, 'something')
4053585fea7bSBram Moolenaar  :substitute(some(other(
4054585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
4055585fea7bSBram Moolenaar  bwipe!
4056585fea7bSBram Moolenaar
4057f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
4058cfcd011fSBram Moolenaar  var lines =<< trim END
4059585fea7bSBram Moolenaar    vim9script
4060585fea7bSBram Moolenaar    new
4061585fea7bSBram Moolenaar    setline(1, 'something')
4062585fea7bSBram Moolenaar    :substitute(some(other(
4063585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
4064585fea7bSBram Moolenaar    bwipe!
4065585fea7bSBram Moolenaar  END
4066585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
4067585fea7bSBram Moolenaar  source Xvim9lines
4068585fea7bSBram Moolenaar
4069585fea7bSBram Moolenaar  delete('Xvim9lines')
4070585fea7bSBram Moolenaarenddef
4071585fea7bSBram Moolenaar
40728a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
4073