18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
7e3d4685fSBram Moolenaarsource shared.vim
837294bd6SBram Moolenaarsource screendump.vim
98a7d6542SBram Moolenaar
105d72ce69SBram Moolenaardef Test_range_only()
115d72ce69SBram Moolenaar  new
125d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
135d72ce69SBram Moolenaar  :/Blah/
145d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
15c2af0affSBram Moolenaar  bwipe!
16c2af0affSBram Moolenaar
17c2af0affSBram Moolenaar  # without range commands use current line
18c2af0affSBram Moolenaar  new
19c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
20c2af0affSBram Moolenaar  :2
21c2af0affSBram Moolenaar  print
22c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
23c2af0affSBram Moolenaar  :3
24c2af0affSBram Moolenaar  list
25c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
26b8554304SBram Moolenaar
27b8554304SBram Moolenaar  # missing command does not print the line
28b8554304SBram Moolenaar  var lines =<< trim END
29b8554304SBram Moolenaar    vim9script
30b8554304SBram Moolenaar    :1|
31b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
32b8554304SBram Moolenaar    :|
33b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
34b8554304SBram Moolenaar  END
35b8554304SBram Moolenaar  CheckScriptSuccess(lines)
36b8554304SBram Moolenaar
37c2af0affSBram Moolenaar  bwipe!
38025cb1caSBram Moolenaar
39025cb1caSBram Moolenaar  # won't generate anything
40025cb1caSBram Moolenaar  if false
41025cb1caSBram Moolenaar    :123
42025cb1caSBram Moolenaar  endif
435d72ce69SBram Moolenaarenddef
445d72ce69SBram Moolenaar
45a6e67e4fSBram Moolenaarlet g:alist = [7]
46a6e67e4fSBram Moolenaarlet g:astring = 'text'
47f0b9f43cSBram Moolenaarlet g:anumber = 123
486e587dcbSBram Moolenaar
494c17ad94SBram Moolenaardef Test_delfunction()
50f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
514c17ad94SBram Moolenaar  CheckScriptSuccess([
524c17ad94SBram Moolenaar      'vim9script',
534c17ad94SBram Moolenaar      'func CheckMe()',
544c17ad94SBram Moolenaar      '  return 123',
554c17ad94SBram Moolenaar      'endfunc',
564c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
574c17ad94SBram Moolenaar      ])
584c17ad94SBram Moolenaar
59f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
604c17ad94SBram Moolenaar  CheckScriptFailure([
614c17ad94SBram Moolenaar      'vim9script',
624c17ad94SBram Moolenaar      'func DeleteMe1()',
634c17ad94SBram Moolenaar      'endfunc',
644c17ad94SBram Moolenaar      'delfunction DeleteMe1',
654c17ad94SBram Moolenaar      ], 'E1084:')
664c17ad94SBram Moolenaar  CheckScriptFailure([
674c17ad94SBram Moolenaar      'vim9script',
684c17ad94SBram Moolenaar      'func DeleteMe2()',
694c17ad94SBram Moolenaar      'endfunc',
704c17ad94SBram Moolenaar      'def DoThat()',
714c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
724c17ad94SBram Moolenaar      'enddef',
734c17ad94SBram Moolenaar      'DoThat()',
744c17ad94SBram Moolenaar      ], 'E1084:')
754c17ad94SBram Moolenaar  CheckScriptFailure([
764c17ad94SBram Moolenaar      'vim9script',
774c17ad94SBram Moolenaar      'def DeleteMe3()',
784c17ad94SBram Moolenaar      'enddef',
794c17ad94SBram Moolenaar      'delfunction DeleteMe3',
804c17ad94SBram Moolenaar      ], 'E1084:')
814c17ad94SBram Moolenaar  CheckScriptFailure([
824c17ad94SBram Moolenaar      'vim9script',
834c17ad94SBram Moolenaar      'def DeleteMe4()',
844c17ad94SBram Moolenaar      'enddef',
854c17ad94SBram Moolenaar      'def DoThat()',
864c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
874c17ad94SBram Moolenaar      'enddef',
884c17ad94SBram Moolenaar      'DoThat()',
894c17ad94SBram Moolenaar      ], 'E1084:')
90925e9fd6SBram Moolenaar
91925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
92cfcd011fSBram Moolenaar  var lines =<< trim END
93925e9fd6SBram Moolenaar      vim9script
94925e9fd6SBram Moolenaar      def g:Global(): string
95925e9fd6SBram Moolenaar        return "yes"
96925e9fd6SBram Moolenaar      enddef
97925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
98925e9fd6SBram Moolenaar      def! g:Global(): string
99925e9fd6SBram Moolenaar        return "no"
100925e9fd6SBram Moolenaar      enddef
101925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
102925e9fd6SBram Moolenaar      delfunc g:Global
103925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
104925e9fd6SBram Moolenaar  END
105925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
106925e9fd6SBram Moolenaar
107925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
108925e9fd6SBram Moolenaar  lines =<< trim END
109925e9fd6SBram Moolenaar      vim9script
110925e9fd6SBram Moolenaar      func g:Global()
111925e9fd6SBram Moolenaar        return "yes"
112925e9fd6SBram Moolenaar      endfunc
113925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
114925e9fd6SBram Moolenaar      def! g:Global(): string
115925e9fd6SBram Moolenaar        return "no"
116925e9fd6SBram Moolenaar      enddef
117925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
118925e9fd6SBram Moolenaar      delfunc g:Global
119925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
120925e9fd6SBram Moolenaar  END
121925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
122925e9fd6SBram Moolenaar
123925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
124925e9fd6SBram Moolenaar  lines =<< trim END
125925e9fd6SBram Moolenaar      vim9script
126925e9fd6SBram Moolenaar      def g:Global(): string
127925e9fd6SBram Moolenaar        return "yes"
128925e9fd6SBram Moolenaar      enddef
129925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
130925e9fd6SBram Moolenaar      func! g:Global()
131925e9fd6SBram Moolenaar        return "no"
132925e9fd6SBram Moolenaar      endfunc
133925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
134925e9fd6SBram Moolenaar      delfunc g:Global
135925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
136925e9fd6SBram Moolenaar  END
137925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1384c17ad94SBram Moolenaarenddef
1394c17ad94SBram Moolenaar
14008052228SBram Moolenaardef Test_wrong_type()
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
143cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
144cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
145599c89c8SBram Moolenaar
146cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
147cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
14842a480bfSBram Moolenaar
149cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
150cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
151cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
152cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
153cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
154cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
155cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
156cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
157cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
158cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
159cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
160a0a9f43aSBram Moolenaar
161cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
162cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
16308052228SBram Moolenaarenddef
1648a7d6542SBram Moolenaar
16510c65860SBram Moolenaardef Test_script_wrong_type()
16610c65860SBram Moolenaar  var lines =<< trim END
16710c65860SBram Moolenaar      vim9script
16810c65860SBram Moolenaar      var s:dict: dict<string>
16910c65860SBram Moolenaar      s:dict['a'] = ['x']
17010c65860SBram Moolenaar  END
17110c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
17210c65860SBram Moolenaarenddef
17310c65860SBram Moolenaar
17408052228SBram Moolenaardef Test_const()
175cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
176cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
177cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
17830fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
17930fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
180dbeecb2bSBram Moolenaar
181cfcd011fSBram Moolenaar  var lines =<< trim END
18230fd8204SBram Moolenaar    final list = [1, 2, 3]
183dbeecb2bSBram Moolenaar    list[0] = 4
1840b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
18530fd8204SBram Moolenaar    const other = [5, 6, 7]
1860b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
18771abe482SBram Moolenaar
188cfcd011fSBram Moolenaar    var varlist = [7, 8]
18930fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
19071abe482SBram Moolenaar    varlist[0] = 77
19171abe482SBram Moolenaar    # TODO: does not work yet
19271abe482SBram Moolenaar    # constlist[1][1] = 88
193cfcd011fSBram Moolenaar    var cl = constlist[1]
19471abe482SBram Moolenaar    cl[1] = 88
19571abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
19671abe482SBram Moolenaar
197e0de171eSBram Moolenaar    var vardict = {five: 5, six: 6}
198e0de171eSBram Moolenaar    const constdict = {one: 1, two: vardict, three: 3}
19971abe482SBram Moolenaar    vardict['five'] = 55
20071abe482SBram Moolenaar    # TODO: does not work yet
20171abe482SBram Moolenaar    # constdict['two']['six'] = 66
202cfcd011fSBram Moolenaar    var cd = constdict['two']
20371abe482SBram Moolenaar    cd['six'] = 66
204e0de171eSBram Moolenaar    constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
205dbeecb2bSBram Moolenaar  END
206dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
20708052228SBram Moolenaarenddef
2088a7d6542SBram Moolenaar
2090b4c66c6SBram Moolenaardef Test_const_bang()
210cfcd011fSBram Moolenaar  var lines =<< trim END
21130fd8204SBram Moolenaar      const var = 234
2120b4c66c6SBram Moolenaar      var = 99
2130b4c66c6SBram Moolenaar  END
2140b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
2150b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
2160b4c66c6SBram Moolenaar
2170b4c66c6SBram Moolenaar  lines =<< trim END
21830fd8204SBram Moolenaar      const ll = [2, 3, 4]
2190b4c66c6SBram Moolenaar      ll[0] = 99
2200b4c66c6SBram Moolenaar  END
2210b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2220b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2230b4c66c6SBram Moolenaar
2240b4c66c6SBram Moolenaar  lines =<< trim END
22530fd8204SBram Moolenaar      const ll = [2, 3, 4]
2260b4c66c6SBram Moolenaar      ll[3] = 99
2270b4c66c6SBram Moolenaar  END
2280b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2290b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2300b4c66c6SBram Moolenaar
2310b4c66c6SBram Moolenaar  lines =<< trim END
232e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2330b4c66c6SBram Moolenaar      dd["one"] = 99
2340b4c66c6SBram Moolenaar  END
2350b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2360b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2370b4c66c6SBram Moolenaar
2380b4c66c6SBram Moolenaar  lines =<< trim END
239e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2400b4c66c6SBram Moolenaar      dd["three"] = 99
2410b4c66c6SBram Moolenaar  END
2420b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2430b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2440b4c66c6SBram Moolenaarenddef
2450b4c66c6SBram Moolenaar
246df069eecSBram Moolenaardef Test_range_no_colon()
247d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
248d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
249d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
250d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
251df069eecSBram Moolenaarenddef
252df069eecSBram Moolenaar
253df069eecSBram Moolenaar
2548a7d6542SBram Moolenaardef Test_block()
255cfcd011fSBram Moolenaar  var outer = 1
2568a7d6542SBram Moolenaar  {
257cfcd011fSBram Moolenaar    var inner = 2
2588a7d6542SBram Moolenaar    assert_equal(1, outer)
2598a7d6542SBram Moolenaar    assert_equal(2, inner)
2608a7d6542SBram Moolenaar  }
2618a7d6542SBram Moolenaar  assert_equal(1, outer)
2623f1e9f00SBram Moolenaar
2633f1e9f00SBram Moolenaar  {|echo 'yes'|}
2648a7d6542SBram Moolenaarenddef
2658a7d6542SBram Moolenaar
26608052228SBram Moolenaardef Test_block_failure()
267cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
26808052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
26908052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
27008052228SBram Moolenaarenddef
2718a7d6542SBram Moolenaar
272fbbcd003SBram Moolenaardef Test_block_local_vars()
273fbbcd003SBram Moolenaar  var lines =<< trim END
274fbbcd003SBram Moolenaar      vim9script
275ed234f24SBram Moolenaar      v:testing = 1
276fbbcd003SBram Moolenaar      if true
277ed234f24SBram Moolenaar        var text = ['hello']
278ed234f24SBram Moolenaar        def SayHello(): list<string>
279fbbcd003SBram Moolenaar          return text
280fbbcd003SBram Moolenaar        enddef
281fbbcd003SBram Moolenaar        def SetText(v: string)
282ed234f24SBram Moolenaar          text = [v]
283fbbcd003SBram Moolenaar        enddef
284fbbcd003SBram Moolenaar      endif
285fbbcd003SBram Moolenaar
286fbbcd003SBram Moolenaar      if true
287ed234f24SBram Moolenaar        var text = ['again']
288ed234f24SBram Moolenaar        def SayAgain(): list<string>
289fbbcd003SBram Moolenaar          return text
290fbbcd003SBram Moolenaar        enddef
291fbbcd003SBram Moolenaar      endif
292ed234f24SBram Moolenaar
293ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
294ed234f24SBram Moolenaar      test_garbagecollect_now()
295ed234f24SBram Moolenaar
296fbbcd003SBram Moolenaar      defcompile
297fbbcd003SBram Moolenaar
298ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
299ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
300fbbcd003SBram Moolenaar
301fbbcd003SBram Moolenaar      SetText('foobar')
302ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
303ed234f24SBram Moolenaar
304ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
305ed234f24SBram Moolenaar      qall!
306fbbcd003SBram Moolenaar  END
307ed234f24SBram Moolenaar
308ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
309ed234f24SBram Moolenaar  # context gets garbage collected.
310ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
311ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
312ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
313ed234f24SBram Moolenaar
314ed234f24SBram Moolenaar  delete('Xscript')
315ed234f24SBram Moolenaar  delete('Xdidit')
316fbbcd003SBram Moolenaarenddef
317fbbcd003SBram Moolenaar
31839ca4127SBram Moolenaardef Test_block_local_vars_with_func()
31939ca4127SBram Moolenaar  var lines =<< trim END
32039ca4127SBram Moolenaar      vim9script
32139ca4127SBram Moolenaar      if true
32239ca4127SBram Moolenaar        var foo = 'foo'
32339ca4127SBram Moolenaar        if true
32439ca4127SBram Moolenaar          var bar = 'bar'
32539ca4127SBram Moolenaar          def Func(): list<string>
32639ca4127SBram Moolenaar            return [foo, bar]
32739ca4127SBram Moolenaar          enddef
32839ca4127SBram Moolenaar        endif
32939ca4127SBram Moolenaar      endif
33039ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
33139ca4127SBram Moolenaar      # "foo" and "bar"
33239ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
33339ca4127SBram Moolenaar  END
33439ca4127SBram Moolenaar  CheckScriptSuccess(lines)
33539ca4127SBram Moolenaarenddef
33639ca4127SBram Moolenaar
337d032f34aSBram Moolenaarfunc g:NoSuchFunc()
338d032f34aSBram Moolenaar  echo 'none'
339d032f34aSBram Moolenaarendfunc
340d032f34aSBram Moolenaar
3419e1d9e34SBram Moolenaardef Test_try_catch_throw()
342cfcd011fSBram Moolenaar  var l = []
3437a092245SBram Moolenaar  try # comment
3448a7d6542SBram Moolenaar    add(l, '1')
3458a7d6542SBram Moolenaar    throw 'wrong'
3468a7d6542SBram Moolenaar    add(l, '2')
3477a092245SBram Moolenaar  catch # comment
3488a7d6542SBram Moolenaar    add(l, v:exception)
3497a092245SBram Moolenaar  finally # comment
3508a7d6542SBram Moolenaar    add(l, '3')
3517a092245SBram Moolenaar  endtry # comment
3528a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
35368d130c6SBram Moolenaar
354e859312eSBram Moolenaar  l = []
355e859312eSBram Moolenaar  try
356e859312eSBram Moolenaar    try
357e859312eSBram Moolenaar      add(l, '1')
358e859312eSBram Moolenaar      throw 'wrong'
359e859312eSBram Moolenaar      add(l, '2')
360e859312eSBram Moolenaar    catch /right/
361e859312eSBram Moolenaar      add(l, v:exception)
362e859312eSBram Moolenaar    endtry
363e859312eSBram Moolenaar  catch /wrong/
364e859312eSBram Moolenaar    add(l, 'caught')
365373863edSBram Moolenaar  fina
366e859312eSBram Moolenaar    add(l, 'finally')
367e859312eSBram Moolenaar  endtry
368e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
369e859312eSBram Moolenaar
370cfcd011fSBram Moolenaar  var n: number
37168d130c6SBram Moolenaar  try
37268d130c6SBram Moolenaar    n = l[3]
37368d130c6SBram Moolenaar  catch /E684:/
37468d130c6SBram Moolenaar    n = 99
37568d130c6SBram Moolenaar  endtry
37668d130c6SBram Moolenaar  assert_equal(99, n)
37768d130c6SBram Moolenaar
37869f7050cSBram Moolenaar  var done = 'no'
37969f7050cSBram Moolenaar  if 0
38069f7050cSBram Moolenaar    try | catch | endtry
38169f7050cSBram Moolenaar  else
38269f7050cSBram Moolenaar    done = 'yes'
38369f7050cSBram Moolenaar  endif
38469f7050cSBram Moolenaar  assert_equal('yes', done)
38569f7050cSBram Moolenaar
38669f7050cSBram Moolenaar  done = 'no'
38769f7050cSBram Moolenaar  if 1
38869f7050cSBram Moolenaar    done = 'yes'
38969f7050cSBram Moolenaar  else
39069f7050cSBram Moolenaar    try | catch | endtry
39169f7050cSBram Moolenaar    done = 'never'
39269f7050cSBram Moolenaar  endif
39369f7050cSBram Moolenaar  assert_equal('yes', done)
39469f7050cSBram Moolenaar
39569f7050cSBram Moolenaar  if 1
39669f7050cSBram Moolenaar  else
39769f7050cSBram Moolenaar    try | catch /pat/ | endtry
39869f7050cSBram Moolenaar    try | catch /pat/
39969f7050cSBram Moolenaar    endtry
40069f7050cSBram Moolenaar    try
40169f7050cSBram Moolenaar    catch /pat/ | endtry
40269f7050cSBram Moolenaar    try
40369f7050cSBram Moolenaar    catch /pat/
40469f7050cSBram Moolenaar    endtry
40569f7050cSBram Moolenaar  endif
40669f7050cSBram Moolenaar
40768d130c6SBram Moolenaar  try
408cc673e74SBram Moolenaar    # string slice returns a string, not a number
40968d130c6SBram Moolenaar    n = g:astring[3]
4105e654230SBram Moolenaar  catch /E1012:/
41168d130c6SBram Moolenaar    n = 77
41268d130c6SBram Moolenaar  endtry
41368d130c6SBram Moolenaar  assert_equal(77, n)
41468d130c6SBram Moolenaar
41568d130c6SBram Moolenaar  try
41668d130c6SBram Moolenaar    n = l[g:astring]
4175e654230SBram Moolenaar  catch /E1012:/
41856acb094SBram Moolenaar    n = 88
41968d130c6SBram Moolenaar  endtry
42056acb094SBram Moolenaar  assert_equal(88, n)
42168d130c6SBram Moolenaar
42268d130c6SBram Moolenaar  try
42368d130c6SBram Moolenaar    n = s:does_not_exist
42468d130c6SBram Moolenaar  catch /E121:/
425f0b9f43cSBram Moolenaar    n = 111
426f0b9f43cSBram Moolenaar  endtry
427f0b9f43cSBram Moolenaar  assert_equal(111, n)
428f0b9f43cSBram Moolenaar
429f0b9f43cSBram Moolenaar  try
430f0b9f43cSBram Moolenaar    n = g:does_not_exist
431f0b9f43cSBram Moolenaar  catch /E121:/
43268d130c6SBram Moolenaar    n = 121
43368d130c6SBram Moolenaar  endtry
43468d130c6SBram Moolenaar  assert_equal(121, n)
43568d130c6SBram Moolenaar
436e0de171eSBram Moolenaar  var d = {one: 1}
43768d130c6SBram Moolenaar  try
43868d130c6SBram Moolenaar    n = d[g:astring]
43968d130c6SBram Moolenaar  catch /E716:/
44068d130c6SBram Moolenaar    n = 222
44168d130c6SBram Moolenaar  endtry
44268d130c6SBram Moolenaar  assert_equal(222, n)
443f0b9f43cSBram Moolenaar
444f0b9f43cSBram Moolenaar  try
445f0b9f43cSBram Moolenaar    n = -g:astring
446f0b9f43cSBram Moolenaar  catch /E39:/
447f0b9f43cSBram Moolenaar    n = 233
448f0b9f43cSBram Moolenaar  endtry
449f0b9f43cSBram Moolenaar  assert_equal(233, n)
450f0b9f43cSBram Moolenaar
451f0b9f43cSBram Moolenaar  try
452f0b9f43cSBram Moolenaar    n = +g:astring
453f0b9f43cSBram Moolenaar  catch /E1030:/
454f0b9f43cSBram Moolenaar    n = 244
455f0b9f43cSBram Moolenaar  endtry
456f0b9f43cSBram Moolenaar  assert_equal(244, n)
457f0b9f43cSBram Moolenaar
458f0b9f43cSBram Moolenaar  try
459f0b9f43cSBram Moolenaar    n = +g:alist
460f0b9f43cSBram Moolenaar  catch /E745:/
461f0b9f43cSBram Moolenaar    n = 255
462f0b9f43cSBram Moolenaar  endtry
463f0b9f43cSBram Moolenaar  assert_equal(255, n)
464f0b9f43cSBram Moolenaar
465cfcd011fSBram Moolenaar  var nd: dict<any>
466f0b9f43cSBram Moolenaar  try
4672e5910bfSBram Moolenaar    nd = {[g:alist]: 1}
4682e5910bfSBram Moolenaar  catch /E1105:/
469f0b9f43cSBram Moolenaar    n = 266
470f0b9f43cSBram Moolenaar  endtry
471f0b9f43cSBram Moolenaar  assert_equal(266, n)
472f0b9f43cSBram Moolenaar
473f0b9f43cSBram Moolenaar  try
474f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
475f0b9f43cSBram Moolenaar  catch /E1093:/
476f0b9f43cSBram Moolenaar    n = 277
477f0b9f43cSBram Moolenaar  endtry
478f0b9f43cSBram Moolenaar  assert_equal(277, n)
479f0b9f43cSBram Moolenaar
480e859312eSBram Moolenaar  try
481e859312eSBram Moolenaar    &ts = g:astring
4825e654230SBram Moolenaar  catch /E1012:/
483e859312eSBram Moolenaar    n = 288
484e859312eSBram Moolenaar  endtry
485e859312eSBram Moolenaar  assert_equal(288, n)
486e859312eSBram Moolenaar
487e859312eSBram Moolenaar  try
488e859312eSBram Moolenaar    &backspace = 'asdf'
489e859312eSBram Moolenaar  catch /E474:/
490e859312eSBram Moolenaar    n = 299
491e859312eSBram Moolenaar  endtry
492e859312eSBram Moolenaar  assert_equal(299, n)
493e859312eSBram Moolenaar
494e859312eSBram Moolenaar  l = [1]
495e859312eSBram Moolenaar  try
496e859312eSBram Moolenaar    l[3] = 3
497e859312eSBram Moolenaar  catch /E684:/
498e859312eSBram Moolenaar    n = 300
499e859312eSBram Moolenaar  endtry
500e859312eSBram Moolenaar  assert_equal(300, n)
501e859312eSBram Moolenaar
502e859312eSBram Moolenaar  try
503e859312eSBram Moolenaar    unlet g:does_not_exist
504e859312eSBram Moolenaar  catch /E108:/
505e859312eSBram Moolenaar    n = 322
506e859312eSBram Moolenaar  endtry
507e859312eSBram Moolenaar  assert_equal(322, n)
508e859312eSBram Moolenaar
509e859312eSBram Moolenaar  try
5102bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
511e859312eSBram Moolenaar  catch /E721:/
512e859312eSBram Moolenaar    n = 333
513e859312eSBram Moolenaar  endtry
514e859312eSBram Moolenaar  assert_equal(333, n)
515e859312eSBram Moolenaar
516e859312eSBram Moolenaar  try
517e859312eSBram Moolenaar    l = DeletedFunc()
518e859312eSBram Moolenaar  catch /E933:/
519e859312eSBram Moolenaar    n = 344
520e859312eSBram Moolenaar  endtry
521e859312eSBram Moolenaar  assert_equal(344, n)
522d032f34aSBram Moolenaar
523d032f34aSBram Moolenaar  try
524d032f34aSBram Moolenaar    echo len(v:true)
525d032f34aSBram Moolenaar  catch /E701:/
526d032f34aSBram Moolenaar    n = 355
527d032f34aSBram Moolenaar  endtry
528d032f34aSBram Moolenaar  assert_equal(355, n)
529d032f34aSBram Moolenaar
530cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
531d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
532d032f34aSBram Moolenaar  try
533d032f34aSBram Moolenaar    echo P()
534d032f34aSBram Moolenaar  catch /E117:/
535d032f34aSBram Moolenaar    n = 366
536d032f34aSBram Moolenaar  endtry
537d032f34aSBram Moolenaar  assert_equal(366, n)
538d032f34aSBram Moolenaar
539d032f34aSBram Moolenaar  try
540d032f34aSBram Moolenaar    echo g:NoSuchFunc()
541d032f34aSBram Moolenaar  catch /E117:/
542d032f34aSBram Moolenaar    n = 377
543d032f34aSBram Moolenaar  endtry
544d032f34aSBram Moolenaar  assert_equal(377, n)
545d032f34aSBram Moolenaar
546d032f34aSBram Moolenaar  try
547d032f34aSBram Moolenaar    echo g:alist + 4
548d032f34aSBram Moolenaar  catch /E745:/
549d032f34aSBram Moolenaar    n = 388
550d032f34aSBram Moolenaar  endtry
551d032f34aSBram Moolenaar  assert_equal(388, n)
552d032f34aSBram Moolenaar
553d032f34aSBram Moolenaar  try
554d032f34aSBram Moolenaar    echo 4 + g:alist
555d032f34aSBram Moolenaar  catch /E745:/
556d032f34aSBram Moolenaar    n = 399
557d032f34aSBram Moolenaar  endtry
558d032f34aSBram Moolenaar  assert_equal(399, n)
559d032f34aSBram Moolenaar
560d032f34aSBram Moolenaar  try
561d032f34aSBram Moolenaar    echo g:alist.member
562d032f34aSBram Moolenaar  catch /E715:/
563d032f34aSBram Moolenaar    n = 400
564d032f34aSBram Moolenaar  endtry
565d032f34aSBram Moolenaar  assert_equal(400, n)
566d032f34aSBram Moolenaar
567d032f34aSBram Moolenaar  try
568d032f34aSBram Moolenaar    echo d.member
569d032f34aSBram Moolenaar  catch /E716:/
570d032f34aSBram Moolenaar    n = 411
571d032f34aSBram Moolenaar  endtry
572d032f34aSBram Moolenaar  assert_equal(411, n)
573d9d7789bSBram Moolenaar
574d9d7789bSBram Moolenaar  var counter = 0
575d9d7789bSBram Moolenaar  for i in range(4)
576d9d7789bSBram Moolenaar    try
577d9d7789bSBram Moolenaar      eval [][0]
578d9d7789bSBram Moolenaar    catch
579d9d7789bSBram Moolenaar    endtry
580d9d7789bSBram Moolenaar    counter += 1
581d9d7789bSBram Moolenaar  endfor
582d9d7789bSBram Moolenaar  assert_equal(4, counter)
5837e82c5f3SBram Moolenaar
5847e82c5f3SBram Moolenaar  # return in finally after empty catch
5857e82c5f3SBram Moolenaar  def ReturnInFinally(): number
5867e82c5f3SBram Moolenaar    try
5877e82c5f3SBram Moolenaar    finally
5887e82c5f3SBram Moolenaar      return 4
5897e82c5f3SBram Moolenaar    endtry
5907e82c5f3SBram Moolenaar    return 2
5917e82c5f3SBram Moolenaar  enddef
5927e82c5f3SBram Moolenaar  assert_equal(4, ReturnInFinally())
5938ac681a2SBram Moolenaar
5948ac681a2SBram Moolenaar  var lines =<< trim END
5958ac681a2SBram Moolenaar      vim9script
5968ac681a2SBram Moolenaar      try
5978ac681a2SBram Moolenaar        acos('0.5')
5988ac681a2SBram Moolenaar          ->setline(1)
5998ac681a2SBram Moolenaar      catch
6008ac681a2SBram Moolenaar        g:caught = v:exception
6018ac681a2SBram Moolenaar      endtry
6028ac681a2SBram Moolenaar  END
6038ac681a2SBram Moolenaar  CheckScriptSuccess(lines)
6048ac681a2SBram Moolenaar  assert_match('E808: Number or Float required', g:caught)
6058ac681a2SBram Moolenaar  unlet g:caught
6064197828dSBram Moolenaar
6074197828dSBram Moolenaar  # missing catch and/or finally
6084197828dSBram Moolenaar  lines =<< trim END
6094197828dSBram Moolenaar      vim9script
6104197828dSBram Moolenaar      try
6114197828dSBram Moolenaar        echo 'something'
6124197828dSBram Moolenaar      endtry
6134197828dSBram Moolenaar  END
6144197828dSBram Moolenaar  CheckScriptFailure(lines, 'E1032:')
6158a7d6542SBram Moolenaarenddef
6168a7d6542SBram Moolenaar
6173f987b59SBram Moolenaardef Test_try_in_catch()
6183f987b59SBram Moolenaar  var lines =<< trim END
6193f987b59SBram Moolenaar      vim9script
6203f987b59SBram Moolenaar      var seq = []
6213f987b59SBram Moolenaar      def DoIt()
6223f987b59SBram Moolenaar        try
6233f987b59SBram Moolenaar          seq->add('throw 1')
6243f987b59SBram Moolenaar          eval [][0]
6253f987b59SBram Moolenaar          seq->add('notreached')
6263f987b59SBram Moolenaar        catch
6273f987b59SBram Moolenaar          seq->add('catch')
6283f987b59SBram Moolenaar          try
6293f987b59SBram Moolenaar            seq->add('throw 2')
6303f987b59SBram Moolenaar            eval [][0]
6313f987b59SBram Moolenaar            seq->add('notreached')
6323f987b59SBram Moolenaar          catch /nothing/
6333f987b59SBram Moolenaar            seq->add('notreached')
6343f987b59SBram Moolenaar          endtry
6353f987b59SBram Moolenaar          seq->add('done')
6363f987b59SBram Moolenaar        endtry
6373f987b59SBram Moolenaar      enddef
6383f987b59SBram Moolenaar      DoIt()
6393f987b59SBram Moolenaar      assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
6403f987b59SBram Moolenaar  END
6413f987b59SBram Moolenaarenddef
6423f987b59SBram Moolenaar
643d3d8feebSBram Moolenaardef Test_error_in_catch()
644d3d8feebSBram Moolenaar  var lines =<< trim END
645d3d8feebSBram Moolenaar      try
646d3d8feebSBram Moolenaar        eval [][0]
647d3d8feebSBram Moolenaar      catch /E684:/
648d3d8feebSBram Moolenaar        eval [][0]
649d3d8feebSBram Moolenaar      endtry
650d3d8feebSBram Moolenaar  END
651d3d8feebSBram Moolenaar  CheckDefExecFailure(lines, 'E684:', 4)
652d3d8feebSBram Moolenaarenddef
653d3d8feebSBram Moolenaar
6542e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to
6552e34c34bSBram Moolenaardef TryContinueFunc()
6562e34c34bSBram Moolenaar while g:Count < 2
6572e34c34bSBram Moolenaar   g:sequence ..= 't'
6582e34c34bSBram Moolenaar    try
6592e34c34bSBram Moolenaar      echoerr 'Test'
6602e34c34bSBram Moolenaar    catch
6612e34c34bSBram Moolenaar      g:Count += 1
6622e34c34bSBram Moolenaar      g:sequence ..= 'c'
6632e34c34bSBram Moolenaar      continue
6642e34c34bSBram Moolenaar    endtry
6652e34c34bSBram Moolenaar    g:sequence ..= 'e'
6662e34c34bSBram Moolenaar    g:Count += 1
6672e34c34bSBram Moolenaar  endwhile
6682e34c34bSBram Moolenaarenddef
6692e34c34bSBram Moolenaar
6702e34c34bSBram Moolenaardef Test_continue_in_try_in_while()
6712e34c34bSBram Moolenaar  g:Count = 0
6722e34c34bSBram Moolenaar  g:sequence = ''
6732e34c34bSBram Moolenaar  TryContinueFunc()
6742e34c34bSBram Moolenaar  assert_equal('tctc', g:sequence)
6752e34c34bSBram Moolenaar  unlet g:Count
6762e34c34bSBram Moolenaar  unlet g:sequence
6772e34c34bSBram Moolenaarenddef
6782e34c34bSBram Moolenaar
6799cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
6809cb577a6SBram Moolenaar  # return in try block returns normally
6819cb577a6SBram Moolenaar  def ReturnInTry(): string
6829cb577a6SBram Moolenaar    try
6839cb577a6SBram Moolenaar      return '"some message"'
6849cb577a6SBram Moolenaar    catch
6859cb577a6SBram Moolenaar    endtry
6869cb577a6SBram Moolenaar    return 'not reached'
6879cb577a6SBram Moolenaar  enddef
6889cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
6899cb577a6SBram Moolenaarenddef
6909cb577a6SBram Moolenaar
6911430ceebSBram Moolenaardef Test_cnext_works_in_catch()
6921430ceebSBram Moolenaar  var lines =<< trim END
6931430ceebSBram Moolenaar      vim9script
694c323527dSBram Moolenaar      au BufEnter * eval 1 + 2
6951430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
6961430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
6971430ceebSBram Moolenaar      var items = [
6981430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
6991430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
7001430ceebSBram Moolenaar        ]
7011430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
7021430ceebSBram Moolenaar      cwindow
7031430ceebSBram Moolenaar
7041430ceebSBram Moolenaar      def CnextOrCfirst()
7051430ceebSBram Moolenaar        # if cnext fails, cfirst is used
7061430ceebSBram Moolenaar        try
7071430ceebSBram Moolenaar          cnext
7081430ceebSBram Moolenaar        catch
7091430ceebSBram Moolenaar          cfirst
7101430ceebSBram Moolenaar        endtry
7111430ceebSBram Moolenaar      enddef
7121430ceebSBram Moolenaar
7131430ceebSBram Moolenaar      CnextOrCfirst()
7141430ceebSBram Moolenaar      CnextOrCfirst()
7151430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
7161430ceebSBram Moolenaar      qall
7171430ceebSBram Moolenaar  END
7181430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
7191430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
7201430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
7211430ceebSBram Moolenaar
7221430ceebSBram Moolenaar  delete('Xfile1')
7231430ceebSBram Moolenaar  delete('Xfile2')
7241430ceebSBram Moolenaar  delete('XCatchCnext')
7251430ceebSBram Moolenaar  delete('Xresult')
7261430ceebSBram Moolenaarenddef
7271430ceebSBram Moolenaar
7289e1d9e34SBram Moolenaardef Test_throw_skipped()
7299e1d9e34SBram Moolenaar  if 0
7309e1d9e34SBram Moolenaar    throw dontgethere
7319e1d9e34SBram Moolenaar  endif
7329e1d9e34SBram Moolenaarenddef
7339e1d9e34SBram Moolenaar
7348f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
7358f81b22eSBram Moolenaar  var lines =<< trim END
7368f81b22eSBram Moolenaar    vim9script
7378f81b22eSBram Moolenaar    def Func()
7388f81b22eSBram Moolenaar      throw 'error'
7398f81b22eSBram Moolenaar    enddef
7408f81b22eSBram Moolenaar    silent! Func()
7418f81b22eSBram Moolenaar  END
7428f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
7438f81b22eSBram Moolenaar  source XthrowSilenced
7448f81b22eSBram Moolenaar  delete('XthrowSilenced')
7458f81b22eSBram Moolenaarenddef
7468f81b22eSBram Moolenaar
747e859312eSBram Moolenaardef DeletedFunc(): list<any>
748e859312eSBram Moolenaar  return ['delete me']
749e859312eSBram Moolenaarenddef
750e859312eSBram Moolenaardefcompile
751e859312eSBram Moolenaardelfunc DeletedFunc
752e859312eSBram Moolenaar
753257cc5eeSBram Moolenaardef ThrowFromDef()
754a72cfb80SBram Moolenaar  throw "getout" # comment
755257cc5eeSBram Moolenaarenddef
756257cc5eeSBram Moolenaar
757257cc5eeSBram Moolenaarfunc CatchInFunc()
758257cc5eeSBram Moolenaar  try
759257cc5eeSBram Moolenaar    call ThrowFromDef()
760257cc5eeSBram Moolenaar  catch
761257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
762257cc5eeSBram Moolenaar  endtry
763257cc5eeSBram Moolenaarendfunc
764257cc5eeSBram Moolenaar
765257cc5eeSBram Moolenaardef CatchInDef()
766257cc5eeSBram Moolenaar  try
767257cc5eeSBram Moolenaar    ThrowFromDef()
768257cc5eeSBram Moolenaar  catch
769257cc5eeSBram Moolenaar    g:thrown_def = v:exception
770257cc5eeSBram Moolenaar  endtry
771257cc5eeSBram Moolenaarenddef
772257cc5eeSBram Moolenaar
773f575adffSBram Moolenaardef ReturnFinally(): string
774f575adffSBram Moolenaar  try
775f575adffSBram Moolenaar    return 'intry'
776373863edSBram Moolenaar  finall
777f575adffSBram Moolenaar    g:in_finally = 'finally'
778f575adffSBram Moolenaar  endtry
779f575adffSBram Moolenaar  return 'end'
780f575adffSBram Moolenaarenddef
781f575adffSBram Moolenaar
782257cc5eeSBram Moolenaardef Test_try_catch_nested()
783257cc5eeSBram Moolenaar  CatchInFunc()
784257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
785257cc5eeSBram Moolenaar
786257cc5eeSBram Moolenaar  CatchInDef()
787257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
788f575adffSBram Moolenaar
789f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
790f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
791d3d8feebSBram Moolenaar
792d3d8feebSBram Moolenaar  var l = []
793d3d8feebSBram Moolenaar  try
794d3d8feebSBram Moolenaar    l->add('1')
795d3d8feebSBram Moolenaar    throw 'bad'
796d3d8feebSBram Moolenaar    l->add('x')
797d3d8feebSBram Moolenaar  catch /bad/
798d3d8feebSBram Moolenaar    l->add('2')
799d3d8feebSBram Moolenaar    try
800d3d8feebSBram Moolenaar      l->add('3')
801d3d8feebSBram Moolenaar      throw 'one'
802d3d8feebSBram Moolenaar      l->add('x')
803d3d8feebSBram Moolenaar    catch /one/
804d3d8feebSBram Moolenaar      l->add('4')
805d3d8feebSBram Moolenaar      try
806d3d8feebSBram Moolenaar        l->add('5')
807d3d8feebSBram Moolenaar        throw 'more'
808d3d8feebSBram Moolenaar        l->add('x')
809d3d8feebSBram Moolenaar      catch /more/
810d3d8feebSBram Moolenaar        l->add('6')
811d3d8feebSBram Moolenaar      endtry
812d3d8feebSBram Moolenaar    endtry
813d3d8feebSBram Moolenaar  endtry
814d3d8feebSBram Moolenaar  assert_equal(['1', '2', '3', '4', '5', '6'], l)
815834193afSBram Moolenaar
816834193afSBram Moolenaar  l = []
817834193afSBram Moolenaar  try
818834193afSBram Moolenaar    try
819834193afSBram Moolenaar      l->add('1')
820834193afSBram Moolenaar      throw 'foo'
821834193afSBram Moolenaar      l->add('x')
822834193afSBram Moolenaar    catch
823834193afSBram Moolenaar      l->add('2')
824834193afSBram Moolenaar      throw 'bar'
825834193afSBram Moolenaar      l->add('x')
826834193afSBram Moolenaar    finally
827834193afSBram Moolenaar      l->add('3')
828834193afSBram Moolenaar    endtry
829834193afSBram Moolenaar    l->add('x')
830834193afSBram Moolenaar  catch /bar/
831834193afSBram Moolenaar    l->add('4')
832834193afSBram Moolenaar  endtry
833834193afSBram Moolenaar  assert_equal(['1', '2', '3', '4'], l)
834f575adffSBram Moolenaarenddef
835f575adffSBram Moolenaar
8369939f57bSBram Moolenaardef TryOne(): number
8379939f57bSBram Moolenaar  try
8389939f57bSBram Moolenaar    return 0
8399939f57bSBram Moolenaar  catch
8409939f57bSBram Moolenaar  endtry
8419939f57bSBram Moolenaar  return 0
8429939f57bSBram Moolenaarenddef
8439939f57bSBram Moolenaar
8449939f57bSBram Moolenaardef TryTwo(n: number): string
8459939f57bSBram Moolenaar  try
846cfcd011fSBram Moolenaar    var x = {}
8479939f57bSBram Moolenaar  catch
8489939f57bSBram Moolenaar  endtry
8499939f57bSBram Moolenaar  return 'text'
8509939f57bSBram Moolenaarenddef
8519939f57bSBram Moolenaar
8529939f57bSBram Moolenaardef Test_try_catch_twice()
8539939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
8549939f57bSBram Moolenaarenddef
8559939f57bSBram Moolenaar
856f575adffSBram Moolenaardef Test_try_catch_match()
857cfcd011fSBram Moolenaar  var seq = 'a'
858f575adffSBram Moolenaar  try
859f575adffSBram Moolenaar    throw 'something'
860f575adffSBram Moolenaar  catch /nothing/
861f575adffSBram Moolenaar    seq ..= 'x'
862f575adffSBram Moolenaar  catch /some/
863f575adffSBram Moolenaar    seq ..= 'b'
864f575adffSBram Moolenaar  catch /asdf/
865f575adffSBram Moolenaar    seq ..= 'x'
866e8c4abbbSBram Moolenaar  catch ?a\?sdf?
867e8c4abbbSBram Moolenaar    seq ..= 'y'
868f575adffSBram Moolenaar  finally
869f575adffSBram Moolenaar    seq ..= 'c'
870f575adffSBram Moolenaar  endtry
871f575adffSBram Moolenaar  assert_equal('abc', seq)
872257cc5eeSBram Moolenaarenddef
873257cc5eeSBram Moolenaar
874e8c4abbbSBram Moolenaardef Test_try_catch_fails()
875d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
876d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
877d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
878d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
879d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
880d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
881d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
882d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
88313106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
884d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
885585fea7bSBram Moolenaar
886e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
887d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
888e8c4abbbSBram Moolenaarenddef
889e8c4abbbSBram Moolenaar
8907c5b3c03SBram Moolenaardef Try_catch_skipped()
8917c5b3c03SBram Moolenaar  var l = []
8927c5b3c03SBram Moolenaar  try
8937c5b3c03SBram Moolenaar  finally
8947c5b3c03SBram Moolenaar  endtry
8957c5b3c03SBram Moolenaar
8967c5b3c03SBram Moolenaar  if 1
8977c5b3c03SBram Moolenaar  else
8987c5b3c03SBram Moolenaar    try
8997c5b3c03SBram Moolenaar    endtry
9007c5b3c03SBram Moolenaar  endif
9017c5b3c03SBram Moolenaarenddef
9027c5b3c03SBram Moolenaar
9037c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
9047c5b3c03SBram Moolenaardef Test_try_catch_skipped()
9057c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
9067c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
9077c5b3c03SBram Moolenaarenddef
9087c5b3c03SBram Moolenaar
9097c5b3c03SBram Moolenaar
9107c5b3c03SBram Moolenaar
911006ad48bSBram Moolenaardef Test_throw_vimscript()
912f5be8cdbSBram Moolenaar  # only checks line continuation
913cfcd011fSBram Moolenaar  var lines =<< trim END
914006ad48bSBram Moolenaar      vim9script
915006ad48bSBram Moolenaar      try
916006ad48bSBram Moolenaar        throw 'one'
917006ad48bSBram Moolenaar              .. 'two'
918006ad48bSBram Moolenaar      catch
919006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
920006ad48bSBram Moolenaar      endtry
921006ad48bSBram Moolenaar  END
922006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
9231e021e63SBram Moolenaar
9241e021e63SBram Moolenaar  lines =<< trim END
9251e021e63SBram Moolenaar    vim9script
926352134bbSBram Moolenaar    @r = ''
9271e021e63SBram Moolenaar    def Func()
9281e021e63SBram Moolenaar      throw @r
9291e021e63SBram Moolenaar    enddef
9301e021e63SBram Moolenaar    var result = ''
9311e021e63SBram Moolenaar    try
9321e021e63SBram Moolenaar      Func()
9331e021e63SBram Moolenaar    catch /E1129:/
9341e021e63SBram Moolenaar      result = 'caught'
9351e021e63SBram Moolenaar    endtry
9361e021e63SBram Moolenaar    assert_equal('caught', result)
9371e021e63SBram Moolenaar  END
9381e021e63SBram Moolenaar  CheckScriptSuccess(lines)
939006ad48bSBram Moolenaarenddef
940006ad48bSBram Moolenaar
941ed677f55SBram Moolenaardef Test_error_in_nested_function()
94203dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
943cfcd011fSBram Moolenaar  var lines =<< trim END
944ed677f55SBram Moolenaar      vim9script
945ed677f55SBram Moolenaar      def Func()
946ed677f55SBram Moolenaar        Error()
947ed677f55SBram Moolenaar        g:test_var = 1
948ed677f55SBram Moolenaar      enddef
949ed677f55SBram Moolenaar      func Error() abort
950ed677f55SBram Moolenaar        eval [][0]
951ed677f55SBram Moolenaar      endfunc
952ed677f55SBram Moolenaar      Func()
953ed677f55SBram Moolenaar  END
954ed677f55SBram Moolenaar  g:test_var = 0
955ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
956ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
957ed677f55SBram Moolenaarenddef
958ed677f55SBram Moolenaar
959227c58a4SBram Moolenaardef Test_abort_after_error()
960227c58a4SBram Moolenaar  var lines =<< trim END
961227c58a4SBram Moolenaar      vim9script
962227c58a4SBram Moolenaar      while true
963227c58a4SBram Moolenaar        echo notfound
964227c58a4SBram Moolenaar      endwhile
965227c58a4SBram Moolenaar      g:gotthere = true
966227c58a4SBram Moolenaar  END
967227c58a4SBram Moolenaar  g:gotthere = false
968227c58a4SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
969227c58a4SBram Moolenaar  assert_false(g:gotthere)
970227c58a4SBram Moolenaar  unlet g:gotthere
971227c58a4SBram Moolenaarenddef
972227c58a4SBram Moolenaar
97337c83711SBram Moolenaardef Test_cexpr_vimscript()
974f5be8cdbSBram Moolenaar  # only checks line continuation
97537c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
976cfcd011fSBram Moolenaar  var lines =<< trim END
97737c83711SBram Moolenaar      vim9script
97837c83711SBram Moolenaar      cexpr 'File'
97937c83711SBram Moolenaar                .. ' someFile' ..
98037c83711SBram Moolenaar                   ' line 19'
98137c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
98237c83711SBram Moolenaar  END
98337c83711SBram Moolenaar  CheckScriptSuccess(lines)
98437c83711SBram Moolenaar  set errorformat&
98537c83711SBram Moolenaarenddef
98637c83711SBram Moolenaar
987c9edd6b5SBram Moolenaardef Test_statusline_syntax()
988c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
989cfcd011fSBram Moolenaar  var lines =<< trim END
990c9edd6b5SBram Moolenaar      vim9script
991c9edd6b5SBram Moolenaar      func g:Status()
992c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
993c9edd6b5SBram Moolenaar      endfunc
994c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
995c9edd6b5SBram Moolenaar      redrawstatus
996c9edd6b5SBram Moolenaar      set laststatus statusline=
997c9edd6b5SBram Moolenaar  END
998c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
999c9edd6b5SBram Moolenaarenddef
1000c9edd6b5SBram Moolenaar
1001b209750bSBram Moolenaardef Test_list_vimscript()
1002b209750bSBram Moolenaar  # checks line continuation and comments
1003cfcd011fSBram Moolenaar  var lines =<< trim END
1004b209750bSBram Moolenaar      vim9script
1005cfcd011fSBram Moolenaar      var mylist = [
1006b209750bSBram Moolenaar            'one',
1007b209750bSBram Moolenaar            # comment
1008b209750bSBram Moolenaar            'two', # empty line follows
1009b209750bSBram Moolenaar
1010b209750bSBram Moolenaar            'three',
1011b209750bSBram Moolenaar            ]
1012b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1013b209750bSBram Moolenaar  END
1014b209750bSBram Moolenaar  CheckScriptSuccess(lines)
101566250c93SBram Moolenaar
101666250c93SBram Moolenaar  # check all lines from heredoc are kept
101766250c93SBram Moolenaar  lines =<< trim END
101866250c93SBram Moolenaar      # comment 1
101966250c93SBram Moolenaar      two
102066250c93SBram Moolenaar      # comment 3
102166250c93SBram Moolenaar
102266250c93SBram Moolenaar      five
102366250c93SBram Moolenaar      # comment 6
102466250c93SBram Moolenaar  END
102566250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
10264bce26bbSBram Moolenaar
10274bce26bbSBram Moolenaar  lines =<< trim END
10284bce26bbSBram Moolenaar    [{
10294bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
10304bce26bbSBram Moolenaar  END
10314bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1032b209750bSBram Moolenaarenddef
1033b209750bSBram Moolenaar
10342a1381c3SBram Moolenaarif has('channel')
103540ee466cSBram Moolenaar  let someJob = test_null_job()
103640ee466cSBram Moolenaar
103740ee466cSBram Moolenaar  def FuncWithError()
103840ee466cSBram Moolenaar    echomsg g:someJob
103940ee466cSBram Moolenaar  enddef
104040ee466cSBram Moolenaar
104140ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
104240ee466cSBram Moolenaar    try
104340ee466cSBram Moolenaar      call FuncWithError()
104440ee466cSBram Moolenaar    catch
104540ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
104640ee466cSBram Moolenaar    endtry
104740ee466cSBram Moolenaar  endfunc
10482a1381c3SBram Moolenaarendif
104940ee466cSBram Moolenaar
10508a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
10518a7d6542SBram Moolenaar  vim9script
1052cfcd011fSBram Moolenaar  var name: string = 'bob'
10538a7d6542SBram Moolenaar  def Concat(arg: string): string
10548a7d6542SBram Moolenaar    return name .. arg
10558a7d6542SBram Moolenaar  enddef
1056227a69deSBram Moolenaar  g:result = Concat('bie')
1057227a69deSBram Moolenaar  g:localname = name
10588a7d6542SBram Moolenaar
10598a7d6542SBram Moolenaar  export const CONST = 1234
1060cfcd011fSBram Moolenaar  export var exported = 9876
1061cfcd011fSBram Moolenaar  export var exp_name = 'John'
10628a7d6542SBram Moolenaar  export def Exported(): string
10638a7d6542SBram Moolenaar    return 'Exported'
10648a7d6542SBram Moolenaar  enddef
10650f2a5cc6SBram Moolenaar  export final theList = [1]
10668a7d6542SBram MoolenaarEND
10678a7d6542SBram Moolenaar
1068b3ca9824SBram Moolenaardef Undo_export_script_lines()
1069b3ca9824SBram Moolenaar  unlet g:result
1070b3ca9824SBram Moolenaar  unlet g:localname
1071b3ca9824SBram Moolenaarenddef
1072b3ca9824SBram Moolenaar
10735269bd2aSBram Moolenaardef Test_vim9_import_export()
1074cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
10758a7d6542SBram Moolenaar    vim9script
10768a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
10778a7d6542SBram Moolenaar    g:imported = exported
10786e587dcbSBram Moolenaar    exported += 3
10796e587dcbSBram Moolenaar    g:imported_added = exported
10808a7d6542SBram Moolenaar    g:imported_func = Exported()
10816e587dcbSBram Moolenaar
108240f4f7a4SBram Moolenaar    def GetExported(): string
1083e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
108440f4f7a4SBram Moolenaar      return local_dict.ref()
108540f4f7a4SBram Moolenaar    enddef
108640f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
108740f4f7a4SBram Moolenaar
10886e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
10896e587dcbSBram Moolenaar    g:imported_name = exp_name
10906e587dcbSBram Moolenaar    exp_name ..= ' Doe'
10916e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
10925381c7a1SBram Moolenaar    g:imported_later = exported
10930f2a5cc6SBram Moolenaar
10940f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
10950f2a5cc6SBram Moolenaar    theList->add(2)
10960f2a5cc6SBram Moolenaar    assert_equal([1, 2], theList)
10978a7d6542SBram Moolenaar  END
10988a7d6542SBram Moolenaar
10998a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
11008a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
11018a7d6542SBram Moolenaar
11028a7d6542SBram Moolenaar  source Ximport.vim
11038a7d6542SBram Moolenaar
11048a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
11058a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
11068a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
11076e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
11085381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
11098a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
111040f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
11116e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
11126e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
11138a7d6542SBram Moolenaar  assert_false(exists('g:name'))
11148a7d6542SBram Moolenaar
1115b3ca9824SBram Moolenaar  Undo_export_script_lines()
11168a7d6542SBram Moolenaar  unlet g:imported
11176e587dcbSBram Moolenaar  unlet g:imported_added
11185381c7a1SBram Moolenaar  unlet g:imported_later
11198a7d6542SBram Moolenaar  unlet g:imported_func
11206e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
11218a7d6542SBram Moolenaar  delete('Ximport.vim')
1122f2d5c240SBram Moolenaar
11231c991144SBram Moolenaar  # similar, with line breaks
1124cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
11251c991144SBram Moolenaar    vim9script
11261c991144SBram Moolenaar    import {
11271c991144SBram Moolenaar        exported,
11281c991144SBram Moolenaar        Exported,
11291c991144SBram Moolenaar        }
11301c991144SBram Moolenaar        from
11311c991144SBram Moolenaar        './Xexport.vim'
11321c991144SBram Moolenaar    g:imported = exported
11331c991144SBram Moolenaar    exported += 5
11341c991144SBram Moolenaar    g:imported_added = exported
11351c991144SBram Moolenaar    g:imported_func = Exported()
11361c991144SBram Moolenaar  END
11371c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
11381c991144SBram Moolenaar  source Ximport_lbr.vim
11391c991144SBram Moolenaar
11401c991144SBram Moolenaar  assert_equal(9876, g:imported)
11411c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
11421c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
11431c991144SBram Moolenaar
11441c991144SBram Moolenaar  # exported script not sourced again
11451c991144SBram Moolenaar  assert_false(exists('g:result'))
11461c991144SBram Moolenaar  unlet g:imported
11471c991144SBram Moolenaar  unlet g:imported_added
11481c991144SBram Moolenaar  unlet g:imported_func
11491c991144SBram Moolenaar  delete('Ximport_lbr.vim')
11501c991144SBram Moolenaar
11511c991144SBram Moolenaar  # import inside :def function
1152cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
11535381c7a1SBram Moolenaar    vim9script
11545381c7a1SBram Moolenaar    def ImportInDef()
11555381c7a1SBram Moolenaar      import exported from './Xexport.vim'
11565381c7a1SBram Moolenaar      g:imported = exported
11575381c7a1SBram Moolenaar      exported += 7
11585381c7a1SBram Moolenaar      g:imported_added = exported
11595381c7a1SBram Moolenaar    enddef
11605381c7a1SBram Moolenaar    ImportInDef()
11615381c7a1SBram Moolenaar  END
11625381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
11635381c7a1SBram Moolenaar  source Ximport2.vim
1164f5be8cdbSBram Moolenaar  # TODO: this should be 9879
11655381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
11665381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
11675381c7a1SBram Moolenaar  unlet g:imported
11685381c7a1SBram Moolenaar  unlet g:imported_added
11695381c7a1SBram Moolenaar  delete('Ximport2.vim')
11705381c7a1SBram Moolenaar
1171cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1172f2d5c240SBram Moolenaar    vim9script
1173f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1174f2d5c240SBram Moolenaar    def UseExport()
1175cb4e80faSBram Moolenaar      g:imported_def = Export.exported
1176f2d5c240SBram Moolenaar    enddef
1177cb4e80faSBram Moolenaar    g:imported_script = Export.exported
1178cb4e80faSBram Moolenaar    assert_equal(1, exists('Export.exported'))
1179cb4e80faSBram Moolenaar    assert_equal(0, exists('Export.notexported'))
1180f2d5c240SBram Moolenaar    UseExport()
1181f2d5c240SBram Moolenaar  END
1182f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1183f2d5c240SBram Moolenaar  source Ximport.vim
1184cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_def)
1185cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_script)
1186f2d5c240SBram Moolenaar
1187cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1188599c89c8SBram Moolenaar    vim9script
1189599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1190599c89c8SBram Moolenaar    def Func()
1191cfcd011fSBram Moolenaar      var dummy = 1
1192cfcd011fSBram Moolenaar      var imported = Export + dummy
1193599c89c8SBram Moolenaar    enddef
1194822ba247SBram Moolenaar    defcompile
1195599c89c8SBram Moolenaar  END
1196599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
119744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1198599c89c8SBram Moolenaar
1199cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1200599c89c8SBram Moolenaar    vim9script
1201599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1202599c89c8SBram Moolenaar    def Func()
1203cfcd011fSBram Moolenaar      var imported = Export . exported
1204599c89c8SBram Moolenaar    enddef
1205822ba247SBram Moolenaar    defcompile
1206599c89c8SBram Moolenaar  END
1207599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
120844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1209599c89c8SBram Moolenaar
1210a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1211a6294955SBram Moolenaar    vim9script
1212a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1213a6294955SBram Moolenaar    var some = 'other'
1214a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1215a6294955SBram Moolenaar    defcompile
1216a6294955SBram Moolenaar  END
1217a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1218a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1219a6294955SBram Moolenaar
1220cb4e80faSBram Moolenaar  var import_star_as_lines_script_no_dot =<< trim END
1221cb4e80faSBram Moolenaar    vim9script
1222cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1223cb4e80faSBram Moolenaar    g:imported_script = Export exported
1224cb4e80faSBram Moolenaar  END
1225cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
1226cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1029:')
1227cb4e80faSBram Moolenaar
1228cb4e80faSBram Moolenaar  var import_star_as_lines_script_space_after_dot =<< trim END
1229cb4e80faSBram Moolenaar    vim9script
1230cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1231cb4e80faSBram Moolenaar    g:imported_script = Export. exported
1232cb4e80faSBram Moolenaar  END
1233cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1234cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1235cb4e80faSBram Moolenaar
1236cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1237599c89c8SBram Moolenaar    vim9script
1238599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1239599c89c8SBram Moolenaar    def Func()
1240cfcd011fSBram Moolenaar      var imported = Export.
1241599c89c8SBram Moolenaar    enddef
1242822ba247SBram Moolenaar    defcompile
1243599c89c8SBram Moolenaar  END
1244599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
124544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1246599c89c8SBram Moolenaar
1247cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
12481c991144SBram Moolenaar    vim9script
12491c991144SBram Moolenaar    import *
12501c991144SBram Moolenaar        as Export
12511c991144SBram Moolenaar        from
12521c991144SBram Moolenaar        './Xexport.vim'
12531c991144SBram Moolenaar    def UseExport()
12541c991144SBram Moolenaar      g:imported = Export.exported
12551c991144SBram Moolenaar    enddef
12561c991144SBram Moolenaar    UseExport()
12571c991144SBram Moolenaar  END
12581c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
12591c991144SBram Moolenaar  source Ximport.vim
12601c991144SBram Moolenaar  assert_equal(9883, g:imported)
12611c991144SBram Moolenaar
1262cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1263f2d5c240SBram Moolenaar    vim9script
1264f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1265f2d5c240SBram Moolenaar  END
1266f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
126744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1268f2d5c240SBram Moolenaar
1269f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1270cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1271fa29c8abSBram Moolenaar    vim9script
1272fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1273fa29c8abSBram Moolenaar  END
1274fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
127544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1276fa29c8abSBram Moolenaar
1277f5be8cdbSBram Moolenaar  # try to import something that is already defined
1278cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
12795269bd2aSBram Moolenaar    vim9script
1280cfcd011fSBram Moolenaar    var exported = 'something'
12815269bd2aSBram Moolenaar    import exported from './Xexport.vim'
12825269bd2aSBram Moolenaar  END
12835269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1284057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
12855269bd2aSBram Moolenaar
1286f5be8cdbSBram Moolenaar  # try to import something that is already defined
12875269bd2aSBram Moolenaar  import_already_defined =<< trim END
12885269bd2aSBram Moolenaar    vim9script
1289cfcd011fSBram Moolenaar    var exported = 'something'
12905269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
12915269bd2aSBram Moolenaar  END
12925269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1293057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
12945269bd2aSBram Moolenaar
1295f5be8cdbSBram Moolenaar  # try to import something that is already defined
12965269bd2aSBram Moolenaar  import_already_defined =<< trim END
12975269bd2aSBram Moolenaar    vim9script
1298cfcd011fSBram Moolenaar    var exported = 'something'
12995269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
13005269bd2aSBram Moolenaar  END
13015269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1302057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13035269bd2aSBram Moolenaar
1304918a4249SBram Moolenaar  # try changing an imported const
1305918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1306918a4249SBram Moolenaar    vim9script
1307918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1308918a4249SBram Moolenaar    def Assign()
1309918a4249SBram Moolenaar      CONST = 987
1310918a4249SBram Moolenaar    enddef
1311918a4249SBram Moolenaar    defcompile
1312918a4249SBram Moolenaar  END
1313918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1314918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1315918a4249SBram Moolenaar
13160f2a5cc6SBram Moolenaar  # try changing an imported final
13170f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
13180f2a5cc6SBram Moolenaar    vim9script
13190f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
13200f2a5cc6SBram Moolenaar    def Assign()
13210f2a5cc6SBram Moolenaar      theList = [2]
13220f2a5cc6SBram Moolenaar    enddef
13230f2a5cc6SBram Moolenaar    defcompile
13240f2a5cc6SBram Moolenaar  END
13250f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
13260f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
13270f2a5cc6SBram Moolenaar
1328f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1329cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1330fa29c8abSBram Moolenaar    vim9script
1331fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1332fa29c8abSBram Moolenaar  END
1333fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
133444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1335fa29c8abSBram Moolenaar
1336cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1337fa29c8abSBram Moolenaar    vim9script
1338fa29c8abSBram Moolenaar    import name './Xexport.vim'
1339fa29c8abSBram Moolenaar  END
1340fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
134144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1342fa29c8abSBram Moolenaar
1343cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1344fa29c8abSBram Moolenaar    vim9script
1345fa29c8abSBram Moolenaar    import name from Xexport.vim
1346fa29c8abSBram Moolenaar  END
1347fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
134844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1349fa29c8abSBram Moolenaar
1350cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1351fa29c8abSBram Moolenaar    vim9script
1352fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1353fa29c8abSBram Moolenaar  END
1354fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
135544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1356fa29c8abSBram Moolenaar
1357cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1358fa29c8abSBram Moolenaar    vim9script
1359fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1360fa29c8abSBram Moolenaar  END
13615269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
136244d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1363fa29c8abSBram Moolenaar
1364f2d5c240SBram Moolenaar  delete('Ximport.vim')
13655269bd2aSBram Moolenaar  delete('Ximport3.vim')
13668a7d6542SBram Moolenaar  delete('Xexport.vim')
13678a7d6542SBram Moolenaar
1368f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
13693e191694SBram Moolenaar  # Flags added or removed are also applied to the restored value.
13703e191694SBram Moolenaar  set cpo=abcd
1371cfcd011fSBram Moolenaar  var lines =<< trim END
1372750802b5SBram Moolenaar    vim9script
1373750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
13743e191694SBram Moolenaar    set cpo+=f
13753e191694SBram Moolenaar    set cpo-=c
13763e191694SBram Moolenaar    g:cpo_after_vim9script = &cpo
1377750802b5SBram Moolenaar  END
1378750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1379750802b5SBram Moolenaar  source Xvim9_script
13803e191694SBram Moolenaar  assert_equal('fabd', &cpo)
1381750802b5SBram Moolenaar  set cpo&vim
1382750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
13833e191694SBram Moolenaar  var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
13843e191694SBram Moolenaar  assert_equal(newcpo, g:cpo_after_vim9script)
13853e191694SBram Moolenaar
1386750802b5SBram Moolenaar  delete('Xvim9_script')
1387750802b5SBram Moolenaarenddef
1388750802b5SBram Moolenaar
13890a84284eSBram Moolenaardef Test_import_as()
13900a84284eSBram Moolenaar  var export_lines =<< trim END
13910a84284eSBram Moolenaar    vim9script
13920a84284eSBram Moolenaar    export var one = 1
13930a84284eSBram Moolenaar    export var yes = 'yes'
1394c967d57aSBram Moolenaar    export var slist: list<string>
13950a84284eSBram Moolenaar  END
13960a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
13970a84284eSBram Moolenaar
13980a84284eSBram Moolenaar  var import_lines =<< trim END
13990a84284eSBram Moolenaar    vim9script
14006c7cc347SBram Moolenaar    var one = 'notused'
14016c7cc347SBram Moolenaar    var yes = 777
14020a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
14030a84284eSBram Moolenaar    assert_equal(1, thatOne)
14040a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
14050a84284eSBram Moolenaar    assert_equal('yes', yesYes)
14060a84284eSBram Moolenaar  END
14070a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
14080a84284eSBram Moolenaar
14090a84284eSBram Moolenaar  import_lines =<< trim END
14100a84284eSBram Moolenaar    vim9script
14110a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
14120a84284eSBram Moolenaar    assert_equal(1, thatOne)
14130a84284eSBram Moolenaar    assert_equal('yes', yesYes)
14140a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
14150a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
14160a84284eSBram Moolenaar  END
14170a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
14180a84284eSBram Moolenaar
1419c967d57aSBram Moolenaar  import_lines =<< trim END
1420c967d57aSBram Moolenaar    vim9script
1421c967d57aSBram Moolenaar    import {slist as impSlist} from './XexportAs'
1422c967d57aSBram Moolenaar    impSlist->add(123)
1423c967d57aSBram Moolenaar  END
1424c967d57aSBram Moolenaar  CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number')
1425c967d57aSBram Moolenaar
14260a84284eSBram Moolenaar  delete('XexportAs')
14270a84284eSBram Moolenaarenddef
14280a84284eSBram Moolenaar
1429803af686SBram Moolenaarfunc g:Trigger()
1430803af686SBram Moolenaar  source Ximport.vim
1431803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1432803af686SBram Moolenaarendfunc
1433803af686SBram Moolenaar
1434803af686SBram Moolenaardef Test_import_export_expr_map()
1435803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1436cfcd011fSBram Moolenaar  var export_lines =<< trim END
1437803af686SBram Moolenaar    vim9script
1438803af686SBram Moolenaar    export def That(): string
1439803af686SBram Moolenaar      return 'yes'
1440803af686SBram Moolenaar    enddef
1441803af686SBram Moolenaar  END
1442803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1443803af686SBram Moolenaar
1444cfcd011fSBram Moolenaar  var import_lines =<< trim END
1445803af686SBram Moolenaar    vim9script
1446803af686SBram Moolenaar    import That from './Xexport_that.vim'
1447803af686SBram Moolenaar    assert_equal('yes', That())
1448803af686SBram Moolenaar  END
1449803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1450803af686SBram Moolenaar
1451803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1452803af686SBram Moolenaar  feedkeys('trigger', "xt")
1453803af686SBram Moolenaar
1454730b2483SBram Moolenaar  delete('Xexport_that.vim')
1455803af686SBram Moolenaar  delete('Ximport.vim')
1456803af686SBram Moolenaar  nunmap trigger
1457803af686SBram Moolenaarenddef
1458803af686SBram Moolenaar
14598e1986e3SBram Moolenaardef Test_import_in_filetype()
14608e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
14618e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1462cfcd011fSBram Moolenaar  var export_lines =<< trim END
14638e1986e3SBram Moolenaar    vim9script
1464cfcd011fSBram Moolenaar    export var That = 'yes'
14658e1986e3SBram Moolenaar  END
1466730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
14678e1986e3SBram Moolenaar
1468cfcd011fSBram Moolenaar  var import_lines =<< trim END
14698e1986e3SBram Moolenaar    vim9script
1470730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
14718e1986e3SBram Moolenaar    assert_equal('yes', That)
14728e1986e3SBram Moolenaar    g:did_load_mytpe = 1
14738e1986e3SBram Moolenaar  END
14748e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
14758e1986e3SBram Moolenaar
1476cfcd011fSBram Moolenaar  var save_rtp = &rtp
14778e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
14788e1986e3SBram Moolenaar
14798e1986e3SBram Moolenaar  filetype plugin on
14808e1986e3SBram Moolenaar  copen
14818e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
14828e1986e3SBram Moolenaar
14838e1986e3SBram Moolenaar  quit!
1484730b2483SBram Moolenaar  delete('Xexport_ft.vim')
14858e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
14868e1986e3SBram Moolenaar  &rtp = save_rtp
14878e1986e3SBram Moolenaarenddef
14888e1986e3SBram Moolenaar
1489efa94447SBram Moolenaardef Test_use_import_in_mapping()
1490cfcd011fSBram Moolenaar  var lines =<< trim END
1491efa94447SBram Moolenaar      vim9script
1492efa94447SBram Moolenaar      export def Funcx()
1493efa94447SBram Moolenaar        g:result = 42
1494efa94447SBram Moolenaar      enddef
1495efa94447SBram Moolenaar  END
1496efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1497efa94447SBram Moolenaar  lines =<< trim END
1498efa94447SBram Moolenaar      vim9script
1499efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1500b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1501efa94447SBram Moolenaar  END
1502efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1503efa94447SBram Moolenaar
1504efa94447SBram Moolenaar  source Xmapscript.vim
1505b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1506efa94447SBram Moolenaar  assert_equal(42, g:result)
1507efa94447SBram Moolenaar
1508efa94447SBram Moolenaar  unlet g:result
1509efa94447SBram Moolenaar  delete('XsomeExport.vim')
1510efa94447SBram Moolenaar  delete('Xmapscript.vim')
1511b3ca9824SBram Moolenaar  nunmap <F3>
1512efa94447SBram Moolenaarenddef
1513efa94447SBram Moolenaar
1514d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1515d3f8a9eeSBram Moolenaar  var lines =<< trim END
1516d3f8a9eeSBram Moolenaar    if has(g:feature)
1517d3f8a9eeSBram Moolenaar      " legacy script
1518d3f8a9eeSBram Moolenaar      let g:legacy = 1
1519d3f8a9eeSBram Moolenaar      finish
1520d3f8a9eeSBram Moolenaar    endif
1521d3f8a9eeSBram Moolenaar    vim9script
1522d3f8a9eeSBram Moolenaar    g:legacy = 0
1523d3f8a9eeSBram Moolenaar  END
1524d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1525d3f8a9eeSBram Moolenaar  g:legacy = -1
1526d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1527d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1528d3f8a9eeSBram Moolenaar
1529d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1530d3f8a9eeSBram Moolenaar  g:legacy = -1
1531d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1532d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1533d3f8a9eeSBram Moolenaarenddef
1534d3f8a9eeSBram Moolenaar
1535750802b5SBram Moolenaardef Test_vim9script_fails()
15368a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
15378a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1538cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
15399721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1540cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1541750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1542750802b5SBram Moolenaar
1543cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1544c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1545c785b9a7SBram Moolenaar
1546e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1547e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
15488a7d6542SBram Moolenaarenddef
15498a7d6542SBram Moolenaar
1550f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1551101f4810SBram Moolenaar  CheckRunVimInTerminal
1552101f4810SBram Moolenaar
15539bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1554c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
15559bb3eb3eSBram Moolenaarendfunc
15569bb3eb3eSBram Moolenaar
1557c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1558cfcd011fSBram Moolenaar  var export =<< trim END
1559101f4810SBram Moolenaar    vim9script
1560101f4810SBram Moolenaar    export def Foo(): number
1561101f4810SBram Moolenaar        return 0
1562101f4810SBram Moolenaar    enddef
1563101f4810SBram Moolenaar  END
1564730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1565101f4810SBram Moolenaar
1566e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
15679bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
15682949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1569101f4810SBram Moolenaar
1570730b2483SBram Moolenaar  delete('XexportCmd.vim')
15719bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
15729bb3eb3eSBram Moolenaarenddef
1573101f4810SBram Moolenaar
15742b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
15752b32700dSBram Moolenaar  var lines =<< trim END
1576a6294955SBram Moolenaar    vim9script
1577a6294955SBram Moolenaar    export var exported = 'thexport'
1578a6294955SBram Moolenaar  END
1579a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1580a6294955SBram Moolenaar  lines =<< trim END
15812b32700dSBram Moolenaar    vim9script noclear
15822b32700dSBram Moolenaar    g:loadCount += 1
15832b32700dSBram Moolenaar    var s:reloaded = 'init'
1584a6294955SBram Moolenaar    import exported from './XExportReload'
15852b32700dSBram Moolenaar
15862b32700dSBram Moolenaar    def Again(): string
15872b32700dSBram Moolenaar      return 'again'
15882b32700dSBram Moolenaar    enddef
15892b32700dSBram Moolenaar
15902b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
15912b32700dSBram Moolenaar    var s:loaded = true
15922b32700dSBram Moolenaar
15932b32700dSBram Moolenaar    var s:notReloaded = 'yes'
15942b32700dSBram Moolenaar    s:reloaded = 'first'
15952b32700dSBram Moolenaar    def g:Values(): list<string>
1596a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
15972b32700dSBram Moolenaar    enddef
15982b32700dSBram Moolenaar
15992b32700dSBram Moolenaar    def Once(): string
16002b32700dSBram Moolenaar      return 'once'
16012b32700dSBram Moolenaar    enddef
16022b32700dSBram Moolenaar  END
16032b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
16042b32700dSBram Moolenaar  g:loadCount = 0
16052b32700dSBram Moolenaar  source XReloaded
16062b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1607a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
16082b32700dSBram Moolenaar  source XReloaded
16092b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1610a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
16112b32700dSBram Moolenaar  source XReloaded
16122b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1613a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
16142b32700dSBram Moolenaar
161548e11c10SBram Moolenaar  delete('XReloaded')
1616a6294955SBram Moolenaar  delete('XExportReload')
16172b32700dSBram Moolenaar  delfunc g:Values
16182b32700dSBram Moolenaar  unlet g:loadCount
1619577dc93dSBram Moolenaar
1620577dc93dSBram Moolenaar  lines =<< trim END
1621577dc93dSBram Moolenaar      vim9script
1622577dc93dSBram Moolenaar      def Inner()
1623577dc93dSBram Moolenaar      enddef
1624577dc93dSBram Moolenaar  END
1625577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1626577dc93dSBram Moolenaar  source XreloadScript.vim
1627577dc93dSBram Moolenaar
1628577dc93dSBram Moolenaar  lines =<< trim END
1629577dc93dSBram Moolenaar      vim9script
1630577dc93dSBram Moolenaar      def Outer()
1631577dc93dSBram Moolenaar        def Inner()
1632577dc93dSBram Moolenaar        enddef
1633577dc93dSBram Moolenaar      enddef
1634577dc93dSBram Moolenaar      defcompile
1635577dc93dSBram Moolenaar  END
1636577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1637577dc93dSBram Moolenaar  source XreloadScript.vim
1638577dc93dSBram Moolenaar
1639577dc93dSBram Moolenaar  delete('XreloadScript.vim')
16402b32700dSBram Moolenaarenddef
16412b32700dSBram Moolenaar
16424c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1643cfcd011fSBram Moolenaar  var lines =<< trim END
16448a7d6542SBram Moolenaar    vim9script
16458a7d6542SBram Moolenaar    const var = ''
1646cfcd011fSBram Moolenaar    var valone = 1234
16478a7d6542SBram Moolenaar    def MyFunc(arg: string)
16488a7d6542SBram Moolenaar       valone = 5678
16498a7d6542SBram Moolenaar    enddef
16508a7d6542SBram Moolenaar  END
1651cfcd011fSBram Moolenaar  var morelines =<< trim END
1652cfcd011fSBram Moolenaar    var valtwo = 222
16538a7d6542SBram Moolenaar    export def GetValtwo(): number
16548a7d6542SBram Moolenaar      return valtwo
16558a7d6542SBram Moolenaar    enddef
16568a7d6542SBram Moolenaar  END
165703afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
16588a7d6542SBram Moolenaar  source Xreload.vim
16598a7d6542SBram Moolenaar  source Xreload.vim
16608a7d6542SBram Moolenaar  source Xreload.vim
16618a7d6542SBram Moolenaar
1662cfcd011fSBram Moolenaar  var testlines =<< trim END
16638a7d6542SBram Moolenaar    vim9script
16648a7d6542SBram Moolenaar    def TheFunc()
16658a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
16668a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
16678a7d6542SBram Moolenaar    enddef
16688a7d6542SBram Moolenaar    TheFunc()
16698a7d6542SBram Moolenaar  END
16708a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
16718a7d6542SBram Moolenaar  source Ximport.vim
16728a7d6542SBram Moolenaar
1673f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1674f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
16758a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
16768a7d6542SBram Moolenaar  source Ximport.vim
16778a7d6542SBram Moolenaar
1678f5be8cdbSBram Moolenaar  # cannot declare a var twice
16798a7d6542SBram Moolenaar  lines =<< trim END
16808a7d6542SBram Moolenaar    vim9script
1681cfcd011fSBram Moolenaar    var valone = 1234
1682cfcd011fSBram Moolenaar    var valone = 5678
16838a7d6542SBram Moolenaar  END
16848a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
168544d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
16868a7d6542SBram Moolenaar
16878a7d6542SBram Moolenaar  delete('Xreload.vim')
16888a7d6542SBram Moolenaar  delete('Ximport.vim')
16898a7d6542SBram Moolenaarenddef
16908a7d6542SBram Moolenaar
169107a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
169207a65d26SBram Moolenaar" compiled function using that variable must fail.
169307a65d26SBram Moolenaardef Test_script_reload_change_type()
169407a65d26SBram Moolenaar  var lines =<< trim END
169507a65d26SBram Moolenaar    vim9script noclear
169607a65d26SBram Moolenaar    var str = 'string'
169707a65d26SBram Moolenaar    def g:GetStr(): string
169807a65d26SBram Moolenaar      return str .. 'xxx'
169907a65d26SBram Moolenaar    enddef
170007a65d26SBram Moolenaar  END
170107a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
170207a65d26SBram Moolenaar  source Xreload.vim
170307a65d26SBram Moolenaar  echo g:GetStr()
170407a65d26SBram Moolenaar
170507a65d26SBram Moolenaar  lines =<< trim END
170607a65d26SBram Moolenaar    vim9script noclear
170707a65d26SBram Moolenaar    var str = 1234
170807a65d26SBram Moolenaar  END
170907a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
171007a65d26SBram Moolenaar  source Xreload.vim
171107a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
171207a65d26SBram Moolenaar
171307a65d26SBram Moolenaar  delfunc g:GetStr
171407a65d26SBram Moolenaar  delete('Xreload.vim')
171507a65d26SBram Moolenaarenddef
171607a65d26SBram Moolenaar
1717c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled
1718c970e422SBram Moolenaarcommand CallFunc echo 'nop'
1719c970e422SBram Moolenaar
1720c970e422SBram Moolenaardef Test_script_reload_from_function()
1721c970e422SBram Moolenaar  var lines =<< trim END
1722c970e422SBram Moolenaar      vim9script
1723c970e422SBram Moolenaar
1724c970e422SBram Moolenaar      if exists('g:loaded')
1725c970e422SBram Moolenaar        finish
1726c970e422SBram Moolenaar      endif
1727c970e422SBram Moolenaar      g:loaded = 1
1728c970e422SBram Moolenaar      delcommand CallFunc
1729c970e422SBram Moolenaar      command CallFunc Func()
1730c970e422SBram Moolenaar      def Func()
1731a4c81beaSBram Moolenaar        so XreloadFunc.vim
1732c970e422SBram Moolenaar        g:didTheFunc = 1
1733c970e422SBram Moolenaar      enddef
1734c970e422SBram Moolenaar  END
1735c970e422SBram Moolenaar  writefile(lines, 'XreloadFunc.vim')
1736c970e422SBram Moolenaar  source XreloadFunc.vim
1737c970e422SBram Moolenaar  CallFunc
1738c970e422SBram Moolenaar  assert_equal(1, g:didTheFunc)
1739c970e422SBram Moolenaar
1740c970e422SBram Moolenaar  delete('XreloadFunc.vim')
1741c970e422SBram Moolenaar  delcommand CallFunc
1742c970e422SBram Moolenaar  unlet g:loaded
1743c970e422SBram Moolenaar  unlet g:didTheFunc
1744c970e422SBram Moolenaarenddef
1745c970e422SBram Moolenaar
17466c3843caSBram Moolenaardef Test_script_var_shadows_function()
17476c3843caSBram Moolenaar  var lines =<< trim END
17486c3843caSBram Moolenaar      vim9script
17496c3843caSBram Moolenaar      def Func(): number
17506c3843caSBram Moolenaar        return 123
17516c3843caSBram Moolenaar      enddef
17526c3843caSBram Moolenaar      var Func = 1
17536c3843caSBram Moolenaar  END
17546c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
17556c3843caSBram Moolenaarenddef
17566c3843caSBram Moolenaar
1757c323527dSBram Moolenaardef Test_script_var_shadows_command()
1758c323527dSBram Moolenaar  var lines =<< trim END
1759c323527dSBram Moolenaar      var undo = 1
1760c323527dSBram Moolenaar      undo = 2
1761c323527dSBram Moolenaar      assert_equal(2, undo)
1762c323527dSBram Moolenaar  END
1763c323527dSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1764c323527dSBram Moolenaar
1765c323527dSBram Moolenaar  lines =<< trim END
1766c323527dSBram Moolenaar      var undo = 1
1767c323527dSBram Moolenaar      undo
1768c323527dSBram Moolenaar  END
1769c323527dSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1207:', 2)
1770c323527dSBram Moolenaarenddef
1771c323527dSBram Moolenaar
177295006e3dSBram Moolenaardef s:RetSome(): string
177395006e3dSBram Moolenaar  return 'some'
177495006e3dSBram Moolenaarenddef
177595006e3dSBram Moolenaar
1776fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1777fe465a01SBram Moolenaar" script-local name.
1778fe465a01SBram Moolenaardef Test_vim9script_funcref()
1779cfcd011fSBram Moolenaar  var sortlines =<< trim END
1780fe465a01SBram Moolenaar      vim9script
1781fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1782bed36b93SBram Moolenaar        return i2 - i1
1783fe465a01SBram Moolenaar      enddef
1784fe465a01SBram Moolenaar
1785fe465a01SBram Moolenaar      export def FastSort(): list<number>
1786fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1787fe465a01SBram Moolenaar      enddef
1788529fb5a5SBram Moolenaar
1789529fb5a5SBram Moolenaar      export def GetString(arg: string): string
1790529fb5a5SBram Moolenaar        return arg
1791529fb5a5SBram Moolenaar      enddef
1792fe465a01SBram Moolenaar  END
1793fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1794fe465a01SBram Moolenaar
1795cfcd011fSBram Moolenaar  var lines =<< trim END
1796fe465a01SBram Moolenaar    vim9script
1797fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1798fe465a01SBram Moolenaar    def Test()
1799fe465a01SBram Moolenaar      g:result = FastSort()
1800fe465a01SBram Moolenaar    enddef
1801fe465a01SBram Moolenaar    Test()
1802529fb5a5SBram Moolenaar
1803529fb5a5SBram Moolenaar    # using a function imported with "as"
1804529fb5a5SBram Moolenaar    import * as anAlias from './Xsort.vim'
1805529fb5a5SBram Moolenaar    assert_equal('yes', anAlias.GetString('yes'))
1806529fb5a5SBram Moolenaar
1807529fb5a5SBram Moolenaar    # using the function from a compiled function
1808529fb5a5SBram Moolenaar    def TestMore(): string
1809ca51cc0aSBram Moolenaar      var s = s:anAlias.GetString('foo')
1810ca51cc0aSBram Moolenaar      return s .. anAlias.GetString('bar')
1811529fb5a5SBram Moolenaar    enddef
1812ca51cc0aSBram Moolenaar    assert_equal('foobar', TestMore())
1813529fb5a5SBram Moolenaar
1814529fb5a5SBram Moolenaar    # error when using a function that isn't exported
1815529fb5a5SBram Moolenaar    assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1816fe465a01SBram Moolenaar  END
1817fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1818fe465a01SBram Moolenaar
1819fe465a01SBram Moolenaar  source Xscript.vim
1820fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1821fe465a01SBram Moolenaar
1822fe465a01SBram Moolenaar  unlet g:result
1823fe465a01SBram Moolenaar  delete('Xsort.vim')
1824fe465a01SBram Moolenaar  delete('Xscript.vim')
182595006e3dSBram Moolenaar
1826cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
182795006e3dSBram Moolenaar  assert_equal('some', Funcref())
1828fe465a01SBram Moolenaarenddef
1829fe465a01SBram Moolenaar
1830601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1831601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1832601e76acSBram Moolenaar" function reference.
1833c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1834cfcd011fSBram Moolenaar  var filterLines =<< trim END
1835c620c055SBram Moolenaar    vim9script
1836c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1837c620c055SBram Moolenaar      return idx % 2 == 1
1838c620c055SBram Moolenaar    enddef
1839c620c055SBram Moolenaar    export def FastFilter(): list<number>
1840c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1841c620c055SBram Moolenaar    enddef
1842601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1843601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1844601e76acSBram Moolenaar    enddef
1845c620c055SBram Moolenaar  END
1846c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1847c620c055SBram Moolenaar
1848cfcd011fSBram Moolenaar  var lines =<< trim END
1849c620c055SBram Moolenaar    vim9script
1850601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1851c620c055SBram Moolenaar    def Test()
1852cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1853c620c055SBram Moolenaar    enddef
1854c620c055SBram Moolenaar    Test()
1855601e76acSBram Moolenaar    def TestDirect()
1856cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1857601e76acSBram Moolenaar    enddef
1858601e76acSBram Moolenaar    TestDirect()
1859c620c055SBram Moolenaar  END
1860601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1861c620c055SBram Moolenaar  delete('Xfilter.vim')
1862c620c055SBram Moolenaarenddef
1863c620c055SBram Moolenaar
18644c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1865cfcd011fSBram Moolenaar  var first_lines =<< trim END
18664c17ad94SBram Moolenaar    vim9script
18674c17ad94SBram Moolenaar    def FuncYes(): string
18684c17ad94SBram Moolenaar      return 'yes'
18694c17ad94SBram Moolenaar    enddef
18704c17ad94SBram Moolenaar  END
1871cfcd011fSBram Moolenaar  var withno_lines =<< trim END
18724c17ad94SBram Moolenaar    def FuncNo(): string
18734c17ad94SBram Moolenaar      return 'no'
18744c17ad94SBram Moolenaar    enddef
18754c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
18764c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
18774c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
187803afdcf1SBram Moolenaar    enddef
187903afdcf1SBram Moolenaar  END
1880cfcd011fSBram Moolenaar  var nono_lines =<< trim END
188103afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
188203afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
188344d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
18844c17ad94SBram Moolenaar    enddef
18854c17ad94SBram Moolenaar  END
18864c17ad94SBram Moolenaar
18874c17ad94SBram Moolenaar  # FuncNo() is defined
188803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
18894c17ad94SBram Moolenaar  source Xreloaded.vim
18904c17ad94SBram Moolenaar  g:DoCheck(true)
18914c17ad94SBram Moolenaar
18924c17ad94SBram Moolenaar  # FuncNo() is not redefined
189303afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
18944c17ad94SBram Moolenaar  source Xreloaded.vim
18955082471fSBram Moolenaar  g:DoCheck(false)
18964c17ad94SBram Moolenaar
18974c17ad94SBram Moolenaar  # FuncNo() is back
189803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
18994c17ad94SBram Moolenaar  source Xreloaded.vim
19005082471fSBram Moolenaar  g:DoCheck(false)
19014c17ad94SBram Moolenaar
19024c17ad94SBram Moolenaar  delete('Xreloaded.vim')
19034c17ad94SBram Moolenaarenddef
19044c17ad94SBram Moolenaar
190589483d40SBram Moolenaardef Test_vim9script_reload_delvar()
190689483d40SBram Moolenaar  # write the script with a script-local variable
1907cfcd011fSBram Moolenaar  var lines =<< trim END
190889483d40SBram Moolenaar    vim9script
1909cfcd011fSBram Moolenaar    var name = 'string'
191089483d40SBram Moolenaar  END
191189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
191289483d40SBram Moolenaar  source XreloadVar.vim
191389483d40SBram Moolenaar
191489483d40SBram Moolenaar  # now write the script using the same variable locally - works
191589483d40SBram Moolenaar  lines =<< trim END
191689483d40SBram Moolenaar    vim9script
191789483d40SBram Moolenaar    def Func()
1918cfcd011fSBram Moolenaar      var name = 'string'
191989483d40SBram Moolenaar    enddef
192089483d40SBram Moolenaar  END
192189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
192289483d40SBram Moolenaar  source XreloadVar.vim
192389483d40SBram Moolenaar
192489483d40SBram Moolenaar  delete('XreloadVar.vim')
192589483d40SBram Moolenaarenddef
192689483d40SBram Moolenaar
19278a7d6542SBram Moolenaardef Test_import_absolute()
1928cfcd011fSBram Moolenaar  var import_lines = [
1929e6085c53SBram Moolenaar        'vim9script',
1930e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1931e6085c53SBram Moolenaar        'def UseExported()',
1932e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1933e6085c53SBram Moolenaar        '  exported = 8888',
1934e6085c53SBram Moolenaar        '  g:imported_after = exported',
1935e6085c53SBram Moolenaar        'enddef',
1936e6085c53SBram Moolenaar        'UseExported()',
1937e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1938e6085c53SBram Moolenaar        ]
19398a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
19408a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
19418a7d6542SBram Moolenaar
19428a7d6542SBram Moolenaar  source Ximport_abs.vim
19438a7d6542SBram Moolenaar
19448a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
19454e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1946fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1947fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1948fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1949fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1950fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1951fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1952fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1953fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1954fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1955fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1956e6085c53SBram Moolenaar        g:import_disassembled)
1957b3ca9824SBram Moolenaar
1958b3ca9824SBram Moolenaar  Undo_export_script_lines()
19598a7d6542SBram Moolenaar  unlet g:imported_abs
19604e12a5dfSBram Moolenaar  unlet g:import_disassembled
19618a7d6542SBram Moolenaar
19628a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
19638a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
19648a7d6542SBram Moolenaarenddef
19658a7d6542SBram Moolenaar
19668a7d6542SBram Moolenaardef Test_import_rtp()
1967cfcd011fSBram Moolenaar  var import_lines = [
1968e6085c53SBram Moolenaar        'vim9script',
1969e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1970e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1971e6085c53SBram Moolenaar        ]
19728a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
1973b885a7c7SBram Moolenaar  mkdir('import', 'p')
1974b885a7c7SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
19758a7d6542SBram Moolenaar
1976cfcd011fSBram Moolenaar  var save_rtp = &rtp
19778a7d6542SBram Moolenaar  &rtp = getcwd()
19788a7d6542SBram Moolenaar  source Ximport_rtp.vim
19798a7d6542SBram Moolenaar  &rtp = save_rtp
19808a7d6542SBram Moolenaar
19818a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
19828a7d6542SBram Moolenaar
1983b3ca9824SBram Moolenaar  Undo_export_script_lines()
1984b3ca9824SBram Moolenaar  unlet g:imported_rtp
19858a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
1986b885a7c7SBram Moolenaar  delete('import', 'rf')
19878a7d6542SBram Moolenaarenddef
19888a7d6542SBram Moolenaar
198925e0f586SBram Moolenaardef Test_import_compile_error()
1990cfcd011fSBram Moolenaar  var export_lines = [
199125e0f586SBram Moolenaar        'vim9script',
199225e0f586SBram Moolenaar        'export def ExpFunc(): string',
199325e0f586SBram Moolenaar        '  return notDefined',
199425e0f586SBram Moolenaar        'enddef',
199525e0f586SBram Moolenaar        ]
199625e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
199725e0f586SBram Moolenaar
1998cfcd011fSBram Moolenaar  var import_lines = [
199925e0f586SBram Moolenaar        'vim9script',
200025e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
200125e0f586SBram Moolenaar        'def ImpFunc()',
200225e0f586SBram Moolenaar        '  echo ExpFunc()',
200325e0f586SBram Moolenaar        'enddef',
200425e0f586SBram Moolenaar        'defcompile',
200525e0f586SBram Moolenaar        ]
200625e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
200725e0f586SBram Moolenaar
200825e0f586SBram Moolenaar  try
200925e0f586SBram Moolenaar    source Ximport.vim
201025e0f586SBram Moolenaar  catch /E1001/
2011f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
20127707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
201325e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
201425e0f586SBram Moolenaar  endtry
201525e0f586SBram Moolenaar
201625e0f586SBram Moolenaar  delete('Xexported.vim')
201725e0f586SBram Moolenaar  delete('Ximport.vim')
201825e0f586SBram Moolenaarenddef
201925e0f586SBram Moolenaar
2020c4ce36d4SBram Moolenaardef Test_func_redefine_error()
2021cfcd011fSBram Moolenaar  var lines = [
2022c4ce36d4SBram Moolenaar        'vim9script',
2023c4ce36d4SBram Moolenaar        'def Func()',
2024c4ce36d4SBram Moolenaar        '  eval [][0]',
2025c4ce36d4SBram Moolenaar        'enddef',
2026c4ce36d4SBram Moolenaar        'Func()',
2027c4ce36d4SBram Moolenaar        ]
2028c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
2029c4ce36d4SBram Moolenaar
2030c4ce36d4SBram Moolenaar  for count in range(3)
2031c4ce36d4SBram Moolenaar    try
2032c4ce36d4SBram Moolenaar      source Xtestscript.vim
2033c4ce36d4SBram Moolenaar    catch /E684/
2034c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
2035c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
2036c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
2037c4ce36d4SBram Moolenaar    endtry
2038c4ce36d4SBram Moolenaar  endfor
2039c4ce36d4SBram Moolenaar
2040c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
2041c4ce36d4SBram Moolenaarenddef
2042c4ce36d4SBram Moolenaar
2043eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
2044cfcd011fSBram Moolenaar  var export_lines =<< trim END
2045eef2102eSBram Moolenaar      vim9script
2046eef2102eSBram Moolenaar      export def Func()
2047eef2102eSBram Moolenaar        echo 'imported'
2048eef2102eSBram Moolenaar      enddef
2049eef2102eSBram Moolenaar  END
2050eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
2051eef2102eSBram Moolenaar
2052cfcd011fSBram Moolenaar  var lines =<< trim END
2053eef2102eSBram Moolenaar    vim9script
2054eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2055eef2102eSBram Moolenaar    def Func()
2056eef2102eSBram Moolenaar      echo 'local to function'
2057eef2102eSBram Moolenaar    enddef
2058eef2102eSBram Moolenaar  END
2059eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2060eef2102eSBram Moolenaar
2061eef2102eSBram Moolenaar  lines =<< trim END
2062eef2102eSBram Moolenaar    vim9script
2063eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2064eef2102eSBram Moolenaar    def Outer()
2065eef2102eSBram Moolenaar      def Func()
2066eef2102eSBram Moolenaar        echo 'local to function'
2067eef2102eSBram Moolenaar      enddef
2068eef2102eSBram Moolenaar    enddef
2069eef2102eSBram Moolenaar    defcompile
2070eef2102eSBram Moolenaar  END
2071eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2072eef2102eSBram Moolenaar
2073eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
2074eef2102eSBram Moolenaarenddef
2075eef2102eSBram Moolenaar
2076b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
2077cfcd011fSBram Moolenaar  var lines =<< trim END
2078b9a2cac3SBram Moolenaar    vim9script
2079b9a2cac3SBram Moolenaar    def Func()
2080b9a2cac3SBram Moolenaar      echo 'one'
2081b9a2cac3SBram Moolenaar    enddef
2082b9a2cac3SBram Moolenaar    def Func()
2083b9a2cac3SBram Moolenaar      echo 'two'
2084b9a2cac3SBram Moolenaar    enddef
2085b9a2cac3SBram Moolenaar  END
2086b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2087fa211f3cSBram Moolenaar
2088fa211f3cSBram Moolenaar  lines =<< trim END
2089fa211f3cSBram Moolenaar    vim9script
2090fa211f3cSBram Moolenaar    def Foo(): string
2091fa211f3cSBram Moolenaar      return 'foo'
2092fa211f3cSBram Moolenaar      enddef
2093fa211f3cSBram Moolenaar    def Func()
2094cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
2095fa211f3cSBram Moolenaar    enddef
2096fa211f3cSBram Moolenaar    defcompile
2097fa211f3cSBram Moolenaar  END
2098fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2099b9a2cac3SBram Moolenaarenddef
2100b9a2cac3SBram Moolenaar
21018a7d6542SBram Moolenaardef Test_fixed_size_list()
2102f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
2103cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
21048a7d6542SBram Moolenaar  l->remove(0)
21058a7d6542SBram Moolenaar  l->add(5)
21068a7d6542SBram Moolenaar  l->insert(99, 1)
21070f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
21088a7d6542SBram Moolenaarenddef
21098a7d6542SBram Moolenaar
2110ae616494SBram Moolenaardef Test_no_insert_xit()
2111d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2112d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2113d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2114d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2115d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2116ae616494SBram Moolenaar
2117ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2118ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2119ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2120ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2121f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2122f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
21236508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
21246508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
2125f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2126f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2127f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2128ae616494SBram Moolenaarenddef
2129ae616494SBram Moolenaar
2130158906cfSBram Moolenaardef IfElse(what: number): string
2131cfcd011fSBram Moolenaar  var res = ''
2132158906cfSBram Moolenaar  if what == 1
2133158906cfSBram Moolenaar    res = "one"
2134158906cfSBram Moolenaar  elseif what == 2
2135158906cfSBram Moolenaar    res = "two"
2136a259d8d3SBram Moolenaar  else
2137158906cfSBram Moolenaar    res = "three"
2138a259d8d3SBram Moolenaar  endif
2139158906cfSBram Moolenaar  return res
2140a259d8d3SBram Moolenaarenddef
2141a259d8d3SBram Moolenaar
2142158906cfSBram Moolenaardef Test_if_elseif_else()
2143158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2144158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2145158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
21460f18b6d1SBram Moolenaarenddef
21470f18b6d1SBram Moolenaar
2148e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2149d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2150d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2151d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2152ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
2153d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
21546628b7ebSBram Moolenaar
21556628b7ebSBram Moolenaar  var lines =<< trim END
21566628b7ebSBram Moolenaar      var s = ''
21576628b7ebSBram Moolenaar      if s = ''
21586628b7ebSBram Moolenaar      endif
21596628b7ebSBram Moolenaar  END
21606628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
21616628b7ebSBram Moolenaar
21626628b7ebSBram Moolenaar  lines =<< trim END
21636628b7ebSBram Moolenaar      var s = ''
21646628b7ebSBram Moolenaar      if s == ''
21656628b7ebSBram Moolenaar      elseif s = ''
21666628b7ebSBram Moolenaar      endif
21676628b7ebSBram Moolenaar  END
21686628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2169e8c4abbbSBram Moolenaarenddef
2170e8c4abbbSBram Moolenaar
21716d69bf60SBram Moolenaarlet g:bool_true = v:true
21726d69bf60SBram Moolenaarlet g:bool_false = v:false
21736d69bf60SBram Moolenaar
21746d69bf60SBram Moolenaardef Test_if_const_expr()
2175cfcd011fSBram Moolenaar  var res = false
21766d69bf60SBram Moolenaar  if true ? true : false
21776d69bf60SBram Moolenaar    res = true
21786d69bf60SBram Moolenaar  endif
21796d69bf60SBram Moolenaar  assert_equal(true, res)
21806d69bf60SBram Moolenaar
2181585fea7bSBram Moolenaar  g:glob = 2
2182585fea7bSBram Moolenaar  if false
21836797966dSBram Moolenaar    execute('g:glob = 3')
2184585fea7bSBram Moolenaar  endif
2185585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2186585fea7bSBram Moolenaar  if true
21876797966dSBram Moolenaar    execute('g:glob = 3')
2188585fea7bSBram Moolenaar  endif
2189585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2190585fea7bSBram Moolenaar
21916d69bf60SBram Moolenaar  res = false
21926d69bf60SBram Moolenaar  if g:bool_true ? true : false
21936d69bf60SBram Moolenaar    res = true
21946d69bf60SBram Moolenaar  endif
21956d69bf60SBram Moolenaar  assert_equal(true, res)
21966d69bf60SBram Moolenaar
21976d69bf60SBram Moolenaar  res = false
21986d69bf60SBram Moolenaar  if true ? g:bool_true : false
21996d69bf60SBram Moolenaar    res = true
22006d69bf60SBram Moolenaar  endif
22016d69bf60SBram Moolenaar  assert_equal(true, res)
22026d69bf60SBram Moolenaar
22036d69bf60SBram Moolenaar  res = false
22046d69bf60SBram Moolenaar  if true ? true : g:bool_false
22056d69bf60SBram Moolenaar    res = true
22066d69bf60SBram Moolenaar  endif
22076d69bf60SBram Moolenaar  assert_equal(true, res)
22086d69bf60SBram Moolenaar
22096d69bf60SBram Moolenaar  res = false
22106d69bf60SBram Moolenaar  if true ? false : true
22116d69bf60SBram Moolenaar    res = true
22126d69bf60SBram Moolenaar  endif
22136d69bf60SBram Moolenaar  assert_equal(false, res)
22146d69bf60SBram Moolenaar
22156d69bf60SBram Moolenaar  res = false
22166d69bf60SBram Moolenaar  if false ? false : true
22176d69bf60SBram Moolenaar    res = true
22186d69bf60SBram Moolenaar  endif
22196d69bf60SBram Moolenaar  assert_equal(true, res)
22206d69bf60SBram Moolenaar
22216d69bf60SBram Moolenaar  res = false
22226d69bf60SBram Moolenaar  if false ? true : false
22236d69bf60SBram Moolenaar    res = true
22246d69bf60SBram Moolenaar  endif
22256d69bf60SBram Moolenaar  assert_equal(false, res)
22266d69bf60SBram Moolenaar
22276d69bf60SBram Moolenaar  res = false
2228e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2229e8c4abbbSBram Moolenaar    res = true
2230e8c4abbbSBram Moolenaar  endif
2231e8c4abbbSBram Moolenaar  assert_equal(false, res)
2232e8c4abbbSBram Moolenaar
2233e8c4abbbSBram Moolenaar  res = false
22346d69bf60SBram Moolenaar  if true && true
22356d69bf60SBram Moolenaar    res = true
22366d69bf60SBram Moolenaar  endif
22376d69bf60SBram Moolenaar  assert_equal(true, res)
22386d69bf60SBram Moolenaar
22396d69bf60SBram Moolenaar  res = false
22406d69bf60SBram Moolenaar  if true && false
22416d69bf60SBram Moolenaar    res = true
22426d69bf60SBram Moolenaar  endif
22436d69bf60SBram Moolenaar  assert_equal(false, res)
22446d69bf60SBram Moolenaar
22456d69bf60SBram Moolenaar  res = false
22466d69bf60SBram Moolenaar  if g:bool_true && false
22476d69bf60SBram Moolenaar    res = true
22486d69bf60SBram Moolenaar  endif
22496d69bf60SBram Moolenaar  assert_equal(false, res)
22506d69bf60SBram Moolenaar
22516d69bf60SBram Moolenaar  res = false
22526d69bf60SBram Moolenaar  if true && g:bool_false
22536d69bf60SBram Moolenaar    res = true
22546d69bf60SBram Moolenaar  endif
22556d69bf60SBram Moolenaar  assert_equal(false, res)
22566d69bf60SBram Moolenaar
22576d69bf60SBram Moolenaar  res = false
22586d69bf60SBram Moolenaar  if false && false
22596d69bf60SBram Moolenaar    res = true
22606d69bf60SBram Moolenaar  endif
22616d69bf60SBram Moolenaar  assert_equal(false, res)
22626d69bf60SBram Moolenaar
22636d69bf60SBram Moolenaar  res = false
22646d69bf60SBram Moolenaar  if true || false
22656d69bf60SBram Moolenaar    res = true
22666d69bf60SBram Moolenaar  endif
22676d69bf60SBram Moolenaar  assert_equal(true, res)
22686d69bf60SBram Moolenaar
22696d69bf60SBram Moolenaar  res = false
22706d69bf60SBram Moolenaar  if g:bool_true || false
22716d69bf60SBram Moolenaar    res = true
22726d69bf60SBram Moolenaar  endif
22736d69bf60SBram Moolenaar  assert_equal(true, res)
22746d69bf60SBram Moolenaar
22756d69bf60SBram Moolenaar  res = false
22766d69bf60SBram Moolenaar  if true || g:bool_false
22776d69bf60SBram Moolenaar    res = true
22786d69bf60SBram Moolenaar  endif
22796d69bf60SBram Moolenaar  assert_equal(true, res)
22806d69bf60SBram Moolenaar
22816d69bf60SBram Moolenaar  res = false
22826d69bf60SBram Moolenaar  if false || false
22836d69bf60SBram Moolenaar    res = true
22846d69bf60SBram Moolenaar  endif
22856d69bf60SBram Moolenaar  assert_equal(false, res)
22863988f64fSBram Moolenaar
22873988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
2288c323527dSBram Moolenaar  if false | eval 1 + 2 | endif
22893988f64fSBram Moolenaar  if false | eval burp + 234 | endif
22903988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
22913988f64fSBram Moolenaar  if false
22923988f64fSBram Moolenaar    burp
22933988f64fSBram Moolenaar  endif
229480c34ca3SBram Moolenaarenddef
22956d69bf60SBram Moolenaar
229680c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2297d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2298d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2299d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2300d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
23016d69bf60SBram Moolenaarenddef
23026d69bf60SBram Moolenaar
230372abcf42SBram Moolenaardef RunNested(i: number): number
2304cfcd011fSBram Moolenaar  var x: number = 0
230572abcf42SBram Moolenaar  if i % 2
230672abcf42SBram Moolenaar    if 1
2307f5be8cdbSBram Moolenaar      # comment
230872abcf42SBram Moolenaar    else
2309f5be8cdbSBram Moolenaar      # comment
231072abcf42SBram Moolenaar    endif
231172abcf42SBram Moolenaar    x += 1
231272abcf42SBram Moolenaar  else
231372abcf42SBram Moolenaar    x += 1000
231472abcf42SBram Moolenaar  endif
231572abcf42SBram Moolenaar  return x
231672abcf42SBram Moolenaarenddef
231772abcf42SBram Moolenaar
231872abcf42SBram Moolenaardef Test_nested_if()
231972abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
232072abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
232172abcf42SBram Moolenaarenddef
232272abcf42SBram Moolenaar
2323ad39c094SBram Moolenaardef Test_execute_cmd()
2324e4984290SBram Moolenaar  # missing argument is ignored
2325e4984290SBram Moolenaar  execute
2326e4984290SBram Moolenaar  execute # comment
2327e4984290SBram Moolenaar
2328ad39c094SBram Moolenaar  new
2329ad39c094SBram Moolenaar  setline(1, 'default')
2330d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2331ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2332a72cfb80SBram Moolenaar
2333d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2334a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2335a72cfb80SBram Moolenaar
2336cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2337cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2338a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2339ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2340a72cfb80SBram Moolenaar
2341d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2342ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2343a72cfb80SBram Moolenaar
2344cfcd011fSBram Moolenaar  var cmd_first = 'call '
2345cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2346ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2347ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2348ad39c094SBram Moolenaar  bwipe!
2349585fea7bSBram Moolenaar
2350cfcd011fSBram Moolenaar  var n = true
23512d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
23522d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
23532d6b20d6SBram Moolenaar
2354e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2355e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2356e5abf7afSBram Moolenaar
2357d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2358d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2359d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2360ad39c094SBram Moolenaarenddef
2361ad39c094SBram Moolenaar
236247e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2363f5be8cdbSBram Moolenaar  # only checks line continuation
2364cfcd011fSBram Moolenaar  var lines =<< trim END
236547e880d6SBram Moolenaar      vim9script
236647e880d6SBram Moolenaar      execute 'g:someVar'
236747e880d6SBram Moolenaar                .. ' = ' ..
236847e880d6SBram Moolenaar                   '28'
236947e880d6SBram Moolenaar      assert_equal(28, g:someVar)
237047e880d6SBram Moolenaar      unlet g:someVar
237147e880d6SBram Moolenaar  END
237247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
237347e880d6SBram Moolenaarenddef
237447e880d6SBram Moolenaar
2375ad39c094SBram Moolenaardef Test_echo_cmd()
2376a72cfb80SBram Moolenaar  echo 'some' # comment
2377585fea7bSBram Moolenaar  echon 'thing'
2378ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2379ad39c094SBram Moolenaar
2380a72cfb80SBram Moolenaar  echo "some" # comment
2381a72cfb80SBram Moolenaar  echon "thing"
2382a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2383a72cfb80SBram Moolenaar
2384cfcd011fSBram Moolenaar  var str1 = 'some'
2385cfcd011fSBram Moolenaar  var str2 = 'more'
2386ad39c094SBram Moolenaar  echo str1 str2
2387ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2388a72cfb80SBram Moolenaar
2389d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2390ad39c094SBram Moolenaarenddef
2391ad39c094SBram Moolenaar
2392f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2393f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2394f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2395f93c7feaSBram Moolenaar  echo 'clear'
2396df069eecSBram Moolenaar  :1messages
2397f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2398f93c7feaSBram Moolenaar
2399d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2400f93c7feaSBram Moolenaarenddef
2401f93c7feaSBram Moolenaar
240247e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2403f5be8cdbSBram Moolenaar  # only checks line continuation
2404cfcd011fSBram Moolenaar  var lines =<< trim END
240547e880d6SBram Moolenaar      vim9script
240647e880d6SBram Moolenaar      echomsg 'here'
240747e880d6SBram Moolenaar                .. ' is ' ..
240847e880d6SBram Moolenaar                   'a message'
240947e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
241047e880d6SBram Moolenaar  END
241147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
241247e880d6SBram Moolenaarenddef
241347e880d6SBram Moolenaar
2414f93c7feaSBram Moolenaardef Test_echoerr_cmd()
241540ee466cSBram Moolenaar  try
241640ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
241740ee466cSBram Moolenaar  catch
241840ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
241940ee466cSBram Moolenaar  endtry
2420f93c7feaSBram Moolenaarenddef
2421f93c7feaSBram Moolenaar
242247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2423f5be8cdbSBram Moolenaar  # only checks line continuation
2424cfcd011fSBram Moolenaar  var lines =<< trim END
242547e880d6SBram Moolenaar      vim9script
242647e880d6SBram Moolenaar      try
242747e880d6SBram Moolenaar        echoerr 'this'
242847e880d6SBram Moolenaar                .. ' is ' ..
242947e880d6SBram Moolenaar                   'wrong'
243047e880d6SBram Moolenaar      catch
243147e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
243247e880d6SBram Moolenaar      endtry
243347e880d6SBram Moolenaar  END
243447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
243547e880d6SBram Moolenaarenddef
243647e880d6SBram Moolenaar
243741fe0617SBram Moolenaardef Test_for_outside_of_function()
2438cfcd011fSBram Moolenaar  var lines =<< trim END
243941fe0617SBram Moolenaar    vim9script
244041fe0617SBram Moolenaar    new
244141fe0617SBram Moolenaar    for var in range(0, 3)
244241fe0617SBram Moolenaar      append(line('$'), var)
244341fe0617SBram Moolenaar    endfor
244441fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
244541fe0617SBram Moolenaar    bwipe!
2446522eefd9SBram Moolenaar
2447522eefd9SBram Moolenaar    var result = ''
2448522eefd9SBram Moolenaar    for i in [1, 2, 3]
2449522eefd9SBram Moolenaar      var loop = ' loop ' .. i
2450522eefd9SBram Moolenaar      result ..= loop
2451522eefd9SBram Moolenaar    endfor
2452522eefd9SBram Moolenaar    assert_equal(' loop 1 loop 2 loop 3', result)
245341fe0617SBram Moolenaar  END
245441fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
245541fe0617SBram Moolenaar  source Xvim9for.vim
245641fe0617SBram Moolenaar  delete('Xvim9for.vim')
245741fe0617SBram Moolenaarenddef
24588a7d6542SBram Moolenaar
2459e8c4abbbSBram Moolenaardef Test_for_loop()
2460f2253963SBram Moolenaar  var lines =<< trim END
2461cfcd011fSBram Moolenaar      var result = ''
2462e8c4abbbSBram Moolenaar      for cnt in range(7)
2463e8c4abbbSBram Moolenaar        if cnt == 4
2464e8c4abbbSBram Moolenaar          break
2465e8c4abbbSBram Moolenaar        endif
2466e8c4abbbSBram Moolenaar        if cnt == 2
2467e8c4abbbSBram Moolenaar          continue
2468e8c4abbbSBram Moolenaar        endif
2469e8c4abbbSBram Moolenaar        result ..= cnt .. '_'
2470e8c4abbbSBram Moolenaar      endfor
2471e8c4abbbSBram Moolenaar      assert_equal('0_1_3_', result)
24720ad3e894SBram Moolenaar
2473cfcd011fSBram Moolenaar      var concat = ''
24740ad3e894SBram Moolenaar      for str in eval('["one", "two"]')
24750ad3e894SBram Moolenaar        concat ..= str
24760ad3e894SBram Moolenaar      endfor
24770ad3e894SBram Moolenaar      assert_equal('onetwo', concat)
247838bd8de5SBram Moolenaar
247938bd8de5SBram Moolenaar      var total = 0
248038bd8de5SBram Moolenaar      for nr in
248138bd8de5SBram Moolenaar          [1, 2, 3]
248238bd8de5SBram Moolenaar        total += nr
248338bd8de5SBram Moolenaar      endfor
248438bd8de5SBram Moolenaar      assert_equal(6, total)
248538bd8de5SBram Moolenaar
248638bd8de5SBram Moolenaar      total = 0
248738bd8de5SBram Moolenaar      for nr
248838bd8de5SBram Moolenaar        in [1, 2, 3]
248938bd8de5SBram Moolenaar        total += nr
249038bd8de5SBram Moolenaar      endfor
249138bd8de5SBram Moolenaar      assert_equal(6, total)
249238bd8de5SBram Moolenaar
249338bd8de5SBram Moolenaar      total = 0
249438bd8de5SBram Moolenaar      for nr
249538bd8de5SBram Moolenaar        in
249638bd8de5SBram Moolenaar        [1, 2, 3]
249738bd8de5SBram Moolenaar        total += nr
249838bd8de5SBram Moolenaar      endfor
249938bd8de5SBram Moolenaar      assert_equal(6, total)
2500036d0714SBram Moolenaar
2501a3589a0dSBram Moolenaar      # with type
2502a3589a0dSBram Moolenaar      total = 0
2503a3589a0dSBram Moolenaar      for n: number in [1, 2, 3]
2504a3589a0dSBram Moolenaar        total += n
2505a3589a0dSBram Moolenaar      endfor
2506a3589a0dSBram Moolenaar      assert_equal(6, total)
2507a3589a0dSBram Moolenaar
2508fe090eb5SBram Moolenaar      var chars = ''
2509fe090eb5SBram Moolenaar      for s: string in 'foobar'
2510fe090eb5SBram Moolenaar        chars ..= s
2511fe090eb5SBram Moolenaar      endfor
2512fe090eb5SBram Moolenaar      assert_equal('foobar', chars)
2513fe090eb5SBram Moolenaar
25145ede5b23SBram Moolenaar      chars = ''
25155ede5b23SBram Moolenaar      for x: string in {a: 'a', b: 'b'}->values()
25165ede5b23SBram Moolenaar        chars ..= x
25175ede5b23SBram Moolenaar      endfor
25185ede5b23SBram Moolenaar      assert_equal('ab', chars)
25195ede5b23SBram Moolenaar
2520a3589a0dSBram Moolenaar      # unpack with type
2521f2253963SBram Moolenaar      var res = ''
2522a3589a0dSBram Moolenaar      for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2523a3589a0dSBram Moolenaar        res ..= n .. s
2524a3589a0dSBram Moolenaar      endfor
2525a3589a0dSBram Moolenaar      assert_equal('1a2b', res)
2526a3589a0dSBram Moolenaar
2527444d8783SBram Moolenaar      # unpack with one var
2528444d8783SBram Moolenaar      var reslist = []
2529444d8783SBram Moolenaar      for [x] in [['aaa'], ['bbb']]
2530444d8783SBram Moolenaar        reslist->add(x)
2531444d8783SBram Moolenaar      endfor
2532444d8783SBram Moolenaar      assert_equal(['aaa', 'bbb'], reslist)
2533444d8783SBram Moolenaar
2534a3589a0dSBram Moolenaar      # loop over string
2535a3589a0dSBram Moolenaar      res = ''
253674e54fcbSBram Moolenaar      for c in 'aéc̀d'
253774e54fcbSBram Moolenaar        res ..= c .. '-'
253874e54fcbSBram Moolenaar      endfor
253974e54fcbSBram Moolenaar      assert_equal('a-é-c̀-d-', res)
254074e54fcbSBram Moolenaar
254174e54fcbSBram Moolenaar      res = ''
254274e54fcbSBram Moolenaar      for c in ''
254374e54fcbSBram Moolenaar        res ..= c .. '-'
254474e54fcbSBram Moolenaar      endfor
254574e54fcbSBram Moolenaar      assert_equal('', res)
254674e54fcbSBram Moolenaar
254774e54fcbSBram Moolenaar      res = ''
254874e54fcbSBram Moolenaar      for c in test_null_string()
254974e54fcbSBram Moolenaar        res ..= c .. '-'
255074e54fcbSBram Moolenaar      endfor
255174e54fcbSBram Moolenaar      assert_equal('', res)
2552f2253963SBram Moolenaar
2553f2253963SBram Moolenaar      var foo: list<dict<any>> = [
2554f2253963SBram Moolenaar              {a: 'Cat'}
2555f2253963SBram Moolenaar            ]
2556f2253963SBram Moolenaar      for dd in foo
2557f2253963SBram Moolenaar        dd.counter = 12
2558f2253963SBram Moolenaar      endfor
2559f2253963SBram Moolenaar      assert_equal([{a: 'Cat', counter: 12}], foo)
2560*ad2d4969SBram Moolenaar
2561*ad2d4969SBram Moolenaar      reslist = []
2562*ad2d4969SBram Moolenaar      for _ in range(3)
2563*ad2d4969SBram Moolenaar        reslist->add('x')
2564*ad2d4969SBram Moolenaar      endfor
2565*ad2d4969SBram Moolenaar      assert_equal(['x', 'x', 'x'], reslist)
2566f2253963SBram Moolenaar  END
2567f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2568e8c4abbbSBram Moolenaarenddef
2569e8c4abbbSBram Moolenaar
2570e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2571442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:')
2572442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:')
2573442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:')
2574442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2575442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2576442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:')
2577d4ab807dSBram Moolenaar  CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2578822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
25792d870f8dSBram Moolenaar  delfunc! g:Func
2580675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2581675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2582675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
258374e54fcbSBram Moolenaar
258474e54fcbSBram Moolenaar  # wrong type detected at compile time
258574e54fcbSBram Moolenaar  CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
258674e54fcbSBram Moolenaar
258774e54fcbSBram Moolenaar  # wrong type detected at runtime
258874e54fcbSBram Moolenaar  g:adict = {a: 1}
258974e54fcbSBram Moolenaar  CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
259074e54fcbSBram Moolenaar  unlet g:adict
2591f6a8d420SBram Moolenaar
2592f6a8d420SBram Moolenaar  var lines =<< trim END
2593f6a8d420SBram Moolenaar      var d: list<dict<any>> = [{a: 0}]
2594f6a8d420SBram Moolenaar      for e in d
2595f6a8d420SBram Moolenaar        e = {a: 0, b: ''}
2596f6a8d420SBram Moolenaar      endfor
2597f6a8d420SBram Moolenaar  END
2598f6a8d420SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3)
2599fe090eb5SBram Moolenaar
2600fe090eb5SBram Moolenaar  lines =<< trim END
2601fe090eb5SBram Moolenaar      for nr: number in ['foo']
2602fe090eb5SBram Moolenaar      endfor
2603fe090eb5SBram Moolenaar  END
2604fe090eb5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2605404557e6SBram Moolenaar
2606404557e6SBram Moolenaar  lines =<< trim END
2607404557e6SBram Moolenaar      for n : number in [1, 2]
2608404557e6SBram Moolenaar        echo n
2609404557e6SBram Moolenaar      endfor
2610404557e6SBram Moolenaar  END
2611404557e6SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1059:', 1)
2612efc5db52SBram Moolenaar
2613efc5db52SBram Moolenaar  lines =<< trim END
2614efc5db52SBram Moolenaar      var d: dict<number> = {a: 1, b: 2}
2615efc5db52SBram Moolenaar      for [k: job, v: job] in d->items()
2616efc5db52SBram Moolenaar        echo k v
2617efc5db52SBram Moolenaar      endfor
2618efc5db52SBram Moolenaar  END
2619efc5db52SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2)
2620e8c4abbbSBram Moolenaarenddef
2621e8c4abbbSBram Moolenaar
2622ea87069dSBram Moolenaardef Test_for_loop_script_var()
2623ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2624ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2625ea87069dSBram Moolenaar
2626ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2627ea87069dSBram Moolenaar  var lines =<< trim END
2628ea87069dSBram Moolenaar    vim9script
2629ea87069dSBram Moolenaar    var total = 0
2630ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2631ea87069dSBram Moolenaar      total += s:var
2632ea87069dSBram Moolenaar    endfor
2633ea87069dSBram Moolenaar    assert_equal(6, total)
2634ea87069dSBram Moolenaar
2635ea87069dSBram Moolenaar    total = 0
2636ea87069dSBram Moolenaar    for var in [1, 2, 3]
2637ea87069dSBram Moolenaar      total += var
2638ea87069dSBram Moolenaar    endfor
2639ea87069dSBram Moolenaar    assert_equal(6, total)
2640ea87069dSBram Moolenaar  END
2641ea87069dSBram Moolenaarenddef
2642ea87069dSBram Moolenaar
2643792f786aSBram Moolenaardef Test_for_loop_unpack()
26444b8a0651SBram Moolenaar  var lines =<< trim END
2645792f786aSBram Moolenaar      var result = []
2646792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2647792f786aSBram Moolenaar        result->add(v1)
2648792f786aSBram Moolenaar        result->add(v2)
2649792f786aSBram Moolenaar      endfor
2650792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2651792f786aSBram Moolenaar
2652792f786aSBram Moolenaar      result = []
2653792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2654792f786aSBram Moolenaar        result->add(v1)
2655792f786aSBram Moolenaar        result->add(v2)
2656792f786aSBram Moolenaar        result->add(v3)
2657792f786aSBram Moolenaar      endfor
2658792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2659792f786aSBram Moolenaar
26604b8a0651SBram Moolenaar      result = []
26614b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
26624b8a0651SBram Moolenaar        result->add(&ts)
26634b8a0651SBram Moolenaar        result->add(&sw)
26644b8a0651SBram Moolenaar      endfor
26654b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
26664b8a0651SBram Moolenaar
26674b8a0651SBram Moolenaar      var slist: list<string>
26684b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
26694b8a0651SBram Moolenaar        slist->add($LOOPVAR)
26704b8a0651SBram Moolenaar        slist->add(@r)
26714b8a0651SBram Moolenaar        slist->add(v:errmsg)
26724b8a0651SBram Moolenaar      endfor
26734b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
26744b8a0651SBram Moolenaar
26754b8a0651SBram Moolenaar      slist = []
26764b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
26774b8a0651SBram Moolenaar        slist->add(g:globalvar)
26784b8a0651SBram Moolenaar        slist->add(b:bufvar)
26794b8a0651SBram Moolenaar        slist->add(w:winvar)
26804b8a0651SBram Moolenaar        slist->add(t:tabvar)
26814b8a0651SBram Moolenaar      endfor
26824b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2683f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
2684b777da9bSBram Moolenaar
2685b777da9bSBram Moolenaar      var res = []
2686b777da9bSBram Moolenaar      for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2687b777da9bSBram Moolenaar        res->add(n)
2688b777da9bSBram Moolenaar      endfor
2689b777da9bSBram Moolenaar      assert_equal([2, 5], res)
26904b8a0651SBram Moolenaar  END
26914b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
26924b8a0651SBram Moolenaar
26934b8a0651SBram Moolenaar  lines =<< trim END
2694792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2695792f786aSBram Moolenaar        echo v1 v2
2696792f786aSBram Moolenaar      endfor
2697792f786aSBram Moolenaar  END
2698792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2699792f786aSBram Moolenaar
2700792f786aSBram Moolenaar  lines =<< trim END
2701792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2702792f786aSBram Moolenaar        echo v1 v2
2703792f786aSBram Moolenaar      endfor
2704792f786aSBram Moolenaar  END
2705792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2706792f786aSBram Moolenaar
2707792f786aSBram Moolenaar  lines =<< trim END
2708792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2709792f786aSBram Moolenaar        echo v1
2710792f786aSBram Moolenaar      endfor
2711792f786aSBram Moolenaar  END
2712792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2713792f786aSBram Moolenaarenddef
2714792f786aSBram Moolenaar
2715c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2716f2253963SBram Moolenaar  var lines =<< trim END
2717c150c09eSBram Moolenaar      var looped = 0
2718c150c09eSBram Moolenaar      var cleanup = 0
2719c150c09eSBram Moolenaar      for i in range(3)
2720c150c09eSBram Moolenaar        looped += 1
2721c150c09eSBram Moolenaar        try
2722c150c09eSBram Moolenaar          eval [][0]
2723c150c09eSBram Moolenaar        catch
2724c150c09eSBram Moolenaar          continue
2725c150c09eSBram Moolenaar        finally
2726c150c09eSBram Moolenaar          cleanup += 1
2727c150c09eSBram Moolenaar        endtry
2728c150c09eSBram Moolenaar      endfor
2729c150c09eSBram Moolenaar      assert_equal(3, looped)
2730c150c09eSBram Moolenaar      assert_equal(3, cleanup)
2731f2253963SBram Moolenaar  END
2732f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2733c150c09eSBram Moolenaarenddef
2734c150c09eSBram Moolenaar
2735d0df1aacSBram Moolenaardef Test_while_loop()
2736cfcd011fSBram Moolenaar  var result = ''
2737cfcd011fSBram Moolenaar  var cnt = 0
2738d0df1aacSBram Moolenaar  while cnt < 555
2739d0df1aacSBram Moolenaar    if cnt == 3
2740d0df1aacSBram Moolenaar      break
2741d0df1aacSBram Moolenaar    endif
2742d0df1aacSBram Moolenaar    cnt += 1
2743d0df1aacSBram Moolenaar    if cnt == 2
2744d0df1aacSBram Moolenaar      continue
2745d0df1aacSBram Moolenaar    endif
2746d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2747d0df1aacSBram Moolenaar  endwhile
2748d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2749dee37dc7SBram Moolenaar
2750dee37dc7SBram Moolenaar  var s = ''
27510123cc1eSBram Moolenaar  while s == 'x' # {comment}
2752dee37dc7SBram Moolenaar  endwhile
2753d0df1aacSBram Moolenaarenddef
2754d0df1aacSBram Moolenaar
2755e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2756675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2757675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2758675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2759675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2760675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2761675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2762675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
27636628b7ebSBram Moolenaar
27646628b7ebSBram Moolenaar  var lines =<< trim END
27656628b7ebSBram Moolenaar      var s = ''
27666628b7ebSBram Moolenaar      while s = ''
27676628b7ebSBram Moolenaar      endwhile
27686628b7ebSBram Moolenaar  END
27696628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2770bd5da371SBram Moolenaarenddef
2771bd5da371SBram Moolenaar
27729645e2d9SBram Moolenaardef Test_interrupt_loop()
2773cfcd011fSBram Moolenaar  var caught = false
2774cfcd011fSBram Moolenaar  var x = 0
277597acfc78SBram Moolenaar  try
27769645e2d9SBram Moolenaar    while 1
27779645e2d9SBram Moolenaar      x += 1
27789645e2d9SBram Moolenaar      if x == 100
27799645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
27809645e2d9SBram Moolenaar      endif
27819645e2d9SBram Moolenaar    endwhile
278297acfc78SBram Moolenaar  catch
278397acfc78SBram Moolenaar    caught = true
278497acfc78SBram Moolenaar    assert_equal(100, x)
278597acfc78SBram Moolenaar  endtry
278697acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
278725859dd7SBram Moolenaar  # consume the CTRL-C
278825859dd7SBram Moolenaar  getchar(0)
27899645e2d9SBram Moolenaarenddef
279020431c9dSBram Moolenaar
27914fdae999SBram Moolenaardef Test_automatic_line_continuation()
2792cfcd011fSBram Moolenaar  var mylist = [
27934fdae999SBram Moolenaar      'one',
27944fdae999SBram Moolenaar      'two',
27954fdae999SBram Moolenaar      'three',
2796f5be8cdbSBram Moolenaar      ] # comment
27974fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
27984fdae999SBram Moolenaar
2799cfcd011fSBram Moolenaar  var mydict = {
2800e0de171eSBram Moolenaar      ['one']: 1,
2801e0de171eSBram Moolenaar      ['two']: 2,
2802e0de171eSBram Moolenaar      ['three']:
28034fdae999SBram Moolenaar          3,
2804f5be8cdbSBram Moolenaar      } # comment
2805e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2806e0de171eSBram Moolenaar  mydict = {
28072c330432SBram Moolenaar      one: 1,  # comment
28082c330432SBram Moolenaar      two:     # comment
28092c330432SBram Moolenaar           2,  # comment
28102c330432SBram Moolenaar      three: 3 # comment
28112c330432SBram Moolenaar      }
2812e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2813e0de171eSBram Moolenaar  mydict = {
28142c330432SBram Moolenaar      one: 1,
28154fdae999SBram Moolenaar      two:
28164fdae999SBram Moolenaar           2,
28172c330432SBram Moolenaar      three: 3
28184fdae999SBram Moolenaar      }
2819e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2820e6085c53SBram Moolenaar
2821e6085c53SBram Moolenaar  assert_equal(
2822e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2823e6085c53SBram Moolenaar        split('one two three')
2824e6085c53SBram Moolenaar        )
28254fdae999SBram Moolenaarenddef
28264fdae999SBram Moolenaar
28277a092245SBram Moolenaardef Test_vim9_comment()
28287a092245SBram Moolenaar  CheckScriptSuccess([
28297a092245SBram Moolenaar      'vim9script',
28307a092245SBram Moolenaar      '# something',
283193f82cbeSBram Moolenaar      '#something',
283293f82cbeSBram Moolenaar      '#{something',
28337a092245SBram Moolenaar      ])
283493f82cbeSBram Moolenaar
283593f82cbeSBram Moolenaar  split Xfile
283693f82cbeSBram Moolenaar  CheckScriptSuccess([
283793f82cbeSBram Moolenaar      'vim9script',
283893f82cbeSBram Moolenaar      'edit #something',
283993f82cbeSBram Moolenaar      ])
284093f82cbeSBram Moolenaar  CheckScriptSuccess([
284193f82cbeSBram Moolenaar      'vim9script',
284293f82cbeSBram Moolenaar      'edit #{something',
284393f82cbeSBram Moolenaar      ])
284493f82cbeSBram Moolenaar  close
284593f82cbeSBram Moolenaar
28467a092245SBram Moolenaar  CheckScriptFailure([
28477a092245SBram Moolenaar      'vim9script',
28487a092245SBram Moolenaar      ':# something',
28497a092245SBram Moolenaar      ], 'E488:')
28507a092245SBram Moolenaar  CheckScriptFailure([
28517a092245SBram Moolenaar      '# something',
28527a092245SBram Moolenaar      ], 'E488:')
28537a092245SBram Moolenaar  CheckScriptFailure([
28547a092245SBram Moolenaar      ':# something',
28557a092245SBram Moolenaar      ], 'E488:')
28567a092245SBram Moolenaar
28574a8d9f2eSBram Moolenaar  { # block start
28584a8d9f2eSBram Moolenaar  } # block end
28594a8d9f2eSBram Moolenaar  CheckDefFailure([
28604a8d9f2eSBram Moolenaar      '{# comment',
28614a8d9f2eSBram Moolenaar      ], 'E488:')
28624a8d9f2eSBram Moolenaar  CheckDefFailure([
28634a8d9f2eSBram Moolenaar      '{',
28644a8d9f2eSBram Moolenaar      '}# comment',
28654a8d9f2eSBram Moolenaar      ], 'E488:')
28664a8d9f2eSBram Moolenaar
28674a8d9f2eSBram Moolenaar  echo "yes" # comment
28684a8d9f2eSBram Moolenaar  CheckDefFailure([
28694a8d9f2eSBram Moolenaar      'echo "yes"# comment',
28704a8d9f2eSBram Moolenaar      ], 'E488:')
28717a092245SBram Moolenaar  CheckScriptSuccess([
28727a092245SBram Moolenaar      'vim9script',
28737a092245SBram Moolenaar      'echo "yes" # something',
28747a092245SBram Moolenaar      ])
28757a092245SBram Moolenaar  CheckScriptFailure([
28767a092245SBram Moolenaar      'vim9script',
28777a092245SBram Moolenaar      'echo "yes"# something',
28787a092245SBram Moolenaar      ], 'E121:')
28797a092245SBram Moolenaar  CheckScriptFailure([
28807a092245SBram Moolenaar      'vim9script',
28817a092245SBram Moolenaar      'echo# something',
2882f8103f27SBram Moolenaar      ], 'E1144:')
28837a092245SBram Moolenaar  CheckScriptFailure([
28847a092245SBram Moolenaar      'echo "yes" # something',
28857a092245SBram Moolenaar      ], 'E121:')
28867a092245SBram Moolenaar
28874a8d9f2eSBram Moolenaar  exe "echo" # comment
28884a8d9f2eSBram Moolenaar  CheckDefFailure([
28894a8d9f2eSBram Moolenaar      'exe "echo"# comment',
28904a8d9f2eSBram Moolenaar      ], 'E488:')
28914a8d9f2eSBram Moolenaar  CheckScriptSuccess([
28924a8d9f2eSBram Moolenaar      'vim9script',
28934a8d9f2eSBram Moolenaar      'exe "echo" # something',
28944a8d9f2eSBram Moolenaar      ])
28954a8d9f2eSBram Moolenaar  CheckScriptFailure([
28964a8d9f2eSBram Moolenaar      'vim9script',
28974a8d9f2eSBram Moolenaar      'exe "echo"# something',
28984a8d9f2eSBram Moolenaar      ], 'E121:')
28994a8d9f2eSBram Moolenaar  CheckScriptFailure([
29004a8d9f2eSBram Moolenaar      'vim9script',
29014a8d9f2eSBram Moolenaar      'exe# something',
2902f8103f27SBram Moolenaar      ], 'E1144:')
29034a8d9f2eSBram Moolenaar  CheckScriptFailure([
29044a8d9f2eSBram Moolenaar      'exe "echo" # something',
29054a8d9f2eSBram Moolenaar      ], 'E121:')
29064a8d9f2eSBram Moolenaar
29077a092245SBram Moolenaar  CheckDefFailure([
29087a092245SBram Moolenaar      'try# comment',
29097a092245SBram Moolenaar      '  echo "yes"',
29107a092245SBram Moolenaar      'catch',
29117a092245SBram Moolenaar      'endtry',
2912f8103f27SBram Moolenaar      ], 'E1144:')
29132c5ed4e3SBram Moolenaar  CheckScriptFailure([
29142c5ed4e3SBram Moolenaar      'vim9script',
29152c5ed4e3SBram Moolenaar      'try# comment',
29162c5ed4e3SBram Moolenaar      'echo "yes"',
2917f8103f27SBram Moolenaar      ], 'E1144:')
29187a092245SBram Moolenaar  CheckDefFailure([
29197a092245SBram Moolenaar      'try',
2920a72cfb80SBram Moolenaar      '  throw#comment',
2921a72cfb80SBram Moolenaar      'catch',
2922a72cfb80SBram Moolenaar      'endtry',
2923f8103f27SBram Moolenaar      ], 'E1144:')
2924a72cfb80SBram Moolenaar  CheckDefFailure([
2925a72cfb80SBram Moolenaar      'try',
2926a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2927a72cfb80SBram Moolenaar      'catch',
2928a72cfb80SBram Moolenaar      'endtry',
2929a72cfb80SBram Moolenaar      ], 'E488:')
2930a72cfb80SBram Moolenaar  CheckDefFailure([
2931a72cfb80SBram Moolenaar      'try',
29327a092245SBram Moolenaar      '  echo "yes"',
29337a092245SBram Moolenaar      'catch# comment',
29347a092245SBram Moolenaar      'endtry',
2935f8103f27SBram Moolenaar      ], 'E1144:')
29362c5ed4e3SBram Moolenaar  CheckScriptFailure([
29372c5ed4e3SBram Moolenaar      'vim9script',
29382c5ed4e3SBram Moolenaar      'try',
29392c5ed4e3SBram Moolenaar      '  echo "yes"',
29402c5ed4e3SBram Moolenaar      'catch# comment',
29412c5ed4e3SBram Moolenaar      'endtry',
2942f8103f27SBram Moolenaar      ], 'E1144:')
29432c5ed4e3SBram Moolenaar  CheckDefFailure([
29442c5ed4e3SBram Moolenaar      'try',
29452c5ed4e3SBram Moolenaar      '  echo "yes"',
29462c5ed4e3SBram Moolenaar      'catch /pat/# comment',
29472c5ed4e3SBram Moolenaar      'endtry',
29482c5ed4e3SBram Moolenaar      ], 'E488:')
29497a092245SBram Moolenaar  CheckDefFailure([
29507a092245SBram Moolenaar      'try',
29517a092245SBram Moolenaar      'echo "yes"',
29527a092245SBram Moolenaar      'catch',
29537a092245SBram Moolenaar      'endtry# comment',
2954f8103f27SBram Moolenaar      ], 'E1144:')
29552c5ed4e3SBram Moolenaar  CheckScriptFailure([
29562c5ed4e3SBram Moolenaar      'vim9script',
29572c5ed4e3SBram Moolenaar      'try',
29582c5ed4e3SBram Moolenaar      '  echo "yes"',
29592c5ed4e3SBram Moolenaar      'catch',
29602c5ed4e3SBram Moolenaar      'endtry# comment',
2961f8103f27SBram Moolenaar      ], 'E1144:')
29622c5ed4e3SBram Moolenaar
29632c5ed4e3SBram Moolenaar  CheckScriptSuccess([
29642c5ed4e3SBram Moolenaar      'vim9script',
29652c5ed4e3SBram Moolenaar      'hi # comment',
29662c5ed4e3SBram Moolenaar      ])
29672c5ed4e3SBram Moolenaar  CheckScriptFailure([
29682c5ed4e3SBram Moolenaar      'vim9script',
29692c5ed4e3SBram Moolenaar      'hi# comment',
2970f8103f27SBram Moolenaar      ], 'E1144:')
29711966c248SBram Moolenaar  CheckScriptSuccess([
29721966c248SBram Moolenaar      'vim9script',
29731966c248SBram Moolenaar      'hi Search # comment',
29741966c248SBram Moolenaar      ])
29751966c248SBram Moolenaar  CheckScriptFailure([
29761966c248SBram Moolenaar      'vim9script',
29771966c248SBram Moolenaar      'hi Search# comment',
29781966c248SBram Moolenaar      ], 'E416:')
29791966c248SBram Moolenaar  CheckScriptSuccess([
29801966c248SBram Moolenaar      'vim9script',
29811966c248SBram Moolenaar      'hi link This Search # comment',
29821966c248SBram Moolenaar      ])
29831966c248SBram Moolenaar  CheckScriptFailure([
29841966c248SBram Moolenaar      'vim9script',
29851966c248SBram Moolenaar      'hi link This That# comment',
29861966c248SBram Moolenaar      ], 'E413:')
29871966c248SBram Moolenaar  CheckScriptSuccess([
29881966c248SBram Moolenaar      'vim9script',
29891966c248SBram Moolenaar      'hi clear This # comment',
29901966c248SBram Moolenaar      'hi clear # comment',
29911966c248SBram Moolenaar      ])
2992f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2993f5be8cdbSBram Moolenaar  # hi clear This# comment',
29941966c248SBram Moolenaar  CheckScriptFailure([
29951966c248SBram Moolenaar      'vim9script',
29961966c248SBram Moolenaar      'hi clear# comment',
29971966c248SBram Moolenaar      ], 'E416:')
29981966c248SBram Moolenaar
29991966c248SBram Moolenaar  CheckScriptSuccess([
30001966c248SBram Moolenaar      'vim9script',
30011966c248SBram Moolenaar      'hi Group term=bold',
30021966c248SBram Moolenaar      'match Group /todo/ # comment',
30031966c248SBram Moolenaar      ])
30041966c248SBram Moolenaar  CheckScriptFailure([
30051966c248SBram Moolenaar      'vim9script',
30061966c248SBram Moolenaar      'hi Group term=bold',
30071966c248SBram Moolenaar      'match Group /todo/# comment',
30081966c248SBram Moolenaar      ], 'E488:')
30091966c248SBram Moolenaar  CheckScriptSuccess([
30101966c248SBram Moolenaar      'vim9script',
30111966c248SBram Moolenaar      'match # comment',
30121966c248SBram Moolenaar      ])
30131966c248SBram Moolenaar  CheckScriptFailure([
30141966c248SBram Moolenaar      'vim9script',
30151966c248SBram Moolenaar      'match# comment',
3016f8103f27SBram Moolenaar      ], 'E1144:')
30171966c248SBram Moolenaar  CheckScriptSuccess([
30181966c248SBram Moolenaar      'vim9script',
30191966c248SBram Moolenaar      'match none # comment',
30201966c248SBram Moolenaar      ])
30211966c248SBram Moolenaar  CheckScriptFailure([
30221966c248SBram Moolenaar      'vim9script',
30231966c248SBram Moolenaar      'match none# comment',
30241966c248SBram Moolenaar      ], 'E475:')
30251966c248SBram Moolenaar
30261966c248SBram Moolenaar  CheckScriptSuccess([
30271966c248SBram Moolenaar      'vim9script',
30281966c248SBram Moolenaar      'menutrans clear # comment',
30291966c248SBram Moolenaar      ])
30301966c248SBram Moolenaar  CheckScriptFailure([
30311966c248SBram Moolenaar      'vim9script',
30321966c248SBram Moolenaar      'menutrans clear# comment text',
30331966c248SBram Moolenaar      ], 'E474:')
30341966c248SBram Moolenaar
30351966c248SBram Moolenaar  CheckScriptSuccess([
30361966c248SBram Moolenaar      'vim9script',
30371966c248SBram Moolenaar      'syntax clear # comment',
30381966c248SBram Moolenaar      ])
30391966c248SBram Moolenaar  CheckScriptFailure([
30401966c248SBram Moolenaar      'vim9script',
30411966c248SBram Moolenaar      'syntax clear# comment text',
30421966c248SBram Moolenaar      ], 'E28:')
30431966c248SBram Moolenaar  CheckScriptSuccess([
30441966c248SBram Moolenaar      'vim9script',
30451966c248SBram Moolenaar      'syntax keyword Word some',
30461966c248SBram Moolenaar      'syntax clear Word # comment',
30471966c248SBram Moolenaar      ])
30481966c248SBram Moolenaar  CheckScriptFailure([
30491966c248SBram Moolenaar      'vim9script',
30501966c248SBram Moolenaar      'syntax keyword Word some',
30511966c248SBram Moolenaar      'syntax clear Word# comment text',
30521966c248SBram Moolenaar      ], 'E28:')
30531966c248SBram Moolenaar
30541966c248SBram Moolenaar  CheckScriptSuccess([
30551966c248SBram Moolenaar      'vim9script',
30561966c248SBram Moolenaar      'syntax list # comment',
30571966c248SBram Moolenaar      ])
30581966c248SBram Moolenaar  CheckScriptFailure([
30591966c248SBram Moolenaar      'vim9script',
30601966c248SBram Moolenaar      'syntax list# comment text',
30611966c248SBram Moolenaar      ], 'E28:')
30621966c248SBram Moolenaar
30631966c248SBram Moolenaar  CheckScriptSuccess([
30641966c248SBram Moolenaar      'vim9script',
30651966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
30661966c248SBram Moolenaar      ])
30671966c248SBram Moolenaar  CheckScriptFailure([
30681966c248SBram Moolenaar      'vim9script',
30691966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
30701966c248SBram Moolenaar      ], 'E475:')
30711966c248SBram Moolenaar
30721966c248SBram Moolenaar  CheckScriptSuccess([
30731966c248SBram Moolenaar      'vim9script',
30741966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
30751966c248SBram Moolenaar      ])
30761966c248SBram Moolenaar  CheckScriptFailure([
30771966c248SBram Moolenaar      'vim9script',
30781966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
30791966c248SBram Moolenaar      ], 'E789:')
30801966c248SBram Moolenaar
30811966c248SBram Moolenaar  CheckScriptSuccess([
30821966c248SBram Moolenaar      'vim9script',
30831966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
30841966c248SBram Moolenaar      ])
30851966c248SBram Moolenaar  CheckScriptFailure([
30861966c248SBram Moolenaar      'vim9script',
30871966c248SBram Moolenaar      'syntax match Word /pat/# comment',
30881966c248SBram Moolenaar      ], 'E402:')
30891966c248SBram Moolenaar
30901966c248SBram Moolenaar  CheckScriptSuccess([
30911966c248SBram Moolenaar      'vim9script',
30921966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
30931966c248SBram Moolenaar      ])
30941966c248SBram Moolenaar  CheckScriptFailure([
30951966c248SBram Moolenaar      'vim9script',
30961966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
30971966c248SBram Moolenaar      ], 'E475:')
30981966c248SBram Moolenaar  CheckScriptFailure([
30991966c248SBram Moolenaar      'vim9script',
31001966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
31011966c248SBram Moolenaar      ], 'E406:')
31021966c248SBram Moolenaar  CheckScriptFailure([
31031966c248SBram Moolenaar      'vim9script',
31041966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
31051966c248SBram Moolenaar      ], 'E475:')
31061966c248SBram Moolenaar
31071966c248SBram Moolenaar  CheckScriptSuccess([
31081966c248SBram Moolenaar      'vim9script',
31091966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
31101966c248SBram Moolenaar      ])
31111966c248SBram Moolenaar  CheckScriptFailure([
31121966c248SBram Moolenaar      'vim9script',
31131966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
3114d032f34aSBram Moolenaar      ], 'E402:')
31151966c248SBram Moolenaar
31161966c248SBram Moolenaar  CheckScriptSuccess([
31171966c248SBram Moolenaar      'vim9script',
31181966c248SBram Moolenaar      'syntax sync # comment',
31191966c248SBram Moolenaar      ])
31201966c248SBram Moolenaar  CheckScriptFailure([
31211966c248SBram Moolenaar      'vim9script',
31221966c248SBram Moolenaar      'syntax sync# comment',
31231966c248SBram Moolenaar      ], 'E404:')
31241966c248SBram Moolenaar  CheckScriptSuccess([
31251966c248SBram Moolenaar      'vim9script',
31261966c248SBram Moolenaar      'syntax sync ccomment # comment',
31271966c248SBram Moolenaar      ])
31281966c248SBram Moolenaar  CheckScriptFailure([
31291966c248SBram Moolenaar      'vim9script',
31301966c248SBram Moolenaar      'syntax sync ccomment# comment',
31311966c248SBram Moolenaar      ], 'E404:')
31321966c248SBram Moolenaar
31331966c248SBram Moolenaar  CheckScriptSuccess([
31341966c248SBram Moolenaar      'vim9script',
31351966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
31361966c248SBram Moolenaar      ])
31371966c248SBram Moolenaar  CheckScriptFailure([
31381966c248SBram Moolenaar      'vim9script',
31391966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
31401966c248SBram Moolenaar      ], 'E475:')
3141a72cfb80SBram Moolenaar
3142a72cfb80SBram Moolenaar  CheckScriptSuccess([
3143a72cfb80SBram Moolenaar      'vim9script',
3144a72cfb80SBram Moolenaar      'command Echo echo # comment',
3145a72cfb80SBram Moolenaar      'command Echo # comment',
31462d870f8dSBram Moolenaar      'delcommand Echo',
3147a72cfb80SBram Moolenaar      ])
3148a72cfb80SBram Moolenaar  CheckScriptFailure([
3149a72cfb80SBram Moolenaar      'vim9script',
3150a72cfb80SBram Moolenaar      'command Echo echo# comment',
3151a72cfb80SBram Moolenaar      'Echo',
3152f8103f27SBram Moolenaar      ], 'E1144:')
31532d870f8dSBram Moolenaar  delcommand Echo
315470249ee8SBram Moolenaar
315570249ee8SBram Moolenaar  var curdir = getcwd()
315670249ee8SBram Moolenaar  CheckScriptSuccess([
315770249ee8SBram Moolenaar      'command Echo cd " comment',
315870249ee8SBram Moolenaar      'Echo',
315970249ee8SBram Moolenaar      'delcommand Echo',
316070249ee8SBram Moolenaar      ])
316170249ee8SBram Moolenaar  CheckScriptSuccess([
3162090728adSBram Moolenaar      'vim9script',
316370249ee8SBram Moolenaar      'command Echo cd # comment',
316470249ee8SBram Moolenaar      'Echo',
316570249ee8SBram Moolenaar      'delcommand Echo',
316670249ee8SBram Moolenaar      ])
316770249ee8SBram Moolenaar  CheckScriptFailure([
316870249ee8SBram Moolenaar      'vim9script',
316970249ee8SBram Moolenaar      'command Echo cd " comment',
317070249ee8SBram Moolenaar      'Echo',
317170249ee8SBram Moolenaar      ], 'E344:')
317270249ee8SBram Moolenaar  delcommand Echo
317370249ee8SBram Moolenaar  chdir(curdir)
317470249ee8SBram Moolenaar
3175a72cfb80SBram Moolenaar  CheckScriptFailure([
3176a72cfb80SBram Moolenaar      'vim9script',
3177a72cfb80SBram Moolenaar      'command Echo# comment',
3178a72cfb80SBram Moolenaar      ], 'E182:')
3179a72cfb80SBram Moolenaar  CheckScriptFailure([
3180a72cfb80SBram Moolenaar      'vim9script',
3181a72cfb80SBram Moolenaar      'command Echo echo',
3182a72cfb80SBram Moolenaar      'command Echo# comment',
3183a72cfb80SBram Moolenaar      ], 'E182:')
31842d870f8dSBram Moolenaar  delcommand Echo
3185a72cfb80SBram Moolenaar
3186a72cfb80SBram Moolenaar  CheckScriptSuccess([
3187a72cfb80SBram Moolenaar      'vim9script',
3188a72cfb80SBram Moolenaar      'function # comment',
3189a72cfb80SBram Moolenaar      ])
3190a72cfb80SBram Moolenaar  CheckScriptFailure([
3191a72cfb80SBram Moolenaar      'vim9script',
31929898107fSBram Moolenaar      'function " comment',
31939898107fSBram Moolenaar      ], 'E129:')
31949898107fSBram Moolenaar  CheckScriptFailure([
31959898107fSBram Moolenaar      'vim9script',
3196a72cfb80SBram Moolenaar      'function# comment',
3197f8103f27SBram Moolenaar      ], 'E1144:')
3198a72cfb80SBram Moolenaar  CheckScriptSuccess([
3199a72cfb80SBram Moolenaar      'vim9script',
3200a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
3201a72cfb80SBram Moolenaar      ])
3202a72cfb80SBram Moolenaar  CheckScriptFailure([
3203a72cfb80SBram Moolenaar      'vim9script',
3204a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
3205a72cfb80SBram Moolenaar      ], 'E488:')
3206a72cfb80SBram Moolenaar
3207a72cfb80SBram Moolenaar  CheckScriptSuccess([
3208a72cfb80SBram Moolenaar      'vim9script',
32094c17ad94SBram Moolenaar      'func g:DeleteMeA()',
3210a72cfb80SBram Moolenaar      'endfunc',
32114c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
3212a72cfb80SBram Moolenaar      ])
3213a72cfb80SBram Moolenaar  CheckScriptFailure([
3214a72cfb80SBram Moolenaar      'vim9script',
32154c17ad94SBram Moolenaar      'func g:DeleteMeB()',
3216a72cfb80SBram Moolenaar      'endfunc',
32174c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
3218a72cfb80SBram Moolenaar      ], 'E488:')
3219a72cfb80SBram Moolenaar
3220a72cfb80SBram Moolenaar  CheckScriptSuccess([
3221a72cfb80SBram Moolenaar      'vim9script',
3222a72cfb80SBram Moolenaar      'call execute("ls") # comment',
3223a72cfb80SBram Moolenaar      ])
3224a72cfb80SBram Moolenaar  CheckScriptFailure([
3225a72cfb80SBram Moolenaar      'vim9script',
3226a72cfb80SBram Moolenaar      'call execute("ls")# comment',
3227a72cfb80SBram Moolenaar      ], 'E488:')
3228e7e4838fSBram Moolenaar
3229e7e4838fSBram Moolenaar  CheckScriptFailure([
3230e7e4838fSBram Moolenaar      'def Test() " comment',
3231e7e4838fSBram Moolenaar      'enddef',
3232e7e4838fSBram Moolenaar      ], 'E488:')
3233e7e4838fSBram Moolenaar  CheckScriptFailure([
3234e7e4838fSBram Moolenaar      'vim9script',
3235e7e4838fSBram Moolenaar      'def Test() " comment',
3236e7e4838fSBram Moolenaar      'enddef',
3237e7e4838fSBram Moolenaar      ], 'E488:')
3238e7e4838fSBram Moolenaar
3239e7e4838fSBram Moolenaar  CheckScriptSuccess([
3240e7e4838fSBram Moolenaar      'func Test() " comment',
3241e7e4838fSBram Moolenaar      'endfunc',
32422d870f8dSBram Moolenaar      'delfunc Test',
3243e7e4838fSBram Moolenaar      ])
32449898107fSBram Moolenaar  CheckScriptSuccess([
3245e7e4838fSBram Moolenaar      'vim9script',
3246e7e4838fSBram Moolenaar      'func Test() " comment',
3247e7e4838fSBram Moolenaar      'endfunc',
32489898107fSBram Moolenaar      ])
3249e7e4838fSBram Moolenaar
3250e7e4838fSBram Moolenaar  CheckScriptSuccess([
3251e7e4838fSBram Moolenaar      'def Test() # comment',
3252e7e4838fSBram Moolenaar      'enddef',
3253e7e4838fSBram Moolenaar      ])
3254e7e4838fSBram Moolenaar  CheckScriptFailure([
3255e7e4838fSBram Moolenaar      'func Test() # comment',
3256e7e4838fSBram Moolenaar      'endfunc',
3257e7e4838fSBram Moolenaar      ], 'E488:')
32580f37e356SBram Moolenaar
32590f37e356SBram Moolenaar  var lines =<< trim END
32600f37e356SBram Moolenaar      vim9script
32610f37e356SBram Moolenaar      syn region Text
32620f37e356SBram Moolenaar      \ start='foo'
32630f37e356SBram Moolenaar      #\ comment
32640f37e356SBram Moolenaar      \ end='bar'
32655072b47aSBram Moolenaar      syn region Text start='foo'
32665072b47aSBram Moolenaar      #\ comment
32675072b47aSBram Moolenaar      \ end='bar'
32680f37e356SBram Moolenaar  END
32690f37e356SBram Moolenaar  CheckScriptSuccess(lines)
32700f37e356SBram Moolenaar
32710f37e356SBram Moolenaar  lines =<< trim END
32720f37e356SBram Moolenaar      vim9script
32730f37e356SBram Moolenaar      syn region Text
32740f37e356SBram Moolenaar      \ start='foo'
32750f37e356SBram Moolenaar      "\ comment
32760f37e356SBram Moolenaar      \ end='bar'
32770f37e356SBram Moolenaar  END
32780f37e356SBram Moolenaar  CheckScriptFailure(lines, 'E399:')
32792c5ed4e3SBram Moolenaarenddef
32802c5ed4e3SBram Moolenaar
32812c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
32822c5ed4e3SBram Moolenaar  CheckCanRunGui
32832c5ed4e3SBram Moolenaar
32842c5ed4e3SBram Moolenaar  CheckScriptFailure([
32852c5ed4e3SBram Moolenaar      'vim9script',
32862c5ed4e3SBram Moolenaar      'gui#comment'
3287f8103f27SBram Moolenaar      ], 'E1144:')
32882c5ed4e3SBram Moolenaar  CheckScriptFailure([
32892c5ed4e3SBram Moolenaar      'vim9script',
32902c5ed4e3SBram Moolenaar      'gui -f#comment'
32912c5ed4e3SBram Moolenaar      ], 'E499:')
32927a092245SBram Moolenaarenddef
32937a092245SBram Moolenaar
3294a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
32956797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
32966797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3297a26b9700SBram Moolenaar
3298a26b9700SBram Moolenaar  edit test.vim
3299a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3300a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3301a26b9700SBram Moolenaar
3302a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3303a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3304a26b9700SBram Moolenaar
3305a26b9700SBram Moolenaar  g:entered = 0
3306a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3307a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3308a26b9700SBram Moolenaar
3309a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3310a26b9700SBram Moolenaar
3311a26b9700SBram Moolenaar  au! TabEnter
3312a26b9700SBram Moolenaar  unlet g:entered
3313d72c1bf0SBram Moolenaar
3314d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3315d72c1bf0SBram Moolenaar      'vim9script',
33166797966dSBram Moolenaar      'g:var = 123',
3317e55b1c09SBram Moolenaar      'b:var = 456',
3318e55b1c09SBram Moolenaar      'w:var = 777',
3319e55b1c09SBram Moolenaar      't:var = 888',
3320d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3321d72c1bf0SBram Moolenaar      ])
3322d72c1bf0SBram Moolenaar
3323d72c1bf0SBram Moolenaar  CheckScriptFailure([
3324d72c1bf0SBram Moolenaar      'vim9script',
3325cfcd011fSBram Moolenaar      'let var = 123',
3326cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3327cfcd011fSBram Moolenaar
3328cfcd011fSBram Moolenaar  CheckScriptFailure([
3329cfcd011fSBram Moolenaar      'vim9script',
3330cfcd011fSBram Moolenaar      'var g:var = 123',
3331e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3332e55b1c09SBram Moolenaar
3333e55b1c09SBram Moolenaar  CheckScriptFailure([
3334e55b1c09SBram Moolenaar      'vim9script',
3335cfcd011fSBram Moolenaar      'var b:var = 123',
3336e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3337e55b1c09SBram Moolenaar
3338e55b1c09SBram Moolenaar  CheckScriptFailure([
3339e55b1c09SBram Moolenaar      'vim9script',
3340cfcd011fSBram Moolenaar      'var w:var = 123',
3341e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3342e55b1c09SBram Moolenaar
3343e55b1c09SBram Moolenaar  CheckScriptFailure([
3344e55b1c09SBram Moolenaar      'vim9script',
3345cfcd011fSBram Moolenaar      'var t:var = 123',
3346e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3347e55b1c09SBram Moolenaar
3348e55b1c09SBram Moolenaar  CheckScriptFailure([
3349e55b1c09SBram Moolenaar      'vim9script',
3350cfcd011fSBram Moolenaar      'var v:version = 123',
3351e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3352e55b1c09SBram Moolenaar
3353e55b1c09SBram Moolenaar  CheckScriptFailure([
3354e55b1c09SBram Moolenaar      'vim9script',
3355cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3356e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
33576797966dSBram Moolenaar
33586797966dSBram Moolenaar  CheckScriptFailure([
33596797966dSBram Moolenaar      'vim9script',
33606797966dSBram Moolenaar      'g:var = 123',
336132e35117SBram Moolenaar      'unlet g:var# comment1',
3362d72c1bf0SBram Moolenaar      ], 'E108:')
3363d72c1bf0SBram Moolenaar
3364d72c1bf0SBram Moolenaar  CheckScriptFailure([
3365d72c1bf0SBram Moolenaar      'let g:var = 123',
3366d72c1bf0SBram Moolenaar      'unlet g:var # something',
3367d72c1bf0SBram Moolenaar      ], 'E488:')
3368faac4104SBram Moolenaar
3369faac4104SBram Moolenaar  CheckScriptSuccess([
3370faac4104SBram Moolenaar      'vim9script',
337132e35117SBram Moolenaar      'if 1 # comment2',
3372faac4104SBram Moolenaar      '  echo "yes"',
3373faac4104SBram Moolenaar      'elseif 2 #comment',
3374faac4104SBram Moolenaar      '  echo "no"',
3375faac4104SBram Moolenaar      'endif',
3376faac4104SBram Moolenaar      ])
3377faac4104SBram Moolenaar
3378faac4104SBram Moolenaar  CheckScriptFailure([
3379faac4104SBram Moolenaar      'vim9script',
338032e35117SBram Moolenaar      'if 1# comment3',
3381faac4104SBram Moolenaar      '  echo "yes"',
3382faac4104SBram Moolenaar      'endif',
3383fae55a9cSBram Moolenaar      ], 'E488:')
3384faac4104SBram Moolenaar
3385faac4104SBram Moolenaar  CheckScriptFailure([
3386faac4104SBram Moolenaar      'vim9script',
338732e35117SBram Moolenaar      'if 0 # comment4',
3388faac4104SBram Moolenaar      '  echo "yes"',
3389faac4104SBram Moolenaar      'elseif 2#comment',
3390faac4104SBram Moolenaar      '  echo "no"',
3391faac4104SBram Moolenaar      'endif',
3392fae55a9cSBram Moolenaar      ], 'E488:')
3393faac4104SBram Moolenaar
3394faac4104SBram Moolenaar  CheckScriptSuccess([
3395faac4104SBram Moolenaar      'vim9script',
3396cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3397faac4104SBram Moolenaar      ])
3398faac4104SBram Moolenaar
3399faac4104SBram Moolenaar  CheckScriptFailure([
3400faac4104SBram Moolenaar      'vim9script',
3401cfcd011fSBram Moolenaar      'var v = 1# comment6',
3402fae55a9cSBram Moolenaar      ], 'E488:')
3403faac4104SBram Moolenaar
3404faac4104SBram Moolenaar  CheckScriptSuccess([
3405faac4104SBram Moolenaar      'vim9script',
3406faac4104SBram Moolenaar      'new'
3407d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3408df069eecSBram Moolenaar      ':$',
3409faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3410faac4104SBram Moolenaar      'bwipe!',
3411faac4104SBram Moolenaar      ])
3412faac4104SBram Moolenaar
3413f5be8cdbSBram Moolenaar  CheckScriptFailure([
3414f5be8cdbSBram Moolenaar      'vim9script',
3415f5be8cdbSBram Moolenaar      'new'
3416d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3417f5be8cdbSBram Moolenaar      ':$',
3418f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3419f5be8cdbSBram Moolenaar      'bwipe!',
3420f5be8cdbSBram Moolenaar      ], 'E488:')
3421f5be8cdbSBram Moolenaar
3422f5be8cdbSBram Moolenaar  CheckScriptFailure([
3423f5be8cdbSBram Moolenaar      'vim9script',
3424f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3425f5be8cdbSBram Moolenaar      ], 'E477:')
3426a26b9700SBram Moolenaarenddef
3427a26b9700SBram Moolenaar
34287e5bd91dSBram Moolenaardef Test_finish()
3429cfcd011fSBram Moolenaar  var lines =<< trim END
34307e5bd91dSBram Moolenaar    vim9script
34316797966dSBram Moolenaar    g:res = 'one'
34327e5bd91dSBram Moolenaar    if v:false | finish | endif
34336797966dSBram Moolenaar    g:res = 'two'
34347e5bd91dSBram Moolenaar    finish
34356797966dSBram Moolenaar    g:res = 'three'
34367e5bd91dSBram Moolenaar  END
34377e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
34387e5bd91dSBram Moolenaar  source Xfinished
34397e5bd91dSBram Moolenaar  assert_equal('two', g:res)
34407e5bd91dSBram Moolenaar
34417e5bd91dSBram Moolenaar  unlet g:res
34427e5bd91dSBram Moolenaar  delete('Xfinished')
34437e5bd91dSBram Moolenaarenddef
34447e5bd91dSBram Moolenaar
3445a5d0077eSBram Moolenaardef Test_forward_declaration()
3446cfcd011fSBram Moolenaar  var lines =<< trim END
3447a5d0077eSBram Moolenaar    vim9script
3448a5d0077eSBram Moolenaar    def GetValue(): string
3449a5d0077eSBram Moolenaar      return theVal
3450a5d0077eSBram Moolenaar    enddef
3451cfcd011fSBram Moolenaar    var theVal = 'something'
3452822ba247SBram Moolenaar    g:initVal = GetValue()
3453a5d0077eSBram Moolenaar    theVal = 'else'
3454a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3455a5d0077eSBram Moolenaar  END
3456a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3457a5d0077eSBram Moolenaar  source Xforward
3458a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3459a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3460a5d0077eSBram Moolenaar
3461a5d0077eSBram Moolenaar  unlet g:initVal
3462a5d0077eSBram Moolenaar  unlet g:laterVal
3463a5d0077eSBram Moolenaar  delete('Xforward')
3464a5d0077eSBram Moolenaarenddef
3465a5d0077eSBram Moolenaar
34669721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3467a6294955SBram Moolenaar  var vim9_lines =<< trim END
3468a6294955SBram Moolenaar    vim9script
3469a6294955SBram Moolenaar    var local = 'local'
3470a6294955SBram Moolenaar    g:global = 'global'
3471a6294955SBram Moolenaar    export var exported = 'exported'
3472a6294955SBram Moolenaar    export def GetText(): string
3473a6294955SBram Moolenaar       return 'text'
3474a6294955SBram Moolenaar    enddef
3475a6294955SBram Moolenaar  END
3476a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3477a6294955SBram Moolenaar
3478cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
34799721fb4eSBram Moolenaar    source Xvim9_script.vim
34809721fb4eSBram Moolenaar
34819721fb4eSBram Moolenaar    call assert_false(exists('local'))
34829721fb4eSBram Moolenaar    call assert_false(exists('exported'))
34839721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
34849721fb4eSBram Moolenaar    call assert_equal('global', global)
34859721fb4eSBram Moolenaar    call assert_equal('global', g:global)
34869721fb4eSBram Moolenaar
34879721fb4eSBram Moolenaar    " imported variable becomes script-local
34889721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
34899721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
34909721fb4eSBram Moolenaar    call assert_false(exists('exported'))
34919721fb4eSBram Moolenaar
34929721fb4eSBram Moolenaar    " imported function becomes script-local
34939721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
34949721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
34959721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
34969721fb4eSBram Moolenaar  END
34979721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
34989721fb4eSBram Moolenaar
34999721fb4eSBram Moolenaar  source Xlegacy_script.vim
35009721fb4eSBram Moolenaar  assert_equal('global', g:global)
3501f5be8cdbSBram Moolenaar  unlet g:global
35029721fb4eSBram Moolenaar
35039721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
35049721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
35059721fb4eSBram Moolenaarenddef
3506a5d0077eSBram Moolenaar
3507e535db86SBram Moolenaardef Test_declare_script_in_func()
3508e535db86SBram Moolenaar  var lines =<< trim END
3509e535db86SBram Moolenaar      vim9script
3510e535db86SBram Moolenaar      func Declare()
3511e535db86SBram Moolenaar        let s:local = 123
3512e535db86SBram Moolenaar      endfunc
3513e535db86SBram Moolenaar      Declare()
3514e535db86SBram Moolenaar      assert_equal(123, local)
3515e535db86SBram Moolenaar
3516e535db86SBram Moolenaar      var error: string
3517e535db86SBram Moolenaar      try
3518e535db86SBram Moolenaar        local = 'asdf'
3519e535db86SBram Moolenaar      catch
3520e535db86SBram Moolenaar        error = v:exception
3521e535db86SBram Moolenaar      endtry
3522e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3523e535db86SBram Moolenaar
3524e535db86SBram Moolenaar      lockvar local
3525e535db86SBram Moolenaar      try
3526e535db86SBram Moolenaar        local = 999
3527e535db86SBram Moolenaar      catch
3528e535db86SBram Moolenaar        error = v:exception
3529e535db86SBram Moolenaar      endtry
3530e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3531e535db86SBram Moolenaar  END
3532e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3533e535db86SBram Moolenaarenddef
3534e535db86SBram Moolenaar
3535e535db86SBram Moolenaar
35367d699701SBram Moolenaarfunc Test_vim9script_not_global()
35377d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
35387d699701SBram Moolenaar  let vim9lines =<< trim END
35397d699701SBram Moolenaar    vim9script
3540cfcd011fSBram Moolenaar    var name = 'local'
35417d699701SBram Moolenaar    func TheFunc()
35427d699701SBram Moolenaar      echo 'local'
35437d699701SBram Moolenaar    endfunc
35447d699701SBram Moolenaar    def DefFunc()
35457d699701SBram Moolenaar      echo 'local'
35467d699701SBram Moolenaar    enddef
35477d699701SBram Moolenaar  END
35487d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
35497d699701SBram Moolenaar  source Xvim9script.vim
35507d699701SBram Moolenaar  try
35517d699701SBram Moolenaar    echo g:var
35527d699701SBram Moolenaar    assert_report('did not fail')
35537d699701SBram Moolenaar  catch /E121:/
35547d699701SBram Moolenaar    " caught
35557d699701SBram Moolenaar  endtry
35567d699701SBram Moolenaar  try
35577d699701SBram Moolenaar    call TheFunc()
35587d699701SBram Moolenaar    assert_report('did not fail')
35597d699701SBram Moolenaar  catch /E117:/
35607d699701SBram Moolenaar    " caught
35617d699701SBram Moolenaar  endtry
35627d699701SBram Moolenaar  try
35637d699701SBram Moolenaar    call DefFunc()
35647d699701SBram Moolenaar    assert_report('did not fail')
35657d699701SBram Moolenaar  catch /E117:/
35667d699701SBram Moolenaar    " caught
35677d699701SBram Moolenaar  endtry
35687d699701SBram Moolenaar
356925859dd7SBram Moolenaar  call delete('Xvim9script.vim')
35707d699701SBram Moolenaarendfunc
35717d699701SBram Moolenaar
3572eeb27bfeSBram Moolenaardef Test_vim9_copen()
3573eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3574eeb27bfeSBram Moolenaar  copen
3575eeb27bfeSBram Moolenaar  quit
3576eeb27bfeSBram Moolenaarenddef
3577eeb27bfeSBram Moolenaar
357803290b84SBram Moolenaar" test using an auto-loaded function and variable
35792d6b20d6SBram Moolenaardef Test_vim9_autoload()
3580cfcd011fSBram Moolenaar  var lines =<< trim END
35812d6b20d6SBram Moolenaar     vim9script
358203290b84SBram Moolenaar     def some#gettest(): string
358303290b84SBram Moolenaar       return 'test'
358403290b84SBram Moolenaar     enddef
358503290b84SBram Moolenaar     g:some#name = 'name'
3586227c58a4SBram Moolenaar     g:some#dict = {key: 'value'}
3587e3ffcd99SBram Moolenaar
3588e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3589e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3590e3ffcd99SBram Moolenaar     enddef
359103290b84SBram Moolenaar  END
359203290b84SBram Moolenaar
359303290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
359403290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
359503290b84SBram Moolenaar  var save_rtp = &rtp
359603290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
359703290b84SBram Moolenaar
359803290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
359903290b84SBram Moolenaar  assert_equal('name', g:some#name)
3600227c58a4SBram Moolenaar  assert_equal('value', g:some#dict.key)
360103290b84SBram Moolenaar  g:some#other = 'other'
360203290b84SBram Moolenaar  assert_equal('other', g:some#other)
360303290b84SBram Moolenaar
3604e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3605e3ffcd99SBram Moolenaar
360617f700acSBram Moolenaar  # upper case script name works
360717f700acSBram Moolenaar  lines =<< trim END
360817f700acSBram Moolenaar     vim9script
360917f700acSBram Moolenaar     def Other#getOther(): string
361017f700acSBram Moolenaar       return 'other'
361117f700acSBram Moolenaar     enddef
361217f700acSBram Moolenaar  END
361317f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
361417f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
361517f700acSBram Moolenaar
361603290b84SBram Moolenaar  delete('Xdir', 'rf')
361703290b84SBram Moolenaar  &rtp = save_rtp
361803290b84SBram Moolenaarenddef
361903290b84SBram Moolenaar
362003290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
362103290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
362203290b84SBram Moolenaar  var lines =<< trim END
362303290b84SBram Moolenaar     vim9script
36242d6b20d6SBram Moolenaar     def foo#test()
36252d6b20d6SBram Moolenaar         echomsg getreg('"')
36262d6b20d6SBram Moolenaar     enddef
36272d6b20d6SBram Moolenaar  END
36282d6b20d6SBram Moolenaar
36292d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
36302d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3631cfcd011fSBram Moolenaar  var save_rtp = &rtp
36322d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
36332d6b20d6SBram Moolenaar  augroup test
36342d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
36352d6b20d6SBram Moolenaar  augroup END
36362d6b20d6SBram Moolenaar
36372d6b20d6SBram Moolenaar  normal Y
36382d6b20d6SBram Moolenaar
36392d6b20d6SBram Moolenaar  augroup test
36402d6b20d6SBram Moolenaar    autocmd!
36412d6b20d6SBram Moolenaar  augroup END
36422d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
36432d6b20d6SBram Moolenaar  &rtp = save_rtp
36442d6b20d6SBram Moolenaarenddef
36452d6b20d6SBram Moolenaar
364677e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
364777e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3648cfcd011fSBram Moolenaar  var lines =<< trim END
364977e5dcc3SBram Moolenaar      vim9script
365077e5dcc3SBram Moolenaar      def crash#func()
365177e5dcc3SBram Moolenaar          try
365277e5dcc3SBram Moolenaar              for x in List()
365377e5dcc3SBram Moolenaar              endfor
365477e5dcc3SBram Moolenaar          catch
365577e5dcc3SBram Moolenaar          endtry
365677e5dcc3SBram Moolenaar          g:ok = true
365777e5dcc3SBram Moolenaar      enddef
365877e5dcc3SBram Moolenaar      fu List()
365977e5dcc3SBram Moolenaar          invalid
366077e5dcc3SBram Moolenaar      endfu
366177e5dcc3SBram Moolenaar      try
366248e11c10SBram Moolenaar          alsoinvalid
366377e5dcc3SBram Moolenaar      catch /wontmatch/
366477e5dcc3SBram Moolenaar      endtry
366577e5dcc3SBram Moolenaar  END
366677e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
366777e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
366877e5dcc3SBram Moolenaar
366977e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
367077e5dcc3SBram Moolenaar  lines =<< trim END
367177e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
367277e5dcc3SBram Moolenaar    call crash#func()
367377e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
36749c4f5520SBram Moolenaar    qall!
367577e5dcc3SBram Moolenaar  END
367677e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
367777e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
367877e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
367977e5dcc3SBram Moolenaar
368077e5dcc3SBram Moolenaar  delete('Xdidit')
368177e5dcc3SBram Moolenaar  delete('Xscript')
368277e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
368303290b84SBram Moolenaar
368403290b84SBram Moolenaar  lines =<< trim END
368503290b84SBram Moolenaar    vim9script
368603290b84SBram Moolenaar    var foo#bar = 'asdf'
368703290b84SBram Moolenaar  END
368803290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
368977e5dcc3SBram Moolenaarenddef
369077e5dcc3SBram Moolenaar
369181e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
369281e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
369381e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3694cfcd011fSBram Moolenaar  var lines =<< trim END
369581e17fbeSBram Moolenaar    let s:counter = 1
369681e17fbeSBram Moolenaar    def s:Func()
369781e17fbeSBram Moolenaar      au! CursorHold
369881e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
369981e17fbeSBram Moolenaar    enddef
370081e17fbeSBram Moolenaar    call s:Func()
370181e17fbeSBram Moolenaar    doau CursorHold
370281e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
370381e17fbeSBram Moolenaar    au! CursorHold
370481e17fbeSBram Moolenaar  END
370581e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
370681e17fbeSBram Moolenaarenddef
370781e17fbeSBram Moolenaar
3708b5841b99SBram Moolenaardef Test_error_in_autoload_script()
3709b5841b99SBram Moolenaar  var save_rtp = &rtp
3710b5841b99SBram Moolenaar  var dir = getcwd() .. '/Xruntime'
3711b5841b99SBram Moolenaar  &rtp = dir
3712b5841b99SBram Moolenaar  mkdir(dir .. '/autoload', 'p')
3713b5841b99SBram Moolenaar
3714b5841b99SBram Moolenaar  var lines =<< trim END
3715b5841b99SBram Moolenaar      vim9script noclear
3716b5841b99SBram Moolenaar      def script#autoloaded()
3717b5841b99SBram Moolenaar      enddef
3718b5841b99SBram Moolenaar      def Broken()
3719b5841b99SBram Moolenaar        var x: any = ''
3720b5841b99SBram Moolenaar        eval x != 0
3721b5841b99SBram Moolenaar      enddef
3722b5841b99SBram Moolenaar      Broken()
3723b5841b99SBram Moolenaar  END
3724b5841b99SBram Moolenaar  writefile(lines, dir .. '/autoload/script.vim')
3725b5841b99SBram Moolenaar
3726b5841b99SBram Moolenaar  lines =<< trim END
3727b5841b99SBram Moolenaar      vim9script
3728b5841b99SBram Moolenaar      def CallAutoloaded()
3729b5841b99SBram Moolenaar        script#autoloaded()
3730b5841b99SBram Moolenaar      enddef
3731b5841b99SBram Moolenaar
3732b5841b99SBram Moolenaar      function Legacy()
3733b5841b99SBram Moolenaar        try
3734b5841b99SBram Moolenaar          call s:CallAutoloaded()
3735b5841b99SBram Moolenaar        catch
3736b5841b99SBram Moolenaar          call assert_match('E1030: Using a String as a Number', v:exception)
3737b5841b99SBram Moolenaar        endtry
3738b5841b99SBram Moolenaar      endfunction
3739b5841b99SBram Moolenaar
3740b5841b99SBram Moolenaar      Legacy()
3741b5841b99SBram Moolenaar  END
3742b5841b99SBram Moolenaar  CheckScriptSuccess(lines)
3743b5841b99SBram Moolenaar
3744b5841b99SBram Moolenaar  &rtp = save_rtp
3745b5841b99SBram Moolenaar  delete(dir, 'rf')
3746b5841b99SBram Moolenaarenddef
3747b5841b99SBram Moolenaar
37483896a105SBram Moolenaardef Test_cmdline_win()
37493896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
37503896a105SBram Moolenaar  # the command line window.
37513896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3752cfcd011fSBram Moolenaar  var export_lines =<< trim END
37533896a105SBram Moolenaar    vim9script
3754cfcd011fSBram Moolenaar    export var That = 'yes'
37553896a105SBram Moolenaar  END
37563896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3757cfcd011fSBram Moolenaar  var import_lines =<< trim END
37583896a105SBram Moolenaar    vim9script
37593896a105SBram Moolenaar    import That from './Xexport.vim'
37603896a105SBram Moolenaar  END
37613896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3762cfcd011fSBram Moolenaar  var save_rtp = &rtp
37633896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
37643896a105SBram Moolenaar  syntax on
37653896a105SBram Moolenaar  augroup CmdWin
37663896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
37673896a105SBram Moolenaar  augroup END
37683896a105SBram Moolenaar  # this will open and also close the cmdline window
37693896a105SBram Moolenaar  feedkeys('q:', 'xt')
37703896a105SBram Moolenaar  assert_equal('yes', g:got_there)
37713896a105SBram Moolenaar
37723896a105SBram Moolenaar  augroup CmdWin
37733896a105SBram Moolenaar    au!
37743896a105SBram Moolenaar  augroup END
37753896a105SBram Moolenaar  &rtp = save_rtp
37763896a105SBram Moolenaar  delete('rtp', 'rf')
37773896a105SBram Moolenaarenddef
37783896a105SBram Moolenaar
3779e3d4685fSBram Moolenaardef Test_invalid_sid()
3780e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
378125859dd7SBram Moolenaar
37829c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3783d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3784e3d4685fSBram Moolenaar  endif
3785e3d4685fSBram Moolenaar  delete('Xdidit')
3786e3d4685fSBram Moolenaarenddef
3787e3d4685fSBram Moolenaar
37889ec7026fSBram Moolenaardef Test_restoring_cpo()
37899ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
37909ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
37919ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
37929ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
37939ec7026fSBram Moolenaar  endif
37949ec7026fSBram Moolenaar  delete('Xsourced')
37959ec7026fSBram Moolenaar  delete('Xclose')
3796090728adSBram Moolenaar  delete('Xdone')
37970123cc1eSBram Moolenaar
37980123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
37990123cc1eSBram Moolenaar  set cpo=aABceFsMny>
38000123cc1eSBram Moolenaar  edit XanotherScript
38010123cc1eSBram Moolenaar  so %
38020123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
38030123cc1eSBram Moolenaar  :1del
38040123cc1eSBram Moolenaar  w
38050123cc1eSBram Moolenaar  so %
38060123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
38070123cc1eSBram Moolenaar
38080123cc1eSBram Moolenaar  delete('XanotherScript')
38090123cc1eSBram Moolenaar  set cpo&vim
38109ec7026fSBram Moolenaarenddef
38119ec7026fSBram Moolenaar
3812ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3813ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
381437294bd6SBram Moolenaar  CheckScreendump
3815ffb7dcdbSBram Moolenaar  CheckFeature timers
381637294bd6SBram Moolenaar
3817ffb7dcdbSBram Moolenaar  let lines =<< trim END
381837294bd6SBram Moolenaar    vim9script
381937294bd6SBram Moolenaar    def script#func()
382037294bd6SBram Moolenaar    enddef
382137294bd6SBram Moolenaar  END
3822ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3823ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
382437294bd6SBram Moolenaar
3825ffb7dcdbSBram Moolenaar  let lines =<< trim END
382637294bd6SBram Moolenaar      vim9script
382737294bd6SBram Moolenaar      set cpo+=M
382837294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
3829767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
383037294bd6SBram Moolenaar      setline(1, 'some text')
383137294bd6SBram Moolenaar  END
3832ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3833ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3834ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3835ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
383637294bd6SBram Moolenaar
3837ffb7dcdbSBram Moolenaar  " clean up
3838ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3839ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3840ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3841ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3842ffb7dcdbSBram Moolenaarendfunc
384337294bd6SBram Moolenaar
38449ec7026fSBram Moolenaar
3845f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3846cfcd011fSBram Moolenaar  var lines =<< trim END
3847cfcd011fSBram Moolenaar    var name: any
3848cfcd011fSBram Moolenaar    assert_equal(0, name)
3849f0afd9e1SBram Moolenaar  END
3850f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3851f0afd9e1SBram Moolenaarenddef
3852f0afd9e1SBram Moolenaar
38537e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
385458dbef33SBram Moolenaar  CheckRunVimInTerminal
385558dbef33SBram Moolenaar
38567e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
38577e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
38587e9210eaSBram Moolenaarendfunc
38597e9210eaSBram Moolenaar
38607e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
38619c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3862cfcd011fSBram Moolenaar  var lines =<< trim END
38639c4f5520SBram Moolenaar    func CheckAndQuit()
38649c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
38659c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
38669c4f5520SBram Moolenaar    endfunc
38679c4f5520SBram Moolenaar  END
38689c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
38699c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3870e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
38719c4f5520SBram Moolenaar  # define Afunc() on the command line
38729c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
38739c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
38742949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
38759c4f5520SBram Moolenaar
38769c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
38779c4f5520SBram Moolenaar  delete('XcallFunc')
38789c4f5520SBram Moolenaar  delete('Xdidcmd')
38799c4f5520SBram Moolenaarenddef
38809c4f5520SBram Moolenaar
3881fcdc5d83SBram Moolenaardef Test_script_var_scope()
3882fcdc5d83SBram Moolenaar  var lines =<< trim END
3883fcdc5d83SBram Moolenaar      vim9script
3884fcdc5d83SBram Moolenaar      if true
3885fcdc5d83SBram Moolenaar        if true
3886fcdc5d83SBram Moolenaar          var one = 'one'
3887fcdc5d83SBram Moolenaar          echo one
3888fcdc5d83SBram Moolenaar        endif
3889fcdc5d83SBram Moolenaar        echo one
3890fcdc5d83SBram Moolenaar      endif
3891fcdc5d83SBram Moolenaar  END
3892fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3893fcdc5d83SBram Moolenaar
3894fcdc5d83SBram Moolenaar  lines =<< trim END
3895fcdc5d83SBram Moolenaar      vim9script
3896fcdc5d83SBram Moolenaar      if true
3897fcdc5d83SBram Moolenaar        if false
3898fcdc5d83SBram Moolenaar          var one = 'one'
3899fcdc5d83SBram Moolenaar          echo one
3900fcdc5d83SBram Moolenaar        else
3901fcdc5d83SBram Moolenaar          var one = 'one'
3902fcdc5d83SBram Moolenaar          echo one
3903fcdc5d83SBram Moolenaar        endif
3904fcdc5d83SBram Moolenaar        echo one
3905fcdc5d83SBram Moolenaar      endif
3906fcdc5d83SBram Moolenaar  END
3907fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3908fcdc5d83SBram Moolenaar
3909fcdc5d83SBram Moolenaar  lines =<< trim END
3910fcdc5d83SBram Moolenaar      vim9script
3911fcdc5d83SBram Moolenaar      while true
3912fcdc5d83SBram Moolenaar        var one = 'one'
3913fcdc5d83SBram Moolenaar        echo one
3914fcdc5d83SBram Moolenaar        break
3915fcdc5d83SBram Moolenaar      endwhile
3916fcdc5d83SBram Moolenaar      echo one
3917fcdc5d83SBram Moolenaar  END
3918fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3919fcdc5d83SBram Moolenaar
3920fcdc5d83SBram Moolenaar  lines =<< trim END
3921fcdc5d83SBram Moolenaar      vim9script
3922fcdc5d83SBram Moolenaar      for i in range(1)
3923fcdc5d83SBram Moolenaar        var one = 'one'
3924fcdc5d83SBram Moolenaar        echo one
3925fcdc5d83SBram Moolenaar      endfor
3926fcdc5d83SBram Moolenaar      echo one
3927fcdc5d83SBram Moolenaar  END
3928fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
39299becdf2bSBram Moolenaar
39309becdf2bSBram Moolenaar  lines =<< trim END
39319becdf2bSBram Moolenaar      vim9script
39329becdf2bSBram Moolenaar      {
39339becdf2bSBram Moolenaar        var one = 'one'
39349becdf2bSBram Moolenaar        assert_equal('one', one)
39359becdf2bSBram Moolenaar      }
39369becdf2bSBram Moolenaar      assert_false(exists('one'))
39379becdf2bSBram Moolenaar      assert_false(exists('s:one'))
39389becdf2bSBram Moolenaar  END
39399becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
39409becdf2bSBram Moolenaar
39419becdf2bSBram Moolenaar  lines =<< trim END
39429becdf2bSBram Moolenaar      vim9script
39439becdf2bSBram Moolenaar      {
39449becdf2bSBram Moolenaar        var one = 'one'
39459becdf2bSBram Moolenaar        echo one
39469becdf2bSBram Moolenaar      }
39479becdf2bSBram Moolenaar      echo one
39489becdf2bSBram Moolenaar  END
39499becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3950fcdc5d83SBram Moolenaarenddef
3951fcdc5d83SBram Moolenaar
3952352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3953352134bbSBram Moolenaar  var lines =<< trim END
3954352134bbSBram Moolenaar    vim9script
39552a38908bSBram Moolenaar    def Callback(...l: list<any>)
3956352134bbSBram Moolenaar      try
3957352134bbSBram Moolenaar        var x: string
3958352134bbSBram Moolenaar        var y: string
3959352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3960352134bbSBram Moolenaar        [x, y] = ['']
3961352134bbSBram Moolenaar      catch
3962352134bbSBram Moolenaar        g:caught = 'yes'
3963352134bbSBram Moolenaar      endtry
3964352134bbSBram Moolenaar    enddef
3965e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3966352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3967352134bbSBram Moolenaar  END
3968352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3969352134bbSBram Moolenaar
3970352134bbSBram Moolenaar  unlet g:caught
3971352134bbSBram Moolenaarenddef
3972352134bbSBram Moolenaar
3973631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3974631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3975631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3976631e8f93SBram Moolenaar  endif
3977631e8f93SBram Moolenaar  var lines =<< trim END
3978631e8f93SBram Moolenaar      vim9script
3979631e8f93SBram Moolenaar      var source: list<number>
39802a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
3981631e8f93SBram Moolenaar          eval [][0]
3982631e8f93SBram Moolenaar      enddef
39832a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
3984631e8f93SBram Moolenaar          sleep 1m
3985631e8f93SBram Moolenaar          source += l
3986631e8f93SBram Moolenaar      enddef
3987e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
39886f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
39896f17a3f0SBram Moolenaar        sleep 10m
39906f17a3f0SBram Moolenaar      endwhile
3991206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3992fe95b94fSBram Moolenaar      sleep 200m
3993631e8f93SBram Moolenaar  END
3994631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3995631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3996631e8f93SBram Moolenaar  delete('Xdef')
3997631e8f93SBram Moolenaarenddef
3998631e8f93SBram Moolenaar
39994324d87aSBram Moolenaardef InvokeNormal()
40004324d87aSBram Moolenaar  exe "norm! :m+1\r"
40014324d87aSBram Moolenaarenddef
40024324d87aSBram Moolenaar
40034324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
40044324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
40054324d87aSBram Moolenaar  new
40064324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
40074324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
40084324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
40094324d87aSBram Moolenaar  xunmap <F3>
4010b5b9480eSBram Moolenaarenddef
4011b5b9480eSBram Moolenaar
4012b5b9480eSBram Moolenaardef Test_white_space_after_command()
4013b5b9480eSBram Moolenaar  var lines =<< trim END
4014b5b9480eSBram Moolenaar    exit_cb: Func})
4015b5b9480eSBram Moolenaar  END
4016b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
4017f8103f27SBram Moolenaar
4018f8103f27SBram Moolenaar  lines =<< trim END
4019f8103f27SBram Moolenaar    e#
4020f8103f27SBram Moolenaar  END
4021f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
40224324d87aSBram Moolenaarenddef
40234324d87aSBram Moolenaar
40244aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
40254aab88d9SBram Moolenaar  var lines =<< trim END
40264aab88d9SBram Moolenaar      vim9script
40274aab88d9SBram Moolenaar      if exists('g:guard')
40284aab88d9SBram Moolenaar        finish
40294aab88d9SBram Moolenaar      endif
40304aab88d9SBram Moolenaar      g:guard = 1
40314aab88d9SBram Moolenaar      var name = 'thename'
40324aab88d9SBram Moolenaar      def g:GetName(): string
40334aab88d9SBram Moolenaar        return name
40344aab88d9SBram Moolenaar      enddef
40354aab88d9SBram Moolenaar      def g:SetName(arg: string)
40364aab88d9SBram Moolenaar        name = arg
40374aab88d9SBram Moolenaar      enddef
40384aab88d9SBram Moolenaar  END
40394aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
40404aab88d9SBram Moolenaar  so XscriptTwice.vim
40414aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
40424aab88d9SBram Moolenaar  g:SetName('newname')
40434aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
40444aab88d9SBram Moolenaar  so XscriptTwice.vim
40454aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
40464aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
40474aab88d9SBram Moolenaar
40484aab88d9SBram Moolenaar  delfunc g:GetName
40494aab88d9SBram Moolenaar  delfunc g:SetName
40504aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
40514aab88d9SBram Moolenaar  unlet g:guard
40524aab88d9SBram Moolenaarenddef
40534aab88d9SBram Moolenaar
40544aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
40554aab88d9SBram Moolenaar  var exportlines =<< trim END
40564aab88d9SBram Moolenaar      vim9script
40574aab88d9SBram Moolenaar      if exists('g:guard')
40584aab88d9SBram Moolenaar        finish
40594aab88d9SBram Moolenaar      endif
40604aab88d9SBram Moolenaar      g:guard = 1
40614aab88d9SBram Moolenaar      export var name = 'someName'
40624aab88d9SBram Moolenaar  END
40634aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
40644aab88d9SBram Moolenaar
40654aab88d9SBram Moolenaar  var lines =<< trim END
40664aab88d9SBram Moolenaar      vim9script
40674aab88d9SBram Moolenaar      import name from './XexportScript.vim'
40684aab88d9SBram Moolenaar      def g:GetName(): string
40694aab88d9SBram Moolenaar        return name
40704aab88d9SBram Moolenaar      enddef
40714aab88d9SBram Moolenaar  END
40724aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
40734aab88d9SBram Moolenaar  so XscriptImport.vim
40744aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
40754aab88d9SBram Moolenaar
40764aab88d9SBram Moolenaar  so XexportScript.vim
40774aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
40784aab88d9SBram Moolenaar
40794aab88d9SBram Moolenaar  delfunc g:GetName
40804aab88d9SBram Moolenaar  delete('XexportScript.vim')
40814aab88d9SBram Moolenaar  delete('XscriptImport.vim')
40824aab88d9SBram Moolenaar  unlet g:guard
40834aab88d9SBram Moolenaarenddef
40844aab88d9SBram Moolenaar
408510b9421fSBram Moolenaardef Test_unsupported_commands()
408610b9421fSBram Moolenaar  var lines =<< trim END
408710b9421fSBram Moolenaar      ka
408810b9421fSBram Moolenaar  END
40897d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
40907d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
409110b9421fSBram Moolenaar
409210b9421fSBram Moolenaar  lines =<< trim END
4093ada1d870SBram Moolenaar      :1ka
4094ada1d870SBram Moolenaar  END
40957d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
40967d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
4097ada1d870SBram Moolenaar
4098ada1d870SBram Moolenaar  lines =<< trim END
409910b9421fSBram Moolenaar    t
410010b9421fSBram Moolenaar  END
410110b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
410210b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
410310b9421fSBram Moolenaar
410410b9421fSBram Moolenaar  lines =<< trim END
410510b9421fSBram Moolenaar    x
410610b9421fSBram Moolenaar  END
410710b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
410810b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
410910b9421fSBram Moolenaar
411010b9421fSBram Moolenaar  lines =<< trim END
411110b9421fSBram Moolenaar    xit
411210b9421fSBram Moolenaar  END
411310b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
411410b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
411510b9421fSBram Moolenaarenddef
411610b9421fSBram Moolenaar
4117c70fe460SBram Moolenaardef Test_mapping_line_number()
4118c70fe460SBram Moolenaar  var lines =<< trim END
4119c70fe460SBram Moolenaar      vim9script
4120c70fe460SBram Moolenaar      def g:FuncA()
4121c70fe460SBram Moolenaar          # Some comment
4122c70fe460SBram Moolenaar          FuncB(0)
4123c70fe460SBram Moolenaar      enddef
4124c70fe460SBram Moolenaar          # Some comment
4125c70fe460SBram Moolenaar      def FuncB(
4126c70fe460SBram Moolenaar          # Some comment
4127c70fe460SBram Moolenaar          n: number
4128c70fe460SBram Moolenaar      )
4129c70fe460SBram Moolenaar          exe 'nno '
4130c70fe460SBram Moolenaar              # Some comment
4131c70fe460SBram Moolenaar              .. '<F3> a'
4132c70fe460SBram Moolenaar              .. 'b'
4133c70fe460SBram Moolenaar              .. 'c'
4134c70fe460SBram Moolenaar      enddef
4135c70fe460SBram Moolenaar  END
4136c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
4137c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
4138c70fe460SBram Moolenaar  assert_match('No mapping found', res)
4139c70fe460SBram Moolenaar
4140c70fe460SBram Moolenaar  g:FuncA()
4141c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
4142c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4143c70fe460SBram Moolenaar
4144c70fe460SBram Moolenaar  nunmap <F3>
4145c70fe460SBram Moolenaar  delfunc g:FuncA
4146c70fe460SBram Moolenaarenddef
4147c70fe460SBram Moolenaar
4148deb108baSBram Moolenaardef Test_option_set()
4149deb108baSBram Moolenaar  # legacy script allows for white space
4150deb108baSBram Moolenaar  var lines =<< trim END
4151deb108baSBram Moolenaar      set foldlevel  =11
4152deb108baSBram Moolenaar      call assert_equal(11, &foldlevel)
4153deb108baSBram Moolenaar  END
4154deb108baSBram Moolenaar  CheckScriptSuccess(lines)
4155deb108baSBram Moolenaar
4156deb108baSBram Moolenaar  set foldlevel
4157deb108baSBram Moolenaar  set foldlevel=12
4158deb108baSBram Moolenaar  assert_equal(12, &foldlevel)
4159deb108baSBram Moolenaar  set foldlevel+=2
4160deb108baSBram Moolenaar  assert_equal(14, &foldlevel)
4161deb108baSBram Moolenaar  set foldlevel-=3
4162deb108baSBram Moolenaar  assert_equal(11, &foldlevel)
4163deb108baSBram Moolenaar
4164deb108baSBram Moolenaar  lines =<< trim END
4165deb108baSBram Moolenaar      set foldlevel =1
4166deb108baSBram Moolenaar  END
4167deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
4168deb108baSBram Moolenaar
4169deb108baSBram Moolenaar  lines =<< trim END
4170deb108baSBram Moolenaar      set foldlevel +=1
4171deb108baSBram Moolenaar  END
4172deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
4173deb108baSBram Moolenaar
4174deb108baSBram Moolenaar  lines =<< trim END
4175deb108baSBram Moolenaar      set foldlevel ^=1
4176deb108baSBram Moolenaar  END
4177deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
4178deb108baSBram Moolenaar
4179deb108baSBram Moolenaar  lines =<< trim END
4180deb108baSBram Moolenaar      set foldlevel -=1
4181deb108baSBram Moolenaar  END
4182deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
4183deb108baSBram Moolenaar
4184deb108baSBram Moolenaar  set foldlevel&
4185deb108baSBram Moolenaarenddef
4186deb108baSBram Moolenaar
4187208f0b48SBram Moolenaardef Test_option_modifier()
41881594f313SBram Moolenaar  # legacy script allows for white space
4189208f0b48SBram Moolenaar  var lines =<< trim END
4190208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
4191208f0b48SBram Moolenaar      call assert_equal(1, &hlsearch)
4192208f0b48SBram Moolenaar  END
4193208f0b48SBram Moolenaar  CheckScriptSuccess(lines)
4194208f0b48SBram Moolenaar
41951594f313SBram Moolenaar  set hlsearch
41961594f313SBram Moolenaar  set hlsearch!
41971594f313SBram Moolenaar  assert_equal(false, &hlsearch)
41981594f313SBram Moolenaar
41991594f313SBram Moolenaar  set hlsearch
4200208f0b48SBram Moolenaar  set hlsearch&
42011594f313SBram Moolenaar  assert_equal(false, &hlsearch)
4202208f0b48SBram Moolenaar
4203208f0b48SBram Moolenaar  lines =<< trim END
42041594f313SBram Moolenaar      set hlsearch &
4205208f0b48SBram Moolenaar  END
42061594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
42071594f313SBram Moolenaar
42081594f313SBram Moolenaar  lines =<< trim END
42091594f313SBram Moolenaar      set hlsearch   !
42101594f313SBram Moolenaar  END
42111594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
42121594f313SBram Moolenaar
42131594f313SBram Moolenaar  set hlsearch&
4214208f0b48SBram Moolenaarenddef
4215208f0b48SBram Moolenaar
4216c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail
4217c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number()
4218c03fe66aSBram Moolenaar  var lines =<< trim END
4219c03fe66aSBram Moolenaar      echoerr 'some'
4220c03fe66aSBram Moolenaar         .. ' error'
4221c03fe66aSBram Moolenaar         .. ' continued'
4222c03fe66aSBram Moolenaar  END
4223c03fe66aSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
4224c03fe66aSBram Moolenaarenddef
4225c03fe66aSBram Moolenaar
4226648594eaSBram Moolenaardef ProfiledWithLambda()
4227d9162550SBram Moolenaar  var n = 3
4228d9162550SBram Moolenaar  echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4229d9162550SBram Moolenaarenddef
4230d9162550SBram Moolenaar
4231648594eaSBram Moolenaardef ProfiledNested()
4232648594eaSBram Moolenaar  var x = 0
4233648594eaSBram Moolenaar  def Nested(): any
4234648594eaSBram Moolenaar      return x
4235648594eaSBram Moolenaar  enddef
4236648594eaSBram Moolenaar  Nested()
4237648594eaSBram Moolenaarenddef
4238648594eaSBram Moolenaar
4239ffcfddc7SBram Moolenaardef ProfiledNestedProfiled()
4240ffcfddc7SBram Moolenaar  var x = 0
4241ffcfddc7SBram Moolenaar  def Nested(): any
4242ffcfddc7SBram Moolenaar      return x
4243ffcfddc7SBram Moolenaar  enddef
4244ffcfddc7SBram Moolenaar  Nested()
4245ffcfddc7SBram Moolenaarenddef
4246ffcfddc7SBram Moolenaar
4247d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists.
4248d9162550SBram Moolenaar" This only tests that it works, not the profiling output.
4249d9162550SBram Moolenaardef Test_xx_profile_with_lambda()
42504ece152aSBram Moolenaar  CheckFeature profile
42514ece152aSBram Moolenaar
4252d9162550SBram Moolenaar  profile start Xprofile.log
4253648594eaSBram Moolenaar  profile func ProfiledWithLambda
4254648594eaSBram Moolenaar  ProfiledWithLambda()
4255ffcfddc7SBram Moolenaar
4256648594eaSBram Moolenaar  profile func ProfiledNested
4257648594eaSBram Moolenaar  ProfiledNested()
4258ffcfddc7SBram Moolenaar
4259ffcfddc7SBram Moolenaar  # Also profile the nested function.  Use a different function, although the
4260ffcfddc7SBram Moolenaar  # contents is the same, to make sure it was not already compiled.
4261ffcfddc7SBram Moolenaar  profile func *
4262ffcfddc7SBram Moolenaar  ProfiledNestedProfiled()
4263ffcfddc7SBram Moolenaar
4264ffcfddc7SBram Moolenaar  profdel func *
4265ffcfddc7SBram Moolenaar  profile pause
4266d9162550SBram Moolenaarenddef
4267d9162550SBram Moolenaar
4268585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
4269585fea7bSBram Moolenaardef Test_substitute_cmd()
4270585fea7bSBram Moolenaar  new
4271585fea7bSBram Moolenaar  setline(1, 'something')
4272585fea7bSBram Moolenaar  :substitute(some(other(
4273585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
4274585fea7bSBram Moolenaar  bwipe!
4275585fea7bSBram Moolenaar
4276f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
4277cfcd011fSBram Moolenaar  var lines =<< trim END
4278585fea7bSBram Moolenaar    vim9script
4279585fea7bSBram Moolenaar    new
4280585fea7bSBram Moolenaar    setline(1, 'something')
4281585fea7bSBram Moolenaar    :substitute(some(other(
4282585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
4283585fea7bSBram Moolenaar    bwipe!
4284585fea7bSBram Moolenaar  END
4285585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
4286585fea7bSBram Moolenaar  source Xvim9lines
4287585fea7bSBram Moolenaar
4288585fea7bSBram Moolenaar  delete('Xvim9lines')
4289585fea7bSBram Moolenaarenddef
4290585fea7bSBram Moolenaar
42918a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
4292