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
6082e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to
6092e34c34bSBram Moolenaardef TryContinueFunc()
6102e34c34bSBram Moolenaar while g:Count < 2
6112e34c34bSBram Moolenaar   g:sequence ..= 't'
6122e34c34bSBram Moolenaar    try
6132e34c34bSBram Moolenaar      echoerr 'Test'
6142e34c34bSBram Moolenaar    catch
6152e34c34bSBram Moolenaar      g:Count += 1
6162e34c34bSBram Moolenaar      g:sequence ..= 'c'
6172e34c34bSBram Moolenaar      continue
6182e34c34bSBram Moolenaar    endtry
6192e34c34bSBram Moolenaar    g:sequence ..= 'e'
6202e34c34bSBram Moolenaar    g:Count += 1
6212e34c34bSBram Moolenaar  endwhile
6222e34c34bSBram Moolenaarenddef
6232e34c34bSBram Moolenaar
6242e34c34bSBram Moolenaardef Test_continue_in_try_in_while()
6252e34c34bSBram Moolenaar  g:Count = 0
6262e34c34bSBram Moolenaar  g:sequence = ''
6272e34c34bSBram Moolenaar  TryContinueFunc()
6282e34c34bSBram Moolenaar  assert_equal('tctc', g:sequence)
6292e34c34bSBram Moolenaar  unlet g:Count
6302e34c34bSBram Moolenaar  unlet g:sequence
6312e34c34bSBram Moolenaarenddef
6322e34c34bSBram Moolenaar
6339cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
6349cb577a6SBram Moolenaar  # return in try block returns normally
6359cb577a6SBram Moolenaar  def ReturnInTry(): string
6369cb577a6SBram Moolenaar    try
6379cb577a6SBram Moolenaar      return '"some message"'
6389cb577a6SBram Moolenaar    catch
6399cb577a6SBram Moolenaar    endtry
6409cb577a6SBram Moolenaar    return 'not reached'
6419cb577a6SBram Moolenaar  enddef
6429cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
6439cb577a6SBram Moolenaarenddef
6449cb577a6SBram Moolenaar
6451430ceebSBram Moolenaardef Test_cnext_works_in_catch()
6461430ceebSBram Moolenaar  var lines =<< trim END
6471430ceebSBram Moolenaar      vim9script
6481430ceebSBram Moolenaar      au BufEnter * eval 0
6491430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
6501430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
6511430ceebSBram Moolenaar      var items = [
6521430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
6531430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
6541430ceebSBram Moolenaar        ]
6551430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
6561430ceebSBram Moolenaar      cwindow
6571430ceebSBram Moolenaar
6581430ceebSBram Moolenaar      def CnextOrCfirst()
6591430ceebSBram Moolenaar        # if cnext fails, cfirst is used
6601430ceebSBram Moolenaar        try
6611430ceebSBram Moolenaar          cnext
6621430ceebSBram Moolenaar        catch
6631430ceebSBram Moolenaar          cfirst
6641430ceebSBram Moolenaar        endtry
6651430ceebSBram Moolenaar      enddef
6661430ceebSBram Moolenaar
6671430ceebSBram Moolenaar      CnextOrCfirst()
6681430ceebSBram Moolenaar      CnextOrCfirst()
6691430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
6701430ceebSBram Moolenaar      qall
6711430ceebSBram Moolenaar  END
6721430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
6731430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
6741430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
6751430ceebSBram Moolenaar
6761430ceebSBram Moolenaar  delete('Xfile1')
6771430ceebSBram Moolenaar  delete('Xfile2')
6781430ceebSBram Moolenaar  delete('XCatchCnext')
6791430ceebSBram Moolenaar  delete('Xresult')
6801430ceebSBram Moolenaarenddef
6811430ceebSBram Moolenaar
6829e1d9e34SBram Moolenaardef Test_throw_skipped()
6839e1d9e34SBram Moolenaar  if 0
6849e1d9e34SBram Moolenaar    throw dontgethere
6859e1d9e34SBram Moolenaar  endif
6869e1d9e34SBram Moolenaarenddef
6879e1d9e34SBram Moolenaar
6888f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
6898f81b22eSBram Moolenaar  var lines =<< trim END
6908f81b22eSBram Moolenaar    vim9script
6918f81b22eSBram Moolenaar    def Func()
6928f81b22eSBram Moolenaar      throw 'error'
6938f81b22eSBram Moolenaar    enddef
6948f81b22eSBram Moolenaar    silent! Func()
6958f81b22eSBram Moolenaar  END
6968f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
6978f81b22eSBram Moolenaar  source XthrowSilenced
6988f81b22eSBram Moolenaar  delete('XthrowSilenced')
6998f81b22eSBram Moolenaarenddef
7008f81b22eSBram Moolenaar
701e859312eSBram Moolenaardef DeletedFunc(): list<any>
702e859312eSBram Moolenaar  return ['delete me']
703e859312eSBram Moolenaarenddef
704e859312eSBram Moolenaardefcompile
705e859312eSBram Moolenaardelfunc DeletedFunc
706e859312eSBram Moolenaar
707257cc5eeSBram Moolenaardef ThrowFromDef()
708a72cfb80SBram Moolenaar  throw "getout" # comment
709257cc5eeSBram Moolenaarenddef
710257cc5eeSBram Moolenaar
711257cc5eeSBram Moolenaarfunc CatchInFunc()
712257cc5eeSBram Moolenaar  try
713257cc5eeSBram Moolenaar    call ThrowFromDef()
714257cc5eeSBram Moolenaar  catch
715257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
716257cc5eeSBram Moolenaar  endtry
717257cc5eeSBram Moolenaarendfunc
718257cc5eeSBram Moolenaar
719257cc5eeSBram Moolenaardef CatchInDef()
720257cc5eeSBram Moolenaar  try
721257cc5eeSBram Moolenaar    ThrowFromDef()
722257cc5eeSBram Moolenaar  catch
723257cc5eeSBram Moolenaar    g:thrown_def = v:exception
724257cc5eeSBram Moolenaar  endtry
725257cc5eeSBram Moolenaarenddef
726257cc5eeSBram Moolenaar
727f575adffSBram Moolenaardef ReturnFinally(): string
728f575adffSBram Moolenaar  try
729f575adffSBram Moolenaar    return 'intry'
730373863edSBram Moolenaar  finall
731f575adffSBram Moolenaar    g:in_finally = 'finally'
732f575adffSBram Moolenaar  endtry
733f575adffSBram Moolenaar  return 'end'
734f575adffSBram Moolenaarenddef
735f575adffSBram Moolenaar
736257cc5eeSBram Moolenaardef Test_try_catch_nested()
737257cc5eeSBram Moolenaar  CatchInFunc()
738257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
739257cc5eeSBram Moolenaar
740257cc5eeSBram Moolenaar  CatchInDef()
741257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
742f575adffSBram Moolenaar
743f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
744f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
745f575adffSBram Moolenaarenddef
746f575adffSBram Moolenaar
7479939f57bSBram Moolenaardef TryOne(): number
7489939f57bSBram Moolenaar  try
7499939f57bSBram Moolenaar    return 0
7509939f57bSBram Moolenaar  catch
7519939f57bSBram Moolenaar  endtry
7529939f57bSBram Moolenaar  return 0
7539939f57bSBram Moolenaarenddef
7549939f57bSBram Moolenaar
7559939f57bSBram Moolenaardef TryTwo(n: number): string
7569939f57bSBram Moolenaar  try
757cfcd011fSBram Moolenaar    var x = {}
7589939f57bSBram Moolenaar  catch
7599939f57bSBram Moolenaar  endtry
7609939f57bSBram Moolenaar  return 'text'
7619939f57bSBram Moolenaarenddef
7629939f57bSBram Moolenaar
7639939f57bSBram Moolenaardef Test_try_catch_twice()
7649939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
7659939f57bSBram Moolenaarenddef
7669939f57bSBram Moolenaar
767f575adffSBram Moolenaardef Test_try_catch_match()
768cfcd011fSBram Moolenaar  var seq = 'a'
769f575adffSBram Moolenaar  try
770f575adffSBram Moolenaar    throw 'something'
771f575adffSBram Moolenaar  catch /nothing/
772f575adffSBram Moolenaar    seq ..= 'x'
773f575adffSBram Moolenaar  catch /some/
774f575adffSBram Moolenaar    seq ..= 'b'
775f575adffSBram Moolenaar  catch /asdf/
776f575adffSBram Moolenaar    seq ..= 'x'
777e8c4abbbSBram Moolenaar  catch ?a\?sdf?
778e8c4abbbSBram Moolenaar    seq ..= 'y'
779f575adffSBram Moolenaar  finally
780f575adffSBram Moolenaar    seq ..= 'c'
781f575adffSBram Moolenaar  endtry
782f575adffSBram Moolenaar  assert_equal('abc', seq)
783257cc5eeSBram Moolenaarenddef
784257cc5eeSBram Moolenaar
785e8c4abbbSBram Moolenaardef Test_try_catch_fails()
786d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
787d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
788d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
789d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
790d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
791d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
792d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
793d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
79413106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
795d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
796585fea7bSBram Moolenaar
797e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
798d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
799e8c4abbbSBram Moolenaarenddef
800e8c4abbbSBram Moolenaar
8017c5b3c03SBram Moolenaardef Try_catch_skipped()
8027c5b3c03SBram Moolenaar  var l = []
8037c5b3c03SBram Moolenaar  try
8047c5b3c03SBram Moolenaar  finally
8057c5b3c03SBram Moolenaar  endtry
8067c5b3c03SBram Moolenaar
8077c5b3c03SBram Moolenaar  if 1
8087c5b3c03SBram Moolenaar  else
8097c5b3c03SBram Moolenaar    try
8107c5b3c03SBram Moolenaar    endtry
8117c5b3c03SBram Moolenaar  endif
8127c5b3c03SBram Moolenaarenddef
8137c5b3c03SBram Moolenaar
8147c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
8157c5b3c03SBram Moolenaardef Test_try_catch_skipped()
8167c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
8177c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
8187c5b3c03SBram Moolenaarenddef
8197c5b3c03SBram Moolenaar
8207c5b3c03SBram Moolenaar
8217c5b3c03SBram Moolenaar
822006ad48bSBram Moolenaardef Test_throw_vimscript()
823f5be8cdbSBram Moolenaar  # only checks line continuation
824cfcd011fSBram Moolenaar  var lines =<< trim END
825006ad48bSBram Moolenaar      vim9script
826006ad48bSBram Moolenaar      try
827006ad48bSBram Moolenaar        throw 'one'
828006ad48bSBram Moolenaar              .. 'two'
829006ad48bSBram Moolenaar      catch
830006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
831006ad48bSBram Moolenaar      endtry
832006ad48bSBram Moolenaar  END
833006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
8341e021e63SBram Moolenaar
8351e021e63SBram Moolenaar  lines =<< trim END
8361e021e63SBram Moolenaar    vim9script
837352134bbSBram Moolenaar    @r = ''
8381e021e63SBram Moolenaar    def Func()
8391e021e63SBram Moolenaar      throw @r
8401e021e63SBram Moolenaar    enddef
8411e021e63SBram Moolenaar    var result = ''
8421e021e63SBram Moolenaar    try
8431e021e63SBram Moolenaar      Func()
8441e021e63SBram Moolenaar    catch /E1129:/
8451e021e63SBram Moolenaar      result = 'caught'
8461e021e63SBram Moolenaar    endtry
8471e021e63SBram Moolenaar    assert_equal('caught', result)
8481e021e63SBram Moolenaar  END
8491e021e63SBram Moolenaar  CheckScriptSuccess(lines)
850006ad48bSBram Moolenaarenddef
851006ad48bSBram Moolenaar
852ed677f55SBram Moolenaardef Test_error_in_nested_function()
85303dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
854cfcd011fSBram Moolenaar  var lines =<< trim END
855ed677f55SBram Moolenaar      vim9script
856ed677f55SBram Moolenaar      def Func()
857ed677f55SBram Moolenaar        Error()
858ed677f55SBram Moolenaar        g:test_var = 1
859ed677f55SBram Moolenaar      enddef
860ed677f55SBram Moolenaar      func Error() abort
861ed677f55SBram Moolenaar        eval [][0]
862ed677f55SBram Moolenaar      endfunc
863ed677f55SBram Moolenaar      Func()
864ed677f55SBram Moolenaar  END
865ed677f55SBram Moolenaar  g:test_var = 0
866ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
867ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
868ed677f55SBram Moolenaarenddef
869ed677f55SBram Moolenaar
870227c58a4SBram Moolenaardef Test_abort_after_error()
871227c58a4SBram Moolenaar  var lines =<< trim END
872227c58a4SBram Moolenaar      vim9script
873227c58a4SBram Moolenaar      while true
874227c58a4SBram Moolenaar        echo notfound
875227c58a4SBram Moolenaar      endwhile
876227c58a4SBram Moolenaar      g:gotthere = true
877227c58a4SBram Moolenaar  END
878227c58a4SBram Moolenaar  g:gotthere = false
879227c58a4SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
880227c58a4SBram Moolenaar  assert_false(g:gotthere)
881227c58a4SBram Moolenaar  unlet g:gotthere
882227c58a4SBram Moolenaarenddef
883227c58a4SBram Moolenaar
88437c83711SBram Moolenaardef Test_cexpr_vimscript()
885f5be8cdbSBram Moolenaar  # only checks line continuation
88637c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
887cfcd011fSBram Moolenaar  var lines =<< trim END
88837c83711SBram Moolenaar      vim9script
88937c83711SBram Moolenaar      cexpr 'File'
89037c83711SBram Moolenaar                .. ' someFile' ..
89137c83711SBram Moolenaar                   ' line 19'
89237c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
89337c83711SBram Moolenaar  END
89437c83711SBram Moolenaar  CheckScriptSuccess(lines)
89537c83711SBram Moolenaar  set errorformat&
89637c83711SBram Moolenaarenddef
89737c83711SBram Moolenaar
898c9edd6b5SBram Moolenaardef Test_statusline_syntax()
899c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
900cfcd011fSBram Moolenaar  var lines =<< trim END
901c9edd6b5SBram Moolenaar      vim9script
902c9edd6b5SBram Moolenaar      func g:Status()
903c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
904c9edd6b5SBram Moolenaar      endfunc
905c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
906c9edd6b5SBram Moolenaar      redrawstatus
907c9edd6b5SBram Moolenaar      set laststatus statusline=
908c9edd6b5SBram Moolenaar  END
909c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
910c9edd6b5SBram Moolenaarenddef
911c9edd6b5SBram Moolenaar
912b209750bSBram Moolenaardef Test_list_vimscript()
913b209750bSBram Moolenaar  # checks line continuation and comments
914cfcd011fSBram Moolenaar  var lines =<< trim END
915b209750bSBram Moolenaar      vim9script
916cfcd011fSBram Moolenaar      var mylist = [
917b209750bSBram Moolenaar            'one',
918b209750bSBram Moolenaar            # comment
919b209750bSBram Moolenaar            'two', # empty line follows
920b209750bSBram Moolenaar
921b209750bSBram Moolenaar            'three',
922b209750bSBram Moolenaar            ]
923b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
924b209750bSBram Moolenaar  END
925b209750bSBram Moolenaar  CheckScriptSuccess(lines)
92666250c93SBram Moolenaar
92766250c93SBram Moolenaar  # check all lines from heredoc are kept
92866250c93SBram Moolenaar  lines =<< trim END
92966250c93SBram Moolenaar      # comment 1
93066250c93SBram Moolenaar      two
93166250c93SBram Moolenaar      # comment 3
93266250c93SBram Moolenaar
93366250c93SBram Moolenaar      five
93466250c93SBram Moolenaar      # comment 6
93566250c93SBram Moolenaar  END
93666250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
9374bce26bbSBram Moolenaar
9384bce26bbSBram Moolenaar  lines =<< trim END
9394bce26bbSBram Moolenaar    [{
9404bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
9414bce26bbSBram Moolenaar  END
9424bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
943b209750bSBram Moolenaarenddef
944b209750bSBram Moolenaar
9452a1381c3SBram Moolenaarif has('channel')
94640ee466cSBram Moolenaar  let someJob = test_null_job()
94740ee466cSBram Moolenaar
94840ee466cSBram Moolenaar  def FuncWithError()
94940ee466cSBram Moolenaar    echomsg g:someJob
95040ee466cSBram Moolenaar  enddef
95140ee466cSBram Moolenaar
95240ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
95340ee466cSBram Moolenaar    try
95440ee466cSBram Moolenaar      call FuncWithError()
95540ee466cSBram Moolenaar    catch
95640ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
95740ee466cSBram Moolenaar    endtry
95840ee466cSBram Moolenaar  endfunc
9592a1381c3SBram Moolenaarendif
96040ee466cSBram Moolenaar
9618a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
9628a7d6542SBram Moolenaar  vim9script
963cfcd011fSBram Moolenaar  var name: string = 'bob'
9648a7d6542SBram Moolenaar  def Concat(arg: string): string
9658a7d6542SBram Moolenaar    return name .. arg
9668a7d6542SBram Moolenaar  enddef
967227a69deSBram Moolenaar  g:result = Concat('bie')
968227a69deSBram Moolenaar  g:localname = name
9698a7d6542SBram Moolenaar
9708a7d6542SBram Moolenaar  export const CONST = 1234
971cfcd011fSBram Moolenaar  export var exported = 9876
972cfcd011fSBram Moolenaar  export var exp_name = 'John'
9738a7d6542SBram Moolenaar  export def Exported(): string
9748a7d6542SBram Moolenaar    return 'Exported'
9758a7d6542SBram Moolenaar  enddef
9760f2a5cc6SBram Moolenaar  export final theList = [1]
9778a7d6542SBram MoolenaarEND
9788a7d6542SBram Moolenaar
979b3ca9824SBram Moolenaardef Undo_export_script_lines()
980b3ca9824SBram Moolenaar  unlet g:result
981b3ca9824SBram Moolenaar  unlet g:localname
982b3ca9824SBram Moolenaarenddef
983b3ca9824SBram Moolenaar
9845269bd2aSBram Moolenaardef Test_vim9_import_export()
985cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
9868a7d6542SBram Moolenaar    vim9script
9878a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
9888a7d6542SBram Moolenaar    g:imported = exported
9896e587dcbSBram Moolenaar    exported += 3
9906e587dcbSBram Moolenaar    g:imported_added = exported
9918a7d6542SBram Moolenaar    g:imported_func = Exported()
9926e587dcbSBram Moolenaar
99340f4f7a4SBram Moolenaar    def GetExported(): string
994e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
99540f4f7a4SBram Moolenaar      return local_dict.ref()
99640f4f7a4SBram Moolenaar    enddef
99740f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
99840f4f7a4SBram Moolenaar
9996e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
10006e587dcbSBram Moolenaar    g:imported_name = exp_name
10016e587dcbSBram Moolenaar    exp_name ..= ' Doe'
10026e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
10035381c7a1SBram Moolenaar    g:imported_later = exported
10040f2a5cc6SBram Moolenaar
10050f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
10060f2a5cc6SBram Moolenaar    theList->add(2)
10070f2a5cc6SBram Moolenaar    assert_equal([1, 2], theList)
10088a7d6542SBram Moolenaar  END
10098a7d6542SBram Moolenaar
10108a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
10118a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
10128a7d6542SBram Moolenaar
10138a7d6542SBram Moolenaar  source Ximport.vim
10148a7d6542SBram Moolenaar
10158a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
10168a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
10178a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
10186e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
10195381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
10208a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
102140f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
10226e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
10236e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
10248a7d6542SBram Moolenaar  assert_false(exists('g:name'))
10258a7d6542SBram Moolenaar
1026b3ca9824SBram Moolenaar  Undo_export_script_lines()
10278a7d6542SBram Moolenaar  unlet g:imported
10286e587dcbSBram Moolenaar  unlet g:imported_added
10295381c7a1SBram Moolenaar  unlet g:imported_later
10308a7d6542SBram Moolenaar  unlet g:imported_func
10316e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
10328a7d6542SBram Moolenaar  delete('Ximport.vim')
1033f2d5c240SBram Moolenaar
10341c991144SBram Moolenaar  # similar, with line breaks
1035cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
10361c991144SBram Moolenaar    vim9script
10371c991144SBram Moolenaar    import {
10381c991144SBram Moolenaar        exported,
10391c991144SBram Moolenaar        Exported,
10401c991144SBram Moolenaar        }
10411c991144SBram Moolenaar        from
10421c991144SBram Moolenaar        './Xexport.vim'
10431c991144SBram Moolenaar    g:imported = exported
10441c991144SBram Moolenaar    exported += 5
10451c991144SBram Moolenaar    g:imported_added = exported
10461c991144SBram Moolenaar    g:imported_func = Exported()
10471c991144SBram Moolenaar  END
10481c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
10491c991144SBram Moolenaar  source Ximport_lbr.vim
10501c991144SBram Moolenaar
10511c991144SBram Moolenaar  assert_equal(9876, g:imported)
10521c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
10531c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
10541c991144SBram Moolenaar
10551c991144SBram Moolenaar  # exported script not sourced again
10561c991144SBram Moolenaar  assert_false(exists('g:result'))
10571c991144SBram Moolenaar  unlet g:imported
10581c991144SBram Moolenaar  unlet g:imported_added
10591c991144SBram Moolenaar  unlet g:imported_func
10601c991144SBram Moolenaar  delete('Ximport_lbr.vim')
10611c991144SBram Moolenaar
10621c991144SBram Moolenaar  # import inside :def function
1063cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
10645381c7a1SBram Moolenaar    vim9script
10655381c7a1SBram Moolenaar    def ImportInDef()
10665381c7a1SBram Moolenaar      import exported from './Xexport.vim'
10675381c7a1SBram Moolenaar      g:imported = exported
10685381c7a1SBram Moolenaar      exported += 7
10695381c7a1SBram Moolenaar      g:imported_added = exported
10705381c7a1SBram Moolenaar    enddef
10715381c7a1SBram Moolenaar    ImportInDef()
10725381c7a1SBram Moolenaar  END
10735381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
10745381c7a1SBram Moolenaar  source Ximport2.vim
1075f5be8cdbSBram Moolenaar  # TODO: this should be 9879
10765381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
10775381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
10785381c7a1SBram Moolenaar  unlet g:imported
10795381c7a1SBram Moolenaar  unlet g:imported_added
10805381c7a1SBram Moolenaar  delete('Ximport2.vim')
10815381c7a1SBram Moolenaar
1082cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1083f2d5c240SBram Moolenaar    vim9script
1084f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1085f2d5c240SBram Moolenaar    def UseExport()
1086cb4e80faSBram Moolenaar      g:imported_def = Export.exported
1087f2d5c240SBram Moolenaar    enddef
1088cb4e80faSBram Moolenaar    g:imported_script = Export.exported
1089cb4e80faSBram Moolenaar    assert_equal(1, exists('Export.exported'))
1090cb4e80faSBram Moolenaar    assert_equal(0, exists('Export.notexported'))
1091f2d5c240SBram Moolenaar    UseExport()
1092f2d5c240SBram Moolenaar  END
1093f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1094f2d5c240SBram Moolenaar  source Ximport.vim
1095cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_def)
1096cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_script)
1097f2d5c240SBram Moolenaar
1098cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1099599c89c8SBram Moolenaar    vim9script
1100599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1101599c89c8SBram Moolenaar    def Func()
1102cfcd011fSBram Moolenaar      var dummy = 1
1103cfcd011fSBram Moolenaar      var imported = Export + dummy
1104599c89c8SBram Moolenaar    enddef
1105822ba247SBram Moolenaar    defcompile
1106599c89c8SBram Moolenaar  END
1107599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
110844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1109599c89c8SBram Moolenaar
1110cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1111599c89c8SBram Moolenaar    vim9script
1112599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1113599c89c8SBram Moolenaar    def Func()
1114cfcd011fSBram Moolenaar      var imported = Export . exported
1115599c89c8SBram Moolenaar    enddef
1116822ba247SBram Moolenaar    defcompile
1117599c89c8SBram Moolenaar  END
1118599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
111944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1120599c89c8SBram Moolenaar
1121a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1122a6294955SBram Moolenaar    vim9script
1123a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1124a6294955SBram Moolenaar    var some = 'other'
1125a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1126a6294955SBram Moolenaar    defcompile
1127a6294955SBram Moolenaar  END
1128a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1129a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1130a6294955SBram Moolenaar
1131cb4e80faSBram Moolenaar  var import_star_as_lines_script_no_dot =<< trim END
1132cb4e80faSBram Moolenaar    vim9script
1133cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1134cb4e80faSBram Moolenaar    g:imported_script = Export exported
1135cb4e80faSBram Moolenaar  END
1136cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
1137cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1029:')
1138cb4e80faSBram Moolenaar
1139cb4e80faSBram Moolenaar  var import_star_as_lines_script_space_after_dot =<< trim END
1140cb4e80faSBram Moolenaar    vim9script
1141cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1142cb4e80faSBram Moolenaar    g:imported_script = Export. exported
1143cb4e80faSBram Moolenaar  END
1144cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1145cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1146cb4e80faSBram Moolenaar
1147cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1148599c89c8SBram Moolenaar    vim9script
1149599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1150599c89c8SBram Moolenaar    def Func()
1151cfcd011fSBram Moolenaar      var imported = Export.
1152599c89c8SBram Moolenaar    enddef
1153822ba247SBram Moolenaar    defcompile
1154599c89c8SBram Moolenaar  END
1155599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
115644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1157599c89c8SBram Moolenaar
1158cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
11591c991144SBram Moolenaar    vim9script
11601c991144SBram Moolenaar    import *
11611c991144SBram Moolenaar        as Export
11621c991144SBram Moolenaar        from
11631c991144SBram Moolenaar        './Xexport.vim'
11641c991144SBram Moolenaar    def UseExport()
11651c991144SBram Moolenaar      g:imported = Export.exported
11661c991144SBram Moolenaar    enddef
11671c991144SBram Moolenaar    UseExport()
11681c991144SBram Moolenaar  END
11691c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
11701c991144SBram Moolenaar  source Ximport.vim
11711c991144SBram Moolenaar  assert_equal(9883, g:imported)
11721c991144SBram Moolenaar
1173cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1174f2d5c240SBram Moolenaar    vim9script
1175f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1176f2d5c240SBram Moolenaar  END
1177f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
117844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1179f2d5c240SBram Moolenaar
1180f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1181cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1182fa29c8abSBram Moolenaar    vim9script
1183fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1184fa29c8abSBram Moolenaar  END
1185fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
118644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1187fa29c8abSBram Moolenaar
1188f5be8cdbSBram Moolenaar  # try to import something that is already defined
1189cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
11905269bd2aSBram Moolenaar    vim9script
1191cfcd011fSBram Moolenaar    var exported = 'something'
11925269bd2aSBram Moolenaar    import exported from './Xexport.vim'
11935269bd2aSBram Moolenaar  END
11945269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1195057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11965269bd2aSBram Moolenaar
1197f5be8cdbSBram Moolenaar  # try to import something that is already defined
11985269bd2aSBram Moolenaar  import_already_defined =<< trim END
11995269bd2aSBram Moolenaar    vim9script
1200cfcd011fSBram Moolenaar    var exported = 'something'
12015269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
12025269bd2aSBram Moolenaar  END
12035269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1204057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
12055269bd2aSBram Moolenaar
1206f5be8cdbSBram Moolenaar  # try to import something that is already defined
12075269bd2aSBram Moolenaar  import_already_defined =<< trim END
12085269bd2aSBram Moolenaar    vim9script
1209cfcd011fSBram Moolenaar    var exported = 'something'
12105269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
12115269bd2aSBram Moolenaar  END
12125269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1213057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
12145269bd2aSBram Moolenaar
1215918a4249SBram Moolenaar  # try changing an imported const
1216918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1217918a4249SBram Moolenaar    vim9script
1218918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1219918a4249SBram Moolenaar    def Assign()
1220918a4249SBram Moolenaar      CONST = 987
1221918a4249SBram Moolenaar    enddef
1222918a4249SBram Moolenaar    defcompile
1223918a4249SBram Moolenaar  END
1224918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1225918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1226918a4249SBram Moolenaar
12270f2a5cc6SBram Moolenaar  # try changing an imported final
12280f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
12290f2a5cc6SBram Moolenaar    vim9script
12300f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
12310f2a5cc6SBram Moolenaar    def Assign()
12320f2a5cc6SBram Moolenaar      theList = [2]
12330f2a5cc6SBram Moolenaar    enddef
12340f2a5cc6SBram Moolenaar    defcompile
12350f2a5cc6SBram Moolenaar  END
12360f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
12370f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
12380f2a5cc6SBram Moolenaar
1239f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1240cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1241fa29c8abSBram Moolenaar    vim9script
1242fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1243fa29c8abSBram Moolenaar  END
1244fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
124544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1246fa29c8abSBram Moolenaar
1247cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1248fa29c8abSBram Moolenaar    vim9script
1249fa29c8abSBram Moolenaar    import name './Xexport.vim'
1250fa29c8abSBram Moolenaar  END
1251fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
125244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1253fa29c8abSBram Moolenaar
1254cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1255fa29c8abSBram Moolenaar    vim9script
1256fa29c8abSBram Moolenaar    import name from Xexport.vim
1257fa29c8abSBram Moolenaar  END
1258fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
125944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1260fa29c8abSBram Moolenaar
1261cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1262fa29c8abSBram Moolenaar    vim9script
1263fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1264fa29c8abSBram Moolenaar  END
1265fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
126644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1267fa29c8abSBram Moolenaar
1268cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1269fa29c8abSBram Moolenaar    vim9script
1270fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1271fa29c8abSBram Moolenaar  END
12725269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
127344d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1274fa29c8abSBram Moolenaar
1275f2d5c240SBram Moolenaar  delete('Ximport.vim')
12765269bd2aSBram Moolenaar  delete('Ximport3.vim')
12778a7d6542SBram Moolenaar  delete('Xexport.vim')
12788a7d6542SBram Moolenaar
1279f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
12803e191694SBram Moolenaar  # Flags added or removed are also applied to the restored value.
12813e191694SBram Moolenaar  set cpo=abcd
1282cfcd011fSBram Moolenaar  var lines =<< trim END
1283750802b5SBram Moolenaar    vim9script
1284750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
12853e191694SBram Moolenaar    set cpo+=f
12863e191694SBram Moolenaar    set cpo-=c
12873e191694SBram Moolenaar    g:cpo_after_vim9script = &cpo
1288750802b5SBram Moolenaar  END
1289750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1290750802b5SBram Moolenaar  source Xvim9_script
12913e191694SBram Moolenaar  assert_equal('fabd', &cpo)
1292750802b5SBram Moolenaar  set cpo&vim
1293750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
12943e191694SBram Moolenaar  var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
12953e191694SBram Moolenaar  assert_equal(newcpo, g:cpo_after_vim9script)
12963e191694SBram Moolenaar
1297750802b5SBram Moolenaar  delete('Xvim9_script')
1298750802b5SBram Moolenaarenddef
1299750802b5SBram Moolenaar
13000a84284eSBram Moolenaardef Test_import_as()
13010a84284eSBram Moolenaar  var export_lines =<< trim END
13020a84284eSBram Moolenaar    vim9script
13030a84284eSBram Moolenaar    export var one = 1
13040a84284eSBram Moolenaar    export var yes = 'yes'
13050a84284eSBram Moolenaar  END
13060a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
13070a84284eSBram Moolenaar
13080a84284eSBram Moolenaar  var import_lines =<< trim END
13090a84284eSBram Moolenaar    vim9script
13106c7cc347SBram Moolenaar    var one = 'notused'
13116c7cc347SBram Moolenaar    var yes = 777
13120a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
13130a84284eSBram Moolenaar    assert_equal(1, thatOne)
13140a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
13150a84284eSBram Moolenaar    assert_equal('yes', yesYes)
13160a84284eSBram Moolenaar  END
13170a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
13180a84284eSBram Moolenaar
13190a84284eSBram Moolenaar  import_lines =<< trim END
13200a84284eSBram Moolenaar    vim9script
13210a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
13220a84284eSBram Moolenaar    assert_equal(1, thatOne)
13230a84284eSBram Moolenaar    assert_equal('yes', yesYes)
13240a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
13250a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
13260a84284eSBram Moolenaar  END
13270a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
13280a84284eSBram Moolenaar
13290a84284eSBram Moolenaar  delete('XexportAs')
13300a84284eSBram Moolenaarenddef
13310a84284eSBram Moolenaar
1332803af686SBram Moolenaarfunc g:Trigger()
1333803af686SBram Moolenaar  source Ximport.vim
1334803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1335803af686SBram Moolenaarendfunc
1336803af686SBram Moolenaar
1337803af686SBram Moolenaardef Test_import_export_expr_map()
1338803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1339cfcd011fSBram Moolenaar  var export_lines =<< trim END
1340803af686SBram Moolenaar    vim9script
1341803af686SBram Moolenaar    export def That(): string
1342803af686SBram Moolenaar      return 'yes'
1343803af686SBram Moolenaar    enddef
1344803af686SBram Moolenaar  END
1345803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1346803af686SBram Moolenaar
1347cfcd011fSBram Moolenaar  var import_lines =<< trim END
1348803af686SBram Moolenaar    vim9script
1349803af686SBram Moolenaar    import That from './Xexport_that.vim'
1350803af686SBram Moolenaar    assert_equal('yes', That())
1351803af686SBram Moolenaar  END
1352803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1353803af686SBram Moolenaar
1354803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1355803af686SBram Moolenaar  feedkeys('trigger', "xt")
1356803af686SBram Moolenaar
1357730b2483SBram Moolenaar  delete('Xexport_that.vim')
1358803af686SBram Moolenaar  delete('Ximport.vim')
1359803af686SBram Moolenaar  nunmap trigger
1360803af686SBram Moolenaarenddef
1361803af686SBram Moolenaar
13628e1986e3SBram Moolenaardef Test_import_in_filetype()
13638e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
13648e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1365cfcd011fSBram Moolenaar  var export_lines =<< trim END
13668e1986e3SBram Moolenaar    vim9script
1367cfcd011fSBram Moolenaar    export var That = 'yes'
13688e1986e3SBram Moolenaar  END
1369730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
13708e1986e3SBram Moolenaar
1371cfcd011fSBram Moolenaar  var import_lines =<< trim END
13728e1986e3SBram Moolenaar    vim9script
1373730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
13748e1986e3SBram Moolenaar    assert_equal('yes', That)
13758e1986e3SBram Moolenaar    g:did_load_mytpe = 1
13768e1986e3SBram Moolenaar  END
13778e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
13788e1986e3SBram Moolenaar
1379cfcd011fSBram Moolenaar  var save_rtp = &rtp
13808e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
13818e1986e3SBram Moolenaar
13828e1986e3SBram Moolenaar  filetype plugin on
13838e1986e3SBram Moolenaar  copen
13848e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
13858e1986e3SBram Moolenaar
13868e1986e3SBram Moolenaar  quit!
1387730b2483SBram Moolenaar  delete('Xexport_ft.vim')
13888e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
13898e1986e3SBram Moolenaar  &rtp = save_rtp
13908e1986e3SBram Moolenaarenddef
13918e1986e3SBram Moolenaar
1392efa94447SBram Moolenaardef Test_use_import_in_mapping()
1393cfcd011fSBram Moolenaar  var lines =<< trim END
1394efa94447SBram Moolenaar      vim9script
1395efa94447SBram Moolenaar      export def Funcx()
1396efa94447SBram Moolenaar        g:result = 42
1397efa94447SBram Moolenaar      enddef
1398efa94447SBram Moolenaar  END
1399efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1400efa94447SBram Moolenaar  lines =<< trim END
1401efa94447SBram Moolenaar      vim9script
1402efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1403b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1404efa94447SBram Moolenaar  END
1405efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1406efa94447SBram Moolenaar
1407efa94447SBram Moolenaar  source Xmapscript.vim
1408b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1409efa94447SBram Moolenaar  assert_equal(42, g:result)
1410efa94447SBram Moolenaar
1411efa94447SBram Moolenaar  unlet g:result
1412efa94447SBram Moolenaar  delete('XsomeExport.vim')
1413efa94447SBram Moolenaar  delete('Xmapscript.vim')
1414b3ca9824SBram Moolenaar  nunmap <F3>
1415efa94447SBram Moolenaarenddef
1416efa94447SBram Moolenaar
1417d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1418d3f8a9eeSBram Moolenaar  var lines =<< trim END
1419d3f8a9eeSBram Moolenaar    if has(g:feature)
1420d3f8a9eeSBram Moolenaar      " legacy script
1421d3f8a9eeSBram Moolenaar      let g:legacy = 1
1422d3f8a9eeSBram Moolenaar      finish
1423d3f8a9eeSBram Moolenaar    endif
1424d3f8a9eeSBram Moolenaar    vim9script
1425d3f8a9eeSBram Moolenaar    g:legacy = 0
1426d3f8a9eeSBram Moolenaar  END
1427d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1428d3f8a9eeSBram Moolenaar  g:legacy = -1
1429d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1430d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1431d3f8a9eeSBram Moolenaar
1432d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1433d3f8a9eeSBram Moolenaar  g:legacy = -1
1434d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1435d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1436d3f8a9eeSBram Moolenaarenddef
1437d3f8a9eeSBram Moolenaar
1438750802b5SBram Moolenaardef Test_vim9script_fails()
14398a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
14408a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1441cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
14429721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1443cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1444750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1445750802b5SBram Moolenaar
1446cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1447c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1448c785b9a7SBram Moolenaar
1449e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1450e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
14518a7d6542SBram Moolenaarenddef
14528a7d6542SBram Moolenaar
1453f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1454101f4810SBram Moolenaar  CheckRunVimInTerminal
1455101f4810SBram Moolenaar
14569bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1457c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
14589bb3eb3eSBram Moolenaarendfunc
14599bb3eb3eSBram Moolenaar
1460c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1461cfcd011fSBram Moolenaar  var export =<< trim END
1462101f4810SBram Moolenaar    vim9script
1463101f4810SBram Moolenaar    export def Foo(): number
1464101f4810SBram Moolenaar        return 0
1465101f4810SBram Moolenaar    enddef
1466101f4810SBram Moolenaar  END
1467730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1468101f4810SBram Moolenaar
1469e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
14709bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
14712949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1472101f4810SBram Moolenaar
1473730b2483SBram Moolenaar  delete('XexportCmd.vim')
14749bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
14759bb3eb3eSBram Moolenaarenddef
1476101f4810SBram Moolenaar
14772b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
14782b32700dSBram Moolenaar  var lines =<< trim END
1479a6294955SBram Moolenaar    vim9script
1480a6294955SBram Moolenaar    export var exported = 'thexport'
1481a6294955SBram Moolenaar  END
1482a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1483a6294955SBram Moolenaar  lines =<< trim END
14842b32700dSBram Moolenaar    vim9script noclear
14852b32700dSBram Moolenaar    g:loadCount += 1
14862b32700dSBram Moolenaar    var s:reloaded = 'init'
1487a6294955SBram Moolenaar    import exported from './XExportReload'
14882b32700dSBram Moolenaar
14892b32700dSBram Moolenaar    def Again(): string
14902b32700dSBram Moolenaar      return 'again'
14912b32700dSBram Moolenaar    enddef
14922b32700dSBram Moolenaar
14932b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
14942b32700dSBram Moolenaar    var s:loaded = true
14952b32700dSBram Moolenaar
14962b32700dSBram Moolenaar    var s:notReloaded = 'yes'
14972b32700dSBram Moolenaar    s:reloaded = 'first'
14982b32700dSBram Moolenaar    def g:Values(): list<string>
1499a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
15002b32700dSBram Moolenaar    enddef
15012b32700dSBram Moolenaar
15022b32700dSBram Moolenaar    def Once(): string
15032b32700dSBram Moolenaar      return 'once'
15042b32700dSBram Moolenaar    enddef
15052b32700dSBram Moolenaar  END
15062b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
15072b32700dSBram Moolenaar  g:loadCount = 0
15082b32700dSBram Moolenaar  source XReloaded
15092b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1510a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
15112b32700dSBram Moolenaar  source XReloaded
15122b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1513a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
15142b32700dSBram Moolenaar  source XReloaded
15152b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1516a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
15172b32700dSBram Moolenaar
151848e11c10SBram Moolenaar  delete('XReloaded')
1519a6294955SBram Moolenaar  delete('XExportReload')
15202b32700dSBram Moolenaar  delfunc g:Values
15212b32700dSBram Moolenaar  unlet g:loadCount
1522*577dc93dSBram Moolenaar
1523*577dc93dSBram Moolenaar  lines =<< trim END
1524*577dc93dSBram Moolenaar      vim9script
1525*577dc93dSBram Moolenaar      def Inner()
1526*577dc93dSBram Moolenaar      enddef
1527*577dc93dSBram Moolenaar  END
1528*577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1529*577dc93dSBram Moolenaar  source XreloadScript.vim
1530*577dc93dSBram Moolenaar
1531*577dc93dSBram Moolenaar  lines =<< trim END
1532*577dc93dSBram Moolenaar      vim9script
1533*577dc93dSBram Moolenaar      def Outer()
1534*577dc93dSBram Moolenaar        def Inner()
1535*577dc93dSBram Moolenaar        enddef
1536*577dc93dSBram Moolenaar      enddef
1537*577dc93dSBram Moolenaar      defcompile
1538*577dc93dSBram Moolenaar  END
1539*577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1540*577dc93dSBram Moolenaar  source XreloadScript.vim
1541*577dc93dSBram Moolenaar
1542*577dc93dSBram Moolenaar  delete('XreloadScript.vim')
15432b32700dSBram Moolenaarenddef
15442b32700dSBram Moolenaar
15454c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1546cfcd011fSBram Moolenaar  var lines =<< trim END
15478a7d6542SBram Moolenaar    vim9script
15488a7d6542SBram Moolenaar    const var = ''
1549cfcd011fSBram Moolenaar    var valone = 1234
15508a7d6542SBram Moolenaar    def MyFunc(arg: string)
15518a7d6542SBram Moolenaar       valone = 5678
15528a7d6542SBram Moolenaar    enddef
15538a7d6542SBram Moolenaar  END
1554cfcd011fSBram Moolenaar  var morelines =<< trim END
1555cfcd011fSBram Moolenaar    var valtwo = 222
15568a7d6542SBram Moolenaar    export def GetValtwo(): number
15578a7d6542SBram Moolenaar      return valtwo
15588a7d6542SBram Moolenaar    enddef
15598a7d6542SBram Moolenaar  END
156003afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
15618a7d6542SBram Moolenaar  source Xreload.vim
15628a7d6542SBram Moolenaar  source Xreload.vim
15638a7d6542SBram Moolenaar  source Xreload.vim
15648a7d6542SBram Moolenaar
1565cfcd011fSBram Moolenaar  var testlines =<< trim END
15668a7d6542SBram Moolenaar    vim9script
15678a7d6542SBram Moolenaar    def TheFunc()
15688a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
15698a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
15708a7d6542SBram Moolenaar    enddef
15718a7d6542SBram Moolenaar    TheFunc()
15728a7d6542SBram Moolenaar  END
15738a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
15748a7d6542SBram Moolenaar  source Ximport.vim
15758a7d6542SBram Moolenaar
1576f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1577f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
15788a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15798a7d6542SBram Moolenaar  source Ximport.vim
15808a7d6542SBram Moolenaar
1581f5be8cdbSBram Moolenaar  # cannot declare a var twice
15828a7d6542SBram Moolenaar  lines =<< trim END
15838a7d6542SBram Moolenaar    vim9script
1584cfcd011fSBram Moolenaar    var valone = 1234
1585cfcd011fSBram Moolenaar    var valone = 5678
15868a7d6542SBram Moolenaar  END
15878a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
158844d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
15898a7d6542SBram Moolenaar
15908a7d6542SBram Moolenaar  delete('Xreload.vim')
15918a7d6542SBram Moolenaar  delete('Ximport.vim')
15928a7d6542SBram Moolenaarenddef
15938a7d6542SBram Moolenaar
159407a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
159507a65d26SBram Moolenaar" compiled function using that variable must fail.
159607a65d26SBram Moolenaardef Test_script_reload_change_type()
159707a65d26SBram Moolenaar  var lines =<< trim END
159807a65d26SBram Moolenaar    vim9script noclear
159907a65d26SBram Moolenaar    var str = 'string'
160007a65d26SBram Moolenaar    def g:GetStr(): string
160107a65d26SBram Moolenaar      return str .. 'xxx'
160207a65d26SBram Moolenaar    enddef
160307a65d26SBram Moolenaar  END
160407a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
160507a65d26SBram Moolenaar  source Xreload.vim
160607a65d26SBram Moolenaar  echo g:GetStr()
160707a65d26SBram Moolenaar
160807a65d26SBram Moolenaar  lines =<< trim END
160907a65d26SBram Moolenaar    vim9script noclear
161007a65d26SBram Moolenaar    var str = 1234
161107a65d26SBram Moolenaar  END
161207a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
161307a65d26SBram Moolenaar  source Xreload.vim
161407a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
161507a65d26SBram Moolenaar
161607a65d26SBram Moolenaar  delfunc g:GetStr
161707a65d26SBram Moolenaar  delete('Xreload.vim')
161807a65d26SBram Moolenaarenddef
161907a65d26SBram Moolenaar
1620c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled
1621c970e422SBram Moolenaarcommand CallFunc echo 'nop'
1622c970e422SBram Moolenaar
1623c970e422SBram Moolenaardef Test_script_reload_from_function()
1624c970e422SBram Moolenaar  var lines =<< trim END
1625c970e422SBram Moolenaar      vim9script
1626c970e422SBram Moolenaar
1627c970e422SBram Moolenaar      if exists('g:loaded')
1628c970e422SBram Moolenaar        finish
1629c970e422SBram Moolenaar      endif
1630c970e422SBram Moolenaar      g:loaded = 1
1631c970e422SBram Moolenaar      delcommand CallFunc
1632c970e422SBram Moolenaar      command CallFunc Func()
1633c970e422SBram Moolenaar      def Func()
1634a4c81beaSBram Moolenaar        so XreloadFunc.vim
1635c970e422SBram Moolenaar        g:didTheFunc = 1
1636c970e422SBram Moolenaar      enddef
1637c970e422SBram Moolenaar  END
1638c970e422SBram Moolenaar  writefile(lines, 'XreloadFunc.vim')
1639c970e422SBram Moolenaar  source XreloadFunc.vim
1640c970e422SBram Moolenaar  CallFunc
1641c970e422SBram Moolenaar  assert_equal(1, g:didTheFunc)
1642c970e422SBram Moolenaar
1643c970e422SBram Moolenaar  delete('XreloadFunc.vim')
1644c970e422SBram Moolenaar  delcommand CallFunc
1645c970e422SBram Moolenaar  unlet g:loaded
1646c970e422SBram Moolenaar  unlet g:didTheFunc
1647c970e422SBram Moolenaarenddef
1648c970e422SBram Moolenaar
16496c3843caSBram Moolenaardef Test_script_var_shadows_function()
16506c3843caSBram Moolenaar  var lines =<< trim END
16516c3843caSBram Moolenaar      vim9script
16526c3843caSBram Moolenaar      def Func(): number
16536c3843caSBram Moolenaar        return 123
16546c3843caSBram Moolenaar      enddef
16556c3843caSBram Moolenaar      var Func = 1
16566c3843caSBram Moolenaar  END
16576c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
16586c3843caSBram Moolenaarenddef
16596c3843caSBram Moolenaar
166095006e3dSBram Moolenaardef s:RetSome(): string
166195006e3dSBram Moolenaar  return 'some'
166295006e3dSBram Moolenaarenddef
166395006e3dSBram Moolenaar
1664fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1665fe465a01SBram Moolenaar" script-local name.
1666fe465a01SBram Moolenaardef Test_vim9script_funcref()
1667cfcd011fSBram Moolenaar  var sortlines =<< trim END
1668fe465a01SBram Moolenaar      vim9script
1669fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1670bed36b93SBram Moolenaar        return i2 - i1
1671fe465a01SBram Moolenaar      enddef
1672fe465a01SBram Moolenaar
1673fe465a01SBram Moolenaar      export def FastSort(): list<number>
1674fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1675fe465a01SBram Moolenaar      enddef
1676529fb5a5SBram Moolenaar
1677529fb5a5SBram Moolenaar      export def GetString(arg: string): string
1678529fb5a5SBram Moolenaar        return arg
1679529fb5a5SBram Moolenaar      enddef
1680fe465a01SBram Moolenaar  END
1681fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1682fe465a01SBram Moolenaar
1683cfcd011fSBram Moolenaar  var lines =<< trim END
1684fe465a01SBram Moolenaar    vim9script
1685fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1686fe465a01SBram Moolenaar    def Test()
1687fe465a01SBram Moolenaar      g:result = FastSort()
1688fe465a01SBram Moolenaar    enddef
1689fe465a01SBram Moolenaar    Test()
1690529fb5a5SBram Moolenaar
1691529fb5a5SBram Moolenaar    # using a function imported with "as"
1692529fb5a5SBram Moolenaar    import * as anAlias from './Xsort.vim'
1693529fb5a5SBram Moolenaar    assert_equal('yes', anAlias.GetString('yes'))
1694529fb5a5SBram Moolenaar
1695529fb5a5SBram Moolenaar    # using the function from a compiled function
1696529fb5a5SBram Moolenaar    def TestMore(): string
1697ca51cc0aSBram Moolenaar      var s = s:anAlias.GetString('foo')
1698ca51cc0aSBram Moolenaar      return s .. anAlias.GetString('bar')
1699529fb5a5SBram Moolenaar    enddef
1700ca51cc0aSBram Moolenaar    assert_equal('foobar', TestMore())
1701529fb5a5SBram Moolenaar
1702529fb5a5SBram Moolenaar    # error when using a function that isn't exported
1703529fb5a5SBram Moolenaar    assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1704fe465a01SBram Moolenaar  END
1705fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1706fe465a01SBram Moolenaar
1707fe465a01SBram Moolenaar  source Xscript.vim
1708fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1709fe465a01SBram Moolenaar
1710fe465a01SBram Moolenaar  unlet g:result
1711fe465a01SBram Moolenaar  delete('Xsort.vim')
1712fe465a01SBram Moolenaar  delete('Xscript.vim')
171395006e3dSBram Moolenaar
1714cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
171595006e3dSBram Moolenaar  assert_equal('some', Funcref())
1716fe465a01SBram Moolenaarenddef
1717fe465a01SBram Moolenaar
1718601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1719601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1720601e76acSBram Moolenaar" function reference.
1721c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1722cfcd011fSBram Moolenaar  var filterLines =<< trim END
1723c620c055SBram Moolenaar    vim9script
1724c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1725c620c055SBram Moolenaar      return idx % 2 == 1
1726c620c055SBram Moolenaar    enddef
1727c620c055SBram Moolenaar    export def FastFilter(): list<number>
1728c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1729c620c055SBram Moolenaar    enddef
1730601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1731601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1732601e76acSBram Moolenaar    enddef
1733c620c055SBram Moolenaar  END
1734c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1735c620c055SBram Moolenaar
1736cfcd011fSBram Moolenaar  var lines =<< trim END
1737c620c055SBram Moolenaar    vim9script
1738601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1739c620c055SBram Moolenaar    def Test()
1740cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1741c620c055SBram Moolenaar    enddef
1742c620c055SBram Moolenaar    Test()
1743601e76acSBram Moolenaar    def TestDirect()
1744cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1745601e76acSBram Moolenaar    enddef
1746601e76acSBram Moolenaar    TestDirect()
1747c620c055SBram Moolenaar  END
1748601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1749c620c055SBram Moolenaar  delete('Xfilter.vim')
1750c620c055SBram Moolenaarenddef
1751c620c055SBram Moolenaar
17524c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1753cfcd011fSBram Moolenaar  var first_lines =<< trim END
17544c17ad94SBram Moolenaar    vim9script
17554c17ad94SBram Moolenaar    def FuncYes(): string
17564c17ad94SBram Moolenaar      return 'yes'
17574c17ad94SBram Moolenaar    enddef
17584c17ad94SBram Moolenaar  END
1759cfcd011fSBram Moolenaar  var withno_lines =<< trim END
17604c17ad94SBram Moolenaar    def FuncNo(): string
17614c17ad94SBram Moolenaar      return 'no'
17624c17ad94SBram Moolenaar    enddef
17634c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
17644c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
17654c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
176603afdcf1SBram Moolenaar    enddef
176703afdcf1SBram Moolenaar  END
1768cfcd011fSBram Moolenaar  var nono_lines =<< trim END
176903afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
177003afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
177144d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
17724c17ad94SBram Moolenaar    enddef
17734c17ad94SBram Moolenaar  END
17744c17ad94SBram Moolenaar
17754c17ad94SBram Moolenaar  # FuncNo() is defined
177603afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17774c17ad94SBram Moolenaar  source Xreloaded.vim
17784c17ad94SBram Moolenaar  g:DoCheck(true)
17794c17ad94SBram Moolenaar
17804c17ad94SBram Moolenaar  # FuncNo() is not redefined
178103afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
17824c17ad94SBram Moolenaar  source Xreloaded.vim
17835082471fSBram Moolenaar  g:DoCheck(false)
17844c17ad94SBram Moolenaar
17854c17ad94SBram Moolenaar  # FuncNo() is back
178603afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17874c17ad94SBram Moolenaar  source Xreloaded.vim
17885082471fSBram Moolenaar  g:DoCheck(false)
17894c17ad94SBram Moolenaar
17904c17ad94SBram Moolenaar  delete('Xreloaded.vim')
17914c17ad94SBram Moolenaarenddef
17924c17ad94SBram Moolenaar
179389483d40SBram Moolenaardef Test_vim9script_reload_delvar()
179489483d40SBram Moolenaar  # write the script with a script-local variable
1795cfcd011fSBram Moolenaar  var lines =<< trim END
179689483d40SBram Moolenaar    vim9script
1797cfcd011fSBram Moolenaar    var name = 'string'
179889483d40SBram Moolenaar  END
179989483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
180089483d40SBram Moolenaar  source XreloadVar.vim
180189483d40SBram Moolenaar
180289483d40SBram Moolenaar  # now write the script using the same variable locally - works
180389483d40SBram Moolenaar  lines =<< trim END
180489483d40SBram Moolenaar    vim9script
180589483d40SBram Moolenaar    def Func()
1806cfcd011fSBram Moolenaar      var name = 'string'
180789483d40SBram Moolenaar    enddef
180889483d40SBram Moolenaar  END
180989483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
181089483d40SBram Moolenaar  source XreloadVar.vim
181189483d40SBram Moolenaar
181289483d40SBram Moolenaar  delete('XreloadVar.vim')
181389483d40SBram Moolenaarenddef
181489483d40SBram Moolenaar
18158a7d6542SBram Moolenaardef Test_import_absolute()
1816cfcd011fSBram Moolenaar  var import_lines = [
1817e6085c53SBram Moolenaar        'vim9script',
1818e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1819e6085c53SBram Moolenaar        'def UseExported()',
1820e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1821e6085c53SBram Moolenaar        '  exported = 8888',
1822e6085c53SBram Moolenaar        '  g:imported_after = exported',
1823e6085c53SBram Moolenaar        'enddef',
1824e6085c53SBram Moolenaar        'UseExported()',
1825e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1826e6085c53SBram Moolenaar        ]
18278a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
18288a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
18298a7d6542SBram Moolenaar
18308a7d6542SBram Moolenaar  source Ximport_abs.vim
18318a7d6542SBram Moolenaar
18328a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
18334e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1834fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1835fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1836fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1837fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1838fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1839fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1840fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1841fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1842fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1843fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1844e6085c53SBram Moolenaar        g:import_disassembled)
1845b3ca9824SBram Moolenaar
1846b3ca9824SBram Moolenaar  Undo_export_script_lines()
18478a7d6542SBram Moolenaar  unlet g:imported_abs
18484e12a5dfSBram Moolenaar  unlet g:import_disassembled
18498a7d6542SBram Moolenaar
18508a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
18518a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
18528a7d6542SBram Moolenaarenddef
18538a7d6542SBram Moolenaar
18548a7d6542SBram Moolenaardef Test_import_rtp()
1855cfcd011fSBram Moolenaar  var import_lines = [
1856e6085c53SBram Moolenaar        'vim9script',
1857e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1858e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1859e6085c53SBram Moolenaar        ]
18608a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
18618a7d6542SBram Moolenaar  mkdir('import')
18628a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
18638a7d6542SBram Moolenaar
1864cfcd011fSBram Moolenaar  var save_rtp = &rtp
18658a7d6542SBram Moolenaar  &rtp = getcwd()
18668a7d6542SBram Moolenaar  source Ximport_rtp.vim
18678a7d6542SBram Moolenaar  &rtp = save_rtp
18688a7d6542SBram Moolenaar
18698a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
18708a7d6542SBram Moolenaar
1871b3ca9824SBram Moolenaar  Undo_export_script_lines()
1872b3ca9824SBram Moolenaar  unlet g:imported_rtp
18738a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
187489483d40SBram Moolenaar  delete('import', 'rf')
18758a7d6542SBram Moolenaarenddef
18768a7d6542SBram Moolenaar
187725e0f586SBram Moolenaardef Test_import_compile_error()
1878cfcd011fSBram Moolenaar  var export_lines = [
187925e0f586SBram Moolenaar        'vim9script',
188025e0f586SBram Moolenaar        'export def ExpFunc(): string',
188125e0f586SBram Moolenaar        '  return notDefined',
188225e0f586SBram Moolenaar        'enddef',
188325e0f586SBram Moolenaar        ]
188425e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
188525e0f586SBram Moolenaar
1886cfcd011fSBram Moolenaar  var import_lines = [
188725e0f586SBram Moolenaar        'vim9script',
188825e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
188925e0f586SBram Moolenaar        'def ImpFunc()',
189025e0f586SBram Moolenaar        '  echo ExpFunc()',
189125e0f586SBram Moolenaar        'enddef',
189225e0f586SBram Moolenaar        'defcompile',
189325e0f586SBram Moolenaar        ]
189425e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
189525e0f586SBram Moolenaar
189625e0f586SBram Moolenaar  try
189725e0f586SBram Moolenaar    source Ximport.vim
189825e0f586SBram Moolenaar  catch /E1001/
1899f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
19007707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
190125e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
190225e0f586SBram Moolenaar  endtry
190325e0f586SBram Moolenaar
190425e0f586SBram Moolenaar  delete('Xexported.vim')
190525e0f586SBram Moolenaar  delete('Ximport.vim')
190625e0f586SBram Moolenaarenddef
190725e0f586SBram Moolenaar
1908c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1909cfcd011fSBram Moolenaar  var lines = [
1910c4ce36d4SBram Moolenaar        'vim9script',
1911c4ce36d4SBram Moolenaar        'def Func()',
1912c4ce36d4SBram Moolenaar        '  eval [][0]',
1913c4ce36d4SBram Moolenaar        'enddef',
1914c4ce36d4SBram Moolenaar        'Func()',
1915c4ce36d4SBram Moolenaar        ]
1916c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1917c4ce36d4SBram Moolenaar
1918c4ce36d4SBram Moolenaar  for count in range(3)
1919c4ce36d4SBram Moolenaar    try
1920c4ce36d4SBram Moolenaar      source Xtestscript.vim
1921c4ce36d4SBram Moolenaar    catch /E684/
1922c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1923c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1924c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1925c4ce36d4SBram Moolenaar    endtry
1926c4ce36d4SBram Moolenaar  endfor
1927c4ce36d4SBram Moolenaar
1928c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1929c4ce36d4SBram Moolenaarenddef
1930c4ce36d4SBram Moolenaar
1931eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1932cfcd011fSBram Moolenaar  var export_lines =<< trim END
1933eef2102eSBram Moolenaar      vim9script
1934eef2102eSBram Moolenaar      export def Func()
1935eef2102eSBram Moolenaar        echo 'imported'
1936eef2102eSBram Moolenaar      enddef
1937eef2102eSBram Moolenaar  END
1938eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1939eef2102eSBram Moolenaar
1940cfcd011fSBram Moolenaar  var lines =<< trim END
1941eef2102eSBram Moolenaar    vim9script
1942eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1943eef2102eSBram Moolenaar    def Func()
1944eef2102eSBram Moolenaar      echo 'local to function'
1945eef2102eSBram Moolenaar    enddef
1946eef2102eSBram Moolenaar  END
1947eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1948eef2102eSBram Moolenaar
1949eef2102eSBram Moolenaar  lines =<< trim END
1950eef2102eSBram Moolenaar    vim9script
1951eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1952eef2102eSBram Moolenaar    def Outer()
1953eef2102eSBram Moolenaar      def Func()
1954eef2102eSBram Moolenaar        echo 'local to function'
1955eef2102eSBram Moolenaar      enddef
1956eef2102eSBram Moolenaar    enddef
1957eef2102eSBram Moolenaar    defcompile
1958eef2102eSBram Moolenaar  END
1959eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1960eef2102eSBram Moolenaar
1961eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1962eef2102eSBram Moolenaarenddef
1963eef2102eSBram Moolenaar
1964b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1965cfcd011fSBram Moolenaar  var lines =<< trim END
1966b9a2cac3SBram Moolenaar    vim9script
1967b9a2cac3SBram Moolenaar    def Func()
1968b9a2cac3SBram Moolenaar      echo 'one'
1969b9a2cac3SBram Moolenaar    enddef
1970b9a2cac3SBram Moolenaar    def Func()
1971b9a2cac3SBram Moolenaar      echo 'two'
1972b9a2cac3SBram Moolenaar    enddef
1973b9a2cac3SBram Moolenaar  END
1974b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1975fa211f3cSBram Moolenaar
1976fa211f3cSBram Moolenaar  lines =<< trim END
1977fa211f3cSBram Moolenaar    vim9script
1978fa211f3cSBram Moolenaar    def Foo(): string
1979fa211f3cSBram Moolenaar      return 'foo'
1980fa211f3cSBram Moolenaar      enddef
1981fa211f3cSBram Moolenaar    def Func()
1982cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1983fa211f3cSBram Moolenaar    enddef
1984fa211f3cSBram Moolenaar    defcompile
1985fa211f3cSBram Moolenaar  END
1986fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1987b9a2cac3SBram Moolenaarenddef
1988b9a2cac3SBram Moolenaar
19898a7d6542SBram Moolenaardef Test_fixed_size_list()
1990f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1991cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
19928a7d6542SBram Moolenaar  l->remove(0)
19938a7d6542SBram Moolenaar  l->add(5)
19948a7d6542SBram Moolenaar  l->insert(99, 1)
19950f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
19968a7d6542SBram Moolenaarenddef
19978a7d6542SBram Moolenaar
1998ae616494SBram Moolenaardef Test_no_insert_xit()
1999d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2000d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2001d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2002d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2003d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2004ae616494SBram Moolenaar
2005ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2006ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2007ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2008ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2009f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2010f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
20116508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
20126508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
2013f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2014f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2015f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2016ae616494SBram Moolenaarenddef
2017ae616494SBram Moolenaar
2018158906cfSBram Moolenaardef IfElse(what: number): string
2019cfcd011fSBram Moolenaar  var res = ''
2020158906cfSBram Moolenaar  if what == 1
2021158906cfSBram Moolenaar    res = "one"
2022158906cfSBram Moolenaar  elseif what == 2
2023158906cfSBram Moolenaar    res = "two"
2024a259d8d3SBram Moolenaar  else
2025158906cfSBram Moolenaar    res = "three"
2026a259d8d3SBram Moolenaar  endif
2027158906cfSBram Moolenaar  return res
2028a259d8d3SBram Moolenaarenddef
2029a259d8d3SBram Moolenaar
2030158906cfSBram Moolenaardef Test_if_elseif_else()
2031158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2032158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2033158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
20340f18b6d1SBram Moolenaarenddef
20350f18b6d1SBram Moolenaar
2036e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2037d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2038d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2039d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2040ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
2041d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
20426628b7ebSBram Moolenaar
20436628b7ebSBram Moolenaar  var lines =<< trim END
20446628b7ebSBram Moolenaar      var s = ''
20456628b7ebSBram Moolenaar      if s = ''
20466628b7ebSBram Moolenaar      endif
20476628b7ebSBram Moolenaar  END
20486628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
20496628b7ebSBram Moolenaar
20506628b7ebSBram Moolenaar  lines =<< trim END
20516628b7ebSBram Moolenaar      var s = ''
20526628b7ebSBram Moolenaar      if s == ''
20536628b7ebSBram Moolenaar      elseif s = ''
20546628b7ebSBram Moolenaar      endif
20556628b7ebSBram Moolenaar  END
20566628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2057e8c4abbbSBram Moolenaarenddef
2058e8c4abbbSBram Moolenaar
20596d69bf60SBram Moolenaarlet g:bool_true = v:true
20606d69bf60SBram Moolenaarlet g:bool_false = v:false
20616d69bf60SBram Moolenaar
20626d69bf60SBram Moolenaardef Test_if_const_expr()
2063cfcd011fSBram Moolenaar  var res = false
20646d69bf60SBram Moolenaar  if true ? true : false
20656d69bf60SBram Moolenaar    res = true
20666d69bf60SBram Moolenaar  endif
20676d69bf60SBram Moolenaar  assert_equal(true, res)
20686d69bf60SBram Moolenaar
2069585fea7bSBram Moolenaar  g:glob = 2
2070585fea7bSBram Moolenaar  if false
20716797966dSBram Moolenaar    execute('g:glob = 3')
2072585fea7bSBram Moolenaar  endif
2073585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2074585fea7bSBram Moolenaar  if true
20756797966dSBram Moolenaar    execute('g:glob = 3')
2076585fea7bSBram Moolenaar  endif
2077585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2078585fea7bSBram Moolenaar
20796d69bf60SBram Moolenaar  res = false
20806d69bf60SBram Moolenaar  if g:bool_true ? true : false
20816d69bf60SBram Moolenaar    res = true
20826d69bf60SBram Moolenaar  endif
20836d69bf60SBram Moolenaar  assert_equal(true, res)
20846d69bf60SBram Moolenaar
20856d69bf60SBram Moolenaar  res = false
20866d69bf60SBram Moolenaar  if true ? g:bool_true : false
20876d69bf60SBram Moolenaar    res = true
20886d69bf60SBram Moolenaar  endif
20896d69bf60SBram Moolenaar  assert_equal(true, res)
20906d69bf60SBram Moolenaar
20916d69bf60SBram Moolenaar  res = false
20926d69bf60SBram Moolenaar  if true ? true : g:bool_false
20936d69bf60SBram Moolenaar    res = true
20946d69bf60SBram Moolenaar  endif
20956d69bf60SBram Moolenaar  assert_equal(true, res)
20966d69bf60SBram Moolenaar
20976d69bf60SBram Moolenaar  res = false
20986d69bf60SBram Moolenaar  if true ? false : true
20996d69bf60SBram Moolenaar    res = true
21006d69bf60SBram Moolenaar  endif
21016d69bf60SBram Moolenaar  assert_equal(false, res)
21026d69bf60SBram Moolenaar
21036d69bf60SBram Moolenaar  res = false
21046d69bf60SBram Moolenaar  if false ? false : true
21056d69bf60SBram Moolenaar    res = true
21066d69bf60SBram Moolenaar  endif
21076d69bf60SBram Moolenaar  assert_equal(true, res)
21086d69bf60SBram Moolenaar
21096d69bf60SBram Moolenaar  res = false
21106d69bf60SBram Moolenaar  if false ? true : false
21116d69bf60SBram Moolenaar    res = true
21126d69bf60SBram Moolenaar  endif
21136d69bf60SBram Moolenaar  assert_equal(false, res)
21146d69bf60SBram Moolenaar
21156d69bf60SBram Moolenaar  res = false
2116e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2117e8c4abbbSBram Moolenaar    res = true
2118e8c4abbbSBram Moolenaar  endif
2119e8c4abbbSBram Moolenaar  assert_equal(false, res)
2120e8c4abbbSBram Moolenaar
2121e8c4abbbSBram Moolenaar  res = false
21226d69bf60SBram Moolenaar  if true && true
21236d69bf60SBram Moolenaar    res = true
21246d69bf60SBram Moolenaar  endif
21256d69bf60SBram Moolenaar  assert_equal(true, res)
21266d69bf60SBram Moolenaar
21276d69bf60SBram Moolenaar  res = false
21286d69bf60SBram Moolenaar  if true && false
21296d69bf60SBram Moolenaar    res = true
21306d69bf60SBram Moolenaar  endif
21316d69bf60SBram Moolenaar  assert_equal(false, res)
21326d69bf60SBram Moolenaar
21336d69bf60SBram Moolenaar  res = false
21346d69bf60SBram Moolenaar  if g:bool_true && false
21356d69bf60SBram Moolenaar    res = true
21366d69bf60SBram Moolenaar  endif
21376d69bf60SBram Moolenaar  assert_equal(false, res)
21386d69bf60SBram Moolenaar
21396d69bf60SBram Moolenaar  res = false
21406d69bf60SBram Moolenaar  if true && g:bool_false
21416d69bf60SBram Moolenaar    res = true
21426d69bf60SBram Moolenaar  endif
21436d69bf60SBram Moolenaar  assert_equal(false, res)
21446d69bf60SBram Moolenaar
21456d69bf60SBram Moolenaar  res = false
21466d69bf60SBram Moolenaar  if false && false
21476d69bf60SBram Moolenaar    res = true
21486d69bf60SBram Moolenaar  endif
21496d69bf60SBram Moolenaar  assert_equal(false, res)
21506d69bf60SBram Moolenaar
21516d69bf60SBram Moolenaar  res = false
21526d69bf60SBram Moolenaar  if true || false
21536d69bf60SBram Moolenaar    res = true
21546d69bf60SBram Moolenaar  endif
21556d69bf60SBram Moolenaar  assert_equal(true, res)
21566d69bf60SBram Moolenaar
21576d69bf60SBram Moolenaar  res = false
21586d69bf60SBram Moolenaar  if g:bool_true || false
21596d69bf60SBram Moolenaar    res = true
21606d69bf60SBram Moolenaar  endif
21616d69bf60SBram Moolenaar  assert_equal(true, res)
21626d69bf60SBram Moolenaar
21636d69bf60SBram Moolenaar  res = false
21646d69bf60SBram Moolenaar  if true || g:bool_false
21656d69bf60SBram Moolenaar    res = true
21666d69bf60SBram Moolenaar  endif
21676d69bf60SBram Moolenaar  assert_equal(true, res)
21686d69bf60SBram Moolenaar
21696d69bf60SBram Moolenaar  res = false
21706d69bf60SBram Moolenaar  if false || false
21716d69bf60SBram Moolenaar    res = true
21726d69bf60SBram Moolenaar  endif
21736d69bf60SBram Moolenaar  assert_equal(false, res)
21743988f64fSBram Moolenaar
21753988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
21763988f64fSBram Moolenaar  if false | eval 0 | endif
21773988f64fSBram Moolenaar  if false | eval burp + 234 | endif
21783988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
21793988f64fSBram Moolenaar  if false
21803988f64fSBram Moolenaar    burp
21813988f64fSBram Moolenaar  endif
218280c34ca3SBram Moolenaarenddef
21836d69bf60SBram Moolenaar
218480c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2185d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2186d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2187d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2188d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
21896d69bf60SBram Moolenaarenddef
21906d69bf60SBram Moolenaar
219172abcf42SBram Moolenaardef RunNested(i: number): number
2192cfcd011fSBram Moolenaar  var x: number = 0
219372abcf42SBram Moolenaar  if i % 2
219472abcf42SBram Moolenaar    if 1
2195f5be8cdbSBram Moolenaar      # comment
219672abcf42SBram Moolenaar    else
2197f5be8cdbSBram Moolenaar      # comment
219872abcf42SBram Moolenaar    endif
219972abcf42SBram Moolenaar    x += 1
220072abcf42SBram Moolenaar  else
220172abcf42SBram Moolenaar    x += 1000
220272abcf42SBram Moolenaar  endif
220372abcf42SBram Moolenaar  return x
220472abcf42SBram Moolenaarenddef
220572abcf42SBram Moolenaar
220672abcf42SBram Moolenaardef Test_nested_if()
220772abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
220872abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
220972abcf42SBram Moolenaarenddef
221072abcf42SBram Moolenaar
2211ad39c094SBram Moolenaardef Test_execute_cmd()
2212e4984290SBram Moolenaar  # missing argument is ignored
2213e4984290SBram Moolenaar  execute
2214e4984290SBram Moolenaar  execute # comment
2215e4984290SBram Moolenaar
2216ad39c094SBram Moolenaar  new
2217ad39c094SBram Moolenaar  setline(1, 'default')
2218d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2219ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2220a72cfb80SBram Moolenaar
2221d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2222a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2223a72cfb80SBram Moolenaar
2224cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2225cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2226a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2227ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2228a72cfb80SBram Moolenaar
2229d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2230ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2231a72cfb80SBram Moolenaar
2232cfcd011fSBram Moolenaar  var cmd_first = 'call '
2233cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2234ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2235ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2236ad39c094SBram Moolenaar  bwipe!
2237585fea7bSBram Moolenaar
2238cfcd011fSBram Moolenaar  var n = true
22392d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
22402d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
22412d6b20d6SBram Moolenaar
2242e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2243e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2244e5abf7afSBram Moolenaar
2245d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2246d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2247d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2248ad39c094SBram Moolenaarenddef
2249ad39c094SBram Moolenaar
225047e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2251f5be8cdbSBram Moolenaar  # only checks line continuation
2252cfcd011fSBram Moolenaar  var lines =<< trim END
225347e880d6SBram Moolenaar      vim9script
225447e880d6SBram Moolenaar      execute 'g:someVar'
225547e880d6SBram Moolenaar                .. ' = ' ..
225647e880d6SBram Moolenaar                   '28'
225747e880d6SBram Moolenaar      assert_equal(28, g:someVar)
225847e880d6SBram Moolenaar      unlet g:someVar
225947e880d6SBram Moolenaar  END
226047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
226147e880d6SBram Moolenaarenddef
226247e880d6SBram Moolenaar
2263ad39c094SBram Moolenaardef Test_echo_cmd()
2264a72cfb80SBram Moolenaar  echo 'some' # comment
2265585fea7bSBram Moolenaar  echon 'thing'
2266ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2267ad39c094SBram Moolenaar
2268a72cfb80SBram Moolenaar  echo "some" # comment
2269a72cfb80SBram Moolenaar  echon "thing"
2270a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2271a72cfb80SBram Moolenaar
2272cfcd011fSBram Moolenaar  var str1 = 'some'
2273cfcd011fSBram Moolenaar  var str2 = 'more'
2274ad39c094SBram Moolenaar  echo str1 str2
2275ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2276a72cfb80SBram Moolenaar
2277d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2278ad39c094SBram Moolenaarenddef
2279ad39c094SBram Moolenaar
2280f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2281f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2282f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2283f93c7feaSBram Moolenaar  echo 'clear'
2284df069eecSBram Moolenaar  :1messages
2285f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2286f93c7feaSBram Moolenaar
2287d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2288f93c7feaSBram Moolenaarenddef
2289f93c7feaSBram Moolenaar
229047e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2291f5be8cdbSBram Moolenaar  # only checks line continuation
2292cfcd011fSBram Moolenaar  var lines =<< trim END
229347e880d6SBram Moolenaar      vim9script
229447e880d6SBram Moolenaar      echomsg 'here'
229547e880d6SBram Moolenaar                .. ' is ' ..
229647e880d6SBram Moolenaar                   'a message'
229747e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
229847e880d6SBram Moolenaar  END
229947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
230047e880d6SBram Moolenaarenddef
230147e880d6SBram Moolenaar
2302f93c7feaSBram Moolenaardef Test_echoerr_cmd()
230340ee466cSBram Moolenaar  try
230440ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
230540ee466cSBram Moolenaar  catch
230640ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
230740ee466cSBram Moolenaar  endtry
2308f93c7feaSBram Moolenaarenddef
2309f93c7feaSBram Moolenaar
231047e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2311f5be8cdbSBram Moolenaar  # only checks line continuation
2312cfcd011fSBram Moolenaar  var lines =<< trim END
231347e880d6SBram Moolenaar      vim9script
231447e880d6SBram Moolenaar      try
231547e880d6SBram Moolenaar        echoerr 'this'
231647e880d6SBram Moolenaar                .. ' is ' ..
231747e880d6SBram Moolenaar                   'wrong'
231847e880d6SBram Moolenaar      catch
231947e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
232047e880d6SBram Moolenaar      endtry
232147e880d6SBram Moolenaar  END
232247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
232347e880d6SBram Moolenaarenddef
232447e880d6SBram Moolenaar
232541fe0617SBram Moolenaardef Test_for_outside_of_function()
2326cfcd011fSBram Moolenaar  var lines =<< trim END
232741fe0617SBram Moolenaar    vim9script
232841fe0617SBram Moolenaar    new
232941fe0617SBram Moolenaar    for var in range(0, 3)
233041fe0617SBram Moolenaar      append(line('$'), var)
233141fe0617SBram Moolenaar    endfor
233241fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
233341fe0617SBram Moolenaar    bwipe!
2334522eefd9SBram Moolenaar
2335522eefd9SBram Moolenaar    var result = ''
2336522eefd9SBram Moolenaar    for i in [1, 2, 3]
2337522eefd9SBram Moolenaar      var loop = ' loop ' .. i
2338522eefd9SBram Moolenaar      result ..= loop
2339522eefd9SBram Moolenaar    endfor
2340522eefd9SBram Moolenaar    assert_equal(' loop 1 loop 2 loop 3', result)
234141fe0617SBram Moolenaar  END
234241fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
234341fe0617SBram Moolenaar  source Xvim9for.vim
234441fe0617SBram Moolenaar  delete('Xvim9for.vim')
234541fe0617SBram Moolenaarenddef
23468a7d6542SBram Moolenaar
2347e8c4abbbSBram Moolenaardef Test_for_loop()
2348f2253963SBram Moolenaar  var lines =<< trim END
2349cfcd011fSBram Moolenaar      var result = ''
2350e8c4abbbSBram Moolenaar      for cnt in range(7)
2351e8c4abbbSBram Moolenaar        if cnt == 4
2352e8c4abbbSBram Moolenaar          break
2353e8c4abbbSBram Moolenaar        endif
2354e8c4abbbSBram Moolenaar        if cnt == 2
2355e8c4abbbSBram Moolenaar          continue
2356e8c4abbbSBram Moolenaar        endif
2357e8c4abbbSBram Moolenaar        result ..= cnt .. '_'
2358e8c4abbbSBram Moolenaar      endfor
2359e8c4abbbSBram Moolenaar      assert_equal('0_1_3_', result)
23600ad3e894SBram Moolenaar
2361cfcd011fSBram Moolenaar      var concat = ''
23620ad3e894SBram Moolenaar      for str in eval('["one", "two"]')
23630ad3e894SBram Moolenaar        concat ..= str
23640ad3e894SBram Moolenaar      endfor
23650ad3e894SBram Moolenaar      assert_equal('onetwo', concat)
236638bd8de5SBram Moolenaar
236738bd8de5SBram Moolenaar      var total = 0
236838bd8de5SBram Moolenaar      for nr in
236938bd8de5SBram Moolenaar          [1, 2, 3]
237038bd8de5SBram Moolenaar        total += nr
237138bd8de5SBram Moolenaar      endfor
237238bd8de5SBram Moolenaar      assert_equal(6, total)
237338bd8de5SBram Moolenaar
237438bd8de5SBram Moolenaar      total = 0
237538bd8de5SBram Moolenaar      for nr
237638bd8de5SBram Moolenaar        in [1, 2, 3]
237738bd8de5SBram Moolenaar        total += nr
237838bd8de5SBram Moolenaar      endfor
237938bd8de5SBram Moolenaar      assert_equal(6, total)
238038bd8de5SBram Moolenaar
238138bd8de5SBram Moolenaar      total = 0
238238bd8de5SBram Moolenaar      for nr
238338bd8de5SBram Moolenaar        in
238438bd8de5SBram Moolenaar        [1, 2, 3]
238538bd8de5SBram Moolenaar        total += nr
238638bd8de5SBram Moolenaar      endfor
238738bd8de5SBram Moolenaar      assert_equal(6, total)
2388036d0714SBram Moolenaar
2389a3589a0dSBram Moolenaar      # with type
2390a3589a0dSBram Moolenaar      total = 0
2391a3589a0dSBram Moolenaar      for n: number in [1, 2, 3]
2392a3589a0dSBram Moolenaar        total += n
2393a3589a0dSBram Moolenaar      endfor
2394a3589a0dSBram Moolenaar      assert_equal(6, total)
2395a3589a0dSBram Moolenaar
2396fe090eb5SBram Moolenaar      var chars = ''
2397fe090eb5SBram Moolenaar      for s: string in 'foobar'
2398fe090eb5SBram Moolenaar        chars ..= s
2399fe090eb5SBram Moolenaar      endfor
2400fe090eb5SBram Moolenaar      assert_equal('foobar', chars)
2401fe090eb5SBram Moolenaar
2402a3589a0dSBram Moolenaar      # unpack with type
2403f2253963SBram Moolenaar      var res = ''
2404a3589a0dSBram Moolenaar      for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2405a3589a0dSBram Moolenaar        res ..= n .. s
2406a3589a0dSBram Moolenaar      endfor
2407a3589a0dSBram Moolenaar      assert_equal('1a2b', res)
2408a3589a0dSBram Moolenaar
2409444d8783SBram Moolenaar      # unpack with one var
2410444d8783SBram Moolenaar      var reslist = []
2411444d8783SBram Moolenaar      for [x] in [['aaa'], ['bbb']]
2412444d8783SBram Moolenaar        reslist->add(x)
2413444d8783SBram Moolenaar      endfor
2414444d8783SBram Moolenaar      assert_equal(['aaa', 'bbb'], reslist)
2415444d8783SBram Moolenaar
2416a3589a0dSBram Moolenaar      # loop over string
2417a3589a0dSBram Moolenaar      res = ''
241874e54fcbSBram Moolenaar      for c in 'aéc̀d'
241974e54fcbSBram Moolenaar        res ..= c .. '-'
242074e54fcbSBram Moolenaar      endfor
242174e54fcbSBram Moolenaar      assert_equal('a-é-c̀-d-', res)
242274e54fcbSBram Moolenaar
242374e54fcbSBram Moolenaar      res = ''
242474e54fcbSBram Moolenaar      for c in ''
242574e54fcbSBram Moolenaar        res ..= c .. '-'
242674e54fcbSBram Moolenaar      endfor
242774e54fcbSBram Moolenaar      assert_equal('', res)
242874e54fcbSBram Moolenaar
242974e54fcbSBram Moolenaar      res = ''
243074e54fcbSBram Moolenaar      for c in test_null_string()
243174e54fcbSBram Moolenaar        res ..= c .. '-'
243274e54fcbSBram Moolenaar      endfor
243374e54fcbSBram Moolenaar      assert_equal('', res)
2434f2253963SBram Moolenaar
2435f2253963SBram Moolenaar      var foo: list<dict<any>> = [
2436f2253963SBram Moolenaar              {a: 'Cat'}
2437f2253963SBram Moolenaar            ]
2438f2253963SBram Moolenaar      for dd in foo
2439f2253963SBram Moolenaar        dd.counter = 12
2440f2253963SBram Moolenaar      endfor
2441f2253963SBram Moolenaar      assert_equal([{a: 'Cat', counter: 12}], foo)
2442f2253963SBram Moolenaar  END
2443f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2444e8c4abbbSBram Moolenaarenddef
2445e8c4abbbSBram Moolenaar
2446e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2447025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2448025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2449025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2450675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2451675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2452cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2453822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
24542d870f8dSBram Moolenaar  delfunc! g:Func
2455675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2456675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2457675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
245874e54fcbSBram Moolenaar
245974e54fcbSBram Moolenaar  # wrong type detected at compile time
246074e54fcbSBram Moolenaar  CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
246174e54fcbSBram Moolenaar
246274e54fcbSBram Moolenaar  # wrong type detected at runtime
246374e54fcbSBram Moolenaar  g:adict = {a: 1}
246474e54fcbSBram Moolenaar  CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
246574e54fcbSBram Moolenaar  unlet g:adict
2466f6a8d420SBram Moolenaar
2467f6a8d420SBram Moolenaar  var lines =<< trim END
2468f6a8d420SBram Moolenaar      var d: list<dict<any>> = [{a: 0}]
2469f6a8d420SBram Moolenaar      for e in d
2470f6a8d420SBram Moolenaar        e = {a: 0, b: ''}
2471f6a8d420SBram Moolenaar      endfor
2472f6a8d420SBram Moolenaar  END
2473f6a8d420SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3)
2474fe090eb5SBram Moolenaar
2475fe090eb5SBram Moolenaar  lines =<< trim END
2476fe090eb5SBram Moolenaar      for nr: number in ['foo']
2477fe090eb5SBram Moolenaar      endfor
2478fe090eb5SBram Moolenaar  END
2479fe090eb5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2480e8c4abbbSBram Moolenaarenddef
2481e8c4abbbSBram Moolenaar
2482ea87069dSBram Moolenaardef Test_for_loop_script_var()
2483ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2484ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2485ea87069dSBram Moolenaar
2486ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2487ea87069dSBram Moolenaar  var lines =<< trim END
2488ea87069dSBram Moolenaar    vim9script
2489ea87069dSBram Moolenaar    var total = 0
2490ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2491ea87069dSBram Moolenaar      total += s:var
2492ea87069dSBram Moolenaar    endfor
2493ea87069dSBram Moolenaar    assert_equal(6, total)
2494ea87069dSBram Moolenaar
2495ea87069dSBram Moolenaar    total = 0
2496ea87069dSBram Moolenaar    for var in [1, 2, 3]
2497ea87069dSBram Moolenaar      total += var
2498ea87069dSBram Moolenaar    endfor
2499ea87069dSBram Moolenaar    assert_equal(6, total)
2500ea87069dSBram Moolenaar  END
2501ea87069dSBram Moolenaarenddef
2502ea87069dSBram Moolenaar
2503792f786aSBram Moolenaardef Test_for_loop_unpack()
25044b8a0651SBram Moolenaar  var lines =<< trim END
2505792f786aSBram Moolenaar      var result = []
2506792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2507792f786aSBram Moolenaar        result->add(v1)
2508792f786aSBram Moolenaar        result->add(v2)
2509792f786aSBram Moolenaar      endfor
2510792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2511792f786aSBram Moolenaar
2512792f786aSBram Moolenaar      result = []
2513792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2514792f786aSBram Moolenaar        result->add(v1)
2515792f786aSBram Moolenaar        result->add(v2)
2516792f786aSBram Moolenaar        result->add(v3)
2517792f786aSBram Moolenaar      endfor
2518792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2519792f786aSBram Moolenaar
25204b8a0651SBram Moolenaar      result = []
25214b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
25224b8a0651SBram Moolenaar        result->add(&ts)
25234b8a0651SBram Moolenaar        result->add(&sw)
25244b8a0651SBram Moolenaar      endfor
25254b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
25264b8a0651SBram Moolenaar
25274b8a0651SBram Moolenaar      var slist: list<string>
25284b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
25294b8a0651SBram Moolenaar        slist->add($LOOPVAR)
25304b8a0651SBram Moolenaar        slist->add(@r)
25314b8a0651SBram Moolenaar        slist->add(v:errmsg)
25324b8a0651SBram Moolenaar      endfor
25334b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
25344b8a0651SBram Moolenaar
25354b8a0651SBram Moolenaar      slist = []
25364b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
25374b8a0651SBram Moolenaar        slist->add(g:globalvar)
25384b8a0651SBram Moolenaar        slist->add(b:bufvar)
25394b8a0651SBram Moolenaar        slist->add(w:winvar)
25404b8a0651SBram Moolenaar        slist->add(t:tabvar)
25414b8a0651SBram Moolenaar      endfor
25424b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2543f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
2544b777da9bSBram Moolenaar
2545b777da9bSBram Moolenaar      var res = []
2546b777da9bSBram Moolenaar      for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2547b777da9bSBram Moolenaar        res->add(n)
2548b777da9bSBram Moolenaar      endfor
2549b777da9bSBram Moolenaar      assert_equal([2, 5], res)
25504b8a0651SBram Moolenaar  END
25514b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
25524b8a0651SBram Moolenaar
25534b8a0651SBram Moolenaar  lines =<< trim END
2554792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2555792f786aSBram Moolenaar        echo v1 v2
2556792f786aSBram Moolenaar      endfor
2557792f786aSBram Moolenaar  END
2558792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2559792f786aSBram Moolenaar
2560792f786aSBram Moolenaar  lines =<< trim END
2561792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2562792f786aSBram Moolenaar        echo v1 v2
2563792f786aSBram Moolenaar      endfor
2564792f786aSBram Moolenaar  END
2565792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2566792f786aSBram Moolenaar
2567792f786aSBram Moolenaar  lines =<< trim END
2568792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2569792f786aSBram Moolenaar        echo v1
2570792f786aSBram Moolenaar      endfor
2571792f786aSBram Moolenaar  END
2572792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2573792f786aSBram Moolenaarenddef
2574792f786aSBram Moolenaar
2575c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2576f2253963SBram Moolenaar  var lines =<< trim END
2577c150c09eSBram Moolenaar      var looped = 0
2578c150c09eSBram Moolenaar      var cleanup = 0
2579c150c09eSBram Moolenaar      for i in range(3)
2580c150c09eSBram Moolenaar        looped += 1
2581c150c09eSBram Moolenaar        try
2582c150c09eSBram Moolenaar          eval [][0]
2583c150c09eSBram Moolenaar        catch
2584c150c09eSBram Moolenaar          continue
2585c150c09eSBram Moolenaar        finally
2586c150c09eSBram Moolenaar          cleanup += 1
2587c150c09eSBram Moolenaar        endtry
2588c150c09eSBram Moolenaar      endfor
2589c150c09eSBram Moolenaar      assert_equal(3, looped)
2590c150c09eSBram Moolenaar      assert_equal(3, cleanup)
2591f2253963SBram Moolenaar  END
2592f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2593c150c09eSBram Moolenaarenddef
2594c150c09eSBram Moolenaar
2595d0df1aacSBram Moolenaardef Test_while_loop()
2596cfcd011fSBram Moolenaar  var result = ''
2597cfcd011fSBram Moolenaar  var cnt = 0
2598d0df1aacSBram Moolenaar  while cnt < 555
2599d0df1aacSBram Moolenaar    if cnt == 3
2600d0df1aacSBram Moolenaar      break
2601d0df1aacSBram Moolenaar    endif
2602d0df1aacSBram Moolenaar    cnt += 1
2603d0df1aacSBram Moolenaar    if cnt == 2
2604d0df1aacSBram Moolenaar      continue
2605d0df1aacSBram Moolenaar    endif
2606d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2607d0df1aacSBram Moolenaar  endwhile
2608d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2609dee37dc7SBram Moolenaar
2610dee37dc7SBram Moolenaar  var s = ''
26110123cc1eSBram Moolenaar  while s == 'x' # {comment}
2612dee37dc7SBram Moolenaar  endwhile
2613d0df1aacSBram Moolenaarenddef
2614d0df1aacSBram Moolenaar
2615e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2616675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2617675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2618675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2619675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2620675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2621675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2622675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
26236628b7ebSBram Moolenaar
26246628b7ebSBram Moolenaar  var lines =<< trim END
26256628b7ebSBram Moolenaar      var s = ''
26266628b7ebSBram Moolenaar      while s = ''
26276628b7ebSBram Moolenaar      endwhile
26286628b7ebSBram Moolenaar  END
26296628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2630bd5da371SBram Moolenaarenddef
2631bd5da371SBram Moolenaar
26329645e2d9SBram Moolenaardef Test_interrupt_loop()
2633cfcd011fSBram Moolenaar  var caught = false
2634cfcd011fSBram Moolenaar  var x = 0
263597acfc78SBram Moolenaar  try
26369645e2d9SBram Moolenaar    while 1
26379645e2d9SBram Moolenaar      x += 1
26389645e2d9SBram Moolenaar      if x == 100
26399645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
26409645e2d9SBram Moolenaar      endif
26419645e2d9SBram Moolenaar    endwhile
264297acfc78SBram Moolenaar  catch
264397acfc78SBram Moolenaar    caught = true
264497acfc78SBram Moolenaar    assert_equal(100, x)
264597acfc78SBram Moolenaar  endtry
264697acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
264725859dd7SBram Moolenaar  # consume the CTRL-C
264825859dd7SBram Moolenaar  getchar(0)
26499645e2d9SBram Moolenaarenddef
265020431c9dSBram Moolenaar
26514fdae999SBram Moolenaardef Test_automatic_line_continuation()
2652cfcd011fSBram Moolenaar  var mylist = [
26534fdae999SBram Moolenaar      'one',
26544fdae999SBram Moolenaar      'two',
26554fdae999SBram Moolenaar      'three',
2656f5be8cdbSBram Moolenaar      ] # comment
26574fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
26584fdae999SBram Moolenaar
2659cfcd011fSBram Moolenaar  var mydict = {
2660e0de171eSBram Moolenaar      ['one']: 1,
2661e0de171eSBram Moolenaar      ['two']: 2,
2662e0de171eSBram Moolenaar      ['three']:
26634fdae999SBram Moolenaar          3,
2664f5be8cdbSBram Moolenaar      } # comment
2665e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2666e0de171eSBram Moolenaar  mydict = {
26672c330432SBram Moolenaar      one: 1,  # comment
26682c330432SBram Moolenaar      two:     # comment
26692c330432SBram Moolenaar           2,  # comment
26702c330432SBram Moolenaar      three: 3 # comment
26712c330432SBram Moolenaar      }
2672e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2673e0de171eSBram Moolenaar  mydict = {
26742c330432SBram Moolenaar      one: 1,
26754fdae999SBram Moolenaar      two:
26764fdae999SBram Moolenaar           2,
26772c330432SBram Moolenaar      three: 3
26784fdae999SBram Moolenaar      }
2679e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2680e6085c53SBram Moolenaar
2681e6085c53SBram Moolenaar  assert_equal(
2682e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2683e6085c53SBram Moolenaar        split('one two three')
2684e6085c53SBram Moolenaar        )
26854fdae999SBram Moolenaarenddef
26864fdae999SBram Moolenaar
26877a092245SBram Moolenaardef Test_vim9_comment()
26887a092245SBram Moolenaar  CheckScriptSuccess([
26897a092245SBram Moolenaar      'vim9script',
26907a092245SBram Moolenaar      '# something',
269193f82cbeSBram Moolenaar      '#something',
269293f82cbeSBram Moolenaar      '#{something',
26937a092245SBram Moolenaar      ])
269493f82cbeSBram Moolenaar
269593f82cbeSBram Moolenaar  split Xfile
269693f82cbeSBram Moolenaar  CheckScriptSuccess([
269793f82cbeSBram Moolenaar      'vim9script',
269893f82cbeSBram Moolenaar      'edit #something',
269993f82cbeSBram Moolenaar      ])
270093f82cbeSBram Moolenaar  CheckScriptSuccess([
270193f82cbeSBram Moolenaar      'vim9script',
270293f82cbeSBram Moolenaar      'edit #{something',
270393f82cbeSBram Moolenaar      ])
270493f82cbeSBram Moolenaar  close
270593f82cbeSBram Moolenaar
27067a092245SBram Moolenaar  CheckScriptFailure([
27077a092245SBram Moolenaar      'vim9script',
27087a092245SBram Moolenaar      ':# something',
27097a092245SBram Moolenaar      ], 'E488:')
27107a092245SBram Moolenaar  CheckScriptFailure([
27117a092245SBram Moolenaar      '# something',
27127a092245SBram Moolenaar      ], 'E488:')
27137a092245SBram Moolenaar  CheckScriptFailure([
27147a092245SBram Moolenaar      ':# something',
27157a092245SBram Moolenaar      ], 'E488:')
27167a092245SBram Moolenaar
27174a8d9f2eSBram Moolenaar  { # block start
27184a8d9f2eSBram Moolenaar  } # block end
27194a8d9f2eSBram Moolenaar  CheckDefFailure([
27204a8d9f2eSBram Moolenaar      '{# comment',
27214a8d9f2eSBram Moolenaar      ], 'E488:')
27224a8d9f2eSBram Moolenaar  CheckDefFailure([
27234a8d9f2eSBram Moolenaar      '{',
27244a8d9f2eSBram Moolenaar      '}# comment',
27254a8d9f2eSBram Moolenaar      ], 'E488:')
27264a8d9f2eSBram Moolenaar
27274a8d9f2eSBram Moolenaar  echo "yes" # comment
27284a8d9f2eSBram Moolenaar  CheckDefFailure([
27294a8d9f2eSBram Moolenaar      'echo "yes"# comment',
27304a8d9f2eSBram Moolenaar      ], 'E488:')
27317a092245SBram Moolenaar  CheckScriptSuccess([
27327a092245SBram Moolenaar      'vim9script',
27337a092245SBram Moolenaar      'echo "yes" # something',
27347a092245SBram Moolenaar      ])
27357a092245SBram Moolenaar  CheckScriptFailure([
27367a092245SBram Moolenaar      'vim9script',
27377a092245SBram Moolenaar      'echo "yes"# something',
27387a092245SBram Moolenaar      ], 'E121:')
27397a092245SBram Moolenaar  CheckScriptFailure([
27407a092245SBram Moolenaar      'vim9script',
27417a092245SBram Moolenaar      'echo# something',
2742f8103f27SBram Moolenaar      ], 'E1144:')
27437a092245SBram Moolenaar  CheckScriptFailure([
27447a092245SBram Moolenaar      'echo "yes" # something',
27457a092245SBram Moolenaar      ], 'E121:')
27467a092245SBram Moolenaar
27474a8d9f2eSBram Moolenaar  exe "echo" # comment
27484a8d9f2eSBram Moolenaar  CheckDefFailure([
27494a8d9f2eSBram Moolenaar      'exe "echo"# comment',
27504a8d9f2eSBram Moolenaar      ], 'E488:')
27514a8d9f2eSBram Moolenaar  CheckScriptSuccess([
27524a8d9f2eSBram Moolenaar      'vim9script',
27534a8d9f2eSBram Moolenaar      'exe "echo" # something',
27544a8d9f2eSBram Moolenaar      ])
27554a8d9f2eSBram Moolenaar  CheckScriptFailure([
27564a8d9f2eSBram Moolenaar      'vim9script',
27574a8d9f2eSBram Moolenaar      'exe "echo"# something',
27584a8d9f2eSBram Moolenaar      ], 'E121:')
27594a8d9f2eSBram Moolenaar  CheckScriptFailure([
27604a8d9f2eSBram Moolenaar      'vim9script',
27614a8d9f2eSBram Moolenaar      'exe# something',
2762f8103f27SBram Moolenaar      ], 'E1144:')
27634a8d9f2eSBram Moolenaar  CheckScriptFailure([
27644a8d9f2eSBram Moolenaar      'exe "echo" # something',
27654a8d9f2eSBram Moolenaar      ], 'E121:')
27664a8d9f2eSBram Moolenaar
27677a092245SBram Moolenaar  CheckDefFailure([
27687a092245SBram Moolenaar      'try# comment',
27697a092245SBram Moolenaar      '  echo "yes"',
27707a092245SBram Moolenaar      'catch',
27717a092245SBram Moolenaar      'endtry',
2772f8103f27SBram Moolenaar      ], 'E1144:')
27732c5ed4e3SBram Moolenaar  CheckScriptFailure([
27742c5ed4e3SBram Moolenaar      'vim9script',
27752c5ed4e3SBram Moolenaar      'try# comment',
27762c5ed4e3SBram Moolenaar      'echo "yes"',
2777f8103f27SBram Moolenaar      ], 'E1144:')
27787a092245SBram Moolenaar  CheckDefFailure([
27797a092245SBram Moolenaar      'try',
2780a72cfb80SBram Moolenaar      '  throw#comment',
2781a72cfb80SBram Moolenaar      'catch',
2782a72cfb80SBram Moolenaar      'endtry',
2783f8103f27SBram Moolenaar      ], 'E1144:')
2784a72cfb80SBram Moolenaar  CheckDefFailure([
2785a72cfb80SBram Moolenaar      'try',
2786a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2787a72cfb80SBram Moolenaar      'catch',
2788a72cfb80SBram Moolenaar      'endtry',
2789a72cfb80SBram Moolenaar      ], 'E488:')
2790a72cfb80SBram Moolenaar  CheckDefFailure([
2791a72cfb80SBram Moolenaar      'try',
27927a092245SBram Moolenaar      '  echo "yes"',
27937a092245SBram Moolenaar      'catch# comment',
27947a092245SBram Moolenaar      'endtry',
2795f8103f27SBram Moolenaar      ], 'E1144:')
27962c5ed4e3SBram Moolenaar  CheckScriptFailure([
27972c5ed4e3SBram Moolenaar      'vim9script',
27982c5ed4e3SBram Moolenaar      'try',
27992c5ed4e3SBram Moolenaar      '  echo "yes"',
28002c5ed4e3SBram Moolenaar      'catch# comment',
28012c5ed4e3SBram Moolenaar      'endtry',
2802f8103f27SBram Moolenaar      ], 'E1144:')
28032c5ed4e3SBram Moolenaar  CheckDefFailure([
28042c5ed4e3SBram Moolenaar      'try',
28052c5ed4e3SBram Moolenaar      '  echo "yes"',
28062c5ed4e3SBram Moolenaar      'catch /pat/# comment',
28072c5ed4e3SBram Moolenaar      'endtry',
28082c5ed4e3SBram Moolenaar      ], 'E488:')
28097a092245SBram Moolenaar  CheckDefFailure([
28107a092245SBram Moolenaar      'try',
28117a092245SBram Moolenaar      'echo "yes"',
28127a092245SBram Moolenaar      'catch',
28137a092245SBram Moolenaar      'endtry# comment',
2814f8103f27SBram Moolenaar      ], 'E1144:')
28152c5ed4e3SBram Moolenaar  CheckScriptFailure([
28162c5ed4e3SBram Moolenaar      'vim9script',
28172c5ed4e3SBram Moolenaar      'try',
28182c5ed4e3SBram Moolenaar      '  echo "yes"',
28192c5ed4e3SBram Moolenaar      'catch',
28202c5ed4e3SBram Moolenaar      'endtry# comment',
2821f8103f27SBram Moolenaar      ], 'E1144:')
28222c5ed4e3SBram Moolenaar
28232c5ed4e3SBram Moolenaar  CheckScriptSuccess([
28242c5ed4e3SBram Moolenaar      'vim9script',
28252c5ed4e3SBram Moolenaar      'hi # comment',
28262c5ed4e3SBram Moolenaar      ])
28272c5ed4e3SBram Moolenaar  CheckScriptFailure([
28282c5ed4e3SBram Moolenaar      'vim9script',
28292c5ed4e3SBram Moolenaar      'hi# comment',
2830f8103f27SBram Moolenaar      ], 'E1144:')
28311966c248SBram Moolenaar  CheckScriptSuccess([
28321966c248SBram Moolenaar      'vim9script',
28331966c248SBram Moolenaar      'hi Search # comment',
28341966c248SBram Moolenaar      ])
28351966c248SBram Moolenaar  CheckScriptFailure([
28361966c248SBram Moolenaar      'vim9script',
28371966c248SBram Moolenaar      'hi Search# comment',
28381966c248SBram Moolenaar      ], 'E416:')
28391966c248SBram Moolenaar  CheckScriptSuccess([
28401966c248SBram Moolenaar      'vim9script',
28411966c248SBram Moolenaar      'hi link This Search # comment',
28421966c248SBram Moolenaar      ])
28431966c248SBram Moolenaar  CheckScriptFailure([
28441966c248SBram Moolenaar      'vim9script',
28451966c248SBram Moolenaar      'hi link This That# comment',
28461966c248SBram Moolenaar      ], 'E413:')
28471966c248SBram Moolenaar  CheckScriptSuccess([
28481966c248SBram Moolenaar      'vim9script',
28491966c248SBram Moolenaar      'hi clear This # comment',
28501966c248SBram Moolenaar      'hi clear # comment',
28511966c248SBram Moolenaar      ])
2852f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2853f5be8cdbSBram Moolenaar  # hi clear This# comment',
28541966c248SBram Moolenaar  CheckScriptFailure([
28551966c248SBram Moolenaar      'vim9script',
28561966c248SBram Moolenaar      'hi clear# comment',
28571966c248SBram Moolenaar      ], 'E416:')
28581966c248SBram Moolenaar
28591966c248SBram Moolenaar  CheckScriptSuccess([
28601966c248SBram Moolenaar      'vim9script',
28611966c248SBram Moolenaar      'hi Group term=bold',
28621966c248SBram Moolenaar      'match Group /todo/ # comment',
28631966c248SBram Moolenaar      ])
28641966c248SBram Moolenaar  CheckScriptFailure([
28651966c248SBram Moolenaar      'vim9script',
28661966c248SBram Moolenaar      'hi Group term=bold',
28671966c248SBram Moolenaar      'match Group /todo/# comment',
28681966c248SBram Moolenaar      ], 'E488:')
28691966c248SBram Moolenaar  CheckScriptSuccess([
28701966c248SBram Moolenaar      'vim9script',
28711966c248SBram Moolenaar      'match # comment',
28721966c248SBram Moolenaar      ])
28731966c248SBram Moolenaar  CheckScriptFailure([
28741966c248SBram Moolenaar      'vim9script',
28751966c248SBram Moolenaar      'match# comment',
2876f8103f27SBram Moolenaar      ], 'E1144:')
28771966c248SBram Moolenaar  CheckScriptSuccess([
28781966c248SBram Moolenaar      'vim9script',
28791966c248SBram Moolenaar      'match none # comment',
28801966c248SBram Moolenaar      ])
28811966c248SBram Moolenaar  CheckScriptFailure([
28821966c248SBram Moolenaar      'vim9script',
28831966c248SBram Moolenaar      'match none# comment',
28841966c248SBram Moolenaar      ], 'E475:')
28851966c248SBram Moolenaar
28861966c248SBram Moolenaar  CheckScriptSuccess([
28871966c248SBram Moolenaar      'vim9script',
28881966c248SBram Moolenaar      'menutrans clear # comment',
28891966c248SBram Moolenaar      ])
28901966c248SBram Moolenaar  CheckScriptFailure([
28911966c248SBram Moolenaar      'vim9script',
28921966c248SBram Moolenaar      'menutrans clear# comment text',
28931966c248SBram Moolenaar      ], 'E474:')
28941966c248SBram Moolenaar
28951966c248SBram Moolenaar  CheckScriptSuccess([
28961966c248SBram Moolenaar      'vim9script',
28971966c248SBram Moolenaar      'syntax clear # comment',
28981966c248SBram Moolenaar      ])
28991966c248SBram Moolenaar  CheckScriptFailure([
29001966c248SBram Moolenaar      'vim9script',
29011966c248SBram Moolenaar      'syntax clear# comment text',
29021966c248SBram Moolenaar      ], 'E28:')
29031966c248SBram Moolenaar  CheckScriptSuccess([
29041966c248SBram Moolenaar      'vim9script',
29051966c248SBram Moolenaar      'syntax keyword Word some',
29061966c248SBram Moolenaar      'syntax clear Word # comment',
29071966c248SBram Moolenaar      ])
29081966c248SBram Moolenaar  CheckScriptFailure([
29091966c248SBram Moolenaar      'vim9script',
29101966c248SBram Moolenaar      'syntax keyword Word some',
29111966c248SBram Moolenaar      'syntax clear Word# comment text',
29121966c248SBram Moolenaar      ], 'E28:')
29131966c248SBram Moolenaar
29141966c248SBram Moolenaar  CheckScriptSuccess([
29151966c248SBram Moolenaar      'vim9script',
29161966c248SBram Moolenaar      'syntax list # comment',
29171966c248SBram Moolenaar      ])
29181966c248SBram Moolenaar  CheckScriptFailure([
29191966c248SBram Moolenaar      'vim9script',
29201966c248SBram Moolenaar      'syntax list# comment text',
29211966c248SBram Moolenaar      ], 'E28:')
29221966c248SBram Moolenaar
29231966c248SBram Moolenaar  CheckScriptSuccess([
29241966c248SBram Moolenaar      'vim9script',
29251966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
29261966c248SBram Moolenaar      ])
29271966c248SBram Moolenaar  CheckScriptFailure([
29281966c248SBram Moolenaar      'vim9script',
29291966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
29301966c248SBram Moolenaar      ], 'E475:')
29311966c248SBram Moolenaar
29321966c248SBram Moolenaar  CheckScriptSuccess([
29331966c248SBram Moolenaar      'vim9script',
29341966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
29351966c248SBram Moolenaar      ])
29361966c248SBram Moolenaar  CheckScriptFailure([
29371966c248SBram Moolenaar      'vim9script',
29381966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
29391966c248SBram Moolenaar      ], 'E789:')
29401966c248SBram Moolenaar
29411966c248SBram Moolenaar  CheckScriptSuccess([
29421966c248SBram Moolenaar      'vim9script',
29431966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
29441966c248SBram Moolenaar      ])
29451966c248SBram Moolenaar  CheckScriptFailure([
29461966c248SBram Moolenaar      'vim9script',
29471966c248SBram Moolenaar      'syntax match Word /pat/# comment',
29481966c248SBram Moolenaar      ], 'E402:')
29491966c248SBram Moolenaar
29501966c248SBram Moolenaar  CheckScriptSuccess([
29511966c248SBram Moolenaar      'vim9script',
29521966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
29531966c248SBram Moolenaar      ])
29541966c248SBram Moolenaar  CheckScriptFailure([
29551966c248SBram Moolenaar      'vim9script',
29561966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
29571966c248SBram Moolenaar      ], 'E475:')
29581966c248SBram Moolenaar  CheckScriptFailure([
29591966c248SBram Moolenaar      'vim9script',
29601966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
29611966c248SBram Moolenaar      ], 'E406:')
29621966c248SBram Moolenaar  CheckScriptFailure([
29631966c248SBram Moolenaar      'vim9script',
29641966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
29651966c248SBram Moolenaar      ], 'E475:')
29661966c248SBram Moolenaar
29671966c248SBram Moolenaar  CheckScriptSuccess([
29681966c248SBram Moolenaar      'vim9script',
29691966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
29701966c248SBram Moolenaar      ])
29711966c248SBram Moolenaar  CheckScriptFailure([
29721966c248SBram Moolenaar      'vim9script',
29731966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2974d032f34aSBram Moolenaar      ], 'E402:')
29751966c248SBram Moolenaar
29761966c248SBram Moolenaar  CheckScriptSuccess([
29771966c248SBram Moolenaar      'vim9script',
29781966c248SBram Moolenaar      'syntax sync # comment',
29791966c248SBram Moolenaar      ])
29801966c248SBram Moolenaar  CheckScriptFailure([
29811966c248SBram Moolenaar      'vim9script',
29821966c248SBram Moolenaar      'syntax sync# comment',
29831966c248SBram Moolenaar      ], 'E404:')
29841966c248SBram Moolenaar  CheckScriptSuccess([
29851966c248SBram Moolenaar      'vim9script',
29861966c248SBram Moolenaar      'syntax sync ccomment # comment',
29871966c248SBram Moolenaar      ])
29881966c248SBram Moolenaar  CheckScriptFailure([
29891966c248SBram Moolenaar      'vim9script',
29901966c248SBram Moolenaar      'syntax sync ccomment# comment',
29911966c248SBram Moolenaar      ], 'E404:')
29921966c248SBram Moolenaar
29931966c248SBram Moolenaar  CheckScriptSuccess([
29941966c248SBram Moolenaar      'vim9script',
29951966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
29961966c248SBram Moolenaar      ])
29971966c248SBram Moolenaar  CheckScriptFailure([
29981966c248SBram Moolenaar      'vim9script',
29991966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
30001966c248SBram Moolenaar      ], 'E475:')
3001a72cfb80SBram Moolenaar
3002a72cfb80SBram Moolenaar  CheckScriptSuccess([
3003a72cfb80SBram Moolenaar      'vim9script',
3004a72cfb80SBram Moolenaar      'command Echo echo # comment',
3005a72cfb80SBram Moolenaar      'command Echo # comment',
30062d870f8dSBram Moolenaar      'delcommand Echo',
3007a72cfb80SBram Moolenaar      ])
3008a72cfb80SBram Moolenaar  CheckScriptFailure([
3009a72cfb80SBram Moolenaar      'vim9script',
3010a72cfb80SBram Moolenaar      'command Echo echo# comment',
3011a72cfb80SBram Moolenaar      'Echo',
3012f8103f27SBram Moolenaar      ], 'E1144:')
30132d870f8dSBram Moolenaar  delcommand Echo
301470249ee8SBram Moolenaar
301570249ee8SBram Moolenaar  var curdir = getcwd()
301670249ee8SBram Moolenaar  CheckScriptSuccess([
301770249ee8SBram Moolenaar      'command Echo cd " comment',
301870249ee8SBram Moolenaar      'Echo',
301970249ee8SBram Moolenaar      'delcommand Echo',
302070249ee8SBram Moolenaar      ])
302170249ee8SBram Moolenaar  CheckScriptSuccess([
3022090728adSBram Moolenaar      'vim9script',
302370249ee8SBram Moolenaar      'command Echo cd # comment',
302470249ee8SBram Moolenaar      'Echo',
302570249ee8SBram Moolenaar      'delcommand Echo',
302670249ee8SBram Moolenaar      ])
302770249ee8SBram Moolenaar  CheckScriptFailure([
302870249ee8SBram Moolenaar      'vim9script',
302970249ee8SBram Moolenaar      'command Echo cd " comment',
303070249ee8SBram Moolenaar      'Echo',
303170249ee8SBram Moolenaar      ], 'E344:')
303270249ee8SBram Moolenaar  delcommand Echo
303370249ee8SBram Moolenaar  chdir(curdir)
303470249ee8SBram Moolenaar
3035a72cfb80SBram Moolenaar  CheckScriptFailure([
3036a72cfb80SBram Moolenaar      'vim9script',
3037a72cfb80SBram Moolenaar      'command Echo# comment',
3038a72cfb80SBram Moolenaar      ], 'E182:')
3039a72cfb80SBram Moolenaar  CheckScriptFailure([
3040a72cfb80SBram Moolenaar      'vim9script',
3041a72cfb80SBram Moolenaar      'command Echo echo',
3042a72cfb80SBram Moolenaar      'command Echo# comment',
3043a72cfb80SBram Moolenaar      ], 'E182:')
30442d870f8dSBram Moolenaar  delcommand Echo
3045a72cfb80SBram Moolenaar
3046a72cfb80SBram Moolenaar  CheckScriptSuccess([
3047a72cfb80SBram Moolenaar      'vim9script',
3048a72cfb80SBram Moolenaar      'function # comment',
3049a72cfb80SBram Moolenaar      ])
3050a72cfb80SBram Moolenaar  CheckScriptFailure([
3051a72cfb80SBram Moolenaar      'vim9script',
30529898107fSBram Moolenaar      'function " comment',
30539898107fSBram Moolenaar      ], 'E129:')
30549898107fSBram Moolenaar  CheckScriptFailure([
30559898107fSBram Moolenaar      'vim9script',
3056a72cfb80SBram Moolenaar      'function# comment',
3057f8103f27SBram Moolenaar      ], 'E1144:')
3058a72cfb80SBram Moolenaar  CheckScriptSuccess([
3059a72cfb80SBram Moolenaar      'vim9script',
3060a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
3061a72cfb80SBram Moolenaar      ])
3062a72cfb80SBram Moolenaar  CheckScriptFailure([
3063a72cfb80SBram Moolenaar      'vim9script',
3064a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
3065a72cfb80SBram Moolenaar      ], 'E488:')
3066a72cfb80SBram Moolenaar
3067a72cfb80SBram Moolenaar  CheckScriptSuccess([
3068a72cfb80SBram Moolenaar      'vim9script',
30694c17ad94SBram Moolenaar      'func g:DeleteMeA()',
3070a72cfb80SBram Moolenaar      'endfunc',
30714c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
3072a72cfb80SBram Moolenaar      ])
3073a72cfb80SBram Moolenaar  CheckScriptFailure([
3074a72cfb80SBram Moolenaar      'vim9script',
30754c17ad94SBram Moolenaar      'func g:DeleteMeB()',
3076a72cfb80SBram Moolenaar      'endfunc',
30774c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
3078a72cfb80SBram Moolenaar      ], 'E488:')
3079a72cfb80SBram Moolenaar
3080a72cfb80SBram Moolenaar  CheckScriptSuccess([
3081a72cfb80SBram Moolenaar      'vim9script',
3082a72cfb80SBram Moolenaar      'call execute("ls") # comment',
3083a72cfb80SBram Moolenaar      ])
3084a72cfb80SBram Moolenaar  CheckScriptFailure([
3085a72cfb80SBram Moolenaar      'vim9script',
3086a72cfb80SBram Moolenaar      'call execute("ls")# comment',
3087a72cfb80SBram Moolenaar      ], 'E488:')
3088e7e4838fSBram Moolenaar
3089e7e4838fSBram Moolenaar  CheckScriptFailure([
3090e7e4838fSBram Moolenaar      'def Test() " comment',
3091e7e4838fSBram Moolenaar      'enddef',
3092e7e4838fSBram Moolenaar      ], 'E488:')
3093e7e4838fSBram Moolenaar  CheckScriptFailure([
3094e7e4838fSBram Moolenaar      'vim9script',
3095e7e4838fSBram Moolenaar      'def Test() " comment',
3096e7e4838fSBram Moolenaar      'enddef',
3097e7e4838fSBram Moolenaar      ], 'E488:')
3098e7e4838fSBram Moolenaar
3099e7e4838fSBram Moolenaar  CheckScriptSuccess([
3100e7e4838fSBram Moolenaar      'func Test() " comment',
3101e7e4838fSBram Moolenaar      'endfunc',
31022d870f8dSBram Moolenaar      'delfunc Test',
3103e7e4838fSBram Moolenaar      ])
31049898107fSBram Moolenaar  CheckScriptSuccess([
3105e7e4838fSBram Moolenaar      'vim9script',
3106e7e4838fSBram Moolenaar      'func Test() " comment',
3107e7e4838fSBram Moolenaar      'endfunc',
31089898107fSBram Moolenaar      ])
3109e7e4838fSBram Moolenaar
3110e7e4838fSBram Moolenaar  CheckScriptSuccess([
3111e7e4838fSBram Moolenaar      'def Test() # comment',
3112e7e4838fSBram Moolenaar      'enddef',
3113e7e4838fSBram Moolenaar      ])
3114e7e4838fSBram Moolenaar  CheckScriptFailure([
3115e7e4838fSBram Moolenaar      'func Test() # comment',
3116e7e4838fSBram Moolenaar      'endfunc',
3117e7e4838fSBram Moolenaar      ], 'E488:')
31180f37e356SBram Moolenaar
31190f37e356SBram Moolenaar  var lines =<< trim END
31200f37e356SBram Moolenaar      vim9script
31210f37e356SBram Moolenaar      syn region Text
31220f37e356SBram Moolenaar      \ start='foo'
31230f37e356SBram Moolenaar      #\ comment
31240f37e356SBram Moolenaar      \ end='bar'
31255072b47aSBram Moolenaar      syn region Text start='foo'
31265072b47aSBram Moolenaar      #\ comment
31275072b47aSBram Moolenaar      \ end='bar'
31280f37e356SBram Moolenaar  END
31290f37e356SBram Moolenaar  CheckScriptSuccess(lines)
31300f37e356SBram Moolenaar
31310f37e356SBram Moolenaar  lines =<< trim END
31320f37e356SBram Moolenaar      vim9script
31330f37e356SBram Moolenaar      syn region Text
31340f37e356SBram Moolenaar      \ start='foo'
31350f37e356SBram Moolenaar      "\ comment
31360f37e356SBram Moolenaar      \ end='bar'
31370f37e356SBram Moolenaar  END
31380f37e356SBram Moolenaar  CheckScriptFailure(lines, 'E399:')
31392c5ed4e3SBram Moolenaarenddef
31402c5ed4e3SBram Moolenaar
31412c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
31422c5ed4e3SBram Moolenaar  CheckCanRunGui
31432c5ed4e3SBram Moolenaar
31442c5ed4e3SBram Moolenaar  CheckScriptFailure([
31452c5ed4e3SBram Moolenaar      'vim9script',
31462c5ed4e3SBram Moolenaar      'gui#comment'
3147f8103f27SBram Moolenaar      ], 'E1144:')
31482c5ed4e3SBram Moolenaar  CheckScriptFailure([
31492c5ed4e3SBram Moolenaar      'vim9script',
31502c5ed4e3SBram Moolenaar      'gui -f#comment'
31512c5ed4e3SBram Moolenaar      ], 'E499:')
31527a092245SBram Moolenaarenddef
31537a092245SBram Moolenaar
3154a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
31556797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
31566797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3157a26b9700SBram Moolenaar
3158a26b9700SBram Moolenaar  edit test.vim
3159a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3160a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3161a26b9700SBram Moolenaar
3162a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3163a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3164a26b9700SBram Moolenaar
3165a26b9700SBram Moolenaar  g:entered = 0
3166a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3167a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3168a26b9700SBram Moolenaar
3169a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3170a26b9700SBram Moolenaar
3171a26b9700SBram Moolenaar  au! TabEnter
3172a26b9700SBram Moolenaar  unlet g:entered
3173d72c1bf0SBram Moolenaar
3174d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3175d72c1bf0SBram Moolenaar      'vim9script',
31766797966dSBram Moolenaar      'g:var = 123',
3177e55b1c09SBram Moolenaar      'b:var = 456',
3178e55b1c09SBram Moolenaar      'w:var = 777',
3179e55b1c09SBram Moolenaar      't:var = 888',
3180d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3181d72c1bf0SBram Moolenaar      ])
3182d72c1bf0SBram Moolenaar
3183d72c1bf0SBram Moolenaar  CheckScriptFailure([
3184d72c1bf0SBram Moolenaar      'vim9script',
3185cfcd011fSBram Moolenaar      'let var = 123',
3186cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3187cfcd011fSBram Moolenaar
3188cfcd011fSBram Moolenaar  CheckScriptFailure([
3189cfcd011fSBram Moolenaar      'vim9script',
3190cfcd011fSBram Moolenaar      'var g:var = 123',
3191e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3192e55b1c09SBram Moolenaar
3193e55b1c09SBram Moolenaar  CheckScriptFailure([
3194e55b1c09SBram Moolenaar      'vim9script',
3195cfcd011fSBram Moolenaar      'var b:var = 123',
3196e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3197e55b1c09SBram Moolenaar
3198e55b1c09SBram Moolenaar  CheckScriptFailure([
3199e55b1c09SBram Moolenaar      'vim9script',
3200cfcd011fSBram Moolenaar      'var w:var = 123',
3201e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3202e55b1c09SBram Moolenaar
3203e55b1c09SBram Moolenaar  CheckScriptFailure([
3204e55b1c09SBram Moolenaar      'vim9script',
3205cfcd011fSBram Moolenaar      'var t:var = 123',
3206e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3207e55b1c09SBram Moolenaar
3208e55b1c09SBram Moolenaar  CheckScriptFailure([
3209e55b1c09SBram Moolenaar      'vim9script',
3210cfcd011fSBram Moolenaar      'var v:version = 123',
3211e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3212e55b1c09SBram Moolenaar
3213e55b1c09SBram Moolenaar  CheckScriptFailure([
3214e55b1c09SBram Moolenaar      'vim9script',
3215cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3216e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
32176797966dSBram Moolenaar
32186797966dSBram Moolenaar  CheckScriptFailure([
32196797966dSBram Moolenaar      'vim9script',
32206797966dSBram Moolenaar      'g:var = 123',
322132e35117SBram Moolenaar      'unlet g:var# comment1',
3222d72c1bf0SBram Moolenaar      ], 'E108:')
3223d72c1bf0SBram Moolenaar
3224d72c1bf0SBram Moolenaar  CheckScriptFailure([
3225d72c1bf0SBram Moolenaar      'let g:var = 123',
3226d72c1bf0SBram Moolenaar      'unlet g:var # something',
3227d72c1bf0SBram Moolenaar      ], 'E488:')
3228faac4104SBram Moolenaar
3229faac4104SBram Moolenaar  CheckScriptSuccess([
3230faac4104SBram Moolenaar      'vim9script',
323132e35117SBram Moolenaar      'if 1 # comment2',
3232faac4104SBram Moolenaar      '  echo "yes"',
3233faac4104SBram Moolenaar      'elseif 2 #comment',
3234faac4104SBram Moolenaar      '  echo "no"',
3235faac4104SBram Moolenaar      'endif',
3236faac4104SBram Moolenaar      ])
3237faac4104SBram Moolenaar
3238faac4104SBram Moolenaar  CheckScriptFailure([
3239faac4104SBram Moolenaar      'vim9script',
324032e35117SBram Moolenaar      'if 1# comment3',
3241faac4104SBram Moolenaar      '  echo "yes"',
3242faac4104SBram Moolenaar      'endif',
3243fae55a9cSBram Moolenaar      ], 'E488:')
3244faac4104SBram Moolenaar
3245faac4104SBram Moolenaar  CheckScriptFailure([
3246faac4104SBram Moolenaar      'vim9script',
324732e35117SBram Moolenaar      'if 0 # comment4',
3248faac4104SBram Moolenaar      '  echo "yes"',
3249faac4104SBram Moolenaar      'elseif 2#comment',
3250faac4104SBram Moolenaar      '  echo "no"',
3251faac4104SBram Moolenaar      'endif',
3252fae55a9cSBram Moolenaar      ], 'E488:')
3253faac4104SBram Moolenaar
3254faac4104SBram Moolenaar  CheckScriptSuccess([
3255faac4104SBram Moolenaar      'vim9script',
3256cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3257faac4104SBram Moolenaar      ])
3258faac4104SBram Moolenaar
3259faac4104SBram Moolenaar  CheckScriptFailure([
3260faac4104SBram Moolenaar      'vim9script',
3261cfcd011fSBram Moolenaar      'var v = 1# comment6',
3262fae55a9cSBram Moolenaar      ], 'E488:')
3263faac4104SBram Moolenaar
3264faac4104SBram Moolenaar  CheckScriptSuccess([
3265faac4104SBram Moolenaar      'vim9script',
3266faac4104SBram Moolenaar      'new'
3267d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3268df069eecSBram Moolenaar      ':$',
3269faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3270faac4104SBram Moolenaar      'bwipe!',
3271faac4104SBram Moolenaar      ])
3272faac4104SBram Moolenaar
3273f5be8cdbSBram Moolenaar  CheckScriptFailure([
3274f5be8cdbSBram Moolenaar      'vim9script',
3275f5be8cdbSBram Moolenaar      'new'
3276d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3277f5be8cdbSBram Moolenaar      ':$',
3278f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3279f5be8cdbSBram Moolenaar      'bwipe!',
3280f5be8cdbSBram Moolenaar      ], 'E488:')
3281f5be8cdbSBram Moolenaar
3282f5be8cdbSBram Moolenaar  CheckScriptFailure([
3283f5be8cdbSBram Moolenaar      'vim9script',
3284f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3285f5be8cdbSBram Moolenaar      ], 'E477:')
3286a26b9700SBram Moolenaarenddef
3287a26b9700SBram Moolenaar
32887e5bd91dSBram Moolenaardef Test_finish()
3289cfcd011fSBram Moolenaar  var lines =<< trim END
32907e5bd91dSBram Moolenaar    vim9script
32916797966dSBram Moolenaar    g:res = 'one'
32927e5bd91dSBram Moolenaar    if v:false | finish | endif
32936797966dSBram Moolenaar    g:res = 'two'
32947e5bd91dSBram Moolenaar    finish
32956797966dSBram Moolenaar    g:res = 'three'
32967e5bd91dSBram Moolenaar  END
32977e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
32987e5bd91dSBram Moolenaar  source Xfinished
32997e5bd91dSBram Moolenaar  assert_equal('two', g:res)
33007e5bd91dSBram Moolenaar
33017e5bd91dSBram Moolenaar  unlet g:res
33027e5bd91dSBram Moolenaar  delete('Xfinished')
33037e5bd91dSBram Moolenaarenddef
33047e5bd91dSBram Moolenaar
3305a5d0077eSBram Moolenaardef Test_forward_declaration()
3306cfcd011fSBram Moolenaar  var lines =<< trim END
3307a5d0077eSBram Moolenaar    vim9script
3308a5d0077eSBram Moolenaar    def GetValue(): string
3309a5d0077eSBram Moolenaar      return theVal
3310a5d0077eSBram Moolenaar    enddef
3311cfcd011fSBram Moolenaar    var theVal = 'something'
3312822ba247SBram Moolenaar    g:initVal = GetValue()
3313a5d0077eSBram Moolenaar    theVal = 'else'
3314a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3315a5d0077eSBram Moolenaar  END
3316a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3317a5d0077eSBram Moolenaar  source Xforward
3318a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3319a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3320a5d0077eSBram Moolenaar
3321a5d0077eSBram Moolenaar  unlet g:initVal
3322a5d0077eSBram Moolenaar  unlet g:laterVal
3323a5d0077eSBram Moolenaar  delete('Xforward')
3324a5d0077eSBram Moolenaarenddef
3325a5d0077eSBram Moolenaar
33269721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3327a6294955SBram Moolenaar  var vim9_lines =<< trim END
3328a6294955SBram Moolenaar    vim9script
3329a6294955SBram Moolenaar    var local = 'local'
3330a6294955SBram Moolenaar    g:global = 'global'
3331a6294955SBram Moolenaar    export var exported = 'exported'
3332a6294955SBram Moolenaar    export def GetText(): string
3333a6294955SBram Moolenaar       return 'text'
3334a6294955SBram Moolenaar    enddef
3335a6294955SBram Moolenaar  END
3336a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3337a6294955SBram Moolenaar
3338cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
33399721fb4eSBram Moolenaar    source Xvim9_script.vim
33409721fb4eSBram Moolenaar
33419721fb4eSBram Moolenaar    call assert_false(exists('local'))
33429721fb4eSBram Moolenaar    call assert_false(exists('exported'))
33439721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
33449721fb4eSBram Moolenaar    call assert_equal('global', global)
33459721fb4eSBram Moolenaar    call assert_equal('global', g:global)
33469721fb4eSBram Moolenaar
33479721fb4eSBram Moolenaar    " imported variable becomes script-local
33489721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
33499721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
33509721fb4eSBram Moolenaar    call assert_false(exists('exported'))
33519721fb4eSBram Moolenaar
33529721fb4eSBram Moolenaar    " imported function becomes script-local
33539721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
33549721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
33559721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
33569721fb4eSBram Moolenaar  END
33579721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
33589721fb4eSBram Moolenaar
33599721fb4eSBram Moolenaar  source Xlegacy_script.vim
33609721fb4eSBram Moolenaar  assert_equal('global', g:global)
3361f5be8cdbSBram Moolenaar  unlet g:global
33629721fb4eSBram Moolenaar
33639721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
33649721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
33659721fb4eSBram Moolenaarenddef
3366a5d0077eSBram Moolenaar
3367e535db86SBram Moolenaardef Test_declare_script_in_func()
3368e535db86SBram Moolenaar  var lines =<< trim END
3369e535db86SBram Moolenaar      vim9script
3370e535db86SBram Moolenaar      func Declare()
3371e535db86SBram Moolenaar        let s:local = 123
3372e535db86SBram Moolenaar      endfunc
3373e535db86SBram Moolenaar      Declare()
3374e535db86SBram Moolenaar      assert_equal(123, local)
3375e535db86SBram Moolenaar
3376e535db86SBram Moolenaar      var error: string
3377e535db86SBram Moolenaar      try
3378e535db86SBram Moolenaar        local = 'asdf'
3379e535db86SBram Moolenaar      catch
3380e535db86SBram Moolenaar        error = v:exception
3381e535db86SBram Moolenaar      endtry
3382e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3383e535db86SBram Moolenaar
3384e535db86SBram Moolenaar      lockvar local
3385e535db86SBram Moolenaar      try
3386e535db86SBram Moolenaar        local = 999
3387e535db86SBram Moolenaar      catch
3388e535db86SBram Moolenaar        error = v:exception
3389e535db86SBram Moolenaar      endtry
3390e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3391e535db86SBram Moolenaar  END
3392e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3393e535db86SBram Moolenaarenddef
3394e535db86SBram Moolenaar
3395e535db86SBram Moolenaar
33967d699701SBram Moolenaarfunc Test_vim9script_not_global()
33977d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
33987d699701SBram Moolenaar  let vim9lines =<< trim END
33997d699701SBram Moolenaar    vim9script
3400cfcd011fSBram Moolenaar    var name = 'local'
34017d699701SBram Moolenaar    func TheFunc()
34027d699701SBram Moolenaar      echo 'local'
34037d699701SBram Moolenaar    endfunc
34047d699701SBram Moolenaar    def DefFunc()
34057d699701SBram Moolenaar      echo 'local'
34067d699701SBram Moolenaar    enddef
34077d699701SBram Moolenaar  END
34087d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
34097d699701SBram Moolenaar  source Xvim9script.vim
34107d699701SBram Moolenaar  try
34117d699701SBram Moolenaar    echo g:var
34127d699701SBram Moolenaar    assert_report('did not fail')
34137d699701SBram Moolenaar  catch /E121:/
34147d699701SBram Moolenaar    " caught
34157d699701SBram Moolenaar  endtry
34167d699701SBram Moolenaar  try
34177d699701SBram Moolenaar    call TheFunc()
34187d699701SBram Moolenaar    assert_report('did not fail')
34197d699701SBram Moolenaar  catch /E117:/
34207d699701SBram Moolenaar    " caught
34217d699701SBram Moolenaar  endtry
34227d699701SBram Moolenaar  try
34237d699701SBram Moolenaar    call DefFunc()
34247d699701SBram Moolenaar    assert_report('did not fail')
34257d699701SBram Moolenaar  catch /E117:/
34267d699701SBram Moolenaar    " caught
34277d699701SBram Moolenaar  endtry
34287d699701SBram Moolenaar
342925859dd7SBram Moolenaar  call delete('Xvim9script.vim')
34307d699701SBram Moolenaarendfunc
34317d699701SBram Moolenaar
3432eeb27bfeSBram Moolenaardef Test_vim9_copen()
3433eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3434eeb27bfeSBram Moolenaar  copen
3435eeb27bfeSBram Moolenaar  quit
3436eeb27bfeSBram Moolenaarenddef
3437eeb27bfeSBram Moolenaar
343803290b84SBram Moolenaar" test using an auto-loaded function and variable
34392d6b20d6SBram Moolenaardef Test_vim9_autoload()
3440cfcd011fSBram Moolenaar  var lines =<< trim END
34412d6b20d6SBram Moolenaar     vim9script
344203290b84SBram Moolenaar     def some#gettest(): string
344303290b84SBram Moolenaar       return 'test'
344403290b84SBram Moolenaar     enddef
344503290b84SBram Moolenaar     g:some#name = 'name'
3446227c58a4SBram Moolenaar     g:some#dict = {key: 'value'}
3447e3ffcd99SBram Moolenaar
3448e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3449e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3450e3ffcd99SBram Moolenaar     enddef
345103290b84SBram Moolenaar  END
345203290b84SBram Moolenaar
345303290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
345403290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
345503290b84SBram Moolenaar  var save_rtp = &rtp
345603290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
345703290b84SBram Moolenaar
345803290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
345903290b84SBram Moolenaar  assert_equal('name', g:some#name)
3460227c58a4SBram Moolenaar  assert_equal('value', g:some#dict.key)
346103290b84SBram Moolenaar  g:some#other = 'other'
346203290b84SBram Moolenaar  assert_equal('other', g:some#other)
346303290b84SBram Moolenaar
3464e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3465e3ffcd99SBram Moolenaar
346617f700acSBram Moolenaar  # upper case script name works
346717f700acSBram Moolenaar  lines =<< trim END
346817f700acSBram Moolenaar     vim9script
346917f700acSBram Moolenaar     def Other#getOther(): string
347017f700acSBram Moolenaar       return 'other'
347117f700acSBram Moolenaar     enddef
347217f700acSBram Moolenaar  END
347317f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
347417f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
347517f700acSBram Moolenaar
347603290b84SBram Moolenaar  delete('Xdir', 'rf')
347703290b84SBram Moolenaar  &rtp = save_rtp
347803290b84SBram Moolenaarenddef
347903290b84SBram Moolenaar
348003290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
348103290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
348203290b84SBram Moolenaar  var lines =<< trim END
348303290b84SBram Moolenaar     vim9script
34842d6b20d6SBram Moolenaar     def foo#test()
34852d6b20d6SBram Moolenaar         echomsg getreg('"')
34862d6b20d6SBram Moolenaar     enddef
34872d6b20d6SBram Moolenaar  END
34882d6b20d6SBram Moolenaar
34892d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
34902d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3491cfcd011fSBram Moolenaar  var save_rtp = &rtp
34922d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
34932d6b20d6SBram Moolenaar  augroup test
34942d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
34952d6b20d6SBram Moolenaar  augroup END
34962d6b20d6SBram Moolenaar
34972d6b20d6SBram Moolenaar  normal Y
34982d6b20d6SBram Moolenaar
34992d6b20d6SBram Moolenaar  augroup test
35002d6b20d6SBram Moolenaar    autocmd!
35012d6b20d6SBram Moolenaar  augroup END
35022d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
35032d6b20d6SBram Moolenaar  &rtp = save_rtp
35042d6b20d6SBram Moolenaarenddef
35052d6b20d6SBram Moolenaar
350677e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
350777e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3508cfcd011fSBram Moolenaar  var lines =<< trim END
350977e5dcc3SBram Moolenaar      vim9script
351077e5dcc3SBram Moolenaar      def crash#func()
351177e5dcc3SBram Moolenaar          try
351277e5dcc3SBram Moolenaar              for x in List()
351377e5dcc3SBram Moolenaar              endfor
351477e5dcc3SBram Moolenaar          catch
351577e5dcc3SBram Moolenaar          endtry
351677e5dcc3SBram Moolenaar          g:ok = true
351777e5dcc3SBram Moolenaar      enddef
351877e5dcc3SBram Moolenaar      fu List()
351977e5dcc3SBram Moolenaar          invalid
352077e5dcc3SBram Moolenaar      endfu
352177e5dcc3SBram Moolenaar      try
352248e11c10SBram Moolenaar          alsoinvalid
352377e5dcc3SBram Moolenaar      catch /wontmatch/
352477e5dcc3SBram Moolenaar      endtry
352577e5dcc3SBram Moolenaar  END
352677e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
352777e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
352877e5dcc3SBram Moolenaar
352977e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
353077e5dcc3SBram Moolenaar  lines =<< trim END
353177e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
353277e5dcc3SBram Moolenaar    call crash#func()
353377e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
35349c4f5520SBram Moolenaar    qall!
353577e5dcc3SBram Moolenaar  END
353677e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
353777e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
353877e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
353977e5dcc3SBram Moolenaar
354077e5dcc3SBram Moolenaar  delete('Xdidit')
354177e5dcc3SBram Moolenaar  delete('Xscript')
354277e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
354303290b84SBram Moolenaar
354403290b84SBram Moolenaar  lines =<< trim END
354503290b84SBram Moolenaar    vim9script
354603290b84SBram Moolenaar    var foo#bar = 'asdf'
354703290b84SBram Moolenaar  END
354803290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
354977e5dcc3SBram Moolenaarenddef
355077e5dcc3SBram Moolenaar
355181e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
355281e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
355381e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3554cfcd011fSBram Moolenaar  var lines =<< trim END
355581e17fbeSBram Moolenaar    let s:counter = 1
355681e17fbeSBram Moolenaar    def s:Func()
355781e17fbeSBram Moolenaar      au! CursorHold
355881e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
355981e17fbeSBram Moolenaar    enddef
356081e17fbeSBram Moolenaar    call s:Func()
356181e17fbeSBram Moolenaar    doau CursorHold
356281e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
356381e17fbeSBram Moolenaar    au! CursorHold
356481e17fbeSBram Moolenaar  END
356581e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
356681e17fbeSBram Moolenaarenddef
356781e17fbeSBram Moolenaar
35683896a105SBram Moolenaardef Test_cmdline_win()
35693896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
35703896a105SBram Moolenaar  # the command line window.
35713896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3572cfcd011fSBram Moolenaar  var export_lines =<< trim END
35733896a105SBram Moolenaar    vim9script
3574cfcd011fSBram Moolenaar    export var That = 'yes'
35753896a105SBram Moolenaar  END
35763896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3577cfcd011fSBram Moolenaar  var import_lines =<< trim END
35783896a105SBram Moolenaar    vim9script
35793896a105SBram Moolenaar    import That from './Xexport.vim'
35803896a105SBram Moolenaar  END
35813896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3582cfcd011fSBram Moolenaar  var save_rtp = &rtp
35833896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
35843896a105SBram Moolenaar  syntax on
35853896a105SBram Moolenaar  augroup CmdWin
35863896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
35873896a105SBram Moolenaar  augroup END
35883896a105SBram Moolenaar  # this will open and also close the cmdline window
35893896a105SBram Moolenaar  feedkeys('q:', 'xt')
35903896a105SBram Moolenaar  assert_equal('yes', g:got_there)
35913896a105SBram Moolenaar
35923896a105SBram Moolenaar  augroup CmdWin
35933896a105SBram Moolenaar    au!
35943896a105SBram Moolenaar  augroup END
35953896a105SBram Moolenaar  &rtp = save_rtp
35963896a105SBram Moolenaar  delete('rtp', 'rf')
35973896a105SBram Moolenaarenddef
35983896a105SBram Moolenaar
3599e3d4685fSBram Moolenaardef Test_invalid_sid()
3600e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
360125859dd7SBram Moolenaar
36029c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3603d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3604e3d4685fSBram Moolenaar  endif
3605e3d4685fSBram Moolenaar  delete('Xdidit')
3606e3d4685fSBram Moolenaarenddef
3607e3d4685fSBram Moolenaar
36089ec7026fSBram Moolenaardef Test_restoring_cpo()
36099ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
36109ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
36119ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
36129ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
36139ec7026fSBram Moolenaar  endif
36149ec7026fSBram Moolenaar  delete('Xsourced')
36159ec7026fSBram Moolenaar  delete('Xclose')
3616090728adSBram Moolenaar  delete('Xdone')
36170123cc1eSBram Moolenaar
36180123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
36190123cc1eSBram Moolenaar  set cpo=aABceFsMny>
36200123cc1eSBram Moolenaar  edit XanotherScript
36210123cc1eSBram Moolenaar  so %
36220123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
36230123cc1eSBram Moolenaar  :1del
36240123cc1eSBram Moolenaar  w
36250123cc1eSBram Moolenaar  so %
36260123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
36270123cc1eSBram Moolenaar
36280123cc1eSBram Moolenaar  delete('XanotherScript')
36290123cc1eSBram Moolenaar  set cpo&vim
36309ec7026fSBram Moolenaarenddef
36319ec7026fSBram Moolenaar
3632ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3633ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
363437294bd6SBram Moolenaar  CheckScreendump
3635ffb7dcdbSBram Moolenaar  CheckFeature timers
363637294bd6SBram Moolenaar
3637ffb7dcdbSBram Moolenaar  let lines =<< trim END
363837294bd6SBram Moolenaar    vim9script
363937294bd6SBram Moolenaar    def script#func()
364037294bd6SBram Moolenaar    enddef
364137294bd6SBram Moolenaar  END
3642ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3643ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
364437294bd6SBram Moolenaar
3645ffb7dcdbSBram Moolenaar  let lines =<< trim END
364637294bd6SBram Moolenaar      vim9script
364737294bd6SBram Moolenaar      set cpo+=M
364837294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
3649767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
365037294bd6SBram Moolenaar      setline(1, 'some text')
365137294bd6SBram Moolenaar  END
3652ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3653ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3654ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3655ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
365637294bd6SBram Moolenaar
3657ffb7dcdbSBram Moolenaar  " clean up
3658ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3659ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3660ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3661ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3662ffb7dcdbSBram Moolenaarendfunc
366337294bd6SBram Moolenaar
36649ec7026fSBram Moolenaar
3665f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3666cfcd011fSBram Moolenaar  var lines =<< trim END
3667cfcd011fSBram Moolenaar    var name: any
3668cfcd011fSBram Moolenaar    assert_equal(0, name)
3669f0afd9e1SBram Moolenaar  END
3670f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3671f0afd9e1SBram Moolenaarenddef
3672f0afd9e1SBram Moolenaar
36737e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
367458dbef33SBram Moolenaar  CheckRunVimInTerminal
367558dbef33SBram Moolenaar
36767e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
36777e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
36787e9210eaSBram Moolenaarendfunc
36797e9210eaSBram Moolenaar
36807e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
36819c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3682cfcd011fSBram Moolenaar  var lines =<< trim END
36839c4f5520SBram Moolenaar    func CheckAndQuit()
36849c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
36859c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
36869c4f5520SBram Moolenaar    endfunc
36879c4f5520SBram Moolenaar  END
36889c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
36899c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3690e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
36919c4f5520SBram Moolenaar  # define Afunc() on the command line
36929c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
36939c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
36942949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
36959c4f5520SBram Moolenaar
36969c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
36979c4f5520SBram Moolenaar  delete('XcallFunc')
36989c4f5520SBram Moolenaar  delete('Xdidcmd')
36999c4f5520SBram Moolenaarenddef
37009c4f5520SBram Moolenaar
3701fcdc5d83SBram Moolenaardef Test_script_var_scope()
3702fcdc5d83SBram Moolenaar  var lines =<< trim END
3703fcdc5d83SBram Moolenaar      vim9script
3704fcdc5d83SBram Moolenaar      if true
3705fcdc5d83SBram Moolenaar        if true
3706fcdc5d83SBram Moolenaar          var one = 'one'
3707fcdc5d83SBram Moolenaar          echo one
3708fcdc5d83SBram Moolenaar        endif
3709fcdc5d83SBram Moolenaar        echo one
3710fcdc5d83SBram Moolenaar      endif
3711fcdc5d83SBram Moolenaar  END
3712fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3713fcdc5d83SBram Moolenaar
3714fcdc5d83SBram Moolenaar  lines =<< trim END
3715fcdc5d83SBram Moolenaar      vim9script
3716fcdc5d83SBram Moolenaar      if true
3717fcdc5d83SBram Moolenaar        if false
3718fcdc5d83SBram Moolenaar          var one = 'one'
3719fcdc5d83SBram Moolenaar          echo one
3720fcdc5d83SBram Moolenaar        else
3721fcdc5d83SBram Moolenaar          var one = 'one'
3722fcdc5d83SBram Moolenaar          echo one
3723fcdc5d83SBram Moolenaar        endif
3724fcdc5d83SBram Moolenaar        echo one
3725fcdc5d83SBram Moolenaar      endif
3726fcdc5d83SBram Moolenaar  END
3727fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3728fcdc5d83SBram Moolenaar
3729fcdc5d83SBram Moolenaar  lines =<< trim END
3730fcdc5d83SBram Moolenaar      vim9script
3731fcdc5d83SBram Moolenaar      while true
3732fcdc5d83SBram Moolenaar        var one = 'one'
3733fcdc5d83SBram Moolenaar        echo one
3734fcdc5d83SBram Moolenaar        break
3735fcdc5d83SBram Moolenaar      endwhile
3736fcdc5d83SBram Moolenaar      echo one
3737fcdc5d83SBram Moolenaar  END
3738fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3739fcdc5d83SBram Moolenaar
3740fcdc5d83SBram Moolenaar  lines =<< trim END
3741fcdc5d83SBram Moolenaar      vim9script
3742fcdc5d83SBram Moolenaar      for i in range(1)
3743fcdc5d83SBram Moolenaar        var one = 'one'
3744fcdc5d83SBram Moolenaar        echo one
3745fcdc5d83SBram Moolenaar      endfor
3746fcdc5d83SBram Moolenaar      echo one
3747fcdc5d83SBram Moolenaar  END
3748fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
37499becdf2bSBram Moolenaar
37509becdf2bSBram Moolenaar  lines =<< trim END
37519becdf2bSBram Moolenaar      vim9script
37529becdf2bSBram Moolenaar      {
37539becdf2bSBram Moolenaar        var one = 'one'
37549becdf2bSBram Moolenaar        assert_equal('one', one)
37559becdf2bSBram Moolenaar      }
37569becdf2bSBram Moolenaar      assert_false(exists('one'))
37579becdf2bSBram Moolenaar      assert_false(exists('s:one'))
37589becdf2bSBram Moolenaar  END
37599becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
37609becdf2bSBram Moolenaar
37619becdf2bSBram Moolenaar  lines =<< trim END
37629becdf2bSBram Moolenaar      vim9script
37639becdf2bSBram Moolenaar      {
37649becdf2bSBram Moolenaar        var one = 'one'
37659becdf2bSBram Moolenaar        echo one
37669becdf2bSBram Moolenaar      }
37679becdf2bSBram Moolenaar      echo one
37689becdf2bSBram Moolenaar  END
37699becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3770fcdc5d83SBram Moolenaarenddef
3771fcdc5d83SBram Moolenaar
3772352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3773352134bbSBram Moolenaar  var lines =<< trim END
3774352134bbSBram Moolenaar    vim9script
37752a38908bSBram Moolenaar    def Callback(...l: list<any>)
3776352134bbSBram Moolenaar      try
3777352134bbSBram Moolenaar        var x: string
3778352134bbSBram Moolenaar        var y: string
3779352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3780352134bbSBram Moolenaar        [x, y] = ['']
3781352134bbSBram Moolenaar      catch
3782352134bbSBram Moolenaar        g:caught = 'yes'
3783352134bbSBram Moolenaar      endtry
3784352134bbSBram Moolenaar    enddef
3785e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3786352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3787352134bbSBram Moolenaar  END
3788352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3789352134bbSBram Moolenaar
3790352134bbSBram Moolenaar  unlet g:caught
3791352134bbSBram Moolenaarenddef
3792352134bbSBram Moolenaar
3793631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3794631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3795631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3796631e8f93SBram Moolenaar  endif
3797631e8f93SBram Moolenaar  var lines =<< trim END
3798631e8f93SBram Moolenaar      vim9script
3799631e8f93SBram Moolenaar      var source: list<number>
38002a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
3801631e8f93SBram Moolenaar          eval [][0]
3802631e8f93SBram Moolenaar      enddef
38032a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
3804631e8f93SBram Moolenaar          sleep 1m
3805631e8f93SBram Moolenaar          source += l
3806631e8f93SBram Moolenaar      enddef
3807e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
38086f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
38096f17a3f0SBram Moolenaar        sleep 10m
38106f17a3f0SBram Moolenaar      endwhile
3811206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3812fe95b94fSBram Moolenaar      sleep 200m
3813631e8f93SBram Moolenaar  END
3814631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3815631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3816631e8f93SBram Moolenaar  delete('Xdef')
3817631e8f93SBram Moolenaarenddef
3818631e8f93SBram Moolenaar
38194324d87aSBram Moolenaardef InvokeNormal()
38204324d87aSBram Moolenaar  exe "norm! :m+1\r"
38214324d87aSBram Moolenaarenddef
38224324d87aSBram Moolenaar
38234324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
38244324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
38254324d87aSBram Moolenaar  new
38264324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
38274324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
38284324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
38294324d87aSBram Moolenaar  xunmap <F3>
3830b5b9480eSBram Moolenaarenddef
3831b5b9480eSBram Moolenaar
3832b5b9480eSBram Moolenaardef Test_white_space_after_command()
3833b5b9480eSBram Moolenaar  var lines =<< trim END
3834b5b9480eSBram Moolenaar    exit_cb: Func})
3835b5b9480eSBram Moolenaar  END
3836b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3837f8103f27SBram Moolenaar
3838f8103f27SBram Moolenaar  lines =<< trim END
3839f8103f27SBram Moolenaar    e#
3840f8103f27SBram Moolenaar  END
3841f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
38424324d87aSBram Moolenaarenddef
38434324d87aSBram Moolenaar
38444aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
38454aab88d9SBram Moolenaar  var lines =<< trim END
38464aab88d9SBram Moolenaar      vim9script
38474aab88d9SBram Moolenaar      if exists('g:guard')
38484aab88d9SBram Moolenaar        finish
38494aab88d9SBram Moolenaar      endif
38504aab88d9SBram Moolenaar      g:guard = 1
38514aab88d9SBram Moolenaar      var name = 'thename'
38524aab88d9SBram Moolenaar      def g:GetName(): string
38534aab88d9SBram Moolenaar        return name
38544aab88d9SBram Moolenaar      enddef
38554aab88d9SBram Moolenaar      def g:SetName(arg: string)
38564aab88d9SBram Moolenaar        name = arg
38574aab88d9SBram Moolenaar      enddef
38584aab88d9SBram Moolenaar  END
38594aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
38604aab88d9SBram Moolenaar  so XscriptTwice.vim
38614aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
38624aab88d9SBram Moolenaar  g:SetName('newname')
38634aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
38644aab88d9SBram Moolenaar  so XscriptTwice.vim
38654aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
38664aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
38674aab88d9SBram Moolenaar
38684aab88d9SBram Moolenaar  delfunc g:GetName
38694aab88d9SBram Moolenaar  delfunc g:SetName
38704aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
38714aab88d9SBram Moolenaar  unlet g:guard
38724aab88d9SBram Moolenaarenddef
38734aab88d9SBram Moolenaar
38744aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
38754aab88d9SBram Moolenaar  var exportlines =<< trim END
38764aab88d9SBram Moolenaar      vim9script
38774aab88d9SBram Moolenaar      if exists('g:guard')
38784aab88d9SBram Moolenaar        finish
38794aab88d9SBram Moolenaar      endif
38804aab88d9SBram Moolenaar      g:guard = 1
38814aab88d9SBram Moolenaar      export var name = 'someName'
38824aab88d9SBram Moolenaar  END
38834aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
38844aab88d9SBram Moolenaar
38854aab88d9SBram Moolenaar  var lines =<< trim END
38864aab88d9SBram Moolenaar      vim9script
38874aab88d9SBram Moolenaar      import name from './XexportScript.vim'
38884aab88d9SBram Moolenaar      def g:GetName(): string
38894aab88d9SBram Moolenaar        return name
38904aab88d9SBram Moolenaar      enddef
38914aab88d9SBram Moolenaar  END
38924aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
38934aab88d9SBram Moolenaar  so XscriptImport.vim
38944aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
38954aab88d9SBram Moolenaar
38964aab88d9SBram Moolenaar  so XexportScript.vim
38974aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
38984aab88d9SBram Moolenaar
38994aab88d9SBram Moolenaar  delfunc g:GetName
39004aab88d9SBram Moolenaar  delete('XexportScript.vim')
39014aab88d9SBram Moolenaar  delete('XscriptImport.vim')
39024aab88d9SBram Moolenaar  unlet g:guard
39034aab88d9SBram Moolenaarenddef
39044aab88d9SBram Moolenaar
390510b9421fSBram Moolenaardef Test_unsupported_commands()
390610b9421fSBram Moolenaar  var lines =<< trim END
390710b9421fSBram Moolenaar      ka
390810b9421fSBram Moolenaar  END
39097d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
39107d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
391110b9421fSBram Moolenaar
391210b9421fSBram Moolenaar  lines =<< trim END
3913ada1d870SBram Moolenaar      :1ka
3914ada1d870SBram Moolenaar  END
39157d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
39167d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
3917ada1d870SBram Moolenaar
3918ada1d870SBram Moolenaar  lines =<< trim END
391910b9421fSBram Moolenaar    t
392010b9421fSBram Moolenaar  END
392110b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
392210b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
392310b9421fSBram Moolenaar
392410b9421fSBram Moolenaar  lines =<< trim END
392510b9421fSBram Moolenaar    x
392610b9421fSBram Moolenaar  END
392710b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
392810b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
392910b9421fSBram Moolenaar
393010b9421fSBram Moolenaar  lines =<< trim END
393110b9421fSBram Moolenaar    xit
393210b9421fSBram Moolenaar  END
393310b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
393410b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
393510b9421fSBram Moolenaarenddef
393610b9421fSBram Moolenaar
3937c70fe460SBram Moolenaardef Test_mapping_line_number()
3938c70fe460SBram Moolenaar  var lines =<< trim END
3939c70fe460SBram Moolenaar      vim9script
3940c70fe460SBram Moolenaar      def g:FuncA()
3941c70fe460SBram Moolenaar          # Some comment
3942c70fe460SBram Moolenaar          FuncB(0)
3943c70fe460SBram Moolenaar      enddef
3944c70fe460SBram Moolenaar          # Some comment
3945c70fe460SBram Moolenaar      def FuncB(
3946c70fe460SBram Moolenaar          # Some comment
3947c70fe460SBram Moolenaar          n: number
3948c70fe460SBram Moolenaar      )
3949c70fe460SBram Moolenaar          exe 'nno '
3950c70fe460SBram Moolenaar              # Some comment
3951c70fe460SBram Moolenaar              .. '<F3> a'
3952c70fe460SBram Moolenaar              .. 'b'
3953c70fe460SBram Moolenaar              .. 'c'
3954c70fe460SBram Moolenaar      enddef
3955c70fe460SBram Moolenaar  END
3956c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
3957c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
3958c70fe460SBram Moolenaar  assert_match('No mapping found', res)
3959c70fe460SBram Moolenaar
3960c70fe460SBram Moolenaar  g:FuncA()
3961c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
3962c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
3963c70fe460SBram Moolenaar
3964c70fe460SBram Moolenaar  nunmap <F3>
3965c70fe460SBram Moolenaar  delfunc g:FuncA
3966c70fe460SBram Moolenaarenddef
3967c70fe460SBram Moolenaar
3968208f0b48SBram Moolenaardef Test_option_modifier()
3969208f0b48SBram Moolenaar  var lines =<< trim END
3970208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
3971208f0b48SBram Moolenaar      call assert_equal(1, &hlsearch)
3972208f0b48SBram Moolenaar  END
3973208f0b48SBram Moolenaar  CheckScriptSuccess(lines)
3974208f0b48SBram Moolenaar
3975208f0b48SBram Moolenaar  lines =<< trim END
3976208f0b48SBram Moolenaar      vim9script
3977208f0b48SBram Moolenaar      set hlsearch &
3978208f0b48SBram Moolenaar  END
3979208f0b48SBram Moolenaar  CheckScriptFailure(lines, 'E518:')
3980208f0b48SBram Moolenaar
3981208f0b48SBram Moolenaar  lines =<< trim END
3982208f0b48SBram Moolenaar      vim9script
3983208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
3984208f0b48SBram Moolenaar  END
3985208f0b48SBram Moolenaar  CheckScriptFailure(lines, 'E518:')
3986208f0b48SBram Moolenaarenddef
3987208f0b48SBram Moolenaar
3988585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3989585fea7bSBram Moolenaardef Test_substitute_cmd()
3990585fea7bSBram Moolenaar  new
3991585fea7bSBram Moolenaar  setline(1, 'something')
3992585fea7bSBram Moolenaar  :substitute(some(other(
3993585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3994585fea7bSBram Moolenaar  bwipe!
3995585fea7bSBram Moolenaar
3996f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3997cfcd011fSBram Moolenaar  var lines =<< trim END
3998585fea7bSBram Moolenaar    vim9script
3999585fea7bSBram Moolenaar    new
4000585fea7bSBram Moolenaar    setline(1, 'something')
4001585fea7bSBram Moolenaar    :substitute(some(other(
4002585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
4003585fea7bSBram Moolenaar    bwipe!
4004585fea7bSBram Moolenaar  END
4005585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
4006585fea7bSBram Moolenaar  source Xvim9lines
4007585fea7bSBram Moolenaar
4008585fea7bSBram Moolenaar  delete('Xvim9lines')
4009585fea7bSBram Moolenaarenddef
4010585fea7bSBram Moolenaar
40118a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
4012