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
595*2e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to
596*2e34c34bSBram Moolenaardef TryContinueFunc()
597*2e34c34bSBram Moolenaar while g:Count < 2
598*2e34c34bSBram Moolenaar   g:sequence ..= 't'
599*2e34c34bSBram Moolenaar    try
600*2e34c34bSBram Moolenaar      echoerr 'Test'
601*2e34c34bSBram Moolenaar    catch
602*2e34c34bSBram Moolenaar      g:Count += 1
603*2e34c34bSBram Moolenaar      g:sequence ..= 'c'
604*2e34c34bSBram Moolenaar      continue
605*2e34c34bSBram Moolenaar    endtry
606*2e34c34bSBram Moolenaar    g:sequence ..= 'e'
607*2e34c34bSBram Moolenaar    g:Count += 1
608*2e34c34bSBram Moolenaar  endwhile
609*2e34c34bSBram Moolenaarenddef
610*2e34c34bSBram Moolenaar
611*2e34c34bSBram Moolenaardef Test_continue_in_try_in_while()
612*2e34c34bSBram Moolenaar  g:Count = 0
613*2e34c34bSBram Moolenaar  g:sequence = ''
614*2e34c34bSBram Moolenaar  TryContinueFunc()
615*2e34c34bSBram Moolenaar  assert_equal('tctc', g:sequence)
616*2e34c34bSBram Moolenaar  unlet g:Count
617*2e34c34bSBram Moolenaar  unlet g:sequence
618*2e34c34bSBram Moolenaarenddef
619*2e34c34bSBram 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.
1253750802b5SBram Moolenaar  set cpo&vi
1254cfcd011fSBram Moolenaar  var cpo_before = &cpo
1255cfcd011fSBram Moolenaar  var lines =<< trim END
1256750802b5SBram Moolenaar    vim9script
1257750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1258750802b5SBram Moolenaar  END
1259750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1260750802b5SBram Moolenaar  source Xvim9_script
1261750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1262750802b5SBram Moolenaar  set cpo&vim
1263750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1264750802b5SBram Moolenaar  delete('Xvim9_script')
1265750802b5SBram Moolenaarenddef
1266750802b5SBram Moolenaar
12670a84284eSBram Moolenaardef Test_import_as()
12680a84284eSBram Moolenaar  var export_lines =<< trim END
12690a84284eSBram Moolenaar    vim9script
12700a84284eSBram Moolenaar    export var one = 1
12710a84284eSBram Moolenaar    export var yes = 'yes'
12720a84284eSBram Moolenaar  END
12730a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
12740a84284eSBram Moolenaar
12750a84284eSBram Moolenaar  var import_lines =<< trim END
12760a84284eSBram Moolenaar    vim9script
12770a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
12780a84284eSBram Moolenaar    assert_equal(1, thatOne)
12790a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
12800a84284eSBram Moolenaar    assert_equal('yes', yesYes)
12810a84284eSBram Moolenaar  END
12820a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
12830a84284eSBram Moolenaar
12840a84284eSBram Moolenaar  import_lines =<< trim END
12850a84284eSBram Moolenaar    vim9script
12860a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
12870a84284eSBram Moolenaar    assert_equal(1, thatOne)
12880a84284eSBram Moolenaar    assert_equal('yes', yesYes)
12890a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
12900a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
12910a84284eSBram Moolenaar  END
12920a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
12930a84284eSBram Moolenaar
12940a84284eSBram Moolenaar  delete('XexportAs')
12950a84284eSBram Moolenaarenddef
12960a84284eSBram Moolenaar
1297803af686SBram Moolenaarfunc g:Trigger()
1298803af686SBram Moolenaar  source Ximport.vim
1299803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1300803af686SBram Moolenaarendfunc
1301803af686SBram Moolenaar
1302803af686SBram Moolenaardef Test_import_export_expr_map()
1303803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1304cfcd011fSBram Moolenaar  var export_lines =<< trim END
1305803af686SBram Moolenaar    vim9script
1306803af686SBram Moolenaar    export def That(): string
1307803af686SBram Moolenaar      return 'yes'
1308803af686SBram Moolenaar    enddef
1309803af686SBram Moolenaar  END
1310803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1311803af686SBram Moolenaar
1312cfcd011fSBram Moolenaar  var import_lines =<< trim END
1313803af686SBram Moolenaar    vim9script
1314803af686SBram Moolenaar    import That from './Xexport_that.vim'
1315803af686SBram Moolenaar    assert_equal('yes', That())
1316803af686SBram Moolenaar  END
1317803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1318803af686SBram Moolenaar
1319803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1320803af686SBram Moolenaar  feedkeys('trigger', "xt")
1321803af686SBram Moolenaar
1322730b2483SBram Moolenaar  delete('Xexport_that.vim')
1323803af686SBram Moolenaar  delete('Ximport.vim')
1324803af686SBram Moolenaar  nunmap trigger
1325803af686SBram Moolenaarenddef
1326803af686SBram Moolenaar
13278e1986e3SBram Moolenaardef Test_import_in_filetype()
13288e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
13298e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1330cfcd011fSBram Moolenaar  var export_lines =<< trim END
13318e1986e3SBram Moolenaar    vim9script
1332cfcd011fSBram Moolenaar    export var That = 'yes'
13338e1986e3SBram Moolenaar  END
1334730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
13358e1986e3SBram Moolenaar
1336cfcd011fSBram Moolenaar  var import_lines =<< trim END
13378e1986e3SBram Moolenaar    vim9script
1338730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
13398e1986e3SBram Moolenaar    assert_equal('yes', That)
13408e1986e3SBram Moolenaar    g:did_load_mytpe = 1
13418e1986e3SBram Moolenaar  END
13428e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
13438e1986e3SBram Moolenaar
1344cfcd011fSBram Moolenaar  var save_rtp = &rtp
13458e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
13468e1986e3SBram Moolenaar
13478e1986e3SBram Moolenaar  filetype plugin on
13488e1986e3SBram Moolenaar  copen
13498e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
13508e1986e3SBram Moolenaar
13518e1986e3SBram Moolenaar  quit!
1352730b2483SBram Moolenaar  delete('Xexport_ft.vim')
13538e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
13548e1986e3SBram Moolenaar  &rtp = save_rtp
13558e1986e3SBram Moolenaarenddef
13568e1986e3SBram Moolenaar
1357efa94447SBram Moolenaardef Test_use_import_in_mapping()
1358cfcd011fSBram Moolenaar  var lines =<< trim END
1359efa94447SBram Moolenaar      vim9script
1360efa94447SBram Moolenaar      export def Funcx()
1361efa94447SBram Moolenaar        g:result = 42
1362efa94447SBram Moolenaar      enddef
1363efa94447SBram Moolenaar  END
1364efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1365efa94447SBram Moolenaar  lines =<< trim END
1366efa94447SBram Moolenaar      vim9script
1367efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1368b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1369efa94447SBram Moolenaar  END
1370efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1371efa94447SBram Moolenaar
1372efa94447SBram Moolenaar  source Xmapscript.vim
1373b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1374efa94447SBram Moolenaar  assert_equal(42, g:result)
1375efa94447SBram Moolenaar
1376efa94447SBram Moolenaar  unlet g:result
1377efa94447SBram Moolenaar  delete('XsomeExport.vim')
1378efa94447SBram Moolenaar  delete('Xmapscript.vim')
1379b3ca9824SBram Moolenaar  nunmap <F3>
1380efa94447SBram Moolenaarenddef
1381efa94447SBram Moolenaar
1382d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1383d3f8a9eeSBram Moolenaar  var lines =<< trim END
1384d3f8a9eeSBram Moolenaar    if has(g:feature)
1385d3f8a9eeSBram Moolenaar      " legacy script
1386d3f8a9eeSBram Moolenaar      let g:legacy = 1
1387d3f8a9eeSBram Moolenaar      finish
1388d3f8a9eeSBram Moolenaar    endif
1389d3f8a9eeSBram Moolenaar    vim9script
1390d3f8a9eeSBram Moolenaar    g:legacy = 0
1391d3f8a9eeSBram Moolenaar  END
1392d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1393d3f8a9eeSBram Moolenaar  g:legacy = -1
1394d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1395d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1396d3f8a9eeSBram Moolenaar
1397d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1398d3f8a9eeSBram Moolenaar  g:legacy = -1
1399d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1400d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1401d3f8a9eeSBram Moolenaarenddef
1402d3f8a9eeSBram Moolenaar
1403750802b5SBram Moolenaardef Test_vim9script_fails()
14048a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
14058a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1406cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
14079721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1408cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1409750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1410750802b5SBram Moolenaar
1411cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1412c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1413c785b9a7SBram Moolenaar
1414e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1415e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
14168a7d6542SBram Moolenaarenddef
14178a7d6542SBram Moolenaar
1418f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1419101f4810SBram Moolenaar  CheckRunVimInTerminal
1420101f4810SBram Moolenaar
14219bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1422c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
14239bb3eb3eSBram Moolenaarendfunc
14249bb3eb3eSBram Moolenaar
1425c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1426cfcd011fSBram Moolenaar  var export =<< trim END
1427101f4810SBram Moolenaar    vim9script
1428101f4810SBram Moolenaar    export def Foo(): number
1429101f4810SBram Moolenaar        return 0
1430101f4810SBram Moolenaar    enddef
1431101f4810SBram Moolenaar  END
1432730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1433101f4810SBram Moolenaar
1434e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
14359bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
14362949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1437101f4810SBram Moolenaar
1438730b2483SBram Moolenaar  delete('XexportCmd.vim')
14399bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
14409bb3eb3eSBram Moolenaarenddef
1441101f4810SBram Moolenaar
14422b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
14432b32700dSBram Moolenaar  var lines =<< trim END
1444a6294955SBram Moolenaar    vim9script
1445a6294955SBram Moolenaar    export var exported = 'thexport'
1446a6294955SBram Moolenaar  END
1447a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1448a6294955SBram Moolenaar  lines =<< trim END
14492b32700dSBram Moolenaar    vim9script noclear
14502b32700dSBram Moolenaar    g:loadCount += 1
14512b32700dSBram Moolenaar    var s:reloaded = 'init'
1452a6294955SBram Moolenaar    import exported from './XExportReload'
14532b32700dSBram Moolenaar
14542b32700dSBram Moolenaar    def Again(): string
14552b32700dSBram Moolenaar      return 'again'
14562b32700dSBram Moolenaar    enddef
14572b32700dSBram Moolenaar
14582b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
14592b32700dSBram Moolenaar    var s:loaded = true
14602b32700dSBram Moolenaar
14612b32700dSBram Moolenaar    var s:notReloaded = 'yes'
14622b32700dSBram Moolenaar    s:reloaded = 'first'
14632b32700dSBram Moolenaar    def g:Values(): list<string>
1464a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
14652b32700dSBram Moolenaar    enddef
14662b32700dSBram Moolenaar
14672b32700dSBram Moolenaar    def Once(): string
14682b32700dSBram Moolenaar      return 'once'
14692b32700dSBram Moolenaar    enddef
14702b32700dSBram Moolenaar  END
14712b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
14722b32700dSBram Moolenaar  g:loadCount = 0
14732b32700dSBram Moolenaar  source XReloaded
14742b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1475a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
14762b32700dSBram Moolenaar  source XReloaded
14772b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1478a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
14792b32700dSBram Moolenaar  source XReloaded
14802b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1481a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
14822b32700dSBram Moolenaar
148348e11c10SBram Moolenaar  delete('XReloaded')
1484a6294955SBram Moolenaar  delete('XExportReload')
14852b32700dSBram Moolenaar  delfunc g:Values
14862b32700dSBram Moolenaar  unlet g:loadCount
14872b32700dSBram Moolenaarenddef
14882b32700dSBram Moolenaar
14894c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1490cfcd011fSBram Moolenaar  var lines =<< trim END
14918a7d6542SBram Moolenaar    vim9script
14928a7d6542SBram Moolenaar    const var = ''
1493cfcd011fSBram Moolenaar    var valone = 1234
14948a7d6542SBram Moolenaar    def MyFunc(arg: string)
14958a7d6542SBram Moolenaar       valone = 5678
14968a7d6542SBram Moolenaar    enddef
14978a7d6542SBram Moolenaar  END
1498cfcd011fSBram Moolenaar  var morelines =<< trim END
1499cfcd011fSBram Moolenaar    var valtwo = 222
15008a7d6542SBram Moolenaar    export def GetValtwo(): number
15018a7d6542SBram Moolenaar      return valtwo
15028a7d6542SBram Moolenaar    enddef
15038a7d6542SBram Moolenaar  END
150403afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
15058a7d6542SBram Moolenaar  source Xreload.vim
15068a7d6542SBram Moolenaar  source Xreload.vim
15078a7d6542SBram Moolenaar  source Xreload.vim
15088a7d6542SBram Moolenaar
1509cfcd011fSBram Moolenaar  var testlines =<< trim END
15108a7d6542SBram Moolenaar    vim9script
15118a7d6542SBram Moolenaar    def TheFunc()
15128a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
15138a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
15148a7d6542SBram Moolenaar    enddef
15158a7d6542SBram Moolenaar    TheFunc()
15168a7d6542SBram Moolenaar  END
15178a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
15188a7d6542SBram Moolenaar  source Ximport.vim
15198a7d6542SBram Moolenaar
1520f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1521f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
15228a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15238a7d6542SBram Moolenaar  source Ximport.vim
15248a7d6542SBram Moolenaar
1525f5be8cdbSBram Moolenaar  # cannot declare a var twice
15268a7d6542SBram Moolenaar  lines =<< trim END
15278a7d6542SBram Moolenaar    vim9script
1528cfcd011fSBram Moolenaar    var valone = 1234
1529cfcd011fSBram Moolenaar    var valone = 5678
15308a7d6542SBram Moolenaar  END
15318a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
153244d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
15338a7d6542SBram Moolenaar
15348a7d6542SBram Moolenaar  delete('Xreload.vim')
15358a7d6542SBram Moolenaar  delete('Ximport.vim')
15368a7d6542SBram Moolenaarenddef
15378a7d6542SBram Moolenaar
153807a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
153907a65d26SBram Moolenaar" compiled function using that variable must fail.
154007a65d26SBram Moolenaardef Test_script_reload_change_type()
154107a65d26SBram Moolenaar  var lines =<< trim END
154207a65d26SBram Moolenaar    vim9script noclear
154307a65d26SBram Moolenaar    var str = 'string'
154407a65d26SBram Moolenaar    def g:GetStr(): string
154507a65d26SBram Moolenaar      return str .. 'xxx'
154607a65d26SBram Moolenaar    enddef
154707a65d26SBram Moolenaar  END
154807a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
154907a65d26SBram Moolenaar  source Xreload.vim
155007a65d26SBram Moolenaar  echo g:GetStr()
155107a65d26SBram Moolenaar
155207a65d26SBram Moolenaar  lines =<< trim END
155307a65d26SBram Moolenaar    vim9script noclear
155407a65d26SBram Moolenaar    var str = 1234
155507a65d26SBram Moolenaar  END
155607a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
155707a65d26SBram Moolenaar  source Xreload.vim
155807a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
155907a65d26SBram Moolenaar
156007a65d26SBram Moolenaar  delfunc g:GetStr
156107a65d26SBram Moolenaar  delete('Xreload.vim')
156207a65d26SBram Moolenaarenddef
156307a65d26SBram Moolenaar
15646c3843caSBram Moolenaardef Test_script_var_shadows_function()
15656c3843caSBram Moolenaar  var lines =<< trim END
15666c3843caSBram Moolenaar      vim9script
15676c3843caSBram Moolenaar      def Func(): number
15686c3843caSBram Moolenaar        return 123
15696c3843caSBram Moolenaar      enddef
15706c3843caSBram Moolenaar      var Func = 1
15716c3843caSBram Moolenaar  END
15726c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
15736c3843caSBram Moolenaarenddef
15746c3843caSBram Moolenaar
157595006e3dSBram Moolenaardef s:RetSome(): string
157695006e3dSBram Moolenaar  return 'some'
157795006e3dSBram Moolenaarenddef
157895006e3dSBram Moolenaar
1579fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1580fe465a01SBram Moolenaar" script-local name.
1581fe465a01SBram Moolenaardef Test_vim9script_funcref()
1582cfcd011fSBram Moolenaar  var sortlines =<< trim END
1583fe465a01SBram Moolenaar      vim9script
1584fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1585bed36b93SBram Moolenaar        return i2 - i1
1586fe465a01SBram Moolenaar      enddef
1587fe465a01SBram Moolenaar
1588fe465a01SBram Moolenaar      export def FastSort(): list<number>
1589fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1590fe465a01SBram Moolenaar      enddef
1591fe465a01SBram Moolenaar  END
1592fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1593fe465a01SBram Moolenaar
1594cfcd011fSBram Moolenaar  var lines =<< trim END
1595fe465a01SBram Moolenaar    vim9script
1596fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1597fe465a01SBram Moolenaar    def Test()
1598fe465a01SBram Moolenaar      g:result = FastSort()
1599fe465a01SBram Moolenaar    enddef
1600fe465a01SBram Moolenaar    Test()
1601fe465a01SBram Moolenaar  END
1602fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1603fe465a01SBram Moolenaar
1604fe465a01SBram Moolenaar  source Xscript.vim
1605fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1606fe465a01SBram Moolenaar
1607fe465a01SBram Moolenaar  unlet g:result
1608fe465a01SBram Moolenaar  delete('Xsort.vim')
1609fe465a01SBram Moolenaar  delete('Xscript.vim')
161095006e3dSBram Moolenaar
1611cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
161295006e3dSBram Moolenaar  assert_equal('some', Funcref())
1613fe465a01SBram Moolenaarenddef
1614fe465a01SBram Moolenaar
1615601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1616601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1617601e76acSBram Moolenaar" function reference.
1618c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1619cfcd011fSBram Moolenaar  var filterLines =<< trim END
1620c620c055SBram Moolenaar    vim9script
1621c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1622c620c055SBram Moolenaar      return idx % 2 == 1
1623c620c055SBram Moolenaar    enddef
1624c620c055SBram Moolenaar    export def FastFilter(): list<number>
1625c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1626c620c055SBram Moolenaar    enddef
1627601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1628601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1629601e76acSBram Moolenaar    enddef
1630c620c055SBram Moolenaar  END
1631c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1632c620c055SBram Moolenaar
1633cfcd011fSBram Moolenaar  var lines =<< trim END
1634c620c055SBram Moolenaar    vim9script
1635601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1636c620c055SBram Moolenaar    def Test()
1637cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1638c620c055SBram Moolenaar    enddef
1639c620c055SBram Moolenaar    Test()
1640601e76acSBram Moolenaar    def TestDirect()
1641cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1642601e76acSBram Moolenaar    enddef
1643601e76acSBram Moolenaar    TestDirect()
1644c620c055SBram Moolenaar  END
1645601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1646c620c055SBram Moolenaar  delete('Xfilter.vim')
1647c620c055SBram Moolenaarenddef
1648c620c055SBram Moolenaar
16494c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1650cfcd011fSBram Moolenaar  var first_lines =<< trim END
16514c17ad94SBram Moolenaar    vim9script
16524c17ad94SBram Moolenaar    def FuncYes(): string
16534c17ad94SBram Moolenaar      return 'yes'
16544c17ad94SBram Moolenaar    enddef
16554c17ad94SBram Moolenaar  END
1656cfcd011fSBram Moolenaar  var withno_lines =<< trim END
16574c17ad94SBram Moolenaar    def FuncNo(): string
16584c17ad94SBram Moolenaar      return 'no'
16594c17ad94SBram Moolenaar    enddef
16604c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
16614c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
16624c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
166303afdcf1SBram Moolenaar    enddef
166403afdcf1SBram Moolenaar  END
1665cfcd011fSBram Moolenaar  var nono_lines =<< trim END
166603afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
166703afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
166844d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
16694c17ad94SBram Moolenaar    enddef
16704c17ad94SBram Moolenaar  END
16714c17ad94SBram Moolenaar
16724c17ad94SBram Moolenaar  # FuncNo() is defined
167303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16744c17ad94SBram Moolenaar  source Xreloaded.vim
16754c17ad94SBram Moolenaar  g:DoCheck(true)
16764c17ad94SBram Moolenaar
16774c17ad94SBram Moolenaar  # FuncNo() is not redefined
167803afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
16794c17ad94SBram Moolenaar  source Xreloaded.vim
16805082471fSBram Moolenaar  g:DoCheck(false)
16814c17ad94SBram Moolenaar
16824c17ad94SBram Moolenaar  # FuncNo() is back
168303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16844c17ad94SBram Moolenaar  source Xreloaded.vim
16855082471fSBram Moolenaar  g:DoCheck(false)
16864c17ad94SBram Moolenaar
16874c17ad94SBram Moolenaar  delete('Xreloaded.vim')
16884c17ad94SBram Moolenaarenddef
16894c17ad94SBram Moolenaar
169089483d40SBram Moolenaardef Test_vim9script_reload_delvar()
169189483d40SBram Moolenaar  # write the script with a script-local variable
1692cfcd011fSBram Moolenaar  var lines =<< trim END
169389483d40SBram Moolenaar    vim9script
1694cfcd011fSBram Moolenaar    var name = 'string'
169589483d40SBram Moolenaar  END
169689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
169789483d40SBram Moolenaar  source XreloadVar.vim
169889483d40SBram Moolenaar
169989483d40SBram Moolenaar  # now write the script using the same variable locally - works
170089483d40SBram Moolenaar  lines =<< trim END
170189483d40SBram Moolenaar    vim9script
170289483d40SBram Moolenaar    def Func()
1703cfcd011fSBram Moolenaar      var name = 'string'
170489483d40SBram Moolenaar    enddef
170589483d40SBram Moolenaar  END
170689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
170789483d40SBram Moolenaar  source XreloadVar.vim
170889483d40SBram Moolenaar
170989483d40SBram Moolenaar  delete('XreloadVar.vim')
171089483d40SBram Moolenaarenddef
171189483d40SBram Moolenaar
17128a7d6542SBram Moolenaardef Test_import_absolute()
1713cfcd011fSBram Moolenaar  var import_lines = [
1714e6085c53SBram Moolenaar        'vim9script',
1715e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1716e6085c53SBram Moolenaar        'def UseExported()',
1717e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1718e6085c53SBram Moolenaar        '  exported = 8888',
1719e6085c53SBram Moolenaar        '  g:imported_after = exported',
1720e6085c53SBram Moolenaar        'enddef',
1721e6085c53SBram Moolenaar        'UseExported()',
1722e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1723e6085c53SBram Moolenaar        ]
17248a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
17258a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
17268a7d6542SBram Moolenaar
17278a7d6542SBram Moolenaar  source Ximport_abs.vim
17288a7d6542SBram Moolenaar
17298a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
17304e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1731fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1732fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1733fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1734fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1735fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1736fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1737fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1738fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1739fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1740fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1741e6085c53SBram Moolenaar        g:import_disassembled)
1742b3ca9824SBram Moolenaar
1743b3ca9824SBram Moolenaar  Undo_export_script_lines()
17448a7d6542SBram Moolenaar  unlet g:imported_abs
17454e12a5dfSBram Moolenaar  unlet g:import_disassembled
17468a7d6542SBram Moolenaar
17478a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
17488a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
17498a7d6542SBram Moolenaarenddef
17508a7d6542SBram Moolenaar
17518a7d6542SBram Moolenaardef Test_import_rtp()
1752cfcd011fSBram Moolenaar  var import_lines = [
1753e6085c53SBram Moolenaar        'vim9script',
1754e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1755e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1756e6085c53SBram Moolenaar        ]
17578a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
17588a7d6542SBram Moolenaar  mkdir('import')
17598a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
17608a7d6542SBram Moolenaar
1761cfcd011fSBram Moolenaar  var save_rtp = &rtp
17628a7d6542SBram Moolenaar  &rtp = getcwd()
17638a7d6542SBram Moolenaar  source Ximport_rtp.vim
17648a7d6542SBram Moolenaar  &rtp = save_rtp
17658a7d6542SBram Moolenaar
17668a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
17678a7d6542SBram Moolenaar
1768b3ca9824SBram Moolenaar  Undo_export_script_lines()
1769b3ca9824SBram Moolenaar  unlet g:imported_rtp
17708a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
177189483d40SBram Moolenaar  delete('import', 'rf')
17728a7d6542SBram Moolenaarenddef
17738a7d6542SBram Moolenaar
177425e0f586SBram Moolenaardef Test_import_compile_error()
1775cfcd011fSBram Moolenaar  var export_lines = [
177625e0f586SBram Moolenaar        'vim9script',
177725e0f586SBram Moolenaar        'export def ExpFunc(): string',
177825e0f586SBram Moolenaar        '  return notDefined',
177925e0f586SBram Moolenaar        'enddef',
178025e0f586SBram Moolenaar        ]
178125e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
178225e0f586SBram Moolenaar
1783cfcd011fSBram Moolenaar  var import_lines = [
178425e0f586SBram Moolenaar        'vim9script',
178525e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
178625e0f586SBram Moolenaar        'def ImpFunc()',
178725e0f586SBram Moolenaar        '  echo ExpFunc()',
178825e0f586SBram Moolenaar        'enddef',
178925e0f586SBram Moolenaar        'defcompile',
179025e0f586SBram Moolenaar        ]
179125e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
179225e0f586SBram Moolenaar
179325e0f586SBram Moolenaar  try
179425e0f586SBram Moolenaar    source Ximport.vim
179525e0f586SBram Moolenaar  catch /E1001/
1796f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
17977707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
179825e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
179925e0f586SBram Moolenaar  endtry
180025e0f586SBram Moolenaar
180125e0f586SBram Moolenaar  delete('Xexported.vim')
180225e0f586SBram Moolenaar  delete('Ximport.vim')
180325e0f586SBram Moolenaarenddef
180425e0f586SBram Moolenaar
1805c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1806cfcd011fSBram Moolenaar  var lines = [
1807c4ce36d4SBram Moolenaar        'vim9script',
1808c4ce36d4SBram Moolenaar        'def Func()',
1809c4ce36d4SBram Moolenaar        '  eval [][0]',
1810c4ce36d4SBram Moolenaar        'enddef',
1811c4ce36d4SBram Moolenaar        'Func()',
1812c4ce36d4SBram Moolenaar        ]
1813c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1814c4ce36d4SBram Moolenaar
1815c4ce36d4SBram Moolenaar  for count in range(3)
1816c4ce36d4SBram Moolenaar    try
1817c4ce36d4SBram Moolenaar      source Xtestscript.vim
1818c4ce36d4SBram Moolenaar    catch /E684/
1819c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1820c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1821c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1822c4ce36d4SBram Moolenaar    endtry
1823c4ce36d4SBram Moolenaar  endfor
1824c4ce36d4SBram Moolenaar
1825c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1826c4ce36d4SBram Moolenaarenddef
1827c4ce36d4SBram Moolenaar
1828eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1829cfcd011fSBram Moolenaar  var export_lines =<< trim END
1830eef2102eSBram Moolenaar      vim9script
1831eef2102eSBram Moolenaar      export def Func()
1832eef2102eSBram Moolenaar        echo 'imported'
1833eef2102eSBram Moolenaar      enddef
1834eef2102eSBram Moolenaar  END
1835eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1836eef2102eSBram Moolenaar
1837cfcd011fSBram Moolenaar  var lines =<< trim END
1838eef2102eSBram Moolenaar    vim9script
1839eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1840eef2102eSBram Moolenaar    def Func()
1841eef2102eSBram Moolenaar      echo 'local to function'
1842eef2102eSBram Moolenaar    enddef
1843eef2102eSBram Moolenaar  END
1844eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1845eef2102eSBram Moolenaar
1846eef2102eSBram Moolenaar  lines =<< trim END
1847eef2102eSBram Moolenaar    vim9script
1848eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1849eef2102eSBram Moolenaar    def Outer()
1850eef2102eSBram Moolenaar      def Func()
1851eef2102eSBram Moolenaar        echo 'local to function'
1852eef2102eSBram Moolenaar      enddef
1853eef2102eSBram Moolenaar    enddef
1854eef2102eSBram Moolenaar    defcompile
1855eef2102eSBram Moolenaar  END
1856eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1857eef2102eSBram Moolenaar
1858eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1859eef2102eSBram Moolenaarenddef
1860eef2102eSBram Moolenaar
1861b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1862cfcd011fSBram Moolenaar  var lines =<< trim END
1863b9a2cac3SBram Moolenaar    vim9script
1864b9a2cac3SBram Moolenaar    def Func()
1865b9a2cac3SBram Moolenaar      echo 'one'
1866b9a2cac3SBram Moolenaar    enddef
1867b9a2cac3SBram Moolenaar    def Func()
1868b9a2cac3SBram Moolenaar      echo 'two'
1869b9a2cac3SBram Moolenaar    enddef
1870b9a2cac3SBram Moolenaar  END
1871b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1872fa211f3cSBram Moolenaar
1873fa211f3cSBram Moolenaar  lines =<< trim END
1874fa211f3cSBram Moolenaar    vim9script
1875fa211f3cSBram Moolenaar    def Foo(): string
1876fa211f3cSBram Moolenaar      return 'foo'
1877fa211f3cSBram Moolenaar      enddef
1878fa211f3cSBram Moolenaar    def Func()
1879cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1880fa211f3cSBram Moolenaar    enddef
1881fa211f3cSBram Moolenaar    defcompile
1882fa211f3cSBram Moolenaar  END
1883fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1884b9a2cac3SBram Moolenaarenddef
1885b9a2cac3SBram Moolenaar
18868a7d6542SBram Moolenaardef Test_fixed_size_list()
1887f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1888cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
18898a7d6542SBram Moolenaar  l->remove(0)
18908a7d6542SBram Moolenaar  l->add(5)
18918a7d6542SBram Moolenaar  l->insert(99, 1)
18920f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
18938a7d6542SBram Moolenaarenddef
18948a7d6542SBram Moolenaar
1895ae616494SBram Moolenaardef Test_no_insert_xit()
1896d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1897d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1898d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1899d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1900d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1901ae616494SBram Moolenaar
1902ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1903ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1904ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1905ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1906f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1907f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
19086508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
19096508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
1910f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1911f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1912f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1913ae616494SBram Moolenaarenddef
1914ae616494SBram Moolenaar
1915158906cfSBram Moolenaardef IfElse(what: number): string
1916cfcd011fSBram Moolenaar  var res = ''
1917158906cfSBram Moolenaar  if what == 1
1918158906cfSBram Moolenaar    res = "one"
1919158906cfSBram Moolenaar  elseif what == 2
1920158906cfSBram Moolenaar    res = "two"
1921a259d8d3SBram Moolenaar  else
1922158906cfSBram Moolenaar    res = "three"
1923a259d8d3SBram Moolenaar  endif
1924158906cfSBram Moolenaar  return res
1925a259d8d3SBram Moolenaarenddef
1926a259d8d3SBram Moolenaar
1927158906cfSBram Moolenaardef Test_if_elseif_else()
1928158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1929158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1930158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
19310f18b6d1SBram Moolenaarenddef
19320f18b6d1SBram Moolenaar
1933e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1934d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1935d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1936d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1937ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1938d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
19396628b7ebSBram Moolenaar
19406628b7ebSBram Moolenaar  var lines =<< trim END
19416628b7ebSBram Moolenaar      var s = ''
19426628b7ebSBram Moolenaar      if s = ''
19436628b7ebSBram Moolenaar      endif
19446628b7ebSBram Moolenaar  END
19456628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
19466628b7ebSBram Moolenaar
19476628b7ebSBram Moolenaar  lines =<< trim END
19486628b7ebSBram Moolenaar      var s = ''
19496628b7ebSBram Moolenaar      if s == ''
19506628b7ebSBram Moolenaar      elseif s = ''
19516628b7ebSBram Moolenaar      endif
19526628b7ebSBram Moolenaar  END
19536628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
1954e8c4abbbSBram Moolenaarenddef
1955e8c4abbbSBram Moolenaar
19566d69bf60SBram Moolenaarlet g:bool_true = v:true
19576d69bf60SBram Moolenaarlet g:bool_false = v:false
19586d69bf60SBram Moolenaar
19596d69bf60SBram Moolenaardef Test_if_const_expr()
1960cfcd011fSBram Moolenaar  var res = false
19616d69bf60SBram Moolenaar  if true ? true : false
19626d69bf60SBram Moolenaar    res = true
19636d69bf60SBram Moolenaar  endif
19646d69bf60SBram Moolenaar  assert_equal(true, res)
19656d69bf60SBram Moolenaar
1966585fea7bSBram Moolenaar  g:glob = 2
1967585fea7bSBram Moolenaar  if false
19686797966dSBram Moolenaar    execute('g:glob = 3')
1969585fea7bSBram Moolenaar  endif
1970585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1971585fea7bSBram Moolenaar  if true
19726797966dSBram Moolenaar    execute('g:glob = 3')
1973585fea7bSBram Moolenaar  endif
1974585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1975585fea7bSBram Moolenaar
19766d69bf60SBram Moolenaar  res = false
19776d69bf60SBram Moolenaar  if g:bool_true ? true : false
19786d69bf60SBram Moolenaar    res = true
19796d69bf60SBram Moolenaar  endif
19806d69bf60SBram Moolenaar  assert_equal(true, res)
19816d69bf60SBram Moolenaar
19826d69bf60SBram Moolenaar  res = false
19836d69bf60SBram Moolenaar  if true ? g:bool_true : false
19846d69bf60SBram Moolenaar    res = true
19856d69bf60SBram Moolenaar  endif
19866d69bf60SBram Moolenaar  assert_equal(true, res)
19876d69bf60SBram Moolenaar
19886d69bf60SBram Moolenaar  res = false
19896d69bf60SBram Moolenaar  if true ? true : g:bool_false
19906d69bf60SBram Moolenaar    res = true
19916d69bf60SBram Moolenaar  endif
19926d69bf60SBram Moolenaar  assert_equal(true, res)
19936d69bf60SBram Moolenaar
19946d69bf60SBram Moolenaar  res = false
19956d69bf60SBram Moolenaar  if true ? false : true
19966d69bf60SBram Moolenaar    res = true
19976d69bf60SBram Moolenaar  endif
19986d69bf60SBram Moolenaar  assert_equal(false, res)
19996d69bf60SBram Moolenaar
20006d69bf60SBram Moolenaar  res = false
20016d69bf60SBram Moolenaar  if false ? false : true
20026d69bf60SBram Moolenaar    res = true
20036d69bf60SBram Moolenaar  endif
20046d69bf60SBram Moolenaar  assert_equal(true, res)
20056d69bf60SBram Moolenaar
20066d69bf60SBram Moolenaar  res = false
20076d69bf60SBram Moolenaar  if false ? true : false
20086d69bf60SBram Moolenaar    res = true
20096d69bf60SBram Moolenaar  endif
20106d69bf60SBram Moolenaar  assert_equal(false, res)
20116d69bf60SBram Moolenaar
20126d69bf60SBram Moolenaar  res = false
2013e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2014e8c4abbbSBram Moolenaar    res = true
2015e8c4abbbSBram Moolenaar  endif
2016e8c4abbbSBram Moolenaar  assert_equal(false, res)
2017e8c4abbbSBram Moolenaar
2018e8c4abbbSBram Moolenaar  res = false
20196d69bf60SBram Moolenaar  if true && true
20206d69bf60SBram Moolenaar    res = true
20216d69bf60SBram Moolenaar  endif
20226d69bf60SBram Moolenaar  assert_equal(true, res)
20236d69bf60SBram Moolenaar
20246d69bf60SBram Moolenaar  res = false
20256d69bf60SBram Moolenaar  if true && false
20266d69bf60SBram Moolenaar    res = true
20276d69bf60SBram Moolenaar  endif
20286d69bf60SBram Moolenaar  assert_equal(false, res)
20296d69bf60SBram Moolenaar
20306d69bf60SBram Moolenaar  res = false
20316d69bf60SBram Moolenaar  if g:bool_true && false
20326d69bf60SBram Moolenaar    res = true
20336d69bf60SBram Moolenaar  endif
20346d69bf60SBram Moolenaar  assert_equal(false, res)
20356d69bf60SBram Moolenaar
20366d69bf60SBram Moolenaar  res = false
20376d69bf60SBram Moolenaar  if true && g:bool_false
20386d69bf60SBram Moolenaar    res = true
20396d69bf60SBram Moolenaar  endif
20406d69bf60SBram Moolenaar  assert_equal(false, res)
20416d69bf60SBram Moolenaar
20426d69bf60SBram Moolenaar  res = false
20436d69bf60SBram Moolenaar  if false && false
20446d69bf60SBram Moolenaar    res = true
20456d69bf60SBram Moolenaar  endif
20466d69bf60SBram Moolenaar  assert_equal(false, res)
20476d69bf60SBram Moolenaar
20486d69bf60SBram Moolenaar  res = false
20496d69bf60SBram Moolenaar  if true || false
20506d69bf60SBram Moolenaar    res = true
20516d69bf60SBram Moolenaar  endif
20526d69bf60SBram Moolenaar  assert_equal(true, res)
20536d69bf60SBram Moolenaar
20546d69bf60SBram Moolenaar  res = false
20556d69bf60SBram Moolenaar  if g:bool_true || false
20566d69bf60SBram Moolenaar    res = true
20576d69bf60SBram Moolenaar  endif
20586d69bf60SBram Moolenaar  assert_equal(true, res)
20596d69bf60SBram Moolenaar
20606d69bf60SBram Moolenaar  res = false
20616d69bf60SBram Moolenaar  if true || g:bool_false
20626d69bf60SBram Moolenaar    res = true
20636d69bf60SBram Moolenaar  endif
20646d69bf60SBram Moolenaar  assert_equal(true, res)
20656d69bf60SBram Moolenaar
20666d69bf60SBram Moolenaar  res = false
20676d69bf60SBram Moolenaar  if false || false
20686d69bf60SBram Moolenaar    res = true
20696d69bf60SBram Moolenaar  endif
20706d69bf60SBram Moolenaar  assert_equal(false, res)
20713988f64fSBram Moolenaar
20723988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
20733988f64fSBram Moolenaar  if false | eval 0 | endif
20743988f64fSBram Moolenaar  if false | eval burp + 234 | endif
20753988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
20763988f64fSBram Moolenaar  if false
20773988f64fSBram Moolenaar    burp
20783988f64fSBram Moolenaar  endif
207980c34ca3SBram Moolenaarenddef
20806d69bf60SBram Moolenaar
208180c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2082d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2083d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2084d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2085d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
20866d69bf60SBram Moolenaarenddef
20876d69bf60SBram Moolenaar
208872abcf42SBram Moolenaardef RunNested(i: number): number
2089cfcd011fSBram Moolenaar  var x: number = 0
209072abcf42SBram Moolenaar  if i % 2
209172abcf42SBram Moolenaar    if 1
2092f5be8cdbSBram Moolenaar      # comment
209372abcf42SBram Moolenaar    else
2094f5be8cdbSBram Moolenaar      # comment
209572abcf42SBram Moolenaar    endif
209672abcf42SBram Moolenaar    x += 1
209772abcf42SBram Moolenaar  else
209872abcf42SBram Moolenaar    x += 1000
209972abcf42SBram Moolenaar  endif
210072abcf42SBram Moolenaar  return x
210172abcf42SBram Moolenaarenddef
210272abcf42SBram Moolenaar
210372abcf42SBram Moolenaardef Test_nested_if()
210472abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
210572abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
210672abcf42SBram Moolenaarenddef
210772abcf42SBram Moolenaar
2108ad39c094SBram Moolenaardef Test_execute_cmd()
2109e4984290SBram Moolenaar  # missing argument is ignored
2110e4984290SBram Moolenaar  execute
2111e4984290SBram Moolenaar  execute # comment
2112e4984290SBram Moolenaar
2113ad39c094SBram Moolenaar  new
2114ad39c094SBram Moolenaar  setline(1, 'default')
2115d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2116ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2117a72cfb80SBram Moolenaar
2118d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2119a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2120a72cfb80SBram Moolenaar
2121cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2122cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2123a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2124ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2125a72cfb80SBram Moolenaar
2126d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2127ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2128a72cfb80SBram Moolenaar
2129cfcd011fSBram Moolenaar  var cmd_first = 'call '
2130cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2131ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2132ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2133ad39c094SBram Moolenaar  bwipe!
2134585fea7bSBram Moolenaar
2135cfcd011fSBram Moolenaar  var n = true
21362d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
21372d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
21382d6b20d6SBram Moolenaar
2139e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2140e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2141e5abf7afSBram Moolenaar
2142d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2143d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2144d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2145ad39c094SBram Moolenaarenddef
2146ad39c094SBram Moolenaar
214747e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2148f5be8cdbSBram Moolenaar  # only checks line continuation
2149cfcd011fSBram Moolenaar  var lines =<< trim END
215047e880d6SBram Moolenaar      vim9script
215147e880d6SBram Moolenaar      execute 'g:someVar'
215247e880d6SBram Moolenaar                .. ' = ' ..
215347e880d6SBram Moolenaar                   '28'
215447e880d6SBram Moolenaar      assert_equal(28, g:someVar)
215547e880d6SBram Moolenaar      unlet g:someVar
215647e880d6SBram Moolenaar  END
215747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
215847e880d6SBram Moolenaarenddef
215947e880d6SBram Moolenaar
2160ad39c094SBram Moolenaardef Test_echo_cmd()
2161a72cfb80SBram Moolenaar  echo 'some' # comment
2162585fea7bSBram Moolenaar  echon 'thing'
2163ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2164ad39c094SBram Moolenaar
2165a72cfb80SBram Moolenaar  echo "some" # comment
2166a72cfb80SBram Moolenaar  echon "thing"
2167a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2168a72cfb80SBram Moolenaar
2169cfcd011fSBram Moolenaar  var str1 = 'some'
2170cfcd011fSBram Moolenaar  var str2 = 'more'
2171ad39c094SBram Moolenaar  echo str1 str2
2172ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2173a72cfb80SBram Moolenaar
2174d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2175ad39c094SBram Moolenaarenddef
2176ad39c094SBram Moolenaar
2177f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2178f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2179f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2180f93c7feaSBram Moolenaar  echo 'clear'
2181df069eecSBram Moolenaar  :1messages
2182f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2183f93c7feaSBram Moolenaar
2184d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2185f93c7feaSBram Moolenaarenddef
2186f93c7feaSBram Moolenaar
218747e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2188f5be8cdbSBram Moolenaar  # only checks line continuation
2189cfcd011fSBram Moolenaar  var lines =<< trim END
219047e880d6SBram Moolenaar      vim9script
219147e880d6SBram Moolenaar      echomsg 'here'
219247e880d6SBram Moolenaar                .. ' is ' ..
219347e880d6SBram Moolenaar                   'a message'
219447e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
219547e880d6SBram Moolenaar  END
219647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
219747e880d6SBram Moolenaarenddef
219847e880d6SBram Moolenaar
2199f93c7feaSBram Moolenaardef Test_echoerr_cmd()
220040ee466cSBram Moolenaar  try
220140ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
220240ee466cSBram Moolenaar  catch
220340ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
220440ee466cSBram Moolenaar  endtry
2205f93c7feaSBram Moolenaarenddef
2206f93c7feaSBram Moolenaar
220747e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2208f5be8cdbSBram Moolenaar  # only checks line continuation
2209cfcd011fSBram Moolenaar  var lines =<< trim END
221047e880d6SBram Moolenaar      vim9script
221147e880d6SBram Moolenaar      try
221247e880d6SBram Moolenaar        echoerr 'this'
221347e880d6SBram Moolenaar                .. ' is ' ..
221447e880d6SBram Moolenaar                   'wrong'
221547e880d6SBram Moolenaar      catch
221647e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
221747e880d6SBram Moolenaar      endtry
221847e880d6SBram Moolenaar  END
221947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
222047e880d6SBram Moolenaarenddef
222147e880d6SBram Moolenaar
222241fe0617SBram Moolenaardef Test_for_outside_of_function()
2223cfcd011fSBram Moolenaar  var lines =<< trim END
222441fe0617SBram Moolenaar    vim9script
222541fe0617SBram Moolenaar    new
222641fe0617SBram Moolenaar    for var in range(0, 3)
222741fe0617SBram Moolenaar      append(line('$'), var)
222841fe0617SBram Moolenaar    endfor
222941fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
223041fe0617SBram Moolenaar    bwipe!
223141fe0617SBram Moolenaar  END
223241fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
223341fe0617SBram Moolenaar  source Xvim9for.vim
223441fe0617SBram Moolenaar  delete('Xvim9for.vim')
223541fe0617SBram Moolenaarenddef
22368a7d6542SBram Moolenaar
2237e8c4abbbSBram Moolenaardef Test_for_loop()
2238cfcd011fSBram Moolenaar  var result = ''
2239e8c4abbbSBram Moolenaar  for cnt in range(7)
2240e8c4abbbSBram Moolenaar    if cnt == 4
2241e8c4abbbSBram Moolenaar      break
2242e8c4abbbSBram Moolenaar    endif
2243e8c4abbbSBram Moolenaar    if cnt == 2
2244e8c4abbbSBram Moolenaar      continue
2245e8c4abbbSBram Moolenaar    endif
2246e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2247e8c4abbbSBram Moolenaar  endfor
2248e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
22490ad3e894SBram Moolenaar
2250cfcd011fSBram Moolenaar  var concat = ''
22510ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
22520ad3e894SBram Moolenaar    concat ..= str
22530ad3e894SBram Moolenaar  endfor
22540ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
225538bd8de5SBram Moolenaar
225638bd8de5SBram Moolenaar  var total = 0
225738bd8de5SBram Moolenaar  for nr in
225838bd8de5SBram Moolenaar      [1, 2, 3]
225938bd8de5SBram Moolenaar    total += nr
226038bd8de5SBram Moolenaar  endfor
226138bd8de5SBram Moolenaar  assert_equal(6, total)
226238bd8de5SBram Moolenaar
226338bd8de5SBram Moolenaar  total = 0
226438bd8de5SBram Moolenaar  for nr
226538bd8de5SBram Moolenaar    in [1, 2, 3]
226638bd8de5SBram Moolenaar    total += nr
226738bd8de5SBram Moolenaar  endfor
226838bd8de5SBram Moolenaar  assert_equal(6, total)
226938bd8de5SBram Moolenaar
227038bd8de5SBram Moolenaar  total = 0
227138bd8de5SBram Moolenaar  for nr
227238bd8de5SBram Moolenaar    in
227338bd8de5SBram Moolenaar    [1, 2, 3]
227438bd8de5SBram Moolenaar    total += nr
227538bd8de5SBram Moolenaar  endfor
227638bd8de5SBram Moolenaar  assert_equal(6, total)
2277036d0714SBram Moolenaar
2278036d0714SBram Moolenaar  var res = ""
2279036d0714SBram Moolenaar  for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2280036d0714SBram Moolenaar    res ..= n .. s
2281036d0714SBram Moolenaar  endfor
2282036d0714SBram Moolenaar  assert_equal('1a2b', res)
2283e8c4abbbSBram Moolenaarenddef
2284e8c4abbbSBram Moolenaar
2285e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2286025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2287025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2288025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2289675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2290675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2291cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2292822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
22932d870f8dSBram Moolenaar  delfunc! g:Func
2294451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2295675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2296675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2297675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2298e8c4abbbSBram Moolenaarenddef
2299e8c4abbbSBram Moolenaar
2300ea87069dSBram Moolenaardef Test_for_loop_script_var()
2301ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2302ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2303ea87069dSBram Moolenaar
2304ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2305ea87069dSBram Moolenaar  var lines =<< trim END
2306ea87069dSBram Moolenaar    vim9script
2307ea87069dSBram Moolenaar    var total = 0
2308ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2309ea87069dSBram Moolenaar      total += s:var
2310ea87069dSBram Moolenaar    endfor
2311ea87069dSBram Moolenaar    assert_equal(6, total)
2312ea87069dSBram Moolenaar
2313ea87069dSBram Moolenaar    total = 0
2314ea87069dSBram Moolenaar    for var in [1, 2, 3]
2315ea87069dSBram Moolenaar      total += var
2316ea87069dSBram Moolenaar    endfor
2317ea87069dSBram Moolenaar    assert_equal(6, total)
2318ea87069dSBram Moolenaar  END
2319ea87069dSBram Moolenaarenddef
2320ea87069dSBram Moolenaar
2321792f786aSBram Moolenaardef Test_for_loop_unpack()
23224b8a0651SBram Moolenaar  var lines =<< trim END
2323792f786aSBram Moolenaar      var result = []
2324792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2325792f786aSBram Moolenaar        result->add(v1)
2326792f786aSBram Moolenaar        result->add(v2)
2327792f786aSBram Moolenaar      endfor
2328792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2329792f786aSBram Moolenaar
2330792f786aSBram Moolenaar      result = []
2331792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2332792f786aSBram Moolenaar        result->add(v1)
2333792f786aSBram Moolenaar        result->add(v2)
2334792f786aSBram Moolenaar        result->add(v3)
2335792f786aSBram Moolenaar      endfor
2336792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2337792f786aSBram Moolenaar
23384b8a0651SBram Moolenaar      result = []
23394b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
23404b8a0651SBram Moolenaar        result->add(&ts)
23414b8a0651SBram Moolenaar        result->add(&sw)
23424b8a0651SBram Moolenaar      endfor
23434b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
23444b8a0651SBram Moolenaar
23454b8a0651SBram Moolenaar      var slist: list<string>
23464b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
23474b8a0651SBram Moolenaar        slist->add($LOOPVAR)
23484b8a0651SBram Moolenaar        slist->add(@r)
23494b8a0651SBram Moolenaar        slist->add(v:errmsg)
23504b8a0651SBram Moolenaar      endfor
23514b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
23524b8a0651SBram Moolenaar
23534b8a0651SBram Moolenaar      slist = []
23544b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
23554b8a0651SBram Moolenaar        slist->add(g:globalvar)
23564b8a0651SBram Moolenaar        slist->add(b:bufvar)
23574b8a0651SBram Moolenaar        slist->add(w:winvar)
23584b8a0651SBram Moolenaar        slist->add(t:tabvar)
23594b8a0651SBram Moolenaar      endfor
23604b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2361f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
23624b8a0651SBram Moolenaar  END
23634b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
23644b8a0651SBram Moolenaar
23654b8a0651SBram Moolenaar  lines =<< trim END
2366792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2367792f786aSBram Moolenaar        echo v1 v2
2368792f786aSBram Moolenaar      endfor
2369792f786aSBram Moolenaar  END
2370792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2371792f786aSBram Moolenaar
2372792f786aSBram Moolenaar  lines =<< trim END
2373792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2374792f786aSBram Moolenaar        echo v1 v2
2375792f786aSBram Moolenaar      endfor
2376792f786aSBram Moolenaar  END
2377792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2378792f786aSBram Moolenaar
2379792f786aSBram Moolenaar  lines =<< trim END
2380792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2381792f786aSBram Moolenaar        echo v1
2382792f786aSBram Moolenaar      endfor
2383792f786aSBram Moolenaar  END
2384792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2385792f786aSBram Moolenaarenddef
2386792f786aSBram Moolenaar
2387c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2388c150c09eSBram Moolenaar  var looped = 0
2389c150c09eSBram Moolenaar  var cleanup = 0
2390c150c09eSBram Moolenaar  for i in range(3)
2391c150c09eSBram Moolenaar    looped += 1
2392c150c09eSBram Moolenaar    try
2393c150c09eSBram Moolenaar      eval [][0]
2394c150c09eSBram Moolenaar    catch
2395c150c09eSBram Moolenaar      continue
2396c150c09eSBram Moolenaar    finally
2397c150c09eSBram Moolenaar      cleanup += 1
2398c150c09eSBram Moolenaar    endtry
2399c150c09eSBram Moolenaar  endfor
2400c150c09eSBram Moolenaar  assert_equal(3, looped)
2401c150c09eSBram Moolenaar  assert_equal(3, cleanup)
2402c150c09eSBram Moolenaarenddef
2403c150c09eSBram Moolenaar
2404d0df1aacSBram Moolenaardef Test_while_loop()
2405cfcd011fSBram Moolenaar  var result = ''
2406cfcd011fSBram Moolenaar  var cnt = 0
2407d0df1aacSBram Moolenaar  while cnt < 555
2408d0df1aacSBram Moolenaar    if cnt == 3
2409d0df1aacSBram Moolenaar      break
2410d0df1aacSBram Moolenaar    endif
2411d0df1aacSBram Moolenaar    cnt += 1
2412d0df1aacSBram Moolenaar    if cnt == 2
2413d0df1aacSBram Moolenaar      continue
2414d0df1aacSBram Moolenaar    endif
2415d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2416d0df1aacSBram Moolenaar  endwhile
2417d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2418dee37dc7SBram Moolenaar
2419dee37dc7SBram Moolenaar  var s = ''
24200123cc1eSBram Moolenaar  while s == 'x' #{comment}
2421dee37dc7SBram Moolenaar  endwhile
2422d0df1aacSBram Moolenaarenddef
2423d0df1aacSBram Moolenaar
2424e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2425675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2426675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2427675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2428675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2429675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2430675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2431675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
24326628b7ebSBram Moolenaar
24336628b7ebSBram Moolenaar  var lines =<< trim END
24346628b7ebSBram Moolenaar      var s = ''
24356628b7ebSBram Moolenaar      while s = ''
24366628b7ebSBram Moolenaar      endwhile
24376628b7ebSBram Moolenaar  END
24386628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2439bd5da371SBram Moolenaarenddef
2440bd5da371SBram Moolenaar
24419645e2d9SBram Moolenaardef Test_interrupt_loop()
2442cfcd011fSBram Moolenaar  var caught = false
2443cfcd011fSBram Moolenaar  var x = 0
244497acfc78SBram Moolenaar  try
24459645e2d9SBram Moolenaar    while 1
24469645e2d9SBram Moolenaar      x += 1
24479645e2d9SBram Moolenaar      if x == 100
24489645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
24499645e2d9SBram Moolenaar      endif
24509645e2d9SBram Moolenaar    endwhile
245197acfc78SBram Moolenaar  catch
245297acfc78SBram Moolenaar    caught = true
245397acfc78SBram Moolenaar    assert_equal(100, x)
245497acfc78SBram Moolenaar  endtry
245597acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
245625859dd7SBram Moolenaar  # consume the CTRL-C
245725859dd7SBram Moolenaar  getchar(0)
24589645e2d9SBram Moolenaarenddef
245920431c9dSBram Moolenaar
24604fdae999SBram Moolenaardef Test_automatic_line_continuation()
2461cfcd011fSBram Moolenaar  var mylist = [
24624fdae999SBram Moolenaar      'one',
24634fdae999SBram Moolenaar      'two',
24644fdae999SBram Moolenaar      'three',
2465f5be8cdbSBram Moolenaar      ] # comment
24664fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
24674fdae999SBram Moolenaar
2468cfcd011fSBram Moolenaar  var mydict = {
2469e0de171eSBram Moolenaar      ['one']: 1,
2470e0de171eSBram Moolenaar      ['two']: 2,
2471e0de171eSBram Moolenaar      ['three']:
24724fdae999SBram Moolenaar          3,
2473f5be8cdbSBram Moolenaar      } # comment
2474e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2475e0de171eSBram Moolenaar  mydict = {
24762c330432SBram Moolenaar      one: 1,  # comment
24772c330432SBram Moolenaar      two:     # comment
24782c330432SBram Moolenaar           2,  # comment
24792c330432SBram Moolenaar      three: 3 # comment
24802c330432SBram Moolenaar      }
2481e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2482e0de171eSBram Moolenaar  mydict = {
24832c330432SBram Moolenaar      one: 1,
24844fdae999SBram Moolenaar      two:
24854fdae999SBram Moolenaar           2,
24862c330432SBram Moolenaar      three: 3
24874fdae999SBram Moolenaar      }
2488e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2489e6085c53SBram Moolenaar
2490e6085c53SBram Moolenaar  assert_equal(
2491e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2492e6085c53SBram Moolenaar        split('one two three')
2493e6085c53SBram Moolenaar        )
24944fdae999SBram Moolenaarenddef
24954fdae999SBram Moolenaar
24967a092245SBram Moolenaardef Test_vim9_comment()
24977a092245SBram Moolenaar  CheckScriptSuccess([
24987a092245SBram Moolenaar      'vim9script',
24997a092245SBram Moolenaar      '# something',
250093f82cbeSBram Moolenaar      '#something',
250193f82cbeSBram Moolenaar      '#{something',
25027a092245SBram Moolenaar      ])
250393f82cbeSBram Moolenaar
250493f82cbeSBram Moolenaar  split Xfile
250593f82cbeSBram Moolenaar  CheckScriptSuccess([
250693f82cbeSBram Moolenaar      'vim9script',
250793f82cbeSBram Moolenaar      'edit #something',
250893f82cbeSBram Moolenaar      ])
250993f82cbeSBram Moolenaar  CheckScriptSuccess([
251093f82cbeSBram Moolenaar      'vim9script',
251193f82cbeSBram Moolenaar      'edit #{something',
251293f82cbeSBram Moolenaar      ])
251393f82cbeSBram Moolenaar  close
251493f82cbeSBram Moolenaar
25157a092245SBram Moolenaar  CheckScriptFailure([
25167a092245SBram Moolenaar      'vim9script',
25177a092245SBram Moolenaar      ':# something',
25187a092245SBram Moolenaar      ], 'E488:')
25197a092245SBram Moolenaar  CheckScriptFailure([
25207a092245SBram Moolenaar      '# something',
25217a092245SBram Moolenaar      ], 'E488:')
25227a092245SBram Moolenaar  CheckScriptFailure([
25237a092245SBram Moolenaar      ':# something',
25247a092245SBram Moolenaar      ], 'E488:')
25257a092245SBram Moolenaar
25264a8d9f2eSBram Moolenaar  { # block start
25274a8d9f2eSBram Moolenaar  } # block end
25284a8d9f2eSBram Moolenaar  CheckDefFailure([
25294a8d9f2eSBram Moolenaar      '{# comment',
25304a8d9f2eSBram Moolenaar      ], 'E488:')
25314a8d9f2eSBram Moolenaar  CheckDefFailure([
25324a8d9f2eSBram Moolenaar      '{',
25334a8d9f2eSBram Moolenaar      '}# comment',
25344a8d9f2eSBram Moolenaar      ], 'E488:')
25354a8d9f2eSBram Moolenaar
25364a8d9f2eSBram Moolenaar  echo "yes" # comment
25374a8d9f2eSBram Moolenaar  CheckDefFailure([
25384a8d9f2eSBram Moolenaar      'echo "yes"# comment',
25394a8d9f2eSBram Moolenaar      ], 'E488:')
25407a092245SBram Moolenaar  CheckScriptSuccess([
25417a092245SBram Moolenaar      'vim9script',
25427a092245SBram Moolenaar      'echo "yes" # something',
25437a092245SBram Moolenaar      ])
25447a092245SBram Moolenaar  CheckScriptFailure([
25457a092245SBram Moolenaar      'vim9script',
25467a092245SBram Moolenaar      'echo "yes"# something',
25477a092245SBram Moolenaar      ], 'E121:')
25487a092245SBram Moolenaar  CheckScriptFailure([
25497a092245SBram Moolenaar      'vim9script',
25507a092245SBram Moolenaar      'echo# something',
2551f8103f27SBram Moolenaar      ], 'E1144:')
25527a092245SBram Moolenaar  CheckScriptFailure([
25537a092245SBram Moolenaar      'echo "yes" # something',
25547a092245SBram Moolenaar      ], 'E121:')
25557a092245SBram Moolenaar
25564a8d9f2eSBram Moolenaar  exe "echo" # comment
25574a8d9f2eSBram Moolenaar  CheckDefFailure([
25584a8d9f2eSBram Moolenaar      'exe "echo"# comment',
25594a8d9f2eSBram Moolenaar      ], 'E488:')
25604a8d9f2eSBram Moolenaar  CheckScriptSuccess([
25614a8d9f2eSBram Moolenaar      'vim9script',
25624a8d9f2eSBram Moolenaar      'exe "echo" # something',
25634a8d9f2eSBram Moolenaar      ])
25644a8d9f2eSBram Moolenaar  CheckScriptFailure([
25654a8d9f2eSBram Moolenaar      'vim9script',
25664a8d9f2eSBram Moolenaar      'exe "echo"# something',
25674a8d9f2eSBram Moolenaar      ], 'E121:')
25684a8d9f2eSBram Moolenaar  CheckScriptFailure([
25694a8d9f2eSBram Moolenaar      'vim9script',
25704a8d9f2eSBram Moolenaar      'exe# something',
2571f8103f27SBram Moolenaar      ], 'E1144:')
25724a8d9f2eSBram Moolenaar  CheckScriptFailure([
25734a8d9f2eSBram Moolenaar      'exe "echo" # something',
25744a8d9f2eSBram Moolenaar      ], 'E121:')
25754a8d9f2eSBram Moolenaar
25767a092245SBram Moolenaar  CheckDefFailure([
25777a092245SBram Moolenaar      'try# comment',
25787a092245SBram Moolenaar      '  echo "yes"',
25797a092245SBram Moolenaar      'catch',
25807a092245SBram Moolenaar      'endtry',
2581f8103f27SBram Moolenaar      ], 'E1144:')
25822c5ed4e3SBram Moolenaar  CheckScriptFailure([
25832c5ed4e3SBram Moolenaar      'vim9script',
25842c5ed4e3SBram Moolenaar      'try# comment',
25852c5ed4e3SBram Moolenaar      'echo "yes"',
2586f8103f27SBram Moolenaar      ], 'E1144:')
25877a092245SBram Moolenaar  CheckDefFailure([
25887a092245SBram Moolenaar      'try',
2589a72cfb80SBram Moolenaar      '  throw#comment',
2590a72cfb80SBram Moolenaar      'catch',
2591a72cfb80SBram Moolenaar      'endtry',
2592f8103f27SBram Moolenaar      ], 'E1144:')
2593a72cfb80SBram Moolenaar  CheckDefFailure([
2594a72cfb80SBram Moolenaar      'try',
2595a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2596a72cfb80SBram Moolenaar      'catch',
2597a72cfb80SBram Moolenaar      'endtry',
2598a72cfb80SBram Moolenaar      ], 'E488:')
2599a72cfb80SBram Moolenaar  CheckDefFailure([
2600a72cfb80SBram Moolenaar      'try',
26017a092245SBram Moolenaar      '  echo "yes"',
26027a092245SBram Moolenaar      'catch# comment',
26037a092245SBram Moolenaar      'endtry',
2604f8103f27SBram Moolenaar      ], 'E1144:')
26052c5ed4e3SBram Moolenaar  CheckScriptFailure([
26062c5ed4e3SBram Moolenaar      'vim9script',
26072c5ed4e3SBram Moolenaar      'try',
26082c5ed4e3SBram Moolenaar      '  echo "yes"',
26092c5ed4e3SBram Moolenaar      'catch# comment',
26102c5ed4e3SBram Moolenaar      'endtry',
2611f8103f27SBram Moolenaar      ], 'E1144:')
26122c5ed4e3SBram Moolenaar  CheckDefFailure([
26132c5ed4e3SBram Moolenaar      'try',
26142c5ed4e3SBram Moolenaar      '  echo "yes"',
26152c5ed4e3SBram Moolenaar      'catch /pat/# comment',
26162c5ed4e3SBram Moolenaar      'endtry',
26172c5ed4e3SBram Moolenaar      ], 'E488:')
26187a092245SBram Moolenaar  CheckDefFailure([
26197a092245SBram Moolenaar      'try',
26207a092245SBram Moolenaar      'echo "yes"',
26217a092245SBram Moolenaar      'catch',
26227a092245SBram Moolenaar      'endtry# comment',
2623f8103f27SBram Moolenaar      ], 'E1144:')
26242c5ed4e3SBram Moolenaar  CheckScriptFailure([
26252c5ed4e3SBram Moolenaar      'vim9script',
26262c5ed4e3SBram Moolenaar      'try',
26272c5ed4e3SBram Moolenaar      '  echo "yes"',
26282c5ed4e3SBram Moolenaar      'catch',
26292c5ed4e3SBram Moolenaar      'endtry# comment',
2630f8103f27SBram Moolenaar      ], 'E1144:')
26312c5ed4e3SBram Moolenaar
26322c5ed4e3SBram Moolenaar  CheckScriptSuccess([
26332c5ed4e3SBram Moolenaar      'vim9script',
26342c5ed4e3SBram Moolenaar      'hi # comment',
26352c5ed4e3SBram Moolenaar      ])
26362c5ed4e3SBram Moolenaar  CheckScriptFailure([
26372c5ed4e3SBram Moolenaar      'vim9script',
26382c5ed4e3SBram Moolenaar      'hi# comment',
2639f8103f27SBram Moolenaar      ], 'E1144:')
26401966c248SBram Moolenaar  CheckScriptSuccess([
26411966c248SBram Moolenaar      'vim9script',
26421966c248SBram Moolenaar      'hi Search # comment',
26431966c248SBram Moolenaar      ])
26441966c248SBram Moolenaar  CheckScriptFailure([
26451966c248SBram Moolenaar      'vim9script',
26461966c248SBram Moolenaar      'hi Search# comment',
26471966c248SBram Moolenaar      ], 'E416:')
26481966c248SBram Moolenaar  CheckScriptSuccess([
26491966c248SBram Moolenaar      'vim9script',
26501966c248SBram Moolenaar      'hi link This Search # comment',
26511966c248SBram Moolenaar      ])
26521966c248SBram Moolenaar  CheckScriptFailure([
26531966c248SBram Moolenaar      'vim9script',
26541966c248SBram Moolenaar      'hi link This That# comment',
26551966c248SBram Moolenaar      ], 'E413:')
26561966c248SBram Moolenaar  CheckScriptSuccess([
26571966c248SBram Moolenaar      'vim9script',
26581966c248SBram Moolenaar      'hi clear This # comment',
26591966c248SBram Moolenaar      'hi clear # comment',
26601966c248SBram Moolenaar      ])
2661f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2662f5be8cdbSBram Moolenaar  # hi clear This# comment',
26631966c248SBram Moolenaar  CheckScriptFailure([
26641966c248SBram Moolenaar      'vim9script',
26651966c248SBram Moolenaar      'hi clear# comment',
26661966c248SBram Moolenaar      ], 'E416:')
26671966c248SBram Moolenaar
26681966c248SBram Moolenaar  CheckScriptSuccess([
26691966c248SBram Moolenaar      'vim9script',
26701966c248SBram Moolenaar      'hi Group term=bold',
26711966c248SBram Moolenaar      'match Group /todo/ # comment',
26721966c248SBram Moolenaar      ])
26731966c248SBram Moolenaar  CheckScriptFailure([
26741966c248SBram Moolenaar      'vim9script',
26751966c248SBram Moolenaar      'hi Group term=bold',
26761966c248SBram Moolenaar      'match Group /todo/# comment',
26771966c248SBram Moolenaar      ], 'E488:')
26781966c248SBram Moolenaar  CheckScriptSuccess([
26791966c248SBram Moolenaar      'vim9script',
26801966c248SBram Moolenaar      'match # comment',
26811966c248SBram Moolenaar      ])
26821966c248SBram Moolenaar  CheckScriptFailure([
26831966c248SBram Moolenaar      'vim9script',
26841966c248SBram Moolenaar      'match# comment',
2685f8103f27SBram Moolenaar      ], 'E1144:')
26861966c248SBram Moolenaar  CheckScriptSuccess([
26871966c248SBram Moolenaar      'vim9script',
26881966c248SBram Moolenaar      'match none # comment',
26891966c248SBram Moolenaar      ])
26901966c248SBram Moolenaar  CheckScriptFailure([
26911966c248SBram Moolenaar      'vim9script',
26921966c248SBram Moolenaar      'match none# comment',
26931966c248SBram Moolenaar      ], 'E475:')
26941966c248SBram Moolenaar
26951966c248SBram Moolenaar  CheckScriptSuccess([
26961966c248SBram Moolenaar      'vim9script',
26971966c248SBram Moolenaar      'menutrans clear # comment',
26981966c248SBram Moolenaar      ])
26991966c248SBram Moolenaar  CheckScriptFailure([
27001966c248SBram Moolenaar      'vim9script',
27011966c248SBram Moolenaar      'menutrans clear# comment text',
27021966c248SBram Moolenaar      ], 'E474:')
27031966c248SBram Moolenaar
27041966c248SBram Moolenaar  CheckScriptSuccess([
27051966c248SBram Moolenaar      'vim9script',
27061966c248SBram Moolenaar      'syntax clear # comment',
27071966c248SBram Moolenaar      ])
27081966c248SBram Moolenaar  CheckScriptFailure([
27091966c248SBram Moolenaar      'vim9script',
27101966c248SBram Moolenaar      'syntax clear# comment text',
27111966c248SBram Moolenaar      ], 'E28:')
27121966c248SBram Moolenaar  CheckScriptSuccess([
27131966c248SBram Moolenaar      'vim9script',
27141966c248SBram Moolenaar      'syntax keyword Word some',
27151966c248SBram Moolenaar      'syntax clear Word # comment',
27161966c248SBram Moolenaar      ])
27171966c248SBram Moolenaar  CheckScriptFailure([
27181966c248SBram Moolenaar      'vim9script',
27191966c248SBram Moolenaar      'syntax keyword Word some',
27201966c248SBram Moolenaar      'syntax clear Word# comment text',
27211966c248SBram Moolenaar      ], 'E28:')
27221966c248SBram Moolenaar
27231966c248SBram Moolenaar  CheckScriptSuccess([
27241966c248SBram Moolenaar      'vim9script',
27251966c248SBram Moolenaar      'syntax list # comment',
27261966c248SBram Moolenaar      ])
27271966c248SBram Moolenaar  CheckScriptFailure([
27281966c248SBram Moolenaar      'vim9script',
27291966c248SBram Moolenaar      'syntax list# comment text',
27301966c248SBram Moolenaar      ], 'E28:')
27311966c248SBram Moolenaar
27321966c248SBram Moolenaar  CheckScriptSuccess([
27331966c248SBram Moolenaar      'vim9script',
27341966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
27351966c248SBram Moolenaar      ])
27361966c248SBram Moolenaar  CheckScriptFailure([
27371966c248SBram Moolenaar      'vim9script',
27381966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
27391966c248SBram Moolenaar      ], 'E475:')
27401966c248SBram Moolenaar
27411966c248SBram Moolenaar  CheckScriptSuccess([
27421966c248SBram Moolenaar      'vim9script',
27431966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
27441966c248SBram Moolenaar      ])
27451966c248SBram Moolenaar  CheckScriptFailure([
27461966c248SBram Moolenaar      'vim9script',
27471966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
27481966c248SBram Moolenaar      ], 'E789:')
27491966c248SBram Moolenaar
27501966c248SBram Moolenaar  CheckScriptSuccess([
27511966c248SBram Moolenaar      'vim9script',
27521966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
27531966c248SBram Moolenaar      ])
27541966c248SBram Moolenaar  CheckScriptFailure([
27551966c248SBram Moolenaar      'vim9script',
27561966c248SBram Moolenaar      'syntax match Word /pat/# comment',
27571966c248SBram Moolenaar      ], 'E402:')
27581966c248SBram Moolenaar
27591966c248SBram Moolenaar  CheckScriptSuccess([
27601966c248SBram Moolenaar      'vim9script',
27611966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
27621966c248SBram Moolenaar      ])
27631966c248SBram Moolenaar  CheckScriptFailure([
27641966c248SBram Moolenaar      'vim9script',
27651966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
27661966c248SBram Moolenaar      ], 'E475:')
27671966c248SBram Moolenaar  CheckScriptFailure([
27681966c248SBram Moolenaar      'vim9script',
27691966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
27701966c248SBram Moolenaar      ], 'E406:')
27711966c248SBram Moolenaar  CheckScriptFailure([
27721966c248SBram Moolenaar      'vim9script',
27731966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
27741966c248SBram Moolenaar      ], 'E475:')
27751966c248SBram Moolenaar
27761966c248SBram Moolenaar  CheckScriptSuccess([
27771966c248SBram Moolenaar      'vim9script',
27781966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
27791966c248SBram Moolenaar      ])
27801966c248SBram Moolenaar  CheckScriptFailure([
27811966c248SBram Moolenaar      'vim9script',
27821966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2783d032f34aSBram Moolenaar      ], 'E402:')
27841966c248SBram Moolenaar
27851966c248SBram Moolenaar  CheckScriptSuccess([
27861966c248SBram Moolenaar      'vim9script',
27871966c248SBram Moolenaar      'syntax sync # comment',
27881966c248SBram Moolenaar      ])
27891966c248SBram Moolenaar  CheckScriptFailure([
27901966c248SBram Moolenaar      'vim9script',
27911966c248SBram Moolenaar      'syntax sync# comment',
27921966c248SBram Moolenaar      ], 'E404:')
27931966c248SBram Moolenaar  CheckScriptSuccess([
27941966c248SBram Moolenaar      'vim9script',
27951966c248SBram Moolenaar      'syntax sync ccomment # comment',
27961966c248SBram Moolenaar      ])
27971966c248SBram Moolenaar  CheckScriptFailure([
27981966c248SBram Moolenaar      'vim9script',
27991966c248SBram Moolenaar      'syntax sync ccomment# comment',
28001966c248SBram Moolenaar      ], 'E404:')
28011966c248SBram Moolenaar
28021966c248SBram Moolenaar  CheckScriptSuccess([
28031966c248SBram Moolenaar      'vim9script',
28041966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
28051966c248SBram Moolenaar      ])
28061966c248SBram Moolenaar  CheckScriptFailure([
28071966c248SBram Moolenaar      'vim9script',
28081966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
28091966c248SBram Moolenaar      ], 'E475:')
2810a72cfb80SBram Moolenaar
2811a72cfb80SBram Moolenaar  CheckScriptSuccess([
2812a72cfb80SBram Moolenaar      'vim9script',
2813a72cfb80SBram Moolenaar      'command Echo echo # comment',
2814a72cfb80SBram Moolenaar      'command Echo # comment',
28152d870f8dSBram Moolenaar      'delcommand Echo',
2816a72cfb80SBram Moolenaar      ])
2817a72cfb80SBram Moolenaar  CheckScriptFailure([
2818a72cfb80SBram Moolenaar      'vim9script',
2819a72cfb80SBram Moolenaar      'command Echo echo# comment',
2820a72cfb80SBram Moolenaar      'Echo',
2821f8103f27SBram Moolenaar      ], 'E1144:')
28222d870f8dSBram Moolenaar  delcommand Echo
282370249ee8SBram Moolenaar
282470249ee8SBram Moolenaar  var curdir = getcwd()
282570249ee8SBram Moolenaar  CheckScriptSuccess([
282670249ee8SBram Moolenaar      'command Echo cd " comment',
282770249ee8SBram Moolenaar      'Echo',
282870249ee8SBram Moolenaar      'delcommand Echo',
282970249ee8SBram Moolenaar      ])
283070249ee8SBram Moolenaar  CheckScriptSuccess([
2831090728adSBram Moolenaar      'vim9script',
283270249ee8SBram Moolenaar      'command Echo cd # comment',
283370249ee8SBram Moolenaar      'Echo',
283470249ee8SBram Moolenaar      'delcommand Echo',
283570249ee8SBram Moolenaar      ])
283670249ee8SBram Moolenaar  CheckScriptFailure([
283770249ee8SBram Moolenaar      'vim9script',
283870249ee8SBram Moolenaar      'command Echo cd " comment',
283970249ee8SBram Moolenaar      'Echo',
284070249ee8SBram Moolenaar      ], 'E344:')
284170249ee8SBram Moolenaar  delcommand Echo
284270249ee8SBram Moolenaar  chdir(curdir)
284370249ee8SBram Moolenaar
2844a72cfb80SBram Moolenaar  CheckScriptFailure([
2845a72cfb80SBram Moolenaar      'vim9script',
2846a72cfb80SBram Moolenaar      'command Echo# comment',
2847a72cfb80SBram Moolenaar      ], 'E182:')
2848a72cfb80SBram Moolenaar  CheckScriptFailure([
2849a72cfb80SBram Moolenaar      'vim9script',
2850a72cfb80SBram Moolenaar      'command Echo echo',
2851a72cfb80SBram Moolenaar      'command Echo# comment',
2852a72cfb80SBram Moolenaar      ], 'E182:')
28532d870f8dSBram Moolenaar  delcommand Echo
2854a72cfb80SBram Moolenaar
2855a72cfb80SBram Moolenaar  CheckScriptSuccess([
2856a72cfb80SBram Moolenaar      'vim9script',
2857a72cfb80SBram Moolenaar      'function # comment',
2858a72cfb80SBram Moolenaar      ])
2859a72cfb80SBram Moolenaar  CheckScriptFailure([
2860a72cfb80SBram Moolenaar      'vim9script',
28619898107fSBram Moolenaar      'function " comment',
28629898107fSBram Moolenaar      ], 'E129:')
28639898107fSBram Moolenaar  CheckScriptFailure([
28649898107fSBram Moolenaar      'vim9script',
2865a72cfb80SBram Moolenaar      'function# comment',
2866f8103f27SBram Moolenaar      ], 'E1144:')
2867a72cfb80SBram Moolenaar  CheckScriptSuccess([
2868a72cfb80SBram Moolenaar      'vim9script',
2869a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2870a72cfb80SBram Moolenaar      ])
2871a72cfb80SBram Moolenaar  CheckScriptFailure([
2872a72cfb80SBram Moolenaar      'vim9script',
2873a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2874a72cfb80SBram Moolenaar      ], 'E488:')
2875a72cfb80SBram Moolenaar
2876a72cfb80SBram Moolenaar  CheckScriptSuccess([
2877a72cfb80SBram Moolenaar      'vim9script',
28784c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2879a72cfb80SBram Moolenaar      'endfunc',
28804c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2881a72cfb80SBram Moolenaar      ])
2882a72cfb80SBram Moolenaar  CheckScriptFailure([
2883a72cfb80SBram Moolenaar      'vim9script',
28844c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2885a72cfb80SBram Moolenaar      'endfunc',
28864c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2887a72cfb80SBram Moolenaar      ], 'E488:')
2888a72cfb80SBram Moolenaar
2889a72cfb80SBram Moolenaar  CheckScriptSuccess([
2890a72cfb80SBram Moolenaar      'vim9script',
2891a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2892a72cfb80SBram Moolenaar      ])
2893a72cfb80SBram Moolenaar  CheckScriptFailure([
2894a72cfb80SBram Moolenaar      'vim9script',
2895a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2896a72cfb80SBram Moolenaar      ], 'E488:')
2897e7e4838fSBram Moolenaar
2898e7e4838fSBram Moolenaar  CheckScriptFailure([
2899e7e4838fSBram Moolenaar      'def Test() " comment',
2900e7e4838fSBram Moolenaar      'enddef',
2901e7e4838fSBram Moolenaar      ], 'E488:')
2902e7e4838fSBram Moolenaar  CheckScriptFailure([
2903e7e4838fSBram Moolenaar      'vim9script',
2904e7e4838fSBram Moolenaar      'def Test() " comment',
2905e7e4838fSBram Moolenaar      'enddef',
2906e7e4838fSBram Moolenaar      ], 'E488:')
2907e7e4838fSBram Moolenaar
2908e7e4838fSBram Moolenaar  CheckScriptSuccess([
2909e7e4838fSBram Moolenaar      'func Test() " comment',
2910e7e4838fSBram Moolenaar      'endfunc',
29112d870f8dSBram Moolenaar      'delfunc Test',
2912e7e4838fSBram Moolenaar      ])
29139898107fSBram Moolenaar  CheckScriptSuccess([
2914e7e4838fSBram Moolenaar      'vim9script',
2915e7e4838fSBram Moolenaar      'func Test() " comment',
2916e7e4838fSBram Moolenaar      'endfunc',
29179898107fSBram Moolenaar      ])
2918e7e4838fSBram Moolenaar
2919e7e4838fSBram Moolenaar  CheckScriptSuccess([
2920e7e4838fSBram Moolenaar      'def Test() # comment',
2921e7e4838fSBram Moolenaar      'enddef',
2922e7e4838fSBram Moolenaar      ])
2923e7e4838fSBram Moolenaar  CheckScriptFailure([
2924e7e4838fSBram Moolenaar      'func Test() # comment',
2925e7e4838fSBram Moolenaar      'endfunc',
2926e7e4838fSBram Moolenaar      ], 'E488:')
29272c5ed4e3SBram Moolenaarenddef
29282c5ed4e3SBram Moolenaar
29292c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
29302c5ed4e3SBram Moolenaar  CheckCanRunGui
29312c5ed4e3SBram Moolenaar
29322c5ed4e3SBram Moolenaar  CheckScriptFailure([
29332c5ed4e3SBram Moolenaar      'vim9script',
29342c5ed4e3SBram Moolenaar      'gui#comment'
2935f8103f27SBram Moolenaar      ], 'E1144:')
29362c5ed4e3SBram Moolenaar  CheckScriptFailure([
29372c5ed4e3SBram Moolenaar      'vim9script',
29382c5ed4e3SBram Moolenaar      'gui -f#comment'
29392c5ed4e3SBram Moolenaar      ], 'E499:')
29407a092245SBram Moolenaarenddef
29417a092245SBram Moolenaar
2942a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
29436797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
29446797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2945a26b9700SBram Moolenaar
2946a26b9700SBram Moolenaar  edit test.vim
2947a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2948a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2949a26b9700SBram Moolenaar
2950a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2951a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2952a26b9700SBram Moolenaar
2953a26b9700SBram Moolenaar  g:entered = 0
2954a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2955a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2956a26b9700SBram Moolenaar
2957a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2958a26b9700SBram Moolenaar
2959a26b9700SBram Moolenaar  au! TabEnter
2960a26b9700SBram Moolenaar  unlet g:entered
2961d72c1bf0SBram Moolenaar
2962d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2963d72c1bf0SBram Moolenaar      'vim9script',
29646797966dSBram Moolenaar      'g:var = 123',
2965e55b1c09SBram Moolenaar      'b:var = 456',
2966e55b1c09SBram Moolenaar      'w:var = 777',
2967e55b1c09SBram Moolenaar      't:var = 888',
2968d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2969d72c1bf0SBram Moolenaar      ])
2970d72c1bf0SBram Moolenaar
2971d72c1bf0SBram Moolenaar  CheckScriptFailure([
2972d72c1bf0SBram Moolenaar      'vim9script',
2973cfcd011fSBram Moolenaar      'let var = 123',
2974cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2975cfcd011fSBram Moolenaar
2976cfcd011fSBram Moolenaar  CheckScriptFailure([
2977cfcd011fSBram Moolenaar      'vim9script',
2978cfcd011fSBram Moolenaar      'var g:var = 123',
2979e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2980e55b1c09SBram Moolenaar
2981e55b1c09SBram Moolenaar  CheckScriptFailure([
2982e55b1c09SBram Moolenaar      'vim9script',
2983cfcd011fSBram Moolenaar      'var b:var = 123',
2984e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2985e55b1c09SBram Moolenaar
2986e55b1c09SBram Moolenaar  CheckScriptFailure([
2987e55b1c09SBram Moolenaar      'vim9script',
2988cfcd011fSBram Moolenaar      'var w:var = 123',
2989e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2990e55b1c09SBram Moolenaar
2991e55b1c09SBram Moolenaar  CheckScriptFailure([
2992e55b1c09SBram Moolenaar      'vim9script',
2993cfcd011fSBram Moolenaar      'var t:var = 123',
2994e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2995e55b1c09SBram Moolenaar
2996e55b1c09SBram Moolenaar  CheckScriptFailure([
2997e55b1c09SBram Moolenaar      'vim9script',
2998cfcd011fSBram Moolenaar      'var v:version = 123',
2999e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3000e55b1c09SBram Moolenaar
3001e55b1c09SBram Moolenaar  CheckScriptFailure([
3002e55b1c09SBram Moolenaar      'vim9script',
3003cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3004e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
30056797966dSBram Moolenaar
30066797966dSBram Moolenaar  CheckScriptFailure([
30076797966dSBram Moolenaar      'vim9script',
30086797966dSBram Moolenaar      'g:var = 123',
300932e35117SBram Moolenaar      'unlet g:var# comment1',
3010d72c1bf0SBram Moolenaar      ], 'E108:')
3011d72c1bf0SBram Moolenaar
3012d72c1bf0SBram Moolenaar  CheckScriptFailure([
3013d72c1bf0SBram Moolenaar      'let g:var = 123',
3014d72c1bf0SBram Moolenaar      'unlet g:var # something',
3015d72c1bf0SBram Moolenaar      ], 'E488:')
3016faac4104SBram Moolenaar
3017faac4104SBram Moolenaar  CheckScriptSuccess([
3018faac4104SBram Moolenaar      'vim9script',
301932e35117SBram Moolenaar      'if 1 # comment2',
3020faac4104SBram Moolenaar      '  echo "yes"',
3021faac4104SBram Moolenaar      'elseif 2 #comment',
3022faac4104SBram Moolenaar      '  echo "no"',
3023faac4104SBram Moolenaar      'endif',
3024faac4104SBram Moolenaar      ])
3025faac4104SBram Moolenaar
3026faac4104SBram Moolenaar  CheckScriptFailure([
3027faac4104SBram Moolenaar      'vim9script',
302832e35117SBram Moolenaar      'if 1# comment3',
3029faac4104SBram Moolenaar      '  echo "yes"',
3030faac4104SBram Moolenaar      'endif',
3031faac4104SBram Moolenaar      ], 'E15:')
3032faac4104SBram Moolenaar
3033faac4104SBram Moolenaar  CheckScriptFailure([
3034faac4104SBram Moolenaar      'vim9script',
303532e35117SBram Moolenaar      'if 0 # comment4',
3036faac4104SBram Moolenaar      '  echo "yes"',
3037faac4104SBram Moolenaar      'elseif 2#comment',
3038faac4104SBram Moolenaar      '  echo "no"',
3039faac4104SBram Moolenaar      'endif',
3040faac4104SBram Moolenaar      ], 'E15:')
3041faac4104SBram Moolenaar
3042faac4104SBram Moolenaar  CheckScriptSuccess([
3043faac4104SBram Moolenaar      'vim9script',
3044cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3045faac4104SBram Moolenaar      ])
3046faac4104SBram Moolenaar
3047faac4104SBram Moolenaar  CheckScriptFailure([
3048faac4104SBram Moolenaar      'vim9script',
3049cfcd011fSBram Moolenaar      'var v = 1# comment6',
305032e35117SBram Moolenaar      ], 'E15:')
3051faac4104SBram Moolenaar
3052faac4104SBram Moolenaar  CheckScriptSuccess([
3053faac4104SBram Moolenaar      'vim9script',
3054faac4104SBram Moolenaar      'new'
3055d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3056df069eecSBram Moolenaar      ':$',
3057faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3058faac4104SBram Moolenaar      'bwipe!',
3059faac4104SBram Moolenaar      ])
3060faac4104SBram Moolenaar
3061f5be8cdbSBram Moolenaar  CheckScriptFailure([
3062f5be8cdbSBram Moolenaar      'vim9script',
3063f5be8cdbSBram Moolenaar      'new'
3064d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3065f5be8cdbSBram Moolenaar      ':$',
3066f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3067f5be8cdbSBram Moolenaar      'bwipe!',
3068f5be8cdbSBram Moolenaar      ], 'E488:')
3069f5be8cdbSBram Moolenaar
3070f5be8cdbSBram Moolenaar  CheckScriptFailure([
3071f5be8cdbSBram Moolenaar      'vim9script',
3072f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3073f5be8cdbSBram Moolenaar      ], 'E477:')
3074a26b9700SBram Moolenaarenddef
3075a26b9700SBram Moolenaar
30767e5bd91dSBram Moolenaardef Test_finish()
3077cfcd011fSBram Moolenaar  var lines =<< trim END
30787e5bd91dSBram Moolenaar    vim9script
30796797966dSBram Moolenaar    g:res = 'one'
30807e5bd91dSBram Moolenaar    if v:false | finish | endif
30816797966dSBram Moolenaar    g:res = 'two'
30827e5bd91dSBram Moolenaar    finish
30836797966dSBram Moolenaar    g:res = 'three'
30847e5bd91dSBram Moolenaar  END
30857e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
30867e5bd91dSBram Moolenaar  source Xfinished
30877e5bd91dSBram Moolenaar  assert_equal('two', g:res)
30887e5bd91dSBram Moolenaar
30897e5bd91dSBram Moolenaar  unlet g:res
30907e5bd91dSBram Moolenaar  delete('Xfinished')
30917e5bd91dSBram Moolenaarenddef
30927e5bd91dSBram Moolenaar
3093a5d0077eSBram Moolenaardef Test_forward_declaration()
3094cfcd011fSBram Moolenaar  var lines =<< trim END
3095a5d0077eSBram Moolenaar    vim9script
3096a5d0077eSBram Moolenaar    def GetValue(): string
3097a5d0077eSBram Moolenaar      return theVal
3098a5d0077eSBram Moolenaar    enddef
3099cfcd011fSBram Moolenaar    var theVal = 'something'
3100822ba247SBram Moolenaar    g:initVal = GetValue()
3101a5d0077eSBram Moolenaar    theVal = 'else'
3102a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3103a5d0077eSBram Moolenaar  END
3104a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3105a5d0077eSBram Moolenaar  source Xforward
3106a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3107a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3108a5d0077eSBram Moolenaar
3109a5d0077eSBram Moolenaar  unlet g:initVal
3110a5d0077eSBram Moolenaar  unlet g:laterVal
3111a5d0077eSBram Moolenaar  delete('Xforward')
3112a5d0077eSBram Moolenaarenddef
3113a5d0077eSBram Moolenaar
31149721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3115a6294955SBram Moolenaar  var vim9_lines =<< trim END
3116a6294955SBram Moolenaar    vim9script
3117a6294955SBram Moolenaar    var local = 'local'
3118a6294955SBram Moolenaar    g:global = 'global'
3119a6294955SBram Moolenaar    export var exported = 'exported'
3120a6294955SBram Moolenaar    export def GetText(): string
3121a6294955SBram Moolenaar       return 'text'
3122a6294955SBram Moolenaar    enddef
3123a6294955SBram Moolenaar  END
3124a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3125a6294955SBram Moolenaar
3126cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
31279721fb4eSBram Moolenaar    source Xvim9_script.vim
31289721fb4eSBram Moolenaar
31299721fb4eSBram Moolenaar    call assert_false(exists('local'))
31309721fb4eSBram Moolenaar    call assert_false(exists('exported'))
31319721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
31329721fb4eSBram Moolenaar    call assert_equal('global', global)
31339721fb4eSBram Moolenaar    call assert_equal('global', g:global)
31349721fb4eSBram Moolenaar
31359721fb4eSBram Moolenaar    " imported variable becomes script-local
31369721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
31379721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
31389721fb4eSBram Moolenaar    call assert_false(exists('exported'))
31399721fb4eSBram Moolenaar
31409721fb4eSBram Moolenaar    " imported function becomes script-local
31419721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
31429721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
31439721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
31449721fb4eSBram Moolenaar  END
31459721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
31469721fb4eSBram Moolenaar
31479721fb4eSBram Moolenaar  source Xlegacy_script.vim
31489721fb4eSBram Moolenaar  assert_equal('global', g:global)
3149f5be8cdbSBram Moolenaar  unlet g:global
31509721fb4eSBram Moolenaar
31519721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
31529721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
31539721fb4eSBram Moolenaarenddef
3154a5d0077eSBram Moolenaar
31557d699701SBram Moolenaarfunc Test_vim9script_not_global()
31567d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
31577d699701SBram Moolenaar  let vim9lines =<< trim END
31587d699701SBram Moolenaar    vim9script
3159cfcd011fSBram Moolenaar    var name = 'local'
31607d699701SBram Moolenaar    func TheFunc()
31617d699701SBram Moolenaar      echo 'local'
31627d699701SBram Moolenaar    endfunc
31637d699701SBram Moolenaar    def DefFunc()
31647d699701SBram Moolenaar      echo 'local'
31657d699701SBram Moolenaar    enddef
31667d699701SBram Moolenaar  END
31677d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
31687d699701SBram Moolenaar  source Xvim9script.vim
31697d699701SBram Moolenaar  try
31707d699701SBram Moolenaar    echo g:var
31717d699701SBram Moolenaar    assert_report('did not fail')
31727d699701SBram Moolenaar  catch /E121:/
31737d699701SBram Moolenaar    " caught
31747d699701SBram Moolenaar  endtry
31757d699701SBram Moolenaar  try
31767d699701SBram Moolenaar    call TheFunc()
31777d699701SBram Moolenaar    assert_report('did not fail')
31787d699701SBram Moolenaar  catch /E117:/
31797d699701SBram Moolenaar    " caught
31807d699701SBram Moolenaar  endtry
31817d699701SBram Moolenaar  try
31827d699701SBram Moolenaar    call DefFunc()
31837d699701SBram Moolenaar    assert_report('did not fail')
31847d699701SBram Moolenaar  catch /E117:/
31857d699701SBram Moolenaar    " caught
31867d699701SBram Moolenaar  endtry
31877d699701SBram Moolenaar
318825859dd7SBram Moolenaar  call delete('Xvim9script.vim')
31897d699701SBram Moolenaarendfunc
31907d699701SBram Moolenaar
3191eeb27bfeSBram Moolenaardef Test_vim9_copen()
3192eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3193eeb27bfeSBram Moolenaar  copen
3194eeb27bfeSBram Moolenaar  quit
3195eeb27bfeSBram Moolenaarenddef
3196eeb27bfeSBram Moolenaar
319703290b84SBram Moolenaar" test using an auto-loaded function and variable
31982d6b20d6SBram Moolenaardef Test_vim9_autoload()
3199cfcd011fSBram Moolenaar  var lines =<< trim END
32002d6b20d6SBram Moolenaar     vim9script
320103290b84SBram Moolenaar     def some#gettest(): string
320203290b84SBram Moolenaar       return 'test'
320303290b84SBram Moolenaar     enddef
320403290b84SBram Moolenaar     g:some#name = 'name'
3205e3ffcd99SBram Moolenaar
3206e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3207e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3208e3ffcd99SBram Moolenaar     enddef
320903290b84SBram Moolenaar  END
321003290b84SBram Moolenaar
321103290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
321203290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
321303290b84SBram Moolenaar  var save_rtp = &rtp
321403290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
321503290b84SBram Moolenaar
321603290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
321703290b84SBram Moolenaar  assert_equal('name', g:some#name)
321803290b84SBram Moolenaar  g:some#other = 'other'
321903290b84SBram Moolenaar  assert_equal('other', g:some#other)
322003290b84SBram Moolenaar
3221e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3222e3ffcd99SBram Moolenaar
322317f700acSBram Moolenaar  # upper case script name works
322417f700acSBram Moolenaar  lines =<< trim END
322517f700acSBram Moolenaar     vim9script
322617f700acSBram Moolenaar     def Other#getOther(): string
322717f700acSBram Moolenaar       return 'other'
322817f700acSBram Moolenaar     enddef
322917f700acSBram Moolenaar  END
323017f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
323117f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
323217f700acSBram Moolenaar
323303290b84SBram Moolenaar  delete('Xdir', 'rf')
323403290b84SBram Moolenaar  &rtp = save_rtp
323503290b84SBram Moolenaarenddef
323603290b84SBram Moolenaar
323703290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
323803290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
323903290b84SBram Moolenaar  var lines =<< trim END
324003290b84SBram Moolenaar     vim9script
32412d6b20d6SBram Moolenaar     def foo#test()
32422d6b20d6SBram Moolenaar         echomsg getreg('"')
32432d6b20d6SBram Moolenaar     enddef
32442d6b20d6SBram Moolenaar  END
32452d6b20d6SBram Moolenaar
32462d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
32472d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3248cfcd011fSBram Moolenaar  var save_rtp = &rtp
32492d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
32502d6b20d6SBram Moolenaar  augroup test
32512d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
32522d6b20d6SBram Moolenaar  augroup END
32532d6b20d6SBram Moolenaar
32542d6b20d6SBram Moolenaar  normal Y
32552d6b20d6SBram Moolenaar
32562d6b20d6SBram Moolenaar  augroup test
32572d6b20d6SBram Moolenaar    autocmd!
32582d6b20d6SBram Moolenaar  augroup END
32592d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
32602d6b20d6SBram Moolenaar  &rtp = save_rtp
32612d6b20d6SBram Moolenaarenddef
32622d6b20d6SBram Moolenaar
326377e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
326477e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3265cfcd011fSBram Moolenaar  var lines =<< trim END
326677e5dcc3SBram Moolenaar      vim9script
326777e5dcc3SBram Moolenaar      def crash#func()
326877e5dcc3SBram Moolenaar          try
326977e5dcc3SBram Moolenaar              for x in List()
327077e5dcc3SBram Moolenaar              endfor
327177e5dcc3SBram Moolenaar          catch
327277e5dcc3SBram Moolenaar          endtry
327377e5dcc3SBram Moolenaar          g:ok = true
327477e5dcc3SBram Moolenaar      enddef
327577e5dcc3SBram Moolenaar      fu List()
327677e5dcc3SBram Moolenaar          invalid
327777e5dcc3SBram Moolenaar      endfu
327877e5dcc3SBram Moolenaar      try
327948e11c10SBram Moolenaar          alsoinvalid
328077e5dcc3SBram Moolenaar      catch /wontmatch/
328177e5dcc3SBram Moolenaar      endtry
328277e5dcc3SBram Moolenaar  END
328377e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
328477e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
328577e5dcc3SBram Moolenaar
328677e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
328777e5dcc3SBram Moolenaar  lines =<< trim END
328877e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
328977e5dcc3SBram Moolenaar    call crash#func()
329077e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
32919c4f5520SBram Moolenaar    qall!
329277e5dcc3SBram Moolenaar  END
329377e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
329477e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
329577e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
329677e5dcc3SBram Moolenaar
329777e5dcc3SBram Moolenaar  delete('Xdidit')
329877e5dcc3SBram Moolenaar  delete('Xscript')
329977e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
330003290b84SBram Moolenaar
330103290b84SBram Moolenaar  lines =<< trim END
330203290b84SBram Moolenaar    vim9script
330303290b84SBram Moolenaar    var foo#bar = 'asdf'
330403290b84SBram Moolenaar  END
330503290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
330677e5dcc3SBram Moolenaarenddef
330777e5dcc3SBram Moolenaar
330881e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
330981e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
331081e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3311cfcd011fSBram Moolenaar  var lines =<< trim END
331281e17fbeSBram Moolenaar    let s:counter = 1
331381e17fbeSBram Moolenaar    def s:Func()
331481e17fbeSBram Moolenaar      au! CursorHold
331581e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
331681e17fbeSBram Moolenaar    enddef
331781e17fbeSBram Moolenaar    call s:Func()
331881e17fbeSBram Moolenaar    doau CursorHold
331981e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
332081e17fbeSBram Moolenaar    au! CursorHold
332181e17fbeSBram Moolenaar  END
332281e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
332381e17fbeSBram Moolenaarenddef
332481e17fbeSBram Moolenaar
33253896a105SBram Moolenaardef Test_cmdline_win()
33263896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
33273896a105SBram Moolenaar  # the command line window.
33283896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3329cfcd011fSBram Moolenaar  var export_lines =<< trim END
33303896a105SBram Moolenaar    vim9script
3331cfcd011fSBram Moolenaar    export var That = 'yes'
33323896a105SBram Moolenaar  END
33333896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3334cfcd011fSBram Moolenaar  var import_lines =<< trim END
33353896a105SBram Moolenaar    vim9script
33363896a105SBram Moolenaar    import That from './Xexport.vim'
33373896a105SBram Moolenaar  END
33383896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3339cfcd011fSBram Moolenaar  var save_rtp = &rtp
33403896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
33413896a105SBram Moolenaar  syntax on
33423896a105SBram Moolenaar  augroup CmdWin
33433896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
33443896a105SBram Moolenaar  augroup END
33453896a105SBram Moolenaar  # this will open and also close the cmdline window
33463896a105SBram Moolenaar  feedkeys('q:', 'xt')
33473896a105SBram Moolenaar  assert_equal('yes', g:got_there)
33483896a105SBram Moolenaar
33493896a105SBram Moolenaar  augroup CmdWin
33503896a105SBram Moolenaar    au!
33513896a105SBram Moolenaar  augroup END
33523896a105SBram Moolenaar  &rtp = save_rtp
33533896a105SBram Moolenaar  delete('rtp', 'rf')
33543896a105SBram Moolenaarenddef
33553896a105SBram Moolenaar
3356e3d4685fSBram Moolenaardef Test_invalid_sid()
3357e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
335825859dd7SBram Moolenaar
33599c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3360d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3361e3d4685fSBram Moolenaar  endif
3362e3d4685fSBram Moolenaar  delete('Xdidit')
3363e3d4685fSBram Moolenaarenddef
3364e3d4685fSBram Moolenaar
33659ec7026fSBram Moolenaardef Test_restoring_cpo()
33669ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
33679ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
33689ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
33699ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
33709ec7026fSBram Moolenaar  endif
33719ec7026fSBram Moolenaar  delete('Xsourced')
33729ec7026fSBram Moolenaar  delete('Xclose')
3373090728adSBram Moolenaar  delete('Xdone')
33740123cc1eSBram Moolenaar
33750123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
33760123cc1eSBram Moolenaar  set cpo=aABceFsMny>
33770123cc1eSBram Moolenaar  edit XanotherScript
33780123cc1eSBram Moolenaar  so %
33790123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
33800123cc1eSBram Moolenaar  :1del
33810123cc1eSBram Moolenaar  w
33820123cc1eSBram Moolenaar  so %
33830123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
33840123cc1eSBram Moolenaar
33850123cc1eSBram Moolenaar  delete('XanotherScript')
33860123cc1eSBram Moolenaar  set cpo&vim
33879ec7026fSBram Moolenaarenddef
33889ec7026fSBram Moolenaar
3389ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3390ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
339137294bd6SBram Moolenaar  CheckScreendump
3392ffb7dcdbSBram Moolenaar  CheckFeature timers
339337294bd6SBram Moolenaar
3394ffb7dcdbSBram Moolenaar  let lines =<< trim END
339537294bd6SBram Moolenaar    vim9script
339637294bd6SBram Moolenaar    def script#func()
339737294bd6SBram Moolenaar    enddef
339837294bd6SBram Moolenaar  END
3399ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3400ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
340137294bd6SBram Moolenaar
3402ffb7dcdbSBram Moolenaar  let lines =<< trim END
340337294bd6SBram Moolenaar      vim9script
340437294bd6SBram Moolenaar      set cpo+=M
340537294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
340637294bd6SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, () => script#func())
340737294bd6SBram Moolenaar      setline(1, 'some text')
340837294bd6SBram Moolenaar  END
3409ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3410ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3411ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3412ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
341337294bd6SBram Moolenaar
3414ffb7dcdbSBram Moolenaar  " clean up
3415ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3416ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3417ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3418ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3419ffb7dcdbSBram Moolenaarendfunc
342037294bd6SBram Moolenaar
34219ec7026fSBram Moolenaar
3422f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3423cfcd011fSBram Moolenaar  var lines =<< trim END
3424cfcd011fSBram Moolenaar    var name: any
3425cfcd011fSBram Moolenaar    assert_equal(0, name)
3426f0afd9e1SBram Moolenaar  END
3427f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3428f0afd9e1SBram Moolenaarenddef
3429f0afd9e1SBram Moolenaar
34307e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
343158dbef33SBram Moolenaar  CheckRunVimInTerminal
343258dbef33SBram Moolenaar
34337e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
34347e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
34357e9210eaSBram Moolenaarendfunc
34367e9210eaSBram Moolenaar
34377e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
34389c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3439cfcd011fSBram Moolenaar  var lines =<< trim END
34409c4f5520SBram Moolenaar    func CheckAndQuit()
34419c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
34429c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
34439c4f5520SBram Moolenaar    endfunc
34449c4f5520SBram Moolenaar  END
34459c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
34469c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3447e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
34489c4f5520SBram Moolenaar  # define Afunc() on the command line
34499c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
34509c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
34512949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
34529c4f5520SBram Moolenaar
34539c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
34549c4f5520SBram Moolenaar  delete('XcallFunc')
34559c4f5520SBram Moolenaar  delete('Xdidcmd')
34569c4f5520SBram Moolenaarenddef
34579c4f5520SBram Moolenaar
3458fcdc5d83SBram Moolenaardef Test_script_var_scope()
3459fcdc5d83SBram Moolenaar  var lines =<< trim END
3460fcdc5d83SBram Moolenaar      vim9script
3461fcdc5d83SBram Moolenaar      if true
3462fcdc5d83SBram Moolenaar        if true
3463fcdc5d83SBram Moolenaar          var one = 'one'
3464fcdc5d83SBram Moolenaar          echo one
3465fcdc5d83SBram Moolenaar        endif
3466fcdc5d83SBram Moolenaar        echo one
3467fcdc5d83SBram Moolenaar      endif
3468fcdc5d83SBram Moolenaar  END
3469fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3470fcdc5d83SBram Moolenaar
3471fcdc5d83SBram Moolenaar  lines =<< trim END
3472fcdc5d83SBram Moolenaar      vim9script
3473fcdc5d83SBram Moolenaar      if true
3474fcdc5d83SBram Moolenaar        if false
3475fcdc5d83SBram Moolenaar          var one = 'one'
3476fcdc5d83SBram Moolenaar          echo one
3477fcdc5d83SBram Moolenaar        else
3478fcdc5d83SBram Moolenaar          var one = 'one'
3479fcdc5d83SBram Moolenaar          echo one
3480fcdc5d83SBram Moolenaar        endif
3481fcdc5d83SBram Moolenaar        echo one
3482fcdc5d83SBram Moolenaar      endif
3483fcdc5d83SBram Moolenaar  END
3484fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3485fcdc5d83SBram Moolenaar
3486fcdc5d83SBram Moolenaar  lines =<< trim END
3487fcdc5d83SBram Moolenaar      vim9script
3488fcdc5d83SBram Moolenaar      while true
3489fcdc5d83SBram Moolenaar        var one = 'one'
3490fcdc5d83SBram Moolenaar        echo one
3491fcdc5d83SBram Moolenaar        break
3492fcdc5d83SBram Moolenaar      endwhile
3493fcdc5d83SBram Moolenaar      echo one
3494fcdc5d83SBram Moolenaar  END
3495fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3496fcdc5d83SBram Moolenaar
3497fcdc5d83SBram Moolenaar  lines =<< trim END
3498fcdc5d83SBram Moolenaar      vim9script
3499fcdc5d83SBram Moolenaar      for i in range(1)
3500fcdc5d83SBram Moolenaar        var one = 'one'
3501fcdc5d83SBram Moolenaar        echo one
3502fcdc5d83SBram Moolenaar      endfor
3503fcdc5d83SBram Moolenaar      echo one
3504fcdc5d83SBram Moolenaar  END
3505fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
35069becdf2bSBram Moolenaar
35079becdf2bSBram Moolenaar  lines =<< trim END
35089becdf2bSBram Moolenaar      vim9script
35099becdf2bSBram Moolenaar      {
35109becdf2bSBram Moolenaar        var one = 'one'
35119becdf2bSBram Moolenaar        assert_equal('one', one)
35129becdf2bSBram Moolenaar      }
35139becdf2bSBram Moolenaar      assert_false(exists('one'))
35149becdf2bSBram Moolenaar      assert_false(exists('s:one'))
35159becdf2bSBram Moolenaar  END
35169becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
35179becdf2bSBram Moolenaar
35189becdf2bSBram Moolenaar  lines =<< trim END
35199becdf2bSBram Moolenaar      vim9script
35209becdf2bSBram Moolenaar      {
35219becdf2bSBram Moolenaar        var one = 'one'
35229becdf2bSBram Moolenaar        echo one
35239becdf2bSBram Moolenaar      }
35249becdf2bSBram Moolenaar      echo one
35259becdf2bSBram Moolenaar  END
35269becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3527fcdc5d83SBram Moolenaarenddef
3528fcdc5d83SBram Moolenaar
3529352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3530352134bbSBram Moolenaar  var lines =<< trim END
3531352134bbSBram Moolenaar    vim9script
3532352134bbSBram Moolenaar    def Callback(...l: any)
3533352134bbSBram Moolenaar      try
3534352134bbSBram Moolenaar        var x: string
3535352134bbSBram Moolenaar        var y: string
3536352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3537352134bbSBram Moolenaar        [x, y] = ['']
3538352134bbSBram Moolenaar      catch
3539352134bbSBram Moolenaar        g:caught = 'yes'
3540352134bbSBram Moolenaar      endtry
3541352134bbSBram Moolenaar    enddef
3542e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3543352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3544352134bbSBram Moolenaar  END
3545352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3546352134bbSBram Moolenaar
3547352134bbSBram Moolenaar  unlet g:caught
3548352134bbSBram Moolenaarenddef
3549352134bbSBram Moolenaar
3550631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3551631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3552631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3553631e8f93SBram Moolenaar  endif
3554631e8f93SBram Moolenaar  var lines =<< trim END
3555631e8f93SBram Moolenaar      vim9script
3556631e8f93SBram Moolenaar      var source: list<number>
3557631e8f93SBram Moolenaar      def Out_cb(...l: any)
3558631e8f93SBram Moolenaar          eval [][0]
3559631e8f93SBram Moolenaar      enddef
3560631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3561631e8f93SBram Moolenaar          sleep 1m
3562631e8f93SBram Moolenaar          source += l
3563631e8f93SBram Moolenaar      enddef
3564e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
35656f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
35666f17a3f0SBram Moolenaar        sleep 10m
35676f17a3f0SBram Moolenaar      endwhile
3568206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3569206c2a6eSBram Moolenaar      sleep 100m
3570631e8f93SBram Moolenaar  END
3571631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3572631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3573631e8f93SBram Moolenaar  delete('Xdef')
3574631e8f93SBram Moolenaarenddef
3575631e8f93SBram Moolenaar
35764324d87aSBram Moolenaardef InvokeNormal()
35774324d87aSBram Moolenaar  exe "norm! :m+1\r"
35784324d87aSBram Moolenaarenddef
35794324d87aSBram Moolenaar
35804324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
35814324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
35824324d87aSBram Moolenaar  new
35834324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
35844324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
35854324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
35864324d87aSBram Moolenaar  xunmap <F3>
3587b5b9480eSBram Moolenaarenddef
3588b5b9480eSBram Moolenaar
3589b5b9480eSBram Moolenaardef Test_white_space_after_command()
3590b5b9480eSBram Moolenaar  var lines =<< trim END
3591b5b9480eSBram Moolenaar    exit_cb: Func})
3592b5b9480eSBram Moolenaar  END
3593b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3594f8103f27SBram Moolenaar
3595f8103f27SBram Moolenaar  lines =<< trim END
3596f8103f27SBram Moolenaar    e#
3597f8103f27SBram Moolenaar  END
3598f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
35994324d87aSBram Moolenaarenddef
36004324d87aSBram Moolenaar
36014aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
36024aab88d9SBram Moolenaar  var lines =<< trim END
36034aab88d9SBram Moolenaar      vim9script
36044aab88d9SBram Moolenaar      if exists('g:guard')
36054aab88d9SBram Moolenaar        finish
36064aab88d9SBram Moolenaar      endif
36074aab88d9SBram Moolenaar      g:guard = 1
36084aab88d9SBram Moolenaar      var name = 'thename'
36094aab88d9SBram Moolenaar      def g:GetName(): string
36104aab88d9SBram Moolenaar        return name
36114aab88d9SBram Moolenaar      enddef
36124aab88d9SBram Moolenaar      def g:SetName(arg: string)
36134aab88d9SBram Moolenaar        name = arg
36144aab88d9SBram Moolenaar      enddef
36154aab88d9SBram Moolenaar  END
36164aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
36174aab88d9SBram Moolenaar  so XscriptTwice.vim
36184aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
36194aab88d9SBram Moolenaar  g:SetName('newname')
36204aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
36214aab88d9SBram Moolenaar  so XscriptTwice.vim
36224aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
36234aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
36244aab88d9SBram Moolenaar
36254aab88d9SBram Moolenaar  delfunc g:GetName
36264aab88d9SBram Moolenaar  delfunc g:SetName
36274aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
36284aab88d9SBram Moolenaar  unlet g:guard
36294aab88d9SBram Moolenaarenddef
36304aab88d9SBram Moolenaar
36314aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
36324aab88d9SBram Moolenaar  var exportlines =<< trim END
36334aab88d9SBram Moolenaar      vim9script
36344aab88d9SBram Moolenaar      if exists('g:guard')
36354aab88d9SBram Moolenaar        finish
36364aab88d9SBram Moolenaar      endif
36374aab88d9SBram Moolenaar      g:guard = 1
36384aab88d9SBram Moolenaar      export var name = 'someName'
36394aab88d9SBram Moolenaar  END
36404aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
36414aab88d9SBram Moolenaar
36424aab88d9SBram Moolenaar  var lines =<< trim END
36434aab88d9SBram Moolenaar      vim9script
36444aab88d9SBram Moolenaar      import name from './XexportScript.vim'
36454aab88d9SBram Moolenaar      def g:GetName(): string
36464aab88d9SBram Moolenaar        return name
36474aab88d9SBram Moolenaar      enddef
36484aab88d9SBram Moolenaar  END
36494aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
36504aab88d9SBram Moolenaar  so XscriptImport.vim
36514aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
36524aab88d9SBram Moolenaar
36534aab88d9SBram Moolenaar  so XexportScript.vim
36544aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
36554aab88d9SBram Moolenaar
36564aab88d9SBram Moolenaar  delfunc g:GetName
36574aab88d9SBram Moolenaar  delete('XexportScript.vim')
36584aab88d9SBram Moolenaar  delete('XscriptImport.vim')
36594aab88d9SBram Moolenaar  unlet g:guard
36604aab88d9SBram Moolenaarenddef
36614aab88d9SBram Moolenaar
366210b9421fSBram Moolenaardef Test_unsupported_commands()
366310b9421fSBram Moolenaar  var lines =<< trim END
366410b9421fSBram Moolenaar      ka
366510b9421fSBram Moolenaar  END
366610b9421fSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1100:')
366710b9421fSBram Moolenaar
366810b9421fSBram Moolenaar  lines =<< trim END
3669ada1d870SBram Moolenaar      :1ka
3670ada1d870SBram Moolenaar  END
3671ada1d870SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E481:')
3672ada1d870SBram Moolenaar
3673ada1d870SBram Moolenaar  lines =<< trim END
367410b9421fSBram Moolenaar    t
367510b9421fSBram Moolenaar  END
367610b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
367710b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
367810b9421fSBram Moolenaar
367910b9421fSBram Moolenaar  lines =<< trim END
368010b9421fSBram Moolenaar    x
368110b9421fSBram Moolenaar  END
368210b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
368310b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
368410b9421fSBram Moolenaar
368510b9421fSBram Moolenaar  lines =<< trim END
368610b9421fSBram Moolenaar    xit
368710b9421fSBram Moolenaar  END
368810b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
368910b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
369010b9421fSBram Moolenaarenddef
369110b9421fSBram Moolenaar
3692585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3693585fea7bSBram Moolenaardef Test_substitute_cmd()
3694585fea7bSBram Moolenaar  new
3695585fea7bSBram Moolenaar  setline(1, 'something')
3696585fea7bSBram Moolenaar  :substitute(some(other(
3697585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3698585fea7bSBram Moolenaar  bwipe!
3699585fea7bSBram Moolenaar
3700f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3701cfcd011fSBram Moolenaar  var lines =<< trim END
3702585fea7bSBram Moolenaar    vim9script
3703585fea7bSBram Moolenaar    new
3704585fea7bSBram Moolenaar    setline(1, 'something')
3705585fea7bSBram Moolenaar    :substitute(some(other(
3706585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3707585fea7bSBram Moolenaar    bwipe!
3708585fea7bSBram Moolenaar  END
3709585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3710585fea7bSBram Moolenaar  source Xvim9lines
3711585fea7bSBram Moolenaar
3712585fea7bSBram Moolenaar  delete('Xvim9lines')
3713585fea7bSBram Moolenaarenddef
3714585fea7bSBram Moolenaar
37158a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3716