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())
5938a7d6542SBram Moolenaarenddef
5948a7d6542SBram Moolenaar
5952e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to
5962e34c34bSBram Moolenaardef TryContinueFunc()
5972e34c34bSBram Moolenaar while g:Count < 2
5982e34c34bSBram Moolenaar   g:sequence ..= 't'
5992e34c34bSBram Moolenaar    try
6002e34c34bSBram Moolenaar      echoerr 'Test'
6012e34c34bSBram Moolenaar    catch
6022e34c34bSBram Moolenaar      g:Count += 1
6032e34c34bSBram Moolenaar      g:sequence ..= 'c'
6042e34c34bSBram Moolenaar      continue
6052e34c34bSBram Moolenaar    endtry
6062e34c34bSBram Moolenaar    g:sequence ..= 'e'
6072e34c34bSBram Moolenaar    g:Count += 1
6082e34c34bSBram Moolenaar  endwhile
6092e34c34bSBram Moolenaarenddef
6102e34c34bSBram Moolenaar
6112e34c34bSBram Moolenaardef Test_continue_in_try_in_while()
6122e34c34bSBram Moolenaar  g:Count = 0
6132e34c34bSBram Moolenaar  g:sequence = ''
6142e34c34bSBram Moolenaar  TryContinueFunc()
6152e34c34bSBram Moolenaar  assert_equal('tctc', g:sequence)
6162e34c34bSBram Moolenaar  unlet g:Count
6172e34c34bSBram Moolenaar  unlet g:sequence
6182e34c34bSBram Moolenaarenddef
6192e34c34bSBram Moolenaar
6209cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
6219cb577a6SBram Moolenaar  # return in try block returns normally
6229cb577a6SBram Moolenaar  def ReturnInTry(): string
6239cb577a6SBram Moolenaar    try
6249cb577a6SBram Moolenaar      return '"some message"'
6259cb577a6SBram Moolenaar    catch
6269cb577a6SBram Moolenaar    endtry
6279cb577a6SBram Moolenaar    return 'not reached'
6289cb577a6SBram Moolenaar  enddef
6299cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
6309cb577a6SBram Moolenaarenddef
6319cb577a6SBram Moolenaar
6321430ceebSBram Moolenaardef Test_cnext_works_in_catch()
6331430ceebSBram Moolenaar  var lines =<< trim END
6341430ceebSBram Moolenaar      vim9script
6351430ceebSBram Moolenaar      au BufEnter * eval 0
6361430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
6371430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
6381430ceebSBram Moolenaar      var items = [
6391430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
6401430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
6411430ceebSBram Moolenaar        ]
6421430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
6431430ceebSBram Moolenaar      cwindow
6441430ceebSBram Moolenaar
6451430ceebSBram Moolenaar      def CnextOrCfirst()
6461430ceebSBram Moolenaar        # if cnext fails, cfirst is used
6471430ceebSBram Moolenaar        try
6481430ceebSBram Moolenaar          cnext
6491430ceebSBram Moolenaar        catch
6501430ceebSBram Moolenaar          cfirst
6511430ceebSBram Moolenaar        endtry
6521430ceebSBram Moolenaar      enddef
6531430ceebSBram Moolenaar
6541430ceebSBram Moolenaar      CnextOrCfirst()
6551430ceebSBram Moolenaar      CnextOrCfirst()
6561430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
6571430ceebSBram Moolenaar      qall
6581430ceebSBram Moolenaar  END
6591430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
6601430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
6611430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
6621430ceebSBram Moolenaar
6631430ceebSBram Moolenaar  delete('Xfile1')
6641430ceebSBram Moolenaar  delete('Xfile2')
6651430ceebSBram Moolenaar  delete('XCatchCnext')
6661430ceebSBram Moolenaar  delete('Xresult')
6671430ceebSBram Moolenaarenddef
6681430ceebSBram Moolenaar
6699e1d9e34SBram Moolenaardef Test_throw_skipped()
6709e1d9e34SBram Moolenaar  if 0
6719e1d9e34SBram Moolenaar    throw dontgethere
6729e1d9e34SBram Moolenaar  endif
6739e1d9e34SBram Moolenaarenddef
6749e1d9e34SBram Moolenaar
6758f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
6768f81b22eSBram Moolenaar  var lines =<< trim END
6778f81b22eSBram Moolenaar    vim9script
6788f81b22eSBram Moolenaar    def Func()
6798f81b22eSBram Moolenaar      throw 'error'
6808f81b22eSBram Moolenaar    enddef
6818f81b22eSBram Moolenaar    silent! Func()
6828f81b22eSBram Moolenaar  END
6838f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
6848f81b22eSBram Moolenaar  source XthrowSilenced
6858f81b22eSBram Moolenaar  delete('XthrowSilenced')
6868f81b22eSBram Moolenaarenddef
6878f81b22eSBram Moolenaar
688e859312eSBram Moolenaardef DeletedFunc(): list<any>
689e859312eSBram Moolenaar  return ['delete me']
690e859312eSBram Moolenaarenddef
691e859312eSBram Moolenaardefcompile
692e859312eSBram Moolenaardelfunc DeletedFunc
693e859312eSBram Moolenaar
694257cc5eeSBram Moolenaardef ThrowFromDef()
695a72cfb80SBram Moolenaar  throw "getout" # comment
696257cc5eeSBram Moolenaarenddef
697257cc5eeSBram Moolenaar
698257cc5eeSBram Moolenaarfunc CatchInFunc()
699257cc5eeSBram Moolenaar  try
700257cc5eeSBram Moolenaar    call ThrowFromDef()
701257cc5eeSBram Moolenaar  catch
702257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
703257cc5eeSBram Moolenaar  endtry
704257cc5eeSBram Moolenaarendfunc
705257cc5eeSBram Moolenaar
706257cc5eeSBram Moolenaardef CatchInDef()
707257cc5eeSBram Moolenaar  try
708257cc5eeSBram Moolenaar    ThrowFromDef()
709257cc5eeSBram Moolenaar  catch
710257cc5eeSBram Moolenaar    g:thrown_def = v:exception
711257cc5eeSBram Moolenaar  endtry
712257cc5eeSBram Moolenaarenddef
713257cc5eeSBram Moolenaar
714f575adffSBram Moolenaardef ReturnFinally(): string
715f575adffSBram Moolenaar  try
716f575adffSBram Moolenaar    return 'intry'
717373863edSBram Moolenaar  finall
718f575adffSBram Moolenaar    g:in_finally = 'finally'
719f575adffSBram Moolenaar  endtry
720f575adffSBram Moolenaar  return 'end'
721f575adffSBram Moolenaarenddef
722f575adffSBram Moolenaar
723257cc5eeSBram Moolenaardef Test_try_catch_nested()
724257cc5eeSBram Moolenaar  CatchInFunc()
725257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
726257cc5eeSBram Moolenaar
727257cc5eeSBram Moolenaar  CatchInDef()
728257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
729f575adffSBram Moolenaar
730f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
731f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
732f575adffSBram Moolenaarenddef
733f575adffSBram Moolenaar
7349939f57bSBram Moolenaardef TryOne(): number
7359939f57bSBram Moolenaar  try
7369939f57bSBram Moolenaar    return 0
7379939f57bSBram Moolenaar  catch
7389939f57bSBram Moolenaar  endtry
7399939f57bSBram Moolenaar  return 0
7409939f57bSBram Moolenaarenddef
7419939f57bSBram Moolenaar
7429939f57bSBram Moolenaardef TryTwo(n: number): string
7439939f57bSBram Moolenaar  try
744cfcd011fSBram Moolenaar    var x = {}
7459939f57bSBram Moolenaar  catch
7469939f57bSBram Moolenaar  endtry
7479939f57bSBram Moolenaar  return 'text'
7489939f57bSBram Moolenaarenddef
7499939f57bSBram Moolenaar
7509939f57bSBram Moolenaardef Test_try_catch_twice()
7519939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
7529939f57bSBram Moolenaarenddef
7539939f57bSBram Moolenaar
754f575adffSBram Moolenaardef Test_try_catch_match()
755cfcd011fSBram Moolenaar  var seq = 'a'
756f575adffSBram Moolenaar  try
757f575adffSBram Moolenaar    throw 'something'
758f575adffSBram Moolenaar  catch /nothing/
759f575adffSBram Moolenaar    seq ..= 'x'
760f575adffSBram Moolenaar  catch /some/
761f575adffSBram Moolenaar    seq ..= 'b'
762f575adffSBram Moolenaar  catch /asdf/
763f575adffSBram Moolenaar    seq ..= 'x'
764e8c4abbbSBram Moolenaar  catch ?a\?sdf?
765e8c4abbbSBram Moolenaar    seq ..= 'y'
766f575adffSBram Moolenaar  finally
767f575adffSBram Moolenaar    seq ..= 'c'
768f575adffSBram Moolenaar  endtry
769f575adffSBram Moolenaar  assert_equal('abc', seq)
770257cc5eeSBram Moolenaarenddef
771257cc5eeSBram Moolenaar
772e8c4abbbSBram Moolenaardef Test_try_catch_fails()
773d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
774d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
775d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
776d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
777d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
778d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
779d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
780d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
78113106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
782d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
783585fea7bSBram Moolenaar
784e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
785d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
786e8c4abbbSBram Moolenaarenddef
787e8c4abbbSBram Moolenaar
7887c5b3c03SBram Moolenaardef Try_catch_skipped()
7897c5b3c03SBram Moolenaar  var l = []
7907c5b3c03SBram Moolenaar  try
7917c5b3c03SBram Moolenaar  finally
7927c5b3c03SBram Moolenaar  endtry
7937c5b3c03SBram Moolenaar
7947c5b3c03SBram Moolenaar  if 1
7957c5b3c03SBram Moolenaar  else
7967c5b3c03SBram Moolenaar    try
7977c5b3c03SBram Moolenaar    endtry
7987c5b3c03SBram Moolenaar  endif
7997c5b3c03SBram Moolenaarenddef
8007c5b3c03SBram Moolenaar
8017c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
8027c5b3c03SBram Moolenaardef Test_try_catch_skipped()
8037c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
8047c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
8057c5b3c03SBram Moolenaarenddef
8067c5b3c03SBram Moolenaar
8077c5b3c03SBram Moolenaar
8087c5b3c03SBram Moolenaar
809006ad48bSBram Moolenaardef Test_throw_vimscript()
810f5be8cdbSBram Moolenaar  # only checks line continuation
811cfcd011fSBram Moolenaar  var lines =<< trim END
812006ad48bSBram Moolenaar      vim9script
813006ad48bSBram Moolenaar      try
814006ad48bSBram Moolenaar        throw 'one'
815006ad48bSBram Moolenaar              .. 'two'
816006ad48bSBram Moolenaar      catch
817006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
818006ad48bSBram Moolenaar      endtry
819006ad48bSBram Moolenaar  END
820006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
8211e021e63SBram Moolenaar
8221e021e63SBram Moolenaar  lines =<< trim END
8231e021e63SBram Moolenaar    vim9script
824352134bbSBram Moolenaar    @r = ''
8251e021e63SBram Moolenaar    def Func()
8261e021e63SBram Moolenaar      throw @r
8271e021e63SBram Moolenaar    enddef
8281e021e63SBram Moolenaar    var result = ''
8291e021e63SBram Moolenaar    try
8301e021e63SBram Moolenaar      Func()
8311e021e63SBram Moolenaar    catch /E1129:/
8321e021e63SBram Moolenaar      result = 'caught'
8331e021e63SBram Moolenaar    endtry
8341e021e63SBram Moolenaar    assert_equal('caught', result)
8351e021e63SBram Moolenaar  END
8361e021e63SBram Moolenaar  CheckScriptSuccess(lines)
837006ad48bSBram Moolenaarenddef
838006ad48bSBram Moolenaar
839ed677f55SBram Moolenaardef Test_error_in_nested_function()
84003dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
841cfcd011fSBram Moolenaar  var lines =<< trim END
842ed677f55SBram Moolenaar      vim9script
843ed677f55SBram Moolenaar      def Func()
844ed677f55SBram Moolenaar        Error()
845ed677f55SBram Moolenaar        g:test_var = 1
846ed677f55SBram Moolenaar      enddef
847ed677f55SBram Moolenaar      func Error() abort
848ed677f55SBram Moolenaar        eval [][0]
849ed677f55SBram Moolenaar      endfunc
850ed677f55SBram Moolenaar      Func()
851ed677f55SBram Moolenaar  END
852ed677f55SBram Moolenaar  g:test_var = 0
853ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
854ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
855ed677f55SBram Moolenaarenddef
856ed677f55SBram Moolenaar
85737c83711SBram Moolenaardef Test_cexpr_vimscript()
858f5be8cdbSBram Moolenaar  # only checks line continuation
85937c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
860cfcd011fSBram Moolenaar  var lines =<< trim END
86137c83711SBram Moolenaar      vim9script
86237c83711SBram Moolenaar      cexpr 'File'
86337c83711SBram Moolenaar                .. ' someFile' ..
86437c83711SBram Moolenaar                   ' line 19'
86537c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
86637c83711SBram Moolenaar  END
86737c83711SBram Moolenaar  CheckScriptSuccess(lines)
86837c83711SBram Moolenaar  set errorformat&
86937c83711SBram Moolenaarenddef
87037c83711SBram Moolenaar
871c9edd6b5SBram Moolenaardef Test_statusline_syntax()
872c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
873cfcd011fSBram Moolenaar  var lines =<< trim END
874c9edd6b5SBram Moolenaar      vim9script
875c9edd6b5SBram Moolenaar      func g:Status()
876c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
877c9edd6b5SBram Moolenaar      endfunc
878c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
879c9edd6b5SBram Moolenaar      redrawstatus
880c9edd6b5SBram Moolenaar      set laststatus statusline=
881c9edd6b5SBram Moolenaar  END
882c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
883c9edd6b5SBram Moolenaarenddef
884c9edd6b5SBram Moolenaar
885b209750bSBram Moolenaardef Test_list_vimscript()
886b209750bSBram Moolenaar  # checks line continuation and comments
887cfcd011fSBram Moolenaar  var lines =<< trim END
888b209750bSBram Moolenaar      vim9script
889cfcd011fSBram Moolenaar      var mylist = [
890b209750bSBram Moolenaar            'one',
891b209750bSBram Moolenaar            # comment
892b209750bSBram Moolenaar            'two', # empty line follows
893b209750bSBram Moolenaar
894b209750bSBram Moolenaar            'three',
895b209750bSBram Moolenaar            ]
896b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
897b209750bSBram Moolenaar  END
898b209750bSBram Moolenaar  CheckScriptSuccess(lines)
89966250c93SBram Moolenaar
90066250c93SBram Moolenaar  # check all lines from heredoc are kept
90166250c93SBram Moolenaar  lines =<< trim END
90266250c93SBram Moolenaar      # comment 1
90366250c93SBram Moolenaar      two
90466250c93SBram Moolenaar      # comment 3
90566250c93SBram Moolenaar
90666250c93SBram Moolenaar      five
90766250c93SBram Moolenaar      # comment 6
90866250c93SBram Moolenaar  END
90966250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
9104bce26bbSBram Moolenaar
9114bce26bbSBram Moolenaar  lines =<< trim END
9124bce26bbSBram Moolenaar    [{
9134bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
9144bce26bbSBram Moolenaar  END
9154bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
916b209750bSBram Moolenaarenddef
917b209750bSBram Moolenaar
9182a1381c3SBram Moolenaarif has('channel')
91940ee466cSBram Moolenaar  let someJob = test_null_job()
92040ee466cSBram Moolenaar
92140ee466cSBram Moolenaar  def FuncWithError()
92240ee466cSBram Moolenaar    echomsg g:someJob
92340ee466cSBram Moolenaar  enddef
92440ee466cSBram Moolenaar
92540ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
92640ee466cSBram Moolenaar    try
92740ee466cSBram Moolenaar      call FuncWithError()
92840ee466cSBram Moolenaar    catch
92940ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
93040ee466cSBram Moolenaar    endtry
93140ee466cSBram Moolenaar  endfunc
9322a1381c3SBram Moolenaarendif
93340ee466cSBram Moolenaar
9348a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
9358a7d6542SBram Moolenaar  vim9script
936cfcd011fSBram Moolenaar  var name: string = 'bob'
9378a7d6542SBram Moolenaar  def Concat(arg: string): string
9388a7d6542SBram Moolenaar    return name .. arg
9398a7d6542SBram Moolenaar  enddef
940227a69deSBram Moolenaar  g:result = Concat('bie')
941227a69deSBram Moolenaar  g:localname = name
9428a7d6542SBram Moolenaar
9438a7d6542SBram Moolenaar  export const CONST = 1234
944cfcd011fSBram Moolenaar  export var exported = 9876
945cfcd011fSBram Moolenaar  export var exp_name = 'John'
9468a7d6542SBram Moolenaar  export def Exported(): string
9478a7d6542SBram Moolenaar    return 'Exported'
9488a7d6542SBram Moolenaar  enddef
9490f2a5cc6SBram Moolenaar  export final theList = [1]
9508a7d6542SBram MoolenaarEND
9518a7d6542SBram Moolenaar
952b3ca9824SBram Moolenaardef Undo_export_script_lines()
953b3ca9824SBram Moolenaar  unlet g:result
954b3ca9824SBram Moolenaar  unlet g:localname
955b3ca9824SBram Moolenaarenddef
956b3ca9824SBram Moolenaar
9575269bd2aSBram Moolenaardef Test_vim9_import_export()
958cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
9598a7d6542SBram Moolenaar    vim9script
9608a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
9618a7d6542SBram Moolenaar    g:imported = exported
9626e587dcbSBram Moolenaar    exported += 3
9636e587dcbSBram Moolenaar    g:imported_added = exported
9648a7d6542SBram Moolenaar    g:imported_func = Exported()
9656e587dcbSBram Moolenaar
96640f4f7a4SBram Moolenaar    def GetExported(): string
967e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
96840f4f7a4SBram Moolenaar      return local_dict.ref()
96940f4f7a4SBram Moolenaar    enddef
97040f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
97140f4f7a4SBram Moolenaar
9726e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
9736e587dcbSBram Moolenaar    g:imported_name = exp_name
9746e587dcbSBram Moolenaar    exp_name ..= ' Doe'
9756e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
9765381c7a1SBram Moolenaar    g:imported_later = exported
9770f2a5cc6SBram Moolenaar
9780f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
9790f2a5cc6SBram Moolenaar    theList->add(2)
9800f2a5cc6SBram Moolenaar    assert_equal([1, 2], theList)
9818a7d6542SBram Moolenaar  END
9828a7d6542SBram Moolenaar
9838a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
9848a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
9858a7d6542SBram Moolenaar
9868a7d6542SBram Moolenaar  source Ximport.vim
9878a7d6542SBram Moolenaar
9888a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
9898a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
9908a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
9916e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
9925381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
9938a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
99440f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
9956e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
9966e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
9978a7d6542SBram Moolenaar  assert_false(exists('g:name'))
9988a7d6542SBram Moolenaar
999b3ca9824SBram Moolenaar  Undo_export_script_lines()
10008a7d6542SBram Moolenaar  unlet g:imported
10016e587dcbSBram Moolenaar  unlet g:imported_added
10025381c7a1SBram Moolenaar  unlet g:imported_later
10038a7d6542SBram Moolenaar  unlet g:imported_func
10046e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
10058a7d6542SBram Moolenaar  delete('Ximport.vim')
1006f2d5c240SBram Moolenaar
10071c991144SBram Moolenaar  # similar, with line breaks
1008cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
10091c991144SBram Moolenaar    vim9script
10101c991144SBram Moolenaar    import {
10111c991144SBram Moolenaar        exported,
10121c991144SBram Moolenaar        Exported,
10131c991144SBram Moolenaar        }
10141c991144SBram Moolenaar        from
10151c991144SBram Moolenaar        './Xexport.vim'
10161c991144SBram Moolenaar    g:imported = exported
10171c991144SBram Moolenaar    exported += 5
10181c991144SBram Moolenaar    g:imported_added = exported
10191c991144SBram Moolenaar    g:imported_func = Exported()
10201c991144SBram Moolenaar  END
10211c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
10221c991144SBram Moolenaar  source Ximport_lbr.vim
10231c991144SBram Moolenaar
10241c991144SBram Moolenaar  assert_equal(9876, g:imported)
10251c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
10261c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
10271c991144SBram Moolenaar
10281c991144SBram Moolenaar  # exported script not sourced again
10291c991144SBram Moolenaar  assert_false(exists('g:result'))
10301c991144SBram Moolenaar  unlet g:imported
10311c991144SBram Moolenaar  unlet g:imported_added
10321c991144SBram Moolenaar  unlet g:imported_func
10331c991144SBram Moolenaar  delete('Ximport_lbr.vim')
10341c991144SBram Moolenaar
10351c991144SBram Moolenaar  # import inside :def function
1036cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
10375381c7a1SBram Moolenaar    vim9script
10385381c7a1SBram Moolenaar    def ImportInDef()
10395381c7a1SBram Moolenaar      import exported from './Xexport.vim'
10405381c7a1SBram Moolenaar      g:imported = exported
10415381c7a1SBram Moolenaar      exported += 7
10425381c7a1SBram Moolenaar      g:imported_added = exported
10435381c7a1SBram Moolenaar    enddef
10445381c7a1SBram Moolenaar    ImportInDef()
10455381c7a1SBram Moolenaar  END
10465381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
10475381c7a1SBram Moolenaar  source Ximport2.vim
1048f5be8cdbSBram Moolenaar  # TODO: this should be 9879
10495381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
10505381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
10515381c7a1SBram Moolenaar  unlet g:imported
10525381c7a1SBram Moolenaar  unlet g:imported_added
10535381c7a1SBram Moolenaar  delete('Ximport2.vim')
10545381c7a1SBram Moolenaar
1055cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1056f2d5c240SBram Moolenaar    vim9script
1057f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1058f2d5c240SBram Moolenaar    def UseExport()
1059cb4e80faSBram Moolenaar      g:imported_def = Export.exported
1060f2d5c240SBram Moolenaar    enddef
1061cb4e80faSBram Moolenaar    g:imported_script = Export.exported
1062cb4e80faSBram Moolenaar    assert_equal(1, exists('Export.exported'))
1063cb4e80faSBram Moolenaar    assert_equal(0, exists('Export.notexported'))
1064f2d5c240SBram Moolenaar    UseExport()
1065f2d5c240SBram Moolenaar  END
1066f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1067f2d5c240SBram Moolenaar  source Ximport.vim
1068cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_def)
1069cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_script)
1070f2d5c240SBram Moolenaar
1071cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1072599c89c8SBram Moolenaar    vim9script
1073599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1074599c89c8SBram Moolenaar    def Func()
1075cfcd011fSBram Moolenaar      var dummy = 1
1076cfcd011fSBram Moolenaar      var imported = Export + dummy
1077599c89c8SBram Moolenaar    enddef
1078822ba247SBram Moolenaar    defcompile
1079599c89c8SBram Moolenaar  END
1080599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
108144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1082599c89c8SBram Moolenaar
1083cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1084599c89c8SBram Moolenaar    vim9script
1085599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1086599c89c8SBram Moolenaar    def Func()
1087cfcd011fSBram Moolenaar      var imported = Export . exported
1088599c89c8SBram Moolenaar    enddef
1089822ba247SBram Moolenaar    defcompile
1090599c89c8SBram Moolenaar  END
1091599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
109244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1093599c89c8SBram Moolenaar
1094a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1095a6294955SBram Moolenaar    vim9script
1096a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1097a6294955SBram Moolenaar    var some = 'other'
1098a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1099a6294955SBram Moolenaar    defcompile
1100a6294955SBram Moolenaar  END
1101a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1102a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1103a6294955SBram Moolenaar
1104cb4e80faSBram Moolenaar  var import_star_as_lines_script_no_dot =<< trim END
1105cb4e80faSBram Moolenaar    vim9script
1106cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1107cb4e80faSBram Moolenaar    g:imported_script = Export exported
1108cb4e80faSBram Moolenaar  END
1109cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
1110cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1029:')
1111cb4e80faSBram Moolenaar
1112cb4e80faSBram Moolenaar  var import_star_as_lines_script_space_after_dot =<< trim END
1113cb4e80faSBram Moolenaar    vim9script
1114cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1115cb4e80faSBram Moolenaar    g:imported_script = Export. exported
1116cb4e80faSBram Moolenaar  END
1117cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1118cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1119cb4e80faSBram Moolenaar
1120cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1121599c89c8SBram Moolenaar    vim9script
1122599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1123599c89c8SBram Moolenaar    def Func()
1124cfcd011fSBram Moolenaar      var imported = Export.
1125599c89c8SBram Moolenaar    enddef
1126822ba247SBram Moolenaar    defcompile
1127599c89c8SBram Moolenaar  END
1128599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
112944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1130599c89c8SBram Moolenaar
1131cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
11321c991144SBram Moolenaar    vim9script
11331c991144SBram Moolenaar    import *
11341c991144SBram Moolenaar        as Export
11351c991144SBram Moolenaar        from
11361c991144SBram Moolenaar        './Xexport.vim'
11371c991144SBram Moolenaar    def UseExport()
11381c991144SBram Moolenaar      g:imported = Export.exported
11391c991144SBram Moolenaar    enddef
11401c991144SBram Moolenaar    UseExport()
11411c991144SBram Moolenaar  END
11421c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
11431c991144SBram Moolenaar  source Ximport.vim
11441c991144SBram Moolenaar  assert_equal(9883, g:imported)
11451c991144SBram Moolenaar
1146cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1147f2d5c240SBram Moolenaar    vim9script
1148f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1149f2d5c240SBram Moolenaar  END
1150f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
115144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1152f2d5c240SBram Moolenaar
1153f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1154cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1155fa29c8abSBram Moolenaar    vim9script
1156fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1157fa29c8abSBram Moolenaar  END
1158fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
115944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1160fa29c8abSBram Moolenaar
1161f5be8cdbSBram Moolenaar  # try to import something that is already defined
1162cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
11635269bd2aSBram Moolenaar    vim9script
1164cfcd011fSBram Moolenaar    var exported = 'something'
11655269bd2aSBram Moolenaar    import exported from './Xexport.vim'
11665269bd2aSBram Moolenaar  END
11675269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1168057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11695269bd2aSBram Moolenaar
1170f5be8cdbSBram Moolenaar  # try to import something that is already defined
11715269bd2aSBram Moolenaar  import_already_defined =<< trim END
11725269bd2aSBram Moolenaar    vim9script
1173cfcd011fSBram Moolenaar    var exported = 'something'
11745269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
11755269bd2aSBram Moolenaar  END
11765269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1177057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11785269bd2aSBram Moolenaar
1179f5be8cdbSBram Moolenaar  # try to import something that is already defined
11805269bd2aSBram Moolenaar  import_already_defined =<< trim END
11815269bd2aSBram Moolenaar    vim9script
1182cfcd011fSBram Moolenaar    var exported = 'something'
11835269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
11845269bd2aSBram Moolenaar  END
11855269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1186057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11875269bd2aSBram Moolenaar
1188918a4249SBram Moolenaar  # try changing an imported const
1189918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1190918a4249SBram Moolenaar    vim9script
1191918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1192918a4249SBram Moolenaar    def Assign()
1193918a4249SBram Moolenaar      CONST = 987
1194918a4249SBram Moolenaar    enddef
1195918a4249SBram Moolenaar    defcompile
1196918a4249SBram Moolenaar  END
1197918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1198918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1199918a4249SBram Moolenaar
12000f2a5cc6SBram Moolenaar  # try changing an imported final
12010f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
12020f2a5cc6SBram Moolenaar    vim9script
12030f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
12040f2a5cc6SBram Moolenaar    def Assign()
12050f2a5cc6SBram Moolenaar      theList = [2]
12060f2a5cc6SBram Moolenaar    enddef
12070f2a5cc6SBram Moolenaar    defcompile
12080f2a5cc6SBram Moolenaar  END
12090f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
12100f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
12110f2a5cc6SBram Moolenaar
1212f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1213cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1214fa29c8abSBram Moolenaar    vim9script
1215fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1216fa29c8abSBram Moolenaar  END
1217fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
121844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1219fa29c8abSBram Moolenaar
1220cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1221fa29c8abSBram Moolenaar    vim9script
1222fa29c8abSBram Moolenaar    import name './Xexport.vim'
1223fa29c8abSBram Moolenaar  END
1224fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
122544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1226fa29c8abSBram Moolenaar
1227cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1228fa29c8abSBram Moolenaar    vim9script
1229fa29c8abSBram Moolenaar    import name from Xexport.vim
1230fa29c8abSBram Moolenaar  END
1231fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
123244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1233fa29c8abSBram Moolenaar
1234cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1235fa29c8abSBram Moolenaar    vim9script
1236fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1237fa29c8abSBram Moolenaar  END
1238fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
123944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1240fa29c8abSBram Moolenaar
1241cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1242fa29c8abSBram Moolenaar    vim9script
1243fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1244fa29c8abSBram Moolenaar  END
12455269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
124644d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1247fa29c8abSBram Moolenaar
1248f2d5c240SBram Moolenaar  delete('Ximport.vim')
12495269bd2aSBram Moolenaar  delete('Ximport3.vim')
12508a7d6542SBram Moolenaar  delete('Xexport.vim')
12518a7d6542SBram Moolenaar
1252f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
12533e191694SBram Moolenaar  # Flags added or removed are also applied to the restored value.
12543e191694SBram Moolenaar  set cpo=abcd
1255cfcd011fSBram Moolenaar  var lines =<< trim END
1256750802b5SBram Moolenaar    vim9script
1257750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
12583e191694SBram Moolenaar    set cpo+=f
12593e191694SBram Moolenaar    set cpo-=c
12603e191694SBram Moolenaar    g:cpo_after_vim9script = &cpo
1261750802b5SBram Moolenaar  END
1262750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1263750802b5SBram Moolenaar  source Xvim9_script
12643e191694SBram Moolenaar  assert_equal('fabd', &cpo)
1265750802b5SBram Moolenaar  set cpo&vim
1266750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
12673e191694SBram Moolenaar  var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
12683e191694SBram Moolenaar  assert_equal(newcpo, g:cpo_after_vim9script)
12693e191694SBram Moolenaar
1270750802b5SBram Moolenaar  delete('Xvim9_script')
1271750802b5SBram Moolenaarenddef
1272750802b5SBram Moolenaar
12730a84284eSBram Moolenaardef Test_import_as()
12740a84284eSBram Moolenaar  var export_lines =<< trim END
12750a84284eSBram Moolenaar    vim9script
12760a84284eSBram Moolenaar    export var one = 1
12770a84284eSBram Moolenaar    export var yes = 'yes'
12780a84284eSBram Moolenaar  END
12790a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
12800a84284eSBram Moolenaar
12810a84284eSBram Moolenaar  var import_lines =<< trim END
12820a84284eSBram Moolenaar    vim9script
12830a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
12840a84284eSBram Moolenaar    assert_equal(1, thatOne)
12850a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
12860a84284eSBram Moolenaar    assert_equal('yes', yesYes)
12870a84284eSBram Moolenaar  END
12880a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
12890a84284eSBram Moolenaar
12900a84284eSBram Moolenaar  import_lines =<< trim END
12910a84284eSBram Moolenaar    vim9script
12920a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
12930a84284eSBram Moolenaar    assert_equal(1, thatOne)
12940a84284eSBram Moolenaar    assert_equal('yes', yesYes)
12950a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
12960a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
12970a84284eSBram Moolenaar  END
12980a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
12990a84284eSBram Moolenaar
13000a84284eSBram Moolenaar  delete('XexportAs')
13010a84284eSBram Moolenaarenddef
13020a84284eSBram Moolenaar
1303803af686SBram Moolenaarfunc g:Trigger()
1304803af686SBram Moolenaar  source Ximport.vim
1305803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1306803af686SBram Moolenaarendfunc
1307803af686SBram Moolenaar
1308803af686SBram Moolenaardef Test_import_export_expr_map()
1309803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1310cfcd011fSBram Moolenaar  var export_lines =<< trim END
1311803af686SBram Moolenaar    vim9script
1312803af686SBram Moolenaar    export def That(): string
1313803af686SBram Moolenaar      return 'yes'
1314803af686SBram Moolenaar    enddef
1315803af686SBram Moolenaar  END
1316803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1317803af686SBram Moolenaar
1318cfcd011fSBram Moolenaar  var import_lines =<< trim END
1319803af686SBram Moolenaar    vim9script
1320803af686SBram Moolenaar    import That from './Xexport_that.vim'
1321803af686SBram Moolenaar    assert_equal('yes', That())
1322803af686SBram Moolenaar  END
1323803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1324803af686SBram Moolenaar
1325803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1326803af686SBram Moolenaar  feedkeys('trigger', "xt")
1327803af686SBram Moolenaar
1328730b2483SBram Moolenaar  delete('Xexport_that.vim')
1329803af686SBram Moolenaar  delete('Ximport.vim')
1330803af686SBram Moolenaar  nunmap trigger
1331803af686SBram Moolenaarenddef
1332803af686SBram Moolenaar
13338e1986e3SBram Moolenaardef Test_import_in_filetype()
13348e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
13358e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1336cfcd011fSBram Moolenaar  var export_lines =<< trim END
13378e1986e3SBram Moolenaar    vim9script
1338cfcd011fSBram Moolenaar    export var That = 'yes'
13398e1986e3SBram Moolenaar  END
1340730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
13418e1986e3SBram Moolenaar
1342cfcd011fSBram Moolenaar  var import_lines =<< trim END
13438e1986e3SBram Moolenaar    vim9script
1344730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
13458e1986e3SBram Moolenaar    assert_equal('yes', That)
13468e1986e3SBram Moolenaar    g:did_load_mytpe = 1
13478e1986e3SBram Moolenaar  END
13488e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
13498e1986e3SBram Moolenaar
1350cfcd011fSBram Moolenaar  var save_rtp = &rtp
13518e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
13528e1986e3SBram Moolenaar
13538e1986e3SBram Moolenaar  filetype plugin on
13548e1986e3SBram Moolenaar  copen
13558e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
13568e1986e3SBram Moolenaar
13578e1986e3SBram Moolenaar  quit!
1358730b2483SBram Moolenaar  delete('Xexport_ft.vim')
13598e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
13608e1986e3SBram Moolenaar  &rtp = save_rtp
13618e1986e3SBram Moolenaarenddef
13628e1986e3SBram Moolenaar
1363efa94447SBram Moolenaardef Test_use_import_in_mapping()
1364cfcd011fSBram Moolenaar  var lines =<< trim END
1365efa94447SBram Moolenaar      vim9script
1366efa94447SBram Moolenaar      export def Funcx()
1367efa94447SBram Moolenaar        g:result = 42
1368efa94447SBram Moolenaar      enddef
1369efa94447SBram Moolenaar  END
1370efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1371efa94447SBram Moolenaar  lines =<< trim END
1372efa94447SBram Moolenaar      vim9script
1373efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1374b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1375efa94447SBram Moolenaar  END
1376efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1377efa94447SBram Moolenaar
1378efa94447SBram Moolenaar  source Xmapscript.vim
1379b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1380efa94447SBram Moolenaar  assert_equal(42, g:result)
1381efa94447SBram Moolenaar
1382efa94447SBram Moolenaar  unlet g:result
1383efa94447SBram Moolenaar  delete('XsomeExport.vim')
1384efa94447SBram Moolenaar  delete('Xmapscript.vim')
1385b3ca9824SBram Moolenaar  nunmap <F3>
1386efa94447SBram Moolenaarenddef
1387efa94447SBram Moolenaar
1388d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1389d3f8a9eeSBram Moolenaar  var lines =<< trim END
1390d3f8a9eeSBram Moolenaar    if has(g:feature)
1391d3f8a9eeSBram Moolenaar      " legacy script
1392d3f8a9eeSBram Moolenaar      let g:legacy = 1
1393d3f8a9eeSBram Moolenaar      finish
1394d3f8a9eeSBram Moolenaar    endif
1395d3f8a9eeSBram Moolenaar    vim9script
1396d3f8a9eeSBram Moolenaar    g:legacy = 0
1397d3f8a9eeSBram Moolenaar  END
1398d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1399d3f8a9eeSBram Moolenaar  g:legacy = -1
1400d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1401d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1402d3f8a9eeSBram Moolenaar
1403d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1404d3f8a9eeSBram Moolenaar  g:legacy = -1
1405d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1406d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1407d3f8a9eeSBram Moolenaarenddef
1408d3f8a9eeSBram Moolenaar
1409750802b5SBram Moolenaardef Test_vim9script_fails()
14108a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
14118a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1412cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
14139721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1414cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1415750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1416750802b5SBram Moolenaar
1417cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1418c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1419c785b9a7SBram Moolenaar
1420e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1421e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
14228a7d6542SBram Moolenaarenddef
14238a7d6542SBram Moolenaar
1424f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1425101f4810SBram Moolenaar  CheckRunVimInTerminal
1426101f4810SBram Moolenaar
14279bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1428c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
14299bb3eb3eSBram Moolenaarendfunc
14309bb3eb3eSBram Moolenaar
1431c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1432cfcd011fSBram Moolenaar  var export =<< trim END
1433101f4810SBram Moolenaar    vim9script
1434101f4810SBram Moolenaar    export def Foo(): number
1435101f4810SBram Moolenaar        return 0
1436101f4810SBram Moolenaar    enddef
1437101f4810SBram Moolenaar  END
1438730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1439101f4810SBram Moolenaar
1440e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
14419bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
14422949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1443101f4810SBram Moolenaar
1444730b2483SBram Moolenaar  delete('XexportCmd.vim')
14459bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
14469bb3eb3eSBram Moolenaarenddef
1447101f4810SBram Moolenaar
14482b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
14492b32700dSBram Moolenaar  var lines =<< trim END
1450a6294955SBram Moolenaar    vim9script
1451a6294955SBram Moolenaar    export var exported = 'thexport'
1452a6294955SBram Moolenaar  END
1453a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1454a6294955SBram Moolenaar  lines =<< trim END
14552b32700dSBram Moolenaar    vim9script noclear
14562b32700dSBram Moolenaar    g:loadCount += 1
14572b32700dSBram Moolenaar    var s:reloaded = 'init'
1458a6294955SBram Moolenaar    import exported from './XExportReload'
14592b32700dSBram Moolenaar
14602b32700dSBram Moolenaar    def Again(): string
14612b32700dSBram Moolenaar      return 'again'
14622b32700dSBram Moolenaar    enddef
14632b32700dSBram Moolenaar
14642b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
14652b32700dSBram Moolenaar    var s:loaded = true
14662b32700dSBram Moolenaar
14672b32700dSBram Moolenaar    var s:notReloaded = 'yes'
14682b32700dSBram Moolenaar    s:reloaded = 'first'
14692b32700dSBram Moolenaar    def g:Values(): list<string>
1470a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
14712b32700dSBram Moolenaar    enddef
14722b32700dSBram Moolenaar
14732b32700dSBram Moolenaar    def Once(): string
14742b32700dSBram Moolenaar      return 'once'
14752b32700dSBram Moolenaar    enddef
14762b32700dSBram Moolenaar  END
14772b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
14782b32700dSBram Moolenaar  g:loadCount = 0
14792b32700dSBram Moolenaar  source XReloaded
14802b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1481a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
14822b32700dSBram Moolenaar  source XReloaded
14832b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1484a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
14852b32700dSBram Moolenaar  source XReloaded
14862b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1487a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
14882b32700dSBram Moolenaar
148948e11c10SBram Moolenaar  delete('XReloaded')
1490a6294955SBram Moolenaar  delete('XExportReload')
14912b32700dSBram Moolenaar  delfunc g:Values
14922b32700dSBram Moolenaar  unlet g:loadCount
14932b32700dSBram Moolenaarenddef
14942b32700dSBram Moolenaar
14954c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1496cfcd011fSBram Moolenaar  var lines =<< trim END
14978a7d6542SBram Moolenaar    vim9script
14988a7d6542SBram Moolenaar    const var = ''
1499cfcd011fSBram Moolenaar    var valone = 1234
15008a7d6542SBram Moolenaar    def MyFunc(arg: string)
15018a7d6542SBram Moolenaar       valone = 5678
15028a7d6542SBram Moolenaar    enddef
15038a7d6542SBram Moolenaar  END
1504cfcd011fSBram Moolenaar  var morelines =<< trim END
1505cfcd011fSBram Moolenaar    var valtwo = 222
15068a7d6542SBram Moolenaar    export def GetValtwo(): number
15078a7d6542SBram Moolenaar      return valtwo
15088a7d6542SBram Moolenaar    enddef
15098a7d6542SBram Moolenaar  END
151003afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
15118a7d6542SBram Moolenaar  source Xreload.vim
15128a7d6542SBram Moolenaar  source Xreload.vim
15138a7d6542SBram Moolenaar  source Xreload.vim
15148a7d6542SBram Moolenaar
1515cfcd011fSBram Moolenaar  var testlines =<< trim END
15168a7d6542SBram Moolenaar    vim9script
15178a7d6542SBram Moolenaar    def TheFunc()
15188a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
15198a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
15208a7d6542SBram Moolenaar    enddef
15218a7d6542SBram Moolenaar    TheFunc()
15228a7d6542SBram Moolenaar  END
15238a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
15248a7d6542SBram Moolenaar  source Ximport.vim
15258a7d6542SBram Moolenaar
1526f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1527f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
15288a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15298a7d6542SBram Moolenaar  source Ximport.vim
15308a7d6542SBram Moolenaar
1531f5be8cdbSBram Moolenaar  # cannot declare a var twice
15328a7d6542SBram Moolenaar  lines =<< trim END
15338a7d6542SBram Moolenaar    vim9script
1534cfcd011fSBram Moolenaar    var valone = 1234
1535cfcd011fSBram Moolenaar    var valone = 5678
15368a7d6542SBram Moolenaar  END
15378a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
153844d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
15398a7d6542SBram Moolenaar
15408a7d6542SBram Moolenaar  delete('Xreload.vim')
15418a7d6542SBram Moolenaar  delete('Ximport.vim')
15428a7d6542SBram Moolenaarenddef
15438a7d6542SBram Moolenaar
154407a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
154507a65d26SBram Moolenaar" compiled function using that variable must fail.
154607a65d26SBram Moolenaardef Test_script_reload_change_type()
154707a65d26SBram Moolenaar  var lines =<< trim END
154807a65d26SBram Moolenaar    vim9script noclear
154907a65d26SBram Moolenaar    var str = 'string'
155007a65d26SBram Moolenaar    def g:GetStr(): string
155107a65d26SBram Moolenaar      return str .. 'xxx'
155207a65d26SBram Moolenaar    enddef
155307a65d26SBram Moolenaar  END
155407a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
155507a65d26SBram Moolenaar  source Xreload.vim
155607a65d26SBram Moolenaar  echo g:GetStr()
155707a65d26SBram Moolenaar
155807a65d26SBram Moolenaar  lines =<< trim END
155907a65d26SBram Moolenaar    vim9script noclear
156007a65d26SBram Moolenaar    var str = 1234
156107a65d26SBram Moolenaar  END
156207a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
156307a65d26SBram Moolenaar  source Xreload.vim
156407a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
156507a65d26SBram Moolenaar
156607a65d26SBram Moolenaar  delfunc g:GetStr
156707a65d26SBram Moolenaar  delete('Xreload.vim')
156807a65d26SBram Moolenaarenddef
156907a65d26SBram Moolenaar
1570c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled
1571c970e422SBram Moolenaarcommand CallFunc echo 'nop'
1572c970e422SBram Moolenaar
1573c970e422SBram Moolenaardef Test_script_reload_from_function()
1574c970e422SBram Moolenaar  var lines =<< trim END
1575c970e422SBram Moolenaar      vim9script
1576c970e422SBram Moolenaar
1577c970e422SBram Moolenaar      if exists('g:loaded')
1578c970e422SBram Moolenaar        finish
1579c970e422SBram Moolenaar      endif
1580c970e422SBram Moolenaar      g:loaded = 1
1581c970e422SBram Moolenaar      delcommand CallFunc
1582c970e422SBram Moolenaar      command CallFunc Func()
1583c970e422SBram Moolenaar      def Func()
1584a4c81beaSBram Moolenaar        so XreloadFunc.vim
1585c970e422SBram Moolenaar        g:didTheFunc = 1
1586c970e422SBram Moolenaar      enddef
1587c970e422SBram Moolenaar  END
1588c970e422SBram Moolenaar  writefile(lines, 'XreloadFunc.vim')
1589c970e422SBram Moolenaar  source XreloadFunc.vim
1590c970e422SBram Moolenaar  CallFunc
1591c970e422SBram Moolenaar  assert_equal(1, g:didTheFunc)
1592c970e422SBram Moolenaar
1593c970e422SBram Moolenaar  delete('XreloadFunc.vim')
1594c970e422SBram Moolenaar  delcommand CallFunc
1595c970e422SBram Moolenaar  unlet g:loaded
1596c970e422SBram Moolenaar  unlet g:didTheFunc
1597c970e422SBram Moolenaarenddef
1598c970e422SBram Moolenaar
15996c3843caSBram Moolenaardef Test_script_var_shadows_function()
16006c3843caSBram Moolenaar  var lines =<< trim END
16016c3843caSBram Moolenaar      vim9script
16026c3843caSBram Moolenaar      def Func(): number
16036c3843caSBram Moolenaar        return 123
16046c3843caSBram Moolenaar      enddef
16056c3843caSBram Moolenaar      var Func = 1
16066c3843caSBram Moolenaar  END
16076c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
16086c3843caSBram Moolenaarenddef
16096c3843caSBram Moolenaar
161095006e3dSBram Moolenaardef s:RetSome(): string
161195006e3dSBram Moolenaar  return 'some'
161295006e3dSBram Moolenaarenddef
161395006e3dSBram Moolenaar
1614fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1615fe465a01SBram Moolenaar" script-local name.
1616fe465a01SBram Moolenaardef Test_vim9script_funcref()
1617cfcd011fSBram Moolenaar  var sortlines =<< trim END
1618fe465a01SBram Moolenaar      vim9script
1619fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1620bed36b93SBram Moolenaar        return i2 - i1
1621fe465a01SBram Moolenaar      enddef
1622fe465a01SBram Moolenaar
1623fe465a01SBram Moolenaar      export def FastSort(): list<number>
1624fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1625fe465a01SBram Moolenaar      enddef
1626fe465a01SBram Moolenaar  END
1627fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1628fe465a01SBram Moolenaar
1629cfcd011fSBram Moolenaar  var lines =<< trim END
1630fe465a01SBram Moolenaar    vim9script
1631fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1632fe465a01SBram Moolenaar    def Test()
1633fe465a01SBram Moolenaar      g:result = FastSort()
1634fe465a01SBram Moolenaar    enddef
1635fe465a01SBram Moolenaar    Test()
1636fe465a01SBram Moolenaar  END
1637fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1638fe465a01SBram Moolenaar
1639fe465a01SBram Moolenaar  source Xscript.vim
1640fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1641fe465a01SBram Moolenaar
1642fe465a01SBram Moolenaar  unlet g:result
1643fe465a01SBram Moolenaar  delete('Xsort.vim')
1644fe465a01SBram Moolenaar  delete('Xscript.vim')
164595006e3dSBram Moolenaar
1646cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
164795006e3dSBram Moolenaar  assert_equal('some', Funcref())
1648fe465a01SBram Moolenaarenddef
1649fe465a01SBram Moolenaar
1650601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1651601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1652601e76acSBram Moolenaar" function reference.
1653c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1654cfcd011fSBram Moolenaar  var filterLines =<< trim END
1655c620c055SBram Moolenaar    vim9script
1656c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1657c620c055SBram Moolenaar      return idx % 2 == 1
1658c620c055SBram Moolenaar    enddef
1659c620c055SBram Moolenaar    export def FastFilter(): list<number>
1660c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1661c620c055SBram Moolenaar    enddef
1662601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1663601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1664601e76acSBram Moolenaar    enddef
1665c620c055SBram Moolenaar  END
1666c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1667c620c055SBram Moolenaar
1668cfcd011fSBram Moolenaar  var lines =<< trim END
1669c620c055SBram Moolenaar    vim9script
1670601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1671c620c055SBram Moolenaar    def Test()
1672cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1673c620c055SBram Moolenaar    enddef
1674c620c055SBram Moolenaar    Test()
1675601e76acSBram Moolenaar    def TestDirect()
1676cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1677601e76acSBram Moolenaar    enddef
1678601e76acSBram Moolenaar    TestDirect()
1679c620c055SBram Moolenaar  END
1680601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1681c620c055SBram Moolenaar  delete('Xfilter.vim')
1682c620c055SBram Moolenaarenddef
1683c620c055SBram Moolenaar
16844c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1685cfcd011fSBram Moolenaar  var first_lines =<< trim END
16864c17ad94SBram Moolenaar    vim9script
16874c17ad94SBram Moolenaar    def FuncYes(): string
16884c17ad94SBram Moolenaar      return 'yes'
16894c17ad94SBram Moolenaar    enddef
16904c17ad94SBram Moolenaar  END
1691cfcd011fSBram Moolenaar  var withno_lines =<< trim END
16924c17ad94SBram Moolenaar    def FuncNo(): string
16934c17ad94SBram Moolenaar      return 'no'
16944c17ad94SBram Moolenaar    enddef
16954c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
16964c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
16974c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
169803afdcf1SBram Moolenaar    enddef
169903afdcf1SBram Moolenaar  END
1700cfcd011fSBram Moolenaar  var nono_lines =<< trim END
170103afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
170203afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
170344d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
17044c17ad94SBram Moolenaar    enddef
17054c17ad94SBram Moolenaar  END
17064c17ad94SBram Moolenaar
17074c17ad94SBram Moolenaar  # FuncNo() is defined
170803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17094c17ad94SBram Moolenaar  source Xreloaded.vim
17104c17ad94SBram Moolenaar  g:DoCheck(true)
17114c17ad94SBram Moolenaar
17124c17ad94SBram Moolenaar  # FuncNo() is not redefined
171303afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
17144c17ad94SBram Moolenaar  source Xreloaded.vim
17155082471fSBram Moolenaar  g:DoCheck(false)
17164c17ad94SBram Moolenaar
17174c17ad94SBram Moolenaar  # FuncNo() is back
171803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17194c17ad94SBram Moolenaar  source Xreloaded.vim
17205082471fSBram Moolenaar  g:DoCheck(false)
17214c17ad94SBram Moolenaar
17224c17ad94SBram Moolenaar  delete('Xreloaded.vim')
17234c17ad94SBram Moolenaarenddef
17244c17ad94SBram Moolenaar
172589483d40SBram Moolenaardef Test_vim9script_reload_delvar()
172689483d40SBram Moolenaar  # write the script with a script-local variable
1727cfcd011fSBram Moolenaar  var lines =<< trim END
172889483d40SBram Moolenaar    vim9script
1729cfcd011fSBram Moolenaar    var name = 'string'
173089483d40SBram Moolenaar  END
173189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
173289483d40SBram Moolenaar  source XreloadVar.vim
173389483d40SBram Moolenaar
173489483d40SBram Moolenaar  # now write the script using the same variable locally - works
173589483d40SBram Moolenaar  lines =<< trim END
173689483d40SBram Moolenaar    vim9script
173789483d40SBram Moolenaar    def Func()
1738cfcd011fSBram Moolenaar      var name = 'string'
173989483d40SBram Moolenaar    enddef
174089483d40SBram Moolenaar  END
174189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
174289483d40SBram Moolenaar  source XreloadVar.vim
174389483d40SBram Moolenaar
174489483d40SBram Moolenaar  delete('XreloadVar.vim')
174589483d40SBram Moolenaarenddef
174689483d40SBram Moolenaar
17478a7d6542SBram Moolenaardef Test_import_absolute()
1748cfcd011fSBram Moolenaar  var import_lines = [
1749e6085c53SBram Moolenaar        'vim9script',
1750e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1751e6085c53SBram Moolenaar        'def UseExported()',
1752e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1753e6085c53SBram Moolenaar        '  exported = 8888',
1754e6085c53SBram Moolenaar        '  g:imported_after = exported',
1755e6085c53SBram Moolenaar        'enddef',
1756e6085c53SBram Moolenaar        'UseExported()',
1757e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1758e6085c53SBram Moolenaar        ]
17598a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
17608a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
17618a7d6542SBram Moolenaar
17628a7d6542SBram Moolenaar  source Ximport_abs.vim
17638a7d6542SBram Moolenaar
17648a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
17654e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1766fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1767fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1768fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1769fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1770fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1771fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1772fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1773fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1774fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1775fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1776e6085c53SBram Moolenaar        g:import_disassembled)
1777b3ca9824SBram Moolenaar
1778b3ca9824SBram Moolenaar  Undo_export_script_lines()
17798a7d6542SBram Moolenaar  unlet g:imported_abs
17804e12a5dfSBram Moolenaar  unlet g:import_disassembled
17818a7d6542SBram Moolenaar
17828a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
17838a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
17848a7d6542SBram Moolenaarenddef
17858a7d6542SBram Moolenaar
17868a7d6542SBram Moolenaardef Test_import_rtp()
1787cfcd011fSBram Moolenaar  var import_lines = [
1788e6085c53SBram Moolenaar        'vim9script',
1789e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1790e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1791e6085c53SBram Moolenaar        ]
17928a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
17938a7d6542SBram Moolenaar  mkdir('import')
17948a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
17958a7d6542SBram Moolenaar
1796cfcd011fSBram Moolenaar  var save_rtp = &rtp
17978a7d6542SBram Moolenaar  &rtp = getcwd()
17988a7d6542SBram Moolenaar  source Ximport_rtp.vim
17998a7d6542SBram Moolenaar  &rtp = save_rtp
18008a7d6542SBram Moolenaar
18018a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
18028a7d6542SBram Moolenaar
1803b3ca9824SBram Moolenaar  Undo_export_script_lines()
1804b3ca9824SBram Moolenaar  unlet g:imported_rtp
18058a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
180689483d40SBram Moolenaar  delete('import', 'rf')
18078a7d6542SBram Moolenaarenddef
18088a7d6542SBram Moolenaar
180925e0f586SBram Moolenaardef Test_import_compile_error()
1810cfcd011fSBram Moolenaar  var export_lines = [
181125e0f586SBram Moolenaar        'vim9script',
181225e0f586SBram Moolenaar        'export def ExpFunc(): string',
181325e0f586SBram Moolenaar        '  return notDefined',
181425e0f586SBram Moolenaar        'enddef',
181525e0f586SBram Moolenaar        ]
181625e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
181725e0f586SBram Moolenaar
1818cfcd011fSBram Moolenaar  var import_lines = [
181925e0f586SBram Moolenaar        'vim9script',
182025e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
182125e0f586SBram Moolenaar        'def ImpFunc()',
182225e0f586SBram Moolenaar        '  echo ExpFunc()',
182325e0f586SBram Moolenaar        'enddef',
182425e0f586SBram Moolenaar        'defcompile',
182525e0f586SBram Moolenaar        ]
182625e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
182725e0f586SBram Moolenaar
182825e0f586SBram Moolenaar  try
182925e0f586SBram Moolenaar    source Ximport.vim
183025e0f586SBram Moolenaar  catch /E1001/
1831f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
18327707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
183325e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
183425e0f586SBram Moolenaar  endtry
183525e0f586SBram Moolenaar
183625e0f586SBram Moolenaar  delete('Xexported.vim')
183725e0f586SBram Moolenaar  delete('Ximport.vim')
183825e0f586SBram Moolenaarenddef
183925e0f586SBram Moolenaar
1840c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1841cfcd011fSBram Moolenaar  var lines = [
1842c4ce36d4SBram Moolenaar        'vim9script',
1843c4ce36d4SBram Moolenaar        'def Func()',
1844c4ce36d4SBram Moolenaar        '  eval [][0]',
1845c4ce36d4SBram Moolenaar        'enddef',
1846c4ce36d4SBram Moolenaar        'Func()',
1847c4ce36d4SBram Moolenaar        ]
1848c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1849c4ce36d4SBram Moolenaar
1850c4ce36d4SBram Moolenaar  for count in range(3)
1851c4ce36d4SBram Moolenaar    try
1852c4ce36d4SBram Moolenaar      source Xtestscript.vim
1853c4ce36d4SBram Moolenaar    catch /E684/
1854c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1855c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1856c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1857c4ce36d4SBram Moolenaar    endtry
1858c4ce36d4SBram Moolenaar  endfor
1859c4ce36d4SBram Moolenaar
1860c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1861c4ce36d4SBram Moolenaarenddef
1862c4ce36d4SBram Moolenaar
1863eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1864cfcd011fSBram Moolenaar  var export_lines =<< trim END
1865eef2102eSBram Moolenaar      vim9script
1866eef2102eSBram Moolenaar      export def Func()
1867eef2102eSBram Moolenaar        echo 'imported'
1868eef2102eSBram Moolenaar      enddef
1869eef2102eSBram Moolenaar  END
1870eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1871eef2102eSBram Moolenaar
1872cfcd011fSBram Moolenaar  var lines =<< trim END
1873eef2102eSBram Moolenaar    vim9script
1874eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1875eef2102eSBram Moolenaar    def Func()
1876eef2102eSBram Moolenaar      echo 'local to function'
1877eef2102eSBram Moolenaar    enddef
1878eef2102eSBram Moolenaar  END
1879eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1880eef2102eSBram Moolenaar
1881eef2102eSBram Moolenaar  lines =<< trim END
1882eef2102eSBram Moolenaar    vim9script
1883eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1884eef2102eSBram Moolenaar    def Outer()
1885eef2102eSBram Moolenaar      def Func()
1886eef2102eSBram Moolenaar        echo 'local to function'
1887eef2102eSBram Moolenaar      enddef
1888eef2102eSBram Moolenaar    enddef
1889eef2102eSBram Moolenaar    defcompile
1890eef2102eSBram Moolenaar  END
1891eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1892eef2102eSBram Moolenaar
1893eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1894eef2102eSBram Moolenaarenddef
1895eef2102eSBram Moolenaar
1896b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1897cfcd011fSBram Moolenaar  var lines =<< trim END
1898b9a2cac3SBram Moolenaar    vim9script
1899b9a2cac3SBram Moolenaar    def Func()
1900b9a2cac3SBram Moolenaar      echo 'one'
1901b9a2cac3SBram Moolenaar    enddef
1902b9a2cac3SBram Moolenaar    def Func()
1903b9a2cac3SBram Moolenaar      echo 'two'
1904b9a2cac3SBram Moolenaar    enddef
1905b9a2cac3SBram Moolenaar  END
1906b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1907fa211f3cSBram Moolenaar
1908fa211f3cSBram Moolenaar  lines =<< trim END
1909fa211f3cSBram Moolenaar    vim9script
1910fa211f3cSBram Moolenaar    def Foo(): string
1911fa211f3cSBram Moolenaar      return 'foo'
1912fa211f3cSBram Moolenaar      enddef
1913fa211f3cSBram Moolenaar    def Func()
1914cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1915fa211f3cSBram Moolenaar    enddef
1916fa211f3cSBram Moolenaar    defcompile
1917fa211f3cSBram Moolenaar  END
1918fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1919b9a2cac3SBram Moolenaarenddef
1920b9a2cac3SBram Moolenaar
19218a7d6542SBram Moolenaardef Test_fixed_size_list()
1922f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1923cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
19248a7d6542SBram Moolenaar  l->remove(0)
19258a7d6542SBram Moolenaar  l->add(5)
19268a7d6542SBram Moolenaar  l->insert(99, 1)
19270f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
19288a7d6542SBram Moolenaarenddef
19298a7d6542SBram Moolenaar
1930ae616494SBram Moolenaardef Test_no_insert_xit()
1931d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1932d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1933d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1934d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1935d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1936ae616494SBram Moolenaar
1937ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1938ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1939ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1940ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1941f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1942f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
19436508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
19446508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
1945f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1946f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1947f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1948ae616494SBram Moolenaarenddef
1949ae616494SBram Moolenaar
1950158906cfSBram Moolenaardef IfElse(what: number): string
1951cfcd011fSBram Moolenaar  var res = ''
1952158906cfSBram Moolenaar  if what == 1
1953158906cfSBram Moolenaar    res = "one"
1954158906cfSBram Moolenaar  elseif what == 2
1955158906cfSBram Moolenaar    res = "two"
1956a259d8d3SBram Moolenaar  else
1957158906cfSBram Moolenaar    res = "three"
1958a259d8d3SBram Moolenaar  endif
1959158906cfSBram Moolenaar  return res
1960a259d8d3SBram Moolenaarenddef
1961a259d8d3SBram Moolenaar
1962158906cfSBram Moolenaardef Test_if_elseif_else()
1963158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1964158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1965158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
19660f18b6d1SBram Moolenaarenddef
19670f18b6d1SBram Moolenaar
1968e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1969d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1970d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1971d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1972ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1973d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
19746628b7ebSBram Moolenaar
19756628b7ebSBram Moolenaar  var lines =<< trim END
19766628b7ebSBram Moolenaar      var s = ''
19776628b7ebSBram Moolenaar      if s = ''
19786628b7ebSBram Moolenaar      endif
19796628b7ebSBram Moolenaar  END
19806628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
19816628b7ebSBram Moolenaar
19826628b7ebSBram Moolenaar  lines =<< trim END
19836628b7ebSBram Moolenaar      var s = ''
19846628b7ebSBram Moolenaar      if s == ''
19856628b7ebSBram Moolenaar      elseif s = ''
19866628b7ebSBram Moolenaar      endif
19876628b7ebSBram Moolenaar  END
19886628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
1989e8c4abbbSBram Moolenaarenddef
1990e8c4abbbSBram Moolenaar
19916d69bf60SBram Moolenaarlet g:bool_true = v:true
19926d69bf60SBram Moolenaarlet g:bool_false = v:false
19936d69bf60SBram Moolenaar
19946d69bf60SBram Moolenaardef Test_if_const_expr()
1995cfcd011fSBram Moolenaar  var res = false
19966d69bf60SBram Moolenaar  if true ? true : false
19976d69bf60SBram Moolenaar    res = true
19986d69bf60SBram Moolenaar  endif
19996d69bf60SBram Moolenaar  assert_equal(true, res)
20006d69bf60SBram Moolenaar
2001585fea7bSBram Moolenaar  g:glob = 2
2002585fea7bSBram Moolenaar  if false
20036797966dSBram Moolenaar    execute('g:glob = 3')
2004585fea7bSBram Moolenaar  endif
2005585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2006585fea7bSBram Moolenaar  if true
20076797966dSBram Moolenaar    execute('g:glob = 3')
2008585fea7bSBram Moolenaar  endif
2009585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2010585fea7bSBram Moolenaar
20116d69bf60SBram Moolenaar  res = false
20126d69bf60SBram Moolenaar  if g:bool_true ? true : false
20136d69bf60SBram Moolenaar    res = true
20146d69bf60SBram Moolenaar  endif
20156d69bf60SBram Moolenaar  assert_equal(true, res)
20166d69bf60SBram Moolenaar
20176d69bf60SBram Moolenaar  res = false
20186d69bf60SBram Moolenaar  if true ? g:bool_true : false
20196d69bf60SBram Moolenaar    res = true
20206d69bf60SBram Moolenaar  endif
20216d69bf60SBram Moolenaar  assert_equal(true, res)
20226d69bf60SBram Moolenaar
20236d69bf60SBram Moolenaar  res = false
20246d69bf60SBram Moolenaar  if true ? true : g:bool_false
20256d69bf60SBram Moolenaar    res = true
20266d69bf60SBram Moolenaar  endif
20276d69bf60SBram Moolenaar  assert_equal(true, res)
20286d69bf60SBram Moolenaar
20296d69bf60SBram Moolenaar  res = false
20306d69bf60SBram Moolenaar  if true ? false : true
20316d69bf60SBram Moolenaar    res = true
20326d69bf60SBram Moolenaar  endif
20336d69bf60SBram Moolenaar  assert_equal(false, res)
20346d69bf60SBram Moolenaar
20356d69bf60SBram Moolenaar  res = false
20366d69bf60SBram Moolenaar  if false ? false : true
20376d69bf60SBram Moolenaar    res = true
20386d69bf60SBram Moolenaar  endif
20396d69bf60SBram Moolenaar  assert_equal(true, res)
20406d69bf60SBram Moolenaar
20416d69bf60SBram Moolenaar  res = false
20426d69bf60SBram Moolenaar  if false ? true : false
20436d69bf60SBram Moolenaar    res = true
20446d69bf60SBram Moolenaar  endif
20456d69bf60SBram Moolenaar  assert_equal(false, res)
20466d69bf60SBram Moolenaar
20476d69bf60SBram Moolenaar  res = false
2048e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2049e8c4abbbSBram Moolenaar    res = true
2050e8c4abbbSBram Moolenaar  endif
2051e8c4abbbSBram Moolenaar  assert_equal(false, res)
2052e8c4abbbSBram Moolenaar
2053e8c4abbbSBram Moolenaar  res = false
20546d69bf60SBram Moolenaar  if true && true
20556d69bf60SBram Moolenaar    res = true
20566d69bf60SBram Moolenaar  endif
20576d69bf60SBram Moolenaar  assert_equal(true, res)
20586d69bf60SBram Moolenaar
20596d69bf60SBram Moolenaar  res = false
20606d69bf60SBram Moolenaar  if true && false
20616d69bf60SBram Moolenaar    res = true
20626d69bf60SBram Moolenaar  endif
20636d69bf60SBram Moolenaar  assert_equal(false, res)
20646d69bf60SBram Moolenaar
20656d69bf60SBram Moolenaar  res = false
20666d69bf60SBram Moolenaar  if g:bool_true && false
20676d69bf60SBram Moolenaar    res = true
20686d69bf60SBram Moolenaar  endif
20696d69bf60SBram Moolenaar  assert_equal(false, res)
20706d69bf60SBram Moolenaar
20716d69bf60SBram Moolenaar  res = false
20726d69bf60SBram Moolenaar  if true && g:bool_false
20736d69bf60SBram Moolenaar    res = true
20746d69bf60SBram Moolenaar  endif
20756d69bf60SBram Moolenaar  assert_equal(false, res)
20766d69bf60SBram Moolenaar
20776d69bf60SBram Moolenaar  res = false
20786d69bf60SBram Moolenaar  if false && false
20796d69bf60SBram Moolenaar    res = true
20806d69bf60SBram Moolenaar  endif
20816d69bf60SBram Moolenaar  assert_equal(false, res)
20826d69bf60SBram Moolenaar
20836d69bf60SBram Moolenaar  res = false
20846d69bf60SBram Moolenaar  if true || false
20856d69bf60SBram Moolenaar    res = true
20866d69bf60SBram Moolenaar  endif
20876d69bf60SBram Moolenaar  assert_equal(true, res)
20886d69bf60SBram Moolenaar
20896d69bf60SBram Moolenaar  res = false
20906d69bf60SBram Moolenaar  if g:bool_true || false
20916d69bf60SBram Moolenaar    res = true
20926d69bf60SBram Moolenaar  endif
20936d69bf60SBram Moolenaar  assert_equal(true, res)
20946d69bf60SBram Moolenaar
20956d69bf60SBram Moolenaar  res = false
20966d69bf60SBram Moolenaar  if true || g:bool_false
20976d69bf60SBram Moolenaar    res = true
20986d69bf60SBram Moolenaar  endif
20996d69bf60SBram Moolenaar  assert_equal(true, res)
21006d69bf60SBram Moolenaar
21016d69bf60SBram Moolenaar  res = false
21026d69bf60SBram Moolenaar  if false || false
21036d69bf60SBram Moolenaar    res = true
21046d69bf60SBram Moolenaar  endif
21056d69bf60SBram Moolenaar  assert_equal(false, res)
21063988f64fSBram Moolenaar
21073988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
21083988f64fSBram Moolenaar  if false | eval 0 | endif
21093988f64fSBram Moolenaar  if false | eval burp + 234 | endif
21103988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
21113988f64fSBram Moolenaar  if false
21123988f64fSBram Moolenaar    burp
21133988f64fSBram Moolenaar  endif
211480c34ca3SBram Moolenaarenddef
21156d69bf60SBram Moolenaar
211680c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2117d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2118d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2119d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2120d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
21216d69bf60SBram Moolenaarenddef
21226d69bf60SBram Moolenaar
212372abcf42SBram Moolenaardef RunNested(i: number): number
2124cfcd011fSBram Moolenaar  var x: number = 0
212572abcf42SBram Moolenaar  if i % 2
212672abcf42SBram Moolenaar    if 1
2127f5be8cdbSBram Moolenaar      # comment
212872abcf42SBram Moolenaar    else
2129f5be8cdbSBram Moolenaar      # comment
213072abcf42SBram Moolenaar    endif
213172abcf42SBram Moolenaar    x += 1
213272abcf42SBram Moolenaar  else
213372abcf42SBram Moolenaar    x += 1000
213472abcf42SBram Moolenaar  endif
213572abcf42SBram Moolenaar  return x
213672abcf42SBram Moolenaarenddef
213772abcf42SBram Moolenaar
213872abcf42SBram Moolenaardef Test_nested_if()
213972abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
214072abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
214172abcf42SBram Moolenaarenddef
214272abcf42SBram Moolenaar
2143ad39c094SBram Moolenaardef Test_execute_cmd()
2144e4984290SBram Moolenaar  # missing argument is ignored
2145e4984290SBram Moolenaar  execute
2146e4984290SBram Moolenaar  execute # comment
2147e4984290SBram Moolenaar
2148ad39c094SBram Moolenaar  new
2149ad39c094SBram Moolenaar  setline(1, 'default')
2150d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2151ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2152a72cfb80SBram Moolenaar
2153d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2154a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2155a72cfb80SBram Moolenaar
2156cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2157cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2158a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2159ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2160a72cfb80SBram Moolenaar
2161d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2162ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2163a72cfb80SBram Moolenaar
2164cfcd011fSBram Moolenaar  var cmd_first = 'call '
2165cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2166ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2167ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2168ad39c094SBram Moolenaar  bwipe!
2169585fea7bSBram Moolenaar
2170cfcd011fSBram Moolenaar  var n = true
21712d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
21722d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
21732d6b20d6SBram Moolenaar
2174e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2175e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2176e5abf7afSBram Moolenaar
2177d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2178d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2179d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2180ad39c094SBram Moolenaarenddef
2181ad39c094SBram Moolenaar
218247e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2183f5be8cdbSBram Moolenaar  # only checks line continuation
2184cfcd011fSBram Moolenaar  var lines =<< trim END
218547e880d6SBram Moolenaar      vim9script
218647e880d6SBram Moolenaar      execute 'g:someVar'
218747e880d6SBram Moolenaar                .. ' = ' ..
218847e880d6SBram Moolenaar                   '28'
218947e880d6SBram Moolenaar      assert_equal(28, g:someVar)
219047e880d6SBram Moolenaar      unlet g:someVar
219147e880d6SBram Moolenaar  END
219247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
219347e880d6SBram Moolenaarenddef
219447e880d6SBram Moolenaar
2195ad39c094SBram Moolenaardef Test_echo_cmd()
2196a72cfb80SBram Moolenaar  echo 'some' # comment
2197585fea7bSBram Moolenaar  echon 'thing'
2198ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2199ad39c094SBram Moolenaar
2200a72cfb80SBram Moolenaar  echo "some" # comment
2201a72cfb80SBram Moolenaar  echon "thing"
2202a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2203a72cfb80SBram Moolenaar
2204cfcd011fSBram Moolenaar  var str1 = 'some'
2205cfcd011fSBram Moolenaar  var str2 = 'more'
2206ad39c094SBram Moolenaar  echo str1 str2
2207ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2208a72cfb80SBram Moolenaar
2209d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2210ad39c094SBram Moolenaarenddef
2211ad39c094SBram Moolenaar
2212f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2213f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2214f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2215f93c7feaSBram Moolenaar  echo 'clear'
2216df069eecSBram Moolenaar  :1messages
2217f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2218f93c7feaSBram Moolenaar
2219d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2220f93c7feaSBram Moolenaarenddef
2221f93c7feaSBram Moolenaar
222247e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2223f5be8cdbSBram Moolenaar  # only checks line continuation
2224cfcd011fSBram Moolenaar  var lines =<< trim END
222547e880d6SBram Moolenaar      vim9script
222647e880d6SBram Moolenaar      echomsg 'here'
222747e880d6SBram Moolenaar                .. ' is ' ..
222847e880d6SBram Moolenaar                   'a message'
222947e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
223047e880d6SBram Moolenaar  END
223147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
223247e880d6SBram Moolenaarenddef
223347e880d6SBram Moolenaar
2234f93c7feaSBram Moolenaardef Test_echoerr_cmd()
223540ee466cSBram Moolenaar  try
223640ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
223740ee466cSBram Moolenaar  catch
223840ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
223940ee466cSBram Moolenaar  endtry
2240f93c7feaSBram Moolenaarenddef
2241f93c7feaSBram Moolenaar
224247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2243f5be8cdbSBram Moolenaar  # only checks line continuation
2244cfcd011fSBram Moolenaar  var lines =<< trim END
224547e880d6SBram Moolenaar      vim9script
224647e880d6SBram Moolenaar      try
224747e880d6SBram Moolenaar        echoerr 'this'
224847e880d6SBram Moolenaar                .. ' is ' ..
224947e880d6SBram Moolenaar                   'wrong'
225047e880d6SBram Moolenaar      catch
225147e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
225247e880d6SBram Moolenaar      endtry
225347e880d6SBram Moolenaar  END
225447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
225547e880d6SBram Moolenaarenddef
225647e880d6SBram Moolenaar
225741fe0617SBram Moolenaardef Test_for_outside_of_function()
2258cfcd011fSBram Moolenaar  var lines =<< trim END
225941fe0617SBram Moolenaar    vim9script
226041fe0617SBram Moolenaar    new
226141fe0617SBram Moolenaar    for var in range(0, 3)
226241fe0617SBram Moolenaar      append(line('$'), var)
226341fe0617SBram Moolenaar    endfor
226441fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
226541fe0617SBram Moolenaar    bwipe!
2266522eefd9SBram Moolenaar
2267522eefd9SBram Moolenaar    var result = ''
2268522eefd9SBram Moolenaar    for i in [1, 2, 3]
2269522eefd9SBram Moolenaar      var loop = ' loop ' .. i
2270522eefd9SBram Moolenaar      result ..= loop
2271522eefd9SBram Moolenaar    endfor
2272522eefd9SBram Moolenaar    assert_equal(' loop 1 loop 2 loop 3', result)
227341fe0617SBram Moolenaar  END
227441fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
227541fe0617SBram Moolenaar  source Xvim9for.vim
227641fe0617SBram Moolenaar  delete('Xvim9for.vim')
227741fe0617SBram Moolenaarenddef
22788a7d6542SBram Moolenaar
2279e8c4abbbSBram Moolenaardef Test_for_loop()
2280cfcd011fSBram Moolenaar  var result = ''
2281e8c4abbbSBram Moolenaar  for cnt in range(7)
2282e8c4abbbSBram Moolenaar    if cnt == 4
2283e8c4abbbSBram Moolenaar      break
2284e8c4abbbSBram Moolenaar    endif
2285e8c4abbbSBram Moolenaar    if cnt == 2
2286e8c4abbbSBram Moolenaar      continue
2287e8c4abbbSBram Moolenaar    endif
2288e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2289e8c4abbbSBram Moolenaar  endfor
2290e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
22910ad3e894SBram Moolenaar
2292cfcd011fSBram Moolenaar  var concat = ''
22930ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
22940ad3e894SBram Moolenaar    concat ..= str
22950ad3e894SBram Moolenaar  endfor
22960ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
229738bd8de5SBram Moolenaar
229838bd8de5SBram Moolenaar  var total = 0
229938bd8de5SBram Moolenaar  for nr in
230038bd8de5SBram Moolenaar      [1, 2, 3]
230138bd8de5SBram Moolenaar    total += nr
230238bd8de5SBram Moolenaar  endfor
230338bd8de5SBram Moolenaar  assert_equal(6, total)
230438bd8de5SBram Moolenaar
230538bd8de5SBram Moolenaar  total = 0
230638bd8de5SBram Moolenaar  for nr
230738bd8de5SBram Moolenaar    in [1, 2, 3]
230838bd8de5SBram Moolenaar    total += nr
230938bd8de5SBram Moolenaar  endfor
231038bd8de5SBram Moolenaar  assert_equal(6, total)
231138bd8de5SBram Moolenaar
231238bd8de5SBram Moolenaar  total = 0
231338bd8de5SBram Moolenaar  for nr
231438bd8de5SBram Moolenaar    in
231538bd8de5SBram Moolenaar    [1, 2, 3]
231638bd8de5SBram Moolenaar    total += nr
231738bd8de5SBram Moolenaar  endfor
231838bd8de5SBram Moolenaar  assert_equal(6, total)
2319036d0714SBram Moolenaar
2320036d0714SBram Moolenaar  var res = ""
2321036d0714SBram Moolenaar  for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2322036d0714SBram Moolenaar    res ..= n .. s
2323036d0714SBram Moolenaar  endfor
2324036d0714SBram Moolenaar  assert_equal('1a2b', res)
232574e54fcbSBram Moolenaar
232674e54fcbSBram Moolenaar  # loop over string
232774e54fcbSBram Moolenaar  res = ''
232874e54fcbSBram Moolenaar  for c in 'aéc̀d'
232974e54fcbSBram Moolenaar    res ..= c .. '-'
233074e54fcbSBram Moolenaar  endfor
233174e54fcbSBram Moolenaar  assert_equal('a-é-c̀-d-', res)
233274e54fcbSBram Moolenaar
233374e54fcbSBram Moolenaar  res = ''
233474e54fcbSBram Moolenaar  for c in ''
233574e54fcbSBram Moolenaar    res ..= c .. '-'
233674e54fcbSBram Moolenaar  endfor
233774e54fcbSBram Moolenaar  assert_equal('', res)
233874e54fcbSBram Moolenaar
233974e54fcbSBram Moolenaar  res = ''
234074e54fcbSBram Moolenaar  for c in test_null_string()
234174e54fcbSBram Moolenaar    res ..= c .. '-'
234274e54fcbSBram Moolenaar  endfor
234374e54fcbSBram Moolenaar  assert_equal('', res)
2344e8c4abbbSBram Moolenaarenddef
2345e8c4abbbSBram Moolenaar
2346e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2347025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2348025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2349025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2350675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2351675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2352cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2353822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
23542d870f8dSBram Moolenaar  delfunc! g:Func
2355675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2356675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2357675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
235874e54fcbSBram Moolenaar
235974e54fcbSBram Moolenaar  # wrong type detected at compile time
236074e54fcbSBram Moolenaar  CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
236174e54fcbSBram Moolenaar
236274e54fcbSBram Moolenaar  # wrong type detected at runtime
236374e54fcbSBram Moolenaar  g:adict = {a: 1}
236474e54fcbSBram Moolenaar  CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
236574e54fcbSBram Moolenaar  unlet g:adict
2366e8c4abbbSBram Moolenaarenddef
2367e8c4abbbSBram Moolenaar
2368ea87069dSBram Moolenaardef Test_for_loop_script_var()
2369ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2370ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2371ea87069dSBram Moolenaar
2372ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2373ea87069dSBram Moolenaar  var lines =<< trim END
2374ea87069dSBram Moolenaar    vim9script
2375ea87069dSBram Moolenaar    var total = 0
2376ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2377ea87069dSBram Moolenaar      total += s:var
2378ea87069dSBram Moolenaar    endfor
2379ea87069dSBram Moolenaar    assert_equal(6, total)
2380ea87069dSBram Moolenaar
2381ea87069dSBram Moolenaar    total = 0
2382ea87069dSBram Moolenaar    for var in [1, 2, 3]
2383ea87069dSBram Moolenaar      total += var
2384ea87069dSBram Moolenaar    endfor
2385ea87069dSBram Moolenaar    assert_equal(6, total)
2386ea87069dSBram Moolenaar  END
2387ea87069dSBram Moolenaarenddef
2388ea87069dSBram Moolenaar
2389792f786aSBram Moolenaardef Test_for_loop_unpack()
23904b8a0651SBram Moolenaar  var lines =<< trim END
2391792f786aSBram Moolenaar      var result = []
2392792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2393792f786aSBram Moolenaar        result->add(v1)
2394792f786aSBram Moolenaar        result->add(v2)
2395792f786aSBram Moolenaar      endfor
2396792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2397792f786aSBram Moolenaar
2398792f786aSBram Moolenaar      result = []
2399792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2400792f786aSBram Moolenaar        result->add(v1)
2401792f786aSBram Moolenaar        result->add(v2)
2402792f786aSBram Moolenaar        result->add(v3)
2403792f786aSBram Moolenaar      endfor
2404792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2405792f786aSBram Moolenaar
24064b8a0651SBram Moolenaar      result = []
24074b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
24084b8a0651SBram Moolenaar        result->add(&ts)
24094b8a0651SBram Moolenaar        result->add(&sw)
24104b8a0651SBram Moolenaar      endfor
24114b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
24124b8a0651SBram Moolenaar
24134b8a0651SBram Moolenaar      var slist: list<string>
24144b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
24154b8a0651SBram Moolenaar        slist->add($LOOPVAR)
24164b8a0651SBram Moolenaar        slist->add(@r)
24174b8a0651SBram Moolenaar        slist->add(v:errmsg)
24184b8a0651SBram Moolenaar      endfor
24194b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
24204b8a0651SBram Moolenaar
24214b8a0651SBram Moolenaar      slist = []
24224b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
24234b8a0651SBram Moolenaar        slist->add(g:globalvar)
24244b8a0651SBram Moolenaar        slist->add(b:bufvar)
24254b8a0651SBram Moolenaar        slist->add(w:winvar)
24264b8a0651SBram Moolenaar        slist->add(t:tabvar)
24274b8a0651SBram Moolenaar      endfor
24284b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2429f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
24304b8a0651SBram Moolenaar  END
24314b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
24324b8a0651SBram Moolenaar
24334b8a0651SBram Moolenaar  lines =<< trim END
2434792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2435792f786aSBram Moolenaar        echo v1 v2
2436792f786aSBram Moolenaar      endfor
2437792f786aSBram Moolenaar  END
2438792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2439792f786aSBram Moolenaar
2440792f786aSBram Moolenaar  lines =<< trim END
2441792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2442792f786aSBram Moolenaar        echo v1 v2
2443792f786aSBram Moolenaar      endfor
2444792f786aSBram Moolenaar  END
2445792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2446792f786aSBram Moolenaar
2447792f786aSBram Moolenaar  lines =<< trim END
2448792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2449792f786aSBram Moolenaar        echo v1
2450792f786aSBram Moolenaar      endfor
2451792f786aSBram Moolenaar  END
2452792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2453792f786aSBram Moolenaarenddef
2454792f786aSBram Moolenaar
2455c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2456c150c09eSBram Moolenaar  var looped = 0
2457c150c09eSBram Moolenaar  var cleanup = 0
2458c150c09eSBram Moolenaar  for i in range(3)
2459c150c09eSBram Moolenaar    looped += 1
2460c150c09eSBram Moolenaar    try
2461c150c09eSBram Moolenaar      eval [][0]
2462c150c09eSBram Moolenaar    catch
2463c150c09eSBram Moolenaar      continue
2464c150c09eSBram Moolenaar    finally
2465c150c09eSBram Moolenaar      cleanup += 1
2466c150c09eSBram Moolenaar    endtry
2467c150c09eSBram Moolenaar  endfor
2468c150c09eSBram Moolenaar  assert_equal(3, looped)
2469c150c09eSBram Moolenaar  assert_equal(3, cleanup)
2470c150c09eSBram Moolenaarenddef
2471c150c09eSBram Moolenaar
2472d0df1aacSBram Moolenaardef Test_while_loop()
2473cfcd011fSBram Moolenaar  var result = ''
2474cfcd011fSBram Moolenaar  var cnt = 0
2475d0df1aacSBram Moolenaar  while cnt < 555
2476d0df1aacSBram Moolenaar    if cnt == 3
2477d0df1aacSBram Moolenaar      break
2478d0df1aacSBram Moolenaar    endif
2479d0df1aacSBram Moolenaar    cnt += 1
2480d0df1aacSBram Moolenaar    if cnt == 2
2481d0df1aacSBram Moolenaar      continue
2482d0df1aacSBram Moolenaar    endif
2483d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2484d0df1aacSBram Moolenaar  endwhile
2485d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2486dee37dc7SBram Moolenaar
2487dee37dc7SBram Moolenaar  var s = ''
24880123cc1eSBram Moolenaar  while s == 'x' # {comment}
2489dee37dc7SBram Moolenaar  endwhile
2490d0df1aacSBram Moolenaarenddef
2491d0df1aacSBram Moolenaar
2492e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2493675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2494675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2495675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2496675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2497675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2498675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2499675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
25006628b7ebSBram Moolenaar
25016628b7ebSBram Moolenaar  var lines =<< trim END
25026628b7ebSBram Moolenaar      var s = ''
25036628b7ebSBram Moolenaar      while s = ''
25046628b7ebSBram Moolenaar      endwhile
25056628b7ebSBram Moolenaar  END
25066628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2507bd5da371SBram Moolenaarenddef
2508bd5da371SBram Moolenaar
25099645e2d9SBram Moolenaardef Test_interrupt_loop()
2510cfcd011fSBram Moolenaar  var caught = false
2511cfcd011fSBram Moolenaar  var x = 0
251297acfc78SBram Moolenaar  try
25139645e2d9SBram Moolenaar    while 1
25149645e2d9SBram Moolenaar      x += 1
25159645e2d9SBram Moolenaar      if x == 100
25169645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
25179645e2d9SBram Moolenaar      endif
25189645e2d9SBram Moolenaar    endwhile
251997acfc78SBram Moolenaar  catch
252097acfc78SBram Moolenaar    caught = true
252197acfc78SBram Moolenaar    assert_equal(100, x)
252297acfc78SBram Moolenaar  endtry
252397acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
252425859dd7SBram Moolenaar  # consume the CTRL-C
252525859dd7SBram Moolenaar  getchar(0)
25269645e2d9SBram Moolenaarenddef
252720431c9dSBram Moolenaar
25284fdae999SBram Moolenaardef Test_automatic_line_continuation()
2529cfcd011fSBram Moolenaar  var mylist = [
25304fdae999SBram Moolenaar      'one',
25314fdae999SBram Moolenaar      'two',
25324fdae999SBram Moolenaar      'three',
2533f5be8cdbSBram Moolenaar      ] # comment
25344fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
25354fdae999SBram Moolenaar
2536cfcd011fSBram Moolenaar  var mydict = {
2537e0de171eSBram Moolenaar      ['one']: 1,
2538e0de171eSBram Moolenaar      ['two']: 2,
2539e0de171eSBram Moolenaar      ['three']:
25404fdae999SBram Moolenaar          3,
2541f5be8cdbSBram Moolenaar      } # comment
2542e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2543e0de171eSBram Moolenaar  mydict = {
25442c330432SBram Moolenaar      one: 1,  # comment
25452c330432SBram Moolenaar      two:     # comment
25462c330432SBram Moolenaar           2,  # comment
25472c330432SBram Moolenaar      three: 3 # comment
25482c330432SBram Moolenaar      }
2549e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2550e0de171eSBram Moolenaar  mydict = {
25512c330432SBram Moolenaar      one: 1,
25524fdae999SBram Moolenaar      two:
25534fdae999SBram Moolenaar           2,
25542c330432SBram Moolenaar      three: 3
25554fdae999SBram Moolenaar      }
2556e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2557e6085c53SBram Moolenaar
2558e6085c53SBram Moolenaar  assert_equal(
2559e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2560e6085c53SBram Moolenaar        split('one two three')
2561e6085c53SBram Moolenaar        )
25624fdae999SBram Moolenaarenddef
25634fdae999SBram Moolenaar
25647a092245SBram Moolenaardef Test_vim9_comment()
25657a092245SBram Moolenaar  CheckScriptSuccess([
25667a092245SBram Moolenaar      'vim9script',
25677a092245SBram Moolenaar      '# something',
256893f82cbeSBram Moolenaar      '#something',
256993f82cbeSBram Moolenaar      '#{something',
25707a092245SBram Moolenaar      ])
257193f82cbeSBram Moolenaar
257293f82cbeSBram Moolenaar  split Xfile
257393f82cbeSBram Moolenaar  CheckScriptSuccess([
257493f82cbeSBram Moolenaar      'vim9script',
257593f82cbeSBram Moolenaar      'edit #something',
257693f82cbeSBram Moolenaar      ])
257793f82cbeSBram Moolenaar  CheckScriptSuccess([
257893f82cbeSBram Moolenaar      'vim9script',
257993f82cbeSBram Moolenaar      'edit #{something',
258093f82cbeSBram Moolenaar      ])
258193f82cbeSBram Moolenaar  close
258293f82cbeSBram Moolenaar
25837a092245SBram Moolenaar  CheckScriptFailure([
25847a092245SBram Moolenaar      'vim9script',
25857a092245SBram Moolenaar      ':# something',
25867a092245SBram Moolenaar      ], 'E488:')
25877a092245SBram Moolenaar  CheckScriptFailure([
25887a092245SBram Moolenaar      '# something',
25897a092245SBram Moolenaar      ], 'E488:')
25907a092245SBram Moolenaar  CheckScriptFailure([
25917a092245SBram Moolenaar      ':# something',
25927a092245SBram Moolenaar      ], 'E488:')
25937a092245SBram Moolenaar
25944a8d9f2eSBram Moolenaar  { # block start
25954a8d9f2eSBram Moolenaar  } # block end
25964a8d9f2eSBram Moolenaar  CheckDefFailure([
25974a8d9f2eSBram Moolenaar      '{# comment',
25984a8d9f2eSBram Moolenaar      ], 'E488:')
25994a8d9f2eSBram Moolenaar  CheckDefFailure([
26004a8d9f2eSBram Moolenaar      '{',
26014a8d9f2eSBram Moolenaar      '}# comment',
26024a8d9f2eSBram Moolenaar      ], 'E488:')
26034a8d9f2eSBram Moolenaar
26044a8d9f2eSBram Moolenaar  echo "yes" # comment
26054a8d9f2eSBram Moolenaar  CheckDefFailure([
26064a8d9f2eSBram Moolenaar      'echo "yes"# comment',
26074a8d9f2eSBram Moolenaar      ], 'E488:')
26087a092245SBram Moolenaar  CheckScriptSuccess([
26097a092245SBram Moolenaar      'vim9script',
26107a092245SBram Moolenaar      'echo "yes" # something',
26117a092245SBram Moolenaar      ])
26127a092245SBram Moolenaar  CheckScriptFailure([
26137a092245SBram Moolenaar      'vim9script',
26147a092245SBram Moolenaar      'echo "yes"# something',
26157a092245SBram Moolenaar      ], 'E121:')
26167a092245SBram Moolenaar  CheckScriptFailure([
26177a092245SBram Moolenaar      'vim9script',
26187a092245SBram Moolenaar      'echo# something',
2619f8103f27SBram Moolenaar      ], 'E1144:')
26207a092245SBram Moolenaar  CheckScriptFailure([
26217a092245SBram Moolenaar      'echo "yes" # something',
26227a092245SBram Moolenaar      ], 'E121:')
26237a092245SBram Moolenaar
26244a8d9f2eSBram Moolenaar  exe "echo" # comment
26254a8d9f2eSBram Moolenaar  CheckDefFailure([
26264a8d9f2eSBram Moolenaar      'exe "echo"# comment',
26274a8d9f2eSBram Moolenaar      ], 'E488:')
26284a8d9f2eSBram Moolenaar  CheckScriptSuccess([
26294a8d9f2eSBram Moolenaar      'vim9script',
26304a8d9f2eSBram Moolenaar      'exe "echo" # something',
26314a8d9f2eSBram Moolenaar      ])
26324a8d9f2eSBram Moolenaar  CheckScriptFailure([
26334a8d9f2eSBram Moolenaar      'vim9script',
26344a8d9f2eSBram Moolenaar      'exe "echo"# something',
26354a8d9f2eSBram Moolenaar      ], 'E121:')
26364a8d9f2eSBram Moolenaar  CheckScriptFailure([
26374a8d9f2eSBram Moolenaar      'vim9script',
26384a8d9f2eSBram Moolenaar      'exe# something',
2639f8103f27SBram Moolenaar      ], 'E1144:')
26404a8d9f2eSBram Moolenaar  CheckScriptFailure([
26414a8d9f2eSBram Moolenaar      'exe "echo" # something',
26424a8d9f2eSBram Moolenaar      ], 'E121:')
26434a8d9f2eSBram Moolenaar
26447a092245SBram Moolenaar  CheckDefFailure([
26457a092245SBram Moolenaar      'try# comment',
26467a092245SBram Moolenaar      '  echo "yes"',
26477a092245SBram Moolenaar      'catch',
26487a092245SBram Moolenaar      'endtry',
2649f8103f27SBram Moolenaar      ], 'E1144:')
26502c5ed4e3SBram Moolenaar  CheckScriptFailure([
26512c5ed4e3SBram Moolenaar      'vim9script',
26522c5ed4e3SBram Moolenaar      'try# comment',
26532c5ed4e3SBram Moolenaar      'echo "yes"',
2654f8103f27SBram Moolenaar      ], 'E1144:')
26557a092245SBram Moolenaar  CheckDefFailure([
26567a092245SBram Moolenaar      'try',
2657a72cfb80SBram Moolenaar      '  throw#comment',
2658a72cfb80SBram Moolenaar      'catch',
2659a72cfb80SBram Moolenaar      'endtry',
2660f8103f27SBram Moolenaar      ], 'E1144:')
2661a72cfb80SBram Moolenaar  CheckDefFailure([
2662a72cfb80SBram Moolenaar      'try',
2663a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2664a72cfb80SBram Moolenaar      'catch',
2665a72cfb80SBram Moolenaar      'endtry',
2666a72cfb80SBram Moolenaar      ], 'E488:')
2667a72cfb80SBram Moolenaar  CheckDefFailure([
2668a72cfb80SBram Moolenaar      'try',
26697a092245SBram Moolenaar      '  echo "yes"',
26707a092245SBram Moolenaar      'catch# comment',
26717a092245SBram Moolenaar      'endtry',
2672f8103f27SBram Moolenaar      ], 'E1144:')
26732c5ed4e3SBram Moolenaar  CheckScriptFailure([
26742c5ed4e3SBram Moolenaar      'vim9script',
26752c5ed4e3SBram Moolenaar      'try',
26762c5ed4e3SBram Moolenaar      '  echo "yes"',
26772c5ed4e3SBram Moolenaar      'catch# comment',
26782c5ed4e3SBram Moolenaar      'endtry',
2679f8103f27SBram Moolenaar      ], 'E1144:')
26802c5ed4e3SBram Moolenaar  CheckDefFailure([
26812c5ed4e3SBram Moolenaar      'try',
26822c5ed4e3SBram Moolenaar      '  echo "yes"',
26832c5ed4e3SBram Moolenaar      'catch /pat/# comment',
26842c5ed4e3SBram Moolenaar      'endtry',
26852c5ed4e3SBram Moolenaar      ], 'E488:')
26867a092245SBram Moolenaar  CheckDefFailure([
26877a092245SBram Moolenaar      'try',
26887a092245SBram Moolenaar      'echo "yes"',
26897a092245SBram Moolenaar      'catch',
26907a092245SBram Moolenaar      'endtry# comment',
2691f8103f27SBram Moolenaar      ], 'E1144:')
26922c5ed4e3SBram Moolenaar  CheckScriptFailure([
26932c5ed4e3SBram Moolenaar      'vim9script',
26942c5ed4e3SBram Moolenaar      'try',
26952c5ed4e3SBram Moolenaar      '  echo "yes"',
26962c5ed4e3SBram Moolenaar      'catch',
26972c5ed4e3SBram Moolenaar      'endtry# comment',
2698f8103f27SBram Moolenaar      ], 'E1144:')
26992c5ed4e3SBram Moolenaar
27002c5ed4e3SBram Moolenaar  CheckScriptSuccess([
27012c5ed4e3SBram Moolenaar      'vim9script',
27022c5ed4e3SBram Moolenaar      'hi # comment',
27032c5ed4e3SBram Moolenaar      ])
27042c5ed4e3SBram Moolenaar  CheckScriptFailure([
27052c5ed4e3SBram Moolenaar      'vim9script',
27062c5ed4e3SBram Moolenaar      'hi# comment',
2707f8103f27SBram Moolenaar      ], 'E1144:')
27081966c248SBram Moolenaar  CheckScriptSuccess([
27091966c248SBram Moolenaar      'vim9script',
27101966c248SBram Moolenaar      'hi Search # comment',
27111966c248SBram Moolenaar      ])
27121966c248SBram Moolenaar  CheckScriptFailure([
27131966c248SBram Moolenaar      'vim9script',
27141966c248SBram Moolenaar      'hi Search# comment',
27151966c248SBram Moolenaar      ], 'E416:')
27161966c248SBram Moolenaar  CheckScriptSuccess([
27171966c248SBram Moolenaar      'vim9script',
27181966c248SBram Moolenaar      'hi link This Search # comment',
27191966c248SBram Moolenaar      ])
27201966c248SBram Moolenaar  CheckScriptFailure([
27211966c248SBram Moolenaar      'vim9script',
27221966c248SBram Moolenaar      'hi link This That# comment',
27231966c248SBram Moolenaar      ], 'E413:')
27241966c248SBram Moolenaar  CheckScriptSuccess([
27251966c248SBram Moolenaar      'vim9script',
27261966c248SBram Moolenaar      'hi clear This # comment',
27271966c248SBram Moolenaar      'hi clear # comment',
27281966c248SBram Moolenaar      ])
2729f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2730f5be8cdbSBram Moolenaar  # hi clear This# comment',
27311966c248SBram Moolenaar  CheckScriptFailure([
27321966c248SBram Moolenaar      'vim9script',
27331966c248SBram Moolenaar      'hi clear# comment',
27341966c248SBram Moolenaar      ], 'E416:')
27351966c248SBram Moolenaar
27361966c248SBram Moolenaar  CheckScriptSuccess([
27371966c248SBram Moolenaar      'vim9script',
27381966c248SBram Moolenaar      'hi Group term=bold',
27391966c248SBram Moolenaar      'match Group /todo/ # comment',
27401966c248SBram Moolenaar      ])
27411966c248SBram Moolenaar  CheckScriptFailure([
27421966c248SBram Moolenaar      'vim9script',
27431966c248SBram Moolenaar      'hi Group term=bold',
27441966c248SBram Moolenaar      'match Group /todo/# comment',
27451966c248SBram Moolenaar      ], 'E488:')
27461966c248SBram Moolenaar  CheckScriptSuccess([
27471966c248SBram Moolenaar      'vim9script',
27481966c248SBram Moolenaar      'match # comment',
27491966c248SBram Moolenaar      ])
27501966c248SBram Moolenaar  CheckScriptFailure([
27511966c248SBram Moolenaar      'vim9script',
27521966c248SBram Moolenaar      'match# comment',
2753f8103f27SBram Moolenaar      ], 'E1144:')
27541966c248SBram Moolenaar  CheckScriptSuccess([
27551966c248SBram Moolenaar      'vim9script',
27561966c248SBram Moolenaar      'match none # comment',
27571966c248SBram Moolenaar      ])
27581966c248SBram Moolenaar  CheckScriptFailure([
27591966c248SBram Moolenaar      'vim9script',
27601966c248SBram Moolenaar      'match none# comment',
27611966c248SBram Moolenaar      ], 'E475:')
27621966c248SBram Moolenaar
27631966c248SBram Moolenaar  CheckScriptSuccess([
27641966c248SBram Moolenaar      'vim9script',
27651966c248SBram Moolenaar      'menutrans clear # comment',
27661966c248SBram Moolenaar      ])
27671966c248SBram Moolenaar  CheckScriptFailure([
27681966c248SBram Moolenaar      'vim9script',
27691966c248SBram Moolenaar      'menutrans clear# comment text',
27701966c248SBram Moolenaar      ], 'E474:')
27711966c248SBram Moolenaar
27721966c248SBram Moolenaar  CheckScriptSuccess([
27731966c248SBram Moolenaar      'vim9script',
27741966c248SBram Moolenaar      'syntax clear # comment',
27751966c248SBram Moolenaar      ])
27761966c248SBram Moolenaar  CheckScriptFailure([
27771966c248SBram Moolenaar      'vim9script',
27781966c248SBram Moolenaar      'syntax clear# comment text',
27791966c248SBram Moolenaar      ], 'E28:')
27801966c248SBram Moolenaar  CheckScriptSuccess([
27811966c248SBram Moolenaar      'vim9script',
27821966c248SBram Moolenaar      'syntax keyword Word some',
27831966c248SBram Moolenaar      'syntax clear Word # comment',
27841966c248SBram Moolenaar      ])
27851966c248SBram Moolenaar  CheckScriptFailure([
27861966c248SBram Moolenaar      'vim9script',
27871966c248SBram Moolenaar      'syntax keyword Word some',
27881966c248SBram Moolenaar      'syntax clear Word# comment text',
27891966c248SBram Moolenaar      ], 'E28:')
27901966c248SBram Moolenaar
27911966c248SBram Moolenaar  CheckScriptSuccess([
27921966c248SBram Moolenaar      'vim9script',
27931966c248SBram Moolenaar      'syntax list # comment',
27941966c248SBram Moolenaar      ])
27951966c248SBram Moolenaar  CheckScriptFailure([
27961966c248SBram Moolenaar      'vim9script',
27971966c248SBram Moolenaar      'syntax list# comment text',
27981966c248SBram Moolenaar      ], 'E28:')
27991966c248SBram Moolenaar
28001966c248SBram Moolenaar  CheckScriptSuccess([
28011966c248SBram Moolenaar      'vim9script',
28021966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
28031966c248SBram Moolenaar      ])
28041966c248SBram Moolenaar  CheckScriptFailure([
28051966c248SBram Moolenaar      'vim9script',
28061966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
28071966c248SBram Moolenaar      ], 'E475:')
28081966c248SBram Moolenaar
28091966c248SBram Moolenaar  CheckScriptSuccess([
28101966c248SBram Moolenaar      'vim9script',
28111966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
28121966c248SBram Moolenaar      ])
28131966c248SBram Moolenaar  CheckScriptFailure([
28141966c248SBram Moolenaar      'vim9script',
28151966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
28161966c248SBram Moolenaar      ], 'E789:')
28171966c248SBram Moolenaar
28181966c248SBram Moolenaar  CheckScriptSuccess([
28191966c248SBram Moolenaar      'vim9script',
28201966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
28211966c248SBram Moolenaar      ])
28221966c248SBram Moolenaar  CheckScriptFailure([
28231966c248SBram Moolenaar      'vim9script',
28241966c248SBram Moolenaar      'syntax match Word /pat/# comment',
28251966c248SBram Moolenaar      ], 'E402:')
28261966c248SBram Moolenaar
28271966c248SBram Moolenaar  CheckScriptSuccess([
28281966c248SBram Moolenaar      'vim9script',
28291966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
28301966c248SBram Moolenaar      ])
28311966c248SBram Moolenaar  CheckScriptFailure([
28321966c248SBram Moolenaar      'vim9script',
28331966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
28341966c248SBram Moolenaar      ], 'E475:')
28351966c248SBram Moolenaar  CheckScriptFailure([
28361966c248SBram Moolenaar      'vim9script',
28371966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
28381966c248SBram Moolenaar      ], 'E406:')
28391966c248SBram Moolenaar  CheckScriptFailure([
28401966c248SBram Moolenaar      'vim9script',
28411966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
28421966c248SBram Moolenaar      ], 'E475:')
28431966c248SBram Moolenaar
28441966c248SBram Moolenaar  CheckScriptSuccess([
28451966c248SBram Moolenaar      'vim9script',
28461966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
28471966c248SBram Moolenaar      ])
28481966c248SBram Moolenaar  CheckScriptFailure([
28491966c248SBram Moolenaar      'vim9script',
28501966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2851d032f34aSBram Moolenaar      ], 'E402:')
28521966c248SBram Moolenaar
28531966c248SBram Moolenaar  CheckScriptSuccess([
28541966c248SBram Moolenaar      'vim9script',
28551966c248SBram Moolenaar      'syntax sync # comment',
28561966c248SBram Moolenaar      ])
28571966c248SBram Moolenaar  CheckScriptFailure([
28581966c248SBram Moolenaar      'vim9script',
28591966c248SBram Moolenaar      'syntax sync# comment',
28601966c248SBram Moolenaar      ], 'E404:')
28611966c248SBram Moolenaar  CheckScriptSuccess([
28621966c248SBram Moolenaar      'vim9script',
28631966c248SBram Moolenaar      'syntax sync ccomment # comment',
28641966c248SBram Moolenaar      ])
28651966c248SBram Moolenaar  CheckScriptFailure([
28661966c248SBram Moolenaar      'vim9script',
28671966c248SBram Moolenaar      'syntax sync ccomment# comment',
28681966c248SBram Moolenaar      ], 'E404:')
28691966c248SBram Moolenaar
28701966c248SBram Moolenaar  CheckScriptSuccess([
28711966c248SBram Moolenaar      'vim9script',
28721966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
28731966c248SBram Moolenaar      ])
28741966c248SBram Moolenaar  CheckScriptFailure([
28751966c248SBram Moolenaar      'vim9script',
28761966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
28771966c248SBram Moolenaar      ], 'E475:')
2878a72cfb80SBram Moolenaar
2879a72cfb80SBram Moolenaar  CheckScriptSuccess([
2880a72cfb80SBram Moolenaar      'vim9script',
2881a72cfb80SBram Moolenaar      'command Echo echo # comment',
2882a72cfb80SBram Moolenaar      'command Echo # comment',
28832d870f8dSBram Moolenaar      'delcommand Echo',
2884a72cfb80SBram Moolenaar      ])
2885a72cfb80SBram Moolenaar  CheckScriptFailure([
2886a72cfb80SBram Moolenaar      'vim9script',
2887a72cfb80SBram Moolenaar      'command Echo echo# comment',
2888a72cfb80SBram Moolenaar      'Echo',
2889f8103f27SBram Moolenaar      ], 'E1144:')
28902d870f8dSBram Moolenaar  delcommand Echo
289170249ee8SBram Moolenaar
289270249ee8SBram Moolenaar  var curdir = getcwd()
289370249ee8SBram Moolenaar  CheckScriptSuccess([
289470249ee8SBram Moolenaar      'command Echo cd " comment',
289570249ee8SBram Moolenaar      'Echo',
289670249ee8SBram Moolenaar      'delcommand Echo',
289770249ee8SBram Moolenaar      ])
289870249ee8SBram Moolenaar  CheckScriptSuccess([
2899090728adSBram Moolenaar      'vim9script',
290070249ee8SBram Moolenaar      'command Echo cd # comment',
290170249ee8SBram Moolenaar      'Echo',
290270249ee8SBram Moolenaar      'delcommand Echo',
290370249ee8SBram Moolenaar      ])
290470249ee8SBram Moolenaar  CheckScriptFailure([
290570249ee8SBram Moolenaar      'vim9script',
290670249ee8SBram Moolenaar      'command Echo cd " comment',
290770249ee8SBram Moolenaar      'Echo',
290870249ee8SBram Moolenaar      ], 'E344:')
290970249ee8SBram Moolenaar  delcommand Echo
291070249ee8SBram Moolenaar  chdir(curdir)
291170249ee8SBram Moolenaar
2912a72cfb80SBram Moolenaar  CheckScriptFailure([
2913a72cfb80SBram Moolenaar      'vim9script',
2914a72cfb80SBram Moolenaar      'command Echo# comment',
2915a72cfb80SBram Moolenaar      ], 'E182:')
2916a72cfb80SBram Moolenaar  CheckScriptFailure([
2917a72cfb80SBram Moolenaar      'vim9script',
2918a72cfb80SBram Moolenaar      'command Echo echo',
2919a72cfb80SBram Moolenaar      'command Echo# comment',
2920a72cfb80SBram Moolenaar      ], 'E182:')
29212d870f8dSBram Moolenaar  delcommand Echo
2922a72cfb80SBram Moolenaar
2923a72cfb80SBram Moolenaar  CheckScriptSuccess([
2924a72cfb80SBram Moolenaar      'vim9script',
2925a72cfb80SBram Moolenaar      'function # comment',
2926a72cfb80SBram Moolenaar      ])
2927a72cfb80SBram Moolenaar  CheckScriptFailure([
2928a72cfb80SBram Moolenaar      'vim9script',
29299898107fSBram Moolenaar      'function " comment',
29309898107fSBram Moolenaar      ], 'E129:')
29319898107fSBram Moolenaar  CheckScriptFailure([
29329898107fSBram Moolenaar      'vim9script',
2933a72cfb80SBram Moolenaar      'function# comment',
2934f8103f27SBram Moolenaar      ], 'E1144:')
2935a72cfb80SBram Moolenaar  CheckScriptSuccess([
2936a72cfb80SBram Moolenaar      'vim9script',
2937a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2938a72cfb80SBram Moolenaar      ])
2939a72cfb80SBram Moolenaar  CheckScriptFailure([
2940a72cfb80SBram Moolenaar      'vim9script',
2941a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2942a72cfb80SBram Moolenaar      ], 'E488:')
2943a72cfb80SBram Moolenaar
2944a72cfb80SBram Moolenaar  CheckScriptSuccess([
2945a72cfb80SBram Moolenaar      'vim9script',
29464c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2947a72cfb80SBram Moolenaar      'endfunc',
29484c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2949a72cfb80SBram Moolenaar      ])
2950a72cfb80SBram Moolenaar  CheckScriptFailure([
2951a72cfb80SBram Moolenaar      'vim9script',
29524c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2953a72cfb80SBram Moolenaar      'endfunc',
29544c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2955a72cfb80SBram Moolenaar      ], 'E488:')
2956a72cfb80SBram Moolenaar
2957a72cfb80SBram Moolenaar  CheckScriptSuccess([
2958a72cfb80SBram Moolenaar      'vim9script',
2959a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2960a72cfb80SBram Moolenaar      ])
2961a72cfb80SBram Moolenaar  CheckScriptFailure([
2962a72cfb80SBram Moolenaar      'vim9script',
2963a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2964a72cfb80SBram Moolenaar      ], 'E488:')
2965e7e4838fSBram Moolenaar
2966e7e4838fSBram Moolenaar  CheckScriptFailure([
2967e7e4838fSBram Moolenaar      'def Test() " comment',
2968e7e4838fSBram Moolenaar      'enddef',
2969e7e4838fSBram Moolenaar      ], 'E488:')
2970e7e4838fSBram Moolenaar  CheckScriptFailure([
2971e7e4838fSBram Moolenaar      'vim9script',
2972e7e4838fSBram Moolenaar      'def Test() " comment',
2973e7e4838fSBram Moolenaar      'enddef',
2974e7e4838fSBram Moolenaar      ], 'E488:')
2975e7e4838fSBram Moolenaar
2976e7e4838fSBram Moolenaar  CheckScriptSuccess([
2977e7e4838fSBram Moolenaar      'func Test() " comment',
2978e7e4838fSBram Moolenaar      'endfunc',
29792d870f8dSBram Moolenaar      'delfunc Test',
2980e7e4838fSBram Moolenaar      ])
29819898107fSBram Moolenaar  CheckScriptSuccess([
2982e7e4838fSBram Moolenaar      'vim9script',
2983e7e4838fSBram Moolenaar      'func Test() " comment',
2984e7e4838fSBram Moolenaar      'endfunc',
29859898107fSBram Moolenaar      ])
2986e7e4838fSBram Moolenaar
2987e7e4838fSBram Moolenaar  CheckScriptSuccess([
2988e7e4838fSBram Moolenaar      'def Test() # comment',
2989e7e4838fSBram Moolenaar      'enddef',
2990e7e4838fSBram Moolenaar      ])
2991e7e4838fSBram Moolenaar  CheckScriptFailure([
2992e7e4838fSBram Moolenaar      'func Test() # comment',
2993e7e4838fSBram Moolenaar      'endfunc',
2994e7e4838fSBram Moolenaar      ], 'E488:')
29952c5ed4e3SBram Moolenaarenddef
29962c5ed4e3SBram Moolenaar
29972c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
29982c5ed4e3SBram Moolenaar  CheckCanRunGui
29992c5ed4e3SBram Moolenaar
30002c5ed4e3SBram Moolenaar  CheckScriptFailure([
30012c5ed4e3SBram Moolenaar      'vim9script',
30022c5ed4e3SBram Moolenaar      'gui#comment'
3003f8103f27SBram Moolenaar      ], 'E1144:')
30042c5ed4e3SBram Moolenaar  CheckScriptFailure([
30052c5ed4e3SBram Moolenaar      'vim9script',
30062c5ed4e3SBram Moolenaar      'gui -f#comment'
30072c5ed4e3SBram Moolenaar      ], 'E499:')
30087a092245SBram Moolenaarenddef
30097a092245SBram Moolenaar
3010a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
30116797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
30126797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3013a26b9700SBram Moolenaar
3014a26b9700SBram Moolenaar  edit test.vim
3015a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3016a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3017a26b9700SBram Moolenaar
3018a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3019a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3020a26b9700SBram Moolenaar
3021a26b9700SBram Moolenaar  g:entered = 0
3022a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3023a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3024a26b9700SBram Moolenaar
3025a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3026a26b9700SBram Moolenaar
3027a26b9700SBram Moolenaar  au! TabEnter
3028a26b9700SBram Moolenaar  unlet g:entered
3029d72c1bf0SBram Moolenaar
3030d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3031d72c1bf0SBram Moolenaar      'vim9script',
30326797966dSBram Moolenaar      'g:var = 123',
3033e55b1c09SBram Moolenaar      'b:var = 456',
3034e55b1c09SBram Moolenaar      'w:var = 777',
3035e55b1c09SBram Moolenaar      't:var = 888',
3036d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3037d72c1bf0SBram Moolenaar      ])
3038d72c1bf0SBram Moolenaar
3039d72c1bf0SBram Moolenaar  CheckScriptFailure([
3040d72c1bf0SBram Moolenaar      'vim9script',
3041cfcd011fSBram Moolenaar      'let var = 123',
3042cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3043cfcd011fSBram Moolenaar
3044cfcd011fSBram Moolenaar  CheckScriptFailure([
3045cfcd011fSBram Moolenaar      'vim9script',
3046cfcd011fSBram Moolenaar      'var g:var = 123',
3047e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3048e55b1c09SBram Moolenaar
3049e55b1c09SBram Moolenaar  CheckScriptFailure([
3050e55b1c09SBram Moolenaar      'vim9script',
3051cfcd011fSBram Moolenaar      'var b:var = 123',
3052e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3053e55b1c09SBram Moolenaar
3054e55b1c09SBram Moolenaar  CheckScriptFailure([
3055e55b1c09SBram Moolenaar      'vim9script',
3056cfcd011fSBram Moolenaar      'var w:var = 123',
3057e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3058e55b1c09SBram Moolenaar
3059e55b1c09SBram Moolenaar  CheckScriptFailure([
3060e55b1c09SBram Moolenaar      'vim9script',
3061cfcd011fSBram Moolenaar      'var t:var = 123',
3062e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3063e55b1c09SBram Moolenaar
3064e55b1c09SBram Moolenaar  CheckScriptFailure([
3065e55b1c09SBram Moolenaar      'vim9script',
3066cfcd011fSBram Moolenaar      'var v:version = 123',
3067e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3068e55b1c09SBram Moolenaar
3069e55b1c09SBram Moolenaar  CheckScriptFailure([
3070e55b1c09SBram Moolenaar      'vim9script',
3071cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3072e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
30736797966dSBram Moolenaar
30746797966dSBram Moolenaar  CheckScriptFailure([
30756797966dSBram Moolenaar      'vim9script',
30766797966dSBram Moolenaar      'g:var = 123',
307732e35117SBram Moolenaar      'unlet g:var# comment1',
3078d72c1bf0SBram Moolenaar      ], 'E108:')
3079d72c1bf0SBram Moolenaar
3080d72c1bf0SBram Moolenaar  CheckScriptFailure([
3081d72c1bf0SBram Moolenaar      'let g:var = 123',
3082d72c1bf0SBram Moolenaar      'unlet g:var # something',
3083d72c1bf0SBram Moolenaar      ], 'E488:')
3084faac4104SBram Moolenaar
3085faac4104SBram Moolenaar  CheckScriptSuccess([
3086faac4104SBram Moolenaar      'vim9script',
308732e35117SBram Moolenaar      'if 1 # comment2',
3088faac4104SBram Moolenaar      '  echo "yes"',
3089faac4104SBram Moolenaar      'elseif 2 #comment',
3090faac4104SBram Moolenaar      '  echo "no"',
3091faac4104SBram Moolenaar      'endif',
3092faac4104SBram Moolenaar      ])
3093faac4104SBram Moolenaar
3094faac4104SBram Moolenaar  CheckScriptFailure([
3095faac4104SBram Moolenaar      'vim9script',
309632e35117SBram Moolenaar      'if 1# comment3',
3097faac4104SBram Moolenaar      '  echo "yes"',
3098faac4104SBram Moolenaar      'endif',
3099faac4104SBram Moolenaar      ], 'E15:')
3100faac4104SBram Moolenaar
3101faac4104SBram Moolenaar  CheckScriptFailure([
3102faac4104SBram Moolenaar      'vim9script',
310332e35117SBram Moolenaar      'if 0 # comment4',
3104faac4104SBram Moolenaar      '  echo "yes"',
3105faac4104SBram Moolenaar      'elseif 2#comment',
3106faac4104SBram Moolenaar      '  echo "no"',
3107faac4104SBram Moolenaar      'endif',
3108faac4104SBram Moolenaar      ], 'E15:')
3109faac4104SBram Moolenaar
3110faac4104SBram Moolenaar  CheckScriptSuccess([
3111faac4104SBram Moolenaar      'vim9script',
3112cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3113faac4104SBram Moolenaar      ])
3114faac4104SBram Moolenaar
3115faac4104SBram Moolenaar  CheckScriptFailure([
3116faac4104SBram Moolenaar      'vim9script',
3117cfcd011fSBram Moolenaar      'var v = 1# comment6',
311832e35117SBram Moolenaar      ], 'E15:')
3119faac4104SBram Moolenaar
3120faac4104SBram Moolenaar  CheckScriptSuccess([
3121faac4104SBram Moolenaar      'vim9script',
3122faac4104SBram Moolenaar      'new'
3123d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3124df069eecSBram Moolenaar      ':$',
3125faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3126faac4104SBram Moolenaar      'bwipe!',
3127faac4104SBram Moolenaar      ])
3128faac4104SBram Moolenaar
3129f5be8cdbSBram Moolenaar  CheckScriptFailure([
3130f5be8cdbSBram Moolenaar      'vim9script',
3131f5be8cdbSBram Moolenaar      'new'
3132d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3133f5be8cdbSBram Moolenaar      ':$',
3134f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3135f5be8cdbSBram Moolenaar      'bwipe!',
3136f5be8cdbSBram Moolenaar      ], 'E488:')
3137f5be8cdbSBram Moolenaar
3138f5be8cdbSBram Moolenaar  CheckScriptFailure([
3139f5be8cdbSBram Moolenaar      'vim9script',
3140f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3141f5be8cdbSBram Moolenaar      ], 'E477:')
3142a26b9700SBram Moolenaarenddef
3143a26b9700SBram Moolenaar
31447e5bd91dSBram Moolenaardef Test_finish()
3145cfcd011fSBram Moolenaar  var lines =<< trim END
31467e5bd91dSBram Moolenaar    vim9script
31476797966dSBram Moolenaar    g:res = 'one'
31487e5bd91dSBram Moolenaar    if v:false | finish | endif
31496797966dSBram Moolenaar    g:res = 'two'
31507e5bd91dSBram Moolenaar    finish
31516797966dSBram Moolenaar    g:res = 'three'
31527e5bd91dSBram Moolenaar  END
31537e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
31547e5bd91dSBram Moolenaar  source Xfinished
31557e5bd91dSBram Moolenaar  assert_equal('two', g:res)
31567e5bd91dSBram Moolenaar
31577e5bd91dSBram Moolenaar  unlet g:res
31587e5bd91dSBram Moolenaar  delete('Xfinished')
31597e5bd91dSBram Moolenaarenddef
31607e5bd91dSBram Moolenaar
3161a5d0077eSBram Moolenaardef Test_forward_declaration()
3162cfcd011fSBram Moolenaar  var lines =<< trim END
3163a5d0077eSBram Moolenaar    vim9script
3164a5d0077eSBram Moolenaar    def GetValue(): string
3165a5d0077eSBram Moolenaar      return theVal
3166a5d0077eSBram Moolenaar    enddef
3167cfcd011fSBram Moolenaar    var theVal = 'something'
3168822ba247SBram Moolenaar    g:initVal = GetValue()
3169a5d0077eSBram Moolenaar    theVal = 'else'
3170a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3171a5d0077eSBram Moolenaar  END
3172a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3173a5d0077eSBram Moolenaar  source Xforward
3174a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3175a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3176a5d0077eSBram Moolenaar
3177a5d0077eSBram Moolenaar  unlet g:initVal
3178a5d0077eSBram Moolenaar  unlet g:laterVal
3179a5d0077eSBram Moolenaar  delete('Xforward')
3180a5d0077eSBram Moolenaarenddef
3181a5d0077eSBram Moolenaar
31829721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3183a6294955SBram Moolenaar  var vim9_lines =<< trim END
3184a6294955SBram Moolenaar    vim9script
3185a6294955SBram Moolenaar    var local = 'local'
3186a6294955SBram Moolenaar    g:global = 'global'
3187a6294955SBram Moolenaar    export var exported = 'exported'
3188a6294955SBram Moolenaar    export def GetText(): string
3189a6294955SBram Moolenaar       return 'text'
3190a6294955SBram Moolenaar    enddef
3191a6294955SBram Moolenaar  END
3192a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3193a6294955SBram Moolenaar
3194cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
31959721fb4eSBram Moolenaar    source Xvim9_script.vim
31969721fb4eSBram Moolenaar
31979721fb4eSBram Moolenaar    call assert_false(exists('local'))
31989721fb4eSBram Moolenaar    call assert_false(exists('exported'))
31999721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
32009721fb4eSBram Moolenaar    call assert_equal('global', global)
32019721fb4eSBram Moolenaar    call assert_equal('global', g:global)
32029721fb4eSBram Moolenaar
32039721fb4eSBram Moolenaar    " imported variable becomes script-local
32049721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
32059721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
32069721fb4eSBram Moolenaar    call assert_false(exists('exported'))
32079721fb4eSBram Moolenaar
32089721fb4eSBram Moolenaar    " imported function becomes script-local
32099721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
32109721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
32119721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
32129721fb4eSBram Moolenaar  END
32139721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
32149721fb4eSBram Moolenaar
32159721fb4eSBram Moolenaar  source Xlegacy_script.vim
32169721fb4eSBram Moolenaar  assert_equal('global', g:global)
3217f5be8cdbSBram Moolenaar  unlet g:global
32189721fb4eSBram Moolenaar
32199721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
32209721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
32219721fb4eSBram Moolenaarenddef
3222a5d0077eSBram Moolenaar
3223*e535db86SBram Moolenaardef Test_declare_script_in_func()
3224*e535db86SBram Moolenaar  var lines =<< trim END
3225*e535db86SBram Moolenaar      vim9script
3226*e535db86SBram Moolenaar      func Declare()
3227*e535db86SBram Moolenaar        let s:local = 123
3228*e535db86SBram Moolenaar      endfunc
3229*e535db86SBram Moolenaar      Declare()
3230*e535db86SBram Moolenaar      assert_equal(123, local)
3231*e535db86SBram Moolenaar
3232*e535db86SBram Moolenaar      var error: string
3233*e535db86SBram Moolenaar      try
3234*e535db86SBram Moolenaar        local = 'asdf'
3235*e535db86SBram Moolenaar      catch
3236*e535db86SBram Moolenaar        error = v:exception
3237*e535db86SBram Moolenaar      endtry
3238*e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3239*e535db86SBram Moolenaar
3240*e535db86SBram Moolenaar      lockvar local
3241*e535db86SBram Moolenaar      try
3242*e535db86SBram Moolenaar        local = 999
3243*e535db86SBram Moolenaar      catch
3244*e535db86SBram Moolenaar        error = v:exception
3245*e535db86SBram Moolenaar      endtry
3246*e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3247*e535db86SBram Moolenaar  END
3248*e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3249*e535db86SBram Moolenaarenddef
3250*e535db86SBram Moolenaar
3251*e535db86SBram Moolenaar
32527d699701SBram Moolenaarfunc Test_vim9script_not_global()
32537d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
32547d699701SBram Moolenaar  let vim9lines =<< trim END
32557d699701SBram Moolenaar    vim9script
3256cfcd011fSBram Moolenaar    var name = 'local'
32577d699701SBram Moolenaar    func TheFunc()
32587d699701SBram Moolenaar      echo 'local'
32597d699701SBram Moolenaar    endfunc
32607d699701SBram Moolenaar    def DefFunc()
32617d699701SBram Moolenaar      echo 'local'
32627d699701SBram Moolenaar    enddef
32637d699701SBram Moolenaar  END
32647d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
32657d699701SBram Moolenaar  source Xvim9script.vim
32667d699701SBram Moolenaar  try
32677d699701SBram Moolenaar    echo g:var
32687d699701SBram Moolenaar    assert_report('did not fail')
32697d699701SBram Moolenaar  catch /E121:/
32707d699701SBram Moolenaar    " caught
32717d699701SBram Moolenaar  endtry
32727d699701SBram Moolenaar  try
32737d699701SBram Moolenaar    call TheFunc()
32747d699701SBram Moolenaar    assert_report('did not fail')
32757d699701SBram Moolenaar  catch /E117:/
32767d699701SBram Moolenaar    " caught
32777d699701SBram Moolenaar  endtry
32787d699701SBram Moolenaar  try
32797d699701SBram Moolenaar    call DefFunc()
32807d699701SBram Moolenaar    assert_report('did not fail')
32817d699701SBram Moolenaar  catch /E117:/
32827d699701SBram Moolenaar    " caught
32837d699701SBram Moolenaar  endtry
32847d699701SBram Moolenaar
328525859dd7SBram Moolenaar  call delete('Xvim9script.vim')
32867d699701SBram Moolenaarendfunc
32877d699701SBram Moolenaar
3288eeb27bfeSBram Moolenaardef Test_vim9_copen()
3289eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3290eeb27bfeSBram Moolenaar  copen
3291eeb27bfeSBram Moolenaar  quit
3292eeb27bfeSBram Moolenaarenddef
3293eeb27bfeSBram Moolenaar
329403290b84SBram Moolenaar" test using an auto-loaded function and variable
32952d6b20d6SBram Moolenaardef Test_vim9_autoload()
3296cfcd011fSBram Moolenaar  var lines =<< trim END
32972d6b20d6SBram Moolenaar     vim9script
329803290b84SBram Moolenaar     def some#gettest(): string
329903290b84SBram Moolenaar       return 'test'
330003290b84SBram Moolenaar     enddef
330103290b84SBram Moolenaar     g:some#name = 'name'
3302e3ffcd99SBram Moolenaar
3303e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3304e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3305e3ffcd99SBram Moolenaar     enddef
330603290b84SBram Moolenaar  END
330703290b84SBram Moolenaar
330803290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
330903290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
331003290b84SBram Moolenaar  var save_rtp = &rtp
331103290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
331203290b84SBram Moolenaar
331303290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
331403290b84SBram Moolenaar  assert_equal('name', g:some#name)
331503290b84SBram Moolenaar  g:some#other = 'other'
331603290b84SBram Moolenaar  assert_equal('other', g:some#other)
331703290b84SBram Moolenaar
3318e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3319e3ffcd99SBram Moolenaar
332017f700acSBram Moolenaar  # upper case script name works
332117f700acSBram Moolenaar  lines =<< trim END
332217f700acSBram Moolenaar     vim9script
332317f700acSBram Moolenaar     def Other#getOther(): string
332417f700acSBram Moolenaar       return 'other'
332517f700acSBram Moolenaar     enddef
332617f700acSBram Moolenaar  END
332717f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
332817f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
332917f700acSBram Moolenaar
333003290b84SBram Moolenaar  delete('Xdir', 'rf')
333103290b84SBram Moolenaar  &rtp = save_rtp
333203290b84SBram Moolenaarenddef
333303290b84SBram Moolenaar
333403290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
333503290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
333603290b84SBram Moolenaar  var lines =<< trim END
333703290b84SBram Moolenaar     vim9script
33382d6b20d6SBram Moolenaar     def foo#test()
33392d6b20d6SBram Moolenaar         echomsg getreg('"')
33402d6b20d6SBram Moolenaar     enddef
33412d6b20d6SBram Moolenaar  END
33422d6b20d6SBram Moolenaar
33432d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
33442d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3345cfcd011fSBram Moolenaar  var save_rtp = &rtp
33462d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
33472d6b20d6SBram Moolenaar  augroup test
33482d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
33492d6b20d6SBram Moolenaar  augroup END
33502d6b20d6SBram Moolenaar
33512d6b20d6SBram Moolenaar  normal Y
33522d6b20d6SBram Moolenaar
33532d6b20d6SBram Moolenaar  augroup test
33542d6b20d6SBram Moolenaar    autocmd!
33552d6b20d6SBram Moolenaar  augroup END
33562d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
33572d6b20d6SBram Moolenaar  &rtp = save_rtp
33582d6b20d6SBram Moolenaarenddef
33592d6b20d6SBram Moolenaar
336077e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
336177e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3362cfcd011fSBram Moolenaar  var lines =<< trim END
336377e5dcc3SBram Moolenaar      vim9script
336477e5dcc3SBram Moolenaar      def crash#func()
336577e5dcc3SBram Moolenaar          try
336677e5dcc3SBram Moolenaar              for x in List()
336777e5dcc3SBram Moolenaar              endfor
336877e5dcc3SBram Moolenaar          catch
336977e5dcc3SBram Moolenaar          endtry
337077e5dcc3SBram Moolenaar          g:ok = true
337177e5dcc3SBram Moolenaar      enddef
337277e5dcc3SBram Moolenaar      fu List()
337377e5dcc3SBram Moolenaar          invalid
337477e5dcc3SBram Moolenaar      endfu
337577e5dcc3SBram Moolenaar      try
337648e11c10SBram Moolenaar          alsoinvalid
337777e5dcc3SBram Moolenaar      catch /wontmatch/
337877e5dcc3SBram Moolenaar      endtry
337977e5dcc3SBram Moolenaar  END
338077e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
338177e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
338277e5dcc3SBram Moolenaar
338377e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
338477e5dcc3SBram Moolenaar  lines =<< trim END
338577e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
338677e5dcc3SBram Moolenaar    call crash#func()
338777e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
33889c4f5520SBram Moolenaar    qall!
338977e5dcc3SBram Moolenaar  END
339077e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
339177e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
339277e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
339377e5dcc3SBram Moolenaar
339477e5dcc3SBram Moolenaar  delete('Xdidit')
339577e5dcc3SBram Moolenaar  delete('Xscript')
339677e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
339703290b84SBram Moolenaar
339803290b84SBram Moolenaar  lines =<< trim END
339903290b84SBram Moolenaar    vim9script
340003290b84SBram Moolenaar    var foo#bar = 'asdf'
340103290b84SBram Moolenaar  END
340203290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
340377e5dcc3SBram Moolenaarenddef
340477e5dcc3SBram Moolenaar
340581e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
340681e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
340781e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3408cfcd011fSBram Moolenaar  var lines =<< trim END
340981e17fbeSBram Moolenaar    let s:counter = 1
341081e17fbeSBram Moolenaar    def s:Func()
341181e17fbeSBram Moolenaar      au! CursorHold
341281e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
341381e17fbeSBram Moolenaar    enddef
341481e17fbeSBram Moolenaar    call s:Func()
341581e17fbeSBram Moolenaar    doau CursorHold
341681e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
341781e17fbeSBram Moolenaar    au! CursorHold
341881e17fbeSBram Moolenaar  END
341981e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
342081e17fbeSBram Moolenaarenddef
342181e17fbeSBram Moolenaar
34223896a105SBram Moolenaardef Test_cmdline_win()
34233896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
34243896a105SBram Moolenaar  # the command line window.
34253896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3426cfcd011fSBram Moolenaar  var export_lines =<< trim END
34273896a105SBram Moolenaar    vim9script
3428cfcd011fSBram Moolenaar    export var That = 'yes'
34293896a105SBram Moolenaar  END
34303896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3431cfcd011fSBram Moolenaar  var import_lines =<< trim END
34323896a105SBram Moolenaar    vim9script
34333896a105SBram Moolenaar    import That from './Xexport.vim'
34343896a105SBram Moolenaar  END
34353896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3436cfcd011fSBram Moolenaar  var save_rtp = &rtp
34373896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
34383896a105SBram Moolenaar  syntax on
34393896a105SBram Moolenaar  augroup CmdWin
34403896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
34413896a105SBram Moolenaar  augroup END
34423896a105SBram Moolenaar  # this will open and also close the cmdline window
34433896a105SBram Moolenaar  feedkeys('q:', 'xt')
34443896a105SBram Moolenaar  assert_equal('yes', g:got_there)
34453896a105SBram Moolenaar
34463896a105SBram Moolenaar  augroup CmdWin
34473896a105SBram Moolenaar    au!
34483896a105SBram Moolenaar  augroup END
34493896a105SBram Moolenaar  &rtp = save_rtp
34503896a105SBram Moolenaar  delete('rtp', 'rf')
34513896a105SBram Moolenaarenddef
34523896a105SBram Moolenaar
3453e3d4685fSBram Moolenaardef Test_invalid_sid()
3454e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
345525859dd7SBram Moolenaar
34569c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3457d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3458e3d4685fSBram Moolenaar  endif
3459e3d4685fSBram Moolenaar  delete('Xdidit')
3460e3d4685fSBram Moolenaarenddef
3461e3d4685fSBram Moolenaar
34629ec7026fSBram Moolenaardef Test_restoring_cpo()
34639ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
34649ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
34659ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
34669ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
34679ec7026fSBram Moolenaar  endif
34689ec7026fSBram Moolenaar  delete('Xsourced')
34699ec7026fSBram Moolenaar  delete('Xclose')
3470090728adSBram Moolenaar  delete('Xdone')
34710123cc1eSBram Moolenaar
34720123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
34730123cc1eSBram Moolenaar  set cpo=aABceFsMny>
34740123cc1eSBram Moolenaar  edit XanotherScript
34750123cc1eSBram Moolenaar  so %
34760123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
34770123cc1eSBram Moolenaar  :1del
34780123cc1eSBram Moolenaar  w
34790123cc1eSBram Moolenaar  so %
34800123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
34810123cc1eSBram Moolenaar
34820123cc1eSBram Moolenaar  delete('XanotherScript')
34830123cc1eSBram Moolenaar  set cpo&vim
34849ec7026fSBram Moolenaarenddef
34859ec7026fSBram Moolenaar
3486ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3487ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
348837294bd6SBram Moolenaar  CheckScreendump
3489ffb7dcdbSBram Moolenaar  CheckFeature timers
349037294bd6SBram Moolenaar
3491ffb7dcdbSBram Moolenaar  let lines =<< trim END
349237294bd6SBram Moolenaar    vim9script
349337294bd6SBram Moolenaar    def script#func()
349437294bd6SBram Moolenaar    enddef
349537294bd6SBram Moolenaar  END
3496ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3497ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
349837294bd6SBram Moolenaar
3499ffb7dcdbSBram Moolenaar  let lines =<< trim END
350037294bd6SBram Moolenaar      vim9script
350137294bd6SBram Moolenaar      set cpo+=M
350237294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
350337294bd6SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, () => script#func())
350437294bd6SBram Moolenaar      setline(1, 'some text')
350537294bd6SBram Moolenaar  END
3506ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3507ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3508ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3509ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
351037294bd6SBram Moolenaar
3511ffb7dcdbSBram Moolenaar  " clean up
3512ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3513ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3514ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3515ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3516ffb7dcdbSBram Moolenaarendfunc
351737294bd6SBram Moolenaar
35189ec7026fSBram Moolenaar
3519f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3520cfcd011fSBram Moolenaar  var lines =<< trim END
3521cfcd011fSBram Moolenaar    var name: any
3522cfcd011fSBram Moolenaar    assert_equal(0, name)
3523f0afd9e1SBram Moolenaar  END
3524f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3525f0afd9e1SBram Moolenaarenddef
3526f0afd9e1SBram Moolenaar
35277e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
352858dbef33SBram Moolenaar  CheckRunVimInTerminal
352958dbef33SBram Moolenaar
35307e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
35317e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
35327e9210eaSBram Moolenaarendfunc
35337e9210eaSBram Moolenaar
35347e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
35359c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3536cfcd011fSBram Moolenaar  var lines =<< trim END
35379c4f5520SBram Moolenaar    func CheckAndQuit()
35389c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
35399c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
35409c4f5520SBram Moolenaar    endfunc
35419c4f5520SBram Moolenaar  END
35429c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
35439c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3544e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
35459c4f5520SBram Moolenaar  # define Afunc() on the command line
35469c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
35479c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
35482949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
35499c4f5520SBram Moolenaar
35509c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
35519c4f5520SBram Moolenaar  delete('XcallFunc')
35529c4f5520SBram Moolenaar  delete('Xdidcmd')
35539c4f5520SBram Moolenaarenddef
35549c4f5520SBram Moolenaar
3555fcdc5d83SBram Moolenaardef Test_script_var_scope()
3556fcdc5d83SBram Moolenaar  var lines =<< trim END
3557fcdc5d83SBram Moolenaar      vim9script
3558fcdc5d83SBram Moolenaar      if true
3559fcdc5d83SBram Moolenaar        if true
3560fcdc5d83SBram Moolenaar          var one = 'one'
3561fcdc5d83SBram Moolenaar          echo one
3562fcdc5d83SBram Moolenaar        endif
3563fcdc5d83SBram Moolenaar        echo one
3564fcdc5d83SBram Moolenaar      endif
3565fcdc5d83SBram Moolenaar  END
3566fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3567fcdc5d83SBram Moolenaar
3568fcdc5d83SBram Moolenaar  lines =<< trim END
3569fcdc5d83SBram Moolenaar      vim9script
3570fcdc5d83SBram Moolenaar      if true
3571fcdc5d83SBram Moolenaar        if false
3572fcdc5d83SBram Moolenaar          var one = 'one'
3573fcdc5d83SBram Moolenaar          echo one
3574fcdc5d83SBram Moolenaar        else
3575fcdc5d83SBram Moolenaar          var one = 'one'
3576fcdc5d83SBram Moolenaar          echo one
3577fcdc5d83SBram Moolenaar        endif
3578fcdc5d83SBram Moolenaar        echo one
3579fcdc5d83SBram Moolenaar      endif
3580fcdc5d83SBram Moolenaar  END
3581fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3582fcdc5d83SBram Moolenaar
3583fcdc5d83SBram Moolenaar  lines =<< trim END
3584fcdc5d83SBram Moolenaar      vim9script
3585fcdc5d83SBram Moolenaar      while true
3586fcdc5d83SBram Moolenaar        var one = 'one'
3587fcdc5d83SBram Moolenaar        echo one
3588fcdc5d83SBram Moolenaar        break
3589fcdc5d83SBram Moolenaar      endwhile
3590fcdc5d83SBram Moolenaar      echo one
3591fcdc5d83SBram Moolenaar  END
3592fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3593fcdc5d83SBram Moolenaar
3594fcdc5d83SBram Moolenaar  lines =<< trim END
3595fcdc5d83SBram Moolenaar      vim9script
3596fcdc5d83SBram Moolenaar      for i in range(1)
3597fcdc5d83SBram Moolenaar        var one = 'one'
3598fcdc5d83SBram Moolenaar        echo one
3599fcdc5d83SBram Moolenaar      endfor
3600fcdc5d83SBram Moolenaar      echo one
3601fcdc5d83SBram Moolenaar  END
3602fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
36039becdf2bSBram Moolenaar
36049becdf2bSBram Moolenaar  lines =<< trim END
36059becdf2bSBram Moolenaar      vim9script
36069becdf2bSBram Moolenaar      {
36079becdf2bSBram Moolenaar        var one = 'one'
36089becdf2bSBram Moolenaar        assert_equal('one', one)
36099becdf2bSBram Moolenaar      }
36109becdf2bSBram Moolenaar      assert_false(exists('one'))
36119becdf2bSBram Moolenaar      assert_false(exists('s:one'))
36129becdf2bSBram Moolenaar  END
36139becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
36149becdf2bSBram Moolenaar
36159becdf2bSBram Moolenaar  lines =<< trim END
36169becdf2bSBram Moolenaar      vim9script
36179becdf2bSBram Moolenaar      {
36189becdf2bSBram Moolenaar        var one = 'one'
36199becdf2bSBram Moolenaar        echo one
36209becdf2bSBram Moolenaar      }
36219becdf2bSBram Moolenaar      echo one
36229becdf2bSBram Moolenaar  END
36239becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3624fcdc5d83SBram Moolenaarenddef
3625fcdc5d83SBram Moolenaar
3626352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3627352134bbSBram Moolenaar  var lines =<< trim END
3628352134bbSBram Moolenaar    vim9script
3629352134bbSBram Moolenaar    def Callback(...l: any)
3630352134bbSBram Moolenaar      try
3631352134bbSBram Moolenaar        var x: string
3632352134bbSBram Moolenaar        var y: string
3633352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3634352134bbSBram Moolenaar        [x, y] = ['']
3635352134bbSBram Moolenaar      catch
3636352134bbSBram Moolenaar        g:caught = 'yes'
3637352134bbSBram Moolenaar      endtry
3638352134bbSBram Moolenaar    enddef
3639e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3640352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3641352134bbSBram Moolenaar  END
3642352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3643352134bbSBram Moolenaar
3644352134bbSBram Moolenaar  unlet g:caught
3645352134bbSBram Moolenaarenddef
3646352134bbSBram Moolenaar
3647631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3648631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3649631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3650631e8f93SBram Moolenaar  endif
3651631e8f93SBram Moolenaar  var lines =<< trim END
3652631e8f93SBram Moolenaar      vim9script
3653631e8f93SBram Moolenaar      var source: list<number>
3654631e8f93SBram Moolenaar      def Out_cb(...l: any)
3655631e8f93SBram Moolenaar          eval [][0]
3656631e8f93SBram Moolenaar      enddef
3657631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3658631e8f93SBram Moolenaar          sleep 1m
3659631e8f93SBram Moolenaar          source += l
3660631e8f93SBram Moolenaar      enddef
3661e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
36626f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
36636f17a3f0SBram Moolenaar        sleep 10m
36646f17a3f0SBram Moolenaar      endwhile
3665206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3666206c2a6eSBram Moolenaar      sleep 100m
3667631e8f93SBram Moolenaar  END
3668631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3669631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3670631e8f93SBram Moolenaar  delete('Xdef')
3671631e8f93SBram Moolenaarenddef
3672631e8f93SBram Moolenaar
36734324d87aSBram Moolenaardef InvokeNormal()
36744324d87aSBram Moolenaar  exe "norm! :m+1\r"
36754324d87aSBram Moolenaarenddef
36764324d87aSBram Moolenaar
36774324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
36784324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
36794324d87aSBram Moolenaar  new
36804324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
36814324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
36824324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
36834324d87aSBram Moolenaar  xunmap <F3>
3684b5b9480eSBram Moolenaarenddef
3685b5b9480eSBram Moolenaar
3686b5b9480eSBram Moolenaardef Test_white_space_after_command()
3687b5b9480eSBram Moolenaar  var lines =<< trim END
3688b5b9480eSBram Moolenaar    exit_cb: Func})
3689b5b9480eSBram Moolenaar  END
3690b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3691f8103f27SBram Moolenaar
3692f8103f27SBram Moolenaar  lines =<< trim END
3693f8103f27SBram Moolenaar    e#
3694f8103f27SBram Moolenaar  END
3695f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
36964324d87aSBram Moolenaarenddef
36974324d87aSBram Moolenaar
36984aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
36994aab88d9SBram Moolenaar  var lines =<< trim END
37004aab88d9SBram Moolenaar      vim9script
37014aab88d9SBram Moolenaar      if exists('g:guard')
37024aab88d9SBram Moolenaar        finish
37034aab88d9SBram Moolenaar      endif
37044aab88d9SBram Moolenaar      g:guard = 1
37054aab88d9SBram Moolenaar      var name = 'thename'
37064aab88d9SBram Moolenaar      def g:GetName(): string
37074aab88d9SBram Moolenaar        return name
37084aab88d9SBram Moolenaar      enddef
37094aab88d9SBram Moolenaar      def g:SetName(arg: string)
37104aab88d9SBram Moolenaar        name = arg
37114aab88d9SBram Moolenaar      enddef
37124aab88d9SBram Moolenaar  END
37134aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
37144aab88d9SBram Moolenaar  so XscriptTwice.vim
37154aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
37164aab88d9SBram Moolenaar  g:SetName('newname')
37174aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
37184aab88d9SBram Moolenaar  so XscriptTwice.vim
37194aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
37204aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
37214aab88d9SBram Moolenaar
37224aab88d9SBram Moolenaar  delfunc g:GetName
37234aab88d9SBram Moolenaar  delfunc g:SetName
37244aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
37254aab88d9SBram Moolenaar  unlet g:guard
37264aab88d9SBram Moolenaarenddef
37274aab88d9SBram Moolenaar
37284aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
37294aab88d9SBram Moolenaar  var exportlines =<< trim END
37304aab88d9SBram Moolenaar      vim9script
37314aab88d9SBram Moolenaar      if exists('g:guard')
37324aab88d9SBram Moolenaar        finish
37334aab88d9SBram Moolenaar      endif
37344aab88d9SBram Moolenaar      g:guard = 1
37354aab88d9SBram Moolenaar      export var name = 'someName'
37364aab88d9SBram Moolenaar  END
37374aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
37384aab88d9SBram Moolenaar
37394aab88d9SBram Moolenaar  var lines =<< trim END
37404aab88d9SBram Moolenaar      vim9script
37414aab88d9SBram Moolenaar      import name from './XexportScript.vim'
37424aab88d9SBram Moolenaar      def g:GetName(): string
37434aab88d9SBram Moolenaar        return name
37444aab88d9SBram Moolenaar      enddef
37454aab88d9SBram Moolenaar  END
37464aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
37474aab88d9SBram Moolenaar  so XscriptImport.vim
37484aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
37494aab88d9SBram Moolenaar
37504aab88d9SBram Moolenaar  so XexportScript.vim
37514aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
37524aab88d9SBram Moolenaar
37534aab88d9SBram Moolenaar  delfunc g:GetName
37544aab88d9SBram Moolenaar  delete('XexportScript.vim')
37554aab88d9SBram Moolenaar  delete('XscriptImport.vim')
37564aab88d9SBram Moolenaar  unlet g:guard
37574aab88d9SBram Moolenaarenddef
37584aab88d9SBram Moolenaar
375910b9421fSBram Moolenaardef Test_unsupported_commands()
376010b9421fSBram Moolenaar  var lines =<< trim END
376110b9421fSBram Moolenaar      ka
376210b9421fSBram Moolenaar  END
376310b9421fSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1100:')
376410b9421fSBram Moolenaar
376510b9421fSBram Moolenaar  lines =<< trim END
3766ada1d870SBram Moolenaar      :1ka
3767ada1d870SBram Moolenaar  END
3768ada1d870SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E481:')
3769ada1d870SBram Moolenaar
3770ada1d870SBram Moolenaar  lines =<< trim END
377110b9421fSBram Moolenaar    t
377210b9421fSBram Moolenaar  END
377310b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
377410b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
377510b9421fSBram Moolenaar
377610b9421fSBram Moolenaar  lines =<< trim END
377710b9421fSBram Moolenaar    x
377810b9421fSBram Moolenaar  END
377910b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
378010b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
378110b9421fSBram Moolenaar
378210b9421fSBram Moolenaar  lines =<< trim END
378310b9421fSBram Moolenaar    xit
378410b9421fSBram Moolenaar  END
378510b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
378610b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
378710b9421fSBram Moolenaarenddef
378810b9421fSBram Moolenaar
3789585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3790585fea7bSBram Moolenaardef Test_substitute_cmd()
3791585fea7bSBram Moolenaar  new
3792585fea7bSBram Moolenaar  setline(1, 'something')
3793585fea7bSBram Moolenaar  :substitute(some(other(
3794585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3795585fea7bSBram Moolenaar  bwipe!
3796585fea7bSBram Moolenaar
3797f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3798cfcd011fSBram Moolenaar  var lines =<< trim END
3799585fea7bSBram Moolenaar    vim9script
3800585fea7bSBram Moolenaar    new
3801585fea7bSBram Moolenaar    setline(1, 'something')
3802585fea7bSBram Moolenaar    :substitute(some(other(
3803585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3804585fea7bSBram Moolenaar    bwipe!
3805585fea7bSBram Moolenaar  END
3806585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3807585fea7bSBram Moolenaar  source Xvim9lines
3808585fea7bSBram Moolenaar
3809585fea7bSBram Moolenaar  delete('Xvim9lines')
3810585fea7bSBram Moolenaarenddef
3811585fea7bSBram Moolenaar
38128a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3813