18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
7e3d4685fSBram Moolenaarsource shared.vim
837294bd6SBram Moolenaarsource screendump.vim
98a7d6542SBram Moolenaar
105d72ce69SBram Moolenaardef Test_range_only()
115d72ce69SBram Moolenaar  new
125d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
135d72ce69SBram Moolenaar  :/Blah/
145d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
15c2af0affSBram Moolenaar  bwipe!
16c2af0affSBram Moolenaar
17c2af0affSBram Moolenaar  # without range commands use current line
18c2af0affSBram Moolenaar  new
19c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
20c2af0affSBram Moolenaar  :2
21c2af0affSBram Moolenaar  print
22c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
23c2af0affSBram Moolenaar  :3
24c2af0affSBram Moolenaar  list
25c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
26b8554304SBram Moolenaar
27b8554304SBram Moolenaar  # missing command does not print the line
28b8554304SBram Moolenaar  var lines =<< trim END
29b8554304SBram Moolenaar    vim9script
30b8554304SBram Moolenaar    :1|
31b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
32b8554304SBram Moolenaar    :|
33b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
34b8554304SBram Moolenaar  END
35b8554304SBram Moolenaar  CheckScriptSuccess(lines)
36b8554304SBram Moolenaar
37c2af0affSBram Moolenaar  bwipe!
38025cb1caSBram Moolenaar
39025cb1caSBram Moolenaar  # won't generate anything
40025cb1caSBram Moolenaar  if false
41025cb1caSBram Moolenaar    :123
42025cb1caSBram Moolenaar  endif
435d72ce69SBram Moolenaarenddef
445d72ce69SBram Moolenaar
45a6e67e4fSBram Moolenaarlet g:alist = [7]
46a6e67e4fSBram Moolenaarlet g:astring = 'text'
47f0b9f43cSBram Moolenaarlet g:anumber = 123
486e587dcbSBram Moolenaar
494c17ad94SBram Moolenaardef Test_delfunction()
50f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
514c17ad94SBram Moolenaar  CheckScriptSuccess([
524c17ad94SBram Moolenaar      'vim9script',
534c17ad94SBram Moolenaar      'func CheckMe()',
544c17ad94SBram Moolenaar      '  return 123',
554c17ad94SBram Moolenaar      'endfunc',
564c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
574c17ad94SBram Moolenaar      ])
584c17ad94SBram Moolenaar
59f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
604c17ad94SBram Moolenaar  CheckScriptFailure([
614c17ad94SBram Moolenaar      'vim9script',
624c17ad94SBram Moolenaar      'func DeleteMe1()',
634c17ad94SBram Moolenaar      'endfunc',
644c17ad94SBram Moolenaar      'delfunction DeleteMe1',
654c17ad94SBram Moolenaar      ], 'E1084:')
664c17ad94SBram Moolenaar  CheckScriptFailure([
674c17ad94SBram Moolenaar      'vim9script',
684c17ad94SBram Moolenaar      'func DeleteMe2()',
694c17ad94SBram Moolenaar      'endfunc',
704c17ad94SBram Moolenaar      'def DoThat()',
714c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
724c17ad94SBram Moolenaar      'enddef',
734c17ad94SBram Moolenaar      'DoThat()',
744c17ad94SBram Moolenaar      ], 'E1084:')
754c17ad94SBram Moolenaar  CheckScriptFailure([
764c17ad94SBram Moolenaar      'vim9script',
774c17ad94SBram Moolenaar      'def DeleteMe3()',
784c17ad94SBram Moolenaar      'enddef',
794c17ad94SBram Moolenaar      'delfunction DeleteMe3',
804c17ad94SBram Moolenaar      ], 'E1084:')
814c17ad94SBram Moolenaar  CheckScriptFailure([
824c17ad94SBram Moolenaar      'vim9script',
834c17ad94SBram Moolenaar      'def DeleteMe4()',
844c17ad94SBram Moolenaar      'enddef',
854c17ad94SBram Moolenaar      'def DoThat()',
864c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
874c17ad94SBram Moolenaar      'enddef',
884c17ad94SBram Moolenaar      'DoThat()',
894c17ad94SBram Moolenaar      ], 'E1084:')
90925e9fd6SBram Moolenaar
91925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
92cfcd011fSBram Moolenaar  var lines =<< trim END
93925e9fd6SBram Moolenaar      vim9script
94925e9fd6SBram Moolenaar      def g:Global(): string
95925e9fd6SBram Moolenaar        return "yes"
96925e9fd6SBram Moolenaar      enddef
97925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
98925e9fd6SBram Moolenaar      def! g:Global(): string
99925e9fd6SBram Moolenaar        return "no"
100925e9fd6SBram Moolenaar      enddef
101925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
102925e9fd6SBram Moolenaar      delfunc g:Global
103925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
104925e9fd6SBram Moolenaar  END
105925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
106925e9fd6SBram Moolenaar
107925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
108925e9fd6SBram Moolenaar  lines =<< trim END
109925e9fd6SBram Moolenaar      vim9script
110925e9fd6SBram Moolenaar      func g:Global()
111925e9fd6SBram Moolenaar        return "yes"
112925e9fd6SBram Moolenaar      endfunc
113925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
114925e9fd6SBram Moolenaar      def! g:Global(): string
115925e9fd6SBram Moolenaar        return "no"
116925e9fd6SBram Moolenaar      enddef
117925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
118925e9fd6SBram Moolenaar      delfunc g:Global
119925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
120925e9fd6SBram Moolenaar  END
121925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
122925e9fd6SBram Moolenaar
123925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
124925e9fd6SBram Moolenaar  lines =<< trim END
125925e9fd6SBram Moolenaar      vim9script
126925e9fd6SBram Moolenaar      def g:Global(): string
127925e9fd6SBram Moolenaar        return "yes"
128925e9fd6SBram Moolenaar      enddef
129925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
130925e9fd6SBram Moolenaar      func! g:Global()
131925e9fd6SBram Moolenaar        return "no"
132925e9fd6SBram Moolenaar      endfunc
133925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
134925e9fd6SBram Moolenaar      delfunc g:Global
135925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
136925e9fd6SBram Moolenaar  END
137925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1384c17ad94SBram Moolenaarenddef
1394c17ad94SBram Moolenaar
14008052228SBram Moolenaardef Test_wrong_type()
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
143cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
144cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
145599c89c8SBram Moolenaar
146cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
147cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
14842a480bfSBram Moolenaar
149cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
150cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
151cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
152cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
153cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
154cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
155cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
156cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
157cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
158cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
159cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
160a0a9f43aSBram Moolenaar
161cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
162cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
16308052228SBram Moolenaarenddef
1648a7d6542SBram Moolenaar
16510c65860SBram Moolenaardef Test_script_wrong_type()
16610c65860SBram Moolenaar  var lines =<< trim END
16710c65860SBram Moolenaar      vim9script
16810c65860SBram Moolenaar      var s:dict: dict<string>
16910c65860SBram Moolenaar      s:dict['a'] = ['x']
17010c65860SBram Moolenaar  END
17110c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
17210c65860SBram Moolenaarenddef
17310c65860SBram Moolenaar
17408052228SBram Moolenaardef Test_const()
175cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
176cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
177cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
17830fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
17930fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
180dbeecb2bSBram Moolenaar
181cfcd011fSBram Moolenaar  var lines =<< trim END
18230fd8204SBram Moolenaar    final list = [1, 2, 3]
183dbeecb2bSBram Moolenaar    list[0] = 4
1840b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
18530fd8204SBram Moolenaar    const other = [5, 6, 7]
1860b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
18771abe482SBram Moolenaar
188cfcd011fSBram Moolenaar    var varlist = [7, 8]
18930fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
19071abe482SBram Moolenaar    varlist[0] = 77
19171abe482SBram Moolenaar    # TODO: does not work yet
19271abe482SBram Moolenaar    # constlist[1][1] = 88
193cfcd011fSBram Moolenaar    var cl = constlist[1]
19471abe482SBram Moolenaar    cl[1] = 88
19571abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
19671abe482SBram Moolenaar
197e0de171eSBram Moolenaar    var vardict = {five: 5, six: 6}
198e0de171eSBram Moolenaar    const constdict = {one: 1, two: vardict, three: 3}
19971abe482SBram Moolenaar    vardict['five'] = 55
20071abe482SBram Moolenaar    # TODO: does not work yet
20171abe482SBram Moolenaar    # constdict['two']['six'] = 66
202cfcd011fSBram Moolenaar    var cd = constdict['two']
20371abe482SBram Moolenaar    cd['six'] = 66
204e0de171eSBram Moolenaar    constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
205dbeecb2bSBram Moolenaar  END
206dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
20708052228SBram Moolenaarenddef
2088a7d6542SBram Moolenaar
2090b4c66c6SBram Moolenaardef Test_const_bang()
210cfcd011fSBram Moolenaar  var lines =<< trim END
21130fd8204SBram Moolenaar      const var = 234
2120b4c66c6SBram Moolenaar      var = 99
2130b4c66c6SBram Moolenaar  END
2140b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
2150b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
2160b4c66c6SBram Moolenaar
2170b4c66c6SBram Moolenaar  lines =<< trim END
21830fd8204SBram Moolenaar      const ll = [2, 3, 4]
2190b4c66c6SBram Moolenaar      ll[0] = 99
2200b4c66c6SBram Moolenaar  END
2210b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2220b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2230b4c66c6SBram Moolenaar
2240b4c66c6SBram Moolenaar  lines =<< trim END
22530fd8204SBram Moolenaar      const ll = [2, 3, 4]
2260b4c66c6SBram Moolenaar      ll[3] = 99
2270b4c66c6SBram Moolenaar  END
2280b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2290b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2300b4c66c6SBram Moolenaar
2310b4c66c6SBram Moolenaar  lines =<< trim END
232e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2330b4c66c6SBram Moolenaar      dd["one"] = 99
2340b4c66c6SBram Moolenaar  END
2350b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2360b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2370b4c66c6SBram Moolenaar
2380b4c66c6SBram Moolenaar  lines =<< trim END
239e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2400b4c66c6SBram Moolenaar      dd["three"] = 99
2410b4c66c6SBram Moolenaar  END
2420b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2430b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2440b4c66c6SBram Moolenaarenddef
2450b4c66c6SBram Moolenaar
246df069eecSBram Moolenaardef Test_range_no_colon()
247d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
248d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
249d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
250d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
251df069eecSBram Moolenaarenddef
252df069eecSBram Moolenaar
253df069eecSBram Moolenaar
2548a7d6542SBram Moolenaardef Test_block()
255cfcd011fSBram Moolenaar  var outer = 1
2568a7d6542SBram Moolenaar  {
257cfcd011fSBram Moolenaar    var inner = 2
2588a7d6542SBram Moolenaar    assert_equal(1, outer)
2598a7d6542SBram Moolenaar    assert_equal(2, inner)
2608a7d6542SBram Moolenaar  }
2618a7d6542SBram Moolenaar  assert_equal(1, outer)
2623f1e9f00SBram Moolenaar
2633f1e9f00SBram Moolenaar  {|echo 'yes'|}
2648a7d6542SBram Moolenaarenddef
2658a7d6542SBram Moolenaar
26608052228SBram Moolenaardef Test_block_failure()
267cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
26808052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
26908052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
27008052228SBram Moolenaarenddef
2718a7d6542SBram Moolenaar
272fbbcd003SBram Moolenaardef Test_block_local_vars()
273fbbcd003SBram Moolenaar  var lines =<< trim END
274fbbcd003SBram Moolenaar      vim9script
275ed234f24SBram Moolenaar      v:testing = 1
276fbbcd003SBram Moolenaar      if true
277ed234f24SBram Moolenaar        var text = ['hello']
278ed234f24SBram Moolenaar        def SayHello(): list<string>
279fbbcd003SBram Moolenaar          return text
280fbbcd003SBram Moolenaar        enddef
281fbbcd003SBram Moolenaar        def SetText(v: string)
282ed234f24SBram Moolenaar          text = [v]
283fbbcd003SBram Moolenaar        enddef
284fbbcd003SBram Moolenaar      endif
285fbbcd003SBram Moolenaar
286fbbcd003SBram Moolenaar      if true
287ed234f24SBram Moolenaar        var text = ['again']
288ed234f24SBram Moolenaar        def SayAgain(): list<string>
289fbbcd003SBram Moolenaar          return text
290fbbcd003SBram Moolenaar        enddef
291fbbcd003SBram Moolenaar      endif
292ed234f24SBram Moolenaar
293ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
294ed234f24SBram Moolenaar      test_garbagecollect_now()
295ed234f24SBram Moolenaar
296fbbcd003SBram Moolenaar      defcompile
297fbbcd003SBram Moolenaar
298ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
299ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
300fbbcd003SBram Moolenaar
301fbbcd003SBram Moolenaar      SetText('foobar')
302ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
303ed234f24SBram Moolenaar
304ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
305ed234f24SBram Moolenaar      qall!
306fbbcd003SBram Moolenaar  END
307ed234f24SBram Moolenaar
308ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
309ed234f24SBram Moolenaar  # context gets garbage collected.
310ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
311ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
312ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
313ed234f24SBram Moolenaar
314ed234f24SBram Moolenaar  delete('Xscript')
315ed234f24SBram Moolenaar  delete('Xdidit')
316fbbcd003SBram Moolenaarenddef
317fbbcd003SBram Moolenaar
31839ca4127SBram Moolenaardef Test_block_local_vars_with_func()
31939ca4127SBram Moolenaar  var lines =<< trim END
32039ca4127SBram Moolenaar      vim9script
32139ca4127SBram Moolenaar      if true
32239ca4127SBram Moolenaar        var foo = 'foo'
32339ca4127SBram Moolenaar        if true
32439ca4127SBram Moolenaar          var bar = 'bar'
32539ca4127SBram Moolenaar          def Func(): list<string>
32639ca4127SBram Moolenaar            return [foo, bar]
32739ca4127SBram Moolenaar          enddef
32839ca4127SBram Moolenaar        endif
32939ca4127SBram Moolenaar      endif
33039ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
33139ca4127SBram Moolenaar      # "foo" and "bar"
33239ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
33339ca4127SBram Moolenaar  END
33439ca4127SBram Moolenaar  CheckScriptSuccess(lines)
33539ca4127SBram Moolenaarenddef
33639ca4127SBram Moolenaar
337d032f34aSBram Moolenaarfunc g:NoSuchFunc()
338d032f34aSBram Moolenaar  echo 'none'
339d032f34aSBram Moolenaarendfunc
340d032f34aSBram Moolenaar
3419e1d9e34SBram Moolenaardef Test_try_catch_throw()
342cfcd011fSBram Moolenaar  var l = []
3437a092245SBram Moolenaar  try # comment
3448a7d6542SBram Moolenaar    add(l, '1')
3458a7d6542SBram Moolenaar    throw 'wrong'
3468a7d6542SBram Moolenaar    add(l, '2')
3477a092245SBram Moolenaar  catch # comment
3488a7d6542SBram Moolenaar    add(l, v:exception)
3497a092245SBram Moolenaar  finally # comment
3508a7d6542SBram Moolenaar    add(l, '3')
3517a092245SBram Moolenaar  endtry # comment
3528a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
35368d130c6SBram Moolenaar
354e859312eSBram Moolenaar  l = []
355e859312eSBram Moolenaar  try
356e859312eSBram Moolenaar    try
357e859312eSBram Moolenaar      add(l, '1')
358e859312eSBram Moolenaar      throw 'wrong'
359e859312eSBram Moolenaar      add(l, '2')
360e859312eSBram Moolenaar    catch /right/
361e859312eSBram Moolenaar      add(l, v:exception)
362e859312eSBram Moolenaar    endtry
363e859312eSBram Moolenaar  catch /wrong/
364e859312eSBram Moolenaar    add(l, 'caught')
365373863edSBram Moolenaar  fina
366e859312eSBram Moolenaar    add(l, 'finally')
367e859312eSBram Moolenaar  endtry
368e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
369e859312eSBram Moolenaar
370cfcd011fSBram Moolenaar  var n: number
37168d130c6SBram Moolenaar  try
37268d130c6SBram Moolenaar    n = l[3]
37368d130c6SBram Moolenaar  catch /E684:/
37468d130c6SBram Moolenaar    n = 99
37568d130c6SBram Moolenaar  endtry
37668d130c6SBram Moolenaar  assert_equal(99, n)
37768d130c6SBram Moolenaar
37869f7050cSBram Moolenaar  var done = 'no'
37969f7050cSBram Moolenaar  if 0
38069f7050cSBram Moolenaar    try | catch | endtry
38169f7050cSBram Moolenaar  else
38269f7050cSBram Moolenaar    done = 'yes'
38369f7050cSBram Moolenaar  endif
38469f7050cSBram Moolenaar  assert_equal('yes', done)
38569f7050cSBram Moolenaar
38669f7050cSBram Moolenaar  done = 'no'
38769f7050cSBram Moolenaar  if 1
38869f7050cSBram Moolenaar    done = 'yes'
38969f7050cSBram Moolenaar  else
39069f7050cSBram Moolenaar    try | catch | endtry
39169f7050cSBram Moolenaar    done = 'never'
39269f7050cSBram Moolenaar  endif
39369f7050cSBram Moolenaar  assert_equal('yes', done)
39469f7050cSBram Moolenaar
39569f7050cSBram Moolenaar  if 1
39669f7050cSBram Moolenaar  else
39769f7050cSBram Moolenaar    try | catch /pat/ | endtry
39869f7050cSBram Moolenaar    try | catch /pat/
39969f7050cSBram Moolenaar    endtry
40069f7050cSBram Moolenaar    try
40169f7050cSBram Moolenaar    catch /pat/ | endtry
40269f7050cSBram Moolenaar    try
40369f7050cSBram Moolenaar    catch /pat/
40469f7050cSBram Moolenaar    endtry
40569f7050cSBram Moolenaar  endif
40669f7050cSBram Moolenaar
40768d130c6SBram Moolenaar  try
408cc673e74SBram Moolenaar    # string slice returns a string, not a number
40968d130c6SBram Moolenaar    n = g:astring[3]
4105e654230SBram Moolenaar  catch /E1012:/
41168d130c6SBram Moolenaar    n = 77
41268d130c6SBram Moolenaar  endtry
41368d130c6SBram Moolenaar  assert_equal(77, n)
41468d130c6SBram Moolenaar
41568d130c6SBram Moolenaar  try
41668d130c6SBram Moolenaar    n = l[g:astring]
4175e654230SBram Moolenaar  catch /E1012:/
41856acb094SBram Moolenaar    n = 88
41968d130c6SBram Moolenaar  endtry
42056acb094SBram Moolenaar  assert_equal(88, n)
42168d130c6SBram Moolenaar
42268d130c6SBram Moolenaar  try
42368d130c6SBram Moolenaar    n = s:does_not_exist
42468d130c6SBram Moolenaar  catch /E121:/
425f0b9f43cSBram Moolenaar    n = 111
426f0b9f43cSBram Moolenaar  endtry
427f0b9f43cSBram Moolenaar  assert_equal(111, n)
428f0b9f43cSBram Moolenaar
429f0b9f43cSBram Moolenaar  try
430f0b9f43cSBram Moolenaar    n = g:does_not_exist
431f0b9f43cSBram Moolenaar  catch /E121:/
43268d130c6SBram Moolenaar    n = 121
43368d130c6SBram Moolenaar  endtry
43468d130c6SBram Moolenaar  assert_equal(121, n)
43568d130c6SBram Moolenaar
436e0de171eSBram Moolenaar  var d = {one: 1}
43768d130c6SBram Moolenaar  try
43868d130c6SBram Moolenaar    n = d[g:astring]
43968d130c6SBram Moolenaar  catch /E716:/
44068d130c6SBram Moolenaar    n = 222
44168d130c6SBram Moolenaar  endtry
44268d130c6SBram Moolenaar  assert_equal(222, n)
443f0b9f43cSBram Moolenaar
444f0b9f43cSBram Moolenaar  try
445f0b9f43cSBram Moolenaar    n = -g:astring
446f0b9f43cSBram Moolenaar  catch /E39:/
447f0b9f43cSBram Moolenaar    n = 233
448f0b9f43cSBram Moolenaar  endtry
449f0b9f43cSBram Moolenaar  assert_equal(233, n)
450f0b9f43cSBram Moolenaar
451f0b9f43cSBram Moolenaar  try
452f0b9f43cSBram Moolenaar    n = +g:astring
453f0b9f43cSBram Moolenaar  catch /E1030:/
454f0b9f43cSBram Moolenaar    n = 244
455f0b9f43cSBram Moolenaar  endtry
456f0b9f43cSBram Moolenaar  assert_equal(244, n)
457f0b9f43cSBram Moolenaar
458f0b9f43cSBram Moolenaar  try
459f0b9f43cSBram Moolenaar    n = +g:alist
460f0b9f43cSBram Moolenaar  catch /E745:/
461f0b9f43cSBram Moolenaar    n = 255
462f0b9f43cSBram Moolenaar  endtry
463f0b9f43cSBram Moolenaar  assert_equal(255, n)
464f0b9f43cSBram Moolenaar
465cfcd011fSBram Moolenaar  var nd: dict<any>
466f0b9f43cSBram Moolenaar  try
4672e5910bfSBram Moolenaar    nd = {[g:alist]: 1}
4682e5910bfSBram Moolenaar  catch /E1105:/
469f0b9f43cSBram Moolenaar    n = 266
470f0b9f43cSBram Moolenaar  endtry
471f0b9f43cSBram Moolenaar  assert_equal(266, n)
472f0b9f43cSBram Moolenaar
473f0b9f43cSBram Moolenaar  try
474f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
475f0b9f43cSBram Moolenaar  catch /E1093:/
476f0b9f43cSBram Moolenaar    n = 277
477f0b9f43cSBram Moolenaar  endtry
478f0b9f43cSBram Moolenaar  assert_equal(277, n)
479f0b9f43cSBram Moolenaar
480e859312eSBram Moolenaar  try
481e859312eSBram Moolenaar    &ts = g:astring
4825e654230SBram Moolenaar  catch /E1012:/
483e859312eSBram Moolenaar    n = 288
484e859312eSBram Moolenaar  endtry
485e859312eSBram Moolenaar  assert_equal(288, n)
486e859312eSBram Moolenaar
487e859312eSBram Moolenaar  try
488e859312eSBram Moolenaar    &backspace = 'asdf'
489e859312eSBram Moolenaar  catch /E474:/
490e859312eSBram Moolenaar    n = 299
491e859312eSBram Moolenaar  endtry
492e859312eSBram Moolenaar  assert_equal(299, n)
493e859312eSBram Moolenaar
494e859312eSBram Moolenaar  l = [1]
495e859312eSBram Moolenaar  try
496e859312eSBram Moolenaar    l[3] = 3
497e859312eSBram Moolenaar  catch /E684:/
498e859312eSBram Moolenaar    n = 300
499e859312eSBram Moolenaar  endtry
500e859312eSBram Moolenaar  assert_equal(300, n)
501e859312eSBram Moolenaar
502e859312eSBram Moolenaar  try
503e859312eSBram Moolenaar    unlet g:does_not_exist
504e859312eSBram Moolenaar  catch /E108:/
505e859312eSBram Moolenaar    n = 322
506e859312eSBram Moolenaar  endtry
507e859312eSBram Moolenaar  assert_equal(322, n)
508e859312eSBram Moolenaar
509e859312eSBram Moolenaar  try
5102bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
511e859312eSBram Moolenaar  catch /E721:/
512e859312eSBram Moolenaar    n = 333
513e859312eSBram Moolenaar  endtry
514e859312eSBram Moolenaar  assert_equal(333, n)
515e859312eSBram Moolenaar
516e859312eSBram Moolenaar  try
517e859312eSBram Moolenaar    l = DeletedFunc()
518e859312eSBram Moolenaar  catch /E933:/
519e859312eSBram Moolenaar    n = 344
520e859312eSBram Moolenaar  endtry
521e859312eSBram Moolenaar  assert_equal(344, n)
522d032f34aSBram Moolenaar
523d032f34aSBram Moolenaar  try
524d032f34aSBram Moolenaar    echo len(v:true)
525d032f34aSBram Moolenaar  catch /E701:/
526d032f34aSBram Moolenaar    n = 355
527d032f34aSBram Moolenaar  endtry
528d032f34aSBram Moolenaar  assert_equal(355, n)
529d032f34aSBram Moolenaar
530cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
531d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
532d032f34aSBram Moolenaar  try
533d032f34aSBram Moolenaar    echo P()
534d032f34aSBram Moolenaar  catch /E117:/
535d032f34aSBram Moolenaar    n = 366
536d032f34aSBram Moolenaar  endtry
537d032f34aSBram Moolenaar  assert_equal(366, n)
538d032f34aSBram Moolenaar
539d032f34aSBram Moolenaar  try
540d032f34aSBram Moolenaar    echo g:NoSuchFunc()
541d032f34aSBram Moolenaar  catch /E117:/
542d032f34aSBram Moolenaar    n = 377
543d032f34aSBram Moolenaar  endtry
544d032f34aSBram Moolenaar  assert_equal(377, n)
545d032f34aSBram Moolenaar
546d032f34aSBram Moolenaar  try
547d032f34aSBram Moolenaar    echo g:alist + 4
548d032f34aSBram Moolenaar  catch /E745:/
549d032f34aSBram Moolenaar    n = 388
550d032f34aSBram Moolenaar  endtry
551d032f34aSBram Moolenaar  assert_equal(388, n)
552d032f34aSBram Moolenaar
553d032f34aSBram Moolenaar  try
554d032f34aSBram Moolenaar    echo 4 + g:alist
555d032f34aSBram Moolenaar  catch /E745:/
556d032f34aSBram Moolenaar    n = 399
557d032f34aSBram Moolenaar  endtry
558d032f34aSBram Moolenaar  assert_equal(399, n)
559d032f34aSBram Moolenaar
560d032f34aSBram Moolenaar  try
561d032f34aSBram Moolenaar    echo g:alist.member
562d032f34aSBram Moolenaar  catch /E715:/
563d032f34aSBram Moolenaar    n = 400
564d032f34aSBram Moolenaar  endtry
565d032f34aSBram Moolenaar  assert_equal(400, n)
566d032f34aSBram Moolenaar
567d032f34aSBram Moolenaar  try
568d032f34aSBram Moolenaar    echo d.member
569d032f34aSBram Moolenaar  catch /E716:/
570d032f34aSBram Moolenaar    n = 411
571d032f34aSBram Moolenaar  endtry
572d032f34aSBram Moolenaar  assert_equal(411, n)
573d9d7789bSBram Moolenaar
574d9d7789bSBram Moolenaar  var counter = 0
575d9d7789bSBram Moolenaar  for i in range(4)
576d9d7789bSBram Moolenaar    try
577d9d7789bSBram Moolenaar      eval [][0]
578d9d7789bSBram Moolenaar    catch
579d9d7789bSBram Moolenaar    endtry
580d9d7789bSBram Moolenaar    counter += 1
581d9d7789bSBram Moolenaar  endfor
582d9d7789bSBram Moolenaar  assert_equal(4, counter)
5837e82c5f3SBram Moolenaar
5847e82c5f3SBram Moolenaar  # return in finally after empty catch
5857e82c5f3SBram Moolenaar  def ReturnInFinally(): number
5867e82c5f3SBram Moolenaar    try
5877e82c5f3SBram Moolenaar    finally
5887e82c5f3SBram Moolenaar      return 4
5897e82c5f3SBram Moolenaar    endtry
5907e82c5f3SBram Moolenaar    return 2
5917e82c5f3SBram Moolenaar  enddef
5927e82c5f3SBram Moolenaar  assert_equal(4, ReturnInFinally())
5938ac681a2SBram Moolenaar
5948ac681a2SBram Moolenaar  var lines =<< trim END
5958ac681a2SBram Moolenaar      vim9script
5968ac681a2SBram Moolenaar      try
5978ac681a2SBram Moolenaar        acos('0.5')
5988ac681a2SBram Moolenaar          ->setline(1)
5998ac681a2SBram Moolenaar      catch
6008ac681a2SBram Moolenaar        g:caught = v:exception
6018ac681a2SBram Moolenaar      endtry
6028ac681a2SBram Moolenaar  END
6038ac681a2SBram Moolenaar  CheckScriptSuccess(lines)
6048ac681a2SBram Moolenaar  assert_match('E808: Number or Float required', g:caught)
6058ac681a2SBram Moolenaar  unlet g:caught
6068a7d6542SBram Moolenaarenddef
6078a7d6542SBram Moolenaar
608*3f987b59SBram Moolenaardef Test_try_in_catch()
609*3f987b59SBram Moolenaar  var lines =<< trim END
610*3f987b59SBram Moolenaar      vim9script
611*3f987b59SBram Moolenaar      var seq = []
612*3f987b59SBram Moolenaar      def DoIt()
613*3f987b59SBram Moolenaar        try
614*3f987b59SBram Moolenaar          seq->add('throw 1')
615*3f987b59SBram Moolenaar          eval [][0]
616*3f987b59SBram Moolenaar          seq->add('notreached')
617*3f987b59SBram Moolenaar        catch
618*3f987b59SBram Moolenaar          seq->add('catch')
619*3f987b59SBram Moolenaar          try
620*3f987b59SBram Moolenaar            seq->add('throw 2')
621*3f987b59SBram Moolenaar            eval [][0]
622*3f987b59SBram Moolenaar            seq->add('notreached')
623*3f987b59SBram Moolenaar          catch /nothing/
624*3f987b59SBram Moolenaar            seq->add('notreached')
625*3f987b59SBram Moolenaar          endtry
626*3f987b59SBram Moolenaar          seq->add('done')
627*3f987b59SBram Moolenaar        endtry
628*3f987b59SBram Moolenaar      enddef
629*3f987b59SBram Moolenaar      DoIt()
630*3f987b59SBram Moolenaar      assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
631*3f987b59SBram Moolenaar  END
632*3f987b59SBram Moolenaarenddef
633*3f987b59SBram Moolenaar
6342e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to
6352e34c34bSBram Moolenaardef TryContinueFunc()
6362e34c34bSBram Moolenaar while g:Count < 2
6372e34c34bSBram Moolenaar   g:sequence ..= 't'
6382e34c34bSBram Moolenaar    try
6392e34c34bSBram Moolenaar      echoerr 'Test'
6402e34c34bSBram Moolenaar    catch
6412e34c34bSBram Moolenaar      g:Count += 1
6422e34c34bSBram Moolenaar      g:sequence ..= 'c'
6432e34c34bSBram Moolenaar      continue
6442e34c34bSBram Moolenaar    endtry
6452e34c34bSBram Moolenaar    g:sequence ..= 'e'
6462e34c34bSBram Moolenaar    g:Count += 1
6472e34c34bSBram Moolenaar  endwhile
6482e34c34bSBram Moolenaarenddef
6492e34c34bSBram Moolenaar
6502e34c34bSBram Moolenaardef Test_continue_in_try_in_while()
6512e34c34bSBram Moolenaar  g:Count = 0
6522e34c34bSBram Moolenaar  g:sequence = ''
6532e34c34bSBram Moolenaar  TryContinueFunc()
6542e34c34bSBram Moolenaar  assert_equal('tctc', g:sequence)
6552e34c34bSBram Moolenaar  unlet g:Count
6562e34c34bSBram Moolenaar  unlet g:sequence
6572e34c34bSBram Moolenaarenddef
6582e34c34bSBram Moolenaar
6599cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
6609cb577a6SBram Moolenaar  # return in try block returns normally
6619cb577a6SBram Moolenaar  def ReturnInTry(): string
6629cb577a6SBram Moolenaar    try
6639cb577a6SBram Moolenaar      return '"some message"'
6649cb577a6SBram Moolenaar    catch
6659cb577a6SBram Moolenaar    endtry
6669cb577a6SBram Moolenaar    return 'not reached'
6679cb577a6SBram Moolenaar  enddef
6689cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
6699cb577a6SBram Moolenaarenddef
6709cb577a6SBram Moolenaar
6711430ceebSBram Moolenaardef Test_cnext_works_in_catch()
6721430ceebSBram Moolenaar  var lines =<< trim END
6731430ceebSBram Moolenaar      vim9script
6741430ceebSBram Moolenaar      au BufEnter * eval 0
6751430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
6761430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
6771430ceebSBram Moolenaar      var items = [
6781430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
6791430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
6801430ceebSBram Moolenaar        ]
6811430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
6821430ceebSBram Moolenaar      cwindow
6831430ceebSBram Moolenaar
6841430ceebSBram Moolenaar      def CnextOrCfirst()
6851430ceebSBram Moolenaar        # if cnext fails, cfirst is used
6861430ceebSBram Moolenaar        try
6871430ceebSBram Moolenaar          cnext
6881430ceebSBram Moolenaar        catch
6891430ceebSBram Moolenaar          cfirst
6901430ceebSBram Moolenaar        endtry
6911430ceebSBram Moolenaar      enddef
6921430ceebSBram Moolenaar
6931430ceebSBram Moolenaar      CnextOrCfirst()
6941430ceebSBram Moolenaar      CnextOrCfirst()
6951430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
6961430ceebSBram Moolenaar      qall
6971430ceebSBram Moolenaar  END
6981430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
6991430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
7001430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
7011430ceebSBram Moolenaar
7021430ceebSBram Moolenaar  delete('Xfile1')
7031430ceebSBram Moolenaar  delete('Xfile2')
7041430ceebSBram Moolenaar  delete('XCatchCnext')
7051430ceebSBram Moolenaar  delete('Xresult')
7061430ceebSBram Moolenaarenddef
7071430ceebSBram Moolenaar
7089e1d9e34SBram Moolenaardef Test_throw_skipped()
7099e1d9e34SBram Moolenaar  if 0
7109e1d9e34SBram Moolenaar    throw dontgethere
7119e1d9e34SBram Moolenaar  endif
7129e1d9e34SBram Moolenaarenddef
7139e1d9e34SBram Moolenaar
7148f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
7158f81b22eSBram Moolenaar  var lines =<< trim END
7168f81b22eSBram Moolenaar    vim9script
7178f81b22eSBram Moolenaar    def Func()
7188f81b22eSBram Moolenaar      throw 'error'
7198f81b22eSBram Moolenaar    enddef
7208f81b22eSBram Moolenaar    silent! Func()
7218f81b22eSBram Moolenaar  END
7228f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
7238f81b22eSBram Moolenaar  source XthrowSilenced
7248f81b22eSBram Moolenaar  delete('XthrowSilenced')
7258f81b22eSBram Moolenaarenddef
7268f81b22eSBram Moolenaar
727e859312eSBram Moolenaardef DeletedFunc(): list<any>
728e859312eSBram Moolenaar  return ['delete me']
729e859312eSBram Moolenaarenddef
730e859312eSBram Moolenaardefcompile
731e859312eSBram Moolenaardelfunc DeletedFunc
732e859312eSBram Moolenaar
733257cc5eeSBram Moolenaardef ThrowFromDef()
734a72cfb80SBram Moolenaar  throw "getout" # comment
735257cc5eeSBram Moolenaarenddef
736257cc5eeSBram Moolenaar
737257cc5eeSBram Moolenaarfunc CatchInFunc()
738257cc5eeSBram Moolenaar  try
739257cc5eeSBram Moolenaar    call ThrowFromDef()
740257cc5eeSBram Moolenaar  catch
741257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
742257cc5eeSBram Moolenaar  endtry
743257cc5eeSBram Moolenaarendfunc
744257cc5eeSBram Moolenaar
745257cc5eeSBram Moolenaardef CatchInDef()
746257cc5eeSBram Moolenaar  try
747257cc5eeSBram Moolenaar    ThrowFromDef()
748257cc5eeSBram Moolenaar  catch
749257cc5eeSBram Moolenaar    g:thrown_def = v:exception
750257cc5eeSBram Moolenaar  endtry
751257cc5eeSBram Moolenaarenddef
752257cc5eeSBram Moolenaar
753f575adffSBram Moolenaardef ReturnFinally(): string
754f575adffSBram Moolenaar  try
755f575adffSBram Moolenaar    return 'intry'
756373863edSBram Moolenaar  finall
757f575adffSBram Moolenaar    g:in_finally = 'finally'
758f575adffSBram Moolenaar  endtry
759f575adffSBram Moolenaar  return 'end'
760f575adffSBram Moolenaarenddef
761f575adffSBram Moolenaar
762257cc5eeSBram Moolenaardef Test_try_catch_nested()
763257cc5eeSBram Moolenaar  CatchInFunc()
764257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
765257cc5eeSBram Moolenaar
766257cc5eeSBram Moolenaar  CatchInDef()
767257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
768f575adffSBram Moolenaar
769f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
770f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
771f575adffSBram Moolenaarenddef
772f575adffSBram Moolenaar
7739939f57bSBram Moolenaardef TryOne(): number
7749939f57bSBram Moolenaar  try
7759939f57bSBram Moolenaar    return 0
7769939f57bSBram Moolenaar  catch
7779939f57bSBram Moolenaar  endtry
7789939f57bSBram Moolenaar  return 0
7799939f57bSBram Moolenaarenddef
7809939f57bSBram Moolenaar
7819939f57bSBram Moolenaardef TryTwo(n: number): string
7829939f57bSBram Moolenaar  try
783cfcd011fSBram Moolenaar    var x = {}
7849939f57bSBram Moolenaar  catch
7859939f57bSBram Moolenaar  endtry
7869939f57bSBram Moolenaar  return 'text'
7879939f57bSBram Moolenaarenddef
7889939f57bSBram Moolenaar
7899939f57bSBram Moolenaardef Test_try_catch_twice()
7909939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
7919939f57bSBram Moolenaarenddef
7929939f57bSBram Moolenaar
793f575adffSBram Moolenaardef Test_try_catch_match()
794cfcd011fSBram Moolenaar  var seq = 'a'
795f575adffSBram Moolenaar  try
796f575adffSBram Moolenaar    throw 'something'
797f575adffSBram Moolenaar  catch /nothing/
798f575adffSBram Moolenaar    seq ..= 'x'
799f575adffSBram Moolenaar  catch /some/
800f575adffSBram Moolenaar    seq ..= 'b'
801f575adffSBram Moolenaar  catch /asdf/
802f575adffSBram Moolenaar    seq ..= 'x'
803e8c4abbbSBram Moolenaar  catch ?a\?sdf?
804e8c4abbbSBram Moolenaar    seq ..= 'y'
805f575adffSBram Moolenaar  finally
806f575adffSBram Moolenaar    seq ..= 'c'
807f575adffSBram Moolenaar  endtry
808f575adffSBram Moolenaar  assert_equal('abc', seq)
809257cc5eeSBram Moolenaarenddef
810257cc5eeSBram Moolenaar
811e8c4abbbSBram Moolenaardef Test_try_catch_fails()
812d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
813d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
814d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
815d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
816d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
817d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
818d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
819d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
82013106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
821d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
822585fea7bSBram Moolenaar
823e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
824d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
825e8c4abbbSBram Moolenaarenddef
826e8c4abbbSBram Moolenaar
8277c5b3c03SBram Moolenaardef Try_catch_skipped()
8287c5b3c03SBram Moolenaar  var l = []
8297c5b3c03SBram Moolenaar  try
8307c5b3c03SBram Moolenaar  finally
8317c5b3c03SBram Moolenaar  endtry
8327c5b3c03SBram Moolenaar
8337c5b3c03SBram Moolenaar  if 1
8347c5b3c03SBram Moolenaar  else
8357c5b3c03SBram Moolenaar    try
8367c5b3c03SBram Moolenaar    endtry
8377c5b3c03SBram Moolenaar  endif
8387c5b3c03SBram Moolenaarenddef
8397c5b3c03SBram Moolenaar
8407c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
8417c5b3c03SBram Moolenaardef Test_try_catch_skipped()
8427c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
8437c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
8447c5b3c03SBram Moolenaarenddef
8457c5b3c03SBram Moolenaar
8467c5b3c03SBram Moolenaar
8477c5b3c03SBram Moolenaar
848006ad48bSBram Moolenaardef Test_throw_vimscript()
849f5be8cdbSBram Moolenaar  # only checks line continuation
850cfcd011fSBram Moolenaar  var lines =<< trim END
851006ad48bSBram Moolenaar      vim9script
852006ad48bSBram Moolenaar      try
853006ad48bSBram Moolenaar        throw 'one'
854006ad48bSBram Moolenaar              .. 'two'
855006ad48bSBram Moolenaar      catch
856006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
857006ad48bSBram Moolenaar      endtry
858006ad48bSBram Moolenaar  END
859006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
8601e021e63SBram Moolenaar
8611e021e63SBram Moolenaar  lines =<< trim END
8621e021e63SBram Moolenaar    vim9script
863352134bbSBram Moolenaar    @r = ''
8641e021e63SBram Moolenaar    def Func()
8651e021e63SBram Moolenaar      throw @r
8661e021e63SBram Moolenaar    enddef
8671e021e63SBram Moolenaar    var result = ''
8681e021e63SBram Moolenaar    try
8691e021e63SBram Moolenaar      Func()
8701e021e63SBram Moolenaar    catch /E1129:/
8711e021e63SBram Moolenaar      result = 'caught'
8721e021e63SBram Moolenaar    endtry
8731e021e63SBram Moolenaar    assert_equal('caught', result)
8741e021e63SBram Moolenaar  END
8751e021e63SBram Moolenaar  CheckScriptSuccess(lines)
876006ad48bSBram Moolenaarenddef
877006ad48bSBram Moolenaar
878ed677f55SBram Moolenaardef Test_error_in_nested_function()
87903dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
880cfcd011fSBram Moolenaar  var lines =<< trim END
881ed677f55SBram Moolenaar      vim9script
882ed677f55SBram Moolenaar      def Func()
883ed677f55SBram Moolenaar        Error()
884ed677f55SBram Moolenaar        g:test_var = 1
885ed677f55SBram Moolenaar      enddef
886ed677f55SBram Moolenaar      func Error() abort
887ed677f55SBram Moolenaar        eval [][0]
888ed677f55SBram Moolenaar      endfunc
889ed677f55SBram Moolenaar      Func()
890ed677f55SBram Moolenaar  END
891ed677f55SBram Moolenaar  g:test_var = 0
892ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
893ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
894ed677f55SBram Moolenaarenddef
895ed677f55SBram Moolenaar
896227c58a4SBram Moolenaardef Test_abort_after_error()
897227c58a4SBram Moolenaar  var lines =<< trim END
898227c58a4SBram Moolenaar      vim9script
899227c58a4SBram Moolenaar      while true
900227c58a4SBram Moolenaar        echo notfound
901227c58a4SBram Moolenaar      endwhile
902227c58a4SBram Moolenaar      g:gotthere = true
903227c58a4SBram Moolenaar  END
904227c58a4SBram Moolenaar  g:gotthere = false
905227c58a4SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
906227c58a4SBram Moolenaar  assert_false(g:gotthere)
907227c58a4SBram Moolenaar  unlet g:gotthere
908227c58a4SBram Moolenaarenddef
909227c58a4SBram Moolenaar
91037c83711SBram Moolenaardef Test_cexpr_vimscript()
911f5be8cdbSBram Moolenaar  # only checks line continuation
91237c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
913cfcd011fSBram Moolenaar  var lines =<< trim END
91437c83711SBram Moolenaar      vim9script
91537c83711SBram Moolenaar      cexpr 'File'
91637c83711SBram Moolenaar                .. ' someFile' ..
91737c83711SBram Moolenaar                   ' line 19'
91837c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
91937c83711SBram Moolenaar  END
92037c83711SBram Moolenaar  CheckScriptSuccess(lines)
92137c83711SBram Moolenaar  set errorformat&
92237c83711SBram Moolenaarenddef
92337c83711SBram Moolenaar
924c9edd6b5SBram Moolenaardef Test_statusline_syntax()
925c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
926cfcd011fSBram Moolenaar  var lines =<< trim END
927c9edd6b5SBram Moolenaar      vim9script
928c9edd6b5SBram Moolenaar      func g:Status()
929c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
930c9edd6b5SBram Moolenaar      endfunc
931c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
932c9edd6b5SBram Moolenaar      redrawstatus
933c9edd6b5SBram Moolenaar      set laststatus statusline=
934c9edd6b5SBram Moolenaar  END
935c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
936c9edd6b5SBram Moolenaarenddef
937c9edd6b5SBram Moolenaar
938b209750bSBram Moolenaardef Test_list_vimscript()
939b209750bSBram Moolenaar  # checks line continuation and comments
940cfcd011fSBram Moolenaar  var lines =<< trim END
941b209750bSBram Moolenaar      vim9script
942cfcd011fSBram Moolenaar      var mylist = [
943b209750bSBram Moolenaar            'one',
944b209750bSBram Moolenaar            # comment
945b209750bSBram Moolenaar            'two', # empty line follows
946b209750bSBram Moolenaar
947b209750bSBram Moolenaar            'three',
948b209750bSBram Moolenaar            ]
949b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
950b209750bSBram Moolenaar  END
951b209750bSBram Moolenaar  CheckScriptSuccess(lines)
95266250c93SBram Moolenaar
95366250c93SBram Moolenaar  # check all lines from heredoc are kept
95466250c93SBram Moolenaar  lines =<< trim END
95566250c93SBram Moolenaar      # comment 1
95666250c93SBram Moolenaar      two
95766250c93SBram Moolenaar      # comment 3
95866250c93SBram Moolenaar
95966250c93SBram Moolenaar      five
96066250c93SBram Moolenaar      # comment 6
96166250c93SBram Moolenaar  END
96266250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
9634bce26bbSBram Moolenaar
9644bce26bbSBram Moolenaar  lines =<< trim END
9654bce26bbSBram Moolenaar    [{
9664bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
9674bce26bbSBram Moolenaar  END
9684bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
969b209750bSBram Moolenaarenddef
970b209750bSBram Moolenaar
9712a1381c3SBram Moolenaarif has('channel')
97240ee466cSBram Moolenaar  let someJob = test_null_job()
97340ee466cSBram Moolenaar
97440ee466cSBram Moolenaar  def FuncWithError()
97540ee466cSBram Moolenaar    echomsg g:someJob
97640ee466cSBram Moolenaar  enddef
97740ee466cSBram Moolenaar
97840ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
97940ee466cSBram Moolenaar    try
98040ee466cSBram Moolenaar      call FuncWithError()
98140ee466cSBram Moolenaar    catch
98240ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
98340ee466cSBram Moolenaar    endtry
98440ee466cSBram Moolenaar  endfunc
9852a1381c3SBram Moolenaarendif
98640ee466cSBram Moolenaar
9878a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
9888a7d6542SBram Moolenaar  vim9script
989cfcd011fSBram Moolenaar  var name: string = 'bob'
9908a7d6542SBram Moolenaar  def Concat(arg: string): string
9918a7d6542SBram Moolenaar    return name .. arg
9928a7d6542SBram Moolenaar  enddef
993227a69deSBram Moolenaar  g:result = Concat('bie')
994227a69deSBram Moolenaar  g:localname = name
9958a7d6542SBram Moolenaar
9968a7d6542SBram Moolenaar  export const CONST = 1234
997cfcd011fSBram Moolenaar  export var exported = 9876
998cfcd011fSBram Moolenaar  export var exp_name = 'John'
9998a7d6542SBram Moolenaar  export def Exported(): string
10008a7d6542SBram Moolenaar    return 'Exported'
10018a7d6542SBram Moolenaar  enddef
10020f2a5cc6SBram Moolenaar  export final theList = [1]
10038a7d6542SBram MoolenaarEND
10048a7d6542SBram Moolenaar
1005b3ca9824SBram Moolenaardef Undo_export_script_lines()
1006b3ca9824SBram Moolenaar  unlet g:result
1007b3ca9824SBram Moolenaar  unlet g:localname
1008b3ca9824SBram Moolenaarenddef
1009b3ca9824SBram Moolenaar
10105269bd2aSBram Moolenaardef Test_vim9_import_export()
1011cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
10128a7d6542SBram Moolenaar    vim9script
10138a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
10148a7d6542SBram Moolenaar    g:imported = exported
10156e587dcbSBram Moolenaar    exported += 3
10166e587dcbSBram Moolenaar    g:imported_added = exported
10178a7d6542SBram Moolenaar    g:imported_func = Exported()
10186e587dcbSBram Moolenaar
101940f4f7a4SBram Moolenaar    def GetExported(): string
1020e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
102140f4f7a4SBram Moolenaar      return local_dict.ref()
102240f4f7a4SBram Moolenaar    enddef
102340f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
102440f4f7a4SBram Moolenaar
10256e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
10266e587dcbSBram Moolenaar    g:imported_name = exp_name
10276e587dcbSBram Moolenaar    exp_name ..= ' Doe'
10286e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
10295381c7a1SBram Moolenaar    g:imported_later = exported
10300f2a5cc6SBram Moolenaar
10310f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
10320f2a5cc6SBram Moolenaar    theList->add(2)
10330f2a5cc6SBram Moolenaar    assert_equal([1, 2], theList)
10348a7d6542SBram Moolenaar  END
10358a7d6542SBram Moolenaar
10368a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
10378a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
10388a7d6542SBram Moolenaar
10398a7d6542SBram Moolenaar  source Ximport.vim
10408a7d6542SBram Moolenaar
10418a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
10428a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
10438a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
10446e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
10455381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
10468a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
104740f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
10486e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
10496e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
10508a7d6542SBram Moolenaar  assert_false(exists('g:name'))
10518a7d6542SBram Moolenaar
1052b3ca9824SBram Moolenaar  Undo_export_script_lines()
10538a7d6542SBram Moolenaar  unlet g:imported
10546e587dcbSBram Moolenaar  unlet g:imported_added
10555381c7a1SBram Moolenaar  unlet g:imported_later
10568a7d6542SBram Moolenaar  unlet g:imported_func
10576e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
10588a7d6542SBram Moolenaar  delete('Ximport.vim')
1059f2d5c240SBram Moolenaar
10601c991144SBram Moolenaar  # similar, with line breaks
1061cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
10621c991144SBram Moolenaar    vim9script
10631c991144SBram Moolenaar    import {
10641c991144SBram Moolenaar        exported,
10651c991144SBram Moolenaar        Exported,
10661c991144SBram Moolenaar        }
10671c991144SBram Moolenaar        from
10681c991144SBram Moolenaar        './Xexport.vim'
10691c991144SBram Moolenaar    g:imported = exported
10701c991144SBram Moolenaar    exported += 5
10711c991144SBram Moolenaar    g:imported_added = exported
10721c991144SBram Moolenaar    g:imported_func = Exported()
10731c991144SBram Moolenaar  END
10741c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
10751c991144SBram Moolenaar  source Ximport_lbr.vim
10761c991144SBram Moolenaar
10771c991144SBram Moolenaar  assert_equal(9876, g:imported)
10781c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
10791c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
10801c991144SBram Moolenaar
10811c991144SBram Moolenaar  # exported script not sourced again
10821c991144SBram Moolenaar  assert_false(exists('g:result'))
10831c991144SBram Moolenaar  unlet g:imported
10841c991144SBram Moolenaar  unlet g:imported_added
10851c991144SBram Moolenaar  unlet g:imported_func
10861c991144SBram Moolenaar  delete('Ximport_lbr.vim')
10871c991144SBram Moolenaar
10881c991144SBram Moolenaar  # import inside :def function
1089cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
10905381c7a1SBram Moolenaar    vim9script
10915381c7a1SBram Moolenaar    def ImportInDef()
10925381c7a1SBram Moolenaar      import exported from './Xexport.vim'
10935381c7a1SBram Moolenaar      g:imported = exported
10945381c7a1SBram Moolenaar      exported += 7
10955381c7a1SBram Moolenaar      g:imported_added = exported
10965381c7a1SBram Moolenaar    enddef
10975381c7a1SBram Moolenaar    ImportInDef()
10985381c7a1SBram Moolenaar  END
10995381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
11005381c7a1SBram Moolenaar  source Ximport2.vim
1101f5be8cdbSBram Moolenaar  # TODO: this should be 9879
11025381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
11035381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
11045381c7a1SBram Moolenaar  unlet g:imported
11055381c7a1SBram Moolenaar  unlet g:imported_added
11065381c7a1SBram Moolenaar  delete('Ximport2.vim')
11075381c7a1SBram Moolenaar
1108cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1109f2d5c240SBram Moolenaar    vim9script
1110f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1111f2d5c240SBram Moolenaar    def UseExport()
1112cb4e80faSBram Moolenaar      g:imported_def = Export.exported
1113f2d5c240SBram Moolenaar    enddef
1114cb4e80faSBram Moolenaar    g:imported_script = Export.exported
1115cb4e80faSBram Moolenaar    assert_equal(1, exists('Export.exported'))
1116cb4e80faSBram Moolenaar    assert_equal(0, exists('Export.notexported'))
1117f2d5c240SBram Moolenaar    UseExport()
1118f2d5c240SBram Moolenaar  END
1119f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1120f2d5c240SBram Moolenaar  source Ximport.vim
1121cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_def)
1122cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_script)
1123f2d5c240SBram Moolenaar
1124cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1125599c89c8SBram Moolenaar    vim9script
1126599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1127599c89c8SBram Moolenaar    def Func()
1128cfcd011fSBram Moolenaar      var dummy = 1
1129cfcd011fSBram Moolenaar      var imported = Export + dummy
1130599c89c8SBram Moolenaar    enddef
1131822ba247SBram Moolenaar    defcompile
1132599c89c8SBram Moolenaar  END
1133599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
113444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1135599c89c8SBram Moolenaar
1136cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1137599c89c8SBram Moolenaar    vim9script
1138599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1139599c89c8SBram Moolenaar    def Func()
1140cfcd011fSBram Moolenaar      var imported = Export . exported
1141599c89c8SBram Moolenaar    enddef
1142822ba247SBram Moolenaar    defcompile
1143599c89c8SBram Moolenaar  END
1144599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
114544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1146599c89c8SBram Moolenaar
1147a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1148a6294955SBram Moolenaar    vim9script
1149a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1150a6294955SBram Moolenaar    var some = 'other'
1151a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1152a6294955SBram Moolenaar    defcompile
1153a6294955SBram Moolenaar  END
1154a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1155a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1156a6294955SBram Moolenaar
1157cb4e80faSBram Moolenaar  var import_star_as_lines_script_no_dot =<< trim END
1158cb4e80faSBram Moolenaar    vim9script
1159cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1160cb4e80faSBram Moolenaar    g:imported_script = Export exported
1161cb4e80faSBram Moolenaar  END
1162cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
1163cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1029:')
1164cb4e80faSBram Moolenaar
1165cb4e80faSBram Moolenaar  var import_star_as_lines_script_space_after_dot =<< trim END
1166cb4e80faSBram Moolenaar    vim9script
1167cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1168cb4e80faSBram Moolenaar    g:imported_script = Export. exported
1169cb4e80faSBram Moolenaar  END
1170cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1171cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1172cb4e80faSBram Moolenaar
1173cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1174599c89c8SBram Moolenaar    vim9script
1175599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1176599c89c8SBram Moolenaar    def Func()
1177cfcd011fSBram Moolenaar      var imported = Export.
1178599c89c8SBram Moolenaar    enddef
1179822ba247SBram Moolenaar    defcompile
1180599c89c8SBram Moolenaar  END
1181599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
118244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1183599c89c8SBram Moolenaar
1184cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
11851c991144SBram Moolenaar    vim9script
11861c991144SBram Moolenaar    import *
11871c991144SBram Moolenaar        as Export
11881c991144SBram Moolenaar        from
11891c991144SBram Moolenaar        './Xexport.vim'
11901c991144SBram Moolenaar    def UseExport()
11911c991144SBram Moolenaar      g:imported = Export.exported
11921c991144SBram Moolenaar    enddef
11931c991144SBram Moolenaar    UseExport()
11941c991144SBram Moolenaar  END
11951c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
11961c991144SBram Moolenaar  source Ximport.vim
11971c991144SBram Moolenaar  assert_equal(9883, g:imported)
11981c991144SBram Moolenaar
1199cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1200f2d5c240SBram Moolenaar    vim9script
1201f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1202f2d5c240SBram Moolenaar  END
1203f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
120444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1205f2d5c240SBram Moolenaar
1206f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1207cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1208fa29c8abSBram Moolenaar    vim9script
1209fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1210fa29c8abSBram Moolenaar  END
1211fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
121244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1213fa29c8abSBram Moolenaar
1214f5be8cdbSBram Moolenaar  # try to import something that is already defined
1215cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
12165269bd2aSBram Moolenaar    vim9script
1217cfcd011fSBram Moolenaar    var exported = 'something'
12185269bd2aSBram Moolenaar    import exported from './Xexport.vim'
12195269bd2aSBram Moolenaar  END
12205269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1221057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
12225269bd2aSBram Moolenaar
1223f5be8cdbSBram Moolenaar  # try to import something that is already defined
12245269bd2aSBram Moolenaar  import_already_defined =<< trim END
12255269bd2aSBram Moolenaar    vim9script
1226cfcd011fSBram Moolenaar    var exported = 'something'
12275269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
12285269bd2aSBram Moolenaar  END
12295269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1230057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
12315269bd2aSBram Moolenaar
1232f5be8cdbSBram Moolenaar  # try to import something that is already defined
12335269bd2aSBram Moolenaar  import_already_defined =<< trim END
12345269bd2aSBram Moolenaar    vim9script
1235cfcd011fSBram Moolenaar    var exported = 'something'
12365269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
12375269bd2aSBram Moolenaar  END
12385269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1239057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
12405269bd2aSBram Moolenaar
1241918a4249SBram Moolenaar  # try changing an imported const
1242918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1243918a4249SBram Moolenaar    vim9script
1244918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1245918a4249SBram Moolenaar    def Assign()
1246918a4249SBram Moolenaar      CONST = 987
1247918a4249SBram Moolenaar    enddef
1248918a4249SBram Moolenaar    defcompile
1249918a4249SBram Moolenaar  END
1250918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1251918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1252918a4249SBram Moolenaar
12530f2a5cc6SBram Moolenaar  # try changing an imported final
12540f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
12550f2a5cc6SBram Moolenaar    vim9script
12560f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
12570f2a5cc6SBram Moolenaar    def Assign()
12580f2a5cc6SBram Moolenaar      theList = [2]
12590f2a5cc6SBram Moolenaar    enddef
12600f2a5cc6SBram Moolenaar    defcompile
12610f2a5cc6SBram Moolenaar  END
12620f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
12630f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
12640f2a5cc6SBram Moolenaar
1265f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1266cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1267fa29c8abSBram Moolenaar    vim9script
1268fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1269fa29c8abSBram Moolenaar  END
1270fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
127144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1272fa29c8abSBram Moolenaar
1273cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1274fa29c8abSBram Moolenaar    vim9script
1275fa29c8abSBram Moolenaar    import name './Xexport.vim'
1276fa29c8abSBram Moolenaar  END
1277fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
127844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1279fa29c8abSBram Moolenaar
1280cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1281fa29c8abSBram Moolenaar    vim9script
1282fa29c8abSBram Moolenaar    import name from Xexport.vim
1283fa29c8abSBram Moolenaar  END
1284fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
128544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1286fa29c8abSBram Moolenaar
1287cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1288fa29c8abSBram Moolenaar    vim9script
1289fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1290fa29c8abSBram Moolenaar  END
1291fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
129244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1293fa29c8abSBram Moolenaar
1294cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1295fa29c8abSBram Moolenaar    vim9script
1296fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1297fa29c8abSBram Moolenaar  END
12985269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
129944d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1300fa29c8abSBram Moolenaar
1301f2d5c240SBram Moolenaar  delete('Ximport.vim')
13025269bd2aSBram Moolenaar  delete('Ximport3.vim')
13038a7d6542SBram Moolenaar  delete('Xexport.vim')
13048a7d6542SBram Moolenaar
1305f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
13063e191694SBram Moolenaar  # Flags added or removed are also applied to the restored value.
13073e191694SBram Moolenaar  set cpo=abcd
1308cfcd011fSBram Moolenaar  var lines =<< trim END
1309750802b5SBram Moolenaar    vim9script
1310750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
13113e191694SBram Moolenaar    set cpo+=f
13123e191694SBram Moolenaar    set cpo-=c
13133e191694SBram Moolenaar    g:cpo_after_vim9script = &cpo
1314750802b5SBram Moolenaar  END
1315750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1316750802b5SBram Moolenaar  source Xvim9_script
13173e191694SBram Moolenaar  assert_equal('fabd', &cpo)
1318750802b5SBram Moolenaar  set cpo&vim
1319750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
13203e191694SBram Moolenaar  var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
13213e191694SBram Moolenaar  assert_equal(newcpo, g:cpo_after_vim9script)
13223e191694SBram Moolenaar
1323750802b5SBram Moolenaar  delete('Xvim9_script')
1324750802b5SBram Moolenaarenddef
1325750802b5SBram Moolenaar
13260a84284eSBram Moolenaardef Test_import_as()
13270a84284eSBram Moolenaar  var export_lines =<< trim END
13280a84284eSBram Moolenaar    vim9script
13290a84284eSBram Moolenaar    export var one = 1
13300a84284eSBram Moolenaar    export var yes = 'yes'
13310a84284eSBram Moolenaar  END
13320a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
13330a84284eSBram Moolenaar
13340a84284eSBram Moolenaar  var import_lines =<< trim END
13350a84284eSBram Moolenaar    vim9script
13366c7cc347SBram Moolenaar    var one = 'notused'
13376c7cc347SBram Moolenaar    var yes = 777
13380a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
13390a84284eSBram Moolenaar    assert_equal(1, thatOne)
13400a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
13410a84284eSBram Moolenaar    assert_equal('yes', yesYes)
13420a84284eSBram Moolenaar  END
13430a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
13440a84284eSBram Moolenaar
13450a84284eSBram Moolenaar  import_lines =<< trim END
13460a84284eSBram Moolenaar    vim9script
13470a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
13480a84284eSBram Moolenaar    assert_equal(1, thatOne)
13490a84284eSBram Moolenaar    assert_equal('yes', yesYes)
13500a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
13510a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
13520a84284eSBram Moolenaar  END
13530a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
13540a84284eSBram Moolenaar
13550a84284eSBram Moolenaar  delete('XexportAs')
13560a84284eSBram Moolenaarenddef
13570a84284eSBram Moolenaar
1358803af686SBram Moolenaarfunc g:Trigger()
1359803af686SBram Moolenaar  source Ximport.vim
1360803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1361803af686SBram Moolenaarendfunc
1362803af686SBram Moolenaar
1363803af686SBram Moolenaardef Test_import_export_expr_map()
1364803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1365cfcd011fSBram Moolenaar  var export_lines =<< trim END
1366803af686SBram Moolenaar    vim9script
1367803af686SBram Moolenaar    export def That(): string
1368803af686SBram Moolenaar      return 'yes'
1369803af686SBram Moolenaar    enddef
1370803af686SBram Moolenaar  END
1371803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1372803af686SBram Moolenaar
1373cfcd011fSBram Moolenaar  var import_lines =<< trim END
1374803af686SBram Moolenaar    vim9script
1375803af686SBram Moolenaar    import That from './Xexport_that.vim'
1376803af686SBram Moolenaar    assert_equal('yes', That())
1377803af686SBram Moolenaar  END
1378803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1379803af686SBram Moolenaar
1380803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1381803af686SBram Moolenaar  feedkeys('trigger', "xt")
1382803af686SBram Moolenaar
1383730b2483SBram Moolenaar  delete('Xexport_that.vim')
1384803af686SBram Moolenaar  delete('Ximport.vim')
1385803af686SBram Moolenaar  nunmap trigger
1386803af686SBram Moolenaarenddef
1387803af686SBram Moolenaar
13888e1986e3SBram Moolenaardef Test_import_in_filetype()
13898e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
13908e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1391cfcd011fSBram Moolenaar  var export_lines =<< trim END
13928e1986e3SBram Moolenaar    vim9script
1393cfcd011fSBram Moolenaar    export var That = 'yes'
13948e1986e3SBram Moolenaar  END
1395730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
13968e1986e3SBram Moolenaar
1397cfcd011fSBram Moolenaar  var import_lines =<< trim END
13988e1986e3SBram Moolenaar    vim9script
1399730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
14008e1986e3SBram Moolenaar    assert_equal('yes', That)
14018e1986e3SBram Moolenaar    g:did_load_mytpe = 1
14028e1986e3SBram Moolenaar  END
14038e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
14048e1986e3SBram Moolenaar
1405cfcd011fSBram Moolenaar  var save_rtp = &rtp
14068e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
14078e1986e3SBram Moolenaar
14088e1986e3SBram Moolenaar  filetype plugin on
14098e1986e3SBram Moolenaar  copen
14108e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
14118e1986e3SBram Moolenaar
14128e1986e3SBram Moolenaar  quit!
1413730b2483SBram Moolenaar  delete('Xexport_ft.vim')
14148e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
14158e1986e3SBram Moolenaar  &rtp = save_rtp
14168e1986e3SBram Moolenaarenddef
14178e1986e3SBram Moolenaar
1418efa94447SBram Moolenaardef Test_use_import_in_mapping()
1419cfcd011fSBram Moolenaar  var lines =<< trim END
1420efa94447SBram Moolenaar      vim9script
1421efa94447SBram Moolenaar      export def Funcx()
1422efa94447SBram Moolenaar        g:result = 42
1423efa94447SBram Moolenaar      enddef
1424efa94447SBram Moolenaar  END
1425efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1426efa94447SBram Moolenaar  lines =<< trim END
1427efa94447SBram Moolenaar      vim9script
1428efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1429b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1430efa94447SBram Moolenaar  END
1431efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1432efa94447SBram Moolenaar
1433efa94447SBram Moolenaar  source Xmapscript.vim
1434b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1435efa94447SBram Moolenaar  assert_equal(42, g:result)
1436efa94447SBram Moolenaar
1437efa94447SBram Moolenaar  unlet g:result
1438efa94447SBram Moolenaar  delete('XsomeExport.vim')
1439efa94447SBram Moolenaar  delete('Xmapscript.vim')
1440b3ca9824SBram Moolenaar  nunmap <F3>
1441efa94447SBram Moolenaarenddef
1442efa94447SBram Moolenaar
1443d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1444d3f8a9eeSBram Moolenaar  var lines =<< trim END
1445d3f8a9eeSBram Moolenaar    if has(g:feature)
1446d3f8a9eeSBram Moolenaar      " legacy script
1447d3f8a9eeSBram Moolenaar      let g:legacy = 1
1448d3f8a9eeSBram Moolenaar      finish
1449d3f8a9eeSBram Moolenaar    endif
1450d3f8a9eeSBram Moolenaar    vim9script
1451d3f8a9eeSBram Moolenaar    g:legacy = 0
1452d3f8a9eeSBram Moolenaar  END
1453d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1454d3f8a9eeSBram Moolenaar  g:legacy = -1
1455d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1456d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1457d3f8a9eeSBram Moolenaar
1458d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1459d3f8a9eeSBram Moolenaar  g:legacy = -1
1460d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1461d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1462d3f8a9eeSBram Moolenaarenddef
1463d3f8a9eeSBram Moolenaar
1464750802b5SBram Moolenaardef Test_vim9script_fails()
14658a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
14668a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1467cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
14689721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1469cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1470750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1471750802b5SBram Moolenaar
1472cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1473c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1474c785b9a7SBram Moolenaar
1475e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1476e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
14778a7d6542SBram Moolenaarenddef
14788a7d6542SBram Moolenaar
1479f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1480101f4810SBram Moolenaar  CheckRunVimInTerminal
1481101f4810SBram Moolenaar
14829bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1483c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
14849bb3eb3eSBram Moolenaarendfunc
14859bb3eb3eSBram Moolenaar
1486c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1487cfcd011fSBram Moolenaar  var export =<< trim END
1488101f4810SBram Moolenaar    vim9script
1489101f4810SBram Moolenaar    export def Foo(): number
1490101f4810SBram Moolenaar        return 0
1491101f4810SBram Moolenaar    enddef
1492101f4810SBram Moolenaar  END
1493730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1494101f4810SBram Moolenaar
1495e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
14969bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
14972949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1498101f4810SBram Moolenaar
1499730b2483SBram Moolenaar  delete('XexportCmd.vim')
15009bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
15019bb3eb3eSBram Moolenaarenddef
1502101f4810SBram Moolenaar
15032b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
15042b32700dSBram Moolenaar  var lines =<< trim END
1505a6294955SBram Moolenaar    vim9script
1506a6294955SBram Moolenaar    export var exported = 'thexport'
1507a6294955SBram Moolenaar  END
1508a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1509a6294955SBram Moolenaar  lines =<< trim END
15102b32700dSBram Moolenaar    vim9script noclear
15112b32700dSBram Moolenaar    g:loadCount += 1
15122b32700dSBram Moolenaar    var s:reloaded = 'init'
1513a6294955SBram Moolenaar    import exported from './XExportReload'
15142b32700dSBram Moolenaar
15152b32700dSBram Moolenaar    def Again(): string
15162b32700dSBram Moolenaar      return 'again'
15172b32700dSBram Moolenaar    enddef
15182b32700dSBram Moolenaar
15192b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
15202b32700dSBram Moolenaar    var s:loaded = true
15212b32700dSBram Moolenaar
15222b32700dSBram Moolenaar    var s:notReloaded = 'yes'
15232b32700dSBram Moolenaar    s:reloaded = 'first'
15242b32700dSBram Moolenaar    def g:Values(): list<string>
1525a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
15262b32700dSBram Moolenaar    enddef
15272b32700dSBram Moolenaar
15282b32700dSBram Moolenaar    def Once(): string
15292b32700dSBram Moolenaar      return 'once'
15302b32700dSBram Moolenaar    enddef
15312b32700dSBram Moolenaar  END
15322b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
15332b32700dSBram Moolenaar  g:loadCount = 0
15342b32700dSBram Moolenaar  source XReloaded
15352b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1536a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
15372b32700dSBram Moolenaar  source XReloaded
15382b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1539a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
15402b32700dSBram Moolenaar  source XReloaded
15412b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1542a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
15432b32700dSBram Moolenaar
154448e11c10SBram Moolenaar  delete('XReloaded')
1545a6294955SBram Moolenaar  delete('XExportReload')
15462b32700dSBram Moolenaar  delfunc g:Values
15472b32700dSBram Moolenaar  unlet g:loadCount
1548577dc93dSBram Moolenaar
1549577dc93dSBram Moolenaar  lines =<< trim END
1550577dc93dSBram Moolenaar      vim9script
1551577dc93dSBram Moolenaar      def Inner()
1552577dc93dSBram Moolenaar      enddef
1553577dc93dSBram Moolenaar  END
1554577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1555577dc93dSBram Moolenaar  source XreloadScript.vim
1556577dc93dSBram Moolenaar
1557577dc93dSBram Moolenaar  lines =<< trim END
1558577dc93dSBram Moolenaar      vim9script
1559577dc93dSBram Moolenaar      def Outer()
1560577dc93dSBram Moolenaar        def Inner()
1561577dc93dSBram Moolenaar        enddef
1562577dc93dSBram Moolenaar      enddef
1563577dc93dSBram Moolenaar      defcompile
1564577dc93dSBram Moolenaar  END
1565577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1566577dc93dSBram Moolenaar  source XreloadScript.vim
1567577dc93dSBram Moolenaar
1568577dc93dSBram Moolenaar  delete('XreloadScript.vim')
15692b32700dSBram Moolenaarenddef
15702b32700dSBram Moolenaar
15714c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1572cfcd011fSBram Moolenaar  var lines =<< trim END
15738a7d6542SBram Moolenaar    vim9script
15748a7d6542SBram Moolenaar    const var = ''
1575cfcd011fSBram Moolenaar    var valone = 1234
15768a7d6542SBram Moolenaar    def MyFunc(arg: string)
15778a7d6542SBram Moolenaar       valone = 5678
15788a7d6542SBram Moolenaar    enddef
15798a7d6542SBram Moolenaar  END
1580cfcd011fSBram Moolenaar  var morelines =<< trim END
1581cfcd011fSBram Moolenaar    var valtwo = 222
15828a7d6542SBram Moolenaar    export def GetValtwo(): number
15838a7d6542SBram Moolenaar      return valtwo
15848a7d6542SBram Moolenaar    enddef
15858a7d6542SBram Moolenaar  END
158603afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
15878a7d6542SBram Moolenaar  source Xreload.vim
15888a7d6542SBram Moolenaar  source Xreload.vim
15898a7d6542SBram Moolenaar  source Xreload.vim
15908a7d6542SBram Moolenaar
1591cfcd011fSBram Moolenaar  var testlines =<< trim END
15928a7d6542SBram Moolenaar    vim9script
15938a7d6542SBram Moolenaar    def TheFunc()
15948a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
15958a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
15968a7d6542SBram Moolenaar    enddef
15978a7d6542SBram Moolenaar    TheFunc()
15988a7d6542SBram Moolenaar  END
15998a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
16008a7d6542SBram Moolenaar  source Ximport.vim
16018a7d6542SBram Moolenaar
1602f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1603f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
16048a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
16058a7d6542SBram Moolenaar  source Ximport.vim
16068a7d6542SBram Moolenaar
1607f5be8cdbSBram Moolenaar  # cannot declare a var twice
16088a7d6542SBram Moolenaar  lines =<< trim END
16098a7d6542SBram Moolenaar    vim9script
1610cfcd011fSBram Moolenaar    var valone = 1234
1611cfcd011fSBram Moolenaar    var valone = 5678
16128a7d6542SBram Moolenaar  END
16138a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
161444d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
16158a7d6542SBram Moolenaar
16168a7d6542SBram Moolenaar  delete('Xreload.vim')
16178a7d6542SBram Moolenaar  delete('Ximport.vim')
16188a7d6542SBram Moolenaarenddef
16198a7d6542SBram Moolenaar
162007a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
162107a65d26SBram Moolenaar" compiled function using that variable must fail.
162207a65d26SBram Moolenaardef Test_script_reload_change_type()
162307a65d26SBram Moolenaar  var lines =<< trim END
162407a65d26SBram Moolenaar    vim9script noclear
162507a65d26SBram Moolenaar    var str = 'string'
162607a65d26SBram Moolenaar    def g:GetStr(): string
162707a65d26SBram Moolenaar      return str .. 'xxx'
162807a65d26SBram Moolenaar    enddef
162907a65d26SBram Moolenaar  END
163007a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
163107a65d26SBram Moolenaar  source Xreload.vim
163207a65d26SBram Moolenaar  echo g:GetStr()
163307a65d26SBram Moolenaar
163407a65d26SBram Moolenaar  lines =<< trim END
163507a65d26SBram Moolenaar    vim9script noclear
163607a65d26SBram Moolenaar    var str = 1234
163707a65d26SBram Moolenaar  END
163807a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
163907a65d26SBram Moolenaar  source Xreload.vim
164007a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
164107a65d26SBram Moolenaar
164207a65d26SBram Moolenaar  delfunc g:GetStr
164307a65d26SBram Moolenaar  delete('Xreload.vim')
164407a65d26SBram Moolenaarenddef
164507a65d26SBram Moolenaar
1646c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled
1647c970e422SBram Moolenaarcommand CallFunc echo 'nop'
1648c970e422SBram Moolenaar
1649c970e422SBram Moolenaardef Test_script_reload_from_function()
1650c970e422SBram Moolenaar  var lines =<< trim END
1651c970e422SBram Moolenaar      vim9script
1652c970e422SBram Moolenaar
1653c970e422SBram Moolenaar      if exists('g:loaded')
1654c970e422SBram Moolenaar        finish
1655c970e422SBram Moolenaar      endif
1656c970e422SBram Moolenaar      g:loaded = 1
1657c970e422SBram Moolenaar      delcommand CallFunc
1658c970e422SBram Moolenaar      command CallFunc Func()
1659c970e422SBram Moolenaar      def Func()
1660a4c81beaSBram Moolenaar        so XreloadFunc.vim
1661c970e422SBram Moolenaar        g:didTheFunc = 1
1662c970e422SBram Moolenaar      enddef
1663c970e422SBram Moolenaar  END
1664c970e422SBram Moolenaar  writefile(lines, 'XreloadFunc.vim')
1665c970e422SBram Moolenaar  source XreloadFunc.vim
1666c970e422SBram Moolenaar  CallFunc
1667c970e422SBram Moolenaar  assert_equal(1, g:didTheFunc)
1668c970e422SBram Moolenaar
1669c970e422SBram Moolenaar  delete('XreloadFunc.vim')
1670c970e422SBram Moolenaar  delcommand CallFunc
1671c970e422SBram Moolenaar  unlet g:loaded
1672c970e422SBram Moolenaar  unlet g:didTheFunc
1673c970e422SBram Moolenaarenddef
1674c970e422SBram Moolenaar
16756c3843caSBram Moolenaardef Test_script_var_shadows_function()
16766c3843caSBram Moolenaar  var lines =<< trim END
16776c3843caSBram Moolenaar      vim9script
16786c3843caSBram Moolenaar      def Func(): number
16796c3843caSBram Moolenaar        return 123
16806c3843caSBram Moolenaar      enddef
16816c3843caSBram Moolenaar      var Func = 1
16826c3843caSBram Moolenaar  END
16836c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
16846c3843caSBram Moolenaarenddef
16856c3843caSBram Moolenaar
168695006e3dSBram Moolenaardef s:RetSome(): string
168795006e3dSBram Moolenaar  return 'some'
168895006e3dSBram Moolenaarenddef
168995006e3dSBram Moolenaar
1690fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1691fe465a01SBram Moolenaar" script-local name.
1692fe465a01SBram Moolenaardef Test_vim9script_funcref()
1693cfcd011fSBram Moolenaar  var sortlines =<< trim END
1694fe465a01SBram Moolenaar      vim9script
1695fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1696bed36b93SBram Moolenaar        return i2 - i1
1697fe465a01SBram Moolenaar      enddef
1698fe465a01SBram Moolenaar
1699fe465a01SBram Moolenaar      export def FastSort(): list<number>
1700fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1701fe465a01SBram Moolenaar      enddef
1702529fb5a5SBram Moolenaar
1703529fb5a5SBram Moolenaar      export def GetString(arg: string): string
1704529fb5a5SBram Moolenaar        return arg
1705529fb5a5SBram Moolenaar      enddef
1706fe465a01SBram Moolenaar  END
1707fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1708fe465a01SBram Moolenaar
1709cfcd011fSBram Moolenaar  var lines =<< trim END
1710fe465a01SBram Moolenaar    vim9script
1711fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1712fe465a01SBram Moolenaar    def Test()
1713fe465a01SBram Moolenaar      g:result = FastSort()
1714fe465a01SBram Moolenaar    enddef
1715fe465a01SBram Moolenaar    Test()
1716529fb5a5SBram Moolenaar
1717529fb5a5SBram Moolenaar    # using a function imported with "as"
1718529fb5a5SBram Moolenaar    import * as anAlias from './Xsort.vim'
1719529fb5a5SBram Moolenaar    assert_equal('yes', anAlias.GetString('yes'))
1720529fb5a5SBram Moolenaar
1721529fb5a5SBram Moolenaar    # using the function from a compiled function
1722529fb5a5SBram Moolenaar    def TestMore(): string
1723ca51cc0aSBram Moolenaar      var s = s:anAlias.GetString('foo')
1724ca51cc0aSBram Moolenaar      return s .. anAlias.GetString('bar')
1725529fb5a5SBram Moolenaar    enddef
1726ca51cc0aSBram Moolenaar    assert_equal('foobar', TestMore())
1727529fb5a5SBram Moolenaar
1728529fb5a5SBram Moolenaar    # error when using a function that isn't exported
1729529fb5a5SBram Moolenaar    assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1730fe465a01SBram Moolenaar  END
1731fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1732fe465a01SBram Moolenaar
1733fe465a01SBram Moolenaar  source Xscript.vim
1734fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1735fe465a01SBram Moolenaar
1736fe465a01SBram Moolenaar  unlet g:result
1737fe465a01SBram Moolenaar  delete('Xsort.vim')
1738fe465a01SBram Moolenaar  delete('Xscript.vim')
173995006e3dSBram Moolenaar
1740cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
174195006e3dSBram Moolenaar  assert_equal('some', Funcref())
1742fe465a01SBram Moolenaarenddef
1743fe465a01SBram Moolenaar
1744601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1745601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1746601e76acSBram Moolenaar" function reference.
1747c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1748cfcd011fSBram Moolenaar  var filterLines =<< trim END
1749c620c055SBram Moolenaar    vim9script
1750c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1751c620c055SBram Moolenaar      return idx % 2 == 1
1752c620c055SBram Moolenaar    enddef
1753c620c055SBram Moolenaar    export def FastFilter(): list<number>
1754c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1755c620c055SBram Moolenaar    enddef
1756601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1757601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1758601e76acSBram Moolenaar    enddef
1759c620c055SBram Moolenaar  END
1760c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1761c620c055SBram Moolenaar
1762cfcd011fSBram Moolenaar  var lines =<< trim END
1763c620c055SBram Moolenaar    vim9script
1764601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1765c620c055SBram Moolenaar    def Test()
1766cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1767c620c055SBram Moolenaar    enddef
1768c620c055SBram Moolenaar    Test()
1769601e76acSBram Moolenaar    def TestDirect()
1770cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1771601e76acSBram Moolenaar    enddef
1772601e76acSBram Moolenaar    TestDirect()
1773c620c055SBram Moolenaar  END
1774601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1775c620c055SBram Moolenaar  delete('Xfilter.vim')
1776c620c055SBram Moolenaarenddef
1777c620c055SBram Moolenaar
17784c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1779cfcd011fSBram Moolenaar  var first_lines =<< trim END
17804c17ad94SBram Moolenaar    vim9script
17814c17ad94SBram Moolenaar    def FuncYes(): string
17824c17ad94SBram Moolenaar      return 'yes'
17834c17ad94SBram Moolenaar    enddef
17844c17ad94SBram Moolenaar  END
1785cfcd011fSBram Moolenaar  var withno_lines =<< trim END
17864c17ad94SBram Moolenaar    def FuncNo(): string
17874c17ad94SBram Moolenaar      return 'no'
17884c17ad94SBram Moolenaar    enddef
17894c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
17904c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
17914c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
179203afdcf1SBram Moolenaar    enddef
179303afdcf1SBram Moolenaar  END
1794cfcd011fSBram Moolenaar  var nono_lines =<< trim END
179503afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
179603afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
179744d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
17984c17ad94SBram Moolenaar    enddef
17994c17ad94SBram Moolenaar  END
18004c17ad94SBram Moolenaar
18014c17ad94SBram Moolenaar  # FuncNo() is defined
180203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
18034c17ad94SBram Moolenaar  source Xreloaded.vim
18044c17ad94SBram Moolenaar  g:DoCheck(true)
18054c17ad94SBram Moolenaar
18064c17ad94SBram Moolenaar  # FuncNo() is not redefined
180703afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
18084c17ad94SBram Moolenaar  source Xreloaded.vim
18095082471fSBram Moolenaar  g:DoCheck(false)
18104c17ad94SBram Moolenaar
18114c17ad94SBram Moolenaar  # FuncNo() is back
181203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
18134c17ad94SBram Moolenaar  source Xreloaded.vim
18145082471fSBram Moolenaar  g:DoCheck(false)
18154c17ad94SBram Moolenaar
18164c17ad94SBram Moolenaar  delete('Xreloaded.vim')
18174c17ad94SBram Moolenaarenddef
18184c17ad94SBram Moolenaar
181989483d40SBram Moolenaardef Test_vim9script_reload_delvar()
182089483d40SBram Moolenaar  # write the script with a script-local variable
1821cfcd011fSBram Moolenaar  var lines =<< trim END
182289483d40SBram Moolenaar    vim9script
1823cfcd011fSBram Moolenaar    var name = 'string'
182489483d40SBram Moolenaar  END
182589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
182689483d40SBram Moolenaar  source XreloadVar.vim
182789483d40SBram Moolenaar
182889483d40SBram Moolenaar  # now write the script using the same variable locally - works
182989483d40SBram Moolenaar  lines =<< trim END
183089483d40SBram Moolenaar    vim9script
183189483d40SBram Moolenaar    def Func()
1832cfcd011fSBram Moolenaar      var name = 'string'
183389483d40SBram Moolenaar    enddef
183489483d40SBram Moolenaar  END
183589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
183689483d40SBram Moolenaar  source XreloadVar.vim
183789483d40SBram Moolenaar
183889483d40SBram Moolenaar  delete('XreloadVar.vim')
183989483d40SBram Moolenaarenddef
184089483d40SBram Moolenaar
18418a7d6542SBram Moolenaardef Test_import_absolute()
1842cfcd011fSBram Moolenaar  var import_lines = [
1843e6085c53SBram Moolenaar        'vim9script',
1844e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1845e6085c53SBram Moolenaar        'def UseExported()',
1846e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1847e6085c53SBram Moolenaar        '  exported = 8888',
1848e6085c53SBram Moolenaar        '  g:imported_after = exported',
1849e6085c53SBram Moolenaar        'enddef',
1850e6085c53SBram Moolenaar        'UseExported()',
1851e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1852e6085c53SBram Moolenaar        ]
18538a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
18548a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
18558a7d6542SBram Moolenaar
18568a7d6542SBram Moolenaar  source Ximport_abs.vim
18578a7d6542SBram Moolenaar
18588a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
18594e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1860fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1861fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1862fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1863fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1864fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1865fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1866fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1867fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1868fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1869fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1870e6085c53SBram Moolenaar        g:import_disassembled)
1871b3ca9824SBram Moolenaar
1872b3ca9824SBram Moolenaar  Undo_export_script_lines()
18738a7d6542SBram Moolenaar  unlet g:imported_abs
18744e12a5dfSBram Moolenaar  unlet g:import_disassembled
18758a7d6542SBram Moolenaar
18768a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
18778a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
18788a7d6542SBram Moolenaarenddef
18798a7d6542SBram Moolenaar
18808a7d6542SBram Moolenaardef Test_import_rtp()
1881cfcd011fSBram Moolenaar  var import_lines = [
1882e6085c53SBram Moolenaar        'vim9script',
1883e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1884e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1885e6085c53SBram Moolenaar        ]
18868a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
18878a7d6542SBram Moolenaar  mkdir('import')
18888a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
18898a7d6542SBram Moolenaar
1890cfcd011fSBram Moolenaar  var save_rtp = &rtp
18918a7d6542SBram Moolenaar  &rtp = getcwd()
18928a7d6542SBram Moolenaar  source Ximport_rtp.vim
18938a7d6542SBram Moolenaar  &rtp = save_rtp
18948a7d6542SBram Moolenaar
18958a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
18968a7d6542SBram Moolenaar
1897b3ca9824SBram Moolenaar  Undo_export_script_lines()
1898b3ca9824SBram Moolenaar  unlet g:imported_rtp
18998a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
190089483d40SBram Moolenaar  delete('import', 'rf')
19018a7d6542SBram Moolenaarenddef
19028a7d6542SBram Moolenaar
190325e0f586SBram Moolenaardef Test_import_compile_error()
1904cfcd011fSBram Moolenaar  var export_lines = [
190525e0f586SBram Moolenaar        'vim9script',
190625e0f586SBram Moolenaar        'export def ExpFunc(): string',
190725e0f586SBram Moolenaar        '  return notDefined',
190825e0f586SBram Moolenaar        'enddef',
190925e0f586SBram Moolenaar        ]
191025e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
191125e0f586SBram Moolenaar
1912cfcd011fSBram Moolenaar  var import_lines = [
191325e0f586SBram Moolenaar        'vim9script',
191425e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
191525e0f586SBram Moolenaar        'def ImpFunc()',
191625e0f586SBram Moolenaar        '  echo ExpFunc()',
191725e0f586SBram Moolenaar        'enddef',
191825e0f586SBram Moolenaar        'defcompile',
191925e0f586SBram Moolenaar        ]
192025e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
192125e0f586SBram Moolenaar
192225e0f586SBram Moolenaar  try
192325e0f586SBram Moolenaar    source Ximport.vim
192425e0f586SBram Moolenaar  catch /E1001/
1925f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
19267707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
192725e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
192825e0f586SBram Moolenaar  endtry
192925e0f586SBram Moolenaar
193025e0f586SBram Moolenaar  delete('Xexported.vim')
193125e0f586SBram Moolenaar  delete('Ximport.vim')
193225e0f586SBram Moolenaarenddef
193325e0f586SBram Moolenaar
1934c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1935cfcd011fSBram Moolenaar  var lines = [
1936c4ce36d4SBram Moolenaar        'vim9script',
1937c4ce36d4SBram Moolenaar        'def Func()',
1938c4ce36d4SBram Moolenaar        '  eval [][0]',
1939c4ce36d4SBram Moolenaar        'enddef',
1940c4ce36d4SBram Moolenaar        'Func()',
1941c4ce36d4SBram Moolenaar        ]
1942c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1943c4ce36d4SBram Moolenaar
1944c4ce36d4SBram Moolenaar  for count in range(3)
1945c4ce36d4SBram Moolenaar    try
1946c4ce36d4SBram Moolenaar      source Xtestscript.vim
1947c4ce36d4SBram Moolenaar    catch /E684/
1948c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1949c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1950c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1951c4ce36d4SBram Moolenaar    endtry
1952c4ce36d4SBram Moolenaar  endfor
1953c4ce36d4SBram Moolenaar
1954c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1955c4ce36d4SBram Moolenaarenddef
1956c4ce36d4SBram Moolenaar
1957eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1958cfcd011fSBram Moolenaar  var export_lines =<< trim END
1959eef2102eSBram Moolenaar      vim9script
1960eef2102eSBram Moolenaar      export def Func()
1961eef2102eSBram Moolenaar        echo 'imported'
1962eef2102eSBram Moolenaar      enddef
1963eef2102eSBram Moolenaar  END
1964eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1965eef2102eSBram Moolenaar
1966cfcd011fSBram Moolenaar  var lines =<< trim END
1967eef2102eSBram Moolenaar    vim9script
1968eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1969eef2102eSBram Moolenaar    def Func()
1970eef2102eSBram Moolenaar      echo 'local to function'
1971eef2102eSBram Moolenaar    enddef
1972eef2102eSBram Moolenaar  END
1973eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1974eef2102eSBram Moolenaar
1975eef2102eSBram Moolenaar  lines =<< trim END
1976eef2102eSBram Moolenaar    vim9script
1977eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1978eef2102eSBram Moolenaar    def Outer()
1979eef2102eSBram Moolenaar      def Func()
1980eef2102eSBram Moolenaar        echo 'local to function'
1981eef2102eSBram Moolenaar      enddef
1982eef2102eSBram Moolenaar    enddef
1983eef2102eSBram Moolenaar    defcompile
1984eef2102eSBram Moolenaar  END
1985eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1986eef2102eSBram Moolenaar
1987eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1988eef2102eSBram Moolenaarenddef
1989eef2102eSBram Moolenaar
1990b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1991cfcd011fSBram Moolenaar  var lines =<< trim END
1992b9a2cac3SBram Moolenaar    vim9script
1993b9a2cac3SBram Moolenaar    def Func()
1994b9a2cac3SBram Moolenaar      echo 'one'
1995b9a2cac3SBram Moolenaar    enddef
1996b9a2cac3SBram Moolenaar    def Func()
1997b9a2cac3SBram Moolenaar      echo 'two'
1998b9a2cac3SBram Moolenaar    enddef
1999b9a2cac3SBram Moolenaar  END
2000b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2001fa211f3cSBram Moolenaar
2002fa211f3cSBram Moolenaar  lines =<< trim END
2003fa211f3cSBram Moolenaar    vim9script
2004fa211f3cSBram Moolenaar    def Foo(): string
2005fa211f3cSBram Moolenaar      return 'foo'
2006fa211f3cSBram Moolenaar      enddef
2007fa211f3cSBram Moolenaar    def Func()
2008cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
2009fa211f3cSBram Moolenaar    enddef
2010fa211f3cSBram Moolenaar    defcompile
2011fa211f3cSBram Moolenaar  END
2012fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2013b9a2cac3SBram Moolenaarenddef
2014b9a2cac3SBram Moolenaar
20158a7d6542SBram Moolenaardef Test_fixed_size_list()
2016f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
2017cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
20188a7d6542SBram Moolenaar  l->remove(0)
20198a7d6542SBram Moolenaar  l->add(5)
20208a7d6542SBram Moolenaar  l->insert(99, 1)
20210f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
20228a7d6542SBram Moolenaarenddef
20238a7d6542SBram Moolenaar
2024ae616494SBram Moolenaardef Test_no_insert_xit()
2025d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2026d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2027d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2028d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2029d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2030ae616494SBram Moolenaar
2031ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2032ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2033ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2034ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2035f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2036f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
20376508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
20386508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
2039f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2040f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2041f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2042ae616494SBram Moolenaarenddef
2043ae616494SBram Moolenaar
2044158906cfSBram Moolenaardef IfElse(what: number): string
2045cfcd011fSBram Moolenaar  var res = ''
2046158906cfSBram Moolenaar  if what == 1
2047158906cfSBram Moolenaar    res = "one"
2048158906cfSBram Moolenaar  elseif what == 2
2049158906cfSBram Moolenaar    res = "two"
2050a259d8d3SBram Moolenaar  else
2051158906cfSBram Moolenaar    res = "three"
2052a259d8d3SBram Moolenaar  endif
2053158906cfSBram Moolenaar  return res
2054a259d8d3SBram Moolenaarenddef
2055a259d8d3SBram Moolenaar
2056158906cfSBram Moolenaardef Test_if_elseif_else()
2057158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2058158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2059158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
20600f18b6d1SBram Moolenaarenddef
20610f18b6d1SBram Moolenaar
2062e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2063d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2064d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2065d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2066ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
2067d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
20686628b7ebSBram Moolenaar
20696628b7ebSBram Moolenaar  var lines =<< trim END
20706628b7ebSBram Moolenaar      var s = ''
20716628b7ebSBram Moolenaar      if s = ''
20726628b7ebSBram Moolenaar      endif
20736628b7ebSBram Moolenaar  END
20746628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
20756628b7ebSBram Moolenaar
20766628b7ebSBram Moolenaar  lines =<< trim END
20776628b7ebSBram Moolenaar      var s = ''
20786628b7ebSBram Moolenaar      if s == ''
20796628b7ebSBram Moolenaar      elseif s = ''
20806628b7ebSBram Moolenaar      endif
20816628b7ebSBram Moolenaar  END
20826628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2083e8c4abbbSBram Moolenaarenddef
2084e8c4abbbSBram Moolenaar
20856d69bf60SBram Moolenaarlet g:bool_true = v:true
20866d69bf60SBram Moolenaarlet g:bool_false = v:false
20876d69bf60SBram Moolenaar
20886d69bf60SBram Moolenaardef Test_if_const_expr()
2089cfcd011fSBram Moolenaar  var res = false
20906d69bf60SBram Moolenaar  if true ? true : false
20916d69bf60SBram Moolenaar    res = true
20926d69bf60SBram Moolenaar  endif
20936d69bf60SBram Moolenaar  assert_equal(true, res)
20946d69bf60SBram Moolenaar
2095585fea7bSBram Moolenaar  g:glob = 2
2096585fea7bSBram Moolenaar  if false
20976797966dSBram Moolenaar    execute('g:glob = 3')
2098585fea7bSBram Moolenaar  endif
2099585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2100585fea7bSBram Moolenaar  if true
21016797966dSBram Moolenaar    execute('g:glob = 3')
2102585fea7bSBram Moolenaar  endif
2103585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2104585fea7bSBram Moolenaar
21056d69bf60SBram Moolenaar  res = false
21066d69bf60SBram Moolenaar  if g:bool_true ? true : false
21076d69bf60SBram Moolenaar    res = true
21086d69bf60SBram Moolenaar  endif
21096d69bf60SBram Moolenaar  assert_equal(true, res)
21106d69bf60SBram Moolenaar
21116d69bf60SBram Moolenaar  res = false
21126d69bf60SBram Moolenaar  if true ? g:bool_true : false
21136d69bf60SBram Moolenaar    res = true
21146d69bf60SBram Moolenaar  endif
21156d69bf60SBram Moolenaar  assert_equal(true, res)
21166d69bf60SBram Moolenaar
21176d69bf60SBram Moolenaar  res = false
21186d69bf60SBram Moolenaar  if true ? true : g:bool_false
21196d69bf60SBram Moolenaar    res = true
21206d69bf60SBram Moolenaar  endif
21216d69bf60SBram Moolenaar  assert_equal(true, res)
21226d69bf60SBram Moolenaar
21236d69bf60SBram Moolenaar  res = false
21246d69bf60SBram Moolenaar  if true ? false : true
21256d69bf60SBram Moolenaar    res = true
21266d69bf60SBram Moolenaar  endif
21276d69bf60SBram Moolenaar  assert_equal(false, res)
21286d69bf60SBram Moolenaar
21296d69bf60SBram Moolenaar  res = false
21306d69bf60SBram Moolenaar  if false ? false : true
21316d69bf60SBram Moolenaar    res = true
21326d69bf60SBram Moolenaar  endif
21336d69bf60SBram Moolenaar  assert_equal(true, res)
21346d69bf60SBram Moolenaar
21356d69bf60SBram Moolenaar  res = false
21366d69bf60SBram Moolenaar  if false ? true : false
21376d69bf60SBram Moolenaar    res = true
21386d69bf60SBram Moolenaar  endif
21396d69bf60SBram Moolenaar  assert_equal(false, res)
21406d69bf60SBram Moolenaar
21416d69bf60SBram Moolenaar  res = false
2142e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2143e8c4abbbSBram Moolenaar    res = true
2144e8c4abbbSBram Moolenaar  endif
2145e8c4abbbSBram Moolenaar  assert_equal(false, res)
2146e8c4abbbSBram Moolenaar
2147e8c4abbbSBram Moolenaar  res = false
21486d69bf60SBram Moolenaar  if true && true
21496d69bf60SBram Moolenaar    res = true
21506d69bf60SBram Moolenaar  endif
21516d69bf60SBram Moolenaar  assert_equal(true, res)
21526d69bf60SBram Moolenaar
21536d69bf60SBram Moolenaar  res = false
21546d69bf60SBram Moolenaar  if true && false
21556d69bf60SBram Moolenaar    res = true
21566d69bf60SBram Moolenaar  endif
21576d69bf60SBram Moolenaar  assert_equal(false, res)
21586d69bf60SBram Moolenaar
21596d69bf60SBram Moolenaar  res = false
21606d69bf60SBram Moolenaar  if g:bool_true && false
21616d69bf60SBram Moolenaar    res = true
21626d69bf60SBram Moolenaar  endif
21636d69bf60SBram Moolenaar  assert_equal(false, res)
21646d69bf60SBram Moolenaar
21656d69bf60SBram Moolenaar  res = false
21666d69bf60SBram Moolenaar  if true && g:bool_false
21676d69bf60SBram Moolenaar    res = true
21686d69bf60SBram Moolenaar  endif
21696d69bf60SBram Moolenaar  assert_equal(false, res)
21706d69bf60SBram Moolenaar
21716d69bf60SBram Moolenaar  res = false
21726d69bf60SBram Moolenaar  if false && false
21736d69bf60SBram Moolenaar    res = true
21746d69bf60SBram Moolenaar  endif
21756d69bf60SBram Moolenaar  assert_equal(false, res)
21766d69bf60SBram Moolenaar
21776d69bf60SBram Moolenaar  res = false
21786d69bf60SBram Moolenaar  if true || false
21796d69bf60SBram Moolenaar    res = true
21806d69bf60SBram Moolenaar  endif
21816d69bf60SBram Moolenaar  assert_equal(true, res)
21826d69bf60SBram Moolenaar
21836d69bf60SBram Moolenaar  res = false
21846d69bf60SBram Moolenaar  if g:bool_true || false
21856d69bf60SBram Moolenaar    res = true
21866d69bf60SBram Moolenaar  endif
21876d69bf60SBram Moolenaar  assert_equal(true, res)
21886d69bf60SBram Moolenaar
21896d69bf60SBram Moolenaar  res = false
21906d69bf60SBram Moolenaar  if true || g:bool_false
21916d69bf60SBram Moolenaar    res = true
21926d69bf60SBram Moolenaar  endif
21936d69bf60SBram Moolenaar  assert_equal(true, res)
21946d69bf60SBram Moolenaar
21956d69bf60SBram Moolenaar  res = false
21966d69bf60SBram Moolenaar  if false || false
21976d69bf60SBram Moolenaar    res = true
21986d69bf60SBram Moolenaar  endif
21996d69bf60SBram Moolenaar  assert_equal(false, res)
22003988f64fSBram Moolenaar
22013988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
22023988f64fSBram Moolenaar  if false | eval 0 | endif
22033988f64fSBram Moolenaar  if false | eval burp + 234 | endif
22043988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
22053988f64fSBram Moolenaar  if false
22063988f64fSBram Moolenaar    burp
22073988f64fSBram Moolenaar  endif
220880c34ca3SBram Moolenaarenddef
22096d69bf60SBram Moolenaar
221080c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2211d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2212d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2213d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2214d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
22156d69bf60SBram Moolenaarenddef
22166d69bf60SBram Moolenaar
221772abcf42SBram Moolenaardef RunNested(i: number): number
2218cfcd011fSBram Moolenaar  var x: number = 0
221972abcf42SBram Moolenaar  if i % 2
222072abcf42SBram Moolenaar    if 1
2221f5be8cdbSBram Moolenaar      # comment
222272abcf42SBram Moolenaar    else
2223f5be8cdbSBram Moolenaar      # comment
222472abcf42SBram Moolenaar    endif
222572abcf42SBram Moolenaar    x += 1
222672abcf42SBram Moolenaar  else
222772abcf42SBram Moolenaar    x += 1000
222872abcf42SBram Moolenaar  endif
222972abcf42SBram Moolenaar  return x
223072abcf42SBram Moolenaarenddef
223172abcf42SBram Moolenaar
223272abcf42SBram Moolenaardef Test_nested_if()
223372abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
223472abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
223572abcf42SBram Moolenaarenddef
223672abcf42SBram Moolenaar
2237ad39c094SBram Moolenaardef Test_execute_cmd()
2238e4984290SBram Moolenaar  # missing argument is ignored
2239e4984290SBram Moolenaar  execute
2240e4984290SBram Moolenaar  execute # comment
2241e4984290SBram Moolenaar
2242ad39c094SBram Moolenaar  new
2243ad39c094SBram Moolenaar  setline(1, 'default')
2244d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2245ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2246a72cfb80SBram Moolenaar
2247d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2248a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2249a72cfb80SBram Moolenaar
2250cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2251cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2252a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2253ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2254a72cfb80SBram Moolenaar
2255d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2256ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2257a72cfb80SBram Moolenaar
2258cfcd011fSBram Moolenaar  var cmd_first = 'call '
2259cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2260ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2261ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2262ad39c094SBram Moolenaar  bwipe!
2263585fea7bSBram Moolenaar
2264cfcd011fSBram Moolenaar  var n = true
22652d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
22662d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
22672d6b20d6SBram Moolenaar
2268e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2269e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2270e5abf7afSBram Moolenaar
2271d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2272d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2273d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2274ad39c094SBram Moolenaarenddef
2275ad39c094SBram Moolenaar
227647e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2277f5be8cdbSBram Moolenaar  # only checks line continuation
2278cfcd011fSBram Moolenaar  var lines =<< trim END
227947e880d6SBram Moolenaar      vim9script
228047e880d6SBram Moolenaar      execute 'g:someVar'
228147e880d6SBram Moolenaar                .. ' = ' ..
228247e880d6SBram Moolenaar                   '28'
228347e880d6SBram Moolenaar      assert_equal(28, g:someVar)
228447e880d6SBram Moolenaar      unlet g:someVar
228547e880d6SBram Moolenaar  END
228647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
228747e880d6SBram Moolenaarenddef
228847e880d6SBram Moolenaar
2289ad39c094SBram Moolenaardef Test_echo_cmd()
2290a72cfb80SBram Moolenaar  echo 'some' # comment
2291585fea7bSBram Moolenaar  echon 'thing'
2292ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2293ad39c094SBram Moolenaar
2294a72cfb80SBram Moolenaar  echo "some" # comment
2295a72cfb80SBram Moolenaar  echon "thing"
2296a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2297a72cfb80SBram Moolenaar
2298cfcd011fSBram Moolenaar  var str1 = 'some'
2299cfcd011fSBram Moolenaar  var str2 = 'more'
2300ad39c094SBram Moolenaar  echo str1 str2
2301ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2302a72cfb80SBram Moolenaar
2303d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2304ad39c094SBram Moolenaarenddef
2305ad39c094SBram Moolenaar
2306f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2307f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2308f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2309f93c7feaSBram Moolenaar  echo 'clear'
2310df069eecSBram Moolenaar  :1messages
2311f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2312f93c7feaSBram Moolenaar
2313d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2314f93c7feaSBram Moolenaarenddef
2315f93c7feaSBram Moolenaar
231647e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2317f5be8cdbSBram Moolenaar  # only checks line continuation
2318cfcd011fSBram Moolenaar  var lines =<< trim END
231947e880d6SBram Moolenaar      vim9script
232047e880d6SBram Moolenaar      echomsg 'here'
232147e880d6SBram Moolenaar                .. ' is ' ..
232247e880d6SBram Moolenaar                   'a message'
232347e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
232447e880d6SBram Moolenaar  END
232547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
232647e880d6SBram Moolenaarenddef
232747e880d6SBram Moolenaar
2328f93c7feaSBram Moolenaardef Test_echoerr_cmd()
232940ee466cSBram Moolenaar  try
233040ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
233140ee466cSBram Moolenaar  catch
233240ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
233340ee466cSBram Moolenaar  endtry
2334f93c7feaSBram Moolenaarenddef
2335f93c7feaSBram Moolenaar
233647e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2337f5be8cdbSBram Moolenaar  # only checks line continuation
2338cfcd011fSBram Moolenaar  var lines =<< trim END
233947e880d6SBram Moolenaar      vim9script
234047e880d6SBram Moolenaar      try
234147e880d6SBram Moolenaar        echoerr 'this'
234247e880d6SBram Moolenaar                .. ' is ' ..
234347e880d6SBram Moolenaar                   'wrong'
234447e880d6SBram Moolenaar      catch
234547e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
234647e880d6SBram Moolenaar      endtry
234747e880d6SBram Moolenaar  END
234847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
234947e880d6SBram Moolenaarenddef
235047e880d6SBram Moolenaar
235141fe0617SBram Moolenaardef Test_for_outside_of_function()
2352cfcd011fSBram Moolenaar  var lines =<< trim END
235341fe0617SBram Moolenaar    vim9script
235441fe0617SBram Moolenaar    new
235541fe0617SBram Moolenaar    for var in range(0, 3)
235641fe0617SBram Moolenaar      append(line('$'), var)
235741fe0617SBram Moolenaar    endfor
235841fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
235941fe0617SBram Moolenaar    bwipe!
2360522eefd9SBram Moolenaar
2361522eefd9SBram Moolenaar    var result = ''
2362522eefd9SBram Moolenaar    for i in [1, 2, 3]
2363522eefd9SBram Moolenaar      var loop = ' loop ' .. i
2364522eefd9SBram Moolenaar      result ..= loop
2365522eefd9SBram Moolenaar    endfor
2366522eefd9SBram Moolenaar    assert_equal(' loop 1 loop 2 loop 3', result)
236741fe0617SBram Moolenaar  END
236841fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
236941fe0617SBram Moolenaar  source Xvim9for.vim
237041fe0617SBram Moolenaar  delete('Xvim9for.vim')
237141fe0617SBram Moolenaarenddef
23728a7d6542SBram Moolenaar
2373e8c4abbbSBram Moolenaardef Test_for_loop()
2374f2253963SBram Moolenaar  var lines =<< trim END
2375cfcd011fSBram Moolenaar      var result = ''
2376e8c4abbbSBram Moolenaar      for cnt in range(7)
2377e8c4abbbSBram Moolenaar        if cnt == 4
2378e8c4abbbSBram Moolenaar          break
2379e8c4abbbSBram Moolenaar        endif
2380e8c4abbbSBram Moolenaar        if cnt == 2
2381e8c4abbbSBram Moolenaar          continue
2382e8c4abbbSBram Moolenaar        endif
2383e8c4abbbSBram Moolenaar        result ..= cnt .. '_'
2384e8c4abbbSBram Moolenaar      endfor
2385e8c4abbbSBram Moolenaar      assert_equal('0_1_3_', result)
23860ad3e894SBram Moolenaar
2387cfcd011fSBram Moolenaar      var concat = ''
23880ad3e894SBram Moolenaar      for str in eval('["one", "two"]')
23890ad3e894SBram Moolenaar        concat ..= str
23900ad3e894SBram Moolenaar      endfor
23910ad3e894SBram Moolenaar      assert_equal('onetwo', concat)
239238bd8de5SBram Moolenaar
239338bd8de5SBram Moolenaar      var total = 0
239438bd8de5SBram Moolenaar      for nr in
239538bd8de5SBram Moolenaar          [1, 2, 3]
239638bd8de5SBram Moolenaar        total += nr
239738bd8de5SBram Moolenaar      endfor
239838bd8de5SBram Moolenaar      assert_equal(6, total)
239938bd8de5SBram Moolenaar
240038bd8de5SBram Moolenaar      total = 0
240138bd8de5SBram Moolenaar      for nr
240238bd8de5SBram Moolenaar        in [1, 2, 3]
240338bd8de5SBram Moolenaar        total += nr
240438bd8de5SBram Moolenaar      endfor
240538bd8de5SBram Moolenaar      assert_equal(6, total)
240638bd8de5SBram Moolenaar
240738bd8de5SBram Moolenaar      total = 0
240838bd8de5SBram Moolenaar      for nr
240938bd8de5SBram Moolenaar        in
241038bd8de5SBram Moolenaar        [1, 2, 3]
241138bd8de5SBram Moolenaar        total += nr
241238bd8de5SBram Moolenaar      endfor
241338bd8de5SBram Moolenaar      assert_equal(6, total)
2414036d0714SBram Moolenaar
2415a3589a0dSBram Moolenaar      # with type
2416a3589a0dSBram Moolenaar      total = 0
2417a3589a0dSBram Moolenaar      for n: number in [1, 2, 3]
2418a3589a0dSBram Moolenaar        total += n
2419a3589a0dSBram Moolenaar      endfor
2420a3589a0dSBram Moolenaar      assert_equal(6, total)
2421a3589a0dSBram Moolenaar
2422fe090eb5SBram Moolenaar      var chars = ''
2423fe090eb5SBram Moolenaar      for s: string in 'foobar'
2424fe090eb5SBram Moolenaar        chars ..= s
2425fe090eb5SBram Moolenaar      endfor
2426fe090eb5SBram Moolenaar      assert_equal('foobar', chars)
2427fe090eb5SBram Moolenaar
2428a3589a0dSBram Moolenaar      # unpack with type
2429f2253963SBram Moolenaar      var res = ''
2430a3589a0dSBram Moolenaar      for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2431a3589a0dSBram Moolenaar        res ..= n .. s
2432a3589a0dSBram Moolenaar      endfor
2433a3589a0dSBram Moolenaar      assert_equal('1a2b', res)
2434a3589a0dSBram Moolenaar
2435444d8783SBram Moolenaar      # unpack with one var
2436444d8783SBram Moolenaar      var reslist = []
2437444d8783SBram Moolenaar      for [x] in [['aaa'], ['bbb']]
2438444d8783SBram Moolenaar        reslist->add(x)
2439444d8783SBram Moolenaar      endfor
2440444d8783SBram Moolenaar      assert_equal(['aaa', 'bbb'], reslist)
2441444d8783SBram Moolenaar
2442a3589a0dSBram Moolenaar      # loop over string
2443a3589a0dSBram Moolenaar      res = ''
244474e54fcbSBram Moolenaar      for c in 'aéc̀d'
244574e54fcbSBram Moolenaar        res ..= c .. '-'
244674e54fcbSBram Moolenaar      endfor
244774e54fcbSBram Moolenaar      assert_equal('a-é-c̀-d-', res)
244874e54fcbSBram Moolenaar
244974e54fcbSBram Moolenaar      res = ''
245074e54fcbSBram Moolenaar      for c in ''
245174e54fcbSBram Moolenaar        res ..= c .. '-'
245274e54fcbSBram Moolenaar      endfor
245374e54fcbSBram Moolenaar      assert_equal('', res)
245474e54fcbSBram Moolenaar
245574e54fcbSBram Moolenaar      res = ''
245674e54fcbSBram Moolenaar      for c in test_null_string()
245774e54fcbSBram Moolenaar        res ..= c .. '-'
245874e54fcbSBram Moolenaar      endfor
245974e54fcbSBram Moolenaar      assert_equal('', res)
2460f2253963SBram Moolenaar
2461f2253963SBram Moolenaar      var foo: list<dict<any>> = [
2462f2253963SBram Moolenaar              {a: 'Cat'}
2463f2253963SBram Moolenaar            ]
2464f2253963SBram Moolenaar      for dd in foo
2465f2253963SBram Moolenaar        dd.counter = 12
2466f2253963SBram Moolenaar      endfor
2467f2253963SBram Moolenaar      assert_equal([{a: 'Cat', counter: 12}], foo)
2468f2253963SBram Moolenaar  END
2469f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2470e8c4abbbSBram Moolenaarenddef
2471e8c4abbbSBram Moolenaar
2472e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2473025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2474025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2475025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2476675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2477675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2478cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2479822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
24802d870f8dSBram Moolenaar  delfunc! g:Func
2481675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2482675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2483675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
248474e54fcbSBram Moolenaar
248574e54fcbSBram Moolenaar  # wrong type detected at compile time
248674e54fcbSBram Moolenaar  CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
248774e54fcbSBram Moolenaar
248874e54fcbSBram Moolenaar  # wrong type detected at runtime
248974e54fcbSBram Moolenaar  g:adict = {a: 1}
249074e54fcbSBram Moolenaar  CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
249174e54fcbSBram Moolenaar  unlet g:adict
2492f6a8d420SBram Moolenaar
2493f6a8d420SBram Moolenaar  var lines =<< trim END
2494f6a8d420SBram Moolenaar      var d: list<dict<any>> = [{a: 0}]
2495f6a8d420SBram Moolenaar      for e in d
2496f6a8d420SBram Moolenaar        e = {a: 0, b: ''}
2497f6a8d420SBram Moolenaar      endfor
2498f6a8d420SBram Moolenaar  END
2499f6a8d420SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3)
2500fe090eb5SBram Moolenaar
2501fe090eb5SBram Moolenaar  lines =<< trim END
2502fe090eb5SBram Moolenaar      for nr: number in ['foo']
2503fe090eb5SBram Moolenaar      endfor
2504fe090eb5SBram Moolenaar  END
2505fe090eb5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2506e8c4abbbSBram Moolenaarenddef
2507e8c4abbbSBram Moolenaar
2508ea87069dSBram Moolenaardef Test_for_loop_script_var()
2509ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2510ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2511ea87069dSBram Moolenaar
2512ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2513ea87069dSBram Moolenaar  var lines =<< trim END
2514ea87069dSBram Moolenaar    vim9script
2515ea87069dSBram Moolenaar    var total = 0
2516ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2517ea87069dSBram Moolenaar      total += s:var
2518ea87069dSBram Moolenaar    endfor
2519ea87069dSBram Moolenaar    assert_equal(6, total)
2520ea87069dSBram Moolenaar
2521ea87069dSBram Moolenaar    total = 0
2522ea87069dSBram Moolenaar    for var in [1, 2, 3]
2523ea87069dSBram Moolenaar      total += var
2524ea87069dSBram Moolenaar    endfor
2525ea87069dSBram Moolenaar    assert_equal(6, total)
2526ea87069dSBram Moolenaar  END
2527ea87069dSBram Moolenaarenddef
2528ea87069dSBram Moolenaar
2529792f786aSBram Moolenaardef Test_for_loop_unpack()
25304b8a0651SBram Moolenaar  var lines =<< trim END
2531792f786aSBram Moolenaar      var result = []
2532792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2533792f786aSBram Moolenaar        result->add(v1)
2534792f786aSBram Moolenaar        result->add(v2)
2535792f786aSBram Moolenaar      endfor
2536792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2537792f786aSBram Moolenaar
2538792f786aSBram Moolenaar      result = []
2539792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2540792f786aSBram Moolenaar        result->add(v1)
2541792f786aSBram Moolenaar        result->add(v2)
2542792f786aSBram Moolenaar        result->add(v3)
2543792f786aSBram Moolenaar      endfor
2544792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2545792f786aSBram Moolenaar
25464b8a0651SBram Moolenaar      result = []
25474b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
25484b8a0651SBram Moolenaar        result->add(&ts)
25494b8a0651SBram Moolenaar        result->add(&sw)
25504b8a0651SBram Moolenaar      endfor
25514b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
25524b8a0651SBram Moolenaar
25534b8a0651SBram Moolenaar      var slist: list<string>
25544b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
25554b8a0651SBram Moolenaar        slist->add($LOOPVAR)
25564b8a0651SBram Moolenaar        slist->add(@r)
25574b8a0651SBram Moolenaar        slist->add(v:errmsg)
25584b8a0651SBram Moolenaar      endfor
25594b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
25604b8a0651SBram Moolenaar
25614b8a0651SBram Moolenaar      slist = []
25624b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
25634b8a0651SBram Moolenaar        slist->add(g:globalvar)
25644b8a0651SBram Moolenaar        slist->add(b:bufvar)
25654b8a0651SBram Moolenaar        slist->add(w:winvar)
25664b8a0651SBram Moolenaar        slist->add(t:tabvar)
25674b8a0651SBram Moolenaar      endfor
25684b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2569f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
2570b777da9bSBram Moolenaar
2571b777da9bSBram Moolenaar      var res = []
2572b777da9bSBram Moolenaar      for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2573b777da9bSBram Moolenaar        res->add(n)
2574b777da9bSBram Moolenaar      endfor
2575b777da9bSBram Moolenaar      assert_equal([2, 5], res)
25764b8a0651SBram Moolenaar  END
25774b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
25784b8a0651SBram Moolenaar
25794b8a0651SBram Moolenaar  lines =<< trim END
2580792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2581792f786aSBram Moolenaar        echo v1 v2
2582792f786aSBram Moolenaar      endfor
2583792f786aSBram Moolenaar  END
2584792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2585792f786aSBram Moolenaar
2586792f786aSBram Moolenaar  lines =<< trim END
2587792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2588792f786aSBram Moolenaar        echo v1 v2
2589792f786aSBram Moolenaar      endfor
2590792f786aSBram Moolenaar  END
2591792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2592792f786aSBram Moolenaar
2593792f786aSBram Moolenaar  lines =<< trim END
2594792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2595792f786aSBram Moolenaar        echo v1
2596792f786aSBram Moolenaar      endfor
2597792f786aSBram Moolenaar  END
2598792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2599792f786aSBram Moolenaarenddef
2600792f786aSBram Moolenaar
2601c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2602f2253963SBram Moolenaar  var lines =<< trim END
2603c150c09eSBram Moolenaar      var looped = 0
2604c150c09eSBram Moolenaar      var cleanup = 0
2605c150c09eSBram Moolenaar      for i in range(3)
2606c150c09eSBram Moolenaar        looped += 1
2607c150c09eSBram Moolenaar        try
2608c150c09eSBram Moolenaar          eval [][0]
2609c150c09eSBram Moolenaar        catch
2610c150c09eSBram Moolenaar          continue
2611c150c09eSBram Moolenaar        finally
2612c150c09eSBram Moolenaar          cleanup += 1
2613c150c09eSBram Moolenaar        endtry
2614c150c09eSBram Moolenaar      endfor
2615c150c09eSBram Moolenaar      assert_equal(3, looped)
2616c150c09eSBram Moolenaar      assert_equal(3, cleanup)
2617f2253963SBram Moolenaar  END
2618f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2619c150c09eSBram Moolenaarenddef
2620c150c09eSBram Moolenaar
2621d0df1aacSBram Moolenaardef Test_while_loop()
2622cfcd011fSBram Moolenaar  var result = ''
2623cfcd011fSBram Moolenaar  var cnt = 0
2624d0df1aacSBram Moolenaar  while cnt < 555
2625d0df1aacSBram Moolenaar    if cnt == 3
2626d0df1aacSBram Moolenaar      break
2627d0df1aacSBram Moolenaar    endif
2628d0df1aacSBram Moolenaar    cnt += 1
2629d0df1aacSBram Moolenaar    if cnt == 2
2630d0df1aacSBram Moolenaar      continue
2631d0df1aacSBram Moolenaar    endif
2632d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2633d0df1aacSBram Moolenaar  endwhile
2634d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2635dee37dc7SBram Moolenaar
2636dee37dc7SBram Moolenaar  var s = ''
26370123cc1eSBram Moolenaar  while s == 'x' # {comment}
2638dee37dc7SBram Moolenaar  endwhile
2639d0df1aacSBram Moolenaarenddef
2640d0df1aacSBram Moolenaar
2641e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2642675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2643675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2644675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2645675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2646675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2647675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2648675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
26496628b7ebSBram Moolenaar
26506628b7ebSBram Moolenaar  var lines =<< trim END
26516628b7ebSBram Moolenaar      var s = ''
26526628b7ebSBram Moolenaar      while s = ''
26536628b7ebSBram Moolenaar      endwhile
26546628b7ebSBram Moolenaar  END
26556628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2656bd5da371SBram Moolenaarenddef
2657bd5da371SBram Moolenaar
26589645e2d9SBram Moolenaardef Test_interrupt_loop()
2659cfcd011fSBram Moolenaar  var caught = false
2660cfcd011fSBram Moolenaar  var x = 0
266197acfc78SBram Moolenaar  try
26629645e2d9SBram Moolenaar    while 1
26639645e2d9SBram Moolenaar      x += 1
26649645e2d9SBram Moolenaar      if x == 100
26659645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
26669645e2d9SBram Moolenaar      endif
26679645e2d9SBram Moolenaar    endwhile
266897acfc78SBram Moolenaar  catch
266997acfc78SBram Moolenaar    caught = true
267097acfc78SBram Moolenaar    assert_equal(100, x)
267197acfc78SBram Moolenaar  endtry
267297acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
267325859dd7SBram Moolenaar  # consume the CTRL-C
267425859dd7SBram Moolenaar  getchar(0)
26759645e2d9SBram Moolenaarenddef
267620431c9dSBram Moolenaar
26774fdae999SBram Moolenaardef Test_automatic_line_continuation()
2678cfcd011fSBram Moolenaar  var mylist = [
26794fdae999SBram Moolenaar      'one',
26804fdae999SBram Moolenaar      'two',
26814fdae999SBram Moolenaar      'three',
2682f5be8cdbSBram Moolenaar      ] # comment
26834fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
26844fdae999SBram Moolenaar
2685cfcd011fSBram Moolenaar  var mydict = {
2686e0de171eSBram Moolenaar      ['one']: 1,
2687e0de171eSBram Moolenaar      ['two']: 2,
2688e0de171eSBram Moolenaar      ['three']:
26894fdae999SBram Moolenaar          3,
2690f5be8cdbSBram Moolenaar      } # comment
2691e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2692e0de171eSBram Moolenaar  mydict = {
26932c330432SBram Moolenaar      one: 1,  # comment
26942c330432SBram Moolenaar      two:     # comment
26952c330432SBram Moolenaar           2,  # comment
26962c330432SBram Moolenaar      three: 3 # comment
26972c330432SBram Moolenaar      }
2698e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2699e0de171eSBram Moolenaar  mydict = {
27002c330432SBram Moolenaar      one: 1,
27014fdae999SBram Moolenaar      two:
27024fdae999SBram Moolenaar           2,
27032c330432SBram Moolenaar      three: 3
27044fdae999SBram Moolenaar      }
2705e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2706e6085c53SBram Moolenaar
2707e6085c53SBram Moolenaar  assert_equal(
2708e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2709e6085c53SBram Moolenaar        split('one two three')
2710e6085c53SBram Moolenaar        )
27114fdae999SBram Moolenaarenddef
27124fdae999SBram Moolenaar
27137a092245SBram Moolenaardef Test_vim9_comment()
27147a092245SBram Moolenaar  CheckScriptSuccess([
27157a092245SBram Moolenaar      'vim9script',
27167a092245SBram Moolenaar      '# something',
271793f82cbeSBram Moolenaar      '#something',
271893f82cbeSBram Moolenaar      '#{something',
27197a092245SBram Moolenaar      ])
272093f82cbeSBram Moolenaar
272193f82cbeSBram Moolenaar  split Xfile
272293f82cbeSBram Moolenaar  CheckScriptSuccess([
272393f82cbeSBram Moolenaar      'vim9script',
272493f82cbeSBram Moolenaar      'edit #something',
272593f82cbeSBram Moolenaar      ])
272693f82cbeSBram Moolenaar  CheckScriptSuccess([
272793f82cbeSBram Moolenaar      'vim9script',
272893f82cbeSBram Moolenaar      'edit #{something',
272993f82cbeSBram Moolenaar      ])
273093f82cbeSBram Moolenaar  close
273193f82cbeSBram Moolenaar
27327a092245SBram Moolenaar  CheckScriptFailure([
27337a092245SBram Moolenaar      'vim9script',
27347a092245SBram Moolenaar      ':# something',
27357a092245SBram Moolenaar      ], 'E488:')
27367a092245SBram Moolenaar  CheckScriptFailure([
27377a092245SBram Moolenaar      '# something',
27387a092245SBram Moolenaar      ], 'E488:')
27397a092245SBram Moolenaar  CheckScriptFailure([
27407a092245SBram Moolenaar      ':# something',
27417a092245SBram Moolenaar      ], 'E488:')
27427a092245SBram Moolenaar
27434a8d9f2eSBram Moolenaar  { # block start
27444a8d9f2eSBram Moolenaar  } # block end
27454a8d9f2eSBram Moolenaar  CheckDefFailure([
27464a8d9f2eSBram Moolenaar      '{# comment',
27474a8d9f2eSBram Moolenaar      ], 'E488:')
27484a8d9f2eSBram Moolenaar  CheckDefFailure([
27494a8d9f2eSBram Moolenaar      '{',
27504a8d9f2eSBram Moolenaar      '}# comment',
27514a8d9f2eSBram Moolenaar      ], 'E488:')
27524a8d9f2eSBram Moolenaar
27534a8d9f2eSBram Moolenaar  echo "yes" # comment
27544a8d9f2eSBram Moolenaar  CheckDefFailure([
27554a8d9f2eSBram Moolenaar      'echo "yes"# comment',
27564a8d9f2eSBram Moolenaar      ], 'E488:')
27577a092245SBram Moolenaar  CheckScriptSuccess([
27587a092245SBram Moolenaar      'vim9script',
27597a092245SBram Moolenaar      'echo "yes" # something',
27607a092245SBram Moolenaar      ])
27617a092245SBram Moolenaar  CheckScriptFailure([
27627a092245SBram Moolenaar      'vim9script',
27637a092245SBram Moolenaar      'echo "yes"# something',
27647a092245SBram Moolenaar      ], 'E121:')
27657a092245SBram Moolenaar  CheckScriptFailure([
27667a092245SBram Moolenaar      'vim9script',
27677a092245SBram Moolenaar      'echo# something',
2768f8103f27SBram Moolenaar      ], 'E1144:')
27697a092245SBram Moolenaar  CheckScriptFailure([
27707a092245SBram Moolenaar      'echo "yes" # something',
27717a092245SBram Moolenaar      ], 'E121:')
27727a092245SBram Moolenaar
27734a8d9f2eSBram Moolenaar  exe "echo" # comment
27744a8d9f2eSBram Moolenaar  CheckDefFailure([
27754a8d9f2eSBram Moolenaar      'exe "echo"# comment',
27764a8d9f2eSBram Moolenaar      ], 'E488:')
27774a8d9f2eSBram Moolenaar  CheckScriptSuccess([
27784a8d9f2eSBram Moolenaar      'vim9script',
27794a8d9f2eSBram Moolenaar      'exe "echo" # something',
27804a8d9f2eSBram Moolenaar      ])
27814a8d9f2eSBram Moolenaar  CheckScriptFailure([
27824a8d9f2eSBram Moolenaar      'vim9script',
27834a8d9f2eSBram Moolenaar      'exe "echo"# something',
27844a8d9f2eSBram Moolenaar      ], 'E121:')
27854a8d9f2eSBram Moolenaar  CheckScriptFailure([
27864a8d9f2eSBram Moolenaar      'vim9script',
27874a8d9f2eSBram Moolenaar      'exe# something',
2788f8103f27SBram Moolenaar      ], 'E1144:')
27894a8d9f2eSBram Moolenaar  CheckScriptFailure([
27904a8d9f2eSBram Moolenaar      'exe "echo" # something',
27914a8d9f2eSBram Moolenaar      ], 'E121:')
27924a8d9f2eSBram Moolenaar
27937a092245SBram Moolenaar  CheckDefFailure([
27947a092245SBram Moolenaar      'try# comment',
27957a092245SBram Moolenaar      '  echo "yes"',
27967a092245SBram Moolenaar      'catch',
27977a092245SBram Moolenaar      'endtry',
2798f8103f27SBram Moolenaar      ], 'E1144:')
27992c5ed4e3SBram Moolenaar  CheckScriptFailure([
28002c5ed4e3SBram Moolenaar      'vim9script',
28012c5ed4e3SBram Moolenaar      'try# comment',
28022c5ed4e3SBram Moolenaar      'echo "yes"',
2803f8103f27SBram Moolenaar      ], 'E1144:')
28047a092245SBram Moolenaar  CheckDefFailure([
28057a092245SBram Moolenaar      'try',
2806a72cfb80SBram Moolenaar      '  throw#comment',
2807a72cfb80SBram Moolenaar      'catch',
2808a72cfb80SBram Moolenaar      'endtry',
2809f8103f27SBram Moolenaar      ], 'E1144:')
2810a72cfb80SBram Moolenaar  CheckDefFailure([
2811a72cfb80SBram Moolenaar      'try',
2812a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2813a72cfb80SBram Moolenaar      'catch',
2814a72cfb80SBram Moolenaar      'endtry',
2815a72cfb80SBram Moolenaar      ], 'E488:')
2816a72cfb80SBram Moolenaar  CheckDefFailure([
2817a72cfb80SBram Moolenaar      'try',
28187a092245SBram Moolenaar      '  echo "yes"',
28197a092245SBram Moolenaar      'catch# comment',
28207a092245SBram Moolenaar      'endtry',
2821f8103f27SBram Moolenaar      ], 'E1144:')
28222c5ed4e3SBram Moolenaar  CheckScriptFailure([
28232c5ed4e3SBram Moolenaar      'vim9script',
28242c5ed4e3SBram Moolenaar      'try',
28252c5ed4e3SBram Moolenaar      '  echo "yes"',
28262c5ed4e3SBram Moolenaar      'catch# comment',
28272c5ed4e3SBram Moolenaar      'endtry',
2828f8103f27SBram Moolenaar      ], 'E1144:')
28292c5ed4e3SBram Moolenaar  CheckDefFailure([
28302c5ed4e3SBram Moolenaar      'try',
28312c5ed4e3SBram Moolenaar      '  echo "yes"',
28322c5ed4e3SBram Moolenaar      'catch /pat/# comment',
28332c5ed4e3SBram Moolenaar      'endtry',
28342c5ed4e3SBram Moolenaar      ], 'E488:')
28357a092245SBram Moolenaar  CheckDefFailure([
28367a092245SBram Moolenaar      'try',
28377a092245SBram Moolenaar      'echo "yes"',
28387a092245SBram Moolenaar      'catch',
28397a092245SBram Moolenaar      'endtry# comment',
2840f8103f27SBram Moolenaar      ], 'E1144:')
28412c5ed4e3SBram Moolenaar  CheckScriptFailure([
28422c5ed4e3SBram Moolenaar      'vim9script',
28432c5ed4e3SBram Moolenaar      'try',
28442c5ed4e3SBram Moolenaar      '  echo "yes"',
28452c5ed4e3SBram Moolenaar      'catch',
28462c5ed4e3SBram Moolenaar      'endtry# comment',
2847f8103f27SBram Moolenaar      ], 'E1144:')
28482c5ed4e3SBram Moolenaar
28492c5ed4e3SBram Moolenaar  CheckScriptSuccess([
28502c5ed4e3SBram Moolenaar      'vim9script',
28512c5ed4e3SBram Moolenaar      'hi # comment',
28522c5ed4e3SBram Moolenaar      ])
28532c5ed4e3SBram Moolenaar  CheckScriptFailure([
28542c5ed4e3SBram Moolenaar      'vim9script',
28552c5ed4e3SBram Moolenaar      'hi# comment',
2856f8103f27SBram Moolenaar      ], 'E1144:')
28571966c248SBram Moolenaar  CheckScriptSuccess([
28581966c248SBram Moolenaar      'vim9script',
28591966c248SBram Moolenaar      'hi Search # comment',
28601966c248SBram Moolenaar      ])
28611966c248SBram Moolenaar  CheckScriptFailure([
28621966c248SBram Moolenaar      'vim9script',
28631966c248SBram Moolenaar      'hi Search# comment',
28641966c248SBram Moolenaar      ], 'E416:')
28651966c248SBram Moolenaar  CheckScriptSuccess([
28661966c248SBram Moolenaar      'vim9script',
28671966c248SBram Moolenaar      'hi link This Search # comment',
28681966c248SBram Moolenaar      ])
28691966c248SBram Moolenaar  CheckScriptFailure([
28701966c248SBram Moolenaar      'vim9script',
28711966c248SBram Moolenaar      'hi link This That# comment',
28721966c248SBram Moolenaar      ], 'E413:')
28731966c248SBram Moolenaar  CheckScriptSuccess([
28741966c248SBram Moolenaar      'vim9script',
28751966c248SBram Moolenaar      'hi clear This # comment',
28761966c248SBram Moolenaar      'hi clear # comment',
28771966c248SBram Moolenaar      ])
2878f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2879f5be8cdbSBram Moolenaar  # hi clear This# comment',
28801966c248SBram Moolenaar  CheckScriptFailure([
28811966c248SBram Moolenaar      'vim9script',
28821966c248SBram Moolenaar      'hi clear# comment',
28831966c248SBram Moolenaar      ], 'E416:')
28841966c248SBram Moolenaar
28851966c248SBram Moolenaar  CheckScriptSuccess([
28861966c248SBram Moolenaar      'vim9script',
28871966c248SBram Moolenaar      'hi Group term=bold',
28881966c248SBram Moolenaar      'match Group /todo/ # comment',
28891966c248SBram Moolenaar      ])
28901966c248SBram Moolenaar  CheckScriptFailure([
28911966c248SBram Moolenaar      'vim9script',
28921966c248SBram Moolenaar      'hi Group term=bold',
28931966c248SBram Moolenaar      'match Group /todo/# comment',
28941966c248SBram Moolenaar      ], 'E488:')
28951966c248SBram Moolenaar  CheckScriptSuccess([
28961966c248SBram Moolenaar      'vim9script',
28971966c248SBram Moolenaar      'match # comment',
28981966c248SBram Moolenaar      ])
28991966c248SBram Moolenaar  CheckScriptFailure([
29001966c248SBram Moolenaar      'vim9script',
29011966c248SBram Moolenaar      'match# comment',
2902f8103f27SBram Moolenaar      ], 'E1144:')
29031966c248SBram Moolenaar  CheckScriptSuccess([
29041966c248SBram Moolenaar      'vim9script',
29051966c248SBram Moolenaar      'match none # comment',
29061966c248SBram Moolenaar      ])
29071966c248SBram Moolenaar  CheckScriptFailure([
29081966c248SBram Moolenaar      'vim9script',
29091966c248SBram Moolenaar      'match none# comment',
29101966c248SBram Moolenaar      ], 'E475:')
29111966c248SBram Moolenaar
29121966c248SBram Moolenaar  CheckScriptSuccess([
29131966c248SBram Moolenaar      'vim9script',
29141966c248SBram Moolenaar      'menutrans clear # comment',
29151966c248SBram Moolenaar      ])
29161966c248SBram Moolenaar  CheckScriptFailure([
29171966c248SBram Moolenaar      'vim9script',
29181966c248SBram Moolenaar      'menutrans clear# comment text',
29191966c248SBram Moolenaar      ], 'E474:')
29201966c248SBram Moolenaar
29211966c248SBram Moolenaar  CheckScriptSuccess([
29221966c248SBram Moolenaar      'vim9script',
29231966c248SBram Moolenaar      'syntax clear # comment',
29241966c248SBram Moolenaar      ])
29251966c248SBram Moolenaar  CheckScriptFailure([
29261966c248SBram Moolenaar      'vim9script',
29271966c248SBram Moolenaar      'syntax clear# comment text',
29281966c248SBram Moolenaar      ], 'E28:')
29291966c248SBram Moolenaar  CheckScriptSuccess([
29301966c248SBram Moolenaar      'vim9script',
29311966c248SBram Moolenaar      'syntax keyword Word some',
29321966c248SBram Moolenaar      'syntax clear Word # comment',
29331966c248SBram Moolenaar      ])
29341966c248SBram Moolenaar  CheckScriptFailure([
29351966c248SBram Moolenaar      'vim9script',
29361966c248SBram Moolenaar      'syntax keyword Word some',
29371966c248SBram Moolenaar      'syntax clear Word# comment text',
29381966c248SBram Moolenaar      ], 'E28:')
29391966c248SBram Moolenaar
29401966c248SBram Moolenaar  CheckScriptSuccess([
29411966c248SBram Moolenaar      'vim9script',
29421966c248SBram Moolenaar      'syntax list # comment',
29431966c248SBram Moolenaar      ])
29441966c248SBram Moolenaar  CheckScriptFailure([
29451966c248SBram Moolenaar      'vim9script',
29461966c248SBram Moolenaar      'syntax list# comment text',
29471966c248SBram Moolenaar      ], 'E28:')
29481966c248SBram Moolenaar
29491966c248SBram Moolenaar  CheckScriptSuccess([
29501966c248SBram Moolenaar      'vim9script',
29511966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
29521966c248SBram Moolenaar      ])
29531966c248SBram Moolenaar  CheckScriptFailure([
29541966c248SBram Moolenaar      'vim9script',
29551966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
29561966c248SBram Moolenaar      ], 'E475:')
29571966c248SBram Moolenaar
29581966c248SBram Moolenaar  CheckScriptSuccess([
29591966c248SBram Moolenaar      'vim9script',
29601966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
29611966c248SBram Moolenaar      ])
29621966c248SBram Moolenaar  CheckScriptFailure([
29631966c248SBram Moolenaar      'vim9script',
29641966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
29651966c248SBram Moolenaar      ], 'E789:')
29661966c248SBram Moolenaar
29671966c248SBram Moolenaar  CheckScriptSuccess([
29681966c248SBram Moolenaar      'vim9script',
29691966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
29701966c248SBram Moolenaar      ])
29711966c248SBram Moolenaar  CheckScriptFailure([
29721966c248SBram Moolenaar      'vim9script',
29731966c248SBram Moolenaar      'syntax match Word /pat/# comment',
29741966c248SBram Moolenaar      ], 'E402:')
29751966c248SBram Moolenaar
29761966c248SBram Moolenaar  CheckScriptSuccess([
29771966c248SBram Moolenaar      'vim9script',
29781966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
29791966c248SBram Moolenaar      ])
29801966c248SBram Moolenaar  CheckScriptFailure([
29811966c248SBram Moolenaar      'vim9script',
29821966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
29831966c248SBram Moolenaar      ], 'E475:')
29841966c248SBram Moolenaar  CheckScriptFailure([
29851966c248SBram Moolenaar      'vim9script',
29861966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
29871966c248SBram Moolenaar      ], 'E406:')
29881966c248SBram Moolenaar  CheckScriptFailure([
29891966c248SBram Moolenaar      'vim9script',
29901966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
29911966c248SBram Moolenaar      ], 'E475:')
29921966c248SBram Moolenaar
29931966c248SBram Moolenaar  CheckScriptSuccess([
29941966c248SBram Moolenaar      'vim9script',
29951966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
29961966c248SBram Moolenaar      ])
29971966c248SBram Moolenaar  CheckScriptFailure([
29981966c248SBram Moolenaar      'vim9script',
29991966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
3000d032f34aSBram Moolenaar      ], 'E402:')
30011966c248SBram Moolenaar
30021966c248SBram Moolenaar  CheckScriptSuccess([
30031966c248SBram Moolenaar      'vim9script',
30041966c248SBram Moolenaar      'syntax sync # comment',
30051966c248SBram Moolenaar      ])
30061966c248SBram Moolenaar  CheckScriptFailure([
30071966c248SBram Moolenaar      'vim9script',
30081966c248SBram Moolenaar      'syntax sync# comment',
30091966c248SBram Moolenaar      ], 'E404:')
30101966c248SBram Moolenaar  CheckScriptSuccess([
30111966c248SBram Moolenaar      'vim9script',
30121966c248SBram Moolenaar      'syntax sync ccomment # comment',
30131966c248SBram Moolenaar      ])
30141966c248SBram Moolenaar  CheckScriptFailure([
30151966c248SBram Moolenaar      'vim9script',
30161966c248SBram Moolenaar      'syntax sync ccomment# comment',
30171966c248SBram Moolenaar      ], 'E404:')
30181966c248SBram Moolenaar
30191966c248SBram Moolenaar  CheckScriptSuccess([
30201966c248SBram Moolenaar      'vim9script',
30211966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
30221966c248SBram Moolenaar      ])
30231966c248SBram Moolenaar  CheckScriptFailure([
30241966c248SBram Moolenaar      'vim9script',
30251966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
30261966c248SBram Moolenaar      ], 'E475:')
3027a72cfb80SBram Moolenaar
3028a72cfb80SBram Moolenaar  CheckScriptSuccess([
3029a72cfb80SBram Moolenaar      'vim9script',
3030a72cfb80SBram Moolenaar      'command Echo echo # comment',
3031a72cfb80SBram Moolenaar      'command Echo # comment',
30322d870f8dSBram Moolenaar      'delcommand Echo',
3033a72cfb80SBram Moolenaar      ])
3034a72cfb80SBram Moolenaar  CheckScriptFailure([
3035a72cfb80SBram Moolenaar      'vim9script',
3036a72cfb80SBram Moolenaar      'command Echo echo# comment',
3037a72cfb80SBram Moolenaar      'Echo',
3038f8103f27SBram Moolenaar      ], 'E1144:')
30392d870f8dSBram Moolenaar  delcommand Echo
304070249ee8SBram Moolenaar
304170249ee8SBram Moolenaar  var curdir = getcwd()
304270249ee8SBram Moolenaar  CheckScriptSuccess([
304370249ee8SBram Moolenaar      'command Echo cd " comment',
304470249ee8SBram Moolenaar      'Echo',
304570249ee8SBram Moolenaar      'delcommand Echo',
304670249ee8SBram Moolenaar      ])
304770249ee8SBram Moolenaar  CheckScriptSuccess([
3048090728adSBram Moolenaar      'vim9script',
304970249ee8SBram Moolenaar      'command Echo cd # comment',
305070249ee8SBram Moolenaar      'Echo',
305170249ee8SBram Moolenaar      'delcommand Echo',
305270249ee8SBram Moolenaar      ])
305370249ee8SBram Moolenaar  CheckScriptFailure([
305470249ee8SBram Moolenaar      'vim9script',
305570249ee8SBram Moolenaar      'command Echo cd " comment',
305670249ee8SBram Moolenaar      'Echo',
305770249ee8SBram Moolenaar      ], 'E344:')
305870249ee8SBram Moolenaar  delcommand Echo
305970249ee8SBram Moolenaar  chdir(curdir)
306070249ee8SBram Moolenaar
3061a72cfb80SBram Moolenaar  CheckScriptFailure([
3062a72cfb80SBram Moolenaar      'vim9script',
3063a72cfb80SBram Moolenaar      'command Echo# comment',
3064a72cfb80SBram Moolenaar      ], 'E182:')
3065a72cfb80SBram Moolenaar  CheckScriptFailure([
3066a72cfb80SBram Moolenaar      'vim9script',
3067a72cfb80SBram Moolenaar      'command Echo echo',
3068a72cfb80SBram Moolenaar      'command Echo# comment',
3069a72cfb80SBram Moolenaar      ], 'E182:')
30702d870f8dSBram Moolenaar  delcommand Echo
3071a72cfb80SBram Moolenaar
3072a72cfb80SBram Moolenaar  CheckScriptSuccess([
3073a72cfb80SBram Moolenaar      'vim9script',
3074a72cfb80SBram Moolenaar      'function # comment',
3075a72cfb80SBram Moolenaar      ])
3076a72cfb80SBram Moolenaar  CheckScriptFailure([
3077a72cfb80SBram Moolenaar      'vim9script',
30789898107fSBram Moolenaar      'function " comment',
30799898107fSBram Moolenaar      ], 'E129:')
30809898107fSBram Moolenaar  CheckScriptFailure([
30819898107fSBram Moolenaar      'vim9script',
3082a72cfb80SBram Moolenaar      'function# comment',
3083f8103f27SBram Moolenaar      ], 'E1144:')
3084a72cfb80SBram Moolenaar  CheckScriptSuccess([
3085a72cfb80SBram Moolenaar      'vim9script',
3086a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
3087a72cfb80SBram Moolenaar      ])
3088a72cfb80SBram Moolenaar  CheckScriptFailure([
3089a72cfb80SBram Moolenaar      'vim9script',
3090a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
3091a72cfb80SBram Moolenaar      ], 'E488:')
3092a72cfb80SBram Moolenaar
3093a72cfb80SBram Moolenaar  CheckScriptSuccess([
3094a72cfb80SBram Moolenaar      'vim9script',
30954c17ad94SBram Moolenaar      'func g:DeleteMeA()',
3096a72cfb80SBram Moolenaar      'endfunc',
30974c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
3098a72cfb80SBram Moolenaar      ])
3099a72cfb80SBram Moolenaar  CheckScriptFailure([
3100a72cfb80SBram Moolenaar      'vim9script',
31014c17ad94SBram Moolenaar      'func g:DeleteMeB()',
3102a72cfb80SBram Moolenaar      'endfunc',
31034c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
3104a72cfb80SBram Moolenaar      ], 'E488:')
3105a72cfb80SBram Moolenaar
3106a72cfb80SBram Moolenaar  CheckScriptSuccess([
3107a72cfb80SBram Moolenaar      'vim9script',
3108a72cfb80SBram Moolenaar      'call execute("ls") # comment',
3109a72cfb80SBram Moolenaar      ])
3110a72cfb80SBram Moolenaar  CheckScriptFailure([
3111a72cfb80SBram Moolenaar      'vim9script',
3112a72cfb80SBram Moolenaar      'call execute("ls")# comment',
3113a72cfb80SBram Moolenaar      ], 'E488:')
3114e7e4838fSBram Moolenaar
3115e7e4838fSBram Moolenaar  CheckScriptFailure([
3116e7e4838fSBram Moolenaar      'def Test() " comment',
3117e7e4838fSBram Moolenaar      'enddef',
3118e7e4838fSBram Moolenaar      ], 'E488:')
3119e7e4838fSBram Moolenaar  CheckScriptFailure([
3120e7e4838fSBram Moolenaar      'vim9script',
3121e7e4838fSBram Moolenaar      'def Test() " comment',
3122e7e4838fSBram Moolenaar      'enddef',
3123e7e4838fSBram Moolenaar      ], 'E488:')
3124e7e4838fSBram Moolenaar
3125e7e4838fSBram Moolenaar  CheckScriptSuccess([
3126e7e4838fSBram Moolenaar      'func Test() " comment',
3127e7e4838fSBram Moolenaar      'endfunc',
31282d870f8dSBram Moolenaar      'delfunc Test',
3129e7e4838fSBram Moolenaar      ])
31309898107fSBram Moolenaar  CheckScriptSuccess([
3131e7e4838fSBram Moolenaar      'vim9script',
3132e7e4838fSBram Moolenaar      'func Test() " comment',
3133e7e4838fSBram Moolenaar      'endfunc',
31349898107fSBram Moolenaar      ])
3135e7e4838fSBram Moolenaar
3136e7e4838fSBram Moolenaar  CheckScriptSuccess([
3137e7e4838fSBram Moolenaar      'def Test() # comment',
3138e7e4838fSBram Moolenaar      'enddef',
3139e7e4838fSBram Moolenaar      ])
3140e7e4838fSBram Moolenaar  CheckScriptFailure([
3141e7e4838fSBram Moolenaar      'func Test() # comment',
3142e7e4838fSBram Moolenaar      'endfunc',
3143e7e4838fSBram Moolenaar      ], 'E488:')
31440f37e356SBram Moolenaar
31450f37e356SBram Moolenaar  var lines =<< trim END
31460f37e356SBram Moolenaar      vim9script
31470f37e356SBram Moolenaar      syn region Text
31480f37e356SBram Moolenaar      \ start='foo'
31490f37e356SBram Moolenaar      #\ comment
31500f37e356SBram Moolenaar      \ end='bar'
31515072b47aSBram Moolenaar      syn region Text start='foo'
31525072b47aSBram Moolenaar      #\ comment
31535072b47aSBram Moolenaar      \ end='bar'
31540f37e356SBram Moolenaar  END
31550f37e356SBram Moolenaar  CheckScriptSuccess(lines)
31560f37e356SBram Moolenaar
31570f37e356SBram Moolenaar  lines =<< trim END
31580f37e356SBram Moolenaar      vim9script
31590f37e356SBram Moolenaar      syn region Text
31600f37e356SBram Moolenaar      \ start='foo'
31610f37e356SBram Moolenaar      "\ comment
31620f37e356SBram Moolenaar      \ end='bar'
31630f37e356SBram Moolenaar  END
31640f37e356SBram Moolenaar  CheckScriptFailure(lines, 'E399:')
31652c5ed4e3SBram Moolenaarenddef
31662c5ed4e3SBram Moolenaar
31672c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
31682c5ed4e3SBram Moolenaar  CheckCanRunGui
31692c5ed4e3SBram Moolenaar
31702c5ed4e3SBram Moolenaar  CheckScriptFailure([
31712c5ed4e3SBram Moolenaar      'vim9script',
31722c5ed4e3SBram Moolenaar      'gui#comment'
3173f8103f27SBram Moolenaar      ], 'E1144:')
31742c5ed4e3SBram Moolenaar  CheckScriptFailure([
31752c5ed4e3SBram Moolenaar      'vim9script',
31762c5ed4e3SBram Moolenaar      'gui -f#comment'
31772c5ed4e3SBram Moolenaar      ], 'E499:')
31787a092245SBram Moolenaarenddef
31797a092245SBram Moolenaar
3180a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
31816797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
31826797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3183a26b9700SBram Moolenaar
3184a26b9700SBram Moolenaar  edit test.vim
3185a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3186a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3187a26b9700SBram Moolenaar
3188a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3189a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3190a26b9700SBram Moolenaar
3191a26b9700SBram Moolenaar  g:entered = 0
3192a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3193a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3194a26b9700SBram Moolenaar
3195a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3196a26b9700SBram Moolenaar
3197a26b9700SBram Moolenaar  au! TabEnter
3198a26b9700SBram Moolenaar  unlet g:entered
3199d72c1bf0SBram Moolenaar
3200d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3201d72c1bf0SBram Moolenaar      'vim9script',
32026797966dSBram Moolenaar      'g:var = 123',
3203e55b1c09SBram Moolenaar      'b:var = 456',
3204e55b1c09SBram Moolenaar      'w:var = 777',
3205e55b1c09SBram Moolenaar      't:var = 888',
3206d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3207d72c1bf0SBram Moolenaar      ])
3208d72c1bf0SBram Moolenaar
3209d72c1bf0SBram Moolenaar  CheckScriptFailure([
3210d72c1bf0SBram Moolenaar      'vim9script',
3211cfcd011fSBram Moolenaar      'let var = 123',
3212cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3213cfcd011fSBram Moolenaar
3214cfcd011fSBram Moolenaar  CheckScriptFailure([
3215cfcd011fSBram Moolenaar      'vim9script',
3216cfcd011fSBram Moolenaar      'var g:var = 123',
3217e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3218e55b1c09SBram Moolenaar
3219e55b1c09SBram Moolenaar  CheckScriptFailure([
3220e55b1c09SBram Moolenaar      'vim9script',
3221cfcd011fSBram Moolenaar      'var b:var = 123',
3222e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3223e55b1c09SBram Moolenaar
3224e55b1c09SBram Moolenaar  CheckScriptFailure([
3225e55b1c09SBram Moolenaar      'vim9script',
3226cfcd011fSBram Moolenaar      'var w:var = 123',
3227e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3228e55b1c09SBram Moolenaar
3229e55b1c09SBram Moolenaar  CheckScriptFailure([
3230e55b1c09SBram Moolenaar      'vim9script',
3231cfcd011fSBram Moolenaar      'var t:var = 123',
3232e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3233e55b1c09SBram Moolenaar
3234e55b1c09SBram Moolenaar  CheckScriptFailure([
3235e55b1c09SBram Moolenaar      'vim9script',
3236cfcd011fSBram Moolenaar      'var v:version = 123',
3237e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3238e55b1c09SBram Moolenaar
3239e55b1c09SBram Moolenaar  CheckScriptFailure([
3240e55b1c09SBram Moolenaar      'vim9script',
3241cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3242e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
32436797966dSBram Moolenaar
32446797966dSBram Moolenaar  CheckScriptFailure([
32456797966dSBram Moolenaar      'vim9script',
32466797966dSBram Moolenaar      'g:var = 123',
324732e35117SBram Moolenaar      'unlet g:var# comment1',
3248d72c1bf0SBram Moolenaar      ], 'E108:')
3249d72c1bf0SBram Moolenaar
3250d72c1bf0SBram Moolenaar  CheckScriptFailure([
3251d72c1bf0SBram Moolenaar      'let g:var = 123',
3252d72c1bf0SBram Moolenaar      'unlet g:var # something',
3253d72c1bf0SBram Moolenaar      ], 'E488:')
3254faac4104SBram Moolenaar
3255faac4104SBram Moolenaar  CheckScriptSuccess([
3256faac4104SBram Moolenaar      'vim9script',
325732e35117SBram Moolenaar      'if 1 # comment2',
3258faac4104SBram Moolenaar      '  echo "yes"',
3259faac4104SBram Moolenaar      'elseif 2 #comment',
3260faac4104SBram Moolenaar      '  echo "no"',
3261faac4104SBram Moolenaar      'endif',
3262faac4104SBram Moolenaar      ])
3263faac4104SBram Moolenaar
3264faac4104SBram Moolenaar  CheckScriptFailure([
3265faac4104SBram Moolenaar      'vim9script',
326632e35117SBram Moolenaar      'if 1# comment3',
3267faac4104SBram Moolenaar      '  echo "yes"',
3268faac4104SBram Moolenaar      'endif',
3269fae55a9cSBram Moolenaar      ], 'E488:')
3270faac4104SBram Moolenaar
3271faac4104SBram Moolenaar  CheckScriptFailure([
3272faac4104SBram Moolenaar      'vim9script',
327332e35117SBram Moolenaar      'if 0 # comment4',
3274faac4104SBram Moolenaar      '  echo "yes"',
3275faac4104SBram Moolenaar      'elseif 2#comment',
3276faac4104SBram Moolenaar      '  echo "no"',
3277faac4104SBram Moolenaar      'endif',
3278fae55a9cSBram Moolenaar      ], 'E488:')
3279faac4104SBram Moolenaar
3280faac4104SBram Moolenaar  CheckScriptSuccess([
3281faac4104SBram Moolenaar      'vim9script',
3282cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3283faac4104SBram Moolenaar      ])
3284faac4104SBram Moolenaar
3285faac4104SBram Moolenaar  CheckScriptFailure([
3286faac4104SBram Moolenaar      'vim9script',
3287cfcd011fSBram Moolenaar      'var v = 1# comment6',
3288fae55a9cSBram Moolenaar      ], 'E488:')
3289faac4104SBram Moolenaar
3290faac4104SBram Moolenaar  CheckScriptSuccess([
3291faac4104SBram Moolenaar      'vim9script',
3292faac4104SBram Moolenaar      'new'
3293d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3294df069eecSBram Moolenaar      ':$',
3295faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3296faac4104SBram Moolenaar      'bwipe!',
3297faac4104SBram Moolenaar      ])
3298faac4104SBram Moolenaar
3299f5be8cdbSBram Moolenaar  CheckScriptFailure([
3300f5be8cdbSBram Moolenaar      'vim9script',
3301f5be8cdbSBram Moolenaar      'new'
3302d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3303f5be8cdbSBram Moolenaar      ':$',
3304f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3305f5be8cdbSBram Moolenaar      'bwipe!',
3306f5be8cdbSBram Moolenaar      ], 'E488:')
3307f5be8cdbSBram Moolenaar
3308f5be8cdbSBram Moolenaar  CheckScriptFailure([
3309f5be8cdbSBram Moolenaar      'vim9script',
3310f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3311f5be8cdbSBram Moolenaar      ], 'E477:')
3312a26b9700SBram Moolenaarenddef
3313a26b9700SBram Moolenaar
33147e5bd91dSBram Moolenaardef Test_finish()
3315cfcd011fSBram Moolenaar  var lines =<< trim END
33167e5bd91dSBram Moolenaar    vim9script
33176797966dSBram Moolenaar    g:res = 'one'
33187e5bd91dSBram Moolenaar    if v:false | finish | endif
33196797966dSBram Moolenaar    g:res = 'two'
33207e5bd91dSBram Moolenaar    finish
33216797966dSBram Moolenaar    g:res = 'three'
33227e5bd91dSBram Moolenaar  END
33237e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
33247e5bd91dSBram Moolenaar  source Xfinished
33257e5bd91dSBram Moolenaar  assert_equal('two', g:res)
33267e5bd91dSBram Moolenaar
33277e5bd91dSBram Moolenaar  unlet g:res
33287e5bd91dSBram Moolenaar  delete('Xfinished')
33297e5bd91dSBram Moolenaarenddef
33307e5bd91dSBram Moolenaar
3331a5d0077eSBram Moolenaardef Test_forward_declaration()
3332cfcd011fSBram Moolenaar  var lines =<< trim END
3333a5d0077eSBram Moolenaar    vim9script
3334a5d0077eSBram Moolenaar    def GetValue(): string
3335a5d0077eSBram Moolenaar      return theVal
3336a5d0077eSBram Moolenaar    enddef
3337cfcd011fSBram Moolenaar    var theVal = 'something'
3338822ba247SBram Moolenaar    g:initVal = GetValue()
3339a5d0077eSBram Moolenaar    theVal = 'else'
3340a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3341a5d0077eSBram Moolenaar  END
3342a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3343a5d0077eSBram Moolenaar  source Xforward
3344a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3345a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3346a5d0077eSBram Moolenaar
3347a5d0077eSBram Moolenaar  unlet g:initVal
3348a5d0077eSBram Moolenaar  unlet g:laterVal
3349a5d0077eSBram Moolenaar  delete('Xforward')
3350a5d0077eSBram Moolenaarenddef
3351a5d0077eSBram Moolenaar
33529721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3353a6294955SBram Moolenaar  var vim9_lines =<< trim END
3354a6294955SBram Moolenaar    vim9script
3355a6294955SBram Moolenaar    var local = 'local'
3356a6294955SBram Moolenaar    g:global = 'global'
3357a6294955SBram Moolenaar    export var exported = 'exported'
3358a6294955SBram Moolenaar    export def GetText(): string
3359a6294955SBram Moolenaar       return 'text'
3360a6294955SBram Moolenaar    enddef
3361a6294955SBram Moolenaar  END
3362a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3363a6294955SBram Moolenaar
3364cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
33659721fb4eSBram Moolenaar    source Xvim9_script.vim
33669721fb4eSBram Moolenaar
33679721fb4eSBram Moolenaar    call assert_false(exists('local'))
33689721fb4eSBram Moolenaar    call assert_false(exists('exported'))
33699721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
33709721fb4eSBram Moolenaar    call assert_equal('global', global)
33719721fb4eSBram Moolenaar    call assert_equal('global', g:global)
33729721fb4eSBram Moolenaar
33739721fb4eSBram Moolenaar    " imported variable becomes script-local
33749721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
33759721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
33769721fb4eSBram Moolenaar    call assert_false(exists('exported'))
33779721fb4eSBram Moolenaar
33789721fb4eSBram Moolenaar    " imported function becomes script-local
33799721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
33809721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
33819721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
33829721fb4eSBram Moolenaar  END
33839721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
33849721fb4eSBram Moolenaar
33859721fb4eSBram Moolenaar  source Xlegacy_script.vim
33869721fb4eSBram Moolenaar  assert_equal('global', g:global)
3387f5be8cdbSBram Moolenaar  unlet g:global
33889721fb4eSBram Moolenaar
33899721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
33909721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
33919721fb4eSBram Moolenaarenddef
3392a5d0077eSBram Moolenaar
3393e535db86SBram Moolenaardef Test_declare_script_in_func()
3394e535db86SBram Moolenaar  var lines =<< trim END
3395e535db86SBram Moolenaar      vim9script
3396e535db86SBram Moolenaar      func Declare()
3397e535db86SBram Moolenaar        let s:local = 123
3398e535db86SBram Moolenaar      endfunc
3399e535db86SBram Moolenaar      Declare()
3400e535db86SBram Moolenaar      assert_equal(123, local)
3401e535db86SBram Moolenaar
3402e535db86SBram Moolenaar      var error: string
3403e535db86SBram Moolenaar      try
3404e535db86SBram Moolenaar        local = 'asdf'
3405e535db86SBram Moolenaar      catch
3406e535db86SBram Moolenaar        error = v:exception
3407e535db86SBram Moolenaar      endtry
3408e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3409e535db86SBram Moolenaar
3410e535db86SBram Moolenaar      lockvar local
3411e535db86SBram Moolenaar      try
3412e535db86SBram Moolenaar        local = 999
3413e535db86SBram Moolenaar      catch
3414e535db86SBram Moolenaar        error = v:exception
3415e535db86SBram Moolenaar      endtry
3416e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3417e535db86SBram Moolenaar  END
3418e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3419e535db86SBram Moolenaarenddef
3420e535db86SBram Moolenaar
3421e535db86SBram Moolenaar
34227d699701SBram Moolenaarfunc Test_vim9script_not_global()
34237d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
34247d699701SBram Moolenaar  let vim9lines =<< trim END
34257d699701SBram Moolenaar    vim9script
3426cfcd011fSBram Moolenaar    var name = 'local'
34277d699701SBram Moolenaar    func TheFunc()
34287d699701SBram Moolenaar      echo 'local'
34297d699701SBram Moolenaar    endfunc
34307d699701SBram Moolenaar    def DefFunc()
34317d699701SBram Moolenaar      echo 'local'
34327d699701SBram Moolenaar    enddef
34337d699701SBram Moolenaar  END
34347d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
34357d699701SBram Moolenaar  source Xvim9script.vim
34367d699701SBram Moolenaar  try
34377d699701SBram Moolenaar    echo g:var
34387d699701SBram Moolenaar    assert_report('did not fail')
34397d699701SBram Moolenaar  catch /E121:/
34407d699701SBram Moolenaar    " caught
34417d699701SBram Moolenaar  endtry
34427d699701SBram Moolenaar  try
34437d699701SBram Moolenaar    call TheFunc()
34447d699701SBram Moolenaar    assert_report('did not fail')
34457d699701SBram Moolenaar  catch /E117:/
34467d699701SBram Moolenaar    " caught
34477d699701SBram Moolenaar  endtry
34487d699701SBram Moolenaar  try
34497d699701SBram Moolenaar    call DefFunc()
34507d699701SBram Moolenaar    assert_report('did not fail')
34517d699701SBram Moolenaar  catch /E117:/
34527d699701SBram Moolenaar    " caught
34537d699701SBram Moolenaar  endtry
34547d699701SBram Moolenaar
345525859dd7SBram Moolenaar  call delete('Xvim9script.vim')
34567d699701SBram Moolenaarendfunc
34577d699701SBram Moolenaar
3458eeb27bfeSBram Moolenaardef Test_vim9_copen()
3459eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3460eeb27bfeSBram Moolenaar  copen
3461eeb27bfeSBram Moolenaar  quit
3462eeb27bfeSBram Moolenaarenddef
3463eeb27bfeSBram Moolenaar
346403290b84SBram Moolenaar" test using an auto-loaded function and variable
34652d6b20d6SBram Moolenaardef Test_vim9_autoload()
3466cfcd011fSBram Moolenaar  var lines =<< trim END
34672d6b20d6SBram Moolenaar     vim9script
346803290b84SBram Moolenaar     def some#gettest(): string
346903290b84SBram Moolenaar       return 'test'
347003290b84SBram Moolenaar     enddef
347103290b84SBram Moolenaar     g:some#name = 'name'
3472227c58a4SBram Moolenaar     g:some#dict = {key: 'value'}
3473e3ffcd99SBram Moolenaar
3474e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3475e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3476e3ffcd99SBram Moolenaar     enddef
347703290b84SBram Moolenaar  END
347803290b84SBram Moolenaar
347903290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
348003290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
348103290b84SBram Moolenaar  var save_rtp = &rtp
348203290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
348303290b84SBram Moolenaar
348403290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
348503290b84SBram Moolenaar  assert_equal('name', g:some#name)
3486227c58a4SBram Moolenaar  assert_equal('value', g:some#dict.key)
348703290b84SBram Moolenaar  g:some#other = 'other'
348803290b84SBram Moolenaar  assert_equal('other', g:some#other)
348903290b84SBram Moolenaar
3490e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3491e3ffcd99SBram Moolenaar
349217f700acSBram Moolenaar  # upper case script name works
349317f700acSBram Moolenaar  lines =<< trim END
349417f700acSBram Moolenaar     vim9script
349517f700acSBram Moolenaar     def Other#getOther(): string
349617f700acSBram Moolenaar       return 'other'
349717f700acSBram Moolenaar     enddef
349817f700acSBram Moolenaar  END
349917f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
350017f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
350117f700acSBram Moolenaar
350203290b84SBram Moolenaar  delete('Xdir', 'rf')
350303290b84SBram Moolenaar  &rtp = save_rtp
350403290b84SBram Moolenaarenddef
350503290b84SBram Moolenaar
350603290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
350703290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
350803290b84SBram Moolenaar  var lines =<< trim END
350903290b84SBram Moolenaar     vim9script
35102d6b20d6SBram Moolenaar     def foo#test()
35112d6b20d6SBram Moolenaar         echomsg getreg('"')
35122d6b20d6SBram Moolenaar     enddef
35132d6b20d6SBram Moolenaar  END
35142d6b20d6SBram Moolenaar
35152d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
35162d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3517cfcd011fSBram Moolenaar  var save_rtp = &rtp
35182d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
35192d6b20d6SBram Moolenaar  augroup test
35202d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
35212d6b20d6SBram Moolenaar  augroup END
35222d6b20d6SBram Moolenaar
35232d6b20d6SBram Moolenaar  normal Y
35242d6b20d6SBram Moolenaar
35252d6b20d6SBram Moolenaar  augroup test
35262d6b20d6SBram Moolenaar    autocmd!
35272d6b20d6SBram Moolenaar  augroup END
35282d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
35292d6b20d6SBram Moolenaar  &rtp = save_rtp
35302d6b20d6SBram Moolenaarenddef
35312d6b20d6SBram Moolenaar
353277e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
353377e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3534cfcd011fSBram Moolenaar  var lines =<< trim END
353577e5dcc3SBram Moolenaar      vim9script
353677e5dcc3SBram Moolenaar      def crash#func()
353777e5dcc3SBram Moolenaar          try
353877e5dcc3SBram Moolenaar              for x in List()
353977e5dcc3SBram Moolenaar              endfor
354077e5dcc3SBram Moolenaar          catch
354177e5dcc3SBram Moolenaar          endtry
354277e5dcc3SBram Moolenaar          g:ok = true
354377e5dcc3SBram Moolenaar      enddef
354477e5dcc3SBram Moolenaar      fu List()
354577e5dcc3SBram Moolenaar          invalid
354677e5dcc3SBram Moolenaar      endfu
354777e5dcc3SBram Moolenaar      try
354848e11c10SBram Moolenaar          alsoinvalid
354977e5dcc3SBram Moolenaar      catch /wontmatch/
355077e5dcc3SBram Moolenaar      endtry
355177e5dcc3SBram Moolenaar  END
355277e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
355377e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
355477e5dcc3SBram Moolenaar
355577e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
355677e5dcc3SBram Moolenaar  lines =<< trim END
355777e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
355877e5dcc3SBram Moolenaar    call crash#func()
355977e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
35609c4f5520SBram Moolenaar    qall!
356177e5dcc3SBram Moolenaar  END
356277e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
356377e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
356477e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
356577e5dcc3SBram Moolenaar
356677e5dcc3SBram Moolenaar  delete('Xdidit')
356777e5dcc3SBram Moolenaar  delete('Xscript')
356877e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
356903290b84SBram Moolenaar
357003290b84SBram Moolenaar  lines =<< trim END
357103290b84SBram Moolenaar    vim9script
357203290b84SBram Moolenaar    var foo#bar = 'asdf'
357303290b84SBram Moolenaar  END
357403290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
357577e5dcc3SBram Moolenaarenddef
357677e5dcc3SBram Moolenaar
357781e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
357881e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
357981e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3580cfcd011fSBram Moolenaar  var lines =<< trim END
358181e17fbeSBram Moolenaar    let s:counter = 1
358281e17fbeSBram Moolenaar    def s:Func()
358381e17fbeSBram Moolenaar      au! CursorHold
358481e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
358581e17fbeSBram Moolenaar    enddef
358681e17fbeSBram Moolenaar    call s:Func()
358781e17fbeSBram Moolenaar    doau CursorHold
358881e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
358981e17fbeSBram Moolenaar    au! CursorHold
359081e17fbeSBram Moolenaar  END
359181e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
359281e17fbeSBram Moolenaarenddef
359381e17fbeSBram Moolenaar
35943896a105SBram Moolenaardef Test_cmdline_win()
35953896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
35963896a105SBram Moolenaar  # the command line window.
35973896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3598cfcd011fSBram Moolenaar  var export_lines =<< trim END
35993896a105SBram Moolenaar    vim9script
3600cfcd011fSBram Moolenaar    export var That = 'yes'
36013896a105SBram Moolenaar  END
36023896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3603cfcd011fSBram Moolenaar  var import_lines =<< trim END
36043896a105SBram Moolenaar    vim9script
36053896a105SBram Moolenaar    import That from './Xexport.vim'
36063896a105SBram Moolenaar  END
36073896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3608cfcd011fSBram Moolenaar  var save_rtp = &rtp
36093896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
36103896a105SBram Moolenaar  syntax on
36113896a105SBram Moolenaar  augroup CmdWin
36123896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
36133896a105SBram Moolenaar  augroup END
36143896a105SBram Moolenaar  # this will open and also close the cmdline window
36153896a105SBram Moolenaar  feedkeys('q:', 'xt')
36163896a105SBram Moolenaar  assert_equal('yes', g:got_there)
36173896a105SBram Moolenaar
36183896a105SBram Moolenaar  augroup CmdWin
36193896a105SBram Moolenaar    au!
36203896a105SBram Moolenaar  augroup END
36213896a105SBram Moolenaar  &rtp = save_rtp
36223896a105SBram Moolenaar  delete('rtp', 'rf')
36233896a105SBram Moolenaarenddef
36243896a105SBram Moolenaar
3625e3d4685fSBram Moolenaardef Test_invalid_sid()
3626e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
362725859dd7SBram Moolenaar
36289c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3629d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3630e3d4685fSBram Moolenaar  endif
3631e3d4685fSBram Moolenaar  delete('Xdidit')
3632e3d4685fSBram Moolenaarenddef
3633e3d4685fSBram Moolenaar
36349ec7026fSBram Moolenaardef Test_restoring_cpo()
36359ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
36369ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
36379ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
36389ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
36399ec7026fSBram Moolenaar  endif
36409ec7026fSBram Moolenaar  delete('Xsourced')
36419ec7026fSBram Moolenaar  delete('Xclose')
3642090728adSBram Moolenaar  delete('Xdone')
36430123cc1eSBram Moolenaar
36440123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
36450123cc1eSBram Moolenaar  set cpo=aABceFsMny>
36460123cc1eSBram Moolenaar  edit XanotherScript
36470123cc1eSBram Moolenaar  so %
36480123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
36490123cc1eSBram Moolenaar  :1del
36500123cc1eSBram Moolenaar  w
36510123cc1eSBram Moolenaar  so %
36520123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
36530123cc1eSBram Moolenaar
36540123cc1eSBram Moolenaar  delete('XanotherScript')
36550123cc1eSBram Moolenaar  set cpo&vim
36569ec7026fSBram Moolenaarenddef
36579ec7026fSBram Moolenaar
3658ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3659ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
366037294bd6SBram Moolenaar  CheckScreendump
3661ffb7dcdbSBram Moolenaar  CheckFeature timers
366237294bd6SBram Moolenaar
3663ffb7dcdbSBram Moolenaar  let lines =<< trim END
366437294bd6SBram Moolenaar    vim9script
366537294bd6SBram Moolenaar    def script#func()
366637294bd6SBram Moolenaar    enddef
366737294bd6SBram Moolenaar  END
3668ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3669ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
367037294bd6SBram Moolenaar
3671ffb7dcdbSBram Moolenaar  let lines =<< trim END
367237294bd6SBram Moolenaar      vim9script
367337294bd6SBram Moolenaar      set cpo+=M
367437294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
3675767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
367637294bd6SBram Moolenaar      setline(1, 'some text')
367737294bd6SBram Moolenaar  END
3678ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3679ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3680ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3681ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
368237294bd6SBram Moolenaar
3683ffb7dcdbSBram Moolenaar  " clean up
3684ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3685ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3686ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3687ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3688ffb7dcdbSBram Moolenaarendfunc
368937294bd6SBram Moolenaar
36909ec7026fSBram Moolenaar
3691f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3692cfcd011fSBram Moolenaar  var lines =<< trim END
3693cfcd011fSBram Moolenaar    var name: any
3694cfcd011fSBram Moolenaar    assert_equal(0, name)
3695f0afd9e1SBram Moolenaar  END
3696f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3697f0afd9e1SBram Moolenaarenddef
3698f0afd9e1SBram Moolenaar
36997e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
370058dbef33SBram Moolenaar  CheckRunVimInTerminal
370158dbef33SBram Moolenaar
37027e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
37037e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
37047e9210eaSBram Moolenaarendfunc
37057e9210eaSBram Moolenaar
37067e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
37079c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3708cfcd011fSBram Moolenaar  var lines =<< trim END
37099c4f5520SBram Moolenaar    func CheckAndQuit()
37109c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
37119c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
37129c4f5520SBram Moolenaar    endfunc
37139c4f5520SBram Moolenaar  END
37149c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
37159c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3716e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
37179c4f5520SBram Moolenaar  # define Afunc() on the command line
37189c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
37199c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
37202949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
37219c4f5520SBram Moolenaar
37229c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
37239c4f5520SBram Moolenaar  delete('XcallFunc')
37249c4f5520SBram Moolenaar  delete('Xdidcmd')
37259c4f5520SBram Moolenaarenddef
37269c4f5520SBram Moolenaar
3727fcdc5d83SBram Moolenaardef Test_script_var_scope()
3728fcdc5d83SBram Moolenaar  var lines =<< trim END
3729fcdc5d83SBram Moolenaar      vim9script
3730fcdc5d83SBram Moolenaar      if true
3731fcdc5d83SBram Moolenaar        if true
3732fcdc5d83SBram Moolenaar          var one = 'one'
3733fcdc5d83SBram Moolenaar          echo one
3734fcdc5d83SBram Moolenaar        endif
3735fcdc5d83SBram Moolenaar        echo one
3736fcdc5d83SBram Moolenaar      endif
3737fcdc5d83SBram Moolenaar  END
3738fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3739fcdc5d83SBram Moolenaar
3740fcdc5d83SBram Moolenaar  lines =<< trim END
3741fcdc5d83SBram Moolenaar      vim9script
3742fcdc5d83SBram Moolenaar      if true
3743fcdc5d83SBram Moolenaar        if false
3744fcdc5d83SBram Moolenaar          var one = 'one'
3745fcdc5d83SBram Moolenaar          echo one
3746fcdc5d83SBram Moolenaar        else
3747fcdc5d83SBram Moolenaar          var one = 'one'
3748fcdc5d83SBram Moolenaar          echo one
3749fcdc5d83SBram Moolenaar        endif
3750fcdc5d83SBram Moolenaar        echo one
3751fcdc5d83SBram Moolenaar      endif
3752fcdc5d83SBram Moolenaar  END
3753fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3754fcdc5d83SBram Moolenaar
3755fcdc5d83SBram Moolenaar  lines =<< trim END
3756fcdc5d83SBram Moolenaar      vim9script
3757fcdc5d83SBram Moolenaar      while true
3758fcdc5d83SBram Moolenaar        var one = 'one'
3759fcdc5d83SBram Moolenaar        echo one
3760fcdc5d83SBram Moolenaar        break
3761fcdc5d83SBram Moolenaar      endwhile
3762fcdc5d83SBram Moolenaar      echo one
3763fcdc5d83SBram Moolenaar  END
3764fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3765fcdc5d83SBram Moolenaar
3766fcdc5d83SBram Moolenaar  lines =<< trim END
3767fcdc5d83SBram Moolenaar      vim9script
3768fcdc5d83SBram Moolenaar      for i in range(1)
3769fcdc5d83SBram Moolenaar        var one = 'one'
3770fcdc5d83SBram Moolenaar        echo one
3771fcdc5d83SBram Moolenaar      endfor
3772fcdc5d83SBram Moolenaar      echo one
3773fcdc5d83SBram Moolenaar  END
3774fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
37759becdf2bSBram Moolenaar
37769becdf2bSBram Moolenaar  lines =<< trim END
37779becdf2bSBram Moolenaar      vim9script
37789becdf2bSBram Moolenaar      {
37799becdf2bSBram Moolenaar        var one = 'one'
37809becdf2bSBram Moolenaar        assert_equal('one', one)
37819becdf2bSBram Moolenaar      }
37829becdf2bSBram Moolenaar      assert_false(exists('one'))
37839becdf2bSBram Moolenaar      assert_false(exists('s:one'))
37849becdf2bSBram Moolenaar  END
37859becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
37869becdf2bSBram Moolenaar
37879becdf2bSBram Moolenaar  lines =<< trim END
37889becdf2bSBram Moolenaar      vim9script
37899becdf2bSBram Moolenaar      {
37909becdf2bSBram Moolenaar        var one = 'one'
37919becdf2bSBram Moolenaar        echo one
37929becdf2bSBram Moolenaar      }
37939becdf2bSBram Moolenaar      echo one
37949becdf2bSBram Moolenaar  END
37959becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3796fcdc5d83SBram Moolenaarenddef
3797fcdc5d83SBram Moolenaar
3798352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3799352134bbSBram Moolenaar  var lines =<< trim END
3800352134bbSBram Moolenaar    vim9script
38012a38908bSBram Moolenaar    def Callback(...l: list<any>)
3802352134bbSBram Moolenaar      try
3803352134bbSBram Moolenaar        var x: string
3804352134bbSBram Moolenaar        var y: string
3805352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3806352134bbSBram Moolenaar        [x, y] = ['']
3807352134bbSBram Moolenaar      catch
3808352134bbSBram Moolenaar        g:caught = 'yes'
3809352134bbSBram Moolenaar      endtry
3810352134bbSBram Moolenaar    enddef
3811e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3812352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3813352134bbSBram Moolenaar  END
3814352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3815352134bbSBram Moolenaar
3816352134bbSBram Moolenaar  unlet g:caught
3817352134bbSBram Moolenaarenddef
3818352134bbSBram Moolenaar
3819631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3820631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3821631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3822631e8f93SBram Moolenaar  endif
3823631e8f93SBram Moolenaar  var lines =<< trim END
3824631e8f93SBram Moolenaar      vim9script
3825631e8f93SBram Moolenaar      var source: list<number>
38262a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
3827631e8f93SBram Moolenaar          eval [][0]
3828631e8f93SBram Moolenaar      enddef
38292a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
3830631e8f93SBram Moolenaar          sleep 1m
3831631e8f93SBram Moolenaar          source += l
3832631e8f93SBram Moolenaar      enddef
3833e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
38346f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
38356f17a3f0SBram Moolenaar        sleep 10m
38366f17a3f0SBram Moolenaar      endwhile
3837206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3838fe95b94fSBram Moolenaar      sleep 200m
3839631e8f93SBram Moolenaar  END
3840631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3841631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3842631e8f93SBram Moolenaar  delete('Xdef')
3843631e8f93SBram Moolenaarenddef
3844631e8f93SBram Moolenaar
38454324d87aSBram Moolenaardef InvokeNormal()
38464324d87aSBram Moolenaar  exe "norm! :m+1\r"
38474324d87aSBram Moolenaarenddef
38484324d87aSBram Moolenaar
38494324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
38504324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
38514324d87aSBram Moolenaar  new
38524324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
38534324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
38544324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
38554324d87aSBram Moolenaar  xunmap <F3>
3856b5b9480eSBram Moolenaarenddef
3857b5b9480eSBram Moolenaar
3858b5b9480eSBram Moolenaardef Test_white_space_after_command()
3859b5b9480eSBram Moolenaar  var lines =<< trim END
3860b5b9480eSBram Moolenaar    exit_cb: Func})
3861b5b9480eSBram Moolenaar  END
3862b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3863f8103f27SBram Moolenaar
3864f8103f27SBram Moolenaar  lines =<< trim END
3865f8103f27SBram Moolenaar    e#
3866f8103f27SBram Moolenaar  END
3867f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
38684324d87aSBram Moolenaarenddef
38694324d87aSBram Moolenaar
38704aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
38714aab88d9SBram Moolenaar  var lines =<< trim END
38724aab88d9SBram Moolenaar      vim9script
38734aab88d9SBram Moolenaar      if exists('g:guard')
38744aab88d9SBram Moolenaar        finish
38754aab88d9SBram Moolenaar      endif
38764aab88d9SBram Moolenaar      g:guard = 1
38774aab88d9SBram Moolenaar      var name = 'thename'
38784aab88d9SBram Moolenaar      def g:GetName(): string
38794aab88d9SBram Moolenaar        return name
38804aab88d9SBram Moolenaar      enddef
38814aab88d9SBram Moolenaar      def g:SetName(arg: string)
38824aab88d9SBram Moolenaar        name = arg
38834aab88d9SBram Moolenaar      enddef
38844aab88d9SBram Moolenaar  END
38854aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
38864aab88d9SBram Moolenaar  so XscriptTwice.vim
38874aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
38884aab88d9SBram Moolenaar  g:SetName('newname')
38894aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
38904aab88d9SBram Moolenaar  so XscriptTwice.vim
38914aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
38924aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
38934aab88d9SBram Moolenaar
38944aab88d9SBram Moolenaar  delfunc g:GetName
38954aab88d9SBram Moolenaar  delfunc g:SetName
38964aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
38974aab88d9SBram Moolenaar  unlet g:guard
38984aab88d9SBram Moolenaarenddef
38994aab88d9SBram Moolenaar
39004aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
39014aab88d9SBram Moolenaar  var exportlines =<< trim END
39024aab88d9SBram Moolenaar      vim9script
39034aab88d9SBram Moolenaar      if exists('g:guard')
39044aab88d9SBram Moolenaar        finish
39054aab88d9SBram Moolenaar      endif
39064aab88d9SBram Moolenaar      g:guard = 1
39074aab88d9SBram Moolenaar      export var name = 'someName'
39084aab88d9SBram Moolenaar  END
39094aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
39104aab88d9SBram Moolenaar
39114aab88d9SBram Moolenaar  var lines =<< trim END
39124aab88d9SBram Moolenaar      vim9script
39134aab88d9SBram Moolenaar      import name from './XexportScript.vim'
39144aab88d9SBram Moolenaar      def g:GetName(): string
39154aab88d9SBram Moolenaar        return name
39164aab88d9SBram Moolenaar      enddef
39174aab88d9SBram Moolenaar  END
39184aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
39194aab88d9SBram Moolenaar  so XscriptImport.vim
39204aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
39214aab88d9SBram Moolenaar
39224aab88d9SBram Moolenaar  so XexportScript.vim
39234aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
39244aab88d9SBram Moolenaar
39254aab88d9SBram Moolenaar  delfunc g:GetName
39264aab88d9SBram Moolenaar  delete('XexportScript.vim')
39274aab88d9SBram Moolenaar  delete('XscriptImport.vim')
39284aab88d9SBram Moolenaar  unlet g:guard
39294aab88d9SBram Moolenaarenddef
39304aab88d9SBram Moolenaar
393110b9421fSBram Moolenaardef Test_unsupported_commands()
393210b9421fSBram Moolenaar  var lines =<< trim END
393310b9421fSBram Moolenaar      ka
393410b9421fSBram Moolenaar  END
39357d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
39367d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
393710b9421fSBram Moolenaar
393810b9421fSBram Moolenaar  lines =<< trim END
3939ada1d870SBram Moolenaar      :1ka
3940ada1d870SBram Moolenaar  END
39417d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
39427d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
3943ada1d870SBram Moolenaar
3944ada1d870SBram Moolenaar  lines =<< trim END
394510b9421fSBram Moolenaar    t
394610b9421fSBram Moolenaar  END
394710b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
394810b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
394910b9421fSBram Moolenaar
395010b9421fSBram Moolenaar  lines =<< trim END
395110b9421fSBram Moolenaar    x
395210b9421fSBram Moolenaar  END
395310b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
395410b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
395510b9421fSBram Moolenaar
395610b9421fSBram Moolenaar  lines =<< trim END
395710b9421fSBram Moolenaar    xit
395810b9421fSBram Moolenaar  END
395910b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
396010b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
396110b9421fSBram Moolenaarenddef
396210b9421fSBram Moolenaar
3963c70fe460SBram Moolenaardef Test_mapping_line_number()
3964c70fe460SBram Moolenaar  var lines =<< trim END
3965c70fe460SBram Moolenaar      vim9script
3966c70fe460SBram Moolenaar      def g:FuncA()
3967c70fe460SBram Moolenaar          # Some comment
3968c70fe460SBram Moolenaar          FuncB(0)
3969c70fe460SBram Moolenaar      enddef
3970c70fe460SBram Moolenaar          # Some comment
3971c70fe460SBram Moolenaar      def FuncB(
3972c70fe460SBram Moolenaar          # Some comment
3973c70fe460SBram Moolenaar          n: number
3974c70fe460SBram Moolenaar      )
3975c70fe460SBram Moolenaar          exe 'nno '
3976c70fe460SBram Moolenaar              # Some comment
3977c70fe460SBram Moolenaar              .. '<F3> a'
3978c70fe460SBram Moolenaar              .. 'b'
3979c70fe460SBram Moolenaar              .. 'c'
3980c70fe460SBram Moolenaar      enddef
3981c70fe460SBram Moolenaar  END
3982c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
3983c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
3984c70fe460SBram Moolenaar  assert_match('No mapping found', res)
3985c70fe460SBram Moolenaar
3986c70fe460SBram Moolenaar  g:FuncA()
3987c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
3988c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
3989c70fe460SBram Moolenaar
3990c70fe460SBram Moolenaar  nunmap <F3>
3991c70fe460SBram Moolenaar  delfunc g:FuncA
3992c70fe460SBram Moolenaarenddef
3993c70fe460SBram Moolenaar
3994208f0b48SBram Moolenaardef Test_option_modifier()
3995208f0b48SBram Moolenaar  var lines =<< trim END
3996208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
3997208f0b48SBram Moolenaar      call assert_equal(1, &hlsearch)
3998208f0b48SBram Moolenaar  END
3999208f0b48SBram Moolenaar  CheckScriptSuccess(lines)
4000208f0b48SBram Moolenaar
4001208f0b48SBram Moolenaar  lines =<< trim END
4002208f0b48SBram Moolenaar      vim9script
4003208f0b48SBram Moolenaar      set hlsearch &
4004208f0b48SBram Moolenaar  END
4005208f0b48SBram Moolenaar  CheckScriptFailure(lines, 'E518:')
4006208f0b48SBram Moolenaar
4007208f0b48SBram Moolenaar  lines =<< trim END
4008208f0b48SBram Moolenaar      vim9script
4009208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
4010208f0b48SBram Moolenaar  END
4011208f0b48SBram Moolenaar  CheckScriptFailure(lines, 'E518:')
4012208f0b48SBram Moolenaarenddef
4013208f0b48SBram Moolenaar
4014585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
4015585fea7bSBram Moolenaardef Test_substitute_cmd()
4016585fea7bSBram Moolenaar  new
4017585fea7bSBram Moolenaar  setline(1, 'something')
4018585fea7bSBram Moolenaar  :substitute(some(other(
4019585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
4020585fea7bSBram Moolenaar  bwipe!
4021585fea7bSBram Moolenaar
4022f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
4023cfcd011fSBram Moolenaar  var lines =<< trim END
4024585fea7bSBram Moolenaar    vim9script
4025585fea7bSBram Moolenaar    new
4026585fea7bSBram Moolenaar    setline(1, 'something')
4027585fea7bSBram Moolenaar    :substitute(some(other(
4028585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
4029585fea7bSBram Moolenaar    bwipe!
4030585fea7bSBram Moolenaar  END
4031585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
4032585fea7bSBram Moolenaar  source Xvim9lines
4033585fea7bSBram Moolenaar
4034585fea7bSBram Moolenaar  delete('Xvim9lines')
4035585fea7bSBram Moolenaarenddef
4036585fea7bSBram Moolenaar
40378a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
4038