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
6064197828dSBram Moolenaar
6074197828dSBram Moolenaar  # missing catch and/or finally
6084197828dSBram Moolenaar  lines =<< trim END
6094197828dSBram Moolenaar      vim9script
6104197828dSBram Moolenaar      try
6114197828dSBram Moolenaar        echo 'something'
6124197828dSBram Moolenaar      endtry
6134197828dSBram Moolenaar  END
6144197828dSBram Moolenaar  CheckScriptFailure(lines, 'E1032:')
6158a7d6542SBram Moolenaarenddef
6168a7d6542SBram Moolenaar
6173f987b59SBram Moolenaardef Test_try_in_catch()
6183f987b59SBram Moolenaar  var lines =<< trim END
6193f987b59SBram Moolenaar      vim9script
6203f987b59SBram Moolenaar      var seq = []
6213f987b59SBram Moolenaar      def DoIt()
6223f987b59SBram Moolenaar        try
6233f987b59SBram Moolenaar          seq->add('throw 1')
6243f987b59SBram Moolenaar          eval [][0]
6253f987b59SBram Moolenaar          seq->add('notreached')
6263f987b59SBram Moolenaar        catch
6273f987b59SBram Moolenaar          seq->add('catch')
6283f987b59SBram Moolenaar          try
6293f987b59SBram Moolenaar            seq->add('throw 2')
6303f987b59SBram Moolenaar            eval [][0]
6313f987b59SBram Moolenaar            seq->add('notreached')
6323f987b59SBram Moolenaar          catch /nothing/
6333f987b59SBram Moolenaar            seq->add('notreached')
6343f987b59SBram Moolenaar          endtry
6353f987b59SBram Moolenaar          seq->add('done')
6363f987b59SBram Moolenaar        endtry
6373f987b59SBram Moolenaar      enddef
6383f987b59SBram Moolenaar      DoIt()
6393f987b59SBram Moolenaar      assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
6403f987b59SBram Moolenaar  END
6413f987b59SBram Moolenaarenddef
6423f987b59SBram Moolenaar
643d3d8feebSBram Moolenaardef Test_error_in_catch()
644d3d8feebSBram Moolenaar  var lines =<< trim END
645d3d8feebSBram Moolenaar      try
646d3d8feebSBram Moolenaar        eval [][0]
647d3d8feebSBram Moolenaar      catch /E684:/
648d3d8feebSBram Moolenaar        eval [][0]
649d3d8feebSBram Moolenaar      endtry
650d3d8feebSBram Moolenaar  END
651d3d8feebSBram Moolenaar  CheckDefExecFailure(lines, 'E684:', 4)
652d3d8feebSBram Moolenaarenddef
653d3d8feebSBram Moolenaar
6542e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to
6552e34c34bSBram Moolenaardef TryContinueFunc()
6562e34c34bSBram Moolenaar while g:Count < 2
6572e34c34bSBram Moolenaar   g:sequence ..= 't'
6582e34c34bSBram Moolenaar    try
6592e34c34bSBram Moolenaar      echoerr 'Test'
6602e34c34bSBram Moolenaar    catch
6612e34c34bSBram Moolenaar      g:Count += 1
6622e34c34bSBram Moolenaar      g:sequence ..= 'c'
6632e34c34bSBram Moolenaar      continue
6642e34c34bSBram Moolenaar    endtry
6652e34c34bSBram Moolenaar    g:sequence ..= 'e'
6662e34c34bSBram Moolenaar    g:Count += 1
6672e34c34bSBram Moolenaar  endwhile
6682e34c34bSBram Moolenaarenddef
6692e34c34bSBram Moolenaar
6702e34c34bSBram Moolenaardef Test_continue_in_try_in_while()
6712e34c34bSBram Moolenaar  g:Count = 0
6722e34c34bSBram Moolenaar  g:sequence = ''
6732e34c34bSBram Moolenaar  TryContinueFunc()
6742e34c34bSBram Moolenaar  assert_equal('tctc', g:sequence)
6752e34c34bSBram Moolenaar  unlet g:Count
6762e34c34bSBram Moolenaar  unlet g:sequence
6772e34c34bSBram Moolenaarenddef
6782e34c34bSBram Moolenaar
6799cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
6809cb577a6SBram Moolenaar  # return in try block returns normally
6819cb577a6SBram Moolenaar  def ReturnInTry(): string
6829cb577a6SBram Moolenaar    try
6839cb577a6SBram Moolenaar      return '"some message"'
6849cb577a6SBram Moolenaar    catch
6859cb577a6SBram Moolenaar    endtry
6869cb577a6SBram Moolenaar    return 'not reached'
6879cb577a6SBram Moolenaar  enddef
6889cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
6899cb577a6SBram Moolenaarenddef
6909cb577a6SBram Moolenaar
6911430ceebSBram Moolenaardef Test_cnext_works_in_catch()
6921430ceebSBram Moolenaar  var lines =<< trim END
6931430ceebSBram Moolenaar      vim9script
694c323527dSBram Moolenaar      au BufEnter * eval 1 + 2
6951430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
6961430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
6971430ceebSBram Moolenaar      var items = [
6981430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
6991430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
7001430ceebSBram Moolenaar        ]
7011430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
7021430ceebSBram Moolenaar      cwindow
7031430ceebSBram Moolenaar
7041430ceebSBram Moolenaar      def CnextOrCfirst()
7051430ceebSBram Moolenaar        # if cnext fails, cfirst is used
7061430ceebSBram Moolenaar        try
7071430ceebSBram Moolenaar          cnext
7081430ceebSBram Moolenaar        catch
7091430ceebSBram Moolenaar          cfirst
7101430ceebSBram Moolenaar        endtry
7111430ceebSBram Moolenaar      enddef
7121430ceebSBram Moolenaar
7131430ceebSBram Moolenaar      CnextOrCfirst()
7141430ceebSBram Moolenaar      CnextOrCfirst()
7151430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
7161430ceebSBram Moolenaar      qall
7171430ceebSBram Moolenaar  END
7181430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
7191430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
7201430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
7211430ceebSBram Moolenaar
7221430ceebSBram Moolenaar  delete('Xfile1')
7231430ceebSBram Moolenaar  delete('Xfile2')
7241430ceebSBram Moolenaar  delete('XCatchCnext')
7251430ceebSBram Moolenaar  delete('Xresult')
7261430ceebSBram Moolenaarenddef
7271430ceebSBram Moolenaar
7289e1d9e34SBram Moolenaardef Test_throw_skipped()
7299e1d9e34SBram Moolenaar  if 0
7309e1d9e34SBram Moolenaar    throw dontgethere
7319e1d9e34SBram Moolenaar  endif
7329e1d9e34SBram Moolenaarenddef
7339e1d9e34SBram Moolenaar
7348f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
7358f81b22eSBram Moolenaar  var lines =<< trim END
7368f81b22eSBram Moolenaar    vim9script
7378f81b22eSBram Moolenaar    def Func()
7388f81b22eSBram Moolenaar      throw 'error'
7398f81b22eSBram Moolenaar    enddef
7408f81b22eSBram Moolenaar    silent! Func()
7418f81b22eSBram Moolenaar  END
7428f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
7438f81b22eSBram Moolenaar  source XthrowSilenced
7448f81b22eSBram Moolenaar  delete('XthrowSilenced')
7458f81b22eSBram Moolenaarenddef
7468f81b22eSBram Moolenaar
747e859312eSBram Moolenaardef DeletedFunc(): list<any>
748e859312eSBram Moolenaar  return ['delete me']
749e859312eSBram Moolenaarenddef
750e859312eSBram Moolenaardefcompile
751e859312eSBram Moolenaardelfunc DeletedFunc
752e859312eSBram Moolenaar
753257cc5eeSBram Moolenaardef ThrowFromDef()
754a72cfb80SBram Moolenaar  throw "getout" # comment
755257cc5eeSBram Moolenaarenddef
756257cc5eeSBram Moolenaar
757257cc5eeSBram Moolenaarfunc CatchInFunc()
758257cc5eeSBram Moolenaar  try
759257cc5eeSBram Moolenaar    call ThrowFromDef()
760257cc5eeSBram Moolenaar  catch
761257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
762257cc5eeSBram Moolenaar  endtry
763257cc5eeSBram Moolenaarendfunc
764257cc5eeSBram Moolenaar
765257cc5eeSBram Moolenaardef CatchInDef()
766257cc5eeSBram Moolenaar  try
767257cc5eeSBram Moolenaar    ThrowFromDef()
768257cc5eeSBram Moolenaar  catch
769257cc5eeSBram Moolenaar    g:thrown_def = v:exception
770257cc5eeSBram Moolenaar  endtry
771257cc5eeSBram Moolenaarenddef
772257cc5eeSBram Moolenaar
773f575adffSBram Moolenaardef ReturnFinally(): string
774f575adffSBram Moolenaar  try
775f575adffSBram Moolenaar    return 'intry'
776373863edSBram Moolenaar  finall
777f575adffSBram Moolenaar    g:in_finally = 'finally'
778f575adffSBram Moolenaar  endtry
779f575adffSBram Moolenaar  return 'end'
780f575adffSBram Moolenaarenddef
781f575adffSBram Moolenaar
782257cc5eeSBram Moolenaardef Test_try_catch_nested()
783257cc5eeSBram Moolenaar  CatchInFunc()
784257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
785257cc5eeSBram Moolenaar
786257cc5eeSBram Moolenaar  CatchInDef()
787257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
788f575adffSBram Moolenaar
789f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
790f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
791d3d8feebSBram Moolenaar
792d3d8feebSBram Moolenaar  var l = []
793d3d8feebSBram Moolenaar  try
794d3d8feebSBram Moolenaar    l->add('1')
795d3d8feebSBram Moolenaar    throw 'bad'
796d3d8feebSBram Moolenaar    l->add('x')
797d3d8feebSBram Moolenaar  catch /bad/
798d3d8feebSBram Moolenaar    l->add('2')
799d3d8feebSBram Moolenaar    try
800d3d8feebSBram Moolenaar      l->add('3')
801d3d8feebSBram Moolenaar      throw 'one'
802d3d8feebSBram Moolenaar      l->add('x')
803d3d8feebSBram Moolenaar    catch /one/
804d3d8feebSBram Moolenaar      l->add('4')
805d3d8feebSBram Moolenaar      try
806d3d8feebSBram Moolenaar        l->add('5')
807d3d8feebSBram Moolenaar        throw 'more'
808d3d8feebSBram Moolenaar        l->add('x')
809d3d8feebSBram Moolenaar      catch /more/
810d3d8feebSBram Moolenaar        l->add('6')
811d3d8feebSBram Moolenaar      endtry
812d3d8feebSBram Moolenaar    endtry
813d3d8feebSBram Moolenaar  endtry
814d3d8feebSBram Moolenaar  assert_equal(['1', '2', '3', '4', '5', '6'], l)
815834193afSBram Moolenaar
816834193afSBram Moolenaar  l = []
817834193afSBram Moolenaar  try
818834193afSBram Moolenaar    try
819834193afSBram Moolenaar      l->add('1')
820834193afSBram Moolenaar      throw 'foo'
821834193afSBram Moolenaar      l->add('x')
822834193afSBram Moolenaar    catch
823834193afSBram Moolenaar      l->add('2')
824834193afSBram Moolenaar      throw 'bar'
825834193afSBram Moolenaar      l->add('x')
826834193afSBram Moolenaar    finally
827834193afSBram Moolenaar      l->add('3')
828834193afSBram Moolenaar    endtry
829834193afSBram Moolenaar    l->add('x')
830834193afSBram Moolenaar  catch /bar/
831834193afSBram Moolenaar    l->add('4')
832834193afSBram Moolenaar  endtry
833834193afSBram Moolenaar  assert_equal(['1', '2', '3', '4'], l)
834f575adffSBram Moolenaarenddef
835f575adffSBram Moolenaar
8369939f57bSBram Moolenaardef TryOne(): number
8379939f57bSBram Moolenaar  try
8389939f57bSBram Moolenaar    return 0
8399939f57bSBram Moolenaar  catch
8409939f57bSBram Moolenaar  endtry
8419939f57bSBram Moolenaar  return 0
8429939f57bSBram Moolenaarenddef
8439939f57bSBram Moolenaar
8449939f57bSBram Moolenaardef TryTwo(n: number): string
8459939f57bSBram Moolenaar  try
846cfcd011fSBram Moolenaar    var x = {}
8479939f57bSBram Moolenaar  catch
8489939f57bSBram Moolenaar  endtry
8499939f57bSBram Moolenaar  return 'text'
8509939f57bSBram Moolenaarenddef
8519939f57bSBram Moolenaar
8529939f57bSBram Moolenaardef Test_try_catch_twice()
8539939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
8549939f57bSBram Moolenaarenddef
8559939f57bSBram Moolenaar
856f575adffSBram Moolenaardef Test_try_catch_match()
857cfcd011fSBram Moolenaar  var seq = 'a'
858f575adffSBram Moolenaar  try
859f575adffSBram Moolenaar    throw 'something'
860f575adffSBram Moolenaar  catch /nothing/
861f575adffSBram Moolenaar    seq ..= 'x'
862f575adffSBram Moolenaar  catch /some/
863f575adffSBram Moolenaar    seq ..= 'b'
864f575adffSBram Moolenaar  catch /asdf/
865f575adffSBram Moolenaar    seq ..= 'x'
866e8c4abbbSBram Moolenaar  catch ?a\?sdf?
867e8c4abbbSBram Moolenaar    seq ..= 'y'
868f575adffSBram Moolenaar  finally
869f575adffSBram Moolenaar    seq ..= 'c'
870f575adffSBram Moolenaar  endtry
871f575adffSBram Moolenaar  assert_equal('abc', seq)
872257cc5eeSBram Moolenaarenddef
873257cc5eeSBram Moolenaar
874e8c4abbbSBram Moolenaardef Test_try_catch_fails()
875d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
876d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
877d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
878d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
879d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
880d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
881d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
882d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
88313106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
884d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
885585fea7bSBram Moolenaar
886e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
887d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
888e8c4abbbSBram Moolenaarenddef
889e8c4abbbSBram Moolenaar
8907c5b3c03SBram Moolenaardef Try_catch_skipped()
8917c5b3c03SBram Moolenaar  var l = []
8927c5b3c03SBram Moolenaar  try
8937c5b3c03SBram Moolenaar  finally
8947c5b3c03SBram Moolenaar  endtry
8957c5b3c03SBram Moolenaar
8967c5b3c03SBram Moolenaar  if 1
8977c5b3c03SBram Moolenaar  else
8987c5b3c03SBram Moolenaar    try
8997c5b3c03SBram Moolenaar    endtry
9007c5b3c03SBram Moolenaar  endif
9017c5b3c03SBram Moolenaarenddef
9027c5b3c03SBram Moolenaar
9037c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
9047c5b3c03SBram Moolenaardef Test_try_catch_skipped()
9057c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
9067c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
9077c5b3c03SBram Moolenaarenddef
9087c5b3c03SBram Moolenaar
9097c5b3c03SBram Moolenaar
9107c5b3c03SBram Moolenaar
911006ad48bSBram Moolenaardef Test_throw_vimscript()
912f5be8cdbSBram Moolenaar  # only checks line continuation
913cfcd011fSBram Moolenaar  var lines =<< trim END
914006ad48bSBram Moolenaar      vim9script
915006ad48bSBram Moolenaar      try
916006ad48bSBram Moolenaar        throw 'one'
917006ad48bSBram Moolenaar              .. 'two'
918006ad48bSBram Moolenaar      catch
919006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
920006ad48bSBram Moolenaar      endtry
921006ad48bSBram Moolenaar  END
922006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
9231e021e63SBram Moolenaar
9241e021e63SBram Moolenaar  lines =<< trim END
9251e021e63SBram Moolenaar    vim9script
926352134bbSBram Moolenaar    @r = ''
9271e021e63SBram Moolenaar    def Func()
9281e021e63SBram Moolenaar      throw @r
9291e021e63SBram Moolenaar    enddef
9301e021e63SBram Moolenaar    var result = ''
9311e021e63SBram Moolenaar    try
9321e021e63SBram Moolenaar      Func()
9331e021e63SBram Moolenaar    catch /E1129:/
9341e021e63SBram Moolenaar      result = 'caught'
9351e021e63SBram Moolenaar    endtry
9361e021e63SBram Moolenaar    assert_equal('caught', result)
9371e021e63SBram Moolenaar  END
9381e021e63SBram Moolenaar  CheckScriptSuccess(lines)
939006ad48bSBram Moolenaarenddef
940006ad48bSBram Moolenaar
941ed677f55SBram Moolenaardef Test_error_in_nested_function()
94203dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
943cfcd011fSBram Moolenaar  var lines =<< trim END
944ed677f55SBram Moolenaar      vim9script
945ed677f55SBram Moolenaar      def Func()
946ed677f55SBram Moolenaar        Error()
947ed677f55SBram Moolenaar        g:test_var = 1
948ed677f55SBram Moolenaar      enddef
949ed677f55SBram Moolenaar      func Error() abort
950ed677f55SBram Moolenaar        eval [][0]
951ed677f55SBram Moolenaar      endfunc
952ed677f55SBram Moolenaar      Func()
953ed677f55SBram Moolenaar  END
954ed677f55SBram Moolenaar  g:test_var = 0
955ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
956ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
957ed677f55SBram Moolenaarenddef
958ed677f55SBram Moolenaar
959227c58a4SBram Moolenaardef Test_abort_after_error()
960227c58a4SBram Moolenaar  var lines =<< trim END
961227c58a4SBram Moolenaar      vim9script
962227c58a4SBram Moolenaar      while true
963227c58a4SBram Moolenaar        echo notfound
964227c58a4SBram Moolenaar      endwhile
965227c58a4SBram Moolenaar      g:gotthere = true
966227c58a4SBram Moolenaar  END
967227c58a4SBram Moolenaar  g:gotthere = false
968227c58a4SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
969227c58a4SBram Moolenaar  assert_false(g:gotthere)
970227c58a4SBram Moolenaar  unlet g:gotthere
971227c58a4SBram Moolenaarenddef
972227c58a4SBram Moolenaar
97337c83711SBram Moolenaardef Test_cexpr_vimscript()
974f5be8cdbSBram Moolenaar  # only checks line continuation
97537c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
976cfcd011fSBram Moolenaar  var lines =<< trim END
97737c83711SBram Moolenaar      vim9script
97837c83711SBram Moolenaar      cexpr 'File'
97937c83711SBram Moolenaar                .. ' someFile' ..
98037c83711SBram Moolenaar                   ' line 19'
98137c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
98237c83711SBram Moolenaar  END
98337c83711SBram Moolenaar  CheckScriptSuccess(lines)
98437c83711SBram Moolenaar  set errorformat&
98537c83711SBram Moolenaarenddef
98637c83711SBram Moolenaar
987c9edd6b5SBram Moolenaardef Test_statusline_syntax()
988c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
989cfcd011fSBram Moolenaar  var lines =<< trim END
990c9edd6b5SBram Moolenaar      vim9script
991c9edd6b5SBram Moolenaar      func g:Status()
992c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
993c9edd6b5SBram Moolenaar      endfunc
994c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
995c9edd6b5SBram Moolenaar      redrawstatus
996c9edd6b5SBram Moolenaar      set laststatus statusline=
997c9edd6b5SBram Moolenaar  END
998c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
999c9edd6b5SBram Moolenaarenddef
1000c9edd6b5SBram Moolenaar
1001b209750bSBram Moolenaardef Test_list_vimscript()
1002b209750bSBram Moolenaar  # checks line continuation and comments
1003cfcd011fSBram Moolenaar  var lines =<< trim END
1004b209750bSBram Moolenaar      vim9script
1005cfcd011fSBram Moolenaar      var mylist = [
1006b209750bSBram Moolenaar            'one',
1007b209750bSBram Moolenaar            # comment
1008b209750bSBram Moolenaar            'two', # empty line follows
1009b209750bSBram Moolenaar
1010b209750bSBram Moolenaar            'three',
1011b209750bSBram Moolenaar            ]
1012b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1013b209750bSBram Moolenaar  END
1014b209750bSBram Moolenaar  CheckScriptSuccess(lines)
101566250c93SBram Moolenaar
101666250c93SBram Moolenaar  # check all lines from heredoc are kept
101766250c93SBram Moolenaar  lines =<< trim END
101866250c93SBram Moolenaar      # comment 1
101966250c93SBram Moolenaar      two
102066250c93SBram Moolenaar      # comment 3
102166250c93SBram Moolenaar
102266250c93SBram Moolenaar      five
102366250c93SBram Moolenaar      # comment 6
102466250c93SBram Moolenaar  END
102566250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
10264bce26bbSBram Moolenaar
10274bce26bbSBram Moolenaar  lines =<< trim END
10284bce26bbSBram Moolenaar    [{
10294bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
10304bce26bbSBram Moolenaar  END
10314bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1032b209750bSBram Moolenaarenddef
1033b209750bSBram Moolenaar
10342a1381c3SBram Moolenaarif has('channel')
103540ee466cSBram Moolenaar  let someJob = test_null_job()
103640ee466cSBram Moolenaar
103740ee466cSBram Moolenaar  def FuncWithError()
103840ee466cSBram Moolenaar    echomsg g:someJob
103940ee466cSBram Moolenaar  enddef
104040ee466cSBram Moolenaar
104140ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
104240ee466cSBram Moolenaar    try
104340ee466cSBram Moolenaar      call FuncWithError()
104440ee466cSBram Moolenaar    catch
104540ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
104640ee466cSBram Moolenaar    endtry
104740ee466cSBram Moolenaar  endfunc
10482a1381c3SBram Moolenaarendif
104940ee466cSBram Moolenaar
10508a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
10518a7d6542SBram Moolenaar  vim9script
1052cfcd011fSBram Moolenaar  var name: string = 'bob'
10538a7d6542SBram Moolenaar  def Concat(arg: string): string
10548a7d6542SBram Moolenaar    return name .. arg
10558a7d6542SBram Moolenaar  enddef
1056227a69deSBram Moolenaar  g:result = Concat('bie')
1057227a69deSBram Moolenaar  g:localname = name
10588a7d6542SBram Moolenaar
10598a7d6542SBram Moolenaar  export const CONST = 1234
1060cfcd011fSBram Moolenaar  export var exported = 9876
1061cfcd011fSBram Moolenaar  export var exp_name = 'John'
10628a7d6542SBram Moolenaar  export def Exported(): string
10638a7d6542SBram Moolenaar    return 'Exported'
10648a7d6542SBram Moolenaar  enddef
10650f2a5cc6SBram Moolenaar  export final theList = [1]
10668a7d6542SBram MoolenaarEND
10678a7d6542SBram Moolenaar
1068b3ca9824SBram Moolenaardef Undo_export_script_lines()
1069b3ca9824SBram Moolenaar  unlet g:result
1070b3ca9824SBram Moolenaar  unlet g:localname
1071b3ca9824SBram Moolenaarenddef
1072b3ca9824SBram Moolenaar
10735269bd2aSBram Moolenaardef Test_vim9_import_export()
1074cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
10758a7d6542SBram Moolenaar    vim9script
10768a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
10778a7d6542SBram Moolenaar    g:imported = exported
10786e587dcbSBram Moolenaar    exported += 3
10796e587dcbSBram Moolenaar    g:imported_added = exported
10808a7d6542SBram Moolenaar    g:imported_func = Exported()
10816e587dcbSBram Moolenaar
108240f4f7a4SBram Moolenaar    def GetExported(): string
1083e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
108440f4f7a4SBram Moolenaar      return local_dict.ref()
108540f4f7a4SBram Moolenaar    enddef
108640f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
108740f4f7a4SBram Moolenaar
1088*4db572eeSBram Moolenaar    var dir = './'
1089*4db572eeSBram Moolenaar    var ext = ".vim"
1090*4db572eeSBram Moolenaar    import {exp_name} from dir .. 'Xexport' .. ext
10916e587dcbSBram Moolenaar    g:imported_name = exp_name
10926e587dcbSBram Moolenaar    exp_name ..= ' Doe'
10936e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
10945381c7a1SBram Moolenaar    g:imported_later = exported
10950f2a5cc6SBram Moolenaar
10960f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
10970f2a5cc6SBram Moolenaar    theList->add(2)
10980f2a5cc6SBram Moolenaar    assert_equal([1, 2], theList)
10998a7d6542SBram Moolenaar  END
11008a7d6542SBram Moolenaar
11018a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
11028a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
11038a7d6542SBram Moolenaar
11048a7d6542SBram Moolenaar  source Ximport.vim
11058a7d6542SBram Moolenaar
11068a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
11078a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
11088a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
11096e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
11105381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
11118a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
111240f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
11136e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
11146e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
11158a7d6542SBram Moolenaar  assert_false(exists('g:name'))
11168a7d6542SBram Moolenaar
1117b3ca9824SBram Moolenaar  Undo_export_script_lines()
11188a7d6542SBram Moolenaar  unlet g:imported
11196e587dcbSBram Moolenaar  unlet g:imported_added
11205381c7a1SBram Moolenaar  unlet g:imported_later
11218a7d6542SBram Moolenaar  unlet g:imported_func
11226e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
11238a7d6542SBram Moolenaar  delete('Ximport.vim')
1124f2d5c240SBram Moolenaar
11251c991144SBram Moolenaar  # similar, with line breaks
1126cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
11271c991144SBram Moolenaar    vim9script
11281c991144SBram Moolenaar    import {
11291c991144SBram Moolenaar        exported,
11301c991144SBram Moolenaar        Exported,
11311c991144SBram Moolenaar        }
11321c991144SBram Moolenaar        from
11331c991144SBram Moolenaar        './Xexport.vim'
11341c991144SBram Moolenaar    g:imported = exported
11351c991144SBram Moolenaar    exported += 5
11361c991144SBram Moolenaar    g:imported_added = exported
11371c991144SBram Moolenaar    g:imported_func = Exported()
11381c991144SBram Moolenaar  END
11391c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
11401c991144SBram Moolenaar  source Ximport_lbr.vim
11411c991144SBram Moolenaar
11421c991144SBram Moolenaar  assert_equal(9876, g:imported)
11431c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
11441c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
11451c991144SBram Moolenaar
11461c991144SBram Moolenaar  # exported script not sourced again
11471c991144SBram Moolenaar  assert_false(exists('g:result'))
11481c991144SBram Moolenaar  unlet g:imported
11491c991144SBram Moolenaar  unlet g:imported_added
11501c991144SBram Moolenaar  unlet g:imported_func
11511c991144SBram Moolenaar  delete('Ximport_lbr.vim')
11521c991144SBram Moolenaar
1153cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1154f2d5c240SBram Moolenaar    vim9script
1155f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1156f2d5c240SBram Moolenaar    def UseExport()
1157cb4e80faSBram Moolenaar      g:imported_def = Export.exported
1158f2d5c240SBram Moolenaar    enddef
1159cb4e80faSBram Moolenaar    g:imported_script = Export.exported
1160cb4e80faSBram Moolenaar    assert_equal(1, exists('Export.exported'))
1161cb4e80faSBram Moolenaar    assert_equal(0, exists('Export.notexported'))
1162f2d5c240SBram Moolenaar    UseExport()
1163f2d5c240SBram Moolenaar  END
1164f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1165f2d5c240SBram Moolenaar  source Ximport.vim
1166*4db572eeSBram Moolenaar  # FIXME: this should be 9881
1167*4db572eeSBram Moolenaar  assert_equal(9876, g:imported_def)
1168*4db572eeSBram Moolenaar  assert_equal(9876, g:imported_script)
1169f2d5c240SBram Moolenaar
1170cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1171599c89c8SBram Moolenaar    vim9script
1172599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1173599c89c8SBram Moolenaar    def Func()
1174cfcd011fSBram Moolenaar      var dummy = 1
1175cfcd011fSBram Moolenaar      var imported = Export + dummy
1176599c89c8SBram Moolenaar    enddef
1177822ba247SBram Moolenaar    defcompile
1178599c89c8SBram Moolenaar  END
1179599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
118044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1181599c89c8SBram Moolenaar
1182cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1183599c89c8SBram Moolenaar    vim9script
1184599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1185599c89c8SBram Moolenaar    def Func()
1186cfcd011fSBram Moolenaar      var imported = Export . exported
1187599c89c8SBram Moolenaar    enddef
1188822ba247SBram Moolenaar    defcompile
1189599c89c8SBram Moolenaar  END
1190599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
119144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1192599c89c8SBram Moolenaar
1193a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1194a6294955SBram Moolenaar    vim9script
1195a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1196a6294955SBram Moolenaar    var some = 'other'
1197a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1198a6294955SBram Moolenaar    defcompile
1199a6294955SBram Moolenaar  END
1200a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1201a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1202a6294955SBram Moolenaar
1203cb4e80faSBram Moolenaar  var import_star_as_lines_script_no_dot =<< trim END
1204cb4e80faSBram Moolenaar    vim9script
1205cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1206cb4e80faSBram Moolenaar    g:imported_script = Export exported
1207cb4e80faSBram Moolenaar  END
1208cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
1209cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1029:')
1210cb4e80faSBram Moolenaar
1211cb4e80faSBram Moolenaar  var import_star_as_lines_script_space_after_dot =<< trim END
1212cb4e80faSBram Moolenaar    vim9script
1213cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1214cb4e80faSBram Moolenaar    g:imported_script = Export. exported
1215cb4e80faSBram Moolenaar  END
1216cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1217cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1218cb4e80faSBram Moolenaar
1219cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1220599c89c8SBram Moolenaar    vim9script
1221599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1222599c89c8SBram Moolenaar    def Func()
1223cfcd011fSBram Moolenaar      var imported = Export.
1224599c89c8SBram Moolenaar    enddef
1225822ba247SBram Moolenaar    defcompile
1226599c89c8SBram Moolenaar  END
1227599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
122844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1229599c89c8SBram Moolenaar
1230cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
12311c991144SBram Moolenaar    vim9script
12321c991144SBram Moolenaar    import *
12331c991144SBram Moolenaar        as Export
12341c991144SBram Moolenaar        from
12351c991144SBram Moolenaar        './Xexport.vim'
12361c991144SBram Moolenaar    def UseExport()
12371c991144SBram Moolenaar      g:imported = Export.exported
12381c991144SBram Moolenaar    enddef
12391c991144SBram Moolenaar    UseExport()
12401c991144SBram Moolenaar  END
12411c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
12421c991144SBram Moolenaar  source Ximport.vim
1243*4db572eeSBram Moolenaar  assert_equal(9876, g:imported)
12441c991144SBram Moolenaar
1245cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1246f2d5c240SBram Moolenaar    vim9script
1247f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1248f2d5c240SBram Moolenaar  END
1249f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
125044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1251f2d5c240SBram Moolenaar
1252f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1253cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1254fa29c8abSBram Moolenaar    vim9script
1255fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1256fa29c8abSBram Moolenaar  END
1257fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
125844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1259fa29c8abSBram Moolenaar
1260f5be8cdbSBram Moolenaar  # try to import something that is already defined
1261cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
12625269bd2aSBram Moolenaar    vim9script
1263cfcd011fSBram Moolenaar    var exported = 'something'
12645269bd2aSBram Moolenaar    import exported from './Xexport.vim'
12655269bd2aSBram Moolenaar  END
12665269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1267057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
12685269bd2aSBram Moolenaar
1269f5be8cdbSBram Moolenaar  # try to import something that is already defined
12705269bd2aSBram Moolenaar  import_already_defined =<< trim END
12715269bd2aSBram Moolenaar    vim9script
1272cfcd011fSBram Moolenaar    var exported = 'something'
12735269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
12745269bd2aSBram Moolenaar  END
12755269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1276057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
12775269bd2aSBram Moolenaar
1278f5be8cdbSBram Moolenaar  # try to import something that is already defined
12795269bd2aSBram Moolenaar  import_already_defined =<< trim END
12805269bd2aSBram Moolenaar    vim9script
1281cfcd011fSBram Moolenaar    var exported = 'something'
12825269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
12835269bd2aSBram Moolenaar  END
12845269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1285057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
12865269bd2aSBram Moolenaar
1287918a4249SBram Moolenaar  # try changing an imported const
1288918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1289918a4249SBram Moolenaar    vim9script
1290918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1291918a4249SBram Moolenaar    def Assign()
1292918a4249SBram Moolenaar      CONST = 987
1293918a4249SBram Moolenaar    enddef
1294918a4249SBram Moolenaar    defcompile
1295918a4249SBram Moolenaar  END
1296918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1297918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1298918a4249SBram Moolenaar
12990f2a5cc6SBram Moolenaar  # try changing an imported final
13000f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
13010f2a5cc6SBram Moolenaar    vim9script
13020f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
13030f2a5cc6SBram Moolenaar    def Assign()
13040f2a5cc6SBram Moolenaar      theList = [2]
13050f2a5cc6SBram Moolenaar    enddef
13060f2a5cc6SBram Moolenaar    defcompile
13070f2a5cc6SBram Moolenaar  END
13080f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
13090f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
13100f2a5cc6SBram Moolenaar
1311f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1312cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1313fa29c8abSBram Moolenaar    vim9script
1314fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1315fa29c8abSBram Moolenaar  END
1316fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
131744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1318fa29c8abSBram Moolenaar
1319cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1320fa29c8abSBram Moolenaar    vim9script
1321fa29c8abSBram Moolenaar    import name './Xexport.vim'
1322fa29c8abSBram Moolenaar  END
1323fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
132444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1325fa29c8abSBram Moolenaar
1326cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1327fa29c8abSBram Moolenaar    vim9script
1328fa29c8abSBram Moolenaar    import name from Xexport.vim
1329fa29c8abSBram Moolenaar  END
1330fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1331*4db572eeSBram Moolenaar  assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim')
1332fa29c8abSBram Moolenaar
1333cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1334fa29c8abSBram Moolenaar    vim9script
1335fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1336fa29c8abSBram Moolenaar  END
1337fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
133844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1339fa29c8abSBram Moolenaar
1340cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1341fa29c8abSBram Moolenaar    vim9script
1342fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1343fa29c8abSBram Moolenaar  END
13445269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
134544d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1346fa29c8abSBram Moolenaar
1347f2d5c240SBram Moolenaar  delete('Ximport.vim')
13485269bd2aSBram Moolenaar  delete('Ximport3.vim')
13498a7d6542SBram Moolenaar  delete('Xexport.vim')
13508a7d6542SBram Moolenaar
1351f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
13523e191694SBram Moolenaar  # Flags added or removed are also applied to the restored value.
13533e191694SBram Moolenaar  set cpo=abcd
1354cfcd011fSBram Moolenaar  var lines =<< trim END
1355750802b5SBram Moolenaar    vim9script
1356750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
13573e191694SBram Moolenaar    set cpo+=f
13583e191694SBram Moolenaar    set cpo-=c
13593e191694SBram Moolenaar    g:cpo_after_vim9script = &cpo
1360750802b5SBram Moolenaar  END
1361750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1362750802b5SBram Moolenaar  source Xvim9_script
13633e191694SBram Moolenaar  assert_equal('fabd', &cpo)
1364750802b5SBram Moolenaar  set cpo&vim
1365750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
13663e191694SBram Moolenaar  var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
13673e191694SBram Moolenaar  assert_equal(newcpo, g:cpo_after_vim9script)
13683e191694SBram Moolenaar
1369750802b5SBram Moolenaar  delete('Xvim9_script')
1370750802b5SBram Moolenaarenddef
1371750802b5SBram Moolenaar
13720a84284eSBram Moolenaardef Test_import_as()
13730a84284eSBram Moolenaar  var export_lines =<< trim END
13740a84284eSBram Moolenaar    vim9script
13750a84284eSBram Moolenaar    export var one = 1
13760a84284eSBram Moolenaar    export var yes = 'yes'
1377c967d57aSBram Moolenaar    export var slist: list<string>
13780a84284eSBram Moolenaar  END
13790a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
13800a84284eSBram Moolenaar
13810a84284eSBram Moolenaar  var import_lines =<< trim END
13820a84284eSBram Moolenaar    vim9script
13836c7cc347SBram Moolenaar    var one = 'notused'
13846c7cc347SBram Moolenaar    var yes = 777
13850a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
13860a84284eSBram Moolenaar    assert_equal(1, thatOne)
13870a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
13880a84284eSBram Moolenaar    assert_equal('yes', yesYes)
13890a84284eSBram Moolenaar  END
13900a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
13910a84284eSBram Moolenaar
13920a84284eSBram Moolenaar  import_lines =<< trim END
13930a84284eSBram Moolenaar    vim9script
13940a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
13950a84284eSBram Moolenaar    assert_equal(1, thatOne)
13960a84284eSBram Moolenaar    assert_equal('yes', yesYes)
13970a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
13980a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
13990a84284eSBram Moolenaar  END
14000a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
14010a84284eSBram Moolenaar
1402c967d57aSBram Moolenaar  import_lines =<< trim END
1403c967d57aSBram Moolenaar    vim9script
1404c967d57aSBram Moolenaar    import {slist as impSlist} from './XexportAs'
1405c967d57aSBram Moolenaar    impSlist->add(123)
1406c967d57aSBram Moolenaar  END
1407c967d57aSBram Moolenaar  CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number')
1408c967d57aSBram Moolenaar
14090a84284eSBram Moolenaar  delete('XexportAs')
14100a84284eSBram Moolenaarenddef
14110a84284eSBram Moolenaar
1412803af686SBram Moolenaarfunc g:Trigger()
1413803af686SBram Moolenaar  source Ximport.vim
1414803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1415803af686SBram Moolenaarendfunc
1416803af686SBram Moolenaar
1417803af686SBram Moolenaardef Test_import_export_expr_map()
1418803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1419cfcd011fSBram Moolenaar  var export_lines =<< trim END
1420803af686SBram Moolenaar    vim9script
1421803af686SBram Moolenaar    export def That(): string
1422803af686SBram Moolenaar      return 'yes'
1423803af686SBram Moolenaar    enddef
1424803af686SBram Moolenaar  END
1425803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1426803af686SBram Moolenaar
1427cfcd011fSBram Moolenaar  var import_lines =<< trim END
1428803af686SBram Moolenaar    vim9script
1429803af686SBram Moolenaar    import That from './Xexport_that.vim'
1430803af686SBram Moolenaar    assert_equal('yes', That())
1431803af686SBram Moolenaar  END
1432803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1433803af686SBram Moolenaar
1434803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1435803af686SBram Moolenaar  feedkeys('trigger', "xt")
1436803af686SBram Moolenaar
1437730b2483SBram Moolenaar  delete('Xexport_that.vim')
1438803af686SBram Moolenaar  delete('Ximport.vim')
1439803af686SBram Moolenaar  nunmap trigger
1440803af686SBram Moolenaarenddef
1441803af686SBram Moolenaar
14428e1986e3SBram Moolenaardef Test_import_in_filetype()
14438e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
14448e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1445cfcd011fSBram Moolenaar  var export_lines =<< trim END
14468e1986e3SBram Moolenaar    vim9script
1447cfcd011fSBram Moolenaar    export var That = 'yes'
14488e1986e3SBram Moolenaar  END
1449730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
14508e1986e3SBram Moolenaar
1451cfcd011fSBram Moolenaar  var import_lines =<< trim END
14528e1986e3SBram Moolenaar    vim9script
1453730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
14548e1986e3SBram Moolenaar    assert_equal('yes', That)
14558e1986e3SBram Moolenaar    g:did_load_mytpe = 1
14568e1986e3SBram Moolenaar  END
14578e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
14588e1986e3SBram Moolenaar
1459cfcd011fSBram Moolenaar  var save_rtp = &rtp
14608e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
14618e1986e3SBram Moolenaar
14628e1986e3SBram Moolenaar  filetype plugin on
14638e1986e3SBram Moolenaar  copen
14648e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
14658e1986e3SBram Moolenaar
14668e1986e3SBram Moolenaar  quit!
1467730b2483SBram Moolenaar  delete('Xexport_ft.vim')
14688e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
14698e1986e3SBram Moolenaar  &rtp = save_rtp
14708e1986e3SBram Moolenaarenddef
14718e1986e3SBram Moolenaar
1472efa94447SBram Moolenaardef Test_use_import_in_mapping()
1473cfcd011fSBram Moolenaar  var lines =<< trim END
1474efa94447SBram Moolenaar      vim9script
1475efa94447SBram Moolenaar      export def Funcx()
1476efa94447SBram Moolenaar        g:result = 42
1477efa94447SBram Moolenaar      enddef
1478efa94447SBram Moolenaar  END
1479efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1480efa94447SBram Moolenaar  lines =<< trim END
1481efa94447SBram Moolenaar      vim9script
1482efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1483b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1484efa94447SBram Moolenaar  END
1485efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1486efa94447SBram Moolenaar
1487efa94447SBram Moolenaar  source Xmapscript.vim
1488b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1489efa94447SBram Moolenaar  assert_equal(42, g:result)
1490efa94447SBram Moolenaar
1491efa94447SBram Moolenaar  unlet g:result
1492efa94447SBram Moolenaar  delete('XsomeExport.vim')
1493efa94447SBram Moolenaar  delete('Xmapscript.vim')
1494b3ca9824SBram Moolenaar  nunmap <F3>
1495efa94447SBram Moolenaarenddef
1496efa94447SBram Moolenaar
1497d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1498d3f8a9eeSBram Moolenaar  var lines =<< trim END
1499d3f8a9eeSBram Moolenaar    if has(g:feature)
1500d3f8a9eeSBram Moolenaar      " legacy script
1501d3f8a9eeSBram Moolenaar      let g:legacy = 1
1502d3f8a9eeSBram Moolenaar      finish
1503d3f8a9eeSBram Moolenaar    endif
1504d3f8a9eeSBram Moolenaar    vim9script
1505d3f8a9eeSBram Moolenaar    g:legacy = 0
1506d3f8a9eeSBram Moolenaar  END
1507d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1508d3f8a9eeSBram Moolenaar  g:legacy = -1
1509d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1510d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1511d3f8a9eeSBram Moolenaar
1512d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1513d3f8a9eeSBram Moolenaar  g:legacy = -1
1514d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1515d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1516d3f8a9eeSBram Moolenaarenddef
1517d3f8a9eeSBram Moolenaar
1518750802b5SBram Moolenaardef Test_vim9script_fails()
15198a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
15208a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1521cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
15229721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1523cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1524750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1525750802b5SBram Moolenaar
1526cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1527c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1528c785b9a7SBram Moolenaar
1529e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1530e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
15318a7d6542SBram Moolenaarenddef
15328a7d6542SBram Moolenaar
1533f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1534101f4810SBram Moolenaar  CheckRunVimInTerminal
1535101f4810SBram Moolenaar
15369bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1537c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
15389bb3eb3eSBram Moolenaarendfunc
15399bb3eb3eSBram Moolenaar
1540c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1541cfcd011fSBram Moolenaar  var export =<< trim END
1542101f4810SBram Moolenaar    vim9script
1543101f4810SBram Moolenaar    export def Foo(): number
1544101f4810SBram Moolenaar        return 0
1545101f4810SBram Moolenaar    enddef
1546101f4810SBram Moolenaar  END
1547730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1548101f4810SBram Moolenaar
1549e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
15509bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
15512949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1552101f4810SBram Moolenaar
1553730b2483SBram Moolenaar  delete('XexportCmd.vim')
15549bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
15559bb3eb3eSBram Moolenaarenddef
1556101f4810SBram Moolenaar
15572b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
15582b32700dSBram Moolenaar  var lines =<< trim END
1559a6294955SBram Moolenaar    vim9script
1560a6294955SBram Moolenaar    export var exported = 'thexport'
1561a6294955SBram Moolenaar  END
1562a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1563a6294955SBram Moolenaar  lines =<< trim END
15642b32700dSBram Moolenaar    vim9script noclear
15652b32700dSBram Moolenaar    g:loadCount += 1
15662b32700dSBram Moolenaar    var s:reloaded = 'init'
1567a6294955SBram Moolenaar    import exported from './XExportReload'
15682b32700dSBram Moolenaar
15692b32700dSBram Moolenaar    def Again(): string
15702b32700dSBram Moolenaar      return 'again'
15712b32700dSBram Moolenaar    enddef
15722b32700dSBram Moolenaar
15732b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
15742b32700dSBram Moolenaar    var s:loaded = true
15752b32700dSBram Moolenaar
15762b32700dSBram Moolenaar    var s:notReloaded = 'yes'
15772b32700dSBram Moolenaar    s:reloaded = 'first'
15782b32700dSBram Moolenaar    def g:Values(): list<string>
1579a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
15802b32700dSBram Moolenaar    enddef
15812b32700dSBram Moolenaar
15822b32700dSBram Moolenaar    def Once(): string
15832b32700dSBram Moolenaar      return 'once'
15842b32700dSBram Moolenaar    enddef
15852b32700dSBram Moolenaar  END
15862b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
15872b32700dSBram Moolenaar  g:loadCount = 0
15882b32700dSBram Moolenaar  source XReloaded
15892b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1590a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
15912b32700dSBram Moolenaar  source XReloaded
15922b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1593a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
15942b32700dSBram Moolenaar  source XReloaded
15952b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1596a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
15972b32700dSBram Moolenaar
159848e11c10SBram Moolenaar  delete('XReloaded')
1599a6294955SBram Moolenaar  delete('XExportReload')
16002b32700dSBram Moolenaar  delfunc g:Values
16012b32700dSBram Moolenaar  unlet g:loadCount
1602577dc93dSBram Moolenaar
1603577dc93dSBram Moolenaar  lines =<< trim END
1604577dc93dSBram Moolenaar      vim9script
1605577dc93dSBram Moolenaar      def Inner()
1606577dc93dSBram Moolenaar      enddef
1607577dc93dSBram Moolenaar  END
1608577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1609577dc93dSBram Moolenaar  source XreloadScript.vim
1610577dc93dSBram Moolenaar
1611577dc93dSBram Moolenaar  lines =<< trim END
1612577dc93dSBram Moolenaar      vim9script
1613577dc93dSBram Moolenaar      def Outer()
1614577dc93dSBram Moolenaar        def Inner()
1615577dc93dSBram Moolenaar        enddef
1616577dc93dSBram Moolenaar      enddef
1617577dc93dSBram Moolenaar      defcompile
1618577dc93dSBram Moolenaar  END
1619577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1620577dc93dSBram Moolenaar  source XreloadScript.vim
1621577dc93dSBram Moolenaar
1622577dc93dSBram Moolenaar  delete('XreloadScript.vim')
16232b32700dSBram Moolenaarenddef
16242b32700dSBram Moolenaar
16254c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1626cfcd011fSBram Moolenaar  var lines =<< trim END
16278a7d6542SBram Moolenaar    vim9script
16288a7d6542SBram Moolenaar    const var = ''
1629cfcd011fSBram Moolenaar    var valone = 1234
16308a7d6542SBram Moolenaar    def MyFunc(arg: string)
16318a7d6542SBram Moolenaar       valone = 5678
16328a7d6542SBram Moolenaar    enddef
16338a7d6542SBram Moolenaar  END
1634cfcd011fSBram Moolenaar  var morelines =<< trim END
1635cfcd011fSBram Moolenaar    var valtwo = 222
16368a7d6542SBram Moolenaar    export def GetValtwo(): number
16378a7d6542SBram Moolenaar      return valtwo
16388a7d6542SBram Moolenaar    enddef
16398a7d6542SBram Moolenaar  END
164003afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
16418a7d6542SBram Moolenaar  source Xreload.vim
16428a7d6542SBram Moolenaar  source Xreload.vim
16438a7d6542SBram Moolenaar  source Xreload.vim
16448a7d6542SBram Moolenaar
1645f5be8cdbSBram Moolenaar  # cannot declare a var twice
16468a7d6542SBram Moolenaar  lines =<< trim END
16478a7d6542SBram Moolenaar    vim9script
1648cfcd011fSBram Moolenaar    var valone = 1234
1649cfcd011fSBram Moolenaar    var valone = 5678
16508a7d6542SBram Moolenaar  END
16518a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
165244d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
16538a7d6542SBram Moolenaar
16548a7d6542SBram Moolenaar  delete('Xreload.vim')
16558a7d6542SBram Moolenaar  delete('Ximport.vim')
16568a7d6542SBram Moolenaarenddef
16578a7d6542SBram Moolenaar
165807a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
165907a65d26SBram Moolenaar" compiled function using that variable must fail.
166007a65d26SBram Moolenaardef Test_script_reload_change_type()
166107a65d26SBram Moolenaar  var lines =<< trim END
166207a65d26SBram Moolenaar    vim9script noclear
166307a65d26SBram Moolenaar    var str = 'string'
166407a65d26SBram Moolenaar    def g:GetStr(): string
166507a65d26SBram Moolenaar      return str .. 'xxx'
166607a65d26SBram Moolenaar    enddef
166707a65d26SBram Moolenaar  END
166807a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
166907a65d26SBram Moolenaar  source Xreload.vim
167007a65d26SBram Moolenaar  echo g:GetStr()
167107a65d26SBram Moolenaar
167207a65d26SBram Moolenaar  lines =<< trim END
167307a65d26SBram Moolenaar    vim9script noclear
167407a65d26SBram Moolenaar    var str = 1234
167507a65d26SBram Moolenaar  END
167607a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
167707a65d26SBram Moolenaar  source Xreload.vim
167807a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
167907a65d26SBram Moolenaar
168007a65d26SBram Moolenaar  delfunc g:GetStr
168107a65d26SBram Moolenaar  delete('Xreload.vim')
168207a65d26SBram Moolenaarenddef
168307a65d26SBram Moolenaar
1684c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled
1685c970e422SBram Moolenaarcommand CallFunc echo 'nop'
1686c970e422SBram Moolenaar
1687c970e422SBram Moolenaardef Test_script_reload_from_function()
1688c970e422SBram Moolenaar  var lines =<< trim END
1689c970e422SBram Moolenaar      vim9script
1690c970e422SBram Moolenaar
1691c970e422SBram Moolenaar      if exists('g:loaded')
1692c970e422SBram Moolenaar        finish
1693c970e422SBram Moolenaar      endif
1694c970e422SBram Moolenaar      g:loaded = 1
1695c970e422SBram Moolenaar      delcommand CallFunc
1696c970e422SBram Moolenaar      command CallFunc Func()
1697c970e422SBram Moolenaar      def Func()
1698a4c81beaSBram Moolenaar        so XreloadFunc.vim
1699c970e422SBram Moolenaar        g:didTheFunc = 1
1700c970e422SBram Moolenaar      enddef
1701c970e422SBram Moolenaar  END
1702c970e422SBram Moolenaar  writefile(lines, 'XreloadFunc.vim')
1703c970e422SBram Moolenaar  source XreloadFunc.vim
1704c970e422SBram Moolenaar  CallFunc
1705c970e422SBram Moolenaar  assert_equal(1, g:didTheFunc)
1706c970e422SBram Moolenaar
1707c970e422SBram Moolenaar  delete('XreloadFunc.vim')
1708c970e422SBram Moolenaar  delcommand CallFunc
1709c970e422SBram Moolenaar  unlet g:loaded
1710c970e422SBram Moolenaar  unlet g:didTheFunc
1711c970e422SBram Moolenaarenddef
1712c970e422SBram Moolenaar
17136c3843caSBram Moolenaardef Test_script_var_shadows_function()
17146c3843caSBram Moolenaar  var lines =<< trim END
17156c3843caSBram Moolenaar      vim9script
17166c3843caSBram Moolenaar      def Func(): number
17176c3843caSBram Moolenaar        return 123
17186c3843caSBram Moolenaar      enddef
17196c3843caSBram Moolenaar      var Func = 1
17206c3843caSBram Moolenaar  END
17216c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
17226c3843caSBram Moolenaarenddef
17236c3843caSBram Moolenaar
1724c323527dSBram Moolenaardef Test_script_var_shadows_command()
1725c323527dSBram Moolenaar  var lines =<< trim END
1726c323527dSBram Moolenaar      var undo = 1
1727c323527dSBram Moolenaar      undo = 2
1728c323527dSBram Moolenaar      assert_equal(2, undo)
1729c323527dSBram Moolenaar  END
1730c323527dSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1731c323527dSBram Moolenaar
1732c323527dSBram Moolenaar  lines =<< trim END
1733c323527dSBram Moolenaar      var undo = 1
1734c323527dSBram Moolenaar      undo
1735c323527dSBram Moolenaar  END
1736c323527dSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1207:', 2)
1737c323527dSBram Moolenaarenddef
1738c323527dSBram Moolenaar
173995006e3dSBram Moolenaardef s:RetSome(): string
174095006e3dSBram Moolenaar  return 'some'
174195006e3dSBram Moolenaarenddef
174295006e3dSBram Moolenaar
1743fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1744fe465a01SBram Moolenaar" script-local name.
1745fe465a01SBram Moolenaardef Test_vim9script_funcref()
1746cfcd011fSBram Moolenaar  var sortlines =<< trim END
1747fe465a01SBram Moolenaar      vim9script
1748fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1749bed36b93SBram Moolenaar        return i2 - i1
1750fe465a01SBram Moolenaar      enddef
1751fe465a01SBram Moolenaar
1752fe465a01SBram Moolenaar      export def FastSort(): list<number>
1753fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1754fe465a01SBram Moolenaar      enddef
1755529fb5a5SBram Moolenaar
1756529fb5a5SBram Moolenaar      export def GetString(arg: string): string
1757529fb5a5SBram Moolenaar        return arg
1758529fb5a5SBram Moolenaar      enddef
1759fe465a01SBram Moolenaar  END
1760fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1761fe465a01SBram Moolenaar
1762cfcd011fSBram Moolenaar  var lines =<< trim END
1763fe465a01SBram Moolenaar    vim9script
1764fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1765fe465a01SBram Moolenaar    def Test()
1766fe465a01SBram Moolenaar      g:result = FastSort()
1767fe465a01SBram Moolenaar    enddef
1768fe465a01SBram Moolenaar    Test()
1769529fb5a5SBram Moolenaar
1770529fb5a5SBram Moolenaar    # using a function imported with "as"
1771529fb5a5SBram Moolenaar    import * as anAlias from './Xsort.vim'
1772529fb5a5SBram Moolenaar    assert_equal('yes', anAlias.GetString('yes'))
1773529fb5a5SBram Moolenaar
1774529fb5a5SBram Moolenaar    # using the function from a compiled function
1775529fb5a5SBram Moolenaar    def TestMore(): string
1776ca51cc0aSBram Moolenaar      var s = s:anAlias.GetString('foo')
1777ca51cc0aSBram Moolenaar      return s .. anAlias.GetString('bar')
1778529fb5a5SBram Moolenaar    enddef
1779ca51cc0aSBram Moolenaar    assert_equal('foobar', TestMore())
1780529fb5a5SBram Moolenaar
1781529fb5a5SBram Moolenaar    # error when using a function that isn't exported
1782529fb5a5SBram Moolenaar    assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1783fe465a01SBram Moolenaar  END
1784fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1785fe465a01SBram Moolenaar
1786fe465a01SBram Moolenaar  source Xscript.vim
1787fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1788fe465a01SBram Moolenaar
1789fe465a01SBram Moolenaar  unlet g:result
1790fe465a01SBram Moolenaar  delete('Xsort.vim')
1791fe465a01SBram Moolenaar  delete('Xscript.vim')
179295006e3dSBram Moolenaar
1793cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
179495006e3dSBram Moolenaar  assert_equal('some', Funcref())
1795fe465a01SBram Moolenaarenddef
1796fe465a01SBram Moolenaar
1797601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1798601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1799601e76acSBram Moolenaar" function reference.
1800c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1801cfcd011fSBram Moolenaar  var filterLines =<< trim END
1802c620c055SBram Moolenaar    vim9script
1803c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1804c620c055SBram Moolenaar      return idx % 2 == 1
1805c620c055SBram Moolenaar    enddef
1806c620c055SBram Moolenaar    export def FastFilter(): list<number>
1807c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1808c620c055SBram Moolenaar    enddef
1809601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1810601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1811601e76acSBram Moolenaar    enddef
1812c620c055SBram Moolenaar  END
1813c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1814c620c055SBram Moolenaar
1815cfcd011fSBram Moolenaar  var lines =<< trim END
1816c620c055SBram Moolenaar    vim9script
1817601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1818c620c055SBram Moolenaar    def Test()
1819cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1820c620c055SBram Moolenaar    enddef
1821c620c055SBram Moolenaar    Test()
1822601e76acSBram Moolenaar    def TestDirect()
1823cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1824601e76acSBram Moolenaar    enddef
1825601e76acSBram Moolenaar    TestDirect()
1826c620c055SBram Moolenaar  END
1827601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1828c620c055SBram Moolenaar  delete('Xfilter.vim')
1829c620c055SBram Moolenaarenddef
1830c620c055SBram Moolenaar
18314c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1832cfcd011fSBram Moolenaar  var first_lines =<< trim END
18334c17ad94SBram Moolenaar    vim9script
18344c17ad94SBram Moolenaar    def FuncYes(): string
18354c17ad94SBram Moolenaar      return 'yes'
18364c17ad94SBram Moolenaar    enddef
18374c17ad94SBram Moolenaar  END
1838cfcd011fSBram Moolenaar  var withno_lines =<< trim END
18394c17ad94SBram Moolenaar    def FuncNo(): string
18404c17ad94SBram Moolenaar      return 'no'
18414c17ad94SBram Moolenaar    enddef
18424c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
18434c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
18444c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
184503afdcf1SBram Moolenaar    enddef
184603afdcf1SBram Moolenaar  END
1847cfcd011fSBram Moolenaar  var nono_lines =<< trim END
184803afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
184903afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
185044d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
18514c17ad94SBram Moolenaar    enddef
18524c17ad94SBram Moolenaar  END
18534c17ad94SBram Moolenaar
18544c17ad94SBram Moolenaar  # FuncNo() is defined
185503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
18564c17ad94SBram Moolenaar  source Xreloaded.vim
18574c17ad94SBram Moolenaar  g:DoCheck(true)
18584c17ad94SBram Moolenaar
18594c17ad94SBram Moolenaar  # FuncNo() is not redefined
186003afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
18614c17ad94SBram Moolenaar  source Xreloaded.vim
18625082471fSBram Moolenaar  g:DoCheck(false)
18634c17ad94SBram Moolenaar
18644c17ad94SBram Moolenaar  # FuncNo() is back
186503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
18664c17ad94SBram Moolenaar  source Xreloaded.vim
18675082471fSBram Moolenaar  g:DoCheck(false)
18684c17ad94SBram Moolenaar
18694c17ad94SBram Moolenaar  delete('Xreloaded.vim')
18704c17ad94SBram Moolenaarenddef
18714c17ad94SBram Moolenaar
187289483d40SBram Moolenaardef Test_vim9script_reload_delvar()
187389483d40SBram Moolenaar  # write the script with a script-local variable
1874cfcd011fSBram Moolenaar  var lines =<< trim END
187589483d40SBram Moolenaar    vim9script
1876cfcd011fSBram Moolenaar    var name = 'string'
187789483d40SBram Moolenaar  END
187889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
187989483d40SBram Moolenaar  source XreloadVar.vim
188089483d40SBram Moolenaar
188189483d40SBram Moolenaar  # now write the script using the same variable locally - works
188289483d40SBram Moolenaar  lines =<< trim END
188389483d40SBram Moolenaar    vim9script
188489483d40SBram Moolenaar    def Func()
1885cfcd011fSBram Moolenaar      var name = 'string'
188689483d40SBram Moolenaar    enddef
188789483d40SBram Moolenaar  END
188889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
188989483d40SBram Moolenaar  source XreloadVar.vim
189089483d40SBram Moolenaar
189189483d40SBram Moolenaar  delete('XreloadVar.vim')
189289483d40SBram Moolenaarenddef
189389483d40SBram Moolenaar
18948a7d6542SBram Moolenaardef Test_import_absolute()
1895cfcd011fSBram Moolenaar  var import_lines = [
1896e6085c53SBram Moolenaar        'vim9script',
1897e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1898e6085c53SBram Moolenaar        'def UseExported()',
1899e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1900e6085c53SBram Moolenaar        '  exported = 8888',
1901e6085c53SBram Moolenaar        '  g:imported_after = exported',
1902e6085c53SBram Moolenaar        'enddef',
1903e6085c53SBram Moolenaar        'UseExported()',
1904e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1905e6085c53SBram Moolenaar        ]
19068a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
19078a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
19088a7d6542SBram Moolenaar
19098a7d6542SBram Moolenaar  source Ximport_abs.vim
19108a7d6542SBram Moolenaar
19118a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
19124e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1913fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1914fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1915fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1916fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1917fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1918fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1919fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1920fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1921fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1922fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1923e6085c53SBram Moolenaar        g:import_disassembled)
1924b3ca9824SBram Moolenaar
1925b3ca9824SBram Moolenaar  Undo_export_script_lines()
19268a7d6542SBram Moolenaar  unlet g:imported_abs
19274e12a5dfSBram Moolenaar  unlet g:import_disassembled
19288a7d6542SBram Moolenaar
19298a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
19308a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
19318a7d6542SBram Moolenaarenddef
19328a7d6542SBram Moolenaar
19338a7d6542SBram Moolenaardef Test_import_rtp()
1934cfcd011fSBram Moolenaar  var import_lines = [
1935e6085c53SBram Moolenaar        'vim9script',
1936e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1937e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1938e6085c53SBram Moolenaar        ]
19398a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
1940b885a7c7SBram Moolenaar  mkdir('import', 'p')
1941b885a7c7SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
19428a7d6542SBram Moolenaar
1943cfcd011fSBram Moolenaar  var save_rtp = &rtp
19448a7d6542SBram Moolenaar  &rtp = getcwd()
19458a7d6542SBram Moolenaar  source Ximport_rtp.vim
19468a7d6542SBram Moolenaar  &rtp = save_rtp
19478a7d6542SBram Moolenaar
19488a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
19498a7d6542SBram Moolenaar
1950b3ca9824SBram Moolenaar  Undo_export_script_lines()
1951b3ca9824SBram Moolenaar  unlet g:imported_rtp
19528a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
1953b885a7c7SBram Moolenaar  delete('import', 'rf')
19548a7d6542SBram Moolenaarenddef
19558a7d6542SBram Moolenaar
195625e0f586SBram Moolenaardef Test_import_compile_error()
1957cfcd011fSBram Moolenaar  var export_lines = [
195825e0f586SBram Moolenaar        'vim9script',
195925e0f586SBram Moolenaar        'export def ExpFunc(): string',
196025e0f586SBram Moolenaar        '  return notDefined',
196125e0f586SBram Moolenaar        'enddef',
196225e0f586SBram Moolenaar        ]
196325e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
196425e0f586SBram Moolenaar
1965cfcd011fSBram Moolenaar  var import_lines = [
196625e0f586SBram Moolenaar        'vim9script',
196725e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
196825e0f586SBram Moolenaar        'def ImpFunc()',
196925e0f586SBram Moolenaar        '  echo ExpFunc()',
197025e0f586SBram Moolenaar        'enddef',
197125e0f586SBram Moolenaar        'defcompile',
197225e0f586SBram Moolenaar        ]
197325e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
197425e0f586SBram Moolenaar
197525e0f586SBram Moolenaar  try
197625e0f586SBram Moolenaar    source Ximport.vim
197725e0f586SBram Moolenaar  catch /E1001/
1978f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
19797707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
198025e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
198125e0f586SBram Moolenaar  endtry
198225e0f586SBram Moolenaar
198325e0f586SBram Moolenaar  delete('Xexported.vim')
198425e0f586SBram Moolenaar  delete('Ximport.vim')
198525e0f586SBram Moolenaarenddef
198625e0f586SBram Moolenaar
1987c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1988cfcd011fSBram Moolenaar  var lines = [
1989c4ce36d4SBram Moolenaar        'vim9script',
1990c4ce36d4SBram Moolenaar        'def Func()',
1991c4ce36d4SBram Moolenaar        '  eval [][0]',
1992c4ce36d4SBram Moolenaar        'enddef',
1993c4ce36d4SBram Moolenaar        'Func()',
1994c4ce36d4SBram Moolenaar        ]
1995c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1996c4ce36d4SBram Moolenaar
1997c4ce36d4SBram Moolenaar  for count in range(3)
1998c4ce36d4SBram Moolenaar    try
1999c4ce36d4SBram Moolenaar      source Xtestscript.vim
2000c4ce36d4SBram Moolenaar    catch /E684/
2001c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
2002c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
2003c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
2004c4ce36d4SBram Moolenaar    endtry
2005c4ce36d4SBram Moolenaar  endfor
2006c4ce36d4SBram Moolenaar
2007c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
2008c4ce36d4SBram Moolenaarenddef
2009c4ce36d4SBram Moolenaar
2010eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
2011cfcd011fSBram Moolenaar  var export_lines =<< trim END
2012eef2102eSBram Moolenaar      vim9script
2013eef2102eSBram Moolenaar      export def Func()
2014eef2102eSBram Moolenaar        echo 'imported'
2015eef2102eSBram Moolenaar      enddef
2016eef2102eSBram Moolenaar  END
2017eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
2018eef2102eSBram Moolenaar
2019cfcd011fSBram Moolenaar  var lines =<< trim END
2020eef2102eSBram Moolenaar    vim9script
2021eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2022eef2102eSBram Moolenaar    def Func()
2023eef2102eSBram Moolenaar      echo 'local to function'
2024eef2102eSBram Moolenaar    enddef
2025eef2102eSBram Moolenaar  END
2026eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2027eef2102eSBram Moolenaar
2028eef2102eSBram Moolenaar  lines =<< trim END
2029eef2102eSBram Moolenaar    vim9script
2030eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2031eef2102eSBram Moolenaar    def Outer()
2032eef2102eSBram Moolenaar      def Func()
2033eef2102eSBram Moolenaar        echo 'local to function'
2034eef2102eSBram Moolenaar      enddef
2035eef2102eSBram Moolenaar    enddef
2036eef2102eSBram Moolenaar    defcompile
2037eef2102eSBram Moolenaar  END
2038eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2039eef2102eSBram Moolenaar
2040eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
2041eef2102eSBram Moolenaarenddef
2042eef2102eSBram Moolenaar
2043b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
2044cfcd011fSBram Moolenaar  var lines =<< trim END
2045b9a2cac3SBram Moolenaar    vim9script
2046b9a2cac3SBram Moolenaar    def Func()
2047b9a2cac3SBram Moolenaar      echo 'one'
2048b9a2cac3SBram Moolenaar    enddef
2049b9a2cac3SBram Moolenaar    def Func()
2050b9a2cac3SBram Moolenaar      echo 'two'
2051b9a2cac3SBram Moolenaar    enddef
2052b9a2cac3SBram Moolenaar  END
2053b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2054fa211f3cSBram Moolenaar
2055fa211f3cSBram Moolenaar  lines =<< trim END
2056fa211f3cSBram Moolenaar    vim9script
2057fa211f3cSBram Moolenaar    def Foo(): string
2058fa211f3cSBram Moolenaar      return 'foo'
2059fa211f3cSBram Moolenaar      enddef
2060fa211f3cSBram Moolenaar    def Func()
2061cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
2062fa211f3cSBram Moolenaar    enddef
2063fa211f3cSBram Moolenaar    defcompile
2064fa211f3cSBram Moolenaar  END
2065fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2066b9a2cac3SBram Moolenaarenddef
2067b9a2cac3SBram Moolenaar
20688a7d6542SBram Moolenaardef Test_fixed_size_list()
2069f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
2070cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
20718a7d6542SBram Moolenaar  l->remove(0)
20728a7d6542SBram Moolenaar  l->add(5)
20738a7d6542SBram Moolenaar  l->insert(99, 1)
20740f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
20758a7d6542SBram Moolenaarenddef
20768a7d6542SBram Moolenaar
2077ae616494SBram Moolenaardef Test_no_insert_xit()
2078d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2079d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2080d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2081d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2082d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2083ae616494SBram Moolenaar
2084ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2085ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2086ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2087ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2088f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2089f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
20906508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
20916508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
2092f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2093f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2094f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2095ae616494SBram Moolenaarenddef
2096ae616494SBram Moolenaar
2097158906cfSBram Moolenaardef IfElse(what: number): string
2098cfcd011fSBram Moolenaar  var res = ''
2099158906cfSBram Moolenaar  if what == 1
2100158906cfSBram Moolenaar    res = "one"
2101158906cfSBram Moolenaar  elseif what == 2
2102158906cfSBram Moolenaar    res = "two"
2103a259d8d3SBram Moolenaar  else
2104158906cfSBram Moolenaar    res = "three"
2105a259d8d3SBram Moolenaar  endif
2106158906cfSBram Moolenaar  return res
2107a259d8d3SBram Moolenaarenddef
2108a259d8d3SBram Moolenaar
2109158906cfSBram Moolenaardef Test_if_elseif_else()
2110158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2111158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2112158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
21130f18b6d1SBram Moolenaarenddef
21140f18b6d1SBram Moolenaar
2115e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2116d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2117d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2118d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2119ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
2120d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
21216628b7ebSBram Moolenaar
21226628b7ebSBram Moolenaar  var lines =<< trim END
21236628b7ebSBram Moolenaar      var s = ''
21246628b7ebSBram Moolenaar      if s = ''
21256628b7ebSBram Moolenaar      endif
21266628b7ebSBram Moolenaar  END
21276628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
21286628b7ebSBram Moolenaar
21296628b7ebSBram Moolenaar  lines =<< trim END
21306628b7ebSBram Moolenaar      var s = ''
21316628b7ebSBram Moolenaar      if s == ''
21326628b7ebSBram Moolenaar      elseif s = ''
21336628b7ebSBram Moolenaar      endif
21346628b7ebSBram Moolenaar  END
21356628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2136e8c4abbbSBram Moolenaarenddef
2137e8c4abbbSBram Moolenaar
21386d69bf60SBram Moolenaarlet g:bool_true = v:true
21396d69bf60SBram Moolenaarlet g:bool_false = v:false
21406d69bf60SBram Moolenaar
21416d69bf60SBram Moolenaardef Test_if_const_expr()
2142cfcd011fSBram Moolenaar  var res = false
21436d69bf60SBram Moolenaar  if true ? true : false
21446d69bf60SBram Moolenaar    res = true
21456d69bf60SBram Moolenaar  endif
21466d69bf60SBram Moolenaar  assert_equal(true, res)
21476d69bf60SBram Moolenaar
2148585fea7bSBram Moolenaar  g:glob = 2
2149585fea7bSBram Moolenaar  if false
21506797966dSBram Moolenaar    execute('g:glob = 3')
2151585fea7bSBram Moolenaar  endif
2152585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2153585fea7bSBram Moolenaar  if true
21546797966dSBram Moolenaar    execute('g:glob = 3')
2155585fea7bSBram Moolenaar  endif
2156585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2157585fea7bSBram Moolenaar
21586d69bf60SBram Moolenaar  res = false
21596d69bf60SBram Moolenaar  if g:bool_true ? true : false
21606d69bf60SBram Moolenaar    res = true
21616d69bf60SBram Moolenaar  endif
21626d69bf60SBram Moolenaar  assert_equal(true, res)
21636d69bf60SBram Moolenaar
21646d69bf60SBram Moolenaar  res = false
21656d69bf60SBram Moolenaar  if true ? g:bool_true : false
21666d69bf60SBram Moolenaar    res = true
21676d69bf60SBram Moolenaar  endif
21686d69bf60SBram Moolenaar  assert_equal(true, res)
21696d69bf60SBram Moolenaar
21706d69bf60SBram Moolenaar  res = false
21716d69bf60SBram Moolenaar  if true ? true : g:bool_false
21726d69bf60SBram Moolenaar    res = true
21736d69bf60SBram Moolenaar  endif
21746d69bf60SBram Moolenaar  assert_equal(true, res)
21756d69bf60SBram Moolenaar
21766d69bf60SBram Moolenaar  res = false
21776d69bf60SBram Moolenaar  if true ? false : true
21786d69bf60SBram Moolenaar    res = true
21796d69bf60SBram Moolenaar  endif
21806d69bf60SBram Moolenaar  assert_equal(false, res)
21816d69bf60SBram Moolenaar
21826d69bf60SBram Moolenaar  res = false
21836d69bf60SBram Moolenaar  if false ? false : true
21846d69bf60SBram Moolenaar    res = true
21856d69bf60SBram Moolenaar  endif
21866d69bf60SBram Moolenaar  assert_equal(true, res)
21876d69bf60SBram Moolenaar
21886d69bf60SBram Moolenaar  res = false
21896d69bf60SBram Moolenaar  if false ? true : false
21906d69bf60SBram Moolenaar    res = true
21916d69bf60SBram Moolenaar  endif
21926d69bf60SBram Moolenaar  assert_equal(false, res)
21936d69bf60SBram Moolenaar
21946d69bf60SBram Moolenaar  res = false
2195e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2196e8c4abbbSBram Moolenaar    res = true
2197e8c4abbbSBram Moolenaar  endif
2198e8c4abbbSBram Moolenaar  assert_equal(false, res)
2199e8c4abbbSBram Moolenaar
2200e8c4abbbSBram Moolenaar  res = false
22016d69bf60SBram Moolenaar  if true && true
22026d69bf60SBram Moolenaar    res = true
22036d69bf60SBram Moolenaar  endif
22046d69bf60SBram Moolenaar  assert_equal(true, res)
22056d69bf60SBram Moolenaar
22066d69bf60SBram Moolenaar  res = false
22076d69bf60SBram Moolenaar  if true && false
22086d69bf60SBram Moolenaar    res = true
22096d69bf60SBram Moolenaar  endif
22106d69bf60SBram Moolenaar  assert_equal(false, res)
22116d69bf60SBram Moolenaar
22126d69bf60SBram Moolenaar  res = false
22136d69bf60SBram Moolenaar  if g:bool_true && false
22146d69bf60SBram Moolenaar    res = true
22156d69bf60SBram Moolenaar  endif
22166d69bf60SBram Moolenaar  assert_equal(false, res)
22176d69bf60SBram Moolenaar
22186d69bf60SBram Moolenaar  res = false
22196d69bf60SBram Moolenaar  if true && g:bool_false
22206d69bf60SBram Moolenaar    res = true
22216d69bf60SBram Moolenaar  endif
22226d69bf60SBram Moolenaar  assert_equal(false, res)
22236d69bf60SBram Moolenaar
22246d69bf60SBram Moolenaar  res = false
22256d69bf60SBram Moolenaar  if false && false
22266d69bf60SBram Moolenaar    res = true
22276d69bf60SBram Moolenaar  endif
22286d69bf60SBram Moolenaar  assert_equal(false, res)
22296d69bf60SBram Moolenaar
22306d69bf60SBram Moolenaar  res = false
22316d69bf60SBram Moolenaar  if true || false
22326d69bf60SBram Moolenaar    res = true
22336d69bf60SBram Moolenaar  endif
22346d69bf60SBram Moolenaar  assert_equal(true, res)
22356d69bf60SBram Moolenaar
22366d69bf60SBram Moolenaar  res = false
22376d69bf60SBram Moolenaar  if g:bool_true || false
22386d69bf60SBram Moolenaar    res = true
22396d69bf60SBram Moolenaar  endif
22406d69bf60SBram Moolenaar  assert_equal(true, res)
22416d69bf60SBram Moolenaar
22426d69bf60SBram Moolenaar  res = false
22436d69bf60SBram Moolenaar  if true || g:bool_false
22446d69bf60SBram Moolenaar    res = true
22456d69bf60SBram Moolenaar  endif
22466d69bf60SBram Moolenaar  assert_equal(true, res)
22476d69bf60SBram Moolenaar
22486d69bf60SBram Moolenaar  res = false
22496d69bf60SBram Moolenaar  if false || false
22506d69bf60SBram Moolenaar    res = true
22516d69bf60SBram Moolenaar  endif
22526d69bf60SBram Moolenaar  assert_equal(false, res)
22533988f64fSBram Moolenaar
22543988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
2255c323527dSBram Moolenaar  if false | eval 1 + 2 | endif
22563988f64fSBram Moolenaar  if false | eval burp + 234 | endif
22573988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
22583988f64fSBram Moolenaar  if false
22593988f64fSBram Moolenaar    burp
22603988f64fSBram Moolenaar  endif
226180c34ca3SBram Moolenaarenddef
22626d69bf60SBram Moolenaar
226380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2264d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2265d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2266d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2267d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
22686d69bf60SBram Moolenaarenddef
22696d69bf60SBram Moolenaar
227072abcf42SBram Moolenaardef RunNested(i: number): number
2271cfcd011fSBram Moolenaar  var x: number = 0
227272abcf42SBram Moolenaar  if i % 2
227372abcf42SBram Moolenaar    if 1
2274f5be8cdbSBram Moolenaar      # comment
227572abcf42SBram Moolenaar    else
2276f5be8cdbSBram Moolenaar      # comment
227772abcf42SBram Moolenaar    endif
227872abcf42SBram Moolenaar    x += 1
227972abcf42SBram Moolenaar  else
228072abcf42SBram Moolenaar    x += 1000
228172abcf42SBram Moolenaar  endif
228272abcf42SBram Moolenaar  return x
228372abcf42SBram Moolenaarenddef
228472abcf42SBram Moolenaar
228572abcf42SBram Moolenaardef Test_nested_if()
228672abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
228772abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
228872abcf42SBram Moolenaarenddef
228972abcf42SBram Moolenaar
2290ad39c094SBram Moolenaardef Test_execute_cmd()
2291e4984290SBram Moolenaar  # missing argument is ignored
2292e4984290SBram Moolenaar  execute
2293e4984290SBram Moolenaar  execute # comment
2294e4984290SBram Moolenaar
2295ad39c094SBram Moolenaar  new
2296ad39c094SBram Moolenaar  setline(1, 'default')
2297d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2298ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2299a72cfb80SBram Moolenaar
2300d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2301a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2302a72cfb80SBram Moolenaar
2303cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2304cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2305a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2306ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2307a72cfb80SBram Moolenaar
2308d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2309ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2310a72cfb80SBram Moolenaar
2311cfcd011fSBram Moolenaar  var cmd_first = 'call '
2312cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2313ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2314ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2315ad39c094SBram Moolenaar  bwipe!
2316585fea7bSBram Moolenaar
2317cfcd011fSBram Moolenaar  var n = true
23182d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
23192d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
23202d6b20d6SBram Moolenaar
2321e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2322e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2323e5abf7afSBram Moolenaar
2324d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2325d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2326d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2327ad39c094SBram Moolenaarenddef
2328ad39c094SBram Moolenaar
232947e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2330f5be8cdbSBram Moolenaar  # only checks line continuation
2331cfcd011fSBram Moolenaar  var lines =<< trim END
233247e880d6SBram Moolenaar      vim9script
233347e880d6SBram Moolenaar      execute 'g:someVar'
233447e880d6SBram Moolenaar                .. ' = ' ..
233547e880d6SBram Moolenaar                   '28'
233647e880d6SBram Moolenaar      assert_equal(28, g:someVar)
233747e880d6SBram Moolenaar      unlet g:someVar
233847e880d6SBram Moolenaar  END
233947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
234047e880d6SBram Moolenaarenddef
234147e880d6SBram Moolenaar
2342ad39c094SBram Moolenaardef Test_echo_cmd()
2343a72cfb80SBram Moolenaar  echo 'some' # comment
2344585fea7bSBram Moolenaar  echon 'thing'
2345ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2346ad39c094SBram Moolenaar
2347a72cfb80SBram Moolenaar  echo "some" # comment
2348a72cfb80SBram Moolenaar  echon "thing"
2349a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2350a72cfb80SBram Moolenaar
2351cfcd011fSBram Moolenaar  var str1 = 'some'
2352cfcd011fSBram Moolenaar  var str2 = 'more'
2353ad39c094SBram Moolenaar  echo str1 str2
2354ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2355a72cfb80SBram Moolenaar
2356d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2357ad39c094SBram Moolenaarenddef
2358ad39c094SBram Moolenaar
2359f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2360f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2361f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2362f93c7feaSBram Moolenaar  echo 'clear'
2363df069eecSBram Moolenaar  :1messages
2364f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2365f93c7feaSBram Moolenaar
2366d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2367f93c7feaSBram Moolenaarenddef
2368f93c7feaSBram Moolenaar
236947e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2370f5be8cdbSBram Moolenaar  # only checks line continuation
2371cfcd011fSBram Moolenaar  var lines =<< trim END
237247e880d6SBram Moolenaar      vim9script
237347e880d6SBram Moolenaar      echomsg 'here'
237447e880d6SBram Moolenaar                .. ' is ' ..
237547e880d6SBram Moolenaar                   'a message'
237647e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
237747e880d6SBram Moolenaar  END
237847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
237947e880d6SBram Moolenaarenddef
238047e880d6SBram Moolenaar
2381f93c7feaSBram Moolenaardef Test_echoerr_cmd()
238240ee466cSBram Moolenaar  try
238340ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
238440ee466cSBram Moolenaar  catch
238540ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
238640ee466cSBram Moolenaar  endtry
2387f93c7feaSBram Moolenaarenddef
2388f93c7feaSBram Moolenaar
238947e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2390f5be8cdbSBram Moolenaar  # only checks line continuation
2391cfcd011fSBram Moolenaar  var lines =<< trim END
239247e880d6SBram Moolenaar      vim9script
239347e880d6SBram Moolenaar      try
239447e880d6SBram Moolenaar        echoerr 'this'
239547e880d6SBram Moolenaar                .. ' is ' ..
239647e880d6SBram Moolenaar                   'wrong'
239747e880d6SBram Moolenaar      catch
239847e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
239947e880d6SBram Moolenaar      endtry
240047e880d6SBram Moolenaar  END
240147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
240247e880d6SBram Moolenaarenddef
240347e880d6SBram Moolenaar
240441fe0617SBram Moolenaardef Test_for_outside_of_function()
2405cfcd011fSBram Moolenaar  var lines =<< trim END
240641fe0617SBram Moolenaar    vim9script
240741fe0617SBram Moolenaar    new
240841fe0617SBram Moolenaar    for var in range(0, 3)
240941fe0617SBram Moolenaar      append(line('$'), var)
241041fe0617SBram Moolenaar    endfor
241141fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
241241fe0617SBram Moolenaar    bwipe!
2413522eefd9SBram Moolenaar
2414522eefd9SBram Moolenaar    var result = ''
2415522eefd9SBram Moolenaar    for i in [1, 2, 3]
2416522eefd9SBram Moolenaar      var loop = ' loop ' .. i
2417522eefd9SBram Moolenaar      result ..= loop
2418522eefd9SBram Moolenaar    endfor
2419522eefd9SBram Moolenaar    assert_equal(' loop 1 loop 2 loop 3', result)
242041fe0617SBram Moolenaar  END
242141fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
242241fe0617SBram Moolenaar  source Xvim9for.vim
242341fe0617SBram Moolenaar  delete('Xvim9for.vim')
242441fe0617SBram Moolenaarenddef
24258a7d6542SBram Moolenaar
2426e8c4abbbSBram Moolenaardef Test_for_loop()
2427f2253963SBram Moolenaar  var lines =<< trim END
2428cfcd011fSBram Moolenaar      var result = ''
2429e8c4abbbSBram Moolenaar      for cnt in range(7)
2430e8c4abbbSBram Moolenaar        if cnt == 4
2431e8c4abbbSBram Moolenaar          break
2432e8c4abbbSBram Moolenaar        endif
2433e8c4abbbSBram Moolenaar        if cnt == 2
2434e8c4abbbSBram Moolenaar          continue
2435e8c4abbbSBram Moolenaar        endif
2436e8c4abbbSBram Moolenaar        result ..= cnt .. '_'
2437e8c4abbbSBram Moolenaar      endfor
2438e8c4abbbSBram Moolenaar      assert_equal('0_1_3_', result)
24390ad3e894SBram Moolenaar
2440cfcd011fSBram Moolenaar      var concat = ''
24410ad3e894SBram Moolenaar      for str in eval('["one", "two"]')
24420ad3e894SBram Moolenaar        concat ..= str
24430ad3e894SBram Moolenaar      endfor
24440ad3e894SBram Moolenaar      assert_equal('onetwo', concat)
244538bd8de5SBram Moolenaar
244638bd8de5SBram Moolenaar      var total = 0
244738bd8de5SBram Moolenaar      for nr in
244838bd8de5SBram Moolenaar          [1, 2, 3]
244938bd8de5SBram Moolenaar        total += nr
245038bd8de5SBram Moolenaar      endfor
245138bd8de5SBram Moolenaar      assert_equal(6, total)
245238bd8de5SBram Moolenaar
245338bd8de5SBram Moolenaar      total = 0
245438bd8de5SBram Moolenaar      for nr
245538bd8de5SBram Moolenaar        in [1, 2, 3]
245638bd8de5SBram Moolenaar        total += nr
245738bd8de5SBram Moolenaar      endfor
245838bd8de5SBram Moolenaar      assert_equal(6, total)
245938bd8de5SBram Moolenaar
246038bd8de5SBram Moolenaar      total = 0
246138bd8de5SBram Moolenaar      for nr
246238bd8de5SBram Moolenaar        in
246338bd8de5SBram Moolenaar        [1, 2, 3]
246438bd8de5SBram Moolenaar        total += nr
246538bd8de5SBram Moolenaar      endfor
246638bd8de5SBram Moolenaar      assert_equal(6, total)
2467036d0714SBram Moolenaar
2468a3589a0dSBram Moolenaar      # with type
2469a3589a0dSBram Moolenaar      total = 0
2470a3589a0dSBram Moolenaar      for n: number in [1, 2, 3]
2471a3589a0dSBram Moolenaar        total += n
2472a3589a0dSBram Moolenaar      endfor
2473a3589a0dSBram Moolenaar      assert_equal(6, total)
2474a3589a0dSBram Moolenaar
2475fe090eb5SBram Moolenaar      var chars = ''
2476fe090eb5SBram Moolenaar      for s: string in 'foobar'
2477fe090eb5SBram Moolenaar        chars ..= s
2478fe090eb5SBram Moolenaar      endfor
2479fe090eb5SBram Moolenaar      assert_equal('foobar', chars)
2480fe090eb5SBram Moolenaar
24815ede5b23SBram Moolenaar      chars = ''
24825ede5b23SBram Moolenaar      for x: string in {a: 'a', b: 'b'}->values()
24835ede5b23SBram Moolenaar        chars ..= x
24845ede5b23SBram Moolenaar      endfor
24855ede5b23SBram Moolenaar      assert_equal('ab', chars)
24865ede5b23SBram Moolenaar
2487a3589a0dSBram Moolenaar      # unpack with type
2488f2253963SBram Moolenaar      var res = ''
2489a3589a0dSBram Moolenaar      for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2490a3589a0dSBram Moolenaar        res ..= n .. s
2491a3589a0dSBram Moolenaar      endfor
2492a3589a0dSBram Moolenaar      assert_equal('1a2b', res)
2493a3589a0dSBram Moolenaar
2494444d8783SBram Moolenaar      # unpack with one var
2495444d8783SBram Moolenaar      var reslist = []
2496444d8783SBram Moolenaar      for [x] in [['aaa'], ['bbb']]
2497444d8783SBram Moolenaar        reslist->add(x)
2498444d8783SBram Moolenaar      endfor
2499444d8783SBram Moolenaar      assert_equal(['aaa', 'bbb'], reslist)
2500444d8783SBram Moolenaar
2501a3589a0dSBram Moolenaar      # loop over string
2502a3589a0dSBram Moolenaar      res = ''
250374e54fcbSBram Moolenaar      for c in 'aéc̀d'
250474e54fcbSBram Moolenaar        res ..= c .. '-'
250574e54fcbSBram Moolenaar      endfor
250674e54fcbSBram Moolenaar      assert_equal('a-é-c̀-d-', res)
250774e54fcbSBram Moolenaar
250874e54fcbSBram Moolenaar      res = ''
250974e54fcbSBram Moolenaar      for c in ''
251074e54fcbSBram Moolenaar        res ..= c .. '-'
251174e54fcbSBram Moolenaar      endfor
251274e54fcbSBram Moolenaar      assert_equal('', res)
251374e54fcbSBram Moolenaar
251474e54fcbSBram Moolenaar      res = ''
251574e54fcbSBram Moolenaar      for c in test_null_string()
251674e54fcbSBram Moolenaar        res ..= c .. '-'
251774e54fcbSBram Moolenaar      endfor
251874e54fcbSBram Moolenaar      assert_equal('', res)
2519f2253963SBram Moolenaar
2520f2253963SBram Moolenaar      var foo: list<dict<any>> = [
2521f2253963SBram Moolenaar              {a: 'Cat'}
2522f2253963SBram Moolenaar            ]
2523f2253963SBram Moolenaar      for dd in foo
2524f2253963SBram Moolenaar        dd.counter = 12
2525f2253963SBram Moolenaar      endfor
2526f2253963SBram Moolenaar      assert_equal([{a: 'Cat', counter: 12}], foo)
2527ad2d4969SBram Moolenaar
2528ad2d4969SBram Moolenaar      reslist = []
2529ad2d4969SBram Moolenaar      for _ in range(3)
2530ad2d4969SBram Moolenaar        reslist->add('x')
2531ad2d4969SBram Moolenaar      endfor
2532ad2d4969SBram Moolenaar      assert_equal(['x', 'x', 'x'], reslist)
2533f2253963SBram Moolenaar  END
2534f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2535e8c4abbbSBram Moolenaarenddef
2536e8c4abbbSBram Moolenaar
2537e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2538442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:')
2539442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:')
2540442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:')
2541442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2542442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2543442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:')
2544d4ab807dSBram Moolenaar  CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2545822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
25462d870f8dSBram Moolenaar  delfunc! g:Func
2547675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2548675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2549675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
255074e54fcbSBram Moolenaar
255174e54fcbSBram Moolenaar  # wrong type detected at compile time
255274e54fcbSBram Moolenaar  CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
255374e54fcbSBram Moolenaar
255474e54fcbSBram Moolenaar  # wrong type detected at runtime
255574e54fcbSBram Moolenaar  g:adict = {a: 1}
255674e54fcbSBram Moolenaar  CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
255774e54fcbSBram Moolenaar  unlet g:adict
2558f6a8d420SBram Moolenaar
2559f6a8d420SBram Moolenaar  var lines =<< trim END
2560f6a8d420SBram Moolenaar      var d: list<dict<any>> = [{a: 0}]
2561f6a8d420SBram Moolenaar      for e in d
2562f6a8d420SBram Moolenaar        e = {a: 0, b: ''}
2563f6a8d420SBram Moolenaar      endfor
2564f6a8d420SBram Moolenaar  END
2565f6a8d420SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3)
2566fe090eb5SBram Moolenaar
2567fe090eb5SBram Moolenaar  lines =<< trim END
2568fe090eb5SBram Moolenaar      for nr: number in ['foo']
2569fe090eb5SBram Moolenaar      endfor
2570fe090eb5SBram Moolenaar  END
2571fe090eb5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2572404557e6SBram Moolenaar
2573404557e6SBram Moolenaar  lines =<< trim END
2574404557e6SBram Moolenaar      for n : number in [1, 2]
2575404557e6SBram Moolenaar        echo n
2576404557e6SBram Moolenaar      endfor
2577404557e6SBram Moolenaar  END
2578404557e6SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1059:', 1)
2579efc5db52SBram Moolenaar
2580efc5db52SBram Moolenaar  lines =<< trim END
2581efc5db52SBram Moolenaar      var d: dict<number> = {a: 1, b: 2}
2582efc5db52SBram Moolenaar      for [k: job, v: job] in d->items()
2583efc5db52SBram Moolenaar        echo k v
2584efc5db52SBram Moolenaar      endfor
2585efc5db52SBram Moolenaar  END
2586efc5db52SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2)
2587e8c4abbbSBram Moolenaarenddef
2588e8c4abbbSBram Moolenaar
2589ea87069dSBram Moolenaardef Test_for_loop_script_var()
2590ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2591ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2592ea87069dSBram Moolenaar
2593ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2594ea87069dSBram Moolenaar  var lines =<< trim END
2595ea87069dSBram Moolenaar    vim9script
2596ea87069dSBram Moolenaar    var total = 0
2597ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2598ea87069dSBram Moolenaar      total += s:var
2599ea87069dSBram Moolenaar    endfor
2600ea87069dSBram Moolenaar    assert_equal(6, total)
2601ea87069dSBram Moolenaar
2602ea87069dSBram Moolenaar    total = 0
2603ea87069dSBram Moolenaar    for var in [1, 2, 3]
2604ea87069dSBram Moolenaar      total += var
2605ea87069dSBram Moolenaar    endfor
2606ea87069dSBram Moolenaar    assert_equal(6, total)
2607ea87069dSBram Moolenaar  END
2608ea87069dSBram Moolenaarenddef
2609ea87069dSBram Moolenaar
2610792f786aSBram Moolenaardef Test_for_loop_unpack()
26114b8a0651SBram Moolenaar  var lines =<< trim END
2612792f786aSBram Moolenaar      var result = []
2613792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2614792f786aSBram Moolenaar        result->add(v1)
2615792f786aSBram Moolenaar        result->add(v2)
2616792f786aSBram Moolenaar      endfor
2617792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2618792f786aSBram Moolenaar
2619792f786aSBram Moolenaar      result = []
2620792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2621792f786aSBram Moolenaar        result->add(v1)
2622792f786aSBram Moolenaar        result->add(v2)
2623792f786aSBram Moolenaar        result->add(v3)
2624792f786aSBram Moolenaar      endfor
2625792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2626792f786aSBram Moolenaar
26274b8a0651SBram Moolenaar      result = []
26284b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
26294b8a0651SBram Moolenaar        result->add(&ts)
26304b8a0651SBram Moolenaar        result->add(&sw)
26314b8a0651SBram Moolenaar      endfor
26324b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
26334b8a0651SBram Moolenaar
26344b8a0651SBram Moolenaar      var slist: list<string>
26354b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
26364b8a0651SBram Moolenaar        slist->add($LOOPVAR)
26374b8a0651SBram Moolenaar        slist->add(@r)
26384b8a0651SBram Moolenaar        slist->add(v:errmsg)
26394b8a0651SBram Moolenaar      endfor
26404b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
26414b8a0651SBram Moolenaar
26424b8a0651SBram Moolenaar      slist = []
26434b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
26444b8a0651SBram Moolenaar        slist->add(g:globalvar)
26454b8a0651SBram Moolenaar        slist->add(b:bufvar)
26464b8a0651SBram Moolenaar        slist->add(w:winvar)
26474b8a0651SBram Moolenaar        slist->add(t:tabvar)
26484b8a0651SBram Moolenaar      endfor
26494b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2650f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
2651b777da9bSBram Moolenaar
2652b777da9bSBram Moolenaar      var res = []
2653b777da9bSBram Moolenaar      for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2654b777da9bSBram Moolenaar        res->add(n)
2655b777da9bSBram Moolenaar      endfor
2656b777da9bSBram Moolenaar      assert_equal([2, 5], res)
26574b8a0651SBram Moolenaar  END
26584b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
26594b8a0651SBram Moolenaar
26604b8a0651SBram Moolenaar  lines =<< trim END
2661792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2662792f786aSBram Moolenaar        echo v1 v2
2663792f786aSBram Moolenaar      endfor
2664792f786aSBram Moolenaar  END
2665792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2666792f786aSBram Moolenaar
2667792f786aSBram Moolenaar  lines =<< trim END
2668792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2669792f786aSBram Moolenaar        echo v1 v2
2670792f786aSBram Moolenaar      endfor
2671792f786aSBram Moolenaar  END
2672792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2673792f786aSBram Moolenaar
2674792f786aSBram Moolenaar  lines =<< trim END
2675792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2676792f786aSBram Moolenaar        echo v1
2677792f786aSBram Moolenaar      endfor
2678792f786aSBram Moolenaar  END
2679792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2680792f786aSBram Moolenaarenddef
2681792f786aSBram Moolenaar
2682c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2683f2253963SBram Moolenaar  var lines =<< trim END
2684c150c09eSBram Moolenaar      var looped = 0
2685c150c09eSBram Moolenaar      var cleanup = 0
2686c150c09eSBram Moolenaar      for i in range(3)
2687c150c09eSBram Moolenaar        looped += 1
2688c150c09eSBram Moolenaar        try
2689c150c09eSBram Moolenaar          eval [][0]
2690c150c09eSBram Moolenaar        catch
2691c150c09eSBram Moolenaar          continue
2692c150c09eSBram Moolenaar        finally
2693c150c09eSBram Moolenaar          cleanup += 1
2694c150c09eSBram Moolenaar        endtry
2695c150c09eSBram Moolenaar      endfor
2696c150c09eSBram Moolenaar      assert_equal(3, looped)
2697c150c09eSBram Moolenaar      assert_equal(3, cleanup)
2698f2253963SBram Moolenaar  END
2699f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2700c150c09eSBram Moolenaarenddef
2701c150c09eSBram Moolenaar
2702d0df1aacSBram Moolenaardef Test_while_loop()
2703cfcd011fSBram Moolenaar  var result = ''
2704cfcd011fSBram Moolenaar  var cnt = 0
2705d0df1aacSBram Moolenaar  while cnt < 555
2706d0df1aacSBram Moolenaar    if cnt == 3
2707d0df1aacSBram Moolenaar      break
2708d0df1aacSBram Moolenaar    endif
2709d0df1aacSBram Moolenaar    cnt += 1
2710d0df1aacSBram Moolenaar    if cnt == 2
2711d0df1aacSBram Moolenaar      continue
2712d0df1aacSBram Moolenaar    endif
2713d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2714d0df1aacSBram Moolenaar  endwhile
2715d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2716dee37dc7SBram Moolenaar
2717dee37dc7SBram Moolenaar  var s = ''
27180123cc1eSBram Moolenaar  while s == 'x' # {comment}
2719dee37dc7SBram Moolenaar  endwhile
2720d0df1aacSBram Moolenaarenddef
2721d0df1aacSBram Moolenaar
2722e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2723675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2724675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2725675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2726675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2727675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2728675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2729675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
27306628b7ebSBram Moolenaar
27316628b7ebSBram Moolenaar  var lines =<< trim END
27326628b7ebSBram Moolenaar      var s = ''
27336628b7ebSBram Moolenaar      while s = ''
27346628b7ebSBram Moolenaar      endwhile
27356628b7ebSBram Moolenaar  END
27366628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2737bd5da371SBram Moolenaarenddef
2738bd5da371SBram Moolenaar
27399645e2d9SBram Moolenaardef Test_interrupt_loop()
2740cfcd011fSBram Moolenaar  var caught = false
2741cfcd011fSBram Moolenaar  var x = 0
274297acfc78SBram Moolenaar  try
27439645e2d9SBram Moolenaar    while 1
27449645e2d9SBram Moolenaar      x += 1
27459645e2d9SBram Moolenaar      if x == 100
27469645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
27479645e2d9SBram Moolenaar      endif
27489645e2d9SBram Moolenaar    endwhile
274997acfc78SBram Moolenaar  catch
275097acfc78SBram Moolenaar    caught = true
275197acfc78SBram Moolenaar    assert_equal(100, x)
275297acfc78SBram Moolenaar  endtry
275397acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
275425859dd7SBram Moolenaar  # consume the CTRL-C
275525859dd7SBram Moolenaar  getchar(0)
27569645e2d9SBram Moolenaarenddef
275720431c9dSBram Moolenaar
27584fdae999SBram Moolenaardef Test_automatic_line_continuation()
2759cfcd011fSBram Moolenaar  var mylist = [
27604fdae999SBram Moolenaar      'one',
27614fdae999SBram Moolenaar      'two',
27624fdae999SBram Moolenaar      'three',
2763f5be8cdbSBram Moolenaar      ] # comment
27644fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
27654fdae999SBram Moolenaar
2766cfcd011fSBram Moolenaar  var mydict = {
2767e0de171eSBram Moolenaar      ['one']: 1,
2768e0de171eSBram Moolenaar      ['two']: 2,
2769e0de171eSBram Moolenaar      ['three']:
27704fdae999SBram Moolenaar          3,
2771f5be8cdbSBram Moolenaar      } # comment
2772e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2773e0de171eSBram Moolenaar  mydict = {
27742c330432SBram Moolenaar      one: 1,  # comment
27752c330432SBram Moolenaar      two:     # comment
27762c330432SBram Moolenaar           2,  # comment
27772c330432SBram Moolenaar      three: 3 # comment
27782c330432SBram Moolenaar      }
2779e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2780e0de171eSBram Moolenaar  mydict = {
27812c330432SBram Moolenaar      one: 1,
27824fdae999SBram Moolenaar      two:
27834fdae999SBram Moolenaar           2,
27842c330432SBram Moolenaar      three: 3
27854fdae999SBram Moolenaar      }
2786e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2787e6085c53SBram Moolenaar
2788e6085c53SBram Moolenaar  assert_equal(
2789e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2790e6085c53SBram Moolenaar        split('one two three')
2791e6085c53SBram Moolenaar        )
27924fdae999SBram Moolenaarenddef
27934fdae999SBram Moolenaar
27947a092245SBram Moolenaardef Test_vim9_comment()
27957a092245SBram Moolenaar  CheckScriptSuccess([
27967a092245SBram Moolenaar      'vim9script',
27977a092245SBram Moolenaar      '# something',
279893f82cbeSBram Moolenaar      '#something',
279993f82cbeSBram Moolenaar      '#{something',
28007a092245SBram Moolenaar      ])
280193f82cbeSBram Moolenaar
280293f82cbeSBram Moolenaar  split Xfile
280393f82cbeSBram Moolenaar  CheckScriptSuccess([
280493f82cbeSBram Moolenaar      'vim9script',
280593f82cbeSBram Moolenaar      'edit #something',
280693f82cbeSBram Moolenaar      ])
280793f82cbeSBram Moolenaar  CheckScriptSuccess([
280893f82cbeSBram Moolenaar      'vim9script',
280993f82cbeSBram Moolenaar      'edit #{something',
281093f82cbeSBram Moolenaar      ])
281193f82cbeSBram Moolenaar  close
281293f82cbeSBram Moolenaar
28137a092245SBram Moolenaar  CheckScriptFailure([
28147a092245SBram Moolenaar      'vim9script',
28157a092245SBram Moolenaar      ':# something',
28167a092245SBram Moolenaar      ], 'E488:')
28177a092245SBram Moolenaar  CheckScriptFailure([
28187a092245SBram Moolenaar      '# something',
28197a092245SBram Moolenaar      ], 'E488:')
28207a092245SBram Moolenaar  CheckScriptFailure([
28217a092245SBram Moolenaar      ':# something',
28227a092245SBram Moolenaar      ], 'E488:')
28237a092245SBram Moolenaar
28244a8d9f2eSBram Moolenaar  { # block start
28254a8d9f2eSBram Moolenaar  } # block end
28264a8d9f2eSBram Moolenaar  CheckDefFailure([
28274a8d9f2eSBram Moolenaar      '{# comment',
28284a8d9f2eSBram Moolenaar      ], 'E488:')
28294a8d9f2eSBram Moolenaar  CheckDefFailure([
28304a8d9f2eSBram Moolenaar      '{',
28314a8d9f2eSBram Moolenaar      '}# comment',
28324a8d9f2eSBram Moolenaar      ], 'E488:')
28334a8d9f2eSBram Moolenaar
28344a8d9f2eSBram Moolenaar  echo "yes" # comment
28354a8d9f2eSBram Moolenaar  CheckDefFailure([
28364a8d9f2eSBram Moolenaar      'echo "yes"# comment',
28374a8d9f2eSBram Moolenaar      ], 'E488:')
28387a092245SBram Moolenaar  CheckScriptSuccess([
28397a092245SBram Moolenaar      'vim9script',
28407a092245SBram Moolenaar      'echo "yes" # something',
28417a092245SBram Moolenaar      ])
28427a092245SBram Moolenaar  CheckScriptFailure([
28437a092245SBram Moolenaar      'vim9script',
28447a092245SBram Moolenaar      'echo "yes"# something',
28457a092245SBram Moolenaar      ], 'E121:')
28467a092245SBram Moolenaar  CheckScriptFailure([
28477a092245SBram Moolenaar      'vim9script',
28487a092245SBram Moolenaar      'echo# something',
2849f8103f27SBram Moolenaar      ], 'E1144:')
28507a092245SBram Moolenaar  CheckScriptFailure([
28517a092245SBram Moolenaar      'echo "yes" # something',
28527a092245SBram Moolenaar      ], 'E121:')
28537a092245SBram Moolenaar
28544a8d9f2eSBram Moolenaar  exe "echo" # comment
28554a8d9f2eSBram Moolenaar  CheckDefFailure([
28564a8d9f2eSBram Moolenaar      'exe "echo"# comment',
28574a8d9f2eSBram Moolenaar      ], 'E488:')
28584a8d9f2eSBram Moolenaar  CheckScriptSuccess([
28594a8d9f2eSBram Moolenaar      'vim9script',
28604a8d9f2eSBram Moolenaar      'exe "echo" # something',
28614a8d9f2eSBram Moolenaar      ])
28624a8d9f2eSBram Moolenaar  CheckScriptFailure([
28634a8d9f2eSBram Moolenaar      'vim9script',
28644a8d9f2eSBram Moolenaar      'exe "echo"# something',
28654a8d9f2eSBram Moolenaar      ], 'E121:')
28664a8d9f2eSBram Moolenaar  CheckScriptFailure([
28674a8d9f2eSBram Moolenaar      'vim9script',
28684a8d9f2eSBram Moolenaar      'exe# something',
2869f8103f27SBram Moolenaar      ], 'E1144:')
28704a8d9f2eSBram Moolenaar  CheckScriptFailure([
28714a8d9f2eSBram Moolenaar      'exe "echo" # something',
28724a8d9f2eSBram Moolenaar      ], 'E121:')
28734a8d9f2eSBram Moolenaar
28747a092245SBram Moolenaar  CheckDefFailure([
28757a092245SBram Moolenaar      'try# comment',
28767a092245SBram Moolenaar      '  echo "yes"',
28777a092245SBram Moolenaar      'catch',
28787a092245SBram Moolenaar      'endtry',
2879f8103f27SBram Moolenaar      ], 'E1144:')
28802c5ed4e3SBram Moolenaar  CheckScriptFailure([
28812c5ed4e3SBram Moolenaar      'vim9script',
28822c5ed4e3SBram Moolenaar      'try# comment',
28832c5ed4e3SBram Moolenaar      'echo "yes"',
2884f8103f27SBram Moolenaar      ], 'E1144:')
28857a092245SBram Moolenaar  CheckDefFailure([
28867a092245SBram Moolenaar      'try',
2887a72cfb80SBram Moolenaar      '  throw#comment',
2888a72cfb80SBram Moolenaar      'catch',
2889a72cfb80SBram Moolenaar      'endtry',
2890f8103f27SBram Moolenaar      ], 'E1144:')
2891a72cfb80SBram Moolenaar  CheckDefFailure([
2892a72cfb80SBram Moolenaar      'try',
2893a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2894a72cfb80SBram Moolenaar      'catch',
2895a72cfb80SBram Moolenaar      'endtry',
2896a72cfb80SBram Moolenaar      ], 'E488:')
2897a72cfb80SBram Moolenaar  CheckDefFailure([
2898a72cfb80SBram Moolenaar      'try',
28997a092245SBram Moolenaar      '  echo "yes"',
29007a092245SBram Moolenaar      'catch# comment',
29017a092245SBram Moolenaar      'endtry',
2902f8103f27SBram Moolenaar      ], 'E1144:')
29032c5ed4e3SBram Moolenaar  CheckScriptFailure([
29042c5ed4e3SBram Moolenaar      'vim9script',
29052c5ed4e3SBram Moolenaar      'try',
29062c5ed4e3SBram Moolenaar      '  echo "yes"',
29072c5ed4e3SBram Moolenaar      'catch# comment',
29082c5ed4e3SBram Moolenaar      'endtry',
2909f8103f27SBram Moolenaar      ], 'E1144:')
29102c5ed4e3SBram Moolenaar  CheckDefFailure([
29112c5ed4e3SBram Moolenaar      'try',
29122c5ed4e3SBram Moolenaar      '  echo "yes"',
29132c5ed4e3SBram Moolenaar      'catch /pat/# comment',
29142c5ed4e3SBram Moolenaar      'endtry',
29152c5ed4e3SBram Moolenaar      ], 'E488:')
29167a092245SBram Moolenaar  CheckDefFailure([
29177a092245SBram Moolenaar      'try',
29187a092245SBram Moolenaar      'echo "yes"',
29197a092245SBram Moolenaar      'catch',
29207a092245SBram Moolenaar      'endtry# comment',
2921f8103f27SBram Moolenaar      ], 'E1144:')
29222c5ed4e3SBram Moolenaar  CheckScriptFailure([
29232c5ed4e3SBram Moolenaar      'vim9script',
29242c5ed4e3SBram Moolenaar      'try',
29252c5ed4e3SBram Moolenaar      '  echo "yes"',
29262c5ed4e3SBram Moolenaar      'catch',
29272c5ed4e3SBram Moolenaar      'endtry# comment',
2928f8103f27SBram Moolenaar      ], 'E1144:')
29292c5ed4e3SBram Moolenaar
29302c5ed4e3SBram Moolenaar  CheckScriptSuccess([
29312c5ed4e3SBram Moolenaar      'vim9script',
29322c5ed4e3SBram Moolenaar      'hi # comment',
29332c5ed4e3SBram Moolenaar      ])
29342c5ed4e3SBram Moolenaar  CheckScriptFailure([
29352c5ed4e3SBram Moolenaar      'vim9script',
29362c5ed4e3SBram Moolenaar      'hi# comment',
2937f8103f27SBram Moolenaar      ], 'E1144:')
29381966c248SBram Moolenaar  CheckScriptSuccess([
29391966c248SBram Moolenaar      'vim9script',
29401966c248SBram Moolenaar      'hi Search # comment',
29411966c248SBram Moolenaar      ])
29421966c248SBram Moolenaar  CheckScriptFailure([
29431966c248SBram Moolenaar      'vim9script',
29441966c248SBram Moolenaar      'hi Search# comment',
29451966c248SBram Moolenaar      ], 'E416:')
29461966c248SBram Moolenaar  CheckScriptSuccess([
29471966c248SBram Moolenaar      'vim9script',
29481966c248SBram Moolenaar      'hi link This Search # comment',
29491966c248SBram Moolenaar      ])
29501966c248SBram Moolenaar  CheckScriptFailure([
29511966c248SBram Moolenaar      'vim9script',
29521966c248SBram Moolenaar      'hi link This That# comment',
29531966c248SBram Moolenaar      ], 'E413:')
29541966c248SBram Moolenaar  CheckScriptSuccess([
29551966c248SBram Moolenaar      'vim9script',
29561966c248SBram Moolenaar      'hi clear This # comment',
29571966c248SBram Moolenaar      'hi clear # comment',
29581966c248SBram Moolenaar      ])
2959f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2960f5be8cdbSBram Moolenaar  # hi clear This# comment',
29611966c248SBram Moolenaar  CheckScriptFailure([
29621966c248SBram Moolenaar      'vim9script',
29631966c248SBram Moolenaar      'hi clear# comment',
29641966c248SBram Moolenaar      ], 'E416:')
29651966c248SBram Moolenaar
29661966c248SBram Moolenaar  CheckScriptSuccess([
29671966c248SBram Moolenaar      'vim9script',
29681966c248SBram Moolenaar      'hi Group term=bold',
29691966c248SBram Moolenaar      'match Group /todo/ # comment',
29701966c248SBram Moolenaar      ])
29711966c248SBram Moolenaar  CheckScriptFailure([
29721966c248SBram Moolenaar      'vim9script',
29731966c248SBram Moolenaar      'hi Group term=bold',
29741966c248SBram Moolenaar      'match Group /todo/# comment',
29751966c248SBram Moolenaar      ], 'E488:')
29761966c248SBram Moolenaar  CheckScriptSuccess([
29771966c248SBram Moolenaar      'vim9script',
29781966c248SBram Moolenaar      'match # comment',
29791966c248SBram Moolenaar      ])
29801966c248SBram Moolenaar  CheckScriptFailure([
29811966c248SBram Moolenaar      'vim9script',
29821966c248SBram Moolenaar      'match# comment',
2983f8103f27SBram Moolenaar      ], 'E1144:')
29841966c248SBram Moolenaar  CheckScriptSuccess([
29851966c248SBram Moolenaar      'vim9script',
29861966c248SBram Moolenaar      'match none # comment',
29871966c248SBram Moolenaar      ])
29881966c248SBram Moolenaar  CheckScriptFailure([
29891966c248SBram Moolenaar      'vim9script',
29901966c248SBram Moolenaar      'match none# comment',
29911966c248SBram Moolenaar      ], 'E475:')
29921966c248SBram Moolenaar
29931966c248SBram Moolenaar  CheckScriptSuccess([
29941966c248SBram Moolenaar      'vim9script',
29951966c248SBram Moolenaar      'menutrans clear # comment',
29961966c248SBram Moolenaar      ])
29971966c248SBram Moolenaar  CheckScriptFailure([
29981966c248SBram Moolenaar      'vim9script',
29991966c248SBram Moolenaar      'menutrans clear# comment text',
30001966c248SBram Moolenaar      ], 'E474:')
30011966c248SBram Moolenaar
30021966c248SBram Moolenaar  CheckScriptSuccess([
30031966c248SBram Moolenaar      'vim9script',
30041966c248SBram Moolenaar      'syntax clear # comment',
30051966c248SBram Moolenaar      ])
30061966c248SBram Moolenaar  CheckScriptFailure([
30071966c248SBram Moolenaar      'vim9script',
30081966c248SBram Moolenaar      'syntax clear# comment text',
30091966c248SBram Moolenaar      ], 'E28:')
30101966c248SBram Moolenaar  CheckScriptSuccess([
30111966c248SBram Moolenaar      'vim9script',
30121966c248SBram Moolenaar      'syntax keyword Word some',
30131966c248SBram Moolenaar      'syntax clear Word # comment',
30141966c248SBram Moolenaar      ])
30151966c248SBram Moolenaar  CheckScriptFailure([
30161966c248SBram Moolenaar      'vim9script',
30171966c248SBram Moolenaar      'syntax keyword Word some',
30181966c248SBram Moolenaar      'syntax clear Word# comment text',
30191966c248SBram Moolenaar      ], 'E28:')
30201966c248SBram Moolenaar
30211966c248SBram Moolenaar  CheckScriptSuccess([
30221966c248SBram Moolenaar      'vim9script',
30231966c248SBram Moolenaar      'syntax list # comment',
30241966c248SBram Moolenaar      ])
30251966c248SBram Moolenaar  CheckScriptFailure([
30261966c248SBram Moolenaar      'vim9script',
30271966c248SBram Moolenaar      'syntax list# comment text',
30281966c248SBram Moolenaar      ], 'E28:')
30291966c248SBram Moolenaar
30301966c248SBram Moolenaar  CheckScriptSuccess([
30311966c248SBram Moolenaar      'vim9script',
30321966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
30331966c248SBram Moolenaar      ])
30341966c248SBram Moolenaar  CheckScriptFailure([
30351966c248SBram Moolenaar      'vim9script',
30361966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
30371966c248SBram Moolenaar      ], 'E475:')
30381966c248SBram Moolenaar
30391966c248SBram Moolenaar  CheckScriptSuccess([
30401966c248SBram Moolenaar      'vim9script',
30411966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
30421966c248SBram Moolenaar      ])
30431966c248SBram Moolenaar  CheckScriptFailure([
30441966c248SBram Moolenaar      'vim9script',
30451966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
30461966c248SBram Moolenaar      ], 'E789:')
30471966c248SBram Moolenaar
30481966c248SBram Moolenaar  CheckScriptSuccess([
30491966c248SBram Moolenaar      'vim9script',
30501966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
30511966c248SBram Moolenaar      ])
30521966c248SBram Moolenaar  CheckScriptFailure([
30531966c248SBram Moolenaar      'vim9script',
30541966c248SBram Moolenaar      'syntax match Word /pat/# comment',
30551966c248SBram Moolenaar      ], 'E402:')
30561966c248SBram Moolenaar
30571966c248SBram Moolenaar  CheckScriptSuccess([
30581966c248SBram Moolenaar      'vim9script',
30591966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
30601966c248SBram Moolenaar      ])
30611966c248SBram Moolenaar  CheckScriptFailure([
30621966c248SBram Moolenaar      'vim9script',
30631966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
30641966c248SBram Moolenaar      ], 'E475:')
30651966c248SBram Moolenaar  CheckScriptFailure([
30661966c248SBram Moolenaar      'vim9script',
30671966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
30681966c248SBram Moolenaar      ], 'E406:')
30691966c248SBram Moolenaar  CheckScriptFailure([
30701966c248SBram Moolenaar      'vim9script',
30711966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
30721966c248SBram Moolenaar      ], 'E475:')
30731966c248SBram Moolenaar
30741966c248SBram Moolenaar  CheckScriptSuccess([
30751966c248SBram Moolenaar      'vim9script',
30761966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
30771966c248SBram Moolenaar      ])
30781966c248SBram Moolenaar  CheckScriptFailure([
30791966c248SBram Moolenaar      'vim9script',
30801966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
3081d032f34aSBram Moolenaar      ], 'E402:')
30821966c248SBram Moolenaar
30831966c248SBram Moolenaar  CheckScriptSuccess([
30841966c248SBram Moolenaar      'vim9script',
30851966c248SBram Moolenaar      'syntax sync # comment',
30861966c248SBram Moolenaar      ])
30871966c248SBram Moolenaar  CheckScriptFailure([
30881966c248SBram Moolenaar      'vim9script',
30891966c248SBram Moolenaar      'syntax sync# comment',
30901966c248SBram Moolenaar      ], 'E404:')
30911966c248SBram Moolenaar  CheckScriptSuccess([
30921966c248SBram Moolenaar      'vim9script',
30931966c248SBram Moolenaar      'syntax sync ccomment # comment',
30941966c248SBram Moolenaar      ])
30951966c248SBram Moolenaar  CheckScriptFailure([
30961966c248SBram Moolenaar      'vim9script',
30971966c248SBram Moolenaar      'syntax sync ccomment# comment',
30981966c248SBram Moolenaar      ], 'E404:')
30991966c248SBram Moolenaar
31001966c248SBram Moolenaar  CheckScriptSuccess([
31011966c248SBram Moolenaar      'vim9script',
31021966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
31031966c248SBram Moolenaar      ])
31041966c248SBram Moolenaar  CheckScriptFailure([
31051966c248SBram Moolenaar      'vim9script',
31061966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
31071966c248SBram Moolenaar      ], 'E475:')
3108a72cfb80SBram Moolenaar
3109a72cfb80SBram Moolenaar  CheckScriptSuccess([
3110a72cfb80SBram Moolenaar      'vim9script',
3111a72cfb80SBram Moolenaar      'command Echo echo # comment',
3112a72cfb80SBram Moolenaar      'command Echo # comment',
31132d870f8dSBram Moolenaar      'delcommand Echo',
3114a72cfb80SBram Moolenaar      ])
3115a72cfb80SBram Moolenaar  CheckScriptFailure([
3116a72cfb80SBram Moolenaar      'vim9script',
3117a72cfb80SBram Moolenaar      'command Echo echo# comment',
3118a72cfb80SBram Moolenaar      'Echo',
3119f8103f27SBram Moolenaar      ], 'E1144:')
31202d870f8dSBram Moolenaar  delcommand Echo
312170249ee8SBram Moolenaar
312270249ee8SBram Moolenaar  var curdir = getcwd()
312370249ee8SBram Moolenaar  CheckScriptSuccess([
312470249ee8SBram Moolenaar      'command Echo cd " comment',
312570249ee8SBram Moolenaar      'Echo',
312670249ee8SBram Moolenaar      'delcommand Echo',
312770249ee8SBram Moolenaar      ])
312870249ee8SBram Moolenaar  CheckScriptSuccess([
3129090728adSBram Moolenaar      'vim9script',
313070249ee8SBram Moolenaar      'command Echo cd # comment',
313170249ee8SBram Moolenaar      'Echo',
313270249ee8SBram Moolenaar      'delcommand Echo',
313370249ee8SBram Moolenaar      ])
313470249ee8SBram Moolenaar  CheckScriptFailure([
313570249ee8SBram Moolenaar      'vim9script',
313670249ee8SBram Moolenaar      'command Echo cd " comment',
313770249ee8SBram Moolenaar      'Echo',
313870249ee8SBram Moolenaar      ], 'E344:')
313970249ee8SBram Moolenaar  delcommand Echo
314070249ee8SBram Moolenaar  chdir(curdir)
314170249ee8SBram Moolenaar
3142a72cfb80SBram Moolenaar  CheckScriptFailure([
3143a72cfb80SBram Moolenaar      'vim9script',
3144a72cfb80SBram Moolenaar      'command Echo# comment',
3145a72cfb80SBram Moolenaar      ], 'E182:')
3146a72cfb80SBram Moolenaar  CheckScriptFailure([
3147a72cfb80SBram Moolenaar      'vim9script',
3148a72cfb80SBram Moolenaar      'command Echo echo',
3149a72cfb80SBram Moolenaar      'command Echo# comment',
3150a72cfb80SBram Moolenaar      ], 'E182:')
31512d870f8dSBram Moolenaar  delcommand Echo
3152a72cfb80SBram Moolenaar
3153a72cfb80SBram Moolenaar  CheckScriptSuccess([
3154a72cfb80SBram Moolenaar      'vim9script',
3155a72cfb80SBram Moolenaar      'function # comment',
3156a72cfb80SBram Moolenaar      ])
3157a72cfb80SBram Moolenaar  CheckScriptFailure([
3158a72cfb80SBram Moolenaar      'vim9script',
31599898107fSBram Moolenaar      'function " comment',
31609898107fSBram Moolenaar      ], 'E129:')
31619898107fSBram Moolenaar  CheckScriptFailure([
31629898107fSBram Moolenaar      'vim9script',
3163a72cfb80SBram Moolenaar      'function# comment',
3164f8103f27SBram Moolenaar      ], 'E1144:')
3165a72cfb80SBram Moolenaar  CheckScriptSuccess([
3166a72cfb80SBram Moolenaar      'vim9script',
3167a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
3168a72cfb80SBram Moolenaar      ])
3169a72cfb80SBram Moolenaar  CheckScriptFailure([
3170a72cfb80SBram Moolenaar      'vim9script',
3171a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
3172a72cfb80SBram Moolenaar      ], 'E488:')
3173a72cfb80SBram Moolenaar
3174a72cfb80SBram Moolenaar  CheckScriptSuccess([
3175a72cfb80SBram Moolenaar      'vim9script',
31764c17ad94SBram Moolenaar      'func g:DeleteMeA()',
3177a72cfb80SBram Moolenaar      'endfunc',
31784c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
3179a72cfb80SBram Moolenaar      ])
3180a72cfb80SBram Moolenaar  CheckScriptFailure([
3181a72cfb80SBram Moolenaar      'vim9script',
31824c17ad94SBram Moolenaar      'func g:DeleteMeB()',
3183a72cfb80SBram Moolenaar      'endfunc',
31844c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
3185a72cfb80SBram Moolenaar      ], 'E488:')
3186a72cfb80SBram Moolenaar
3187a72cfb80SBram Moolenaar  CheckScriptSuccess([
3188a72cfb80SBram Moolenaar      'vim9script',
3189a72cfb80SBram Moolenaar      'call execute("ls") # comment',
3190a72cfb80SBram Moolenaar      ])
3191a72cfb80SBram Moolenaar  CheckScriptFailure([
3192a72cfb80SBram Moolenaar      'vim9script',
3193a72cfb80SBram Moolenaar      'call execute("ls")# comment',
3194a72cfb80SBram Moolenaar      ], 'E488:')
3195e7e4838fSBram Moolenaar
3196e7e4838fSBram Moolenaar  CheckScriptFailure([
3197e7e4838fSBram Moolenaar      'def Test() " comment',
3198e7e4838fSBram Moolenaar      'enddef',
3199e7e4838fSBram Moolenaar      ], 'E488:')
3200e7e4838fSBram Moolenaar  CheckScriptFailure([
3201e7e4838fSBram Moolenaar      'vim9script',
3202e7e4838fSBram Moolenaar      'def Test() " comment',
3203e7e4838fSBram Moolenaar      'enddef',
3204e7e4838fSBram Moolenaar      ], 'E488:')
3205e7e4838fSBram Moolenaar
3206e7e4838fSBram Moolenaar  CheckScriptSuccess([
3207e7e4838fSBram Moolenaar      'func Test() " comment',
3208e7e4838fSBram Moolenaar      'endfunc',
32092d870f8dSBram Moolenaar      'delfunc Test',
3210e7e4838fSBram Moolenaar      ])
32119898107fSBram Moolenaar  CheckScriptSuccess([
3212e7e4838fSBram Moolenaar      'vim9script',
3213e7e4838fSBram Moolenaar      'func Test() " comment',
3214e7e4838fSBram Moolenaar      'endfunc',
32159898107fSBram Moolenaar      ])
3216e7e4838fSBram Moolenaar
3217e7e4838fSBram Moolenaar  CheckScriptSuccess([
3218e7e4838fSBram Moolenaar      'def Test() # comment',
3219e7e4838fSBram Moolenaar      'enddef',
3220e7e4838fSBram Moolenaar      ])
3221e7e4838fSBram Moolenaar  CheckScriptFailure([
3222e7e4838fSBram Moolenaar      'func Test() # comment',
3223e7e4838fSBram Moolenaar      'endfunc',
3224e7e4838fSBram Moolenaar      ], 'E488:')
32250f37e356SBram Moolenaar
32260f37e356SBram Moolenaar  var lines =<< trim END
32270f37e356SBram Moolenaar      vim9script
32280f37e356SBram Moolenaar      syn region Text
32290f37e356SBram Moolenaar      \ start='foo'
32300f37e356SBram Moolenaar      #\ comment
32310f37e356SBram Moolenaar      \ end='bar'
32325072b47aSBram Moolenaar      syn region Text start='foo'
32335072b47aSBram Moolenaar      #\ comment
32345072b47aSBram Moolenaar      \ end='bar'
32350f37e356SBram Moolenaar  END
32360f37e356SBram Moolenaar  CheckScriptSuccess(lines)
32370f37e356SBram Moolenaar
32380f37e356SBram Moolenaar  lines =<< trim END
32390f37e356SBram Moolenaar      vim9script
32400f37e356SBram Moolenaar      syn region Text
32410f37e356SBram Moolenaar      \ start='foo'
32420f37e356SBram Moolenaar      "\ comment
32430f37e356SBram Moolenaar      \ end='bar'
32440f37e356SBram Moolenaar  END
32450f37e356SBram Moolenaar  CheckScriptFailure(lines, 'E399:')
32462c5ed4e3SBram Moolenaarenddef
32472c5ed4e3SBram Moolenaar
32482c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
32492c5ed4e3SBram Moolenaar  CheckCanRunGui
32502c5ed4e3SBram Moolenaar
32512c5ed4e3SBram Moolenaar  CheckScriptFailure([
32522c5ed4e3SBram Moolenaar      'vim9script',
32532c5ed4e3SBram Moolenaar      'gui#comment'
3254f8103f27SBram Moolenaar      ], 'E1144:')
32552c5ed4e3SBram Moolenaar  CheckScriptFailure([
32562c5ed4e3SBram Moolenaar      'vim9script',
32572c5ed4e3SBram Moolenaar      'gui -f#comment'
32582c5ed4e3SBram Moolenaar      ], 'E499:')
32597a092245SBram Moolenaarenddef
32607a092245SBram Moolenaar
3261a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
32626797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
32636797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3264a26b9700SBram Moolenaar
3265a26b9700SBram Moolenaar  edit test.vim
3266a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3267a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3268a26b9700SBram Moolenaar
3269a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3270a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3271a26b9700SBram Moolenaar
3272a26b9700SBram Moolenaar  g:entered = 0
3273a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3274a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3275a26b9700SBram Moolenaar
3276a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3277a26b9700SBram Moolenaar
3278a26b9700SBram Moolenaar  au! TabEnter
3279a26b9700SBram Moolenaar  unlet g:entered
3280d72c1bf0SBram Moolenaar
3281d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3282d72c1bf0SBram Moolenaar      'vim9script',
32836797966dSBram Moolenaar      'g:var = 123',
3284e55b1c09SBram Moolenaar      'b:var = 456',
3285e55b1c09SBram Moolenaar      'w:var = 777',
3286e55b1c09SBram Moolenaar      't:var = 888',
3287d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3288d72c1bf0SBram Moolenaar      ])
3289d72c1bf0SBram Moolenaar
3290d72c1bf0SBram Moolenaar  CheckScriptFailure([
3291d72c1bf0SBram Moolenaar      'vim9script',
3292cfcd011fSBram Moolenaar      'let var = 123',
3293cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3294cfcd011fSBram Moolenaar
3295cfcd011fSBram Moolenaar  CheckScriptFailure([
3296cfcd011fSBram Moolenaar      'vim9script',
3297cfcd011fSBram Moolenaar      'var g:var = 123',
3298e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3299e55b1c09SBram Moolenaar
3300e55b1c09SBram Moolenaar  CheckScriptFailure([
3301e55b1c09SBram Moolenaar      'vim9script',
3302cfcd011fSBram Moolenaar      'var b:var = 123',
3303e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3304e55b1c09SBram Moolenaar
3305e55b1c09SBram Moolenaar  CheckScriptFailure([
3306e55b1c09SBram Moolenaar      'vim9script',
3307cfcd011fSBram Moolenaar      'var w:var = 123',
3308e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3309e55b1c09SBram Moolenaar
3310e55b1c09SBram Moolenaar  CheckScriptFailure([
3311e55b1c09SBram Moolenaar      'vim9script',
3312cfcd011fSBram Moolenaar      'var t:var = 123',
3313e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3314e55b1c09SBram Moolenaar
3315e55b1c09SBram Moolenaar  CheckScriptFailure([
3316e55b1c09SBram Moolenaar      'vim9script',
3317cfcd011fSBram Moolenaar      'var v:version = 123',
3318e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3319e55b1c09SBram Moolenaar
3320e55b1c09SBram Moolenaar  CheckScriptFailure([
3321e55b1c09SBram Moolenaar      'vim9script',
3322cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3323e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
33246797966dSBram Moolenaar
33256797966dSBram Moolenaar  CheckScriptFailure([
33266797966dSBram Moolenaar      'vim9script',
33276797966dSBram Moolenaar      'g:var = 123',
332832e35117SBram Moolenaar      'unlet g:var# comment1',
3329d72c1bf0SBram Moolenaar      ], 'E108:')
3330d72c1bf0SBram Moolenaar
3331d72c1bf0SBram Moolenaar  CheckScriptFailure([
3332d72c1bf0SBram Moolenaar      'let g:var = 123',
3333d72c1bf0SBram Moolenaar      'unlet g:var # something',
3334d72c1bf0SBram Moolenaar      ], 'E488:')
3335faac4104SBram Moolenaar
3336faac4104SBram Moolenaar  CheckScriptSuccess([
3337faac4104SBram Moolenaar      'vim9script',
333832e35117SBram Moolenaar      'if 1 # comment2',
3339faac4104SBram Moolenaar      '  echo "yes"',
3340faac4104SBram Moolenaar      'elseif 2 #comment',
3341faac4104SBram Moolenaar      '  echo "no"',
3342faac4104SBram Moolenaar      'endif',
3343faac4104SBram Moolenaar      ])
3344faac4104SBram Moolenaar
3345faac4104SBram Moolenaar  CheckScriptFailure([
3346faac4104SBram Moolenaar      'vim9script',
334732e35117SBram Moolenaar      'if 1# comment3',
3348faac4104SBram Moolenaar      '  echo "yes"',
3349faac4104SBram Moolenaar      'endif',
3350fae55a9cSBram Moolenaar      ], 'E488:')
3351faac4104SBram Moolenaar
3352faac4104SBram Moolenaar  CheckScriptFailure([
3353faac4104SBram Moolenaar      'vim9script',
335432e35117SBram Moolenaar      'if 0 # comment4',
3355faac4104SBram Moolenaar      '  echo "yes"',
3356faac4104SBram Moolenaar      'elseif 2#comment',
3357faac4104SBram Moolenaar      '  echo "no"',
3358faac4104SBram Moolenaar      'endif',
3359fae55a9cSBram Moolenaar      ], 'E488:')
3360faac4104SBram Moolenaar
3361faac4104SBram Moolenaar  CheckScriptSuccess([
3362faac4104SBram Moolenaar      'vim9script',
3363cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3364faac4104SBram Moolenaar      ])
3365faac4104SBram Moolenaar
3366faac4104SBram Moolenaar  CheckScriptFailure([
3367faac4104SBram Moolenaar      'vim9script',
3368cfcd011fSBram Moolenaar      'var v = 1# comment6',
3369fae55a9cSBram Moolenaar      ], 'E488:')
3370faac4104SBram Moolenaar
3371faac4104SBram Moolenaar  CheckScriptSuccess([
3372faac4104SBram Moolenaar      'vim9script',
3373faac4104SBram Moolenaar      'new'
3374d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3375df069eecSBram Moolenaar      ':$',
3376faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3377faac4104SBram Moolenaar      'bwipe!',
3378faac4104SBram Moolenaar      ])
3379faac4104SBram Moolenaar
3380f5be8cdbSBram Moolenaar  CheckScriptFailure([
3381f5be8cdbSBram Moolenaar      'vim9script',
3382f5be8cdbSBram Moolenaar      'new'
3383d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3384f5be8cdbSBram Moolenaar      ':$',
3385f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3386f5be8cdbSBram Moolenaar      'bwipe!',
3387f5be8cdbSBram Moolenaar      ], 'E488:')
3388f5be8cdbSBram Moolenaar
3389f5be8cdbSBram Moolenaar  CheckScriptFailure([
3390f5be8cdbSBram Moolenaar      'vim9script',
3391f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3392f5be8cdbSBram Moolenaar      ], 'E477:')
3393a26b9700SBram Moolenaarenddef
3394a26b9700SBram Moolenaar
33957e5bd91dSBram Moolenaardef Test_finish()
3396cfcd011fSBram Moolenaar  var lines =<< trim END
33977e5bd91dSBram Moolenaar    vim9script
33986797966dSBram Moolenaar    g:res = 'one'
33997e5bd91dSBram Moolenaar    if v:false | finish | endif
34006797966dSBram Moolenaar    g:res = 'two'
34017e5bd91dSBram Moolenaar    finish
34026797966dSBram Moolenaar    g:res = 'three'
34037e5bd91dSBram Moolenaar  END
34047e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
34057e5bd91dSBram Moolenaar  source Xfinished
34067e5bd91dSBram Moolenaar  assert_equal('two', g:res)
34077e5bd91dSBram Moolenaar
34087e5bd91dSBram Moolenaar  unlet g:res
34097e5bd91dSBram Moolenaar  delete('Xfinished')
34107e5bd91dSBram Moolenaarenddef
34117e5bd91dSBram Moolenaar
3412a5d0077eSBram Moolenaardef Test_forward_declaration()
3413cfcd011fSBram Moolenaar  var lines =<< trim END
3414a5d0077eSBram Moolenaar    vim9script
3415a5d0077eSBram Moolenaar    def GetValue(): string
3416a5d0077eSBram Moolenaar      return theVal
3417a5d0077eSBram Moolenaar    enddef
3418cfcd011fSBram Moolenaar    var theVal = 'something'
3419822ba247SBram Moolenaar    g:initVal = GetValue()
3420a5d0077eSBram Moolenaar    theVal = 'else'
3421a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3422a5d0077eSBram Moolenaar  END
3423a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3424a5d0077eSBram Moolenaar  source Xforward
3425a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3426a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3427a5d0077eSBram Moolenaar
3428a5d0077eSBram Moolenaar  unlet g:initVal
3429a5d0077eSBram Moolenaar  unlet g:laterVal
3430a5d0077eSBram Moolenaar  delete('Xforward')
3431a5d0077eSBram Moolenaarenddef
3432a5d0077eSBram Moolenaar
34339721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3434a6294955SBram Moolenaar  var vim9_lines =<< trim END
3435a6294955SBram Moolenaar    vim9script
3436a6294955SBram Moolenaar    var local = 'local'
3437a6294955SBram Moolenaar    g:global = 'global'
3438a6294955SBram Moolenaar    export var exported = 'exported'
3439a6294955SBram Moolenaar    export def GetText(): string
3440a6294955SBram Moolenaar       return 'text'
3441a6294955SBram Moolenaar    enddef
3442a6294955SBram Moolenaar  END
3443a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3444a6294955SBram Moolenaar
3445cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
34469721fb4eSBram Moolenaar    source Xvim9_script.vim
34479721fb4eSBram Moolenaar
34489721fb4eSBram Moolenaar    call assert_false(exists('local'))
34499721fb4eSBram Moolenaar    call assert_false(exists('exported'))
34509721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
34519721fb4eSBram Moolenaar    call assert_equal('global', global)
34529721fb4eSBram Moolenaar    call assert_equal('global', g:global)
34539721fb4eSBram Moolenaar
34549721fb4eSBram Moolenaar    " imported variable becomes script-local
34559721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
34569721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
34579721fb4eSBram Moolenaar    call assert_false(exists('exported'))
34589721fb4eSBram Moolenaar
34599721fb4eSBram Moolenaar    " imported function becomes script-local
34609721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
34619721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
34629721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
34639721fb4eSBram Moolenaar  END
34649721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
34659721fb4eSBram Moolenaar
34669721fb4eSBram Moolenaar  source Xlegacy_script.vim
34679721fb4eSBram Moolenaar  assert_equal('global', g:global)
3468f5be8cdbSBram Moolenaar  unlet g:global
34699721fb4eSBram Moolenaar
34709721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
34719721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
34729721fb4eSBram Moolenaarenddef
3473a5d0077eSBram Moolenaar
3474e535db86SBram Moolenaardef Test_declare_script_in_func()
3475e535db86SBram Moolenaar  var lines =<< trim END
3476e535db86SBram Moolenaar      vim9script
3477e535db86SBram Moolenaar      func Declare()
3478e535db86SBram Moolenaar        let s:local = 123
3479e535db86SBram Moolenaar      endfunc
3480e535db86SBram Moolenaar      Declare()
3481e535db86SBram Moolenaar      assert_equal(123, local)
3482e535db86SBram Moolenaar
3483e535db86SBram Moolenaar      var error: string
3484e535db86SBram Moolenaar      try
3485e535db86SBram Moolenaar        local = 'asdf'
3486e535db86SBram Moolenaar      catch
3487e535db86SBram Moolenaar        error = v:exception
3488e535db86SBram Moolenaar      endtry
3489e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3490e535db86SBram Moolenaar
3491e535db86SBram Moolenaar      lockvar local
3492e535db86SBram Moolenaar      try
3493e535db86SBram Moolenaar        local = 999
3494e535db86SBram Moolenaar      catch
3495e535db86SBram Moolenaar        error = v:exception
3496e535db86SBram Moolenaar      endtry
3497e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3498e535db86SBram Moolenaar  END
3499e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3500e535db86SBram Moolenaarenddef
3501e535db86SBram Moolenaar
3502e535db86SBram Moolenaar
35037d699701SBram Moolenaarfunc Test_vim9script_not_global()
35047d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
35057d699701SBram Moolenaar  let vim9lines =<< trim END
35067d699701SBram Moolenaar    vim9script
3507cfcd011fSBram Moolenaar    var name = 'local'
35087d699701SBram Moolenaar    func TheFunc()
35097d699701SBram Moolenaar      echo 'local'
35107d699701SBram Moolenaar    endfunc
35117d699701SBram Moolenaar    def DefFunc()
35127d699701SBram Moolenaar      echo 'local'
35137d699701SBram Moolenaar    enddef
35147d699701SBram Moolenaar  END
35157d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
35167d699701SBram Moolenaar  source Xvim9script.vim
35177d699701SBram Moolenaar  try
35187d699701SBram Moolenaar    echo g:var
35197d699701SBram Moolenaar    assert_report('did not fail')
35207d699701SBram Moolenaar  catch /E121:/
35217d699701SBram Moolenaar    " caught
35227d699701SBram Moolenaar  endtry
35237d699701SBram Moolenaar  try
35247d699701SBram Moolenaar    call TheFunc()
35257d699701SBram Moolenaar    assert_report('did not fail')
35267d699701SBram Moolenaar  catch /E117:/
35277d699701SBram Moolenaar    " caught
35287d699701SBram Moolenaar  endtry
35297d699701SBram Moolenaar  try
35307d699701SBram Moolenaar    call DefFunc()
35317d699701SBram Moolenaar    assert_report('did not fail')
35327d699701SBram Moolenaar  catch /E117:/
35337d699701SBram Moolenaar    " caught
35347d699701SBram Moolenaar  endtry
35357d699701SBram Moolenaar
353625859dd7SBram Moolenaar  call delete('Xvim9script.vim')
35377d699701SBram Moolenaarendfunc
35387d699701SBram Moolenaar
3539eeb27bfeSBram Moolenaardef Test_vim9_copen()
3540eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3541eeb27bfeSBram Moolenaar  copen
3542eeb27bfeSBram Moolenaar  quit
3543eeb27bfeSBram Moolenaarenddef
3544eeb27bfeSBram Moolenaar
354503290b84SBram Moolenaar" test using an auto-loaded function and variable
35462d6b20d6SBram Moolenaardef Test_vim9_autoload()
3547cfcd011fSBram Moolenaar  var lines =<< trim END
35482d6b20d6SBram Moolenaar     vim9script
354903290b84SBram Moolenaar     def some#gettest(): string
355003290b84SBram Moolenaar       return 'test'
355103290b84SBram Moolenaar     enddef
355203290b84SBram Moolenaar     g:some#name = 'name'
3553227c58a4SBram Moolenaar     g:some#dict = {key: 'value'}
3554e3ffcd99SBram Moolenaar
3555e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3556e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3557e3ffcd99SBram Moolenaar     enddef
355803290b84SBram Moolenaar  END
355903290b84SBram Moolenaar
356003290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
356103290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
356203290b84SBram Moolenaar  var save_rtp = &rtp
356303290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
356403290b84SBram Moolenaar
356503290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
356603290b84SBram Moolenaar  assert_equal('name', g:some#name)
3567227c58a4SBram Moolenaar  assert_equal('value', g:some#dict.key)
356803290b84SBram Moolenaar  g:some#other = 'other'
356903290b84SBram Moolenaar  assert_equal('other', g:some#other)
357003290b84SBram Moolenaar
3571e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3572e3ffcd99SBram Moolenaar
357317f700acSBram Moolenaar  # upper case script name works
357417f700acSBram Moolenaar  lines =<< trim END
357517f700acSBram Moolenaar     vim9script
357617f700acSBram Moolenaar     def Other#getOther(): string
357717f700acSBram Moolenaar       return 'other'
357817f700acSBram Moolenaar     enddef
357917f700acSBram Moolenaar  END
358017f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
358117f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
358217f700acSBram Moolenaar
358303290b84SBram Moolenaar  delete('Xdir', 'rf')
358403290b84SBram Moolenaar  &rtp = save_rtp
358503290b84SBram Moolenaarenddef
358603290b84SBram Moolenaar
358703290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
358803290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
358903290b84SBram Moolenaar  var lines =<< trim END
359003290b84SBram Moolenaar     vim9script
35912d6b20d6SBram Moolenaar     def foo#test()
35922d6b20d6SBram Moolenaar         echomsg getreg('"')
35932d6b20d6SBram Moolenaar     enddef
35942d6b20d6SBram Moolenaar  END
35952d6b20d6SBram Moolenaar
35962d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
35972d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3598cfcd011fSBram Moolenaar  var save_rtp = &rtp
35992d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
36002d6b20d6SBram Moolenaar  augroup test
36012d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
36022d6b20d6SBram Moolenaar  augroup END
36032d6b20d6SBram Moolenaar
36042d6b20d6SBram Moolenaar  normal Y
36052d6b20d6SBram Moolenaar
36062d6b20d6SBram Moolenaar  augroup test
36072d6b20d6SBram Moolenaar    autocmd!
36082d6b20d6SBram Moolenaar  augroup END
36092d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
36102d6b20d6SBram Moolenaar  &rtp = save_rtp
36112d6b20d6SBram Moolenaarenddef
36122d6b20d6SBram Moolenaar
361377e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
361477e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3615cfcd011fSBram Moolenaar  var lines =<< trim END
361677e5dcc3SBram Moolenaar      vim9script
361777e5dcc3SBram Moolenaar      def crash#func()
361877e5dcc3SBram Moolenaar          try
361977e5dcc3SBram Moolenaar              for x in List()
362077e5dcc3SBram Moolenaar              endfor
362177e5dcc3SBram Moolenaar          catch
362277e5dcc3SBram Moolenaar          endtry
362377e5dcc3SBram Moolenaar          g:ok = true
362477e5dcc3SBram Moolenaar      enddef
362577e5dcc3SBram Moolenaar      fu List()
362677e5dcc3SBram Moolenaar          invalid
362777e5dcc3SBram Moolenaar      endfu
362877e5dcc3SBram Moolenaar      try
362948e11c10SBram Moolenaar          alsoinvalid
363077e5dcc3SBram Moolenaar      catch /wontmatch/
363177e5dcc3SBram Moolenaar      endtry
363277e5dcc3SBram Moolenaar  END
363377e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
363477e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
363577e5dcc3SBram Moolenaar
363677e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
363777e5dcc3SBram Moolenaar  lines =<< trim END
363877e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
363977e5dcc3SBram Moolenaar    call crash#func()
364077e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
36419c4f5520SBram Moolenaar    qall!
364277e5dcc3SBram Moolenaar  END
364377e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
364477e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
364577e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
364677e5dcc3SBram Moolenaar
364777e5dcc3SBram Moolenaar  delete('Xdidit')
364877e5dcc3SBram Moolenaar  delete('Xscript')
364977e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
365003290b84SBram Moolenaar
365103290b84SBram Moolenaar  lines =<< trim END
365203290b84SBram Moolenaar    vim9script
365303290b84SBram Moolenaar    var foo#bar = 'asdf'
365403290b84SBram Moolenaar  END
365503290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
365677e5dcc3SBram Moolenaarenddef
365777e5dcc3SBram Moolenaar
365881e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
365981e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
366081e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3661cfcd011fSBram Moolenaar  var lines =<< trim END
366281e17fbeSBram Moolenaar    let s:counter = 1
366381e17fbeSBram Moolenaar    def s:Func()
366481e17fbeSBram Moolenaar      au! CursorHold
366581e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
366681e17fbeSBram Moolenaar    enddef
366781e17fbeSBram Moolenaar    call s:Func()
366881e17fbeSBram Moolenaar    doau CursorHold
366981e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
367081e17fbeSBram Moolenaar    au! CursorHold
367181e17fbeSBram Moolenaar  END
367281e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
367381e17fbeSBram Moolenaarenddef
367481e17fbeSBram Moolenaar
3675b5841b99SBram Moolenaardef Test_error_in_autoload_script()
3676b5841b99SBram Moolenaar  var save_rtp = &rtp
3677b5841b99SBram Moolenaar  var dir = getcwd() .. '/Xruntime'
3678b5841b99SBram Moolenaar  &rtp = dir
3679b5841b99SBram Moolenaar  mkdir(dir .. '/autoload', 'p')
3680b5841b99SBram Moolenaar
3681b5841b99SBram Moolenaar  var lines =<< trim END
3682b5841b99SBram Moolenaar      vim9script noclear
3683b5841b99SBram Moolenaar      def script#autoloaded()
3684b5841b99SBram Moolenaar      enddef
3685b5841b99SBram Moolenaar      def Broken()
3686b5841b99SBram Moolenaar        var x: any = ''
3687b5841b99SBram Moolenaar        eval x != 0
3688b5841b99SBram Moolenaar      enddef
3689b5841b99SBram Moolenaar      Broken()
3690b5841b99SBram Moolenaar  END
3691b5841b99SBram Moolenaar  writefile(lines, dir .. '/autoload/script.vim')
3692b5841b99SBram Moolenaar
3693b5841b99SBram Moolenaar  lines =<< trim END
3694b5841b99SBram Moolenaar      vim9script
3695b5841b99SBram Moolenaar      def CallAutoloaded()
3696b5841b99SBram Moolenaar        script#autoloaded()
3697b5841b99SBram Moolenaar      enddef
3698b5841b99SBram Moolenaar
3699b5841b99SBram Moolenaar      function Legacy()
3700b5841b99SBram Moolenaar        try
3701b5841b99SBram Moolenaar          call s:CallAutoloaded()
3702b5841b99SBram Moolenaar        catch
3703b5841b99SBram Moolenaar          call assert_match('E1030: Using a String as a Number', v:exception)
3704b5841b99SBram Moolenaar        endtry
3705b5841b99SBram Moolenaar      endfunction
3706b5841b99SBram Moolenaar
3707b5841b99SBram Moolenaar      Legacy()
3708b5841b99SBram Moolenaar  END
3709b5841b99SBram Moolenaar  CheckScriptSuccess(lines)
3710b5841b99SBram Moolenaar
3711b5841b99SBram Moolenaar  &rtp = save_rtp
3712b5841b99SBram Moolenaar  delete(dir, 'rf')
3713b5841b99SBram Moolenaarenddef
3714b5841b99SBram Moolenaar
37153896a105SBram Moolenaardef Test_cmdline_win()
37163896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
37173896a105SBram Moolenaar  # the command line window.
37183896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3719cfcd011fSBram Moolenaar  var export_lines =<< trim END
37203896a105SBram Moolenaar    vim9script
3721cfcd011fSBram Moolenaar    export var That = 'yes'
37223896a105SBram Moolenaar  END
37233896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3724cfcd011fSBram Moolenaar  var import_lines =<< trim END
37253896a105SBram Moolenaar    vim9script
37263896a105SBram Moolenaar    import That from './Xexport.vim'
37273896a105SBram Moolenaar  END
37283896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3729cfcd011fSBram Moolenaar  var save_rtp = &rtp
37303896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
37313896a105SBram Moolenaar  syntax on
37323896a105SBram Moolenaar  augroup CmdWin
37333896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
37343896a105SBram Moolenaar  augroup END
37353896a105SBram Moolenaar  # this will open and also close the cmdline window
37363896a105SBram Moolenaar  feedkeys('q:', 'xt')
37373896a105SBram Moolenaar  assert_equal('yes', g:got_there)
37383896a105SBram Moolenaar
37393896a105SBram Moolenaar  augroup CmdWin
37403896a105SBram Moolenaar    au!
37413896a105SBram Moolenaar  augroup END
37423896a105SBram Moolenaar  &rtp = save_rtp
37433896a105SBram Moolenaar  delete('rtp', 'rf')
37443896a105SBram Moolenaarenddef
37453896a105SBram Moolenaar
3746e3d4685fSBram Moolenaardef Test_invalid_sid()
3747e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
374825859dd7SBram Moolenaar
37499c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3750d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3751e3d4685fSBram Moolenaar  endif
3752e3d4685fSBram Moolenaar  delete('Xdidit')
3753e3d4685fSBram Moolenaarenddef
3754e3d4685fSBram Moolenaar
37559ec7026fSBram Moolenaardef Test_restoring_cpo()
37569ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
37579ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
37589ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
37599ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
37609ec7026fSBram Moolenaar  endif
37619ec7026fSBram Moolenaar  delete('Xsourced')
37629ec7026fSBram Moolenaar  delete('Xclose')
3763090728adSBram Moolenaar  delete('Xdone')
37640123cc1eSBram Moolenaar
37650123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
37660123cc1eSBram Moolenaar  set cpo=aABceFsMny>
37670123cc1eSBram Moolenaar  edit XanotherScript
37680123cc1eSBram Moolenaar  so %
37690123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
37700123cc1eSBram Moolenaar  :1del
37710123cc1eSBram Moolenaar  w
37720123cc1eSBram Moolenaar  so %
37730123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
37740123cc1eSBram Moolenaar
37750123cc1eSBram Moolenaar  delete('XanotherScript')
37760123cc1eSBram Moolenaar  set cpo&vim
37779ec7026fSBram Moolenaarenddef
37789ec7026fSBram Moolenaar
3779ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3780ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
378137294bd6SBram Moolenaar  CheckScreendump
3782ffb7dcdbSBram Moolenaar  CheckFeature timers
378337294bd6SBram Moolenaar
3784ffb7dcdbSBram Moolenaar  let lines =<< trim END
378537294bd6SBram Moolenaar    vim9script
378637294bd6SBram Moolenaar    def script#func()
378737294bd6SBram Moolenaar    enddef
378837294bd6SBram Moolenaar  END
3789ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3790ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
379137294bd6SBram Moolenaar
3792ffb7dcdbSBram Moolenaar  let lines =<< trim END
379337294bd6SBram Moolenaar      vim9script
379437294bd6SBram Moolenaar      set cpo+=M
379537294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
3796767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
379737294bd6SBram Moolenaar      setline(1, 'some text')
379837294bd6SBram Moolenaar  END
3799ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3800ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3801ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3802ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
380337294bd6SBram Moolenaar
3804ffb7dcdbSBram Moolenaar  " clean up
3805ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3806ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3807ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3808ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3809ffb7dcdbSBram Moolenaarendfunc
381037294bd6SBram Moolenaar
38119ec7026fSBram Moolenaar
3812f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3813cfcd011fSBram Moolenaar  var lines =<< trim END
3814cfcd011fSBram Moolenaar    var name: any
3815cfcd011fSBram Moolenaar    assert_equal(0, name)
3816f0afd9e1SBram Moolenaar  END
3817f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3818f0afd9e1SBram Moolenaarenddef
3819f0afd9e1SBram Moolenaar
38207e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
382158dbef33SBram Moolenaar  CheckRunVimInTerminal
382258dbef33SBram Moolenaar
38237e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
38247e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
38257e9210eaSBram Moolenaarendfunc
38267e9210eaSBram Moolenaar
38277e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
38289c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3829cfcd011fSBram Moolenaar  var lines =<< trim END
38309c4f5520SBram Moolenaar    func CheckAndQuit()
38319c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
38329c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
38339c4f5520SBram Moolenaar    endfunc
38349c4f5520SBram Moolenaar  END
38359c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
38369c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3837e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
38389c4f5520SBram Moolenaar  # define Afunc() on the command line
38399c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
38409c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
38412949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
38429c4f5520SBram Moolenaar
38439c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
38449c4f5520SBram Moolenaar  delete('XcallFunc')
38459c4f5520SBram Moolenaar  delete('Xdidcmd')
38469c4f5520SBram Moolenaarenddef
38479c4f5520SBram Moolenaar
3848fcdc5d83SBram Moolenaardef Test_script_var_scope()
3849fcdc5d83SBram Moolenaar  var lines =<< trim END
3850fcdc5d83SBram Moolenaar      vim9script
3851fcdc5d83SBram Moolenaar      if true
3852fcdc5d83SBram Moolenaar        if true
3853fcdc5d83SBram Moolenaar          var one = 'one'
3854fcdc5d83SBram Moolenaar          echo one
3855fcdc5d83SBram Moolenaar        endif
3856fcdc5d83SBram Moolenaar        echo one
3857fcdc5d83SBram Moolenaar      endif
3858fcdc5d83SBram Moolenaar  END
3859fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3860fcdc5d83SBram Moolenaar
3861fcdc5d83SBram Moolenaar  lines =<< trim END
3862fcdc5d83SBram Moolenaar      vim9script
3863fcdc5d83SBram Moolenaar      if true
3864fcdc5d83SBram Moolenaar        if false
3865fcdc5d83SBram Moolenaar          var one = 'one'
3866fcdc5d83SBram Moolenaar          echo one
3867fcdc5d83SBram Moolenaar        else
3868fcdc5d83SBram Moolenaar          var one = 'one'
3869fcdc5d83SBram Moolenaar          echo one
3870fcdc5d83SBram Moolenaar        endif
3871fcdc5d83SBram Moolenaar        echo one
3872fcdc5d83SBram Moolenaar      endif
3873fcdc5d83SBram Moolenaar  END
3874fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3875fcdc5d83SBram Moolenaar
3876fcdc5d83SBram Moolenaar  lines =<< trim END
3877fcdc5d83SBram Moolenaar      vim9script
3878fcdc5d83SBram Moolenaar      while true
3879fcdc5d83SBram Moolenaar        var one = 'one'
3880fcdc5d83SBram Moolenaar        echo one
3881fcdc5d83SBram Moolenaar        break
3882fcdc5d83SBram Moolenaar      endwhile
3883fcdc5d83SBram Moolenaar      echo one
3884fcdc5d83SBram Moolenaar  END
3885fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3886fcdc5d83SBram Moolenaar
3887fcdc5d83SBram Moolenaar  lines =<< trim END
3888fcdc5d83SBram Moolenaar      vim9script
3889fcdc5d83SBram Moolenaar      for i in range(1)
3890fcdc5d83SBram Moolenaar        var one = 'one'
3891fcdc5d83SBram Moolenaar        echo one
3892fcdc5d83SBram Moolenaar      endfor
3893fcdc5d83SBram Moolenaar      echo one
3894fcdc5d83SBram Moolenaar  END
3895fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
38969becdf2bSBram Moolenaar
38979becdf2bSBram Moolenaar  lines =<< trim END
38989becdf2bSBram Moolenaar      vim9script
38999becdf2bSBram Moolenaar      {
39009becdf2bSBram Moolenaar        var one = 'one'
39019becdf2bSBram Moolenaar        assert_equal('one', one)
39029becdf2bSBram Moolenaar      }
39039becdf2bSBram Moolenaar      assert_false(exists('one'))
39049becdf2bSBram Moolenaar      assert_false(exists('s:one'))
39059becdf2bSBram Moolenaar  END
39069becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
39079becdf2bSBram Moolenaar
39089becdf2bSBram Moolenaar  lines =<< trim END
39099becdf2bSBram Moolenaar      vim9script
39109becdf2bSBram Moolenaar      {
39119becdf2bSBram Moolenaar        var one = 'one'
39129becdf2bSBram Moolenaar        echo one
39139becdf2bSBram Moolenaar      }
39149becdf2bSBram Moolenaar      echo one
39159becdf2bSBram Moolenaar  END
39169becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3917fcdc5d83SBram Moolenaarenddef
3918fcdc5d83SBram Moolenaar
3919352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3920352134bbSBram Moolenaar  var lines =<< trim END
3921352134bbSBram Moolenaar    vim9script
39222a38908bSBram Moolenaar    def Callback(...l: list<any>)
3923352134bbSBram Moolenaar      try
3924352134bbSBram Moolenaar        var x: string
3925352134bbSBram Moolenaar        var y: string
3926352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3927352134bbSBram Moolenaar        [x, y] = ['']
3928352134bbSBram Moolenaar      catch
3929352134bbSBram Moolenaar        g:caught = 'yes'
3930352134bbSBram Moolenaar      endtry
3931352134bbSBram Moolenaar    enddef
3932e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3933352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3934352134bbSBram Moolenaar  END
3935352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3936352134bbSBram Moolenaar
3937352134bbSBram Moolenaar  unlet g:caught
3938352134bbSBram Moolenaarenddef
3939352134bbSBram Moolenaar
3940631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3941631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3942631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3943631e8f93SBram Moolenaar  endif
3944631e8f93SBram Moolenaar  var lines =<< trim END
3945631e8f93SBram Moolenaar      vim9script
3946631e8f93SBram Moolenaar      var source: list<number>
39472a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
3948631e8f93SBram Moolenaar          eval [][0]
3949631e8f93SBram Moolenaar      enddef
39502a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
3951631e8f93SBram Moolenaar          sleep 1m
3952631e8f93SBram Moolenaar          source += l
3953631e8f93SBram Moolenaar      enddef
3954e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
39556f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
39566f17a3f0SBram Moolenaar        sleep 10m
39576f17a3f0SBram Moolenaar      endwhile
3958206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3959fe95b94fSBram Moolenaar      sleep 200m
3960631e8f93SBram Moolenaar  END
3961631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3962631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3963631e8f93SBram Moolenaar  delete('Xdef')
3964631e8f93SBram Moolenaarenddef
3965631e8f93SBram Moolenaar
39664324d87aSBram Moolenaardef InvokeNormal()
39674324d87aSBram Moolenaar  exe "norm! :m+1\r"
39684324d87aSBram Moolenaarenddef
39694324d87aSBram Moolenaar
39704324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
39714324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
39724324d87aSBram Moolenaar  new
39734324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
39744324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
39754324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
39764324d87aSBram Moolenaar  xunmap <F3>
3977b5b9480eSBram Moolenaarenddef
3978b5b9480eSBram Moolenaar
3979b5b9480eSBram Moolenaardef Test_white_space_after_command()
3980b5b9480eSBram Moolenaar  var lines =<< trim END
3981b5b9480eSBram Moolenaar    exit_cb: Func})
3982b5b9480eSBram Moolenaar  END
3983b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3984f8103f27SBram Moolenaar
3985f8103f27SBram Moolenaar  lines =<< trim END
3986f8103f27SBram Moolenaar    e#
3987f8103f27SBram Moolenaar  END
3988f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
39894324d87aSBram Moolenaarenddef
39904324d87aSBram Moolenaar
39914aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
39924aab88d9SBram Moolenaar  var lines =<< trim END
39934aab88d9SBram Moolenaar      vim9script
39944aab88d9SBram Moolenaar      if exists('g:guard')
39954aab88d9SBram Moolenaar        finish
39964aab88d9SBram Moolenaar      endif
39974aab88d9SBram Moolenaar      g:guard = 1
39984aab88d9SBram Moolenaar      var name = 'thename'
39994aab88d9SBram Moolenaar      def g:GetName(): string
40004aab88d9SBram Moolenaar        return name
40014aab88d9SBram Moolenaar      enddef
40024aab88d9SBram Moolenaar      def g:SetName(arg: string)
40034aab88d9SBram Moolenaar        name = arg
40044aab88d9SBram Moolenaar      enddef
40054aab88d9SBram Moolenaar  END
40064aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
40074aab88d9SBram Moolenaar  so XscriptTwice.vim
40084aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
40094aab88d9SBram Moolenaar  g:SetName('newname')
40104aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
40114aab88d9SBram Moolenaar  so XscriptTwice.vim
40124aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
40134aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
40144aab88d9SBram Moolenaar
40154aab88d9SBram Moolenaar  delfunc g:GetName
40164aab88d9SBram Moolenaar  delfunc g:SetName
40174aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
40184aab88d9SBram Moolenaar  unlet g:guard
40194aab88d9SBram Moolenaarenddef
40204aab88d9SBram Moolenaar
40214aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
40224aab88d9SBram Moolenaar  var exportlines =<< trim END
40234aab88d9SBram Moolenaar      vim9script
40244aab88d9SBram Moolenaar      if exists('g:guard')
40254aab88d9SBram Moolenaar        finish
40264aab88d9SBram Moolenaar      endif
40274aab88d9SBram Moolenaar      g:guard = 1
40284aab88d9SBram Moolenaar      export var name = 'someName'
40294aab88d9SBram Moolenaar  END
40304aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
40314aab88d9SBram Moolenaar
40324aab88d9SBram Moolenaar  var lines =<< trim END
40334aab88d9SBram Moolenaar      vim9script
40344aab88d9SBram Moolenaar      import name from './XexportScript.vim'
40354aab88d9SBram Moolenaar      def g:GetName(): string
40364aab88d9SBram Moolenaar        return name
40374aab88d9SBram Moolenaar      enddef
40384aab88d9SBram Moolenaar  END
40394aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
40404aab88d9SBram Moolenaar  so XscriptImport.vim
40414aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
40424aab88d9SBram Moolenaar
40434aab88d9SBram Moolenaar  so XexportScript.vim
40444aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
40454aab88d9SBram Moolenaar
40464aab88d9SBram Moolenaar  delfunc g:GetName
40474aab88d9SBram Moolenaar  delete('XexportScript.vim')
40484aab88d9SBram Moolenaar  delete('XscriptImport.vim')
40494aab88d9SBram Moolenaar  unlet g:guard
40504aab88d9SBram Moolenaarenddef
40514aab88d9SBram Moolenaar
405210b9421fSBram Moolenaardef Test_unsupported_commands()
405310b9421fSBram Moolenaar  var lines =<< trim END
405410b9421fSBram Moolenaar      ka
405510b9421fSBram Moolenaar  END
40567d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
40577d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
405810b9421fSBram Moolenaar
405910b9421fSBram Moolenaar  lines =<< trim END
4060ada1d870SBram Moolenaar      :1ka
4061ada1d870SBram Moolenaar  END
40627d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
40637d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
4064ada1d870SBram Moolenaar
4065ada1d870SBram Moolenaar  lines =<< trim END
406610b9421fSBram Moolenaar    t
406710b9421fSBram Moolenaar  END
406810b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
406910b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
407010b9421fSBram Moolenaar
407110b9421fSBram Moolenaar  lines =<< trim END
407210b9421fSBram Moolenaar    x
407310b9421fSBram Moolenaar  END
407410b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
407510b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
407610b9421fSBram Moolenaar
407710b9421fSBram Moolenaar  lines =<< trim END
407810b9421fSBram Moolenaar    xit
407910b9421fSBram Moolenaar  END
408010b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
408110b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
408210b9421fSBram Moolenaarenddef
408310b9421fSBram Moolenaar
4084c70fe460SBram Moolenaardef Test_mapping_line_number()
4085c70fe460SBram Moolenaar  var lines =<< trim END
4086c70fe460SBram Moolenaar      vim9script
4087c70fe460SBram Moolenaar      def g:FuncA()
4088c70fe460SBram Moolenaar          # Some comment
4089c70fe460SBram Moolenaar          FuncB(0)
4090c70fe460SBram Moolenaar      enddef
4091c70fe460SBram Moolenaar          # Some comment
4092c70fe460SBram Moolenaar      def FuncB(
4093c70fe460SBram Moolenaar          # Some comment
4094c70fe460SBram Moolenaar          n: number
4095c70fe460SBram Moolenaar      )
4096c70fe460SBram Moolenaar          exe 'nno '
4097c70fe460SBram Moolenaar              # Some comment
4098c70fe460SBram Moolenaar              .. '<F3> a'
4099c70fe460SBram Moolenaar              .. 'b'
4100c70fe460SBram Moolenaar              .. 'c'
4101c70fe460SBram Moolenaar      enddef
4102c70fe460SBram Moolenaar  END
4103c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
4104c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
4105c70fe460SBram Moolenaar  assert_match('No mapping found', res)
4106c70fe460SBram Moolenaar
4107c70fe460SBram Moolenaar  g:FuncA()
4108c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
4109c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4110c70fe460SBram Moolenaar
4111c70fe460SBram Moolenaar  nunmap <F3>
4112c70fe460SBram Moolenaar  delfunc g:FuncA
4113c70fe460SBram Moolenaarenddef
4114c70fe460SBram Moolenaar
4115deb108baSBram Moolenaardef Test_option_set()
4116deb108baSBram Moolenaar  # legacy script allows for white space
4117deb108baSBram Moolenaar  var lines =<< trim END
4118deb108baSBram Moolenaar      set foldlevel  =11
4119deb108baSBram Moolenaar      call assert_equal(11, &foldlevel)
4120deb108baSBram Moolenaar  END
4121deb108baSBram Moolenaar  CheckScriptSuccess(lines)
4122deb108baSBram Moolenaar
4123deb108baSBram Moolenaar  set foldlevel
4124deb108baSBram Moolenaar  set foldlevel=12
4125deb108baSBram Moolenaar  assert_equal(12, &foldlevel)
4126deb108baSBram Moolenaar  set foldlevel+=2
4127deb108baSBram Moolenaar  assert_equal(14, &foldlevel)
4128deb108baSBram Moolenaar  set foldlevel-=3
4129deb108baSBram Moolenaar  assert_equal(11, &foldlevel)
4130deb108baSBram Moolenaar
4131deb108baSBram Moolenaar  lines =<< trim END
4132deb108baSBram Moolenaar      set foldlevel =1
4133deb108baSBram Moolenaar  END
4134deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
4135deb108baSBram Moolenaar
4136deb108baSBram Moolenaar  lines =<< trim END
4137deb108baSBram Moolenaar      set foldlevel +=1
4138deb108baSBram Moolenaar  END
4139deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
4140deb108baSBram Moolenaar
4141deb108baSBram Moolenaar  lines =<< trim END
4142deb108baSBram Moolenaar      set foldlevel ^=1
4143deb108baSBram Moolenaar  END
4144deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
4145deb108baSBram Moolenaar
4146deb108baSBram Moolenaar  lines =<< trim END
4147deb108baSBram Moolenaar      set foldlevel -=1
4148deb108baSBram Moolenaar  END
4149deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
4150deb108baSBram Moolenaar
4151deb108baSBram Moolenaar  set foldlevel&
4152deb108baSBram Moolenaarenddef
4153deb108baSBram Moolenaar
4154208f0b48SBram Moolenaardef Test_option_modifier()
41551594f313SBram Moolenaar  # legacy script allows for white space
4156208f0b48SBram Moolenaar  var lines =<< trim END
4157208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
4158208f0b48SBram Moolenaar      call assert_equal(1, &hlsearch)
4159208f0b48SBram Moolenaar  END
4160208f0b48SBram Moolenaar  CheckScriptSuccess(lines)
4161208f0b48SBram Moolenaar
41621594f313SBram Moolenaar  set hlsearch
41631594f313SBram Moolenaar  set hlsearch!
41641594f313SBram Moolenaar  assert_equal(false, &hlsearch)
41651594f313SBram Moolenaar
41661594f313SBram Moolenaar  set hlsearch
4167208f0b48SBram Moolenaar  set hlsearch&
41681594f313SBram Moolenaar  assert_equal(false, &hlsearch)
4169208f0b48SBram Moolenaar
4170208f0b48SBram Moolenaar  lines =<< trim END
41711594f313SBram Moolenaar      set hlsearch &
4172208f0b48SBram Moolenaar  END
41731594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
41741594f313SBram Moolenaar
41751594f313SBram Moolenaar  lines =<< trim END
41761594f313SBram Moolenaar      set hlsearch   !
41771594f313SBram Moolenaar  END
41781594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
41791594f313SBram Moolenaar
41801594f313SBram Moolenaar  set hlsearch&
4181208f0b48SBram Moolenaarenddef
4182208f0b48SBram Moolenaar
4183c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail
4184c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number()
4185c03fe66aSBram Moolenaar  var lines =<< trim END
4186c03fe66aSBram Moolenaar      echoerr 'some'
4187c03fe66aSBram Moolenaar         .. ' error'
4188c03fe66aSBram Moolenaar         .. ' continued'
4189c03fe66aSBram Moolenaar  END
4190c03fe66aSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
4191c03fe66aSBram Moolenaarenddef
4192c03fe66aSBram Moolenaar
4193648594eaSBram Moolenaardef ProfiledWithLambda()
4194d9162550SBram Moolenaar  var n = 3
4195d9162550SBram Moolenaar  echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4196d9162550SBram Moolenaarenddef
4197d9162550SBram Moolenaar
4198648594eaSBram Moolenaardef ProfiledNested()
4199648594eaSBram Moolenaar  var x = 0
4200648594eaSBram Moolenaar  def Nested(): any
4201648594eaSBram Moolenaar      return x
4202648594eaSBram Moolenaar  enddef
4203648594eaSBram Moolenaar  Nested()
4204648594eaSBram Moolenaarenddef
4205648594eaSBram Moolenaar
4206ffcfddc7SBram Moolenaardef ProfiledNestedProfiled()
4207ffcfddc7SBram Moolenaar  var x = 0
4208ffcfddc7SBram Moolenaar  def Nested(): any
4209ffcfddc7SBram Moolenaar      return x
4210ffcfddc7SBram Moolenaar  enddef
4211ffcfddc7SBram Moolenaar  Nested()
4212ffcfddc7SBram Moolenaarenddef
4213ffcfddc7SBram Moolenaar
4214d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists.
4215d9162550SBram Moolenaar" This only tests that it works, not the profiling output.
4216d9162550SBram Moolenaardef Test_xx_profile_with_lambda()
42174ece152aSBram Moolenaar  CheckFeature profile
42184ece152aSBram Moolenaar
4219d9162550SBram Moolenaar  profile start Xprofile.log
4220648594eaSBram Moolenaar  profile func ProfiledWithLambda
4221648594eaSBram Moolenaar  ProfiledWithLambda()
4222ffcfddc7SBram Moolenaar
4223648594eaSBram Moolenaar  profile func ProfiledNested
4224648594eaSBram Moolenaar  ProfiledNested()
4225ffcfddc7SBram Moolenaar
4226ffcfddc7SBram Moolenaar  # Also profile the nested function.  Use a different function, although the
4227ffcfddc7SBram Moolenaar  # contents is the same, to make sure it was not already compiled.
4228ffcfddc7SBram Moolenaar  profile func *
4229ffcfddc7SBram Moolenaar  ProfiledNestedProfiled()
4230ffcfddc7SBram Moolenaar
4231ffcfddc7SBram Moolenaar  profdel func *
4232ffcfddc7SBram Moolenaar  profile pause
4233d9162550SBram Moolenaarenddef
4234d9162550SBram Moolenaar
4235585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
4236585fea7bSBram Moolenaardef Test_substitute_cmd()
4237585fea7bSBram Moolenaar  new
4238585fea7bSBram Moolenaar  setline(1, 'something')
4239585fea7bSBram Moolenaar  :substitute(some(other(
4240585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
4241585fea7bSBram Moolenaar  bwipe!
4242585fea7bSBram Moolenaar
4243f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
4244cfcd011fSBram Moolenaar  var lines =<< trim END
4245585fea7bSBram Moolenaar    vim9script
4246585fea7bSBram Moolenaar    new
4247585fea7bSBram Moolenaar    setline(1, 'something')
4248585fea7bSBram Moolenaar    :substitute(some(other(
4249585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
4250585fea7bSBram Moolenaar    bwipe!
4251585fea7bSBram Moolenaar  END
4252585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
4253585fea7bSBram Moolenaar  source Xvim9lines
4254585fea7bSBram Moolenaar
4255585fea7bSBram Moolenaar  delete('Xvim9lines')
4256585fea7bSBram Moolenaarenddef
4257585fea7bSBram Moolenaar
42588a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
4259