18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
7e3d4685fSBram Moolenaarsource shared.vim
837294bd6SBram Moolenaarsource screendump.vim
98a7d6542SBram Moolenaar
105d72ce69SBram Moolenaardef Test_range_only()
115d72ce69SBram Moolenaar  new
125d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
135d72ce69SBram Moolenaar  :/Blah/
145d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
15c2af0affSBram Moolenaar  bwipe!
16c2af0affSBram Moolenaar
17c2af0affSBram Moolenaar  # without range commands use current line
18c2af0affSBram Moolenaar  new
19c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
20c2af0affSBram Moolenaar  :2
21c2af0affSBram Moolenaar  print
22c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
23c2af0affSBram Moolenaar  :3
24c2af0affSBram Moolenaar  list
25c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
26b8554304SBram Moolenaar
27b8554304SBram Moolenaar  # missing command does not print the line
28b8554304SBram Moolenaar  var lines =<< trim END
29b8554304SBram Moolenaar    vim9script
30b8554304SBram Moolenaar    :1|
31b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
32b8554304SBram Moolenaar    :|
33b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
34b8554304SBram Moolenaar  END
35b8554304SBram Moolenaar  CheckScriptSuccess(lines)
36b8554304SBram Moolenaar
37c2af0affSBram Moolenaar  bwipe!
38025cb1caSBram Moolenaar
39025cb1caSBram Moolenaar  # won't generate anything
40025cb1caSBram Moolenaar  if false
41025cb1caSBram Moolenaar    :123
42025cb1caSBram Moolenaar  endif
435d72ce69SBram Moolenaarenddef
445d72ce69SBram Moolenaar
45a6e67e4fSBram Moolenaarlet g:alist = [7]
46a6e67e4fSBram Moolenaarlet g:astring = 'text'
47f0b9f43cSBram Moolenaarlet g:anumber = 123
486e587dcbSBram Moolenaar
494c17ad94SBram Moolenaardef Test_delfunction()
50f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
514c17ad94SBram Moolenaar  CheckScriptSuccess([
524c17ad94SBram Moolenaar      'vim9script',
534c17ad94SBram Moolenaar      'func CheckMe()',
544c17ad94SBram Moolenaar      '  return 123',
554c17ad94SBram Moolenaar      'endfunc',
564c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
574c17ad94SBram Moolenaar      ])
584c17ad94SBram Moolenaar
59f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
604c17ad94SBram Moolenaar  CheckScriptFailure([
614c17ad94SBram Moolenaar      'vim9script',
624c17ad94SBram Moolenaar      'func DeleteMe1()',
634c17ad94SBram Moolenaar      'endfunc',
644c17ad94SBram Moolenaar      'delfunction DeleteMe1',
654c17ad94SBram Moolenaar      ], 'E1084:')
664c17ad94SBram Moolenaar  CheckScriptFailure([
674c17ad94SBram Moolenaar      'vim9script',
684c17ad94SBram Moolenaar      'func DeleteMe2()',
694c17ad94SBram Moolenaar      'endfunc',
704c17ad94SBram Moolenaar      'def DoThat()',
714c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
724c17ad94SBram Moolenaar      'enddef',
734c17ad94SBram Moolenaar      'DoThat()',
744c17ad94SBram Moolenaar      ], 'E1084:')
754c17ad94SBram Moolenaar  CheckScriptFailure([
764c17ad94SBram Moolenaar      'vim9script',
774c17ad94SBram Moolenaar      'def DeleteMe3()',
784c17ad94SBram Moolenaar      'enddef',
794c17ad94SBram Moolenaar      'delfunction DeleteMe3',
804c17ad94SBram Moolenaar      ], 'E1084:')
814c17ad94SBram Moolenaar  CheckScriptFailure([
824c17ad94SBram Moolenaar      'vim9script',
834c17ad94SBram Moolenaar      'def DeleteMe4()',
844c17ad94SBram Moolenaar      'enddef',
854c17ad94SBram Moolenaar      'def DoThat()',
864c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
874c17ad94SBram Moolenaar      'enddef',
884c17ad94SBram Moolenaar      'DoThat()',
894c17ad94SBram Moolenaar      ], 'E1084:')
90925e9fd6SBram Moolenaar
91925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
92cfcd011fSBram Moolenaar  var lines =<< trim END
93925e9fd6SBram Moolenaar      vim9script
94925e9fd6SBram Moolenaar      def g:Global(): string
95925e9fd6SBram Moolenaar        return "yes"
96925e9fd6SBram Moolenaar      enddef
97925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
98925e9fd6SBram Moolenaar      def! g:Global(): string
99925e9fd6SBram Moolenaar        return "no"
100925e9fd6SBram Moolenaar      enddef
101925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
102925e9fd6SBram Moolenaar      delfunc g:Global
103925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
104925e9fd6SBram Moolenaar  END
105925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
106925e9fd6SBram Moolenaar
107925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
108925e9fd6SBram Moolenaar  lines =<< trim END
109925e9fd6SBram Moolenaar      vim9script
110925e9fd6SBram Moolenaar      func g:Global()
111925e9fd6SBram Moolenaar        return "yes"
112925e9fd6SBram Moolenaar      endfunc
113925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
114925e9fd6SBram Moolenaar      def! g:Global(): string
115925e9fd6SBram Moolenaar        return "no"
116925e9fd6SBram Moolenaar      enddef
117925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
118925e9fd6SBram Moolenaar      delfunc g:Global
119925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
120925e9fd6SBram Moolenaar  END
121925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
122925e9fd6SBram Moolenaar
123925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
124925e9fd6SBram Moolenaar  lines =<< trim END
125925e9fd6SBram Moolenaar      vim9script
126925e9fd6SBram Moolenaar      def g:Global(): string
127925e9fd6SBram Moolenaar        return "yes"
128925e9fd6SBram Moolenaar      enddef
129925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
130925e9fd6SBram Moolenaar      func! g:Global()
131925e9fd6SBram Moolenaar        return "no"
132925e9fd6SBram Moolenaar      endfunc
133925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
134925e9fd6SBram Moolenaar      delfunc g:Global
135925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
136925e9fd6SBram Moolenaar  END
137925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1384c17ad94SBram Moolenaarenddef
1394c17ad94SBram Moolenaar
14008052228SBram Moolenaardef Test_wrong_type()
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
143cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
144cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
145599c89c8SBram Moolenaar
146cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
147cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
14842a480bfSBram Moolenaar
149cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
150cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
151cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
152cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
153cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
154cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
155cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
156cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
157cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
158cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
159cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
160a0a9f43aSBram Moolenaar
161cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
162cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
16308052228SBram Moolenaarenddef
1648a7d6542SBram Moolenaar
16510c65860SBram Moolenaardef Test_script_wrong_type()
16610c65860SBram Moolenaar  var lines =<< trim END
16710c65860SBram Moolenaar      vim9script
16810c65860SBram Moolenaar      var s:dict: dict<string>
16910c65860SBram Moolenaar      s:dict['a'] = ['x']
17010c65860SBram Moolenaar  END
17110c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
17210c65860SBram Moolenaarenddef
17310c65860SBram Moolenaar
17408052228SBram Moolenaardef Test_const()
175cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
176cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
177cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
17830fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
17930fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
180dbeecb2bSBram Moolenaar
181cfcd011fSBram Moolenaar  var lines =<< trim END
18230fd8204SBram Moolenaar    final list = [1, 2, 3]
183dbeecb2bSBram Moolenaar    list[0] = 4
1840b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
18530fd8204SBram Moolenaar    const other = [5, 6, 7]
1860b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
18771abe482SBram Moolenaar
188cfcd011fSBram Moolenaar    var varlist = [7, 8]
18930fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
19071abe482SBram Moolenaar    varlist[0] = 77
19171abe482SBram Moolenaar    # TODO: does not work yet
19271abe482SBram Moolenaar    # constlist[1][1] = 88
193cfcd011fSBram Moolenaar    var cl = constlist[1]
19471abe482SBram Moolenaar    cl[1] = 88
19571abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
19671abe482SBram Moolenaar
197e0de171eSBram Moolenaar    var vardict = {five: 5, six: 6}
198e0de171eSBram Moolenaar    const constdict = {one: 1, two: vardict, three: 3}
19971abe482SBram Moolenaar    vardict['five'] = 55
20071abe482SBram Moolenaar    # TODO: does not work yet
20171abe482SBram Moolenaar    # constdict['two']['six'] = 66
202cfcd011fSBram Moolenaar    var cd = constdict['two']
20371abe482SBram Moolenaar    cd['six'] = 66
204e0de171eSBram Moolenaar    constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
205dbeecb2bSBram Moolenaar  END
206dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
20708052228SBram Moolenaarenddef
2088a7d6542SBram Moolenaar
2090b4c66c6SBram Moolenaardef Test_const_bang()
210cfcd011fSBram Moolenaar  var lines =<< trim END
21130fd8204SBram Moolenaar      const var = 234
2120b4c66c6SBram Moolenaar      var = 99
2130b4c66c6SBram Moolenaar  END
2140b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
2150b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
2160b4c66c6SBram Moolenaar
2170b4c66c6SBram Moolenaar  lines =<< trim END
21830fd8204SBram Moolenaar      const ll = [2, 3, 4]
2190b4c66c6SBram Moolenaar      ll[0] = 99
2200b4c66c6SBram Moolenaar  END
2210b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2220b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2230b4c66c6SBram Moolenaar
2240b4c66c6SBram Moolenaar  lines =<< trim END
22530fd8204SBram Moolenaar      const ll = [2, 3, 4]
2260b4c66c6SBram Moolenaar      ll[3] = 99
2270b4c66c6SBram Moolenaar  END
2280b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2290b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2300b4c66c6SBram Moolenaar
2310b4c66c6SBram Moolenaar  lines =<< trim END
232e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2330b4c66c6SBram Moolenaar      dd["one"] = 99
2340b4c66c6SBram Moolenaar  END
2350b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2360b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2370b4c66c6SBram Moolenaar
2380b4c66c6SBram Moolenaar  lines =<< trim END
239e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2400b4c66c6SBram Moolenaar      dd["three"] = 99
2410b4c66c6SBram Moolenaar  END
2420b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2430b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2440b4c66c6SBram Moolenaarenddef
2450b4c66c6SBram Moolenaar
246df069eecSBram Moolenaardef Test_range_no_colon()
247d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
248d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
249d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
250d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
251df069eecSBram Moolenaarenddef
252df069eecSBram Moolenaar
253df069eecSBram Moolenaar
2548a7d6542SBram Moolenaardef Test_block()
255cfcd011fSBram Moolenaar  var outer = 1
2568a7d6542SBram Moolenaar  {
257cfcd011fSBram Moolenaar    var inner = 2
2588a7d6542SBram Moolenaar    assert_equal(1, outer)
2598a7d6542SBram Moolenaar    assert_equal(2, inner)
2608a7d6542SBram Moolenaar  }
2618a7d6542SBram Moolenaar  assert_equal(1, outer)
2623f1e9f00SBram Moolenaar
2633f1e9f00SBram Moolenaar  {|echo 'yes'|}
2648a7d6542SBram Moolenaarenddef
2658a7d6542SBram Moolenaar
26608052228SBram Moolenaardef Test_block_failure()
267cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
26808052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
26908052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
27008052228SBram Moolenaarenddef
2718a7d6542SBram Moolenaar
272fbbcd003SBram Moolenaardef Test_block_local_vars()
273fbbcd003SBram Moolenaar  var lines =<< trim END
274fbbcd003SBram Moolenaar      vim9script
275ed234f24SBram Moolenaar      v:testing = 1
276fbbcd003SBram Moolenaar      if true
277ed234f24SBram Moolenaar        var text = ['hello']
278ed234f24SBram Moolenaar        def SayHello(): list<string>
279fbbcd003SBram Moolenaar          return text
280fbbcd003SBram Moolenaar        enddef
281fbbcd003SBram Moolenaar        def SetText(v: string)
282ed234f24SBram Moolenaar          text = [v]
283fbbcd003SBram Moolenaar        enddef
284fbbcd003SBram Moolenaar      endif
285fbbcd003SBram Moolenaar
286fbbcd003SBram Moolenaar      if true
287ed234f24SBram Moolenaar        var text = ['again']
288ed234f24SBram Moolenaar        def SayAgain(): list<string>
289fbbcd003SBram Moolenaar          return text
290fbbcd003SBram Moolenaar        enddef
291fbbcd003SBram Moolenaar      endif
292ed234f24SBram Moolenaar
293ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
294ed234f24SBram Moolenaar      test_garbagecollect_now()
295ed234f24SBram Moolenaar
296fbbcd003SBram Moolenaar      defcompile
297fbbcd003SBram Moolenaar
298ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
299ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
300fbbcd003SBram Moolenaar
301fbbcd003SBram Moolenaar      SetText('foobar')
302ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
303ed234f24SBram Moolenaar
304ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
305ed234f24SBram Moolenaar      qall!
306fbbcd003SBram Moolenaar  END
307ed234f24SBram Moolenaar
308ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
309ed234f24SBram Moolenaar  # context gets garbage collected.
310ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
311ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
312ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
313ed234f24SBram Moolenaar
314ed234f24SBram Moolenaar  delete('Xscript')
315ed234f24SBram Moolenaar  delete('Xdidit')
316fbbcd003SBram Moolenaarenddef
317fbbcd003SBram Moolenaar
31839ca4127SBram Moolenaardef Test_block_local_vars_with_func()
31939ca4127SBram Moolenaar  var lines =<< trim END
32039ca4127SBram Moolenaar      vim9script
32139ca4127SBram Moolenaar      if true
32239ca4127SBram Moolenaar        var foo = 'foo'
32339ca4127SBram Moolenaar        if true
32439ca4127SBram Moolenaar          var bar = 'bar'
32539ca4127SBram Moolenaar          def Func(): list<string>
32639ca4127SBram Moolenaar            return [foo, bar]
32739ca4127SBram Moolenaar          enddef
32839ca4127SBram Moolenaar        endif
32939ca4127SBram Moolenaar      endif
33039ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
33139ca4127SBram Moolenaar      # "foo" and "bar"
33239ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
33339ca4127SBram Moolenaar  END
33439ca4127SBram Moolenaar  CheckScriptSuccess(lines)
33539ca4127SBram Moolenaarenddef
33639ca4127SBram Moolenaar
337d032f34aSBram Moolenaarfunc g:NoSuchFunc()
338d032f34aSBram Moolenaar  echo 'none'
339d032f34aSBram Moolenaarendfunc
340d032f34aSBram Moolenaar
3419e1d9e34SBram Moolenaardef Test_try_catch_throw()
342cfcd011fSBram Moolenaar  var l = []
3437a092245SBram Moolenaar  try # comment
3448a7d6542SBram Moolenaar    add(l, '1')
3458a7d6542SBram Moolenaar    throw 'wrong'
3468a7d6542SBram Moolenaar    add(l, '2')
3477a092245SBram Moolenaar  catch # comment
3488a7d6542SBram Moolenaar    add(l, v:exception)
3497a092245SBram Moolenaar  finally # comment
3508a7d6542SBram Moolenaar    add(l, '3')
3517a092245SBram Moolenaar  endtry # comment
3528a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
35368d130c6SBram Moolenaar
354e859312eSBram Moolenaar  l = []
355e859312eSBram Moolenaar  try
356e859312eSBram Moolenaar    try
357e859312eSBram Moolenaar      add(l, '1')
358e859312eSBram Moolenaar      throw 'wrong'
359e859312eSBram Moolenaar      add(l, '2')
360e859312eSBram Moolenaar    catch /right/
361e859312eSBram Moolenaar      add(l, v:exception)
362e859312eSBram Moolenaar    endtry
363e859312eSBram Moolenaar  catch /wrong/
364e859312eSBram Moolenaar    add(l, 'caught')
365373863edSBram Moolenaar  fina
366e859312eSBram Moolenaar    add(l, 'finally')
367e859312eSBram Moolenaar  endtry
368e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
369e859312eSBram Moolenaar
370cfcd011fSBram Moolenaar  var n: number
37168d130c6SBram Moolenaar  try
37268d130c6SBram Moolenaar    n = l[3]
37368d130c6SBram Moolenaar  catch /E684:/
37468d130c6SBram Moolenaar    n = 99
37568d130c6SBram Moolenaar  endtry
37668d130c6SBram Moolenaar  assert_equal(99, n)
37768d130c6SBram Moolenaar
37869f7050cSBram Moolenaar  var done = 'no'
37969f7050cSBram Moolenaar  if 0
38069f7050cSBram Moolenaar    try | catch | endtry
38169f7050cSBram Moolenaar  else
38269f7050cSBram Moolenaar    done = 'yes'
38369f7050cSBram Moolenaar  endif
38469f7050cSBram Moolenaar  assert_equal('yes', done)
38569f7050cSBram Moolenaar
38669f7050cSBram Moolenaar  done = 'no'
38769f7050cSBram Moolenaar  if 1
38869f7050cSBram Moolenaar    done = 'yes'
38969f7050cSBram Moolenaar  else
39069f7050cSBram Moolenaar    try | catch | endtry
39169f7050cSBram Moolenaar    done = 'never'
39269f7050cSBram Moolenaar  endif
39369f7050cSBram Moolenaar  assert_equal('yes', done)
39469f7050cSBram Moolenaar
39569f7050cSBram Moolenaar  if 1
39669f7050cSBram Moolenaar  else
39769f7050cSBram Moolenaar    try | catch /pat/ | endtry
39869f7050cSBram Moolenaar    try | catch /pat/
39969f7050cSBram Moolenaar    endtry
40069f7050cSBram Moolenaar    try
40169f7050cSBram Moolenaar    catch /pat/ | endtry
40269f7050cSBram Moolenaar    try
40369f7050cSBram Moolenaar    catch /pat/
40469f7050cSBram Moolenaar    endtry
40569f7050cSBram Moolenaar  endif
40669f7050cSBram Moolenaar
40768d130c6SBram Moolenaar  try
408cc673e74SBram Moolenaar    # string slice returns a string, not a number
40968d130c6SBram Moolenaar    n = g:astring[3]
4105e654230SBram Moolenaar  catch /E1012:/
41168d130c6SBram Moolenaar    n = 77
41268d130c6SBram Moolenaar  endtry
41368d130c6SBram Moolenaar  assert_equal(77, n)
41468d130c6SBram Moolenaar
41568d130c6SBram Moolenaar  try
41668d130c6SBram Moolenaar    n = l[g:astring]
4175e654230SBram Moolenaar  catch /E1012:/
41856acb094SBram Moolenaar    n = 88
41968d130c6SBram Moolenaar  endtry
42056acb094SBram Moolenaar  assert_equal(88, n)
42168d130c6SBram Moolenaar
42268d130c6SBram Moolenaar  try
42368d130c6SBram Moolenaar    n = s:does_not_exist
42468d130c6SBram Moolenaar  catch /E121:/
425f0b9f43cSBram Moolenaar    n = 111
426f0b9f43cSBram Moolenaar  endtry
427f0b9f43cSBram Moolenaar  assert_equal(111, n)
428f0b9f43cSBram Moolenaar
429f0b9f43cSBram Moolenaar  try
430f0b9f43cSBram Moolenaar    n = g:does_not_exist
431f0b9f43cSBram Moolenaar  catch /E121:/
43268d130c6SBram Moolenaar    n = 121
43368d130c6SBram Moolenaar  endtry
43468d130c6SBram Moolenaar  assert_equal(121, n)
43568d130c6SBram Moolenaar
436e0de171eSBram Moolenaar  var d = {one: 1}
43768d130c6SBram Moolenaar  try
43868d130c6SBram Moolenaar    n = d[g:astring]
43968d130c6SBram Moolenaar  catch /E716:/
44068d130c6SBram Moolenaar    n = 222
44168d130c6SBram Moolenaar  endtry
44268d130c6SBram Moolenaar  assert_equal(222, n)
443f0b9f43cSBram Moolenaar
444f0b9f43cSBram Moolenaar  try
445f0b9f43cSBram Moolenaar    n = -g:astring
446f0b9f43cSBram Moolenaar  catch /E39:/
447f0b9f43cSBram Moolenaar    n = 233
448f0b9f43cSBram Moolenaar  endtry
449f0b9f43cSBram Moolenaar  assert_equal(233, n)
450f0b9f43cSBram Moolenaar
451f0b9f43cSBram Moolenaar  try
452f0b9f43cSBram Moolenaar    n = +g:astring
453f0b9f43cSBram Moolenaar  catch /E1030:/
454f0b9f43cSBram Moolenaar    n = 244
455f0b9f43cSBram Moolenaar  endtry
456f0b9f43cSBram Moolenaar  assert_equal(244, n)
457f0b9f43cSBram Moolenaar
458f0b9f43cSBram Moolenaar  try
459f0b9f43cSBram Moolenaar    n = +g:alist
460f0b9f43cSBram Moolenaar  catch /E745:/
461f0b9f43cSBram Moolenaar    n = 255
462f0b9f43cSBram Moolenaar  endtry
463f0b9f43cSBram Moolenaar  assert_equal(255, n)
464f0b9f43cSBram Moolenaar
465cfcd011fSBram Moolenaar  var nd: dict<any>
466f0b9f43cSBram Moolenaar  try
4672e5910bfSBram Moolenaar    nd = {[g:alist]: 1}
4682e5910bfSBram Moolenaar  catch /E1105:/
469f0b9f43cSBram Moolenaar    n = 266
470f0b9f43cSBram Moolenaar  endtry
471f0b9f43cSBram Moolenaar  assert_equal(266, n)
472f0b9f43cSBram Moolenaar
473f0b9f43cSBram Moolenaar  try
474f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
475f0b9f43cSBram Moolenaar  catch /E1093:/
476f0b9f43cSBram Moolenaar    n = 277
477f0b9f43cSBram Moolenaar  endtry
478f0b9f43cSBram Moolenaar  assert_equal(277, n)
479f0b9f43cSBram Moolenaar
480e859312eSBram Moolenaar  try
481e859312eSBram Moolenaar    &ts = g:astring
4825e654230SBram Moolenaar  catch /E1012:/
483e859312eSBram Moolenaar    n = 288
484e859312eSBram Moolenaar  endtry
485e859312eSBram Moolenaar  assert_equal(288, n)
486e859312eSBram Moolenaar
487e859312eSBram Moolenaar  try
488e859312eSBram Moolenaar    &backspace = 'asdf'
489e859312eSBram Moolenaar  catch /E474:/
490e859312eSBram Moolenaar    n = 299
491e859312eSBram Moolenaar  endtry
492e859312eSBram Moolenaar  assert_equal(299, n)
493e859312eSBram Moolenaar
494e859312eSBram Moolenaar  l = [1]
495e859312eSBram Moolenaar  try
496e859312eSBram Moolenaar    l[3] = 3
497e859312eSBram Moolenaar  catch /E684:/
498e859312eSBram Moolenaar    n = 300
499e859312eSBram Moolenaar  endtry
500e859312eSBram Moolenaar  assert_equal(300, n)
501e859312eSBram Moolenaar
502e859312eSBram Moolenaar  try
503e859312eSBram Moolenaar    unlet g:does_not_exist
504e859312eSBram Moolenaar  catch /E108:/
505e859312eSBram Moolenaar    n = 322
506e859312eSBram Moolenaar  endtry
507e859312eSBram Moolenaar  assert_equal(322, n)
508e859312eSBram Moolenaar
509e859312eSBram Moolenaar  try
5102bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
511e859312eSBram Moolenaar  catch /E721:/
512e859312eSBram Moolenaar    n = 333
513e859312eSBram Moolenaar  endtry
514e859312eSBram Moolenaar  assert_equal(333, n)
515e859312eSBram Moolenaar
516e859312eSBram Moolenaar  try
517e859312eSBram Moolenaar    l = DeletedFunc()
518e859312eSBram Moolenaar  catch /E933:/
519e859312eSBram Moolenaar    n = 344
520e859312eSBram Moolenaar  endtry
521e859312eSBram Moolenaar  assert_equal(344, n)
522d032f34aSBram Moolenaar
523d032f34aSBram Moolenaar  try
524d032f34aSBram Moolenaar    echo len(v:true)
525d032f34aSBram Moolenaar  catch /E701:/
526d032f34aSBram Moolenaar    n = 355
527d032f34aSBram Moolenaar  endtry
528d032f34aSBram Moolenaar  assert_equal(355, n)
529d032f34aSBram Moolenaar
530cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
531d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
532d032f34aSBram Moolenaar  try
533d032f34aSBram Moolenaar    echo P()
534d032f34aSBram Moolenaar  catch /E117:/
535d032f34aSBram Moolenaar    n = 366
536d032f34aSBram Moolenaar  endtry
537d032f34aSBram Moolenaar  assert_equal(366, n)
538d032f34aSBram Moolenaar
539d032f34aSBram Moolenaar  try
540d032f34aSBram Moolenaar    echo g:NoSuchFunc()
541d032f34aSBram Moolenaar  catch /E117:/
542d032f34aSBram Moolenaar    n = 377
543d032f34aSBram Moolenaar  endtry
544d032f34aSBram Moolenaar  assert_equal(377, n)
545d032f34aSBram Moolenaar
546d032f34aSBram Moolenaar  try
547d032f34aSBram Moolenaar    echo g:alist + 4
548d032f34aSBram Moolenaar  catch /E745:/
549d032f34aSBram Moolenaar    n = 388
550d032f34aSBram Moolenaar  endtry
551d032f34aSBram Moolenaar  assert_equal(388, n)
552d032f34aSBram Moolenaar
553d032f34aSBram Moolenaar  try
554d032f34aSBram Moolenaar    echo 4 + g:alist
555d032f34aSBram Moolenaar  catch /E745:/
556d032f34aSBram Moolenaar    n = 399
557d032f34aSBram Moolenaar  endtry
558d032f34aSBram Moolenaar  assert_equal(399, n)
559d032f34aSBram Moolenaar
560d032f34aSBram Moolenaar  try
561d032f34aSBram Moolenaar    echo g:alist.member
562d032f34aSBram Moolenaar  catch /E715:/
563d032f34aSBram Moolenaar    n = 400
564d032f34aSBram Moolenaar  endtry
565d032f34aSBram Moolenaar  assert_equal(400, n)
566d032f34aSBram Moolenaar
567d032f34aSBram Moolenaar  try
568d032f34aSBram Moolenaar    echo d.member
569d032f34aSBram Moolenaar  catch /E716:/
570d032f34aSBram Moolenaar    n = 411
571d032f34aSBram Moolenaar  endtry
572d032f34aSBram Moolenaar  assert_equal(411, n)
573d9d7789bSBram Moolenaar
574d9d7789bSBram Moolenaar  var counter = 0
575d9d7789bSBram Moolenaar  for i in range(4)
576d9d7789bSBram Moolenaar    try
577d9d7789bSBram Moolenaar      eval [][0]
578d9d7789bSBram Moolenaar    catch
579d9d7789bSBram Moolenaar    endtry
580d9d7789bSBram Moolenaar    counter += 1
581d9d7789bSBram Moolenaar  endfor
582d9d7789bSBram Moolenaar  assert_equal(4, counter)
5837e82c5f3SBram Moolenaar
5847e82c5f3SBram Moolenaar  # return in finally after empty catch
5857e82c5f3SBram Moolenaar  def ReturnInFinally(): number
5867e82c5f3SBram Moolenaar    try
5877e82c5f3SBram Moolenaar    finally
5887e82c5f3SBram Moolenaar      return 4
5897e82c5f3SBram Moolenaar    endtry
5907e82c5f3SBram Moolenaar    return 2
5917e82c5f3SBram Moolenaar  enddef
5927e82c5f3SBram Moolenaar  assert_equal(4, ReturnInFinally())
5938a7d6542SBram Moolenaarenddef
5948a7d6542SBram Moolenaar
5952e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to
5962e34c34bSBram Moolenaardef TryContinueFunc()
5972e34c34bSBram Moolenaar while g:Count < 2
5982e34c34bSBram Moolenaar   g:sequence ..= 't'
5992e34c34bSBram Moolenaar    try
6002e34c34bSBram Moolenaar      echoerr 'Test'
6012e34c34bSBram Moolenaar    catch
6022e34c34bSBram Moolenaar      g:Count += 1
6032e34c34bSBram Moolenaar      g:sequence ..= 'c'
6042e34c34bSBram Moolenaar      continue
6052e34c34bSBram Moolenaar    endtry
6062e34c34bSBram Moolenaar    g:sequence ..= 'e'
6072e34c34bSBram Moolenaar    g:Count += 1
6082e34c34bSBram Moolenaar  endwhile
6092e34c34bSBram Moolenaarenddef
6102e34c34bSBram Moolenaar
6112e34c34bSBram Moolenaardef Test_continue_in_try_in_while()
6122e34c34bSBram Moolenaar  g:Count = 0
6132e34c34bSBram Moolenaar  g:sequence = ''
6142e34c34bSBram Moolenaar  TryContinueFunc()
6152e34c34bSBram Moolenaar  assert_equal('tctc', g:sequence)
6162e34c34bSBram Moolenaar  unlet g:Count
6172e34c34bSBram Moolenaar  unlet g:sequence
6182e34c34bSBram Moolenaarenddef
6192e34c34bSBram Moolenaar
6209cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
6219cb577a6SBram Moolenaar  # return in try block returns normally
6229cb577a6SBram Moolenaar  def ReturnInTry(): string
6239cb577a6SBram Moolenaar    try
6249cb577a6SBram Moolenaar      return '"some message"'
6259cb577a6SBram Moolenaar    catch
6269cb577a6SBram Moolenaar    endtry
6279cb577a6SBram Moolenaar    return 'not reached'
6289cb577a6SBram Moolenaar  enddef
6299cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
6309cb577a6SBram Moolenaarenddef
6319cb577a6SBram Moolenaar
6321430ceebSBram Moolenaardef Test_cnext_works_in_catch()
6331430ceebSBram Moolenaar  var lines =<< trim END
6341430ceebSBram Moolenaar      vim9script
6351430ceebSBram Moolenaar      au BufEnter * eval 0
6361430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
6371430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
6381430ceebSBram Moolenaar      var items = [
6391430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
6401430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
6411430ceebSBram Moolenaar        ]
6421430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
6431430ceebSBram Moolenaar      cwindow
6441430ceebSBram Moolenaar
6451430ceebSBram Moolenaar      def CnextOrCfirst()
6461430ceebSBram Moolenaar        # if cnext fails, cfirst is used
6471430ceebSBram Moolenaar        try
6481430ceebSBram Moolenaar          cnext
6491430ceebSBram Moolenaar        catch
6501430ceebSBram Moolenaar          cfirst
6511430ceebSBram Moolenaar        endtry
6521430ceebSBram Moolenaar      enddef
6531430ceebSBram Moolenaar
6541430ceebSBram Moolenaar      CnextOrCfirst()
6551430ceebSBram Moolenaar      CnextOrCfirst()
6561430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
6571430ceebSBram Moolenaar      qall
6581430ceebSBram Moolenaar  END
6591430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
6601430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
6611430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
6621430ceebSBram Moolenaar
6631430ceebSBram Moolenaar  delete('Xfile1')
6641430ceebSBram Moolenaar  delete('Xfile2')
6651430ceebSBram Moolenaar  delete('XCatchCnext')
6661430ceebSBram Moolenaar  delete('Xresult')
6671430ceebSBram Moolenaarenddef
6681430ceebSBram Moolenaar
6699e1d9e34SBram Moolenaardef Test_throw_skipped()
6709e1d9e34SBram Moolenaar  if 0
6719e1d9e34SBram Moolenaar    throw dontgethere
6729e1d9e34SBram Moolenaar  endif
6739e1d9e34SBram Moolenaarenddef
6749e1d9e34SBram Moolenaar
6758f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
6768f81b22eSBram Moolenaar  var lines =<< trim END
6778f81b22eSBram Moolenaar    vim9script
6788f81b22eSBram Moolenaar    def Func()
6798f81b22eSBram Moolenaar      throw 'error'
6808f81b22eSBram Moolenaar    enddef
6818f81b22eSBram Moolenaar    silent! Func()
6828f81b22eSBram Moolenaar  END
6838f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
6848f81b22eSBram Moolenaar  source XthrowSilenced
6858f81b22eSBram Moolenaar  delete('XthrowSilenced')
6868f81b22eSBram Moolenaarenddef
6878f81b22eSBram Moolenaar
688e859312eSBram Moolenaardef DeletedFunc(): list<any>
689e859312eSBram Moolenaar  return ['delete me']
690e859312eSBram Moolenaarenddef
691e859312eSBram Moolenaardefcompile
692e859312eSBram Moolenaardelfunc DeletedFunc
693e859312eSBram Moolenaar
694257cc5eeSBram Moolenaardef ThrowFromDef()
695a72cfb80SBram Moolenaar  throw "getout" # comment
696257cc5eeSBram Moolenaarenddef
697257cc5eeSBram Moolenaar
698257cc5eeSBram Moolenaarfunc CatchInFunc()
699257cc5eeSBram Moolenaar  try
700257cc5eeSBram Moolenaar    call ThrowFromDef()
701257cc5eeSBram Moolenaar  catch
702257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
703257cc5eeSBram Moolenaar  endtry
704257cc5eeSBram Moolenaarendfunc
705257cc5eeSBram Moolenaar
706257cc5eeSBram Moolenaardef CatchInDef()
707257cc5eeSBram Moolenaar  try
708257cc5eeSBram Moolenaar    ThrowFromDef()
709257cc5eeSBram Moolenaar  catch
710257cc5eeSBram Moolenaar    g:thrown_def = v:exception
711257cc5eeSBram Moolenaar  endtry
712257cc5eeSBram Moolenaarenddef
713257cc5eeSBram Moolenaar
714f575adffSBram Moolenaardef ReturnFinally(): string
715f575adffSBram Moolenaar  try
716f575adffSBram Moolenaar    return 'intry'
717373863edSBram Moolenaar  finall
718f575adffSBram Moolenaar    g:in_finally = 'finally'
719f575adffSBram Moolenaar  endtry
720f575adffSBram Moolenaar  return 'end'
721f575adffSBram Moolenaarenddef
722f575adffSBram Moolenaar
723257cc5eeSBram Moolenaardef Test_try_catch_nested()
724257cc5eeSBram Moolenaar  CatchInFunc()
725257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
726257cc5eeSBram Moolenaar
727257cc5eeSBram Moolenaar  CatchInDef()
728257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
729f575adffSBram Moolenaar
730f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
731f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
732f575adffSBram Moolenaarenddef
733f575adffSBram Moolenaar
7349939f57bSBram Moolenaardef TryOne(): number
7359939f57bSBram Moolenaar  try
7369939f57bSBram Moolenaar    return 0
7379939f57bSBram Moolenaar  catch
7389939f57bSBram Moolenaar  endtry
7399939f57bSBram Moolenaar  return 0
7409939f57bSBram Moolenaarenddef
7419939f57bSBram Moolenaar
7429939f57bSBram Moolenaardef TryTwo(n: number): string
7439939f57bSBram Moolenaar  try
744cfcd011fSBram Moolenaar    var x = {}
7459939f57bSBram Moolenaar  catch
7469939f57bSBram Moolenaar  endtry
7479939f57bSBram Moolenaar  return 'text'
7489939f57bSBram Moolenaarenddef
7499939f57bSBram Moolenaar
7509939f57bSBram Moolenaardef Test_try_catch_twice()
7519939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
7529939f57bSBram Moolenaarenddef
7539939f57bSBram Moolenaar
754f575adffSBram Moolenaardef Test_try_catch_match()
755cfcd011fSBram Moolenaar  var seq = 'a'
756f575adffSBram Moolenaar  try
757f575adffSBram Moolenaar    throw 'something'
758f575adffSBram Moolenaar  catch /nothing/
759f575adffSBram Moolenaar    seq ..= 'x'
760f575adffSBram Moolenaar  catch /some/
761f575adffSBram Moolenaar    seq ..= 'b'
762f575adffSBram Moolenaar  catch /asdf/
763f575adffSBram Moolenaar    seq ..= 'x'
764e8c4abbbSBram Moolenaar  catch ?a\?sdf?
765e8c4abbbSBram Moolenaar    seq ..= 'y'
766f575adffSBram Moolenaar  finally
767f575adffSBram Moolenaar    seq ..= 'c'
768f575adffSBram Moolenaar  endtry
769f575adffSBram Moolenaar  assert_equal('abc', seq)
770257cc5eeSBram Moolenaarenddef
771257cc5eeSBram Moolenaar
772e8c4abbbSBram Moolenaardef Test_try_catch_fails()
773d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
774d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
775d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
776d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
777d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
778d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
779d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
780d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
78113106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
782d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
783585fea7bSBram Moolenaar
784e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
785d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
786e8c4abbbSBram Moolenaarenddef
787e8c4abbbSBram Moolenaar
7887c5b3c03SBram Moolenaardef Try_catch_skipped()
7897c5b3c03SBram Moolenaar  var l = []
7907c5b3c03SBram Moolenaar  try
7917c5b3c03SBram Moolenaar  finally
7927c5b3c03SBram Moolenaar  endtry
7937c5b3c03SBram Moolenaar
7947c5b3c03SBram Moolenaar  if 1
7957c5b3c03SBram Moolenaar  else
7967c5b3c03SBram Moolenaar    try
7977c5b3c03SBram Moolenaar    endtry
7987c5b3c03SBram Moolenaar  endif
7997c5b3c03SBram Moolenaarenddef
8007c5b3c03SBram Moolenaar
8017c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
8027c5b3c03SBram Moolenaardef Test_try_catch_skipped()
8037c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
8047c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
8057c5b3c03SBram Moolenaarenddef
8067c5b3c03SBram Moolenaar
8077c5b3c03SBram Moolenaar
8087c5b3c03SBram Moolenaar
809006ad48bSBram Moolenaardef Test_throw_vimscript()
810f5be8cdbSBram Moolenaar  # only checks line continuation
811cfcd011fSBram Moolenaar  var lines =<< trim END
812006ad48bSBram Moolenaar      vim9script
813006ad48bSBram Moolenaar      try
814006ad48bSBram Moolenaar        throw 'one'
815006ad48bSBram Moolenaar              .. 'two'
816006ad48bSBram Moolenaar      catch
817006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
818006ad48bSBram Moolenaar      endtry
819006ad48bSBram Moolenaar  END
820006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
8211e021e63SBram Moolenaar
8221e021e63SBram Moolenaar  lines =<< trim END
8231e021e63SBram Moolenaar    vim9script
824352134bbSBram Moolenaar    @r = ''
8251e021e63SBram Moolenaar    def Func()
8261e021e63SBram Moolenaar      throw @r
8271e021e63SBram Moolenaar    enddef
8281e021e63SBram Moolenaar    var result = ''
8291e021e63SBram Moolenaar    try
8301e021e63SBram Moolenaar      Func()
8311e021e63SBram Moolenaar    catch /E1129:/
8321e021e63SBram Moolenaar      result = 'caught'
8331e021e63SBram Moolenaar    endtry
8341e021e63SBram Moolenaar    assert_equal('caught', result)
8351e021e63SBram Moolenaar  END
8361e021e63SBram Moolenaar  CheckScriptSuccess(lines)
837006ad48bSBram Moolenaarenddef
838006ad48bSBram Moolenaar
839ed677f55SBram Moolenaardef Test_error_in_nested_function()
84003dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
841cfcd011fSBram Moolenaar  var lines =<< trim END
842ed677f55SBram Moolenaar      vim9script
843ed677f55SBram Moolenaar      def Func()
844ed677f55SBram Moolenaar        Error()
845ed677f55SBram Moolenaar        g:test_var = 1
846ed677f55SBram Moolenaar      enddef
847ed677f55SBram Moolenaar      func Error() abort
848ed677f55SBram Moolenaar        eval [][0]
849ed677f55SBram Moolenaar      endfunc
850ed677f55SBram Moolenaar      Func()
851ed677f55SBram Moolenaar  END
852ed677f55SBram Moolenaar  g:test_var = 0
853ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
854ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
855ed677f55SBram Moolenaarenddef
856ed677f55SBram Moolenaar
85737c83711SBram Moolenaardef Test_cexpr_vimscript()
858f5be8cdbSBram Moolenaar  # only checks line continuation
85937c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
860cfcd011fSBram Moolenaar  var lines =<< trim END
86137c83711SBram Moolenaar      vim9script
86237c83711SBram Moolenaar      cexpr 'File'
86337c83711SBram Moolenaar                .. ' someFile' ..
86437c83711SBram Moolenaar                   ' line 19'
86537c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
86637c83711SBram Moolenaar  END
86737c83711SBram Moolenaar  CheckScriptSuccess(lines)
86837c83711SBram Moolenaar  set errorformat&
86937c83711SBram Moolenaarenddef
87037c83711SBram Moolenaar
871c9edd6b5SBram Moolenaardef Test_statusline_syntax()
872c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
873cfcd011fSBram Moolenaar  var lines =<< trim END
874c9edd6b5SBram Moolenaar      vim9script
875c9edd6b5SBram Moolenaar      func g:Status()
876c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
877c9edd6b5SBram Moolenaar      endfunc
878c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
879c9edd6b5SBram Moolenaar      redrawstatus
880c9edd6b5SBram Moolenaar      set laststatus statusline=
881c9edd6b5SBram Moolenaar  END
882c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
883c9edd6b5SBram Moolenaarenddef
884c9edd6b5SBram Moolenaar
885b209750bSBram Moolenaardef Test_list_vimscript()
886b209750bSBram Moolenaar  # checks line continuation and comments
887cfcd011fSBram Moolenaar  var lines =<< trim END
888b209750bSBram Moolenaar      vim9script
889cfcd011fSBram Moolenaar      var mylist = [
890b209750bSBram Moolenaar            'one',
891b209750bSBram Moolenaar            # comment
892b209750bSBram Moolenaar            'two', # empty line follows
893b209750bSBram Moolenaar
894b209750bSBram Moolenaar            'three',
895b209750bSBram Moolenaar            ]
896b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
897b209750bSBram Moolenaar  END
898b209750bSBram Moolenaar  CheckScriptSuccess(lines)
89966250c93SBram Moolenaar
90066250c93SBram Moolenaar  # check all lines from heredoc are kept
90166250c93SBram Moolenaar  lines =<< trim END
90266250c93SBram Moolenaar      # comment 1
90366250c93SBram Moolenaar      two
90466250c93SBram Moolenaar      # comment 3
90566250c93SBram Moolenaar
90666250c93SBram Moolenaar      five
90766250c93SBram Moolenaar      # comment 6
90866250c93SBram Moolenaar  END
90966250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
9104bce26bbSBram Moolenaar
9114bce26bbSBram Moolenaar  lines =<< trim END
9124bce26bbSBram Moolenaar    [{
9134bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
9144bce26bbSBram Moolenaar  END
9154bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
916b209750bSBram Moolenaarenddef
917b209750bSBram Moolenaar
9182a1381c3SBram Moolenaarif has('channel')
91940ee466cSBram Moolenaar  let someJob = test_null_job()
92040ee466cSBram Moolenaar
92140ee466cSBram Moolenaar  def FuncWithError()
92240ee466cSBram Moolenaar    echomsg g:someJob
92340ee466cSBram Moolenaar  enddef
92440ee466cSBram Moolenaar
92540ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
92640ee466cSBram Moolenaar    try
92740ee466cSBram Moolenaar      call FuncWithError()
92840ee466cSBram Moolenaar    catch
92940ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
93040ee466cSBram Moolenaar    endtry
93140ee466cSBram Moolenaar  endfunc
9322a1381c3SBram Moolenaarendif
93340ee466cSBram Moolenaar
9348a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
9358a7d6542SBram Moolenaar  vim9script
936cfcd011fSBram Moolenaar  var name: string = 'bob'
9378a7d6542SBram Moolenaar  def Concat(arg: string): string
9388a7d6542SBram Moolenaar    return name .. arg
9398a7d6542SBram Moolenaar  enddef
940227a69deSBram Moolenaar  g:result = Concat('bie')
941227a69deSBram Moolenaar  g:localname = name
9428a7d6542SBram Moolenaar
9438a7d6542SBram Moolenaar  export const CONST = 1234
944cfcd011fSBram Moolenaar  export var exported = 9876
945cfcd011fSBram Moolenaar  export var exp_name = 'John'
9468a7d6542SBram Moolenaar  export def Exported(): string
9478a7d6542SBram Moolenaar    return 'Exported'
9488a7d6542SBram Moolenaar  enddef
9490f2a5cc6SBram Moolenaar  export final theList = [1]
9508a7d6542SBram MoolenaarEND
9518a7d6542SBram Moolenaar
952b3ca9824SBram Moolenaardef Undo_export_script_lines()
953b3ca9824SBram Moolenaar  unlet g:result
954b3ca9824SBram Moolenaar  unlet g:localname
955b3ca9824SBram Moolenaarenddef
956b3ca9824SBram Moolenaar
9575269bd2aSBram Moolenaardef Test_vim9_import_export()
958cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
9598a7d6542SBram Moolenaar    vim9script
9608a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
9618a7d6542SBram Moolenaar    g:imported = exported
9626e587dcbSBram Moolenaar    exported += 3
9636e587dcbSBram Moolenaar    g:imported_added = exported
9648a7d6542SBram Moolenaar    g:imported_func = Exported()
9656e587dcbSBram Moolenaar
96640f4f7a4SBram Moolenaar    def GetExported(): string
967e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
96840f4f7a4SBram Moolenaar      return local_dict.ref()
96940f4f7a4SBram Moolenaar    enddef
97040f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
97140f4f7a4SBram Moolenaar
9726e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
9736e587dcbSBram Moolenaar    g:imported_name = exp_name
9746e587dcbSBram Moolenaar    exp_name ..= ' Doe'
9756e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
9765381c7a1SBram Moolenaar    g:imported_later = exported
9770f2a5cc6SBram Moolenaar
9780f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
9790f2a5cc6SBram Moolenaar    theList->add(2)
9800f2a5cc6SBram Moolenaar    assert_equal([1, 2], theList)
9818a7d6542SBram Moolenaar  END
9828a7d6542SBram Moolenaar
9838a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
9848a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
9858a7d6542SBram Moolenaar
9868a7d6542SBram Moolenaar  source Ximport.vim
9878a7d6542SBram Moolenaar
9888a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
9898a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
9908a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
9916e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
9925381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
9938a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
99440f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
9956e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
9966e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
9978a7d6542SBram Moolenaar  assert_false(exists('g:name'))
9988a7d6542SBram Moolenaar
999b3ca9824SBram Moolenaar  Undo_export_script_lines()
10008a7d6542SBram Moolenaar  unlet g:imported
10016e587dcbSBram Moolenaar  unlet g:imported_added
10025381c7a1SBram Moolenaar  unlet g:imported_later
10038a7d6542SBram Moolenaar  unlet g:imported_func
10046e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
10058a7d6542SBram Moolenaar  delete('Ximport.vim')
1006f2d5c240SBram Moolenaar
10071c991144SBram Moolenaar  # similar, with line breaks
1008cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
10091c991144SBram Moolenaar    vim9script
10101c991144SBram Moolenaar    import {
10111c991144SBram Moolenaar        exported,
10121c991144SBram Moolenaar        Exported,
10131c991144SBram Moolenaar        }
10141c991144SBram Moolenaar        from
10151c991144SBram Moolenaar        './Xexport.vim'
10161c991144SBram Moolenaar    g:imported = exported
10171c991144SBram Moolenaar    exported += 5
10181c991144SBram Moolenaar    g:imported_added = exported
10191c991144SBram Moolenaar    g:imported_func = Exported()
10201c991144SBram Moolenaar  END
10211c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
10221c991144SBram Moolenaar  source Ximport_lbr.vim
10231c991144SBram Moolenaar
10241c991144SBram Moolenaar  assert_equal(9876, g:imported)
10251c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
10261c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
10271c991144SBram Moolenaar
10281c991144SBram Moolenaar  # exported script not sourced again
10291c991144SBram Moolenaar  assert_false(exists('g:result'))
10301c991144SBram Moolenaar  unlet g:imported
10311c991144SBram Moolenaar  unlet g:imported_added
10321c991144SBram Moolenaar  unlet g:imported_func
10331c991144SBram Moolenaar  delete('Ximport_lbr.vim')
10341c991144SBram Moolenaar
10351c991144SBram Moolenaar  # import inside :def function
1036cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
10375381c7a1SBram Moolenaar    vim9script
10385381c7a1SBram Moolenaar    def ImportInDef()
10395381c7a1SBram Moolenaar      import exported from './Xexport.vim'
10405381c7a1SBram Moolenaar      g:imported = exported
10415381c7a1SBram Moolenaar      exported += 7
10425381c7a1SBram Moolenaar      g:imported_added = exported
10435381c7a1SBram Moolenaar    enddef
10445381c7a1SBram Moolenaar    ImportInDef()
10455381c7a1SBram Moolenaar  END
10465381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
10475381c7a1SBram Moolenaar  source Ximport2.vim
1048f5be8cdbSBram Moolenaar  # TODO: this should be 9879
10495381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
10505381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
10515381c7a1SBram Moolenaar  unlet g:imported
10525381c7a1SBram Moolenaar  unlet g:imported_added
10535381c7a1SBram Moolenaar  delete('Ximport2.vim')
10545381c7a1SBram Moolenaar
1055cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1056f2d5c240SBram Moolenaar    vim9script
1057f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1058f2d5c240SBram Moolenaar    def UseExport()
1059cb4e80faSBram Moolenaar      g:imported_def = Export.exported
1060f2d5c240SBram Moolenaar    enddef
1061cb4e80faSBram Moolenaar    g:imported_script = Export.exported
1062cb4e80faSBram Moolenaar    assert_equal(1, exists('Export.exported'))
1063cb4e80faSBram Moolenaar    assert_equal(0, exists('Export.notexported'))
1064f2d5c240SBram Moolenaar    UseExport()
1065f2d5c240SBram Moolenaar  END
1066f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1067f2d5c240SBram Moolenaar  source Ximport.vim
1068cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_def)
1069cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_script)
1070f2d5c240SBram Moolenaar
1071cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1072599c89c8SBram Moolenaar    vim9script
1073599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1074599c89c8SBram Moolenaar    def Func()
1075cfcd011fSBram Moolenaar      var dummy = 1
1076cfcd011fSBram Moolenaar      var imported = Export + dummy
1077599c89c8SBram Moolenaar    enddef
1078822ba247SBram Moolenaar    defcompile
1079599c89c8SBram Moolenaar  END
1080599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
108144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1082599c89c8SBram Moolenaar
1083cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1084599c89c8SBram Moolenaar    vim9script
1085599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1086599c89c8SBram Moolenaar    def Func()
1087cfcd011fSBram Moolenaar      var imported = Export . exported
1088599c89c8SBram Moolenaar    enddef
1089822ba247SBram Moolenaar    defcompile
1090599c89c8SBram Moolenaar  END
1091599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
109244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1093599c89c8SBram Moolenaar
1094a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1095a6294955SBram Moolenaar    vim9script
1096a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1097a6294955SBram Moolenaar    var some = 'other'
1098a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1099a6294955SBram Moolenaar    defcompile
1100a6294955SBram Moolenaar  END
1101a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1102a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1103a6294955SBram Moolenaar
1104cb4e80faSBram Moolenaar  var import_star_as_lines_script_no_dot =<< trim END
1105cb4e80faSBram Moolenaar    vim9script
1106cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1107cb4e80faSBram Moolenaar    g:imported_script = Export exported
1108cb4e80faSBram Moolenaar  END
1109cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
1110cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1029:')
1111cb4e80faSBram Moolenaar
1112cb4e80faSBram Moolenaar  var import_star_as_lines_script_space_after_dot =<< trim END
1113cb4e80faSBram Moolenaar    vim9script
1114cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1115cb4e80faSBram Moolenaar    g:imported_script = Export. exported
1116cb4e80faSBram Moolenaar  END
1117cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1118cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1119cb4e80faSBram Moolenaar
1120cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1121599c89c8SBram Moolenaar    vim9script
1122599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1123599c89c8SBram Moolenaar    def Func()
1124cfcd011fSBram Moolenaar      var imported = Export.
1125599c89c8SBram Moolenaar    enddef
1126822ba247SBram Moolenaar    defcompile
1127599c89c8SBram Moolenaar  END
1128599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
112944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1130599c89c8SBram Moolenaar
1131cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
11321c991144SBram Moolenaar    vim9script
11331c991144SBram Moolenaar    import *
11341c991144SBram Moolenaar        as Export
11351c991144SBram Moolenaar        from
11361c991144SBram Moolenaar        './Xexport.vim'
11371c991144SBram Moolenaar    def UseExport()
11381c991144SBram Moolenaar      g:imported = Export.exported
11391c991144SBram Moolenaar    enddef
11401c991144SBram Moolenaar    UseExport()
11411c991144SBram Moolenaar  END
11421c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
11431c991144SBram Moolenaar  source Ximport.vim
11441c991144SBram Moolenaar  assert_equal(9883, g:imported)
11451c991144SBram Moolenaar
1146cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1147f2d5c240SBram Moolenaar    vim9script
1148f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1149f2d5c240SBram Moolenaar  END
1150f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
115144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1152f2d5c240SBram Moolenaar
1153f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1154cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1155fa29c8abSBram Moolenaar    vim9script
1156fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1157fa29c8abSBram Moolenaar  END
1158fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
115944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1160fa29c8abSBram Moolenaar
1161f5be8cdbSBram Moolenaar  # try to import something that is already defined
1162cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
11635269bd2aSBram Moolenaar    vim9script
1164cfcd011fSBram Moolenaar    var exported = 'something'
11655269bd2aSBram Moolenaar    import exported from './Xexport.vim'
11665269bd2aSBram Moolenaar  END
11675269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1168057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11695269bd2aSBram Moolenaar
1170f5be8cdbSBram Moolenaar  # try to import something that is already defined
11715269bd2aSBram Moolenaar  import_already_defined =<< trim END
11725269bd2aSBram Moolenaar    vim9script
1173cfcd011fSBram Moolenaar    var exported = 'something'
11745269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
11755269bd2aSBram Moolenaar  END
11765269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1177057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11785269bd2aSBram Moolenaar
1179f5be8cdbSBram Moolenaar  # try to import something that is already defined
11805269bd2aSBram Moolenaar  import_already_defined =<< trim END
11815269bd2aSBram Moolenaar    vim9script
1182cfcd011fSBram Moolenaar    var exported = 'something'
11835269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
11845269bd2aSBram Moolenaar  END
11855269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1186057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11875269bd2aSBram Moolenaar
1188918a4249SBram Moolenaar  # try changing an imported const
1189918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1190918a4249SBram Moolenaar    vim9script
1191918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1192918a4249SBram Moolenaar    def Assign()
1193918a4249SBram Moolenaar      CONST = 987
1194918a4249SBram Moolenaar    enddef
1195918a4249SBram Moolenaar    defcompile
1196918a4249SBram Moolenaar  END
1197918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1198918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1199918a4249SBram Moolenaar
12000f2a5cc6SBram Moolenaar  # try changing an imported final
12010f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
12020f2a5cc6SBram Moolenaar    vim9script
12030f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
12040f2a5cc6SBram Moolenaar    def Assign()
12050f2a5cc6SBram Moolenaar      theList = [2]
12060f2a5cc6SBram Moolenaar    enddef
12070f2a5cc6SBram Moolenaar    defcompile
12080f2a5cc6SBram Moolenaar  END
12090f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
12100f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
12110f2a5cc6SBram Moolenaar
1212f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1213cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1214fa29c8abSBram Moolenaar    vim9script
1215fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1216fa29c8abSBram Moolenaar  END
1217fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
121844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1219fa29c8abSBram Moolenaar
1220cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1221fa29c8abSBram Moolenaar    vim9script
1222fa29c8abSBram Moolenaar    import name './Xexport.vim'
1223fa29c8abSBram Moolenaar  END
1224fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
122544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1226fa29c8abSBram Moolenaar
1227cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1228fa29c8abSBram Moolenaar    vim9script
1229fa29c8abSBram Moolenaar    import name from Xexport.vim
1230fa29c8abSBram Moolenaar  END
1231fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
123244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1233fa29c8abSBram Moolenaar
1234cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1235fa29c8abSBram Moolenaar    vim9script
1236fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1237fa29c8abSBram Moolenaar  END
1238fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
123944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1240fa29c8abSBram Moolenaar
1241cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1242fa29c8abSBram Moolenaar    vim9script
1243fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1244fa29c8abSBram Moolenaar  END
12455269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
124644d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1247fa29c8abSBram Moolenaar
1248f2d5c240SBram Moolenaar  delete('Ximport.vim')
12495269bd2aSBram Moolenaar  delete('Ximport3.vim')
12508a7d6542SBram Moolenaar  delete('Xexport.vim')
12518a7d6542SBram Moolenaar
1252f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
12533e191694SBram Moolenaar  # Flags added or removed are also applied to the restored value.
12543e191694SBram Moolenaar  set cpo=abcd
1255cfcd011fSBram Moolenaar  var lines =<< trim END
1256750802b5SBram Moolenaar    vim9script
1257750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
12583e191694SBram Moolenaar    set cpo+=f
12593e191694SBram Moolenaar    set cpo-=c
12603e191694SBram Moolenaar    g:cpo_after_vim9script = &cpo
1261750802b5SBram Moolenaar  END
1262750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1263750802b5SBram Moolenaar  source Xvim9_script
12643e191694SBram Moolenaar  assert_equal('fabd', &cpo)
1265750802b5SBram Moolenaar  set cpo&vim
1266750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
12673e191694SBram Moolenaar  var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
12683e191694SBram Moolenaar  assert_equal(newcpo, g:cpo_after_vim9script)
12693e191694SBram Moolenaar
1270750802b5SBram Moolenaar  delete('Xvim9_script')
1271750802b5SBram Moolenaarenddef
1272750802b5SBram Moolenaar
12730a84284eSBram Moolenaardef Test_import_as()
12740a84284eSBram Moolenaar  var export_lines =<< trim END
12750a84284eSBram Moolenaar    vim9script
12760a84284eSBram Moolenaar    export var one = 1
12770a84284eSBram Moolenaar    export var yes = 'yes'
12780a84284eSBram Moolenaar  END
12790a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
12800a84284eSBram Moolenaar
12810a84284eSBram Moolenaar  var import_lines =<< trim END
12820a84284eSBram Moolenaar    vim9script
12836c7cc347SBram Moolenaar    var one = 'notused'
12846c7cc347SBram Moolenaar    var yes = 777
12850a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
12860a84284eSBram Moolenaar    assert_equal(1, thatOne)
12870a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
12880a84284eSBram Moolenaar    assert_equal('yes', yesYes)
12890a84284eSBram Moolenaar  END
12900a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
12910a84284eSBram Moolenaar
12920a84284eSBram Moolenaar  import_lines =<< trim END
12930a84284eSBram Moolenaar    vim9script
12940a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
12950a84284eSBram Moolenaar    assert_equal(1, thatOne)
12960a84284eSBram Moolenaar    assert_equal('yes', yesYes)
12970a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
12980a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
12990a84284eSBram Moolenaar  END
13000a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
13010a84284eSBram Moolenaar
13020a84284eSBram Moolenaar  delete('XexportAs')
13030a84284eSBram Moolenaarenddef
13040a84284eSBram Moolenaar
1305803af686SBram Moolenaarfunc g:Trigger()
1306803af686SBram Moolenaar  source Ximport.vim
1307803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1308803af686SBram Moolenaarendfunc
1309803af686SBram Moolenaar
1310803af686SBram Moolenaardef Test_import_export_expr_map()
1311803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1312cfcd011fSBram Moolenaar  var export_lines =<< trim END
1313803af686SBram Moolenaar    vim9script
1314803af686SBram Moolenaar    export def That(): string
1315803af686SBram Moolenaar      return 'yes'
1316803af686SBram Moolenaar    enddef
1317803af686SBram Moolenaar  END
1318803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1319803af686SBram Moolenaar
1320cfcd011fSBram Moolenaar  var import_lines =<< trim END
1321803af686SBram Moolenaar    vim9script
1322803af686SBram Moolenaar    import That from './Xexport_that.vim'
1323803af686SBram Moolenaar    assert_equal('yes', That())
1324803af686SBram Moolenaar  END
1325803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1326803af686SBram Moolenaar
1327803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1328803af686SBram Moolenaar  feedkeys('trigger', "xt")
1329803af686SBram Moolenaar
1330730b2483SBram Moolenaar  delete('Xexport_that.vim')
1331803af686SBram Moolenaar  delete('Ximport.vim')
1332803af686SBram Moolenaar  nunmap trigger
1333803af686SBram Moolenaarenddef
1334803af686SBram Moolenaar
13358e1986e3SBram Moolenaardef Test_import_in_filetype()
13368e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
13378e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1338cfcd011fSBram Moolenaar  var export_lines =<< trim END
13398e1986e3SBram Moolenaar    vim9script
1340cfcd011fSBram Moolenaar    export var That = 'yes'
13418e1986e3SBram Moolenaar  END
1342730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
13438e1986e3SBram Moolenaar
1344cfcd011fSBram Moolenaar  var import_lines =<< trim END
13458e1986e3SBram Moolenaar    vim9script
1346730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
13478e1986e3SBram Moolenaar    assert_equal('yes', That)
13488e1986e3SBram Moolenaar    g:did_load_mytpe = 1
13498e1986e3SBram Moolenaar  END
13508e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
13518e1986e3SBram Moolenaar
1352cfcd011fSBram Moolenaar  var save_rtp = &rtp
13538e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
13548e1986e3SBram Moolenaar
13558e1986e3SBram Moolenaar  filetype plugin on
13568e1986e3SBram Moolenaar  copen
13578e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
13588e1986e3SBram Moolenaar
13598e1986e3SBram Moolenaar  quit!
1360730b2483SBram Moolenaar  delete('Xexport_ft.vim')
13618e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
13628e1986e3SBram Moolenaar  &rtp = save_rtp
13638e1986e3SBram Moolenaarenddef
13648e1986e3SBram Moolenaar
1365efa94447SBram Moolenaardef Test_use_import_in_mapping()
1366cfcd011fSBram Moolenaar  var lines =<< trim END
1367efa94447SBram Moolenaar      vim9script
1368efa94447SBram Moolenaar      export def Funcx()
1369efa94447SBram Moolenaar        g:result = 42
1370efa94447SBram Moolenaar      enddef
1371efa94447SBram Moolenaar  END
1372efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1373efa94447SBram Moolenaar  lines =<< trim END
1374efa94447SBram Moolenaar      vim9script
1375efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1376b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1377efa94447SBram Moolenaar  END
1378efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1379efa94447SBram Moolenaar
1380efa94447SBram Moolenaar  source Xmapscript.vim
1381b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1382efa94447SBram Moolenaar  assert_equal(42, g:result)
1383efa94447SBram Moolenaar
1384efa94447SBram Moolenaar  unlet g:result
1385efa94447SBram Moolenaar  delete('XsomeExport.vim')
1386efa94447SBram Moolenaar  delete('Xmapscript.vim')
1387b3ca9824SBram Moolenaar  nunmap <F3>
1388efa94447SBram Moolenaarenddef
1389efa94447SBram Moolenaar
1390d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1391d3f8a9eeSBram Moolenaar  var lines =<< trim END
1392d3f8a9eeSBram Moolenaar    if has(g:feature)
1393d3f8a9eeSBram Moolenaar      " legacy script
1394d3f8a9eeSBram Moolenaar      let g:legacy = 1
1395d3f8a9eeSBram Moolenaar      finish
1396d3f8a9eeSBram Moolenaar    endif
1397d3f8a9eeSBram Moolenaar    vim9script
1398d3f8a9eeSBram Moolenaar    g:legacy = 0
1399d3f8a9eeSBram Moolenaar  END
1400d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1401d3f8a9eeSBram Moolenaar  g:legacy = -1
1402d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1403d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1404d3f8a9eeSBram Moolenaar
1405d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1406d3f8a9eeSBram Moolenaar  g:legacy = -1
1407d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1408d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1409d3f8a9eeSBram Moolenaarenddef
1410d3f8a9eeSBram Moolenaar
1411750802b5SBram Moolenaardef Test_vim9script_fails()
14128a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
14138a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1414cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
14159721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1416cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1417750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1418750802b5SBram Moolenaar
1419cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1420c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1421c785b9a7SBram Moolenaar
1422e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1423e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
14248a7d6542SBram Moolenaarenddef
14258a7d6542SBram Moolenaar
1426f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1427101f4810SBram Moolenaar  CheckRunVimInTerminal
1428101f4810SBram Moolenaar
14299bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1430c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
14319bb3eb3eSBram Moolenaarendfunc
14329bb3eb3eSBram Moolenaar
1433c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1434cfcd011fSBram Moolenaar  var export =<< trim END
1435101f4810SBram Moolenaar    vim9script
1436101f4810SBram Moolenaar    export def Foo(): number
1437101f4810SBram Moolenaar        return 0
1438101f4810SBram Moolenaar    enddef
1439101f4810SBram Moolenaar  END
1440730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1441101f4810SBram Moolenaar
1442e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
14439bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
14442949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1445101f4810SBram Moolenaar
1446730b2483SBram Moolenaar  delete('XexportCmd.vim')
14479bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
14489bb3eb3eSBram Moolenaarenddef
1449101f4810SBram Moolenaar
14502b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
14512b32700dSBram Moolenaar  var lines =<< trim END
1452a6294955SBram Moolenaar    vim9script
1453a6294955SBram Moolenaar    export var exported = 'thexport'
1454a6294955SBram Moolenaar  END
1455a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1456a6294955SBram Moolenaar  lines =<< trim END
14572b32700dSBram Moolenaar    vim9script noclear
14582b32700dSBram Moolenaar    g:loadCount += 1
14592b32700dSBram Moolenaar    var s:reloaded = 'init'
1460a6294955SBram Moolenaar    import exported from './XExportReload'
14612b32700dSBram Moolenaar
14622b32700dSBram Moolenaar    def Again(): string
14632b32700dSBram Moolenaar      return 'again'
14642b32700dSBram Moolenaar    enddef
14652b32700dSBram Moolenaar
14662b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
14672b32700dSBram Moolenaar    var s:loaded = true
14682b32700dSBram Moolenaar
14692b32700dSBram Moolenaar    var s:notReloaded = 'yes'
14702b32700dSBram Moolenaar    s:reloaded = 'first'
14712b32700dSBram Moolenaar    def g:Values(): list<string>
1472a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
14732b32700dSBram Moolenaar    enddef
14742b32700dSBram Moolenaar
14752b32700dSBram Moolenaar    def Once(): string
14762b32700dSBram Moolenaar      return 'once'
14772b32700dSBram Moolenaar    enddef
14782b32700dSBram Moolenaar  END
14792b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
14802b32700dSBram Moolenaar  g:loadCount = 0
14812b32700dSBram Moolenaar  source XReloaded
14822b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1483a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
14842b32700dSBram Moolenaar  source XReloaded
14852b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1486a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
14872b32700dSBram Moolenaar  source XReloaded
14882b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1489a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
14902b32700dSBram Moolenaar
149148e11c10SBram Moolenaar  delete('XReloaded')
1492a6294955SBram Moolenaar  delete('XExportReload')
14932b32700dSBram Moolenaar  delfunc g:Values
14942b32700dSBram Moolenaar  unlet g:loadCount
14952b32700dSBram Moolenaarenddef
14962b32700dSBram Moolenaar
14974c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1498cfcd011fSBram Moolenaar  var lines =<< trim END
14998a7d6542SBram Moolenaar    vim9script
15008a7d6542SBram Moolenaar    const var = ''
1501cfcd011fSBram Moolenaar    var valone = 1234
15028a7d6542SBram Moolenaar    def MyFunc(arg: string)
15038a7d6542SBram Moolenaar       valone = 5678
15048a7d6542SBram Moolenaar    enddef
15058a7d6542SBram Moolenaar  END
1506cfcd011fSBram Moolenaar  var morelines =<< trim END
1507cfcd011fSBram Moolenaar    var valtwo = 222
15088a7d6542SBram Moolenaar    export def GetValtwo(): number
15098a7d6542SBram Moolenaar      return valtwo
15108a7d6542SBram Moolenaar    enddef
15118a7d6542SBram Moolenaar  END
151203afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
15138a7d6542SBram Moolenaar  source Xreload.vim
15148a7d6542SBram Moolenaar  source Xreload.vim
15158a7d6542SBram Moolenaar  source Xreload.vim
15168a7d6542SBram Moolenaar
1517cfcd011fSBram Moolenaar  var testlines =<< trim END
15188a7d6542SBram Moolenaar    vim9script
15198a7d6542SBram Moolenaar    def TheFunc()
15208a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
15218a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
15228a7d6542SBram Moolenaar    enddef
15238a7d6542SBram Moolenaar    TheFunc()
15248a7d6542SBram Moolenaar  END
15258a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
15268a7d6542SBram Moolenaar  source Ximport.vim
15278a7d6542SBram Moolenaar
1528f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1529f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
15308a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
15318a7d6542SBram Moolenaar  source Ximport.vim
15328a7d6542SBram Moolenaar
1533f5be8cdbSBram Moolenaar  # cannot declare a var twice
15348a7d6542SBram Moolenaar  lines =<< trim END
15358a7d6542SBram Moolenaar    vim9script
1536cfcd011fSBram Moolenaar    var valone = 1234
1537cfcd011fSBram Moolenaar    var valone = 5678
15388a7d6542SBram Moolenaar  END
15398a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
154044d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
15418a7d6542SBram Moolenaar
15428a7d6542SBram Moolenaar  delete('Xreload.vim')
15438a7d6542SBram Moolenaar  delete('Ximport.vim')
15448a7d6542SBram Moolenaarenddef
15458a7d6542SBram Moolenaar
154607a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
154707a65d26SBram Moolenaar" compiled function using that variable must fail.
154807a65d26SBram Moolenaardef Test_script_reload_change_type()
154907a65d26SBram Moolenaar  var lines =<< trim END
155007a65d26SBram Moolenaar    vim9script noclear
155107a65d26SBram Moolenaar    var str = 'string'
155207a65d26SBram Moolenaar    def g:GetStr(): string
155307a65d26SBram Moolenaar      return str .. 'xxx'
155407a65d26SBram Moolenaar    enddef
155507a65d26SBram Moolenaar  END
155607a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
155707a65d26SBram Moolenaar  source Xreload.vim
155807a65d26SBram Moolenaar  echo g:GetStr()
155907a65d26SBram Moolenaar
156007a65d26SBram Moolenaar  lines =<< trim END
156107a65d26SBram Moolenaar    vim9script noclear
156207a65d26SBram Moolenaar    var str = 1234
156307a65d26SBram Moolenaar  END
156407a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
156507a65d26SBram Moolenaar  source Xreload.vim
156607a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
156707a65d26SBram Moolenaar
156807a65d26SBram Moolenaar  delfunc g:GetStr
156907a65d26SBram Moolenaar  delete('Xreload.vim')
157007a65d26SBram Moolenaarenddef
157107a65d26SBram Moolenaar
1572c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled
1573c970e422SBram Moolenaarcommand CallFunc echo 'nop'
1574c970e422SBram Moolenaar
1575c970e422SBram Moolenaardef Test_script_reload_from_function()
1576c970e422SBram Moolenaar  var lines =<< trim END
1577c970e422SBram Moolenaar      vim9script
1578c970e422SBram Moolenaar
1579c970e422SBram Moolenaar      if exists('g:loaded')
1580c970e422SBram Moolenaar        finish
1581c970e422SBram Moolenaar      endif
1582c970e422SBram Moolenaar      g:loaded = 1
1583c970e422SBram Moolenaar      delcommand CallFunc
1584c970e422SBram Moolenaar      command CallFunc Func()
1585c970e422SBram Moolenaar      def Func()
1586a4c81beaSBram Moolenaar        so XreloadFunc.vim
1587c970e422SBram Moolenaar        g:didTheFunc = 1
1588c970e422SBram Moolenaar      enddef
1589c970e422SBram Moolenaar  END
1590c970e422SBram Moolenaar  writefile(lines, 'XreloadFunc.vim')
1591c970e422SBram Moolenaar  source XreloadFunc.vim
1592c970e422SBram Moolenaar  CallFunc
1593c970e422SBram Moolenaar  assert_equal(1, g:didTheFunc)
1594c970e422SBram Moolenaar
1595c970e422SBram Moolenaar  delete('XreloadFunc.vim')
1596c970e422SBram Moolenaar  delcommand CallFunc
1597c970e422SBram Moolenaar  unlet g:loaded
1598c970e422SBram Moolenaar  unlet g:didTheFunc
1599c970e422SBram Moolenaarenddef
1600c970e422SBram Moolenaar
16016c3843caSBram Moolenaardef Test_script_var_shadows_function()
16026c3843caSBram Moolenaar  var lines =<< trim END
16036c3843caSBram Moolenaar      vim9script
16046c3843caSBram Moolenaar      def Func(): number
16056c3843caSBram Moolenaar        return 123
16066c3843caSBram Moolenaar      enddef
16076c3843caSBram Moolenaar      var Func = 1
16086c3843caSBram Moolenaar  END
16096c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
16106c3843caSBram Moolenaarenddef
16116c3843caSBram Moolenaar
161295006e3dSBram Moolenaardef s:RetSome(): string
161395006e3dSBram Moolenaar  return 'some'
161495006e3dSBram Moolenaarenddef
161595006e3dSBram Moolenaar
1616fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1617fe465a01SBram Moolenaar" script-local name.
1618fe465a01SBram Moolenaardef Test_vim9script_funcref()
1619cfcd011fSBram Moolenaar  var sortlines =<< trim END
1620fe465a01SBram Moolenaar      vim9script
1621fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1622bed36b93SBram Moolenaar        return i2 - i1
1623fe465a01SBram Moolenaar      enddef
1624fe465a01SBram Moolenaar
1625fe465a01SBram Moolenaar      export def FastSort(): list<number>
1626fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1627fe465a01SBram Moolenaar      enddef
1628529fb5a5SBram Moolenaar
1629529fb5a5SBram Moolenaar      export def GetString(arg: string): string
1630529fb5a5SBram Moolenaar        return arg
1631529fb5a5SBram Moolenaar      enddef
1632fe465a01SBram Moolenaar  END
1633fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1634fe465a01SBram Moolenaar
1635cfcd011fSBram Moolenaar  var lines =<< trim END
1636fe465a01SBram Moolenaar    vim9script
1637fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1638fe465a01SBram Moolenaar    def Test()
1639fe465a01SBram Moolenaar      g:result = FastSort()
1640fe465a01SBram Moolenaar    enddef
1641fe465a01SBram Moolenaar    Test()
1642529fb5a5SBram Moolenaar
1643529fb5a5SBram Moolenaar    # using a function imported with "as"
1644529fb5a5SBram Moolenaar    import * as anAlias from './Xsort.vim'
1645529fb5a5SBram Moolenaar    assert_equal('yes', anAlias.GetString('yes'))
1646529fb5a5SBram Moolenaar
1647529fb5a5SBram Moolenaar    # using the function from a compiled function
1648529fb5a5SBram Moolenaar    def TestMore(): string
1649ca51cc0aSBram Moolenaar      var s = s:anAlias.GetString('foo')
1650ca51cc0aSBram Moolenaar      return s .. anAlias.GetString('bar')
1651529fb5a5SBram Moolenaar    enddef
1652ca51cc0aSBram Moolenaar    assert_equal('foobar', TestMore())
1653529fb5a5SBram Moolenaar
1654529fb5a5SBram Moolenaar    # error when using a function that isn't exported
1655529fb5a5SBram Moolenaar    assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1656fe465a01SBram Moolenaar  END
1657fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1658fe465a01SBram Moolenaar
1659fe465a01SBram Moolenaar  source Xscript.vim
1660fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1661fe465a01SBram Moolenaar
1662fe465a01SBram Moolenaar  unlet g:result
1663fe465a01SBram Moolenaar  delete('Xsort.vim')
1664fe465a01SBram Moolenaar  delete('Xscript.vim')
166595006e3dSBram Moolenaar
1666cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
166795006e3dSBram Moolenaar  assert_equal('some', Funcref())
1668fe465a01SBram Moolenaarenddef
1669fe465a01SBram Moolenaar
1670601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1671601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1672601e76acSBram Moolenaar" function reference.
1673c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1674cfcd011fSBram Moolenaar  var filterLines =<< trim END
1675c620c055SBram Moolenaar    vim9script
1676c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1677c620c055SBram Moolenaar      return idx % 2 == 1
1678c620c055SBram Moolenaar    enddef
1679c620c055SBram Moolenaar    export def FastFilter(): list<number>
1680c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1681c620c055SBram Moolenaar    enddef
1682601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1683601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1684601e76acSBram Moolenaar    enddef
1685c620c055SBram Moolenaar  END
1686c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1687c620c055SBram Moolenaar
1688cfcd011fSBram Moolenaar  var lines =<< trim END
1689c620c055SBram Moolenaar    vim9script
1690601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1691c620c055SBram Moolenaar    def Test()
1692cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1693c620c055SBram Moolenaar    enddef
1694c620c055SBram Moolenaar    Test()
1695601e76acSBram Moolenaar    def TestDirect()
1696cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1697601e76acSBram Moolenaar    enddef
1698601e76acSBram Moolenaar    TestDirect()
1699c620c055SBram Moolenaar  END
1700601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1701c620c055SBram Moolenaar  delete('Xfilter.vim')
1702c620c055SBram Moolenaarenddef
1703c620c055SBram Moolenaar
17044c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1705cfcd011fSBram Moolenaar  var first_lines =<< trim END
17064c17ad94SBram Moolenaar    vim9script
17074c17ad94SBram Moolenaar    def FuncYes(): string
17084c17ad94SBram Moolenaar      return 'yes'
17094c17ad94SBram Moolenaar    enddef
17104c17ad94SBram Moolenaar  END
1711cfcd011fSBram Moolenaar  var withno_lines =<< trim END
17124c17ad94SBram Moolenaar    def FuncNo(): string
17134c17ad94SBram Moolenaar      return 'no'
17144c17ad94SBram Moolenaar    enddef
17154c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
17164c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
17174c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
171803afdcf1SBram Moolenaar    enddef
171903afdcf1SBram Moolenaar  END
1720cfcd011fSBram Moolenaar  var nono_lines =<< trim END
172103afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
172203afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
172344d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
17244c17ad94SBram Moolenaar    enddef
17254c17ad94SBram Moolenaar  END
17264c17ad94SBram Moolenaar
17274c17ad94SBram Moolenaar  # FuncNo() is defined
172803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17294c17ad94SBram Moolenaar  source Xreloaded.vim
17304c17ad94SBram Moolenaar  g:DoCheck(true)
17314c17ad94SBram Moolenaar
17324c17ad94SBram Moolenaar  # FuncNo() is not redefined
173303afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
17344c17ad94SBram Moolenaar  source Xreloaded.vim
17355082471fSBram Moolenaar  g:DoCheck(false)
17364c17ad94SBram Moolenaar
17374c17ad94SBram Moolenaar  # FuncNo() is back
173803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17394c17ad94SBram Moolenaar  source Xreloaded.vim
17405082471fSBram Moolenaar  g:DoCheck(false)
17414c17ad94SBram Moolenaar
17424c17ad94SBram Moolenaar  delete('Xreloaded.vim')
17434c17ad94SBram Moolenaarenddef
17444c17ad94SBram Moolenaar
174589483d40SBram Moolenaardef Test_vim9script_reload_delvar()
174689483d40SBram Moolenaar  # write the script with a script-local variable
1747cfcd011fSBram Moolenaar  var lines =<< trim END
174889483d40SBram Moolenaar    vim9script
1749cfcd011fSBram Moolenaar    var name = 'string'
175089483d40SBram Moolenaar  END
175189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
175289483d40SBram Moolenaar  source XreloadVar.vim
175389483d40SBram Moolenaar
175489483d40SBram Moolenaar  # now write the script using the same variable locally - works
175589483d40SBram Moolenaar  lines =<< trim END
175689483d40SBram Moolenaar    vim9script
175789483d40SBram Moolenaar    def Func()
1758cfcd011fSBram Moolenaar      var name = 'string'
175989483d40SBram Moolenaar    enddef
176089483d40SBram Moolenaar  END
176189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
176289483d40SBram Moolenaar  source XreloadVar.vim
176389483d40SBram Moolenaar
176489483d40SBram Moolenaar  delete('XreloadVar.vim')
176589483d40SBram Moolenaarenddef
176689483d40SBram Moolenaar
17678a7d6542SBram Moolenaardef Test_import_absolute()
1768cfcd011fSBram Moolenaar  var import_lines = [
1769e6085c53SBram Moolenaar        'vim9script',
1770e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1771e6085c53SBram Moolenaar        'def UseExported()',
1772e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1773e6085c53SBram Moolenaar        '  exported = 8888',
1774e6085c53SBram Moolenaar        '  g:imported_after = exported',
1775e6085c53SBram Moolenaar        'enddef',
1776e6085c53SBram Moolenaar        'UseExported()',
1777e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1778e6085c53SBram Moolenaar        ]
17798a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
17808a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
17818a7d6542SBram Moolenaar
17828a7d6542SBram Moolenaar  source Ximport_abs.vim
17838a7d6542SBram Moolenaar
17848a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
17854e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1786fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1787fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1788fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1789fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1790fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1791fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1792fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1793fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1794fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1795fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1796e6085c53SBram Moolenaar        g:import_disassembled)
1797b3ca9824SBram Moolenaar
1798b3ca9824SBram Moolenaar  Undo_export_script_lines()
17998a7d6542SBram Moolenaar  unlet g:imported_abs
18004e12a5dfSBram Moolenaar  unlet g:import_disassembled
18018a7d6542SBram Moolenaar
18028a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
18038a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
18048a7d6542SBram Moolenaarenddef
18058a7d6542SBram Moolenaar
18068a7d6542SBram Moolenaardef Test_import_rtp()
1807cfcd011fSBram Moolenaar  var import_lines = [
1808e6085c53SBram Moolenaar        'vim9script',
1809e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1810e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1811e6085c53SBram Moolenaar        ]
18128a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
18138a7d6542SBram Moolenaar  mkdir('import')
18148a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
18158a7d6542SBram Moolenaar
1816cfcd011fSBram Moolenaar  var save_rtp = &rtp
18178a7d6542SBram Moolenaar  &rtp = getcwd()
18188a7d6542SBram Moolenaar  source Ximport_rtp.vim
18198a7d6542SBram Moolenaar  &rtp = save_rtp
18208a7d6542SBram Moolenaar
18218a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
18228a7d6542SBram Moolenaar
1823b3ca9824SBram Moolenaar  Undo_export_script_lines()
1824b3ca9824SBram Moolenaar  unlet g:imported_rtp
18258a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
182689483d40SBram Moolenaar  delete('import', 'rf')
18278a7d6542SBram Moolenaarenddef
18288a7d6542SBram Moolenaar
182925e0f586SBram Moolenaardef Test_import_compile_error()
1830cfcd011fSBram Moolenaar  var export_lines = [
183125e0f586SBram Moolenaar        'vim9script',
183225e0f586SBram Moolenaar        'export def ExpFunc(): string',
183325e0f586SBram Moolenaar        '  return notDefined',
183425e0f586SBram Moolenaar        'enddef',
183525e0f586SBram Moolenaar        ]
183625e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
183725e0f586SBram Moolenaar
1838cfcd011fSBram Moolenaar  var import_lines = [
183925e0f586SBram Moolenaar        'vim9script',
184025e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
184125e0f586SBram Moolenaar        'def ImpFunc()',
184225e0f586SBram Moolenaar        '  echo ExpFunc()',
184325e0f586SBram Moolenaar        'enddef',
184425e0f586SBram Moolenaar        'defcompile',
184525e0f586SBram Moolenaar        ]
184625e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
184725e0f586SBram Moolenaar
184825e0f586SBram Moolenaar  try
184925e0f586SBram Moolenaar    source Ximport.vim
185025e0f586SBram Moolenaar  catch /E1001/
1851f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
18527707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
185325e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
185425e0f586SBram Moolenaar  endtry
185525e0f586SBram Moolenaar
185625e0f586SBram Moolenaar  delete('Xexported.vim')
185725e0f586SBram Moolenaar  delete('Ximport.vim')
185825e0f586SBram Moolenaarenddef
185925e0f586SBram Moolenaar
1860c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1861cfcd011fSBram Moolenaar  var lines = [
1862c4ce36d4SBram Moolenaar        'vim9script',
1863c4ce36d4SBram Moolenaar        'def Func()',
1864c4ce36d4SBram Moolenaar        '  eval [][0]',
1865c4ce36d4SBram Moolenaar        'enddef',
1866c4ce36d4SBram Moolenaar        'Func()',
1867c4ce36d4SBram Moolenaar        ]
1868c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1869c4ce36d4SBram Moolenaar
1870c4ce36d4SBram Moolenaar  for count in range(3)
1871c4ce36d4SBram Moolenaar    try
1872c4ce36d4SBram Moolenaar      source Xtestscript.vim
1873c4ce36d4SBram Moolenaar    catch /E684/
1874c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1875c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1876c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1877c4ce36d4SBram Moolenaar    endtry
1878c4ce36d4SBram Moolenaar  endfor
1879c4ce36d4SBram Moolenaar
1880c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1881c4ce36d4SBram Moolenaarenddef
1882c4ce36d4SBram Moolenaar
1883eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1884cfcd011fSBram Moolenaar  var export_lines =<< trim END
1885eef2102eSBram Moolenaar      vim9script
1886eef2102eSBram Moolenaar      export def Func()
1887eef2102eSBram Moolenaar        echo 'imported'
1888eef2102eSBram Moolenaar      enddef
1889eef2102eSBram Moolenaar  END
1890eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1891eef2102eSBram Moolenaar
1892cfcd011fSBram Moolenaar  var lines =<< trim END
1893eef2102eSBram Moolenaar    vim9script
1894eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1895eef2102eSBram Moolenaar    def Func()
1896eef2102eSBram Moolenaar      echo 'local to function'
1897eef2102eSBram Moolenaar    enddef
1898eef2102eSBram Moolenaar  END
1899eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1900eef2102eSBram Moolenaar
1901eef2102eSBram Moolenaar  lines =<< trim END
1902eef2102eSBram Moolenaar    vim9script
1903eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1904eef2102eSBram Moolenaar    def Outer()
1905eef2102eSBram Moolenaar      def Func()
1906eef2102eSBram Moolenaar        echo 'local to function'
1907eef2102eSBram Moolenaar      enddef
1908eef2102eSBram Moolenaar    enddef
1909eef2102eSBram Moolenaar    defcompile
1910eef2102eSBram Moolenaar  END
1911eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1912eef2102eSBram Moolenaar
1913eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1914eef2102eSBram Moolenaarenddef
1915eef2102eSBram Moolenaar
1916b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1917cfcd011fSBram Moolenaar  var lines =<< trim END
1918b9a2cac3SBram Moolenaar    vim9script
1919b9a2cac3SBram Moolenaar    def Func()
1920b9a2cac3SBram Moolenaar      echo 'one'
1921b9a2cac3SBram Moolenaar    enddef
1922b9a2cac3SBram Moolenaar    def Func()
1923b9a2cac3SBram Moolenaar      echo 'two'
1924b9a2cac3SBram Moolenaar    enddef
1925b9a2cac3SBram Moolenaar  END
1926b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1927fa211f3cSBram Moolenaar
1928fa211f3cSBram Moolenaar  lines =<< trim END
1929fa211f3cSBram Moolenaar    vim9script
1930fa211f3cSBram Moolenaar    def Foo(): string
1931fa211f3cSBram Moolenaar      return 'foo'
1932fa211f3cSBram Moolenaar      enddef
1933fa211f3cSBram Moolenaar    def Func()
1934cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1935fa211f3cSBram Moolenaar    enddef
1936fa211f3cSBram Moolenaar    defcompile
1937fa211f3cSBram Moolenaar  END
1938fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1939b9a2cac3SBram Moolenaarenddef
1940b9a2cac3SBram Moolenaar
19418a7d6542SBram Moolenaardef Test_fixed_size_list()
1942f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1943cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
19448a7d6542SBram Moolenaar  l->remove(0)
19458a7d6542SBram Moolenaar  l->add(5)
19468a7d6542SBram Moolenaar  l->insert(99, 1)
19470f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
19488a7d6542SBram Moolenaarenddef
19498a7d6542SBram Moolenaar
1950ae616494SBram Moolenaardef Test_no_insert_xit()
1951d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1952d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1953d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1954d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1955d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1956ae616494SBram Moolenaar
1957ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1958ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1959ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1960ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1961f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1962f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
19636508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
19646508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
1965f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1966f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1967f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1968ae616494SBram Moolenaarenddef
1969ae616494SBram Moolenaar
1970158906cfSBram Moolenaardef IfElse(what: number): string
1971cfcd011fSBram Moolenaar  var res = ''
1972158906cfSBram Moolenaar  if what == 1
1973158906cfSBram Moolenaar    res = "one"
1974158906cfSBram Moolenaar  elseif what == 2
1975158906cfSBram Moolenaar    res = "two"
1976a259d8d3SBram Moolenaar  else
1977158906cfSBram Moolenaar    res = "three"
1978a259d8d3SBram Moolenaar  endif
1979158906cfSBram Moolenaar  return res
1980a259d8d3SBram Moolenaarenddef
1981a259d8d3SBram Moolenaar
1982158906cfSBram Moolenaardef Test_if_elseif_else()
1983158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1984158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1985158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
19860f18b6d1SBram Moolenaarenddef
19870f18b6d1SBram Moolenaar
1988e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1989d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1990d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1991d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1992ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1993d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
19946628b7ebSBram Moolenaar
19956628b7ebSBram Moolenaar  var lines =<< trim END
19966628b7ebSBram Moolenaar      var s = ''
19976628b7ebSBram Moolenaar      if s = ''
19986628b7ebSBram Moolenaar      endif
19996628b7ebSBram Moolenaar  END
20006628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
20016628b7ebSBram Moolenaar
20026628b7ebSBram Moolenaar  lines =<< trim END
20036628b7ebSBram Moolenaar      var s = ''
20046628b7ebSBram Moolenaar      if s == ''
20056628b7ebSBram Moolenaar      elseif s = ''
20066628b7ebSBram Moolenaar      endif
20076628b7ebSBram Moolenaar  END
20086628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2009e8c4abbbSBram Moolenaarenddef
2010e8c4abbbSBram Moolenaar
20116d69bf60SBram Moolenaarlet g:bool_true = v:true
20126d69bf60SBram Moolenaarlet g:bool_false = v:false
20136d69bf60SBram Moolenaar
20146d69bf60SBram Moolenaardef Test_if_const_expr()
2015cfcd011fSBram Moolenaar  var res = false
20166d69bf60SBram Moolenaar  if true ? true : false
20176d69bf60SBram Moolenaar    res = true
20186d69bf60SBram Moolenaar  endif
20196d69bf60SBram Moolenaar  assert_equal(true, res)
20206d69bf60SBram Moolenaar
2021585fea7bSBram Moolenaar  g:glob = 2
2022585fea7bSBram Moolenaar  if false
20236797966dSBram Moolenaar    execute('g:glob = 3')
2024585fea7bSBram Moolenaar  endif
2025585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2026585fea7bSBram Moolenaar  if true
20276797966dSBram Moolenaar    execute('g:glob = 3')
2028585fea7bSBram Moolenaar  endif
2029585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2030585fea7bSBram Moolenaar
20316d69bf60SBram Moolenaar  res = false
20326d69bf60SBram Moolenaar  if g:bool_true ? true : false
20336d69bf60SBram Moolenaar    res = true
20346d69bf60SBram Moolenaar  endif
20356d69bf60SBram Moolenaar  assert_equal(true, res)
20366d69bf60SBram Moolenaar
20376d69bf60SBram Moolenaar  res = false
20386d69bf60SBram Moolenaar  if true ? g:bool_true : false
20396d69bf60SBram Moolenaar    res = true
20406d69bf60SBram Moolenaar  endif
20416d69bf60SBram Moolenaar  assert_equal(true, res)
20426d69bf60SBram Moolenaar
20436d69bf60SBram Moolenaar  res = false
20446d69bf60SBram Moolenaar  if true ? true : g:bool_false
20456d69bf60SBram Moolenaar    res = true
20466d69bf60SBram Moolenaar  endif
20476d69bf60SBram Moolenaar  assert_equal(true, res)
20486d69bf60SBram Moolenaar
20496d69bf60SBram Moolenaar  res = false
20506d69bf60SBram Moolenaar  if true ? false : true
20516d69bf60SBram Moolenaar    res = true
20526d69bf60SBram Moolenaar  endif
20536d69bf60SBram Moolenaar  assert_equal(false, res)
20546d69bf60SBram Moolenaar
20556d69bf60SBram Moolenaar  res = false
20566d69bf60SBram Moolenaar  if false ? false : true
20576d69bf60SBram Moolenaar    res = true
20586d69bf60SBram Moolenaar  endif
20596d69bf60SBram Moolenaar  assert_equal(true, res)
20606d69bf60SBram Moolenaar
20616d69bf60SBram Moolenaar  res = false
20626d69bf60SBram Moolenaar  if false ? true : false
20636d69bf60SBram Moolenaar    res = true
20646d69bf60SBram Moolenaar  endif
20656d69bf60SBram Moolenaar  assert_equal(false, res)
20666d69bf60SBram Moolenaar
20676d69bf60SBram Moolenaar  res = false
2068e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2069e8c4abbbSBram Moolenaar    res = true
2070e8c4abbbSBram Moolenaar  endif
2071e8c4abbbSBram Moolenaar  assert_equal(false, res)
2072e8c4abbbSBram Moolenaar
2073e8c4abbbSBram Moolenaar  res = false
20746d69bf60SBram Moolenaar  if true && true
20756d69bf60SBram Moolenaar    res = true
20766d69bf60SBram Moolenaar  endif
20776d69bf60SBram Moolenaar  assert_equal(true, res)
20786d69bf60SBram Moolenaar
20796d69bf60SBram Moolenaar  res = false
20806d69bf60SBram Moolenaar  if true && false
20816d69bf60SBram Moolenaar    res = true
20826d69bf60SBram Moolenaar  endif
20836d69bf60SBram Moolenaar  assert_equal(false, res)
20846d69bf60SBram Moolenaar
20856d69bf60SBram Moolenaar  res = false
20866d69bf60SBram Moolenaar  if g:bool_true && false
20876d69bf60SBram Moolenaar    res = true
20886d69bf60SBram Moolenaar  endif
20896d69bf60SBram Moolenaar  assert_equal(false, res)
20906d69bf60SBram Moolenaar
20916d69bf60SBram Moolenaar  res = false
20926d69bf60SBram Moolenaar  if true && g:bool_false
20936d69bf60SBram Moolenaar    res = true
20946d69bf60SBram Moolenaar  endif
20956d69bf60SBram Moolenaar  assert_equal(false, res)
20966d69bf60SBram Moolenaar
20976d69bf60SBram Moolenaar  res = false
20986d69bf60SBram Moolenaar  if false && false
20996d69bf60SBram Moolenaar    res = true
21006d69bf60SBram Moolenaar  endif
21016d69bf60SBram Moolenaar  assert_equal(false, res)
21026d69bf60SBram Moolenaar
21036d69bf60SBram Moolenaar  res = false
21046d69bf60SBram Moolenaar  if true || false
21056d69bf60SBram Moolenaar    res = true
21066d69bf60SBram Moolenaar  endif
21076d69bf60SBram Moolenaar  assert_equal(true, res)
21086d69bf60SBram Moolenaar
21096d69bf60SBram Moolenaar  res = false
21106d69bf60SBram Moolenaar  if g:bool_true || false
21116d69bf60SBram Moolenaar    res = true
21126d69bf60SBram Moolenaar  endif
21136d69bf60SBram Moolenaar  assert_equal(true, res)
21146d69bf60SBram Moolenaar
21156d69bf60SBram Moolenaar  res = false
21166d69bf60SBram Moolenaar  if true || g:bool_false
21176d69bf60SBram Moolenaar    res = true
21186d69bf60SBram Moolenaar  endif
21196d69bf60SBram Moolenaar  assert_equal(true, res)
21206d69bf60SBram Moolenaar
21216d69bf60SBram Moolenaar  res = false
21226d69bf60SBram Moolenaar  if false || false
21236d69bf60SBram Moolenaar    res = true
21246d69bf60SBram Moolenaar  endif
21256d69bf60SBram Moolenaar  assert_equal(false, res)
21263988f64fSBram Moolenaar
21273988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
21283988f64fSBram Moolenaar  if false | eval 0 | endif
21293988f64fSBram Moolenaar  if false | eval burp + 234 | endif
21303988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
21313988f64fSBram Moolenaar  if false
21323988f64fSBram Moolenaar    burp
21333988f64fSBram Moolenaar  endif
213480c34ca3SBram Moolenaarenddef
21356d69bf60SBram Moolenaar
213680c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2137d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2138d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2139d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2140d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
21416d69bf60SBram Moolenaarenddef
21426d69bf60SBram Moolenaar
214372abcf42SBram Moolenaardef RunNested(i: number): number
2144cfcd011fSBram Moolenaar  var x: number = 0
214572abcf42SBram Moolenaar  if i % 2
214672abcf42SBram Moolenaar    if 1
2147f5be8cdbSBram Moolenaar      # comment
214872abcf42SBram Moolenaar    else
2149f5be8cdbSBram Moolenaar      # comment
215072abcf42SBram Moolenaar    endif
215172abcf42SBram Moolenaar    x += 1
215272abcf42SBram Moolenaar  else
215372abcf42SBram Moolenaar    x += 1000
215472abcf42SBram Moolenaar  endif
215572abcf42SBram Moolenaar  return x
215672abcf42SBram Moolenaarenddef
215772abcf42SBram Moolenaar
215872abcf42SBram Moolenaardef Test_nested_if()
215972abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
216072abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
216172abcf42SBram Moolenaarenddef
216272abcf42SBram Moolenaar
2163ad39c094SBram Moolenaardef Test_execute_cmd()
2164e4984290SBram Moolenaar  # missing argument is ignored
2165e4984290SBram Moolenaar  execute
2166e4984290SBram Moolenaar  execute # comment
2167e4984290SBram Moolenaar
2168ad39c094SBram Moolenaar  new
2169ad39c094SBram Moolenaar  setline(1, 'default')
2170d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2171ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2172a72cfb80SBram Moolenaar
2173d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2174a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2175a72cfb80SBram Moolenaar
2176cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2177cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2178a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2179ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2180a72cfb80SBram Moolenaar
2181d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2182ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2183a72cfb80SBram Moolenaar
2184cfcd011fSBram Moolenaar  var cmd_first = 'call '
2185cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2186ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2187ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2188ad39c094SBram Moolenaar  bwipe!
2189585fea7bSBram Moolenaar
2190cfcd011fSBram Moolenaar  var n = true
21912d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
21922d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
21932d6b20d6SBram Moolenaar
2194e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2195e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2196e5abf7afSBram Moolenaar
2197d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2198d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2199d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2200ad39c094SBram Moolenaarenddef
2201ad39c094SBram Moolenaar
220247e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2203f5be8cdbSBram Moolenaar  # only checks line continuation
2204cfcd011fSBram Moolenaar  var lines =<< trim END
220547e880d6SBram Moolenaar      vim9script
220647e880d6SBram Moolenaar      execute 'g:someVar'
220747e880d6SBram Moolenaar                .. ' = ' ..
220847e880d6SBram Moolenaar                   '28'
220947e880d6SBram Moolenaar      assert_equal(28, g:someVar)
221047e880d6SBram Moolenaar      unlet g:someVar
221147e880d6SBram Moolenaar  END
221247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
221347e880d6SBram Moolenaarenddef
221447e880d6SBram Moolenaar
2215ad39c094SBram Moolenaardef Test_echo_cmd()
2216a72cfb80SBram Moolenaar  echo 'some' # comment
2217585fea7bSBram Moolenaar  echon 'thing'
2218ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2219ad39c094SBram Moolenaar
2220a72cfb80SBram Moolenaar  echo "some" # comment
2221a72cfb80SBram Moolenaar  echon "thing"
2222a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2223a72cfb80SBram Moolenaar
2224cfcd011fSBram Moolenaar  var str1 = 'some'
2225cfcd011fSBram Moolenaar  var str2 = 'more'
2226ad39c094SBram Moolenaar  echo str1 str2
2227ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2228a72cfb80SBram Moolenaar
2229d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2230ad39c094SBram Moolenaarenddef
2231ad39c094SBram Moolenaar
2232f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2233f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2234f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2235f93c7feaSBram Moolenaar  echo 'clear'
2236df069eecSBram Moolenaar  :1messages
2237f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2238f93c7feaSBram Moolenaar
2239d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2240f93c7feaSBram Moolenaarenddef
2241f93c7feaSBram Moolenaar
224247e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2243f5be8cdbSBram Moolenaar  # only checks line continuation
2244cfcd011fSBram Moolenaar  var lines =<< trim END
224547e880d6SBram Moolenaar      vim9script
224647e880d6SBram Moolenaar      echomsg 'here'
224747e880d6SBram Moolenaar                .. ' is ' ..
224847e880d6SBram Moolenaar                   'a message'
224947e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
225047e880d6SBram Moolenaar  END
225147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
225247e880d6SBram Moolenaarenddef
225347e880d6SBram Moolenaar
2254f93c7feaSBram Moolenaardef Test_echoerr_cmd()
225540ee466cSBram Moolenaar  try
225640ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
225740ee466cSBram Moolenaar  catch
225840ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
225940ee466cSBram Moolenaar  endtry
2260f93c7feaSBram Moolenaarenddef
2261f93c7feaSBram Moolenaar
226247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2263f5be8cdbSBram Moolenaar  # only checks line continuation
2264cfcd011fSBram Moolenaar  var lines =<< trim END
226547e880d6SBram Moolenaar      vim9script
226647e880d6SBram Moolenaar      try
226747e880d6SBram Moolenaar        echoerr 'this'
226847e880d6SBram Moolenaar                .. ' is ' ..
226947e880d6SBram Moolenaar                   'wrong'
227047e880d6SBram Moolenaar      catch
227147e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
227247e880d6SBram Moolenaar      endtry
227347e880d6SBram Moolenaar  END
227447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
227547e880d6SBram Moolenaarenddef
227647e880d6SBram Moolenaar
227741fe0617SBram Moolenaardef Test_for_outside_of_function()
2278cfcd011fSBram Moolenaar  var lines =<< trim END
227941fe0617SBram Moolenaar    vim9script
228041fe0617SBram Moolenaar    new
228141fe0617SBram Moolenaar    for var in range(0, 3)
228241fe0617SBram Moolenaar      append(line('$'), var)
228341fe0617SBram Moolenaar    endfor
228441fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
228541fe0617SBram Moolenaar    bwipe!
2286522eefd9SBram Moolenaar
2287522eefd9SBram Moolenaar    var result = ''
2288522eefd9SBram Moolenaar    for i in [1, 2, 3]
2289522eefd9SBram Moolenaar      var loop = ' loop ' .. i
2290522eefd9SBram Moolenaar      result ..= loop
2291522eefd9SBram Moolenaar    endfor
2292522eefd9SBram Moolenaar    assert_equal(' loop 1 loop 2 loop 3', result)
229341fe0617SBram Moolenaar  END
229441fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
229541fe0617SBram Moolenaar  source Xvim9for.vim
229641fe0617SBram Moolenaar  delete('Xvim9for.vim')
229741fe0617SBram Moolenaarenddef
22988a7d6542SBram Moolenaar
2299e8c4abbbSBram Moolenaardef Test_for_loop()
2300f2253963SBram Moolenaar  var lines =<< trim END
2301cfcd011fSBram Moolenaar      var result = ''
2302e8c4abbbSBram Moolenaar      for cnt in range(7)
2303e8c4abbbSBram Moolenaar        if cnt == 4
2304e8c4abbbSBram Moolenaar          break
2305e8c4abbbSBram Moolenaar        endif
2306e8c4abbbSBram Moolenaar        if cnt == 2
2307e8c4abbbSBram Moolenaar          continue
2308e8c4abbbSBram Moolenaar        endif
2309e8c4abbbSBram Moolenaar        result ..= cnt .. '_'
2310e8c4abbbSBram Moolenaar      endfor
2311e8c4abbbSBram Moolenaar      assert_equal('0_1_3_', result)
23120ad3e894SBram Moolenaar
2313cfcd011fSBram Moolenaar      var concat = ''
23140ad3e894SBram Moolenaar      for str in eval('["one", "two"]')
23150ad3e894SBram Moolenaar        concat ..= str
23160ad3e894SBram Moolenaar      endfor
23170ad3e894SBram Moolenaar      assert_equal('onetwo', concat)
231838bd8de5SBram Moolenaar
231938bd8de5SBram Moolenaar      var total = 0
232038bd8de5SBram Moolenaar      for nr in
232138bd8de5SBram Moolenaar          [1, 2, 3]
232238bd8de5SBram Moolenaar        total += nr
232338bd8de5SBram Moolenaar      endfor
232438bd8de5SBram Moolenaar      assert_equal(6, total)
232538bd8de5SBram Moolenaar
232638bd8de5SBram Moolenaar      total = 0
232738bd8de5SBram Moolenaar      for nr
232838bd8de5SBram Moolenaar        in [1, 2, 3]
232938bd8de5SBram Moolenaar        total += nr
233038bd8de5SBram Moolenaar      endfor
233138bd8de5SBram Moolenaar      assert_equal(6, total)
233238bd8de5SBram Moolenaar
233338bd8de5SBram Moolenaar      total = 0
233438bd8de5SBram Moolenaar      for nr
233538bd8de5SBram Moolenaar        in
233638bd8de5SBram Moolenaar        [1, 2, 3]
233738bd8de5SBram Moolenaar        total += nr
233838bd8de5SBram Moolenaar      endfor
233938bd8de5SBram Moolenaar      assert_equal(6, total)
2340036d0714SBram Moolenaar
2341a3589a0dSBram Moolenaar      # with type
2342a3589a0dSBram Moolenaar      total = 0
2343a3589a0dSBram Moolenaar      for n: number in [1, 2, 3]
2344a3589a0dSBram Moolenaar        total += n
2345a3589a0dSBram Moolenaar      endfor
2346a3589a0dSBram Moolenaar      assert_equal(6, total)
2347a3589a0dSBram Moolenaar
2348fe090eb5SBram Moolenaar      var chars = ''
2349fe090eb5SBram Moolenaar      for s: string in 'foobar'
2350fe090eb5SBram Moolenaar        chars ..= s
2351fe090eb5SBram Moolenaar      endfor
2352fe090eb5SBram Moolenaar      assert_equal('foobar', chars)
2353fe090eb5SBram Moolenaar
2354a3589a0dSBram Moolenaar      # unpack with type
2355f2253963SBram Moolenaar      var res = ''
2356a3589a0dSBram Moolenaar      for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2357a3589a0dSBram Moolenaar        res ..= n .. s
2358a3589a0dSBram Moolenaar      endfor
2359a3589a0dSBram Moolenaar      assert_equal('1a2b', res)
2360a3589a0dSBram Moolenaar
2361a3589a0dSBram Moolenaar      # loop over string
2362a3589a0dSBram Moolenaar      res = ''
236374e54fcbSBram Moolenaar      for c in 'aéc̀d'
236474e54fcbSBram Moolenaar        res ..= c .. '-'
236574e54fcbSBram Moolenaar      endfor
236674e54fcbSBram Moolenaar      assert_equal('a-é-c̀-d-', res)
236774e54fcbSBram Moolenaar
236874e54fcbSBram Moolenaar      res = ''
236974e54fcbSBram Moolenaar      for c in ''
237074e54fcbSBram Moolenaar        res ..= c .. '-'
237174e54fcbSBram Moolenaar      endfor
237274e54fcbSBram Moolenaar      assert_equal('', res)
237374e54fcbSBram Moolenaar
237474e54fcbSBram Moolenaar      res = ''
237574e54fcbSBram Moolenaar      for c in test_null_string()
237674e54fcbSBram Moolenaar        res ..= c .. '-'
237774e54fcbSBram Moolenaar      endfor
237874e54fcbSBram Moolenaar      assert_equal('', res)
2379f2253963SBram Moolenaar
2380f2253963SBram Moolenaar      var foo: list<dict<any>> = [
2381f2253963SBram Moolenaar              {a: 'Cat'}
2382f2253963SBram Moolenaar            ]
2383f2253963SBram Moolenaar      for dd in foo
2384f2253963SBram Moolenaar        dd.counter = 12
2385f2253963SBram Moolenaar      endfor
2386f2253963SBram Moolenaar      assert_equal([{a: 'Cat', counter: 12}], foo)
2387f2253963SBram Moolenaar  END
2388f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2389e8c4abbbSBram Moolenaarenddef
2390e8c4abbbSBram Moolenaar
2391e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2392025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2393025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2394025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2395675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2396675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2397cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2398822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
23992d870f8dSBram Moolenaar  delfunc! g:Func
2400675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2401675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2402675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
240374e54fcbSBram Moolenaar
240474e54fcbSBram Moolenaar  # wrong type detected at compile time
240574e54fcbSBram Moolenaar  CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
240674e54fcbSBram Moolenaar
240774e54fcbSBram Moolenaar  # wrong type detected at runtime
240874e54fcbSBram Moolenaar  g:adict = {a: 1}
240974e54fcbSBram Moolenaar  CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
241074e54fcbSBram Moolenaar  unlet g:adict
2411f6a8d420SBram Moolenaar
2412f6a8d420SBram Moolenaar  var lines =<< trim END
2413f6a8d420SBram Moolenaar      var d: list<dict<any>> = [{a: 0}]
2414f6a8d420SBram Moolenaar      for e in d
2415f6a8d420SBram Moolenaar        e = {a: 0, b: ''}
2416f6a8d420SBram Moolenaar      endfor
2417f6a8d420SBram Moolenaar  END
2418f6a8d420SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3)
2419fe090eb5SBram Moolenaar
2420fe090eb5SBram Moolenaar  lines =<< trim END
2421fe090eb5SBram Moolenaar      for nr: number in ['foo']
2422fe090eb5SBram Moolenaar      endfor
2423fe090eb5SBram Moolenaar  END
2424fe090eb5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2425e8c4abbbSBram Moolenaarenddef
2426e8c4abbbSBram Moolenaar
2427ea87069dSBram Moolenaardef Test_for_loop_script_var()
2428ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2429ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2430ea87069dSBram Moolenaar
2431ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2432ea87069dSBram Moolenaar  var lines =<< trim END
2433ea87069dSBram Moolenaar    vim9script
2434ea87069dSBram Moolenaar    var total = 0
2435ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2436ea87069dSBram Moolenaar      total += s:var
2437ea87069dSBram Moolenaar    endfor
2438ea87069dSBram Moolenaar    assert_equal(6, total)
2439ea87069dSBram Moolenaar
2440ea87069dSBram Moolenaar    total = 0
2441ea87069dSBram Moolenaar    for var in [1, 2, 3]
2442ea87069dSBram Moolenaar      total += var
2443ea87069dSBram Moolenaar    endfor
2444ea87069dSBram Moolenaar    assert_equal(6, total)
2445ea87069dSBram Moolenaar  END
2446ea87069dSBram Moolenaarenddef
2447ea87069dSBram Moolenaar
2448792f786aSBram Moolenaardef Test_for_loop_unpack()
24494b8a0651SBram Moolenaar  var lines =<< trim END
2450792f786aSBram Moolenaar      var result = []
2451792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2452792f786aSBram Moolenaar        result->add(v1)
2453792f786aSBram Moolenaar        result->add(v2)
2454792f786aSBram Moolenaar      endfor
2455792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2456792f786aSBram Moolenaar
2457792f786aSBram Moolenaar      result = []
2458792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2459792f786aSBram Moolenaar        result->add(v1)
2460792f786aSBram Moolenaar        result->add(v2)
2461792f786aSBram Moolenaar        result->add(v3)
2462792f786aSBram Moolenaar      endfor
2463792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2464792f786aSBram Moolenaar
24654b8a0651SBram Moolenaar      result = []
24664b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
24674b8a0651SBram Moolenaar        result->add(&ts)
24684b8a0651SBram Moolenaar        result->add(&sw)
24694b8a0651SBram Moolenaar      endfor
24704b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
24714b8a0651SBram Moolenaar
24724b8a0651SBram Moolenaar      var slist: list<string>
24734b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
24744b8a0651SBram Moolenaar        slist->add($LOOPVAR)
24754b8a0651SBram Moolenaar        slist->add(@r)
24764b8a0651SBram Moolenaar        slist->add(v:errmsg)
24774b8a0651SBram Moolenaar      endfor
24784b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
24794b8a0651SBram Moolenaar
24804b8a0651SBram Moolenaar      slist = []
24814b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
24824b8a0651SBram Moolenaar        slist->add(g:globalvar)
24834b8a0651SBram Moolenaar        slist->add(b:bufvar)
24844b8a0651SBram Moolenaar        slist->add(w:winvar)
24854b8a0651SBram Moolenaar        slist->add(t:tabvar)
24864b8a0651SBram Moolenaar      endfor
24874b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2488f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
24894b8a0651SBram Moolenaar  END
24904b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
24914b8a0651SBram Moolenaar
24924b8a0651SBram Moolenaar  lines =<< trim END
2493792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2494792f786aSBram Moolenaar        echo v1 v2
2495792f786aSBram Moolenaar      endfor
2496792f786aSBram Moolenaar  END
2497792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2498792f786aSBram Moolenaar
2499792f786aSBram Moolenaar  lines =<< trim END
2500792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2501792f786aSBram Moolenaar        echo v1 v2
2502792f786aSBram Moolenaar      endfor
2503792f786aSBram Moolenaar  END
2504792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2505792f786aSBram Moolenaar
2506792f786aSBram Moolenaar  lines =<< trim END
2507792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2508792f786aSBram Moolenaar        echo v1
2509792f786aSBram Moolenaar      endfor
2510792f786aSBram Moolenaar  END
2511792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2512792f786aSBram Moolenaarenddef
2513792f786aSBram Moolenaar
2514c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2515f2253963SBram Moolenaar  var lines =<< trim END
2516c150c09eSBram Moolenaar      var looped = 0
2517c150c09eSBram Moolenaar      var cleanup = 0
2518c150c09eSBram Moolenaar      for i in range(3)
2519c150c09eSBram Moolenaar        looped += 1
2520c150c09eSBram Moolenaar        try
2521c150c09eSBram Moolenaar          eval [][0]
2522c150c09eSBram Moolenaar        catch
2523c150c09eSBram Moolenaar          continue
2524c150c09eSBram Moolenaar        finally
2525c150c09eSBram Moolenaar          cleanup += 1
2526c150c09eSBram Moolenaar        endtry
2527c150c09eSBram Moolenaar      endfor
2528c150c09eSBram Moolenaar      assert_equal(3, looped)
2529c150c09eSBram Moolenaar      assert_equal(3, cleanup)
2530f2253963SBram Moolenaar  END
2531f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2532c150c09eSBram Moolenaarenddef
2533c150c09eSBram Moolenaar
2534d0df1aacSBram Moolenaardef Test_while_loop()
2535cfcd011fSBram Moolenaar  var result = ''
2536cfcd011fSBram Moolenaar  var cnt = 0
2537d0df1aacSBram Moolenaar  while cnt < 555
2538d0df1aacSBram Moolenaar    if cnt == 3
2539d0df1aacSBram Moolenaar      break
2540d0df1aacSBram Moolenaar    endif
2541d0df1aacSBram Moolenaar    cnt += 1
2542d0df1aacSBram Moolenaar    if cnt == 2
2543d0df1aacSBram Moolenaar      continue
2544d0df1aacSBram Moolenaar    endif
2545d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2546d0df1aacSBram Moolenaar  endwhile
2547d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2548dee37dc7SBram Moolenaar
2549dee37dc7SBram Moolenaar  var s = ''
25500123cc1eSBram Moolenaar  while s == 'x' # {comment}
2551dee37dc7SBram Moolenaar  endwhile
2552d0df1aacSBram Moolenaarenddef
2553d0df1aacSBram Moolenaar
2554e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2555675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2556675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2557675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2558675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2559675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2560675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2561675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
25626628b7ebSBram Moolenaar
25636628b7ebSBram Moolenaar  var lines =<< trim END
25646628b7ebSBram Moolenaar      var s = ''
25656628b7ebSBram Moolenaar      while s = ''
25666628b7ebSBram Moolenaar      endwhile
25676628b7ebSBram Moolenaar  END
25686628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2569bd5da371SBram Moolenaarenddef
2570bd5da371SBram Moolenaar
25719645e2d9SBram Moolenaardef Test_interrupt_loop()
2572cfcd011fSBram Moolenaar  var caught = false
2573cfcd011fSBram Moolenaar  var x = 0
257497acfc78SBram Moolenaar  try
25759645e2d9SBram Moolenaar    while 1
25769645e2d9SBram Moolenaar      x += 1
25779645e2d9SBram Moolenaar      if x == 100
25789645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
25799645e2d9SBram Moolenaar      endif
25809645e2d9SBram Moolenaar    endwhile
258197acfc78SBram Moolenaar  catch
258297acfc78SBram Moolenaar    caught = true
258397acfc78SBram Moolenaar    assert_equal(100, x)
258497acfc78SBram Moolenaar  endtry
258597acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
258625859dd7SBram Moolenaar  # consume the CTRL-C
258725859dd7SBram Moolenaar  getchar(0)
25889645e2d9SBram Moolenaarenddef
258920431c9dSBram Moolenaar
25904fdae999SBram Moolenaardef Test_automatic_line_continuation()
2591cfcd011fSBram Moolenaar  var mylist = [
25924fdae999SBram Moolenaar      'one',
25934fdae999SBram Moolenaar      'two',
25944fdae999SBram Moolenaar      'three',
2595f5be8cdbSBram Moolenaar      ] # comment
25964fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
25974fdae999SBram Moolenaar
2598cfcd011fSBram Moolenaar  var mydict = {
2599e0de171eSBram Moolenaar      ['one']: 1,
2600e0de171eSBram Moolenaar      ['two']: 2,
2601e0de171eSBram Moolenaar      ['three']:
26024fdae999SBram Moolenaar          3,
2603f5be8cdbSBram Moolenaar      } # comment
2604e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2605e0de171eSBram Moolenaar  mydict = {
26062c330432SBram Moolenaar      one: 1,  # comment
26072c330432SBram Moolenaar      two:     # comment
26082c330432SBram Moolenaar           2,  # comment
26092c330432SBram Moolenaar      three: 3 # comment
26102c330432SBram Moolenaar      }
2611e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2612e0de171eSBram Moolenaar  mydict = {
26132c330432SBram Moolenaar      one: 1,
26144fdae999SBram Moolenaar      two:
26154fdae999SBram Moolenaar           2,
26162c330432SBram Moolenaar      three: 3
26174fdae999SBram Moolenaar      }
2618e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2619e6085c53SBram Moolenaar
2620e6085c53SBram Moolenaar  assert_equal(
2621e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2622e6085c53SBram Moolenaar        split('one two three')
2623e6085c53SBram Moolenaar        )
26244fdae999SBram Moolenaarenddef
26254fdae999SBram Moolenaar
26267a092245SBram Moolenaardef Test_vim9_comment()
26277a092245SBram Moolenaar  CheckScriptSuccess([
26287a092245SBram Moolenaar      'vim9script',
26297a092245SBram Moolenaar      '# something',
263093f82cbeSBram Moolenaar      '#something',
263193f82cbeSBram Moolenaar      '#{something',
26327a092245SBram Moolenaar      ])
263393f82cbeSBram Moolenaar
263493f82cbeSBram Moolenaar  split Xfile
263593f82cbeSBram Moolenaar  CheckScriptSuccess([
263693f82cbeSBram Moolenaar      'vim9script',
263793f82cbeSBram Moolenaar      'edit #something',
263893f82cbeSBram Moolenaar      ])
263993f82cbeSBram Moolenaar  CheckScriptSuccess([
264093f82cbeSBram Moolenaar      'vim9script',
264193f82cbeSBram Moolenaar      'edit #{something',
264293f82cbeSBram Moolenaar      ])
264393f82cbeSBram Moolenaar  close
264493f82cbeSBram Moolenaar
26457a092245SBram Moolenaar  CheckScriptFailure([
26467a092245SBram Moolenaar      'vim9script',
26477a092245SBram Moolenaar      ':# something',
26487a092245SBram Moolenaar      ], 'E488:')
26497a092245SBram Moolenaar  CheckScriptFailure([
26507a092245SBram Moolenaar      '# something',
26517a092245SBram Moolenaar      ], 'E488:')
26527a092245SBram Moolenaar  CheckScriptFailure([
26537a092245SBram Moolenaar      ':# something',
26547a092245SBram Moolenaar      ], 'E488:')
26557a092245SBram Moolenaar
26564a8d9f2eSBram Moolenaar  { # block start
26574a8d9f2eSBram Moolenaar  } # block end
26584a8d9f2eSBram Moolenaar  CheckDefFailure([
26594a8d9f2eSBram Moolenaar      '{# comment',
26604a8d9f2eSBram Moolenaar      ], 'E488:')
26614a8d9f2eSBram Moolenaar  CheckDefFailure([
26624a8d9f2eSBram Moolenaar      '{',
26634a8d9f2eSBram Moolenaar      '}# comment',
26644a8d9f2eSBram Moolenaar      ], 'E488:')
26654a8d9f2eSBram Moolenaar
26664a8d9f2eSBram Moolenaar  echo "yes" # comment
26674a8d9f2eSBram Moolenaar  CheckDefFailure([
26684a8d9f2eSBram Moolenaar      'echo "yes"# comment',
26694a8d9f2eSBram Moolenaar      ], 'E488:')
26707a092245SBram Moolenaar  CheckScriptSuccess([
26717a092245SBram Moolenaar      'vim9script',
26727a092245SBram Moolenaar      'echo "yes" # something',
26737a092245SBram Moolenaar      ])
26747a092245SBram Moolenaar  CheckScriptFailure([
26757a092245SBram Moolenaar      'vim9script',
26767a092245SBram Moolenaar      'echo "yes"# something',
26777a092245SBram Moolenaar      ], 'E121:')
26787a092245SBram Moolenaar  CheckScriptFailure([
26797a092245SBram Moolenaar      'vim9script',
26807a092245SBram Moolenaar      'echo# something',
2681f8103f27SBram Moolenaar      ], 'E1144:')
26827a092245SBram Moolenaar  CheckScriptFailure([
26837a092245SBram Moolenaar      'echo "yes" # something',
26847a092245SBram Moolenaar      ], 'E121:')
26857a092245SBram Moolenaar
26864a8d9f2eSBram Moolenaar  exe "echo" # comment
26874a8d9f2eSBram Moolenaar  CheckDefFailure([
26884a8d9f2eSBram Moolenaar      'exe "echo"# comment',
26894a8d9f2eSBram Moolenaar      ], 'E488:')
26904a8d9f2eSBram Moolenaar  CheckScriptSuccess([
26914a8d9f2eSBram Moolenaar      'vim9script',
26924a8d9f2eSBram Moolenaar      'exe "echo" # something',
26934a8d9f2eSBram Moolenaar      ])
26944a8d9f2eSBram Moolenaar  CheckScriptFailure([
26954a8d9f2eSBram Moolenaar      'vim9script',
26964a8d9f2eSBram Moolenaar      'exe "echo"# something',
26974a8d9f2eSBram Moolenaar      ], 'E121:')
26984a8d9f2eSBram Moolenaar  CheckScriptFailure([
26994a8d9f2eSBram Moolenaar      'vim9script',
27004a8d9f2eSBram Moolenaar      'exe# something',
2701f8103f27SBram Moolenaar      ], 'E1144:')
27024a8d9f2eSBram Moolenaar  CheckScriptFailure([
27034a8d9f2eSBram Moolenaar      'exe "echo" # something',
27044a8d9f2eSBram Moolenaar      ], 'E121:')
27054a8d9f2eSBram Moolenaar
27067a092245SBram Moolenaar  CheckDefFailure([
27077a092245SBram Moolenaar      'try# comment',
27087a092245SBram Moolenaar      '  echo "yes"',
27097a092245SBram Moolenaar      'catch',
27107a092245SBram Moolenaar      'endtry',
2711f8103f27SBram Moolenaar      ], 'E1144:')
27122c5ed4e3SBram Moolenaar  CheckScriptFailure([
27132c5ed4e3SBram Moolenaar      'vim9script',
27142c5ed4e3SBram Moolenaar      'try# comment',
27152c5ed4e3SBram Moolenaar      'echo "yes"',
2716f8103f27SBram Moolenaar      ], 'E1144:')
27177a092245SBram Moolenaar  CheckDefFailure([
27187a092245SBram Moolenaar      'try',
2719a72cfb80SBram Moolenaar      '  throw#comment',
2720a72cfb80SBram Moolenaar      'catch',
2721a72cfb80SBram Moolenaar      'endtry',
2722f8103f27SBram Moolenaar      ], 'E1144:')
2723a72cfb80SBram Moolenaar  CheckDefFailure([
2724a72cfb80SBram Moolenaar      'try',
2725a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2726a72cfb80SBram Moolenaar      'catch',
2727a72cfb80SBram Moolenaar      'endtry',
2728a72cfb80SBram Moolenaar      ], 'E488:')
2729a72cfb80SBram Moolenaar  CheckDefFailure([
2730a72cfb80SBram Moolenaar      'try',
27317a092245SBram Moolenaar      '  echo "yes"',
27327a092245SBram Moolenaar      'catch# comment',
27337a092245SBram Moolenaar      'endtry',
2734f8103f27SBram Moolenaar      ], 'E1144:')
27352c5ed4e3SBram Moolenaar  CheckScriptFailure([
27362c5ed4e3SBram Moolenaar      'vim9script',
27372c5ed4e3SBram Moolenaar      'try',
27382c5ed4e3SBram Moolenaar      '  echo "yes"',
27392c5ed4e3SBram Moolenaar      'catch# comment',
27402c5ed4e3SBram Moolenaar      'endtry',
2741f8103f27SBram Moolenaar      ], 'E1144:')
27422c5ed4e3SBram Moolenaar  CheckDefFailure([
27432c5ed4e3SBram Moolenaar      'try',
27442c5ed4e3SBram Moolenaar      '  echo "yes"',
27452c5ed4e3SBram Moolenaar      'catch /pat/# comment',
27462c5ed4e3SBram Moolenaar      'endtry',
27472c5ed4e3SBram Moolenaar      ], 'E488:')
27487a092245SBram Moolenaar  CheckDefFailure([
27497a092245SBram Moolenaar      'try',
27507a092245SBram Moolenaar      'echo "yes"',
27517a092245SBram Moolenaar      'catch',
27527a092245SBram Moolenaar      'endtry# comment',
2753f8103f27SBram Moolenaar      ], 'E1144:')
27542c5ed4e3SBram Moolenaar  CheckScriptFailure([
27552c5ed4e3SBram Moolenaar      'vim9script',
27562c5ed4e3SBram Moolenaar      'try',
27572c5ed4e3SBram Moolenaar      '  echo "yes"',
27582c5ed4e3SBram Moolenaar      'catch',
27592c5ed4e3SBram Moolenaar      'endtry# comment',
2760f8103f27SBram Moolenaar      ], 'E1144:')
27612c5ed4e3SBram Moolenaar
27622c5ed4e3SBram Moolenaar  CheckScriptSuccess([
27632c5ed4e3SBram Moolenaar      'vim9script',
27642c5ed4e3SBram Moolenaar      'hi # comment',
27652c5ed4e3SBram Moolenaar      ])
27662c5ed4e3SBram Moolenaar  CheckScriptFailure([
27672c5ed4e3SBram Moolenaar      'vim9script',
27682c5ed4e3SBram Moolenaar      'hi# comment',
2769f8103f27SBram Moolenaar      ], 'E1144:')
27701966c248SBram Moolenaar  CheckScriptSuccess([
27711966c248SBram Moolenaar      'vim9script',
27721966c248SBram Moolenaar      'hi Search # comment',
27731966c248SBram Moolenaar      ])
27741966c248SBram Moolenaar  CheckScriptFailure([
27751966c248SBram Moolenaar      'vim9script',
27761966c248SBram Moolenaar      'hi Search# comment',
27771966c248SBram Moolenaar      ], 'E416:')
27781966c248SBram Moolenaar  CheckScriptSuccess([
27791966c248SBram Moolenaar      'vim9script',
27801966c248SBram Moolenaar      'hi link This Search # comment',
27811966c248SBram Moolenaar      ])
27821966c248SBram Moolenaar  CheckScriptFailure([
27831966c248SBram Moolenaar      'vim9script',
27841966c248SBram Moolenaar      'hi link This That# comment',
27851966c248SBram Moolenaar      ], 'E413:')
27861966c248SBram Moolenaar  CheckScriptSuccess([
27871966c248SBram Moolenaar      'vim9script',
27881966c248SBram Moolenaar      'hi clear This # comment',
27891966c248SBram Moolenaar      'hi clear # comment',
27901966c248SBram Moolenaar      ])
2791f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2792f5be8cdbSBram Moolenaar  # hi clear This# comment',
27931966c248SBram Moolenaar  CheckScriptFailure([
27941966c248SBram Moolenaar      'vim9script',
27951966c248SBram Moolenaar      'hi clear# comment',
27961966c248SBram Moolenaar      ], 'E416:')
27971966c248SBram Moolenaar
27981966c248SBram Moolenaar  CheckScriptSuccess([
27991966c248SBram Moolenaar      'vim9script',
28001966c248SBram Moolenaar      'hi Group term=bold',
28011966c248SBram Moolenaar      'match Group /todo/ # comment',
28021966c248SBram Moolenaar      ])
28031966c248SBram Moolenaar  CheckScriptFailure([
28041966c248SBram Moolenaar      'vim9script',
28051966c248SBram Moolenaar      'hi Group term=bold',
28061966c248SBram Moolenaar      'match Group /todo/# comment',
28071966c248SBram Moolenaar      ], 'E488:')
28081966c248SBram Moolenaar  CheckScriptSuccess([
28091966c248SBram Moolenaar      'vim9script',
28101966c248SBram Moolenaar      'match # comment',
28111966c248SBram Moolenaar      ])
28121966c248SBram Moolenaar  CheckScriptFailure([
28131966c248SBram Moolenaar      'vim9script',
28141966c248SBram Moolenaar      'match# comment',
2815f8103f27SBram Moolenaar      ], 'E1144:')
28161966c248SBram Moolenaar  CheckScriptSuccess([
28171966c248SBram Moolenaar      'vim9script',
28181966c248SBram Moolenaar      'match none # comment',
28191966c248SBram Moolenaar      ])
28201966c248SBram Moolenaar  CheckScriptFailure([
28211966c248SBram Moolenaar      'vim9script',
28221966c248SBram Moolenaar      'match none# comment',
28231966c248SBram Moolenaar      ], 'E475:')
28241966c248SBram Moolenaar
28251966c248SBram Moolenaar  CheckScriptSuccess([
28261966c248SBram Moolenaar      'vim9script',
28271966c248SBram Moolenaar      'menutrans clear # comment',
28281966c248SBram Moolenaar      ])
28291966c248SBram Moolenaar  CheckScriptFailure([
28301966c248SBram Moolenaar      'vim9script',
28311966c248SBram Moolenaar      'menutrans clear# comment text',
28321966c248SBram Moolenaar      ], 'E474:')
28331966c248SBram Moolenaar
28341966c248SBram Moolenaar  CheckScriptSuccess([
28351966c248SBram Moolenaar      'vim9script',
28361966c248SBram Moolenaar      'syntax clear # comment',
28371966c248SBram Moolenaar      ])
28381966c248SBram Moolenaar  CheckScriptFailure([
28391966c248SBram Moolenaar      'vim9script',
28401966c248SBram Moolenaar      'syntax clear# comment text',
28411966c248SBram Moolenaar      ], 'E28:')
28421966c248SBram Moolenaar  CheckScriptSuccess([
28431966c248SBram Moolenaar      'vim9script',
28441966c248SBram Moolenaar      'syntax keyword Word some',
28451966c248SBram Moolenaar      'syntax clear Word # comment',
28461966c248SBram Moolenaar      ])
28471966c248SBram Moolenaar  CheckScriptFailure([
28481966c248SBram Moolenaar      'vim9script',
28491966c248SBram Moolenaar      'syntax keyword Word some',
28501966c248SBram Moolenaar      'syntax clear Word# comment text',
28511966c248SBram Moolenaar      ], 'E28:')
28521966c248SBram Moolenaar
28531966c248SBram Moolenaar  CheckScriptSuccess([
28541966c248SBram Moolenaar      'vim9script',
28551966c248SBram Moolenaar      'syntax list # comment',
28561966c248SBram Moolenaar      ])
28571966c248SBram Moolenaar  CheckScriptFailure([
28581966c248SBram Moolenaar      'vim9script',
28591966c248SBram Moolenaar      'syntax list# comment text',
28601966c248SBram Moolenaar      ], 'E28:')
28611966c248SBram Moolenaar
28621966c248SBram Moolenaar  CheckScriptSuccess([
28631966c248SBram Moolenaar      'vim9script',
28641966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
28651966c248SBram Moolenaar      ])
28661966c248SBram Moolenaar  CheckScriptFailure([
28671966c248SBram Moolenaar      'vim9script',
28681966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
28691966c248SBram Moolenaar      ], 'E475:')
28701966c248SBram Moolenaar
28711966c248SBram Moolenaar  CheckScriptSuccess([
28721966c248SBram Moolenaar      'vim9script',
28731966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
28741966c248SBram Moolenaar      ])
28751966c248SBram Moolenaar  CheckScriptFailure([
28761966c248SBram Moolenaar      'vim9script',
28771966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
28781966c248SBram Moolenaar      ], 'E789:')
28791966c248SBram Moolenaar
28801966c248SBram Moolenaar  CheckScriptSuccess([
28811966c248SBram Moolenaar      'vim9script',
28821966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
28831966c248SBram Moolenaar      ])
28841966c248SBram Moolenaar  CheckScriptFailure([
28851966c248SBram Moolenaar      'vim9script',
28861966c248SBram Moolenaar      'syntax match Word /pat/# comment',
28871966c248SBram Moolenaar      ], 'E402:')
28881966c248SBram Moolenaar
28891966c248SBram Moolenaar  CheckScriptSuccess([
28901966c248SBram Moolenaar      'vim9script',
28911966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
28921966c248SBram Moolenaar      ])
28931966c248SBram Moolenaar  CheckScriptFailure([
28941966c248SBram Moolenaar      'vim9script',
28951966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
28961966c248SBram Moolenaar      ], 'E475:')
28971966c248SBram Moolenaar  CheckScriptFailure([
28981966c248SBram Moolenaar      'vim9script',
28991966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
29001966c248SBram Moolenaar      ], 'E406:')
29011966c248SBram Moolenaar  CheckScriptFailure([
29021966c248SBram Moolenaar      'vim9script',
29031966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
29041966c248SBram Moolenaar      ], 'E475:')
29051966c248SBram Moolenaar
29061966c248SBram Moolenaar  CheckScriptSuccess([
29071966c248SBram Moolenaar      'vim9script',
29081966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
29091966c248SBram Moolenaar      ])
29101966c248SBram Moolenaar  CheckScriptFailure([
29111966c248SBram Moolenaar      'vim9script',
29121966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2913d032f34aSBram Moolenaar      ], 'E402:')
29141966c248SBram Moolenaar
29151966c248SBram Moolenaar  CheckScriptSuccess([
29161966c248SBram Moolenaar      'vim9script',
29171966c248SBram Moolenaar      'syntax sync # comment',
29181966c248SBram Moolenaar      ])
29191966c248SBram Moolenaar  CheckScriptFailure([
29201966c248SBram Moolenaar      'vim9script',
29211966c248SBram Moolenaar      'syntax sync# comment',
29221966c248SBram Moolenaar      ], 'E404:')
29231966c248SBram Moolenaar  CheckScriptSuccess([
29241966c248SBram Moolenaar      'vim9script',
29251966c248SBram Moolenaar      'syntax sync ccomment # comment',
29261966c248SBram Moolenaar      ])
29271966c248SBram Moolenaar  CheckScriptFailure([
29281966c248SBram Moolenaar      'vim9script',
29291966c248SBram Moolenaar      'syntax sync ccomment# comment',
29301966c248SBram Moolenaar      ], 'E404:')
29311966c248SBram Moolenaar
29321966c248SBram Moolenaar  CheckScriptSuccess([
29331966c248SBram Moolenaar      'vim9script',
29341966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
29351966c248SBram Moolenaar      ])
29361966c248SBram Moolenaar  CheckScriptFailure([
29371966c248SBram Moolenaar      'vim9script',
29381966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
29391966c248SBram Moolenaar      ], 'E475:')
2940a72cfb80SBram Moolenaar
2941a72cfb80SBram Moolenaar  CheckScriptSuccess([
2942a72cfb80SBram Moolenaar      'vim9script',
2943a72cfb80SBram Moolenaar      'command Echo echo # comment',
2944a72cfb80SBram Moolenaar      'command Echo # comment',
29452d870f8dSBram Moolenaar      'delcommand Echo',
2946a72cfb80SBram Moolenaar      ])
2947a72cfb80SBram Moolenaar  CheckScriptFailure([
2948a72cfb80SBram Moolenaar      'vim9script',
2949a72cfb80SBram Moolenaar      'command Echo echo# comment',
2950a72cfb80SBram Moolenaar      'Echo',
2951f8103f27SBram Moolenaar      ], 'E1144:')
29522d870f8dSBram Moolenaar  delcommand Echo
295370249ee8SBram Moolenaar
295470249ee8SBram Moolenaar  var curdir = getcwd()
295570249ee8SBram Moolenaar  CheckScriptSuccess([
295670249ee8SBram Moolenaar      'command Echo cd " comment',
295770249ee8SBram Moolenaar      'Echo',
295870249ee8SBram Moolenaar      'delcommand Echo',
295970249ee8SBram Moolenaar      ])
296070249ee8SBram Moolenaar  CheckScriptSuccess([
2961090728adSBram Moolenaar      'vim9script',
296270249ee8SBram Moolenaar      'command Echo cd # comment',
296370249ee8SBram Moolenaar      'Echo',
296470249ee8SBram Moolenaar      'delcommand Echo',
296570249ee8SBram Moolenaar      ])
296670249ee8SBram Moolenaar  CheckScriptFailure([
296770249ee8SBram Moolenaar      'vim9script',
296870249ee8SBram Moolenaar      'command Echo cd " comment',
296970249ee8SBram Moolenaar      'Echo',
297070249ee8SBram Moolenaar      ], 'E344:')
297170249ee8SBram Moolenaar  delcommand Echo
297270249ee8SBram Moolenaar  chdir(curdir)
297370249ee8SBram Moolenaar
2974a72cfb80SBram Moolenaar  CheckScriptFailure([
2975a72cfb80SBram Moolenaar      'vim9script',
2976a72cfb80SBram Moolenaar      'command Echo# comment',
2977a72cfb80SBram Moolenaar      ], 'E182:')
2978a72cfb80SBram Moolenaar  CheckScriptFailure([
2979a72cfb80SBram Moolenaar      'vim9script',
2980a72cfb80SBram Moolenaar      'command Echo echo',
2981a72cfb80SBram Moolenaar      'command Echo# comment',
2982a72cfb80SBram Moolenaar      ], 'E182:')
29832d870f8dSBram Moolenaar  delcommand Echo
2984a72cfb80SBram Moolenaar
2985a72cfb80SBram Moolenaar  CheckScriptSuccess([
2986a72cfb80SBram Moolenaar      'vim9script',
2987a72cfb80SBram Moolenaar      'function # comment',
2988a72cfb80SBram Moolenaar      ])
2989a72cfb80SBram Moolenaar  CheckScriptFailure([
2990a72cfb80SBram Moolenaar      'vim9script',
29919898107fSBram Moolenaar      'function " comment',
29929898107fSBram Moolenaar      ], 'E129:')
29939898107fSBram Moolenaar  CheckScriptFailure([
29949898107fSBram Moolenaar      'vim9script',
2995a72cfb80SBram Moolenaar      'function# comment',
2996f8103f27SBram Moolenaar      ], 'E1144:')
2997a72cfb80SBram Moolenaar  CheckScriptSuccess([
2998a72cfb80SBram Moolenaar      'vim9script',
2999a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
3000a72cfb80SBram Moolenaar      ])
3001a72cfb80SBram Moolenaar  CheckScriptFailure([
3002a72cfb80SBram Moolenaar      'vim9script',
3003a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
3004a72cfb80SBram Moolenaar      ], 'E488:')
3005a72cfb80SBram Moolenaar
3006a72cfb80SBram Moolenaar  CheckScriptSuccess([
3007a72cfb80SBram Moolenaar      'vim9script',
30084c17ad94SBram Moolenaar      'func g:DeleteMeA()',
3009a72cfb80SBram Moolenaar      'endfunc',
30104c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
3011a72cfb80SBram Moolenaar      ])
3012a72cfb80SBram Moolenaar  CheckScriptFailure([
3013a72cfb80SBram Moolenaar      'vim9script',
30144c17ad94SBram Moolenaar      'func g:DeleteMeB()',
3015a72cfb80SBram Moolenaar      'endfunc',
30164c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
3017a72cfb80SBram Moolenaar      ], 'E488:')
3018a72cfb80SBram Moolenaar
3019a72cfb80SBram Moolenaar  CheckScriptSuccess([
3020a72cfb80SBram Moolenaar      'vim9script',
3021a72cfb80SBram Moolenaar      'call execute("ls") # comment',
3022a72cfb80SBram Moolenaar      ])
3023a72cfb80SBram Moolenaar  CheckScriptFailure([
3024a72cfb80SBram Moolenaar      'vim9script',
3025a72cfb80SBram Moolenaar      'call execute("ls")# comment',
3026a72cfb80SBram Moolenaar      ], 'E488:')
3027e7e4838fSBram Moolenaar
3028e7e4838fSBram Moolenaar  CheckScriptFailure([
3029e7e4838fSBram Moolenaar      'def Test() " comment',
3030e7e4838fSBram Moolenaar      'enddef',
3031e7e4838fSBram Moolenaar      ], 'E488:')
3032e7e4838fSBram Moolenaar  CheckScriptFailure([
3033e7e4838fSBram Moolenaar      'vim9script',
3034e7e4838fSBram Moolenaar      'def Test() " comment',
3035e7e4838fSBram Moolenaar      'enddef',
3036e7e4838fSBram Moolenaar      ], 'E488:')
3037e7e4838fSBram Moolenaar
3038e7e4838fSBram Moolenaar  CheckScriptSuccess([
3039e7e4838fSBram Moolenaar      'func Test() " comment',
3040e7e4838fSBram Moolenaar      'endfunc',
30412d870f8dSBram Moolenaar      'delfunc Test',
3042e7e4838fSBram Moolenaar      ])
30439898107fSBram Moolenaar  CheckScriptSuccess([
3044e7e4838fSBram Moolenaar      'vim9script',
3045e7e4838fSBram Moolenaar      'func Test() " comment',
3046e7e4838fSBram Moolenaar      'endfunc',
30479898107fSBram Moolenaar      ])
3048e7e4838fSBram Moolenaar
3049e7e4838fSBram Moolenaar  CheckScriptSuccess([
3050e7e4838fSBram Moolenaar      'def Test() # comment',
3051e7e4838fSBram Moolenaar      'enddef',
3052e7e4838fSBram Moolenaar      ])
3053e7e4838fSBram Moolenaar  CheckScriptFailure([
3054e7e4838fSBram Moolenaar      'func Test() # comment',
3055e7e4838fSBram Moolenaar      'endfunc',
3056e7e4838fSBram Moolenaar      ], 'E488:')
30572c5ed4e3SBram Moolenaarenddef
30582c5ed4e3SBram Moolenaar
30592c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
30602c5ed4e3SBram Moolenaar  CheckCanRunGui
30612c5ed4e3SBram Moolenaar
30622c5ed4e3SBram Moolenaar  CheckScriptFailure([
30632c5ed4e3SBram Moolenaar      'vim9script',
30642c5ed4e3SBram Moolenaar      'gui#comment'
3065f8103f27SBram Moolenaar      ], 'E1144:')
30662c5ed4e3SBram Moolenaar  CheckScriptFailure([
30672c5ed4e3SBram Moolenaar      'vim9script',
30682c5ed4e3SBram Moolenaar      'gui -f#comment'
30692c5ed4e3SBram Moolenaar      ], 'E499:')
30707a092245SBram Moolenaarenddef
30717a092245SBram Moolenaar
3072a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
30736797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
30746797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3075a26b9700SBram Moolenaar
3076a26b9700SBram Moolenaar  edit test.vim
3077a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3078a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3079a26b9700SBram Moolenaar
3080a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3081a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3082a26b9700SBram Moolenaar
3083a26b9700SBram Moolenaar  g:entered = 0
3084a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3085a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3086a26b9700SBram Moolenaar
3087a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3088a26b9700SBram Moolenaar
3089a26b9700SBram Moolenaar  au! TabEnter
3090a26b9700SBram Moolenaar  unlet g:entered
3091d72c1bf0SBram Moolenaar
3092d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3093d72c1bf0SBram Moolenaar      'vim9script',
30946797966dSBram Moolenaar      'g:var = 123',
3095e55b1c09SBram Moolenaar      'b:var = 456',
3096e55b1c09SBram Moolenaar      'w:var = 777',
3097e55b1c09SBram Moolenaar      't:var = 888',
3098d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3099d72c1bf0SBram Moolenaar      ])
3100d72c1bf0SBram Moolenaar
3101d72c1bf0SBram Moolenaar  CheckScriptFailure([
3102d72c1bf0SBram Moolenaar      'vim9script',
3103cfcd011fSBram Moolenaar      'let var = 123',
3104cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3105cfcd011fSBram Moolenaar
3106cfcd011fSBram Moolenaar  CheckScriptFailure([
3107cfcd011fSBram Moolenaar      'vim9script',
3108cfcd011fSBram Moolenaar      'var g:var = 123',
3109e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3110e55b1c09SBram Moolenaar
3111e55b1c09SBram Moolenaar  CheckScriptFailure([
3112e55b1c09SBram Moolenaar      'vim9script',
3113cfcd011fSBram Moolenaar      'var b:var = 123',
3114e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3115e55b1c09SBram Moolenaar
3116e55b1c09SBram Moolenaar  CheckScriptFailure([
3117e55b1c09SBram Moolenaar      'vim9script',
3118cfcd011fSBram Moolenaar      'var w:var = 123',
3119e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3120e55b1c09SBram Moolenaar
3121e55b1c09SBram Moolenaar  CheckScriptFailure([
3122e55b1c09SBram Moolenaar      'vim9script',
3123cfcd011fSBram Moolenaar      'var t:var = 123',
3124e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3125e55b1c09SBram Moolenaar
3126e55b1c09SBram Moolenaar  CheckScriptFailure([
3127e55b1c09SBram Moolenaar      'vim9script',
3128cfcd011fSBram Moolenaar      'var v:version = 123',
3129e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3130e55b1c09SBram Moolenaar
3131e55b1c09SBram Moolenaar  CheckScriptFailure([
3132e55b1c09SBram Moolenaar      'vim9script',
3133cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3134e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
31356797966dSBram Moolenaar
31366797966dSBram Moolenaar  CheckScriptFailure([
31376797966dSBram Moolenaar      'vim9script',
31386797966dSBram Moolenaar      'g:var = 123',
313932e35117SBram Moolenaar      'unlet g:var# comment1',
3140d72c1bf0SBram Moolenaar      ], 'E108:')
3141d72c1bf0SBram Moolenaar
3142d72c1bf0SBram Moolenaar  CheckScriptFailure([
3143d72c1bf0SBram Moolenaar      'let g:var = 123',
3144d72c1bf0SBram Moolenaar      'unlet g:var # something',
3145d72c1bf0SBram Moolenaar      ], 'E488:')
3146faac4104SBram Moolenaar
3147faac4104SBram Moolenaar  CheckScriptSuccess([
3148faac4104SBram Moolenaar      'vim9script',
314932e35117SBram Moolenaar      'if 1 # comment2',
3150faac4104SBram Moolenaar      '  echo "yes"',
3151faac4104SBram Moolenaar      'elseif 2 #comment',
3152faac4104SBram Moolenaar      '  echo "no"',
3153faac4104SBram Moolenaar      'endif',
3154faac4104SBram Moolenaar      ])
3155faac4104SBram Moolenaar
3156faac4104SBram Moolenaar  CheckScriptFailure([
3157faac4104SBram Moolenaar      'vim9script',
315832e35117SBram Moolenaar      'if 1# comment3',
3159faac4104SBram Moolenaar      '  echo "yes"',
3160faac4104SBram Moolenaar      'endif',
3161faac4104SBram Moolenaar      ], 'E15:')
3162faac4104SBram Moolenaar
3163faac4104SBram Moolenaar  CheckScriptFailure([
3164faac4104SBram Moolenaar      'vim9script',
316532e35117SBram Moolenaar      'if 0 # comment4',
3166faac4104SBram Moolenaar      '  echo "yes"',
3167faac4104SBram Moolenaar      'elseif 2#comment',
3168faac4104SBram Moolenaar      '  echo "no"',
3169faac4104SBram Moolenaar      'endif',
3170faac4104SBram Moolenaar      ], 'E15:')
3171faac4104SBram Moolenaar
3172faac4104SBram Moolenaar  CheckScriptSuccess([
3173faac4104SBram Moolenaar      'vim9script',
3174cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3175faac4104SBram Moolenaar      ])
3176faac4104SBram Moolenaar
3177faac4104SBram Moolenaar  CheckScriptFailure([
3178faac4104SBram Moolenaar      'vim9script',
3179cfcd011fSBram Moolenaar      'var v = 1# comment6',
318032e35117SBram Moolenaar      ], 'E15:')
3181faac4104SBram Moolenaar
3182faac4104SBram Moolenaar  CheckScriptSuccess([
3183faac4104SBram Moolenaar      'vim9script',
3184faac4104SBram Moolenaar      'new'
3185d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3186df069eecSBram Moolenaar      ':$',
3187faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3188faac4104SBram Moolenaar      'bwipe!',
3189faac4104SBram Moolenaar      ])
3190faac4104SBram Moolenaar
3191f5be8cdbSBram Moolenaar  CheckScriptFailure([
3192f5be8cdbSBram Moolenaar      'vim9script',
3193f5be8cdbSBram Moolenaar      'new'
3194d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3195f5be8cdbSBram Moolenaar      ':$',
3196f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3197f5be8cdbSBram Moolenaar      'bwipe!',
3198f5be8cdbSBram Moolenaar      ], 'E488:')
3199f5be8cdbSBram Moolenaar
3200f5be8cdbSBram Moolenaar  CheckScriptFailure([
3201f5be8cdbSBram Moolenaar      'vim9script',
3202f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3203f5be8cdbSBram Moolenaar      ], 'E477:')
3204a26b9700SBram Moolenaarenddef
3205a26b9700SBram Moolenaar
32067e5bd91dSBram Moolenaardef Test_finish()
3207cfcd011fSBram Moolenaar  var lines =<< trim END
32087e5bd91dSBram Moolenaar    vim9script
32096797966dSBram Moolenaar    g:res = 'one'
32107e5bd91dSBram Moolenaar    if v:false | finish | endif
32116797966dSBram Moolenaar    g:res = 'two'
32127e5bd91dSBram Moolenaar    finish
32136797966dSBram Moolenaar    g:res = 'three'
32147e5bd91dSBram Moolenaar  END
32157e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
32167e5bd91dSBram Moolenaar  source Xfinished
32177e5bd91dSBram Moolenaar  assert_equal('two', g:res)
32187e5bd91dSBram Moolenaar
32197e5bd91dSBram Moolenaar  unlet g:res
32207e5bd91dSBram Moolenaar  delete('Xfinished')
32217e5bd91dSBram Moolenaarenddef
32227e5bd91dSBram Moolenaar
3223a5d0077eSBram Moolenaardef Test_forward_declaration()
3224cfcd011fSBram Moolenaar  var lines =<< trim END
3225a5d0077eSBram Moolenaar    vim9script
3226a5d0077eSBram Moolenaar    def GetValue(): string
3227a5d0077eSBram Moolenaar      return theVal
3228a5d0077eSBram Moolenaar    enddef
3229cfcd011fSBram Moolenaar    var theVal = 'something'
3230822ba247SBram Moolenaar    g:initVal = GetValue()
3231a5d0077eSBram Moolenaar    theVal = 'else'
3232a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3233a5d0077eSBram Moolenaar  END
3234a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3235a5d0077eSBram Moolenaar  source Xforward
3236a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3237a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3238a5d0077eSBram Moolenaar
3239a5d0077eSBram Moolenaar  unlet g:initVal
3240a5d0077eSBram Moolenaar  unlet g:laterVal
3241a5d0077eSBram Moolenaar  delete('Xforward')
3242a5d0077eSBram Moolenaarenddef
3243a5d0077eSBram Moolenaar
32449721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3245a6294955SBram Moolenaar  var vim9_lines =<< trim END
3246a6294955SBram Moolenaar    vim9script
3247a6294955SBram Moolenaar    var local = 'local'
3248a6294955SBram Moolenaar    g:global = 'global'
3249a6294955SBram Moolenaar    export var exported = 'exported'
3250a6294955SBram Moolenaar    export def GetText(): string
3251a6294955SBram Moolenaar       return 'text'
3252a6294955SBram Moolenaar    enddef
3253a6294955SBram Moolenaar  END
3254a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3255a6294955SBram Moolenaar
3256cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
32579721fb4eSBram Moolenaar    source Xvim9_script.vim
32589721fb4eSBram Moolenaar
32599721fb4eSBram Moolenaar    call assert_false(exists('local'))
32609721fb4eSBram Moolenaar    call assert_false(exists('exported'))
32619721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
32629721fb4eSBram Moolenaar    call assert_equal('global', global)
32639721fb4eSBram Moolenaar    call assert_equal('global', g:global)
32649721fb4eSBram Moolenaar
32659721fb4eSBram Moolenaar    " imported variable becomes script-local
32669721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
32679721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
32689721fb4eSBram Moolenaar    call assert_false(exists('exported'))
32699721fb4eSBram Moolenaar
32709721fb4eSBram Moolenaar    " imported function becomes script-local
32719721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
32729721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
32739721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
32749721fb4eSBram Moolenaar  END
32759721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
32769721fb4eSBram Moolenaar
32779721fb4eSBram Moolenaar  source Xlegacy_script.vim
32789721fb4eSBram Moolenaar  assert_equal('global', g:global)
3279f5be8cdbSBram Moolenaar  unlet g:global
32809721fb4eSBram Moolenaar
32819721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
32829721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
32839721fb4eSBram Moolenaarenddef
3284a5d0077eSBram Moolenaar
3285e535db86SBram Moolenaardef Test_declare_script_in_func()
3286e535db86SBram Moolenaar  var lines =<< trim END
3287e535db86SBram Moolenaar      vim9script
3288e535db86SBram Moolenaar      func Declare()
3289e535db86SBram Moolenaar        let s:local = 123
3290e535db86SBram Moolenaar      endfunc
3291e535db86SBram Moolenaar      Declare()
3292e535db86SBram Moolenaar      assert_equal(123, local)
3293e535db86SBram Moolenaar
3294e535db86SBram Moolenaar      var error: string
3295e535db86SBram Moolenaar      try
3296e535db86SBram Moolenaar        local = 'asdf'
3297e535db86SBram Moolenaar      catch
3298e535db86SBram Moolenaar        error = v:exception
3299e535db86SBram Moolenaar      endtry
3300e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3301e535db86SBram Moolenaar
3302e535db86SBram Moolenaar      lockvar local
3303e535db86SBram Moolenaar      try
3304e535db86SBram Moolenaar        local = 999
3305e535db86SBram Moolenaar      catch
3306e535db86SBram Moolenaar        error = v:exception
3307e535db86SBram Moolenaar      endtry
3308e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3309e535db86SBram Moolenaar  END
3310e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3311e535db86SBram Moolenaarenddef
3312e535db86SBram Moolenaar
3313e535db86SBram Moolenaar
33147d699701SBram Moolenaarfunc Test_vim9script_not_global()
33157d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
33167d699701SBram Moolenaar  let vim9lines =<< trim END
33177d699701SBram Moolenaar    vim9script
3318cfcd011fSBram Moolenaar    var name = 'local'
33197d699701SBram Moolenaar    func TheFunc()
33207d699701SBram Moolenaar      echo 'local'
33217d699701SBram Moolenaar    endfunc
33227d699701SBram Moolenaar    def DefFunc()
33237d699701SBram Moolenaar      echo 'local'
33247d699701SBram Moolenaar    enddef
33257d699701SBram Moolenaar  END
33267d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
33277d699701SBram Moolenaar  source Xvim9script.vim
33287d699701SBram Moolenaar  try
33297d699701SBram Moolenaar    echo g:var
33307d699701SBram Moolenaar    assert_report('did not fail')
33317d699701SBram Moolenaar  catch /E121:/
33327d699701SBram Moolenaar    " caught
33337d699701SBram Moolenaar  endtry
33347d699701SBram Moolenaar  try
33357d699701SBram Moolenaar    call TheFunc()
33367d699701SBram Moolenaar    assert_report('did not fail')
33377d699701SBram Moolenaar  catch /E117:/
33387d699701SBram Moolenaar    " caught
33397d699701SBram Moolenaar  endtry
33407d699701SBram Moolenaar  try
33417d699701SBram Moolenaar    call DefFunc()
33427d699701SBram Moolenaar    assert_report('did not fail')
33437d699701SBram Moolenaar  catch /E117:/
33447d699701SBram Moolenaar    " caught
33457d699701SBram Moolenaar  endtry
33467d699701SBram Moolenaar
334725859dd7SBram Moolenaar  call delete('Xvim9script.vim')
33487d699701SBram Moolenaarendfunc
33497d699701SBram Moolenaar
3350eeb27bfeSBram Moolenaardef Test_vim9_copen()
3351eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3352eeb27bfeSBram Moolenaar  copen
3353eeb27bfeSBram Moolenaar  quit
3354eeb27bfeSBram Moolenaarenddef
3355eeb27bfeSBram Moolenaar
335603290b84SBram Moolenaar" test using an auto-loaded function and variable
33572d6b20d6SBram Moolenaardef Test_vim9_autoload()
3358cfcd011fSBram Moolenaar  var lines =<< trim END
33592d6b20d6SBram Moolenaar     vim9script
336003290b84SBram Moolenaar     def some#gettest(): string
336103290b84SBram Moolenaar       return 'test'
336203290b84SBram Moolenaar     enddef
336303290b84SBram Moolenaar     g:some#name = 'name'
3364e3ffcd99SBram Moolenaar
3365e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3366e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3367e3ffcd99SBram Moolenaar     enddef
336803290b84SBram Moolenaar  END
336903290b84SBram Moolenaar
337003290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
337103290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
337203290b84SBram Moolenaar  var save_rtp = &rtp
337303290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
337403290b84SBram Moolenaar
337503290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
337603290b84SBram Moolenaar  assert_equal('name', g:some#name)
337703290b84SBram Moolenaar  g:some#other = 'other'
337803290b84SBram Moolenaar  assert_equal('other', g:some#other)
337903290b84SBram Moolenaar
3380e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3381e3ffcd99SBram Moolenaar
338217f700acSBram Moolenaar  # upper case script name works
338317f700acSBram Moolenaar  lines =<< trim END
338417f700acSBram Moolenaar     vim9script
338517f700acSBram Moolenaar     def Other#getOther(): string
338617f700acSBram Moolenaar       return 'other'
338717f700acSBram Moolenaar     enddef
338817f700acSBram Moolenaar  END
338917f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
339017f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
339117f700acSBram Moolenaar
339203290b84SBram Moolenaar  delete('Xdir', 'rf')
339303290b84SBram Moolenaar  &rtp = save_rtp
339403290b84SBram Moolenaarenddef
339503290b84SBram Moolenaar
339603290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
339703290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
339803290b84SBram Moolenaar  var lines =<< trim END
339903290b84SBram Moolenaar     vim9script
34002d6b20d6SBram Moolenaar     def foo#test()
34012d6b20d6SBram Moolenaar         echomsg getreg('"')
34022d6b20d6SBram Moolenaar     enddef
34032d6b20d6SBram Moolenaar  END
34042d6b20d6SBram Moolenaar
34052d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
34062d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3407cfcd011fSBram Moolenaar  var save_rtp = &rtp
34082d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
34092d6b20d6SBram Moolenaar  augroup test
34102d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
34112d6b20d6SBram Moolenaar  augroup END
34122d6b20d6SBram Moolenaar
34132d6b20d6SBram Moolenaar  normal Y
34142d6b20d6SBram Moolenaar
34152d6b20d6SBram Moolenaar  augroup test
34162d6b20d6SBram Moolenaar    autocmd!
34172d6b20d6SBram Moolenaar  augroup END
34182d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
34192d6b20d6SBram Moolenaar  &rtp = save_rtp
34202d6b20d6SBram Moolenaarenddef
34212d6b20d6SBram Moolenaar
342277e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
342377e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3424cfcd011fSBram Moolenaar  var lines =<< trim END
342577e5dcc3SBram Moolenaar      vim9script
342677e5dcc3SBram Moolenaar      def crash#func()
342777e5dcc3SBram Moolenaar          try
342877e5dcc3SBram Moolenaar              for x in List()
342977e5dcc3SBram Moolenaar              endfor
343077e5dcc3SBram Moolenaar          catch
343177e5dcc3SBram Moolenaar          endtry
343277e5dcc3SBram Moolenaar          g:ok = true
343377e5dcc3SBram Moolenaar      enddef
343477e5dcc3SBram Moolenaar      fu List()
343577e5dcc3SBram Moolenaar          invalid
343677e5dcc3SBram Moolenaar      endfu
343777e5dcc3SBram Moolenaar      try
343848e11c10SBram Moolenaar          alsoinvalid
343977e5dcc3SBram Moolenaar      catch /wontmatch/
344077e5dcc3SBram Moolenaar      endtry
344177e5dcc3SBram Moolenaar  END
344277e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
344377e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
344477e5dcc3SBram Moolenaar
344577e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
344677e5dcc3SBram Moolenaar  lines =<< trim END
344777e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
344877e5dcc3SBram Moolenaar    call crash#func()
344977e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
34509c4f5520SBram Moolenaar    qall!
345177e5dcc3SBram Moolenaar  END
345277e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
345377e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
345477e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
345577e5dcc3SBram Moolenaar
345677e5dcc3SBram Moolenaar  delete('Xdidit')
345777e5dcc3SBram Moolenaar  delete('Xscript')
345877e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
345903290b84SBram Moolenaar
346003290b84SBram Moolenaar  lines =<< trim END
346103290b84SBram Moolenaar    vim9script
346203290b84SBram Moolenaar    var foo#bar = 'asdf'
346303290b84SBram Moolenaar  END
346403290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
346577e5dcc3SBram Moolenaarenddef
346677e5dcc3SBram Moolenaar
346781e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
346881e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
346981e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3470cfcd011fSBram Moolenaar  var lines =<< trim END
347181e17fbeSBram Moolenaar    let s:counter = 1
347281e17fbeSBram Moolenaar    def s:Func()
347381e17fbeSBram Moolenaar      au! CursorHold
347481e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
347581e17fbeSBram Moolenaar    enddef
347681e17fbeSBram Moolenaar    call s:Func()
347781e17fbeSBram Moolenaar    doau CursorHold
347881e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
347981e17fbeSBram Moolenaar    au! CursorHold
348081e17fbeSBram Moolenaar  END
348181e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
348281e17fbeSBram Moolenaarenddef
348381e17fbeSBram Moolenaar
34843896a105SBram Moolenaardef Test_cmdline_win()
34853896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
34863896a105SBram Moolenaar  # the command line window.
34873896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3488cfcd011fSBram Moolenaar  var export_lines =<< trim END
34893896a105SBram Moolenaar    vim9script
3490cfcd011fSBram Moolenaar    export var That = 'yes'
34913896a105SBram Moolenaar  END
34923896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3493cfcd011fSBram Moolenaar  var import_lines =<< trim END
34943896a105SBram Moolenaar    vim9script
34953896a105SBram Moolenaar    import That from './Xexport.vim'
34963896a105SBram Moolenaar  END
34973896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3498cfcd011fSBram Moolenaar  var save_rtp = &rtp
34993896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
35003896a105SBram Moolenaar  syntax on
35013896a105SBram Moolenaar  augroup CmdWin
35023896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
35033896a105SBram Moolenaar  augroup END
35043896a105SBram Moolenaar  # this will open and also close the cmdline window
35053896a105SBram Moolenaar  feedkeys('q:', 'xt')
35063896a105SBram Moolenaar  assert_equal('yes', g:got_there)
35073896a105SBram Moolenaar
35083896a105SBram Moolenaar  augroup CmdWin
35093896a105SBram Moolenaar    au!
35103896a105SBram Moolenaar  augroup END
35113896a105SBram Moolenaar  &rtp = save_rtp
35123896a105SBram Moolenaar  delete('rtp', 'rf')
35133896a105SBram Moolenaarenddef
35143896a105SBram Moolenaar
3515e3d4685fSBram Moolenaardef Test_invalid_sid()
3516e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
351725859dd7SBram Moolenaar
35189c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3519d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3520e3d4685fSBram Moolenaar  endif
3521e3d4685fSBram Moolenaar  delete('Xdidit')
3522e3d4685fSBram Moolenaarenddef
3523e3d4685fSBram Moolenaar
35249ec7026fSBram Moolenaardef Test_restoring_cpo()
35259ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
35269ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
35279ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
35289ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
35299ec7026fSBram Moolenaar  endif
35309ec7026fSBram Moolenaar  delete('Xsourced')
35319ec7026fSBram Moolenaar  delete('Xclose')
3532090728adSBram Moolenaar  delete('Xdone')
35330123cc1eSBram Moolenaar
35340123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
35350123cc1eSBram Moolenaar  set cpo=aABceFsMny>
35360123cc1eSBram Moolenaar  edit XanotherScript
35370123cc1eSBram Moolenaar  so %
35380123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
35390123cc1eSBram Moolenaar  :1del
35400123cc1eSBram Moolenaar  w
35410123cc1eSBram Moolenaar  so %
35420123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
35430123cc1eSBram Moolenaar
35440123cc1eSBram Moolenaar  delete('XanotherScript')
35450123cc1eSBram Moolenaar  set cpo&vim
35469ec7026fSBram Moolenaarenddef
35479ec7026fSBram Moolenaar
3548ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3549ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
355037294bd6SBram Moolenaar  CheckScreendump
3551ffb7dcdbSBram Moolenaar  CheckFeature timers
355237294bd6SBram Moolenaar
3553ffb7dcdbSBram Moolenaar  let lines =<< trim END
355437294bd6SBram Moolenaar    vim9script
355537294bd6SBram Moolenaar    def script#func()
355637294bd6SBram Moolenaar    enddef
355737294bd6SBram Moolenaar  END
3558ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3559ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
356037294bd6SBram Moolenaar
3561ffb7dcdbSBram Moolenaar  let lines =<< trim END
356237294bd6SBram Moolenaar      vim9script
356337294bd6SBram Moolenaar      set cpo+=M
356437294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
3565767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
356637294bd6SBram Moolenaar      setline(1, 'some text')
356737294bd6SBram Moolenaar  END
3568ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3569ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3570ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3571ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
357237294bd6SBram Moolenaar
3573ffb7dcdbSBram Moolenaar  " clean up
3574ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3575ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3576ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3577ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3578ffb7dcdbSBram Moolenaarendfunc
357937294bd6SBram Moolenaar
35809ec7026fSBram Moolenaar
3581f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3582cfcd011fSBram Moolenaar  var lines =<< trim END
3583cfcd011fSBram Moolenaar    var name: any
3584cfcd011fSBram Moolenaar    assert_equal(0, name)
3585f0afd9e1SBram Moolenaar  END
3586f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3587f0afd9e1SBram Moolenaarenddef
3588f0afd9e1SBram Moolenaar
35897e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
359058dbef33SBram Moolenaar  CheckRunVimInTerminal
359158dbef33SBram Moolenaar
35927e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
35937e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
35947e9210eaSBram Moolenaarendfunc
35957e9210eaSBram Moolenaar
35967e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
35979c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3598cfcd011fSBram Moolenaar  var lines =<< trim END
35999c4f5520SBram Moolenaar    func CheckAndQuit()
36009c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
36019c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
36029c4f5520SBram Moolenaar    endfunc
36039c4f5520SBram Moolenaar  END
36049c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
36059c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3606e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
36079c4f5520SBram Moolenaar  # define Afunc() on the command line
36089c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
36099c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
36102949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
36119c4f5520SBram Moolenaar
36129c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
36139c4f5520SBram Moolenaar  delete('XcallFunc')
36149c4f5520SBram Moolenaar  delete('Xdidcmd')
36159c4f5520SBram Moolenaarenddef
36169c4f5520SBram Moolenaar
3617fcdc5d83SBram Moolenaardef Test_script_var_scope()
3618fcdc5d83SBram Moolenaar  var lines =<< trim END
3619fcdc5d83SBram Moolenaar      vim9script
3620fcdc5d83SBram Moolenaar      if true
3621fcdc5d83SBram Moolenaar        if true
3622fcdc5d83SBram Moolenaar          var one = 'one'
3623fcdc5d83SBram Moolenaar          echo one
3624fcdc5d83SBram Moolenaar        endif
3625fcdc5d83SBram Moolenaar        echo one
3626fcdc5d83SBram Moolenaar      endif
3627fcdc5d83SBram Moolenaar  END
3628fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3629fcdc5d83SBram Moolenaar
3630fcdc5d83SBram Moolenaar  lines =<< trim END
3631fcdc5d83SBram Moolenaar      vim9script
3632fcdc5d83SBram Moolenaar      if true
3633fcdc5d83SBram Moolenaar        if false
3634fcdc5d83SBram Moolenaar          var one = 'one'
3635fcdc5d83SBram Moolenaar          echo one
3636fcdc5d83SBram Moolenaar        else
3637fcdc5d83SBram Moolenaar          var one = 'one'
3638fcdc5d83SBram Moolenaar          echo one
3639fcdc5d83SBram Moolenaar        endif
3640fcdc5d83SBram Moolenaar        echo one
3641fcdc5d83SBram Moolenaar      endif
3642fcdc5d83SBram Moolenaar  END
3643fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3644fcdc5d83SBram Moolenaar
3645fcdc5d83SBram Moolenaar  lines =<< trim END
3646fcdc5d83SBram Moolenaar      vim9script
3647fcdc5d83SBram Moolenaar      while true
3648fcdc5d83SBram Moolenaar        var one = 'one'
3649fcdc5d83SBram Moolenaar        echo one
3650fcdc5d83SBram Moolenaar        break
3651fcdc5d83SBram Moolenaar      endwhile
3652fcdc5d83SBram Moolenaar      echo one
3653fcdc5d83SBram Moolenaar  END
3654fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3655fcdc5d83SBram Moolenaar
3656fcdc5d83SBram Moolenaar  lines =<< trim END
3657fcdc5d83SBram Moolenaar      vim9script
3658fcdc5d83SBram Moolenaar      for i in range(1)
3659fcdc5d83SBram Moolenaar        var one = 'one'
3660fcdc5d83SBram Moolenaar        echo one
3661fcdc5d83SBram Moolenaar      endfor
3662fcdc5d83SBram Moolenaar      echo one
3663fcdc5d83SBram Moolenaar  END
3664fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
36659becdf2bSBram Moolenaar
36669becdf2bSBram Moolenaar  lines =<< trim END
36679becdf2bSBram Moolenaar      vim9script
36689becdf2bSBram Moolenaar      {
36699becdf2bSBram Moolenaar        var one = 'one'
36709becdf2bSBram Moolenaar        assert_equal('one', one)
36719becdf2bSBram Moolenaar      }
36729becdf2bSBram Moolenaar      assert_false(exists('one'))
36739becdf2bSBram Moolenaar      assert_false(exists('s:one'))
36749becdf2bSBram Moolenaar  END
36759becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
36769becdf2bSBram Moolenaar
36779becdf2bSBram Moolenaar  lines =<< trim END
36789becdf2bSBram Moolenaar      vim9script
36799becdf2bSBram Moolenaar      {
36809becdf2bSBram Moolenaar        var one = 'one'
36819becdf2bSBram Moolenaar        echo one
36829becdf2bSBram Moolenaar      }
36839becdf2bSBram Moolenaar      echo one
36849becdf2bSBram Moolenaar  END
36859becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3686fcdc5d83SBram Moolenaarenddef
3687fcdc5d83SBram Moolenaar
3688352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3689352134bbSBram Moolenaar  var lines =<< trim END
3690352134bbSBram Moolenaar    vim9script
36912a38908bSBram Moolenaar    def Callback(...l: list<any>)
3692352134bbSBram Moolenaar      try
3693352134bbSBram Moolenaar        var x: string
3694352134bbSBram Moolenaar        var y: string
3695352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3696352134bbSBram Moolenaar        [x, y] = ['']
3697352134bbSBram Moolenaar      catch
3698352134bbSBram Moolenaar        g:caught = 'yes'
3699352134bbSBram Moolenaar      endtry
3700352134bbSBram Moolenaar    enddef
3701e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3702352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3703352134bbSBram Moolenaar  END
3704352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3705352134bbSBram Moolenaar
3706352134bbSBram Moolenaar  unlet g:caught
3707352134bbSBram Moolenaarenddef
3708352134bbSBram Moolenaar
3709631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3710631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3711631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3712631e8f93SBram Moolenaar  endif
3713631e8f93SBram Moolenaar  var lines =<< trim END
3714631e8f93SBram Moolenaar      vim9script
3715631e8f93SBram Moolenaar      var source: list<number>
37162a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
3717631e8f93SBram Moolenaar          eval [][0]
3718631e8f93SBram Moolenaar      enddef
37192a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
3720631e8f93SBram Moolenaar          sleep 1m
3721631e8f93SBram Moolenaar          source += l
3722631e8f93SBram Moolenaar      enddef
3723e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
37246f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
37256f17a3f0SBram Moolenaar        sleep 10m
37266f17a3f0SBram Moolenaar      endwhile
3727206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3728fe95b94fSBram Moolenaar      sleep 200m
3729631e8f93SBram Moolenaar  END
3730631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3731631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3732631e8f93SBram Moolenaar  delete('Xdef')
3733631e8f93SBram Moolenaarenddef
3734631e8f93SBram Moolenaar
37354324d87aSBram Moolenaardef InvokeNormal()
37364324d87aSBram Moolenaar  exe "norm! :m+1\r"
37374324d87aSBram Moolenaarenddef
37384324d87aSBram Moolenaar
37394324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
37404324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
37414324d87aSBram Moolenaar  new
37424324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
37434324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
37444324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
37454324d87aSBram Moolenaar  xunmap <F3>
3746b5b9480eSBram Moolenaarenddef
3747b5b9480eSBram Moolenaar
3748b5b9480eSBram Moolenaardef Test_white_space_after_command()
3749b5b9480eSBram Moolenaar  var lines =<< trim END
3750b5b9480eSBram Moolenaar    exit_cb: Func})
3751b5b9480eSBram Moolenaar  END
3752b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3753f8103f27SBram Moolenaar
3754f8103f27SBram Moolenaar  lines =<< trim END
3755f8103f27SBram Moolenaar    e#
3756f8103f27SBram Moolenaar  END
3757f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
37584324d87aSBram Moolenaarenddef
37594324d87aSBram Moolenaar
37604aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
37614aab88d9SBram Moolenaar  var lines =<< trim END
37624aab88d9SBram Moolenaar      vim9script
37634aab88d9SBram Moolenaar      if exists('g:guard')
37644aab88d9SBram Moolenaar        finish
37654aab88d9SBram Moolenaar      endif
37664aab88d9SBram Moolenaar      g:guard = 1
37674aab88d9SBram Moolenaar      var name = 'thename'
37684aab88d9SBram Moolenaar      def g:GetName(): string
37694aab88d9SBram Moolenaar        return name
37704aab88d9SBram Moolenaar      enddef
37714aab88d9SBram Moolenaar      def g:SetName(arg: string)
37724aab88d9SBram Moolenaar        name = arg
37734aab88d9SBram Moolenaar      enddef
37744aab88d9SBram Moolenaar  END
37754aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
37764aab88d9SBram Moolenaar  so XscriptTwice.vim
37774aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
37784aab88d9SBram Moolenaar  g:SetName('newname')
37794aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
37804aab88d9SBram Moolenaar  so XscriptTwice.vim
37814aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
37824aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
37834aab88d9SBram Moolenaar
37844aab88d9SBram Moolenaar  delfunc g:GetName
37854aab88d9SBram Moolenaar  delfunc g:SetName
37864aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
37874aab88d9SBram Moolenaar  unlet g:guard
37884aab88d9SBram Moolenaarenddef
37894aab88d9SBram Moolenaar
37904aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
37914aab88d9SBram Moolenaar  var exportlines =<< trim END
37924aab88d9SBram Moolenaar      vim9script
37934aab88d9SBram Moolenaar      if exists('g:guard')
37944aab88d9SBram Moolenaar        finish
37954aab88d9SBram Moolenaar      endif
37964aab88d9SBram Moolenaar      g:guard = 1
37974aab88d9SBram Moolenaar      export var name = 'someName'
37984aab88d9SBram Moolenaar  END
37994aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
38004aab88d9SBram Moolenaar
38014aab88d9SBram Moolenaar  var lines =<< trim END
38024aab88d9SBram Moolenaar      vim9script
38034aab88d9SBram Moolenaar      import name from './XexportScript.vim'
38044aab88d9SBram Moolenaar      def g:GetName(): string
38054aab88d9SBram Moolenaar        return name
38064aab88d9SBram Moolenaar      enddef
38074aab88d9SBram Moolenaar  END
38084aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
38094aab88d9SBram Moolenaar  so XscriptImport.vim
38104aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
38114aab88d9SBram Moolenaar
38124aab88d9SBram Moolenaar  so XexportScript.vim
38134aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
38144aab88d9SBram Moolenaar
38154aab88d9SBram Moolenaar  delfunc g:GetName
38164aab88d9SBram Moolenaar  delete('XexportScript.vim')
38174aab88d9SBram Moolenaar  delete('XscriptImport.vim')
38184aab88d9SBram Moolenaar  unlet g:guard
38194aab88d9SBram Moolenaarenddef
38204aab88d9SBram Moolenaar
382110b9421fSBram Moolenaardef Test_unsupported_commands()
382210b9421fSBram Moolenaar  var lines =<< trim END
382310b9421fSBram Moolenaar      ka
382410b9421fSBram Moolenaar  END
382510b9421fSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1100:')
382610b9421fSBram Moolenaar
382710b9421fSBram Moolenaar  lines =<< trim END
3828ada1d870SBram Moolenaar      :1ka
3829ada1d870SBram Moolenaar  END
3830ada1d870SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E481:')
3831ada1d870SBram Moolenaar
3832ada1d870SBram Moolenaar  lines =<< trim END
383310b9421fSBram Moolenaar    t
383410b9421fSBram Moolenaar  END
383510b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
383610b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
383710b9421fSBram Moolenaar
383810b9421fSBram Moolenaar  lines =<< trim END
383910b9421fSBram Moolenaar    x
384010b9421fSBram Moolenaar  END
384110b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
384210b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
384310b9421fSBram Moolenaar
384410b9421fSBram Moolenaar  lines =<< trim END
384510b9421fSBram Moolenaar    xit
384610b9421fSBram Moolenaar  END
384710b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
384810b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
384910b9421fSBram Moolenaarenddef
385010b9421fSBram Moolenaar
3851*c70fe460SBram Moolenaardef Test_mapping_line_number()
3852*c70fe460SBram Moolenaar  var lines =<< trim END
3853*c70fe460SBram Moolenaar      vim9script
3854*c70fe460SBram Moolenaar      def g:FuncA()
3855*c70fe460SBram Moolenaar          # Some comment
3856*c70fe460SBram Moolenaar          FuncB(0)
3857*c70fe460SBram Moolenaar      enddef
3858*c70fe460SBram Moolenaar          # Some comment
3859*c70fe460SBram Moolenaar      def FuncB(
3860*c70fe460SBram Moolenaar          # Some comment
3861*c70fe460SBram Moolenaar          n: number
3862*c70fe460SBram Moolenaar      )
3863*c70fe460SBram Moolenaar          exe 'nno '
3864*c70fe460SBram Moolenaar              # Some comment
3865*c70fe460SBram Moolenaar              .. '<F3> a'
3866*c70fe460SBram Moolenaar              .. 'b'
3867*c70fe460SBram Moolenaar              .. 'c'
3868*c70fe460SBram Moolenaar      enddef
3869*c70fe460SBram Moolenaar  END
3870*c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
3871*c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
3872*c70fe460SBram Moolenaar  assert_match('No mapping found', res)
3873*c70fe460SBram Moolenaar
3874*c70fe460SBram Moolenaar  g:FuncA()
3875*c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
3876*c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
3877*c70fe460SBram Moolenaar
3878*c70fe460SBram Moolenaar  nunmap <F3>
3879*c70fe460SBram Moolenaar  delfunc g:FuncA
3880*c70fe460SBram Moolenaarenddef
3881*c70fe460SBram Moolenaar
3882585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3883585fea7bSBram Moolenaardef Test_substitute_cmd()
3884585fea7bSBram Moolenaar  new
3885585fea7bSBram Moolenaar  setline(1, 'something')
3886585fea7bSBram Moolenaar  :substitute(some(other(
3887585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3888585fea7bSBram Moolenaar  bwipe!
3889585fea7bSBram Moolenaar
3890f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3891cfcd011fSBram Moolenaar  var lines =<< trim END
3892585fea7bSBram Moolenaar    vim9script
3893585fea7bSBram Moolenaar    new
3894585fea7bSBram Moolenaar    setline(1, 'something')
3895585fea7bSBram Moolenaar    :substitute(some(other(
3896585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3897585fea7bSBram Moolenaar    bwipe!
3898585fea7bSBram Moolenaar  END
3899585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3900585fea7bSBram Moolenaar  source Xvim9lines
3901585fea7bSBram Moolenaar
3902585fea7bSBram Moolenaar  delete('Xvim9lines')
3903585fea7bSBram Moolenaarenddef
3904585fea7bSBram Moolenaar
39058a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3906