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
5959cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
5969cb577a6SBram Moolenaar  # return in try block returns normally
5979cb577a6SBram Moolenaar  def ReturnInTry(): string
5989cb577a6SBram Moolenaar    try
5999cb577a6SBram Moolenaar      return '"some message"'
6009cb577a6SBram Moolenaar    catch
6019cb577a6SBram Moolenaar    endtry
6029cb577a6SBram Moolenaar    return 'not reached'
6039cb577a6SBram Moolenaar  enddef
6049cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
6059cb577a6SBram Moolenaarenddef
6069cb577a6SBram Moolenaar
6071430ceebSBram Moolenaardef Test_cnext_works_in_catch()
6081430ceebSBram Moolenaar  var lines =<< trim END
6091430ceebSBram Moolenaar      vim9script
6101430ceebSBram Moolenaar      au BufEnter * eval 0
6111430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
6121430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
6131430ceebSBram Moolenaar      var items = [
6141430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
6151430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
6161430ceebSBram Moolenaar        ]
6171430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
6181430ceebSBram Moolenaar      cwindow
6191430ceebSBram Moolenaar
6201430ceebSBram Moolenaar      def CnextOrCfirst()
6211430ceebSBram Moolenaar        # if cnext fails, cfirst is used
6221430ceebSBram Moolenaar        try
6231430ceebSBram Moolenaar          cnext
6241430ceebSBram Moolenaar        catch
6251430ceebSBram Moolenaar          cfirst
6261430ceebSBram Moolenaar        endtry
6271430ceebSBram Moolenaar      enddef
6281430ceebSBram Moolenaar
6291430ceebSBram Moolenaar      CnextOrCfirst()
6301430ceebSBram Moolenaar      CnextOrCfirst()
6311430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
6321430ceebSBram Moolenaar      qall
6331430ceebSBram Moolenaar  END
6341430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
6351430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
6361430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
6371430ceebSBram Moolenaar
6381430ceebSBram Moolenaar  delete('Xfile1')
6391430ceebSBram Moolenaar  delete('Xfile2')
6401430ceebSBram Moolenaar  delete('XCatchCnext')
6411430ceebSBram Moolenaar  delete('Xresult')
6421430ceebSBram Moolenaarenddef
6431430ceebSBram Moolenaar
6449e1d9e34SBram Moolenaardef Test_throw_skipped()
6459e1d9e34SBram Moolenaar  if 0
6469e1d9e34SBram Moolenaar    throw dontgethere
6479e1d9e34SBram Moolenaar  endif
6489e1d9e34SBram Moolenaarenddef
6499e1d9e34SBram Moolenaar
6508f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
6518f81b22eSBram Moolenaar  var lines =<< trim END
6528f81b22eSBram Moolenaar    vim9script
6538f81b22eSBram Moolenaar    def Func()
6548f81b22eSBram Moolenaar      throw 'error'
6558f81b22eSBram Moolenaar    enddef
6568f81b22eSBram Moolenaar    silent! Func()
6578f81b22eSBram Moolenaar  END
6588f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
6598f81b22eSBram Moolenaar  source XthrowSilenced
6608f81b22eSBram Moolenaar  delete('XthrowSilenced')
6618f81b22eSBram Moolenaarenddef
6628f81b22eSBram Moolenaar
663e859312eSBram Moolenaardef DeletedFunc(): list<any>
664e859312eSBram Moolenaar  return ['delete me']
665e859312eSBram Moolenaarenddef
666e859312eSBram Moolenaardefcompile
667e859312eSBram Moolenaardelfunc DeletedFunc
668e859312eSBram Moolenaar
669257cc5eeSBram Moolenaardef ThrowFromDef()
670a72cfb80SBram Moolenaar  throw "getout" # comment
671257cc5eeSBram Moolenaarenddef
672257cc5eeSBram Moolenaar
673257cc5eeSBram Moolenaarfunc CatchInFunc()
674257cc5eeSBram Moolenaar  try
675257cc5eeSBram Moolenaar    call ThrowFromDef()
676257cc5eeSBram Moolenaar  catch
677257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
678257cc5eeSBram Moolenaar  endtry
679257cc5eeSBram Moolenaarendfunc
680257cc5eeSBram Moolenaar
681257cc5eeSBram Moolenaardef CatchInDef()
682257cc5eeSBram Moolenaar  try
683257cc5eeSBram Moolenaar    ThrowFromDef()
684257cc5eeSBram Moolenaar  catch
685257cc5eeSBram Moolenaar    g:thrown_def = v:exception
686257cc5eeSBram Moolenaar  endtry
687257cc5eeSBram Moolenaarenddef
688257cc5eeSBram Moolenaar
689f575adffSBram Moolenaardef ReturnFinally(): string
690f575adffSBram Moolenaar  try
691f575adffSBram Moolenaar    return 'intry'
692373863edSBram Moolenaar  finall
693f575adffSBram Moolenaar    g:in_finally = 'finally'
694f575adffSBram Moolenaar  endtry
695f575adffSBram Moolenaar  return 'end'
696f575adffSBram Moolenaarenddef
697f575adffSBram Moolenaar
698257cc5eeSBram Moolenaardef Test_try_catch_nested()
699257cc5eeSBram Moolenaar  CatchInFunc()
700257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
701257cc5eeSBram Moolenaar
702257cc5eeSBram Moolenaar  CatchInDef()
703257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
704f575adffSBram Moolenaar
705f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
706f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
707f575adffSBram Moolenaarenddef
708f575adffSBram Moolenaar
7099939f57bSBram Moolenaardef TryOne(): number
7109939f57bSBram Moolenaar  try
7119939f57bSBram Moolenaar    return 0
7129939f57bSBram Moolenaar  catch
7139939f57bSBram Moolenaar  endtry
7149939f57bSBram Moolenaar  return 0
7159939f57bSBram Moolenaarenddef
7169939f57bSBram Moolenaar
7179939f57bSBram Moolenaardef TryTwo(n: number): string
7189939f57bSBram Moolenaar  try
719cfcd011fSBram Moolenaar    var x = {}
7209939f57bSBram Moolenaar  catch
7219939f57bSBram Moolenaar  endtry
7229939f57bSBram Moolenaar  return 'text'
7239939f57bSBram Moolenaarenddef
7249939f57bSBram Moolenaar
7259939f57bSBram Moolenaardef Test_try_catch_twice()
7269939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
7279939f57bSBram Moolenaarenddef
7289939f57bSBram Moolenaar
729f575adffSBram Moolenaardef Test_try_catch_match()
730cfcd011fSBram Moolenaar  var seq = 'a'
731f575adffSBram Moolenaar  try
732f575adffSBram Moolenaar    throw 'something'
733f575adffSBram Moolenaar  catch /nothing/
734f575adffSBram Moolenaar    seq ..= 'x'
735f575adffSBram Moolenaar  catch /some/
736f575adffSBram Moolenaar    seq ..= 'b'
737f575adffSBram Moolenaar  catch /asdf/
738f575adffSBram Moolenaar    seq ..= 'x'
739e8c4abbbSBram Moolenaar  catch ?a\?sdf?
740e8c4abbbSBram Moolenaar    seq ..= 'y'
741f575adffSBram Moolenaar  finally
742f575adffSBram Moolenaar    seq ..= 'c'
743f575adffSBram Moolenaar  endtry
744f575adffSBram Moolenaar  assert_equal('abc', seq)
745257cc5eeSBram Moolenaarenddef
746257cc5eeSBram Moolenaar
747e8c4abbbSBram Moolenaardef Test_try_catch_fails()
748d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
749d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
750d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
751d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
752d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
753d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
754d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
755d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
75613106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
757d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
758585fea7bSBram Moolenaar
759e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
760d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
761e8c4abbbSBram Moolenaarenddef
762e8c4abbbSBram Moolenaar
7637c5b3c03SBram Moolenaardef Try_catch_skipped()
7647c5b3c03SBram Moolenaar  var l = []
7657c5b3c03SBram Moolenaar  try
7667c5b3c03SBram Moolenaar  finally
7677c5b3c03SBram Moolenaar  endtry
7687c5b3c03SBram Moolenaar
7697c5b3c03SBram Moolenaar  if 1
7707c5b3c03SBram Moolenaar  else
7717c5b3c03SBram Moolenaar    try
7727c5b3c03SBram Moolenaar    endtry
7737c5b3c03SBram Moolenaar  endif
7747c5b3c03SBram Moolenaarenddef
7757c5b3c03SBram Moolenaar
7767c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
7777c5b3c03SBram Moolenaardef Test_try_catch_skipped()
7787c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
7797c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
7807c5b3c03SBram Moolenaarenddef
7817c5b3c03SBram Moolenaar
7827c5b3c03SBram Moolenaar
7837c5b3c03SBram Moolenaar
784006ad48bSBram Moolenaardef Test_throw_vimscript()
785f5be8cdbSBram Moolenaar  # only checks line continuation
786cfcd011fSBram Moolenaar  var lines =<< trim END
787006ad48bSBram Moolenaar      vim9script
788006ad48bSBram Moolenaar      try
789006ad48bSBram Moolenaar        throw 'one'
790006ad48bSBram Moolenaar              .. 'two'
791006ad48bSBram Moolenaar      catch
792006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
793006ad48bSBram Moolenaar      endtry
794006ad48bSBram Moolenaar  END
795006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
7961e021e63SBram Moolenaar
7971e021e63SBram Moolenaar  lines =<< trim END
7981e021e63SBram Moolenaar    vim9script
799352134bbSBram Moolenaar    @r = ''
8001e021e63SBram Moolenaar    def Func()
8011e021e63SBram Moolenaar      throw @r
8021e021e63SBram Moolenaar    enddef
8031e021e63SBram Moolenaar    var result = ''
8041e021e63SBram Moolenaar    try
8051e021e63SBram Moolenaar      Func()
8061e021e63SBram Moolenaar    catch /E1129:/
8071e021e63SBram Moolenaar      result = 'caught'
8081e021e63SBram Moolenaar    endtry
8091e021e63SBram Moolenaar    assert_equal('caught', result)
8101e021e63SBram Moolenaar  END
8111e021e63SBram Moolenaar  CheckScriptSuccess(lines)
812006ad48bSBram Moolenaarenddef
813006ad48bSBram Moolenaar
814ed677f55SBram Moolenaardef Test_error_in_nested_function()
81503dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
816cfcd011fSBram Moolenaar  var lines =<< trim END
817ed677f55SBram Moolenaar      vim9script
818ed677f55SBram Moolenaar      def Func()
819ed677f55SBram Moolenaar        Error()
820ed677f55SBram Moolenaar        g:test_var = 1
821ed677f55SBram Moolenaar      enddef
822ed677f55SBram Moolenaar      func Error() abort
823ed677f55SBram Moolenaar        eval [][0]
824ed677f55SBram Moolenaar      endfunc
825ed677f55SBram Moolenaar      Func()
826ed677f55SBram Moolenaar  END
827ed677f55SBram Moolenaar  g:test_var = 0
828ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
829ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
830ed677f55SBram Moolenaarenddef
831ed677f55SBram Moolenaar
83237c83711SBram Moolenaardef Test_cexpr_vimscript()
833f5be8cdbSBram Moolenaar  # only checks line continuation
83437c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
835cfcd011fSBram Moolenaar  var lines =<< trim END
83637c83711SBram Moolenaar      vim9script
83737c83711SBram Moolenaar      cexpr 'File'
83837c83711SBram Moolenaar                .. ' someFile' ..
83937c83711SBram Moolenaar                   ' line 19'
84037c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
84137c83711SBram Moolenaar  END
84237c83711SBram Moolenaar  CheckScriptSuccess(lines)
84337c83711SBram Moolenaar  set errorformat&
84437c83711SBram Moolenaarenddef
84537c83711SBram Moolenaar
846c9edd6b5SBram Moolenaardef Test_statusline_syntax()
847c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
848cfcd011fSBram Moolenaar  var lines =<< trim END
849c9edd6b5SBram Moolenaar      vim9script
850c9edd6b5SBram Moolenaar      func g:Status()
851c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
852c9edd6b5SBram Moolenaar      endfunc
853c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
854c9edd6b5SBram Moolenaar      redrawstatus
855c9edd6b5SBram Moolenaar      set laststatus statusline=
856c9edd6b5SBram Moolenaar  END
857c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
858c9edd6b5SBram Moolenaarenddef
859c9edd6b5SBram Moolenaar
860b209750bSBram Moolenaardef Test_list_vimscript()
861b209750bSBram Moolenaar  # checks line continuation and comments
862cfcd011fSBram Moolenaar  var lines =<< trim END
863b209750bSBram Moolenaar      vim9script
864cfcd011fSBram Moolenaar      var mylist = [
865b209750bSBram Moolenaar            'one',
866b209750bSBram Moolenaar            # comment
867b209750bSBram Moolenaar            'two', # empty line follows
868b209750bSBram Moolenaar
869b209750bSBram Moolenaar            'three',
870b209750bSBram Moolenaar            ]
871b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
872b209750bSBram Moolenaar  END
873b209750bSBram Moolenaar  CheckScriptSuccess(lines)
87466250c93SBram Moolenaar
87566250c93SBram Moolenaar  # check all lines from heredoc are kept
87666250c93SBram Moolenaar  lines =<< trim END
87766250c93SBram Moolenaar      # comment 1
87866250c93SBram Moolenaar      two
87966250c93SBram Moolenaar      # comment 3
88066250c93SBram Moolenaar
88166250c93SBram Moolenaar      five
88266250c93SBram Moolenaar      # comment 6
88366250c93SBram Moolenaar  END
88466250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
8854bce26bbSBram Moolenaar
8864bce26bbSBram Moolenaar  lines =<< trim END
8874bce26bbSBram Moolenaar    [{
8884bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
8894bce26bbSBram Moolenaar  END
8904bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
891b209750bSBram Moolenaarenddef
892b209750bSBram Moolenaar
8932a1381c3SBram Moolenaarif has('channel')
89440ee466cSBram Moolenaar  let someJob = test_null_job()
89540ee466cSBram Moolenaar
89640ee466cSBram Moolenaar  def FuncWithError()
89740ee466cSBram Moolenaar    echomsg g:someJob
89840ee466cSBram Moolenaar  enddef
89940ee466cSBram Moolenaar
90040ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
90140ee466cSBram Moolenaar    try
90240ee466cSBram Moolenaar      call FuncWithError()
90340ee466cSBram Moolenaar    catch
90440ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
90540ee466cSBram Moolenaar    endtry
90640ee466cSBram Moolenaar  endfunc
9072a1381c3SBram Moolenaarendif
90840ee466cSBram Moolenaar
9098a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
9108a7d6542SBram Moolenaar  vim9script
911cfcd011fSBram Moolenaar  var name: string = 'bob'
9128a7d6542SBram Moolenaar  def Concat(arg: string): string
9138a7d6542SBram Moolenaar    return name .. arg
9148a7d6542SBram Moolenaar  enddef
915227a69deSBram Moolenaar  g:result = Concat('bie')
916227a69deSBram Moolenaar  g:localname = name
9178a7d6542SBram Moolenaar
9188a7d6542SBram Moolenaar  export const CONST = 1234
919cfcd011fSBram Moolenaar  export var exported = 9876
920cfcd011fSBram Moolenaar  export var exp_name = 'John'
9218a7d6542SBram Moolenaar  export def Exported(): string
9228a7d6542SBram Moolenaar    return 'Exported'
9238a7d6542SBram Moolenaar  enddef
9240f2a5cc6SBram Moolenaar  export final theList = [1]
9258a7d6542SBram MoolenaarEND
9268a7d6542SBram Moolenaar
927b3ca9824SBram Moolenaardef Undo_export_script_lines()
928b3ca9824SBram Moolenaar  unlet g:result
929b3ca9824SBram Moolenaar  unlet g:localname
930b3ca9824SBram Moolenaarenddef
931b3ca9824SBram Moolenaar
9325269bd2aSBram Moolenaardef Test_vim9_import_export()
933cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
9348a7d6542SBram Moolenaar    vim9script
9358a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
9368a7d6542SBram Moolenaar    g:imported = exported
9376e587dcbSBram Moolenaar    exported += 3
9386e587dcbSBram Moolenaar    g:imported_added = exported
9398a7d6542SBram Moolenaar    g:imported_func = Exported()
9406e587dcbSBram Moolenaar
94140f4f7a4SBram Moolenaar    def GetExported(): string
942e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
94340f4f7a4SBram Moolenaar      return local_dict.ref()
94440f4f7a4SBram Moolenaar    enddef
94540f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
94640f4f7a4SBram Moolenaar
9476e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
9486e587dcbSBram Moolenaar    g:imported_name = exp_name
9496e587dcbSBram Moolenaar    exp_name ..= ' Doe'
9506e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
9515381c7a1SBram Moolenaar    g:imported_later = exported
9520f2a5cc6SBram Moolenaar
9530f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
9540f2a5cc6SBram Moolenaar    theList->add(2)
9550f2a5cc6SBram Moolenaar    assert_equal([1, 2], theList)
9568a7d6542SBram Moolenaar  END
9578a7d6542SBram Moolenaar
9588a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
9598a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
9608a7d6542SBram Moolenaar
9618a7d6542SBram Moolenaar  source Ximport.vim
9628a7d6542SBram Moolenaar
9638a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
9648a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
9658a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
9666e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
9675381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
9688a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
96940f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
9706e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
9716e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
9728a7d6542SBram Moolenaar  assert_false(exists('g:name'))
9738a7d6542SBram Moolenaar
974b3ca9824SBram Moolenaar  Undo_export_script_lines()
9758a7d6542SBram Moolenaar  unlet g:imported
9766e587dcbSBram Moolenaar  unlet g:imported_added
9775381c7a1SBram Moolenaar  unlet g:imported_later
9788a7d6542SBram Moolenaar  unlet g:imported_func
9796e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
9808a7d6542SBram Moolenaar  delete('Ximport.vim')
981f2d5c240SBram Moolenaar
9821c991144SBram Moolenaar  # similar, with line breaks
983cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
9841c991144SBram Moolenaar    vim9script
9851c991144SBram Moolenaar    import {
9861c991144SBram Moolenaar        exported,
9871c991144SBram Moolenaar        Exported,
9881c991144SBram Moolenaar        }
9891c991144SBram Moolenaar        from
9901c991144SBram Moolenaar        './Xexport.vim'
9911c991144SBram Moolenaar    g:imported = exported
9921c991144SBram Moolenaar    exported += 5
9931c991144SBram Moolenaar    g:imported_added = exported
9941c991144SBram Moolenaar    g:imported_func = Exported()
9951c991144SBram Moolenaar  END
9961c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
9971c991144SBram Moolenaar  source Ximport_lbr.vim
9981c991144SBram Moolenaar
9991c991144SBram Moolenaar  assert_equal(9876, g:imported)
10001c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
10011c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
10021c991144SBram Moolenaar
10031c991144SBram Moolenaar  # exported script not sourced again
10041c991144SBram Moolenaar  assert_false(exists('g:result'))
10051c991144SBram Moolenaar  unlet g:imported
10061c991144SBram Moolenaar  unlet g:imported_added
10071c991144SBram Moolenaar  unlet g:imported_func
10081c991144SBram Moolenaar  delete('Ximport_lbr.vim')
10091c991144SBram Moolenaar
10101c991144SBram Moolenaar  # import inside :def function
1011cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
10125381c7a1SBram Moolenaar    vim9script
10135381c7a1SBram Moolenaar    def ImportInDef()
10145381c7a1SBram Moolenaar      import exported from './Xexport.vim'
10155381c7a1SBram Moolenaar      g:imported = exported
10165381c7a1SBram Moolenaar      exported += 7
10175381c7a1SBram Moolenaar      g:imported_added = exported
10185381c7a1SBram Moolenaar    enddef
10195381c7a1SBram Moolenaar    ImportInDef()
10205381c7a1SBram Moolenaar  END
10215381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
10225381c7a1SBram Moolenaar  source Ximport2.vim
1023f5be8cdbSBram Moolenaar  # TODO: this should be 9879
10245381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
10255381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
10265381c7a1SBram Moolenaar  unlet g:imported
10275381c7a1SBram Moolenaar  unlet g:imported_added
10285381c7a1SBram Moolenaar  delete('Ximport2.vim')
10295381c7a1SBram Moolenaar
1030cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1031f2d5c240SBram Moolenaar    vim9script
1032f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1033f2d5c240SBram Moolenaar    def UseExport()
1034*cb4e80faSBram Moolenaar      g:imported_def = Export.exported
1035f2d5c240SBram Moolenaar    enddef
1036*cb4e80faSBram Moolenaar    g:imported_script = Export.exported
1037*cb4e80faSBram Moolenaar    assert_equal(1, exists('Export.exported'))
1038*cb4e80faSBram Moolenaar    assert_equal(0, exists('Export.notexported'))
1039f2d5c240SBram Moolenaar    UseExport()
1040f2d5c240SBram Moolenaar  END
1041f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1042f2d5c240SBram Moolenaar  source Ximport.vim
1043*cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_def)
1044*cb4e80faSBram Moolenaar  assert_equal(9883, g:imported_script)
1045f2d5c240SBram Moolenaar
1046cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1047599c89c8SBram Moolenaar    vim9script
1048599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1049599c89c8SBram Moolenaar    def Func()
1050cfcd011fSBram Moolenaar      var dummy = 1
1051cfcd011fSBram Moolenaar      var imported = Export + dummy
1052599c89c8SBram Moolenaar    enddef
1053822ba247SBram Moolenaar    defcompile
1054599c89c8SBram Moolenaar  END
1055599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
105644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1057599c89c8SBram Moolenaar
1058cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1059599c89c8SBram Moolenaar    vim9script
1060599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1061599c89c8SBram Moolenaar    def Func()
1062cfcd011fSBram Moolenaar      var imported = Export . exported
1063599c89c8SBram Moolenaar    enddef
1064822ba247SBram Moolenaar    defcompile
1065599c89c8SBram Moolenaar  END
1066599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
106744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1068599c89c8SBram Moolenaar
1069a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1070a6294955SBram Moolenaar    vim9script
1071a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1072a6294955SBram Moolenaar    var some = 'other'
1073a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1074a6294955SBram Moolenaar    defcompile
1075a6294955SBram Moolenaar  END
1076a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1077a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1078a6294955SBram Moolenaar
1079*cb4e80faSBram Moolenaar  var import_star_as_lines_script_no_dot =<< trim END
1080*cb4e80faSBram Moolenaar    vim9script
1081*cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1082*cb4e80faSBram Moolenaar    g:imported_script = Export exported
1083*cb4e80faSBram Moolenaar  END
1084*cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
1085*cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1029:')
1086*cb4e80faSBram Moolenaar
1087*cb4e80faSBram Moolenaar  var import_star_as_lines_script_space_after_dot =<< trim END
1088*cb4e80faSBram Moolenaar    vim9script
1089*cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1090*cb4e80faSBram Moolenaar    g:imported_script = Export. exported
1091*cb4e80faSBram Moolenaar  END
1092*cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1093*cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1094*cb4e80faSBram Moolenaar
1095cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1096599c89c8SBram Moolenaar    vim9script
1097599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1098599c89c8SBram Moolenaar    def Func()
1099cfcd011fSBram Moolenaar      var imported = Export.
1100599c89c8SBram Moolenaar    enddef
1101822ba247SBram Moolenaar    defcompile
1102599c89c8SBram Moolenaar  END
1103599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
110444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1105599c89c8SBram Moolenaar
1106cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
11071c991144SBram Moolenaar    vim9script
11081c991144SBram Moolenaar    import *
11091c991144SBram Moolenaar        as Export
11101c991144SBram Moolenaar        from
11111c991144SBram Moolenaar        './Xexport.vim'
11121c991144SBram Moolenaar    def UseExport()
11131c991144SBram Moolenaar      g:imported = Export.exported
11141c991144SBram Moolenaar    enddef
11151c991144SBram Moolenaar    UseExport()
11161c991144SBram Moolenaar  END
11171c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
11181c991144SBram Moolenaar  source Ximport.vim
11191c991144SBram Moolenaar  assert_equal(9883, g:imported)
11201c991144SBram Moolenaar
1121cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1122f2d5c240SBram Moolenaar    vim9script
1123f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1124f2d5c240SBram Moolenaar  END
1125f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
112644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1127f2d5c240SBram Moolenaar
1128f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1129cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1130fa29c8abSBram Moolenaar    vim9script
1131fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1132fa29c8abSBram Moolenaar  END
1133fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
113444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1135fa29c8abSBram Moolenaar
1136f5be8cdbSBram Moolenaar  # try to import something that is already defined
1137cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
11385269bd2aSBram Moolenaar    vim9script
1139cfcd011fSBram Moolenaar    var exported = 'something'
11405269bd2aSBram Moolenaar    import exported from './Xexport.vim'
11415269bd2aSBram Moolenaar  END
11425269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1143057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11445269bd2aSBram Moolenaar
1145f5be8cdbSBram Moolenaar  # try to import something that is already defined
11465269bd2aSBram Moolenaar  import_already_defined =<< trim END
11475269bd2aSBram Moolenaar    vim9script
1148cfcd011fSBram Moolenaar    var exported = 'something'
11495269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
11505269bd2aSBram Moolenaar  END
11515269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1152057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11535269bd2aSBram Moolenaar
1154f5be8cdbSBram Moolenaar  # try to import something that is already defined
11555269bd2aSBram Moolenaar  import_already_defined =<< trim END
11565269bd2aSBram Moolenaar    vim9script
1157cfcd011fSBram Moolenaar    var exported = 'something'
11585269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
11595269bd2aSBram Moolenaar  END
11605269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1161057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11625269bd2aSBram Moolenaar
1163918a4249SBram Moolenaar  # try changing an imported const
1164918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1165918a4249SBram Moolenaar    vim9script
1166918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1167918a4249SBram Moolenaar    def Assign()
1168918a4249SBram Moolenaar      CONST = 987
1169918a4249SBram Moolenaar    enddef
1170918a4249SBram Moolenaar    defcompile
1171918a4249SBram Moolenaar  END
1172918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1173918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1174918a4249SBram Moolenaar
11750f2a5cc6SBram Moolenaar  # try changing an imported final
11760f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
11770f2a5cc6SBram Moolenaar    vim9script
11780f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
11790f2a5cc6SBram Moolenaar    def Assign()
11800f2a5cc6SBram Moolenaar      theList = [2]
11810f2a5cc6SBram Moolenaar    enddef
11820f2a5cc6SBram Moolenaar    defcompile
11830f2a5cc6SBram Moolenaar  END
11840f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
11850f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
11860f2a5cc6SBram Moolenaar
1187f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1188cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1189fa29c8abSBram Moolenaar    vim9script
1190fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1191fa29c8abSBram Moolenaar  END
1192fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
119344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1194fa29c8abSBram Moolenaar
1195cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1196fa29c8abSBram Moolenaar    vim9script
1197fa29c8abSBram Moolenaar    import name './Xexport.vim'
1198fa29c8abSBram Moolenaar  END
1199fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
120044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1201fa29c8abSBram Moolenaar
1202cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1203fa29c8abSBram Moolenaar    vim9script
1204fa29c8abSBram Moolenaar    import name from Xexport.vim
1205fa29c8abSBram Moolenaar  END
1206fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
120744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1208fa29c8abSBram Moolenaar
1209cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1210fa29c8abSBram Moolenaar    vim9script
1211fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1212fa29c8abSBram Moolenaar  END
1213fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
121444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1215fa29c8abSBram Moolenaar
1216cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1217fa29c8abSBram Moolenaar    vim9script
1218fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1219fa29c8abSBram Moolenaar  END
12205269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
122144d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1222fa29c8abSBram Moolenaar
1223f2d5c240SBram Moolenaar  delete('Ximport.vim')
12245269bd2aSBram Moolenaar  delete('Ximport3.vim')
12258a7d6542SBram Moolenaar  delete('Xexport.vim')
12268a7d6542SBram Moolenaar
1227f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1228750802b5SBram Moolenaar  set cpo&vi
1229cfcd011fSBram Moolenaar  var cpo_before = &cpo
1230cfcd011fSBram Moolenaar  var lines =<< trim END
1231750802b5SBram Moolenaar    vim9script
1232750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1233750802b5SBram Moolenaar  END
1234750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1235750802b5SBram Moolenaar  source Xvim9_script
1236750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1237750802b5SBram Moolenaar  set cpo&vim
1238750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1239750802b5SBram Moolenaar  delete('Xvim9_script')
1240750802b5SBram Moolenaarenddef
1241750802b5SBram Moolenaar
12420a84284eSBram Moolenaardef Test_import_as()
12430a84284eSBram Moolenaar  var export_lines =<< trim END
12440a84284eSBram Moolenaar    vim9script
12450a84284eSBram Moolenaar    export var one = 1
12460a84284eSBram Moolenaar    export var yes = 'yes'
12470a84284eSBram Moolenaar  END
12480a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
12490a84284eSBram Moolenaar
12500a84284eSBram Moolenaar  var import_lines =<< trim END
12510a84284eSBram Moolenaar    vim9script
12520a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
12530a84284eSBram Moolenaar    assert_equal(1, thatOne)
12540a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
12550a84284eSBram Moolenaar    assert_equal('yes', yesYes)
12560a84284eSBram Moolenaar  END
12570a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
12580a84284eSBram Moolenaar
12590a84284eSBram Moolenaar  import_lines =<< trim END
12600a84284eSBram Moolenaar    vim9script
12610a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
12620a84284eSBram Moolenaar    assert_equal(1, thatOne)
12630a84284eSBram Moolenaar    assert_equal('yes', yesYes)
12640a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
12650a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
12660a84284eSBram Moolenaar  END
12670a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
12680a84284eSBram Moolenaar
12690a84284eSBram Moolenaar  delete('XexportAs')
12700a84284eSBram Moolenaarenddef
12710a84284eSBram Moolenaar
1272803af686SBram Moolenaarfunc g:Trigger()
1273803af686SBram Moolenaar  source Ximport.vim
1274803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1275803af686SBram Moolenaarendfunc
1276803af686SBram Moolenaar
1277803af686SBram Moolenaardef Test_import_export_expr_map()
1278803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1279cfcd011fSBram Moolenaar  var export_lines =<< trim END
1280803af686SBram Moolenaar    vim9script
1281803af686SBram Moolenaar    export def That(): string
1282803af686SBram Moolenaar      return 'yes'
1283803af686SBram Moolenaar    enddef
1284803af686SBram Moolenaar  END
1285803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1286803af686SBram Moolenaar
1287cfcd011fSBram Moolenaar  var import_lines =<< trim END
1288803af686SBram Moolenaar    vim9script
1289803af686SBram Moolenaar    import That from './Xexport_that.vim'
1290803af686SBram Moolenaar    assert_equal('yes', That())
1291803af686SBram Moolenaar  END
1292803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1293803af686SBram Moolenaar
1294803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1295803af686SBram Moolenaar  feedkeys('trigger', "xt")
1296803af686SBram Moolenaar
1297730b2483SBram Moolenaar  delete('Xexport_that.vim')
1298803af686SBram Moolenaar  delete('Ximport.vim')
1299803af686SBram Moolenaar  nunmap trigger
1300803af686SBram Moolenaarenddef
1301803af686SBram Moolenaar
13028e1986e3SBram Moolenaardef Test_import_in_filetype()
13038e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
13048e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1305cfcd011fSBram Moolenaar  var export_lines =<< trim END
13068e1986e3SBram Moolenaar    vim9script
1307cfcd011fSBram Moolenaar    export var That = 'yes'
13088e1986e3SBram Moolenaar  END
1309730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
13108e1986e3SBram Moolenaar
1311cfcd011fSBram Moolenaar  var import_lines =<< trim END
13128e1986e3SBram Moolenaar    vim9script
1313730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
13148e1986e3SBram Moolenaar    assert_equal('yes', That)
13158e1986e3SBram Moolenaar    g:did_load_mytpe = 1
13168e1986e3SBram Moolenaar  END
13178e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
13188e1986e3SBram Moolenaar
1319cfcd011fSBram Moolenaar  var save_rtp = &rtp
13208e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
13218e1986e3SBram Moolenaar
13228e1986e3SBram Moolenaar  filetype plugin on
13238e1986e3SBram Moolenaar  copen
13248e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
13258e1986e3SBram Moolenaar
13268e1986e3SBram Moolenaar  quit!
1327730b2483SBram Moolenaar  delete('Xexport_ft.vim')
13288e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
13298e1986e3SBram Moolenaar  &rtp = save_rtp
13308e1986e3SBram Moolenaarenddef
13318e1986e3SBram Moolenaar
1332efa94447SBram Moolenaardef Test_use_import_in_mapping()
1333cfcd011fSBram Moolenaar  var lines =<< trim END
1334efa94447SBram Moolenaar      vim9script
1335efa94447SBram Moolenaar      export def Funcx()
1336efa94447SBram Moolenaar        g:result = 42
1337efa94447SBram Moolenaar      enddef
1338efa94447SBram Moolenaar  END
1339efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1340efa94447SBram Moolenaar  lines =<< trim END
1341efa94447SBram Moolenaar      vim9script
1342efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1343b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1344efa94447SBram Moolenaar  END
1345efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1346efa94447SBram Moolenaar
1347efa94447SBram Moolenaar  source Xmapscript.vim
1348b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1349efa94447SBram Moolenaar  assert_equal(42, g:result)
1350efa94447SBram Moolenaar
1351efa94447SBram Moolenaar  unlet g:result
1352efa94447SBram Moolenaar  delete('XsomeExport.vim')
1353efa94447SBram Moolenaar  delete('Xmapscript.vim')
1354b3ca9824SBram Moolenaar  nunmap <F3>
1355efa94447SBram Moolenaarenddef
1356efa94447SBram Moolenaar
1357d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1358d3f8a9eeSBram Moolenaar  var lines =<< trim END
1359d3f8a9eeSBram Moolenaar    if has(g:feature)
1360d3f8a9eeSBram Moolenaar      " legacy script
1361d3f8a9eeSBram Moolenaar      let g:legacy = 1
1362d3f8a9eeSBram Moolenaar      finish
1363d3f8a9eeSBram Moolenaar    endif
1364d3f8a9eeSBram Moolenaar    vim9script
1365d3f8a9eeSBram Moolenaar    g:legacy = 0
1366d3f8a9eeSBram Moolenaar  END
1367d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1368d3f8a9eeSBram Moolenaar  g:legacy = -1
1369d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1370d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1371d3f8a9eeSBram Moolenaar
1372d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1373d3f8a9eeSBram Moolenaar  g:legacy = -1
1374d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1375d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1376d3f8a9eeSBram Moolenaarenddef
1377d3f8a9eeSBram Moolenaar
1378750802b5SBram Moolenaardef Test_vim9script_fails()
13798a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
13808a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1381cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
13829721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1383cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1384750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1385750802b5SBram Moolenaar
1386cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1387c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1388c785b9a7SBram Moolenaar
1389e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1390e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
13918a7d6542SBram Moolenaarenddef
13928a7d6542SBram Moolenaar
1393f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1394101f4810SBram Moolenaar  CheckRunVimInTerminal
1395101f4810SBram Moolenaar
13969bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1397c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
13989bb3eb3eSBram Moolenaarendfunc
13999bb3eb3eSBram Moolenaar
1400c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1401cfcd011fSBram Moolenaar  var export =<< trim END
1402101f4810SBram Moolenaar    vim9script
1403101f4810SBram Moolenaar    export def Foo(): number
1404101f4810SBram Moolenaar        return 0
1405101f4810SBram Moolenaar    enddef
1406101f4810SBram Moolenaar  END
1407730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1408101f4810SBram Moolenaar
1409e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
14109bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
14112949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1412101f4810SBram Moolenaar
1413730b2483SBram Moolenaar  delete('XexportCmd.vim')
14149bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
14159bb3eb3eSBram Moolenaarenddef
1416101f4810SBram Moolenaar
14172b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
14182b32700dSBram Moolenaar  var lines =<< trim END
1419a6294955SBram Moolenaar    vim9script
1420a6294955SBram Moolenaar    export var exported = 'thexport'
1421a6294955SBram Moolenaar  END
1422a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1423a6294955SBram Moolenaar  lines =<< trim END
14242b32700dSBram Moolenaar    vim9script noclear
14252b32700dSBram Moolenaar    g:loadCount += 1
14262b32700dSBram Moolenaar    var s:reloaded = 'init'
1427a6294955SBram Moolenaar    import exported from './XExportReload'
14282b32700dSBram Moolenaar
14292b32700dSBram Moolenaar    def Again(): string
14302b32700dSBram Moolenaar      return 'again'
14312b32700dSBram Moolenaar    enddef
14322b32700dSBram Moolenaar
14332b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
14342b32700dSBram Moolenaar    var s:loaded = true
14352b32700dSBram Moolenaar
14362b32700dSBram Moolenaar    var s:notReloaded = 'yes'
14372b32700dSBram Moolenaar    s:reloaded = 'first'
14382b32700dSBram Moolenaar    def g:Values(): list<string>
1439a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
14402b32700dSBram Moolenaar    enddef
14412b32700dSBram Moolenaar
14422b32700dSBram Moolenaar    def Once(): string
14432b32700dSBram Moolenaar      return 'once'
14442b32700dSBram Moolenaar    enddef
14452b32700dSBram Moolenaar  END
14462b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
14472b32700dSBram Moolenaar  g:loadCount = 0
14482b32700dSBram Moolenaar  source XReloaded
14492b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1450a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
14512b32700dSBram Moolenaar  source XReloaded
14522b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1453a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
14542b32700dSBram Moolenaar  source XReloaded
14552b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1456a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
14572b32700dSBram Moolenaar
145848e11c10SBram Moolenaar  delete('XReloaded')
1459a6294955SBram Moolenaar  delete('XExportReload')
14602b32700dSBram Moolenaar  delfunc g:Values
14612b32700dSBram Moolenaar  unlet g:loadCount
14622b32700dSBram Moolenaarenddef
14632b32700dSBram Moolenaar
14644c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1465cfcd011fSBram Moolenaar  var lines =<< trim END
14668a7d6542SBram Moolenaar    vim9script
14678a7d6542SBram Moolenaar    const var = ''
1468cfcd011fSBram Moolenaar    var valone = 1234
14698a7d6542SBram Moolenaar    def MyFunc(arg: string)
14708a7d6542SBram Moolenaar       valone = 5678
14718a7d6542SBram Moolenaar    enddef
14728a7d6542SBram Moolenaar  END
1473cfcd011fSBram Moolenaar  var morelines =<< trim END
1474cfcd011fSBram Moolenaar    var valtwo = 222
14758a7d6542SBram Moolenaar    export def GetValtwo(): number
14768a7d6542SBram Moolenaar      return valtwo
14778a7d6542SBram Moolenaar    enddef
14788a7d6542SBram Moolenaar  END
147903afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
14808a7d6542SBram Moolenaar  source Xreload.vim
14818a7d6542SBram Moolenaar  source Xreload.vim
14828a7d6542SBram Moolenaar  source Xreload.vim
14838a7d6542SBram Moolenaar
1484cfcd011fSBram Moolenaar  var testlines =<< trim END
14858a7d6542SBram Moolenaar    vim9script
14868a7d6542SBram Moolenaar    def TheFunc()
14878a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
14888a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
14898a7d6542SBram Moolenaar    enddef
14908a7d6542SBram Moolenaar    TheFunc()
14918a7d6542SBram Moolenaar  END
14928a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
14938a7d6542SBram Moolenaar  source Ximport.vim
14948a7d6542SBram Moolenaar
1495f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1496f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
14978a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
14988a7d6542SBram Moolenaar  source Ximport.vim
14998a7d6542SBram Moolenaar
1500f5be8cdbSBram Moolenaar  # cannot declare a var twice
15018a7d6542SBram Moolenaar  lines =<< trim END
15028a7d6542SBram Moolenaar    vim9script
1503cfcd011fSBram Moolenaar    var valone = 1234
1504cfcd011fSBram Moolenaar    var valone = 5678
15058a7d6542SBram Moolenaar  END
15068a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
150744d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
15088a7d6542SBram Moolenaar
15098a7d6542SBram Moolenaar  delete('Xreload.vim')
15108a7d6542SBram Moolenaar  delete('Ximport.vim')
15118a7d6542SBram Moolenaarenddef
15128a7d6542SBram Moolenaar
151307a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
151407a65d26SBram Moolenaar" compiled function using that variable must fail.
151507a65d26SBram Moolenaardef Test_script_reload_change_type()
151607a65d26SBram Moolenaar  var lines =<< trim END
151707a65d26SBram Moolenaar    vim9script noclear
151807a65d26SBram Moolenaar    var str = 'string'
151907a65d26SBram Moolenaar    def g:GetStr(): string
152007a65d26SBram Moolenaar      return str .. 'xxx'
152107a65d26SBram Moolenaar    enddef
152207a65d26SBram Moolenaar  END
152307a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
152407a65d26SBram Moolenaar  source Xreload.vim
152507a65d26SBram Moolenaar  echo g:GetStr()
152607a65d26SBram Moolenaar
152707a65d26SBram Moolenaar  lines =<< trim END
152807a65d26SBram Moolenaar    vim9script noclear
152907a65d26SBram Moolenaar    var str = 1234
153007a65d26SBram Moolenaar  END
153107a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
153207a65d26SBram Moolenaar  source Xreload.vim
153307a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
153407a65d26SBram Moolenaar
153507a65d26SBram Moolenaar  delfunc g:GetStr
153607a65d26SBram Moolenaar  delete('Xreload.vim')
153707a65d26SBram Moolenaarenddef
153807a65d26SBram Moolenaar
15396c3843caSBram Moolenaardef Test_script_var_shadows_function()
15406c3843caSBram Moolenaar  var lines =<< trim END
15416c3843caSBram Moolenaar      vim9script
15426c3843caSBram Moolenaar      def Func(): number
15436c3843caSBram Moolenaar        return 123
15446c3843caSBram Moolenaar      enddef
15456c3843caSBram Moolenaar      var Func = 1
15466c3843caSBram Moolenaar  END
15476c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
15486c3843caSBram Moolenaarenddef
15496c3843caSBram Moolenaar
155095006e3dSBram Moolenaardef s:RetSome(): string
155195006e3dSBram Moolenaar  return 'some'
155295006e3dSBram Moolenaarenddef
155395006e3dSBram Moolenaar
1554fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1555fe465a01SBram Moolenaar" script-local name.
1556fe465a01SBram Moolenaardef Test_vim9script_funcref()
1557cfcd011fSBram Moolenaar  var sortlines =<< trim END
1558fe465a01SBram Moolenaar      vim9script
1559fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1560bed36b93SBram Moolenaar        return i2 - i1
1561fe465a01SBram Moolenaar      enddef
1562fe465a01SBram Moolenaar
1563fe465a01SBram Moolenaar      export def FastSort(): list<number>
1564fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1565fe465a01SBram Moolenaar      enddef
1566fe465a01SBram Moolenaar  END
1567fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1568fe465a01SBram Moolenaar
1569cfcd011fSBram Moolenaar  var lines =<< trim END
1570fe465a01SBram Moolenaar    vim9script
1571fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1572fe465a01SBram Moolenaar    def Test()
1573fe465a01SBram Moolenaar      g:result = FastSort()
1574fe465a01SBram Moolenaar    enddef
1575fe465a01SBram Moolenaar    Test()
1576fe465a01SBram Moolenaar  END
1577fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1578fe465a01SBram Moolenaar
1579fe465a01SBram Moolenaar  source Xscript.vim
1580fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1581fe465a01SBram Moolenaar
1582fe465a01SBram Moolenaar  unlet g:result
1583fe465a01SBram Moolenaar  delete('Xsort.vim')
1584fe465a01SBram Moolenaar  delete('Xscript.vim')
158595006e3dSBram Moolenaar
1586cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
158795006e3dSBram Moolenaar  assert_equal('some', Funcref())
1588fe465a01SBram Moolenaarenddef
1589fe465a01SBram Moolenaar
1590601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1591601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1592601e76acSBram Moolenaar" function reference.
1593c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1594cfcd011fSBram Moolenaar  var filterLines =<< trim END
1595c620c055SBram Moolenaar    vim9script
1596c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1597c620c055SBram Moolenaar      return idx % 2 == 1
1598c620c055SBram Moolenaar    enddef
1599c620c055SBram Moolenaar    export def FastFilter(): list<number>
1600c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1601c620c055SBram Moolenaar    enddef
1602601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1603601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1604601e76acSBram Moolenaar    enddef
1605c620c055SBram Moolenaar  END
1606c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1607c620c055SBram Moolenaar
1608cfcd011fSBram Moolenaar  var lines =<< trim END
1609c620c055SBram Moolenaar    vim9script
1610601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1611c620c055SBram Moolenaar    def Test()
1612cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1613c620c055SBram Moolenaar    enddef
1614c620c055SBram Moolenaar    Test()
1615601e76acSBram Moolenaar    def TestDirect()
1616cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1617601e76acSBram Moolenaar    enddef
1618601e76acSBram Moolenaar    TestDirect()
1619c620c055SBram Moolenaar  END
1620601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1621c620c055SBram Moolenaar  delete('Xfilter.vim')
1622c620c055SBram Moolenaarenddef
1623c620c055SBram Moolenaar
16244c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1625cfcd011fSBram Moolenaar  var first_lines =<< trim END
16264c17ad94SBram Moolenaar    vim9script
16274c17ad94SBram Moolenaar    def FuncYes(): string
16284c17ad94SBram Moolenaar      return 'yes'
16294c17ad94SBram Moolenaar    enddef
16304c17ad94SBram Moolenaar  END
1631cfcd011fSBram Moolenaar  var withno_lines =<< trim END
16324c17ad94SBram Moolenaar    def FuncNo(): string
16334c17ad94SBram Moolenaar      return 'no'
16344c17ad94SBram Moolenaar    enddef
16354c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
16364c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
16374c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
163803afdcf1SBram Moolenaar    enddef
163903afdcf1SBram Moolenaar  END
1640cfcd011fSBram Moolenaar  var nono_lines =<< trim END
164103afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
164203afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
164344d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
16444c17ad94SBram Moolenaar    enddef
16454c17ad94SBram Moolenaar  END
16464c17ad94SBram Moolenaar
16474c17ad94SBram Moolenaar  # FuncNo() is defined
164803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16494c17ad94SBram Moolenaar  source Xreloaded.vim
16504c17ad94SBram Moolenaar  g:DoCheck(true)
16514c17ad94SBram Moolenaar
16524c17ad94SBram Moolenaar  # FuncNo() is not redefined
165303afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
16544c17ad94SBram Moolenaar  source Xreloaded.vim
16555082471fSBram Moolenaar  g:DoCheck(false)
16564c17ad94SBram Moolenaar
16574c17ad94SBram Moolenaar  # FuncNo() is back
165803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16594c17ad94SBram Moolenaar  source Xreloaded.vim
16605082471fSBram Moolenaar  g:DoCheck(false)
16614c17ad94SBram Moolenaar
16624c17ad94SBram Moolenaar  delete('Xreloaded.vim')
16634c17ad94SBram Moolenaarenddef
16644c17ad94SBram Moolenaar
166589483d40SBram Moolenaardef Test_vim9script_reload_delvar()
166689483d40SBram Moolenaar  # write the script with a script-local variable
1667cfcd011fSBram Moolenaar  var lines =<< trim END
166889483d40SBram Moolenaar    vim9script
1669cfcd011fSBram Moolenaar    var name = 'string'
167089483d40SBram Moolenaar  END
167189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
167289483d40SBram Moolenaar  source XreloadVar.vim
167389483d40SBram Moolenaar
167489483d40SBram Moolenaar  # now write the script using the same variable locally - works
167589483d40SBram Moolenaar  lines =<< trim END
167689483d40SBram Moolenaar    vim9script
167789483d40SBram Moolenaar    def Func()
1678cfcd011fSBram Moolenaar      var name = 'string'
167989483d40SBram Moolenaar    enddef
168089483d40SBram Moolenaar  END
168189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
168289483d40SBram Moolenaar  source XreloadVar.vim
168389483d40SBram Moolenaar
168489483d40SBram Moolenaar  delete('XreloadVar.vim')
168589483d40SBram Moolenaarenddef
168689483d40SBram Moolenaar
16878a7d6542SBram Moolenaardef Test_import_absolute()
1688cfcd011fSBram Moolenaar  var import_lines = [
1689e6085c53SBram Moolenaar        'vim9script',
1690e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1691e6085c53SBram Moolenaar        'def UseExported()',
1692e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1693e6085c53SBram Moolenaar        '  exported = 8888',
1694e6085c53SBram Moolenaar        '  g:imported_after = exported',
1695e6085c53SBram Moolenaar        'enddef',
1696e6085c53SBram Moolenaar        'UseExported()',
1697e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1698e6085c53SBram Moolenaar        ]
16998a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
17008a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
17018a7d6542SBram Moolenaar
17028a7d6542SBram Moolenaar  source Ximport_abs.vim
17038a7d6542SBram Moolenaar
17048a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
17054e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1706fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1707fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1708fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1709fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1710fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1711fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1712fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1713fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1714fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1715fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1716e6085c53SBram Moolenaar        g:import_disassembled)
1717b3ca9824SBram Moolenaar
1718b3ca9824SBram Moolenaar  Undo_export_script_lines()
17198a7d6542SBram Moolenaar  unlet g:imported_abs
17204e12a5dfSBram Moolenaar  unlet g:import_disassembled
17218a7d6542SBram Moolenaar
17228a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
17238a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
17248a7d6542SBram Moolenaarenddef
17258a7d6542SBram Moolenaar
17268a7d6542SBram Moolenaardef Test_import_rtp()
1727cfcd011fSBram Moolenaar  var import_lines = [
1728e6085c53SBram Moolenaar        'vim9script',
1729e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1730e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1731e6085c53SBram Moolenaar        ]
17328a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
17338a7d6542SBram Moolenaar  mkdir('import')
17348a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
17358a7d6542SBram Moolenaar
1736cfcd011fSBram Moolenaar  var save_rtp = &rtp
17378a7d6542SBram Moolenaar  &rtp = getcwd()
17388a7d6542SBram Moolenaar  source Ximport_rtp.vim
17398a7d6542SBram Moolenaar  &rtp = save_rtp
17408a7d6542SBram Moolenaar
17418a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
17428a7d6542SBram Moolenaar
1743b3ca9824SBram Moolenaar  Undo_export_script_lines()
1744b3ca9824SBram Moolenaar  unlet g:imported_rtp
17458a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
174689483d40SBram Moolenaar  delete('import', 'rf')
17478a7d6542SBram Moolenaarenddef
17488a7d6542SBram Moolenaar
174925e0f586SBram Moolenaardef Test_import_compile_error()
1750cfcd011fSBram Moolenaar  var export_lines = [
175125e0f586SBram Moolenaar        'vim9script',
175225e0f586SBram Moolenaar        'export def ExpFunc(): string',
175325e0f586SBram Moolenaar        '  return notDefined',
175425e0f586SBram Moolenaar        'enddef',
175525e0f586SBram Moolenaar        ]
175625e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
175725e0f586SBram Moolenaar
1758cfcd011fSBram Moolenaar  var import_lines = [
175925e0f586SBram Moolenaar        'vim9script',
176025e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
176125e0f586SBram Moolenaar        'def ImpFunc()',
176225e0f586SBram Moolenaar        '  echo ExpFunc()',
176325e0f586SBram Moolenaar        'enddef',
176425e0f586SBram Moolenaar        'defcompile',
176525e0f586SBram Moolenaar        ]
176625e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
176725e0f586SBram Moolenaar
176825e0f586SBram Moolenaar  try
176925e0f586SBram Moolenaar    source Ximport.vim
177025e0f586SBram Moolenaar  catch /E1001/
1771f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
17727707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
177325e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
177425e0f586SBram Moolenaar  endtry
177525e0f586SBram Moolenaar
177625e0f586SBram Moolenaar  delete('Xexported.vim')
177725e0f586SBram Moolenaar  delete('Ximport.vim')
177825e0f586SBram Moolenaarenddef
177925e0f586SBram Moolenaar
1780c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1781cfcd011fSBram Moolenaar  var lines = [
1782c4ce36d4SBram Moolenaar        'vim9script',
1783c4ce36d4SBram Moolenaar        'def Func()',
1784c4ce36d4SBram Moolenaar        '  eval [][0]',
1785c4ce36d4SBram Moolenaar        'enddef',
1786c4ce36d4SBram Moolenaar        'Func()',
1787c4ce36d4SBram Moolenaar        ]
1788c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1789c4ce36d4SBram Moolenaar
1790c4ce36d4SBram Moolenaar  for count in range(3)
1791c4ce36d4SBram Moolenaar    try
1792c4ce36d4SBram Moolenaar      source Xtestscript.vim
1793c4ce36d4SBram Moolenaar    catch /E684/
1794c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1795c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1796c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1797c4ce36d4SBram Moolenaar    endtry
1798c4ce36d4SBram Moolenaar  endfor
1799c4ce36d4SBram Moolenaar
1800c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1801c4ce36d4SBram Moolenaarenddef
1802c4ce36d4SBram Moolenaar
1803eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1804cfcd011fSBram Moolenaar  var export_lines =<< trim END
1805eef2102eSBram Moolenaar      vim9script
1806eef2102eSBram Moolenaar      export def Func()
1807eef2102eSBram Moolenaar        echo 'imported'
1808eef2102eSBram Moolenaar      enddef
1809eef2102eSBram Moolenaar  END
1810eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1811eef2102eSBram Moolenaar
1812cfcd011fSBram Moolenaar  var lines =<< trim END
1813eef2102eSBram Moolenaar    vim9script
1814eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1815eef2102eSBram Moolenaar    def Func()
1816eef2102eSBram Moolenaar      echo 'local to function'
1817eef2102eSBram Moolenaar    enddef
1818eef2102eSBram Moolenaar  END
1819eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1820eef2102eSBram Moolenaar
1821eef2102eSBram Moolenaar  lines =<< trim END
1822eef2102eSBram Moolenaar    vim9script
1823eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1824eef2102eSBram Moolenaar    def Outer()
1825eef2102eSBram Moolenaar      def Func()
1826eef2102eSBram Moolenaar        echo 'local to function'
1827eef2102eSBram Moolenaar      enddef
1828eef2102eSBram Moolenaar    enddef
1829eef2102eSBram Moolenaar    defcompile
1830eef2102eSBram Moolenaar  END
1831eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1832eef2102eSBram Moolenaar
1833eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1834eef2102eSBram Moolenaarenddef
1835eef2102eSBram Moolenaar
1836b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1837cfcd011fSBram Moolenaar  var lines =<< trim END
1838b9a2cac3SBram Moolenaar    vim9script
1839b9a2cac3SBram Moolenaar    def Func()
1840b9a2cac3SBram Moolenaar      echo 'one'
1841b9a2cac3SBram Moolenaar    enddef
1842b9a2cac3SBram Moolenaar    def Func()
1843b9a2cac3SBram Moolenaar      echo 'two'
1844b9a2cac3SBram Moolenaar    enddef
1845b9a2cac3SBram Moolenaar  END
1846b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1847fa211f3cSBram Moolenaar
1848fa211f3cSBram Moolenaar  lines =<< trim END
1849fa211f3cSBram Moolenaar    vim9script
1850fa211f3cSBram Moolenaar    def Foo(): string
1851fa211f3cSBram Moolenaar      return 'foo'
1852fa211f3cSBram Moolenaar      enddef
1853fa211f3cSBram Moolenaar    def Func()
1854cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1855fa211f3cSBram Moolenaar    enddef
1856fa211f3cSBram Moolenaar    defcompile
1857fa211f3cSBram Moolenaar  END
1858fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1859b9a2cac3SBram Moolenaarenddef
1860b9a2cac3SBram Moolenaar
18618a7d6542SBram Moolenaardef Test_fixed_size_list()
1862f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1863cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
18648a7d6542SBram Moolenaar  l->remove(0)
18658a7d6542SBram Moolenaar  l->add(5)
18668a7d6542SBram Moolenaar  l->insert(99, 1)
18670f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
18688a7d6542SBram Moolenaarenddef
18698a7d6542SBram Moolenaar
1870ae616494SBram Moolenaardef Test_no_insert_xit()
1871d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1872d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1873d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1874d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1875d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1876ae616494SBram Moolenaar
1877ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1878ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1879ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1880ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1881f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1882f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1883f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1884f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1885f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1886ae616494SBram Moolenaarenddef
1887ae616494SBram Moolenaar
1888158906cfSBram Moolenaardef IfElse(what: number): string
1889cfcd011fSBram Moolenaar  var res = ''
1890158906cfSBram Moolenaar  if what == 1
1891158906cfSBram Moolenaar    res = "one"
1892158906cfSBram Moolenaar  elseif what == 2
1893158906cfSBram Moolenaar    res = "two"
1894a259d8d3SBram Moolenaar  else
1895158906cfSBram Moolenaar    res = "three"
1896a259d8d3SBram Moolenaar  endif
1897158906cfSBram Moolenaar  return res
1898a259d8d3SBram Moolenaarenddef
1899a259d8d3SBram Moolenaar
1900158906cfSBram Moolenaardef Test_if_elseif_else()
1901158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1902158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1903158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
19040f18b6d1SBram Moolenaarenddef
19050f18b6d1SBram Moolenaar
1906e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1907d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1908d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1909d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1910ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1911d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
19126628b7ebSBram Moolenaar
19136628b7ebSBram Moolenaar  var lines =<< trim END
19146628b7ebSBram Moolenaar      var s = ''
19156628b7ebSBram Moolenaar      if s = ''
19166628b7ebSBram Moolenaar      endif
19176628b7ebSBram Moolenaar  END
19186628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
19196628b7ebSBram Moolenaar
19206628b7ebSBram Moolenaar  lines =<< trim END
19216628b7ebSBram Moolenaar      var s = ''
19226628b7ebSBram Moolenaar      if s == ''
19236628b7ebSBram Moolenaar      elseif s = ''
19246628b7ebSBram Moolenaar      endif
19256628b7ebSBram Moolenaar  END
19266628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
1927e8c4abbbSBram Moolenaarenddef
1928e8c4abbbSBram Moolenaar
19296d69bf60SBram Moolenaarlet g:bool_true = v:true
19306d69bf60SBram Moolenaarlet g:bool_false = v:false
19316d69bf60SBram Moolenaar
19326d69bf60SBram Moolenaardef Test_if_const_expr()
1933cfcd011fSBram Moolenaar  var res = false
19346d69bf60SBram Moolenaar  if true ? true : false
19356d69bf60SBram Moolenaar    res = true
19366d69bf60SBram Moolenaar  endif
19376d69bf60SBram Moolenaar  assert_equal(true, res)
19386d69bf60SBram Moolenaar
1939585fea7bSBram Moolenaar  g:glob = 2
1940585fea7bSBram Moolenaar  if false
19416797966dSBram Moolenaar    execute('g:glob = 3')
1942585fea7bSBram Moolenaar  endif
1943585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1944585fea7bSBram Moolenaar  if true
19456797966dSBram Moolenaar    execute('g:glob = 3')
1946585fea7bSBram Moolenaar  endif
1947585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1948585fea7bSBram Moolenaar
19496d69bf60SBram Moolenaar  res = false
19506d69bf60SBram Moolenaar  if g:bool_true ? true : false
19516d69bf60SBram Moolenaar    res = true
19526d69bf60SBram Moolenaar  endif
19536d69bf60SBram Moolenaar  assert_equal(true, res)
19546d69bf60SBram Moolenaar
19556d69bf60SBram Moolenaar  res = false
19566d69bf60SBram Moolenaar  if true ? g:bool_true : false
19576d69bf60SBram Moolenaar    res = true
19586d69bf60SBram Moolenaar  endif
19596d69bf60SBram Moolenaar  assert_equal(true, res)
19606d69bf60SBram Moolenaar
19616d69bf60SBram Moolenaar  res = false
19626d69bf60SBram Moolenaar  if true ? true : g:bool_false
19636d69bf60SBram Moolenaar    res = true
19646d69bf60SBram Moolenaar  endif
19656d69bf60SBram Moolenaar  assert_equal(true, res)
19666d69bf60SBram Moolenaar
19676d69bf60SBram Moolenaar  res = false
19686d69bf60SBram Moolenaar  if true ? false : true
19696d69bf60SBram Moolenaar    res = true
19706d69bf60SBram Moolenaar  endif
19716d69bf60SBram Moolenaar  assert_equal(false, res)
19726d69bf60SBram Moolenaar
19736d69bf60SBram Moolenaar  res = false
19746d69bf60SBram Moolenaar  if false ? false : true
19756d69bf60SBram Moolenaar    res = true
19766d69bf60SBram Moolenaar  endif
19776d69bf60SBram Moolenaar  assert_equal(true, res)
19786d69bf60SBram Moolenaar
19796d69bf60SBram Moolenaar  res = false
19806d69bf60SBram Moolenaar  if false ? true : false
19816d69bf60SBram Moolenaar    res = true
19826d69bf60SBram Moolenaar  endif
19836d69bf60SBram Moolenaar  assert_equal(false, res)
19846d69bf60SBram Moolenaar
19856d69bf60SBram Moolenaar  res = false
1986e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1987e8c4abbbSBram Moolenaar    res = true
1988e8c4abbbSBram Moolenaar  endif
1989e8c4abbbSBram Moolenaar  assert_equal(false, res)
1990e8c4abbbSBram Moolenaar
1991e8c4abbbSBram Moolenaar  res = false
19926d69bf60SBram Moolenaar  if true && true
19936d69bf60SBram Moolenaar    res = true
19946d69bf60SBram Moolenaar  endif
19956d69bf60SBram Moolenaar  assert_equal(true, res)
19966d69bf60SBram Moolenaar
19976d69bf60SBram Moolenaar  res = false
19986d69bf60SBram Moolenaar  if true && false
19996d69bf60SBram Moolenaar    res = true
20006d69bf60SBram Moolenaar  endif
20016d69bf60SBram Moolenaar  assert_equal(false, res)
20026d69bf60SBram Moolenaar
20036d69bf60SBram Moolenaar  res = false
20046d69bf60SBram Moolenaar  if g:bool_true && false
20056d69bf60SBram Moolenaar    res = true
20066d69bf60SBram Moolenaar  endif
20076d69bf60SBram Moolenaar  assert_equal(false, res)
20086d69bf60SBram Moolenaar
20096d69bf60SBram Moolenaar  res = false
20106d69bf60SBram Moolenaar  if true && g:bool_false
20116d69bf60SBram Moolenaar    res = true
20126d69bf60SBram Moolenaar  endif
20136d69bf60SBram Moolenaar  assert_equal(false, res)
20146d69bf60SBram Moolenaar
20156d69bf60SBram Moolenaar  res = false
20166d69bf60SBram Moolenaar  if false && false
20176d69bf60SBram Moolenaar    res = true
20186d69bf60SBram Moolenaar  endif
20196d69bf60SBram Moolenaar  assert_equal(false, res)
20206d69bf60SBram Moolenaar
20216d69bf60SBram Moolenaar  res = false
20226d69bf60SBram Moolenaar  if true || false
20236d69bf60SBram Moolenaar    res = true
20246d69bf60SBram Moolenaar  endif
20256d69bf60SBram Moolenaar  assert_equal(true, res)
20266d69bf60SBram Moolenaar
20276d69bf60SBram Moolenaar  res = false
20286d69bf60SBram Moolenaar  if g:bool_true || false
20296d69bf60SBram Moolenaar    res = true
20306d69bf60SBram Moolenaar  endif
20316d69bf60SBram Moolenaar  assert_equal(true, res)
20326d69bf60SBram Moolenaar
20336d69bf60SBram Moolenaar  res = false
20346d69bf60SBram Moolenaar  if true || g:bool_false
20356d69bf60SBram Moolenaar    res = true
20366d69bf60SBram Moolenaar  endif
20376d69bf60SBram Moolenaar  assert_equal(true, res)
20386d69bf60SBram Moolenaar
20396d69bf60SBram Moolenaar  res = false
20406d69bf60SBram Moolenaar  if false || false
20416d69bf60SBram Moolenaar    res = true
20426d69bf60SBram Moolenaar  endif
20436d69bf60SBram Moolenaar  assert_equal(false, res)
20443988f64fSBram Moolenaar
20453988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
20463988f64fSBram Moolenaar  if false | eval 0 | endif
20473988f64fSBram Moolenaar  if false | eval burp + 234 | endif
20483988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
20493988f64fSBram Moolenaar  if false
20503988f64fSBram Moolenaar    burp
20513988f64fSBram Moolenaar  endif
205280c34ca3SBram Moolenaarenddef
20536d69bf60SBram Moolenaar
205480c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2055d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2056d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2057d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2058d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
20596d69bf60SBram Moolenaarenddef
20606d69bf60SBram Moolenaar
206172abcf42SBram Moolenaardef RunNested(i: number): number
2062cfcd011fSBram Moolenaar  var x: number = 0
206372abcf42SBram Moolenaar  if i % 2
206472abcf42SBram Moolenaar    if 1
2065f5be8cdbSBram Moolenaar      # comment
206672abcf42SBram Moolenaar    else
2067f5be8cdbSBram Moolenaar      # comment
206872abcf42SBram Moolenaar    endif
206972abcf42SBram Moolenaar    x += 1
207072abcf42SBram Moolenaar  else
207172abcf42SBram Moolenaar    x += 1000
207272abcf42SBram Moolenaar  endif
207372abcf42SBram Moolenaar  return x
207472abcf42SBram Moolenaarenddef
207572abcf42SBram Moolenaar
207672abcf42SBram Moolenaardef Test_nested_if()
207772abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
207872abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
207972abcf42SBram Moolenaarenddef
208072abcf42SBram Moolenaar
2081ad39c094SBram Moolenaardef Test_execute_cmd()
2082e4984290SBram Moolenaar  # missing argument is ignored
2083e4984290SBram Moolenaar  execute
2084e4984290SBram Moolenaar  execute # comment
2085e4984290SBram Moolenaar
2086ad39c094SBram Moolenaar  new
2087ad39c094SBram Moolenaar  setline(1, 'default')
2088d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2089ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2090a72cfb80SBram Moolenaar
2091d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2092a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2093a72cfb80SBram Moolenaar
2094cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2095cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2096a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2097ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2098a72cfb80SBram Moolenaar
2099d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2100ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2101a72cfb80SBram Moolenaar
2102cfcd011fSBram Moolenaar  var cmd_first = 'call '
2103cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2104ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2105ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2106ad39c094SBram Moolenaar  bwipe!
2107585fea7bSBram Moolenaar
2108cfcd011fSBram Moolenaar  var n = true
21092d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
21102d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
21112d6b20d6SBram Moolenaar
2112e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2113e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2114e5abf7afSBram Moolenaar
2115d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2116d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2117d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2118ad39c094SBram Moolenaarenddef
2119ad39c094SBram Moolenaar
212047e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2121f5be8cdbSBram Moolenaar  # only checks line continuation
2122cfcd011fSBram Moolenaar  var lines =<< trim END
212347e880d6SBram Moolenaar      vim9script
212447e880d6SBram Moolenaar      execute 'g:someVar'
212547e880d6SBram Moolenaar                .. ' = ' ..
212647e880d6SBram Moolenaar                   '28'
212747e880d6SBram Moolenaar      assert_equal(28, g:someVar)
212847e880d6SBram Moolenaar      unlet g:someVar
212947e880d6SBram Moolenaar  END
213047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
213147e880d6SBram Moolenaarenddef
213247e880d6SBram Moolenaar
2133ad39c094SBram Moolenaardef Test_echo_cmd()
2134a72cfb80SBram Moolenaar  echo 'some' # comment
2135585fea7bSBram Moolenaar  echon 'thing'
2136ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2137ad39c094SBram Moolenaar
2138a72cfb80SBram Moolenaar  echo "some" # comment
2139a72cfb80SBram Moolenaar  echon "thing"
2140a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2141a72cfb80SBram Moolenaar
2142cfcd011fSBram Moolenaar  var str1 = 'some'
2143cfcd011fSBram Moolenaar  var str2 = 'more'
2144ad39c094SBram Moolenaar  echo str1 str2
2145ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2146a72cfb80SBram Moolenaar
2147d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2148ad39c094SBram Moolenaarenddef
2149ad39c094SBram Moolenaar
2150f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2151f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2152f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2153f93c7feaSBram Moolenaar  echo 'clear'
2154df069eecSBram Moolenaar  :1messages
2155f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2156f93c7feaSBram Moolenaar
2157d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2158f93c7feaSBram Moolenaarenddef
2159f93c7feaSBram Moolenaar
216047e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2161f5be8cdbSBram Moolenaar  # only checks line continuation
2162cfcd011fSBram Moolenaar  var lines =<< trim END
216347e880d6SBram Moolenaar      vim9script
216447e880d6SBram Moolenaar      echomsg 'here'
216547e880d6SBram Moolenaar                .. ' is ' ..
216647e880d6SBram Moolenaar                   'a message'
216747e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
216847e880d6SBram Moolenaar  END
216947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
217047e880d6SBram Moolenaarenddef
217147e880d6SBram Moolenaar
2172f93c7feaSBram Moolenaardef Test_echoerr_cmd()
217340ee466cSBram Moolenaar  try
217440ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
217540ee466cSBram Moolenaar  catch
217640ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
217740ee466cSBram Moolenaar  endtry
2178f93c7feaSBram Moolenaarenddef
2179f93c7feaSBram Moolenaar
218047e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2181f5be8cdbSBram Moolenaar  # only checks line continuation
2182cfcd011fSBram Moolenaar  var lines =<< trim END
218347e880d6SBram Moolenaar      vim9script
218447e880d6SBram Moolenaar      try
218547e880d6SBram Moolenaar        echoerr 'this'
218647e880d6SBram Moolenaar                .. ' is ' ..
218747e880d6SBram Moolenaar                   'wrong'
218847e880d6SBram Moolenaar      catch
218947e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
219047e880d6SBram Moolenaar      endtry
219147e880d6SBram Moolenaar  END
219247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
219347e880d6SBram Moolenaarenddef
219447e880d6SBram Moolenaar
219541fe0617SBram Moolenaardef Test_for_outside_of_function()
2196cfcd011fSBram Moolenaar  var lines =<< trim END
219741fe0617SBram Moolenaar    vim9script
219841fe0617SBram Moolenaar    new
219941fe0617SBram Moolenaar    for var in range(0, 3)
220041fe0617SBram Moolenaar      append(line('$'), var)
220141fe0617SBram Moolenaar    endfor
220241fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
220341fe0617SBram Moolenaar    bwipe!
220441fe0617SBram Moolenaar  END
220541fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
220641fe0617SBram Moolenaar  source Xvim9for.vim
220741fe0617SBram Moolenaar  delete('Xvim9for.vim')
220841fe0617SBram Moolenaarenddef
22098a7d6542SBram Moolenaar
2210e8c4abbbSBram Moolenaardef Test_for_loop()
2211cfcd011fSBram Moolenaar  var result = ''
2212e8c4abbbSBram Moolenaar  for cnt in range(7)
2213e8c4abbbSBram Moolenaar    if cnt == 4
2214e8c4abbbSBram Moolenaar      break
2215e8c4abbbSBram Moolenaar    endif
2216e8c4abbbSBram Moolenaar    if cnt == 2
2217e8c4abbbSBram Moolenaar      continue
2218e8c4abbbSBram Moolenaar    endif
2219e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2220e8c4abbbSBram Moolenaar  endfor
2221e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
22220ad3e894SBram Moolenaar
2223cfcd011fSBram Moolenaar  var concat = ''
22240ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
22250ad3e894SBram Moolenaar    concat ..= str
22260ad3e894SBram Moolenaar  endfor
22270ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
222838bd8de5SBram Moolenaar
222938bd8de5SBram Moolenaar  var total = 0
223038bd8de5SBram Moolenaar  for nr in
223138bd8de5SBram Moolenaar      [1, 2, 3]
223238bd8de5SBram Moolenaar    total += nr
223338bd8de5SBram Moolenaar  endfor
223438bd8de5SBram Moolenaar  assert_equal(6, total)
223538bd8de5SBram Moolenaar
223638bd8de5SBram Moolenaar  total = 0
223738bd8de5SBram Moolenaar  for nr
223838bd8de5SBram Moolenaar    in [1, 2, 3]
223938bd8de5SBram Moolenaar    total += nr
224038bd8de5SBram Moolenaar  endfor
224138bd8de5SBram Moolenaar  assert_equal(6, total)
224238bd8de5SBram Moolenaar
224338bd8de5SBram Moolenaar  total = 0
224438bd8de5SBram Moolenaar  for nr
224538bd8de5SBram Moolenaar    in
224638bd8de5SBram Moolenaar    [1, 2, 3]
224738bd8de5SBram Moolenaar    total += nr
224838bd8de5SBram Moolenaar  endfor
224938bd8de5SBram Moolenaar  assert_equal(6, total)
2250036d0714SBram Moolenaar
2251036d0714SBram Moolenaar  var res = ""
2252036d0714SBram Moolenaar  for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2253036d0714SBram Moolenaar    res ..= n .. s
2254036d0714SBram Moolenaar  endfor
2255036d0714SBram Moolenaar  assert_equal('1a2b', res)
2256e8c4abbbSBram Moolenaarenddef
2257e8c4abbbSBram Moolenaar
2258e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2259025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2260025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2261025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2262675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2263675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2264cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2265822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
22662d870f8dSBram Moolenaar  delfunc! g:Func
2267451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2268675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2269675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2270675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2271e8c4abbbSBram Moolenaarenddef
2272e8c4abbbSBram Moolenaar
2273ea87069dSBram Moolenaardef Test_for_loop_script_var()
2274ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2275ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2276ea87069dSBram Moolenaar
2277ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2278ea87069dSBram Moolenaar  var lines =<< trim END
2279ea87069dSBram Moolenaar    vim9script
2280ea87069dSBram Moolenaar    var total = 0
2281ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2282ea87069dSBram Moolenaar      total += s:var
2283ea87069dSBram Moolenaar    endfor
2284ea87069dSBram Moolenaar    assert_equal(6, total)
2285ea87069dSBram Moolenaar
2286ea87069dSBram Moolenaar    total = 0
2287ea87069dSBram Moolenaar    for var in [1, 2, 3]
2288ea87069dSBram Moolenaar      total += var
2289ea87069dSBram Moolenaar    endfor
2290ea87069dSBram Moolenaar    assert_equal(6, total)
2291ea87069dSBram Moolenaar  END
2292ea87069dSBram Moolenaarenddef
2293ea87069dSBram Moolenaar
2294792f786aSBram Moolenaardef Test_for_loop_unpack()
22954b8a0651SBram Moolenaar  var lines =<< trim END
2296792f786aSBram Moolenaar      var result = []
2297792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2298792f786aSBram Moolenaar        result->add(v1)
2299792f786aSBram Moolenaar        result->add(v2)
2300792f786aSBram Moolenaar      endfor
2301792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2302792f786aSBram Moolenaar
2303792f786aSBram Moolenaar      result = []
2304792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2305792f786aSBram Moolenaar        result->add(v1)
2306792f786aSBram Moolenaar        result->add(v2)
2307792f786aSBram Moolenaar        result->add(v3)
2308792f786aSBram Moolenaar      endfor
2309792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2310792f786aSBram Moolenaar
23114b8a0651SBram Moolenaar      result = []
23124b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
23134b8a0651SBram Moolenaar        result->add(&ts)
23144b8a0651SBram Moolenaar        result->add(&sw)
23154b8a0651SBram Moolenaar      endfor
23164b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
23174b8a0651SBram Moolenaar
23184b8a0651SBram Moolenaar      var slist: list<string>
23194b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
23204b8a0651SBram Moolenaar        slist->add($LOOPVAR)
23214b8a0651SBram Moolenaar        slist->add(@r)
23224b8a0651SBram Moolenaar        slist->add(v:errmsg)
23234b8a0651SBram Moolenaar      endfor
23244b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
23254b8a0651SBram Moolenaar
23264b8a0651SBram Moolenaar      slist = []
23274b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
23284b8a0651SBram Moolenaar        slist->add(g:globalvar)
23294b8a0651SBram Moolenaar        slist->add(b:bufvar)
23304b8a0651SBram Moolenaar        slist->add(w:winvar)
23314b8a0651SBram Moolenaar        slist->add(t:tabvar)
23324b8a0651SBram Moolenaar      endfor
23334b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2334f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
23354b8a0651SBram Moolenaar  END
23364b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
23374b8a0651SBram Moolenaar
23384b8a0651SBram Moolenaar  lines =<< trim END
2339792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2340792f786aSBram Moolenaar        echo v1 v2
2341792f786aSBram Moolenaar      endfor
2342792f786aSBram Moolenaar  END
2343792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2344792f786aSBram Moolenaar
2345792f786aSBram Moolenaar  lines =<< trim END
2346792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2347792f786aSBram Moolenaar        echo v1 v2
2348792f786aSBram Moolenaar      endfor
2349792f786aSBram Moolenaar  END
2350792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2351792f786aSBram Moolenaar
2352792f786aSBram Moolenaar  lines =<< trim END
2353792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2354792f786aSBram Moolenaar        echo v1
2355792f786aSBram Moolenaar      endfor
2356792f786aSBram Moolenaar  END
2357792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2358792f786aSBram Moolenaarenddef
2359792f786aSBram Moolenaar
2360c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2361c150c09eSBram Moolenaar  var looped = 0
2362c150c09eSBram Moolenaar  var cleanup = 0
2363c150c09eSBram Moolenaar  for i in range(3)
2364c150c09eSBram Moolenaar    looped += 1
2365c150c09eSBram Moolenaar    try
2366c150c09eSBram Moolenaar      eval [][0]
2367c150c09eSBram Moolenaar    catch
2368c150c09eSBram Moolenaar      continue
2369c150c09eSBram Moolenaar    finally
2370c150c09eSBram Moolenaar      cleanup += 1
2371c150c09eSBram Moolenaar    endtry
2372c150c09eSBram Moolenaar  endfor
2373c150c09eSBram Moolenaar  assert_equal(3, looped)
2374c150c09eSBram Moolenaar  assert_equal(3, cleanup)
2375c150c09eSBram Moolenaarenddef
2376c150c09eSBram Moolenaar
2377d0df1aacSBram Moolenaardef Test_while_loop()
2378cfcd011fSBram Moolenaar  var result = ''
2379cfcd011fSBram Moolenaar  var cnt = 0
2380d0df1aacSBram Moolenaar  while cnt < 555
2381d0df1aacSBram Moolenaar    if cnt == 3
2382d0df1aacSBram Moolenaar      break
2383d0df1aacSBram Moolenaar    endif
2384d0df1aacSBram Moolenaar    cnt += 1
2385d0df1aacSBram Moolenaar    if cnt == 2
2386d0df1aacSBram Moolenaar      continue
2387d0df1aacSBram Moolenaar    endif
2388d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2389d0df1aacSBram Moolenaar  endwhile
2390d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2391dee37dc7SBram Moolenaar
2392dee37dc7SBram Moolenaar  var s = ''
23930123cc1eSBram Moolenaar  while s == 'x' #{comment}
2394dee37dc7SBram Moolenaar  endwhile
2395d0df1aacSBram Moolenaarenddef
2396d0df1aacSBram Moolenaar
2397e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2398675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2399675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2400675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2401675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2402675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2403675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2404675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
24056628b7ebSBram Moolenaar
24066628b7ebSBram Moolenaar  var lines =<< trim END
24076628b7ebSBram Moolenaar      var s = ''
24086628b7ebSBram Moolenaar      while s = ''
24096628b7ebSBram Moolenaar      endwhile
24106628b7ebSBram Moolenaar  END
24116628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2412bd5da371SBram Moolenaarenddef
2413bd5da371SBram Moolenaar
24149645e2d9SBram Moolenaardef Test_interrupt_loop()
2415cfcd011fSBram Moolenaar  var caught = false
2416cfcd011fSBram Moolenaar  var x = 0
241797acfc78SBram Moolenaar  try
24189645e2d9SBram Moolenaar    while 1
24199645e2d9SBram Moolenaar      x += 1
24209645e2d9SBram Moolenaar      if x == 100
24219645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
24229645e2d9SBram Moolenaar      endif
24239645e2d9SBram Moolenaar    endwhile
242497acfc78SBram Moolenaar  catch
242597acfc78SBram Moolenaar    caught = true
242697acfc78SBram Moolenaar    assert_equal(100, x)
242797acfc78SBram Moolenaar  endtry
242897acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
242925859dd7SBram Moolenaar  # consume the CTRL-C
243025859dd7SBram Moolenaar  getchar(0)
24319645e2d9SBram Moolenaarenddef
243220431c9dSBram Moolenaar
24334fdae999SBram Moolenaardef Test_automatic_line_continuation()
2434cfcd011fSBram Moolenaar  var mylist = [
24354fdae999SBram Moolenaar      'one',
24364fdae999SBram Moolenaar      'two',
24374fdae999SBram Moolenaar      'three',
2438f5be8cdbSBram Moolenaar      ] # comment
24394fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
24404fdae999SBram Moolenaar
2441cfcd011fSBram Moolenaar  var mydict = {
2442e0de171eSBram Moolenaar      ['one']: 1,
2443e0de171eSBram Moolenaar      ['two']: 2,
2444e0de171eSBram Moolenaar      ['three']:
24454fdae999SBram Moolenaar          3,
2446f5be8cdbSBram Moolenaar      } # comment
2447e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2448e0de171eSBram Moolenaar  mydict = {
24492c330432SBram Moolenaar      one: 1,  # comment
24502c330432SBram Moolenaar      two:     # comment
24512c330432SBram Moolenaar           2,  # comment
24522c330432SBram Moolenaar      three: 3 # comment
24532c330432SBram Moolenaar      }
2454e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2455e0de171eSBram Moolenaar  mydict = {
24562c330432SBram Moolenaar      one: 1,
24574fdae999SBram Moolenaar      two:
24584fdae999SBram Moolenaar           2,
24592c330432SBram Moolenaar      three: 3
24604fdae999SBram Moolenaar      }
2461e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2462e6085c53SBram Moolenaar
2463e6085c53SBram Moolenaar  assert_equal(
2464e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2465e6085c53SBram Moolenaar        split('one two three')
2466e6085c53SBram Moolenaar        )
24674fdae999SBram Moolenaarenddef
24684fdae999SBram Moolenaar
24697a092245SBram Moolenaardef Test_vim9_comment()
24707a092245SBram Moolenaar  CheckScriptSuccess([
24717a092245SBram Moolenaar      'vim9script',
24727a092245SBram Moolenaar      '# something',
247393f82cbeSBram Moolenaar      '#something',
247493f82cbeSBram Moolenaar      '#{something',
24757a092245SBram Moolenaar      ])
247693f82cbeSBram Moolenaar
247793f82cbeSBram Moolenaar  split Xfile
247893f82cbeSBram Moolenaar  CheckScriptSuccess([
247993f82cbeSBram Moolenaar      'vim9script',
248093f82cbeSBram Moolenaar      'edit #something',
248193f82cbeSBram Moolenaar      ])
248293f82cbeSBram Moolenaar  CheckScriptSuccess([
248393f82cbeSBram Moolenaar      'vim9script',
248493f82cbeSBram Moolenaar      'edit #{something',
248593f82cbeSBram Moolenaar      ])
248693f82cbeSBram Moolenaar  close
248793f82cbeSBram Moolenaar
24887a092245SBram Moolenaar  CheckScriptFailure([
24897a092245SBram Moolenaar      'vim9script',
24907a092245SBram Moolenaar      ':# something',
24917a092245SBram Moolenaar      ], 'E488:')
24927a092245SBram Moolenaar  CheckScriptFailure([
24937a092245SBram Moolenaar      '# something',
24947a092245SBram Moolenaar      ], 'E488:')
24957a092245SBram Moolenaar  CheckScriptFailure([
24967a092245SBram Moolenaar      ':# something',
24977a092245SBram Moolenaar      ], 'E488:')
24987a092245SBram Moolenaar
24994a8d9f2eSBram Moolenaar  { # block start
25004a8d9f2eSBram Moolenaar  } # block end
25014a8d9f2eSBram Moolenaar  CheckDefFailure([
25024a8d9f2eSBram Moolenaar      '{# comment',
25034a8d9f2eSBram Moolenaar      ], 'E488:')
25044a8d9f2eSBram Moolenaar  CheckDefFailure([
25054a8d9f2eSBram Moolenaar      '{',
25064a8d9f2eSBram Moolenaar      '}# comment',
25074a8d9f2eSBram Moolenaar      ], 'E488:')
25084a8d9f2eSBram Moolenaar
25094a8d9f2eSBram Moolenaar  echo "yes" # comment
25104a8d9f2eSBram Moolenaar  CheckDefFailure([
25114a8d9f2eSBram Moolenaar      'echo "yes"# comment',
25124a8d9f2eSBram Moolenaar      ], 'E488:')
25137a092245SBram Moolenaar  CheckScriptSuccess([
25147a092245SBram Moolenaar      'vim9script',
25157a092245SBram Moolenaar      'echo "yes" # something',
25167a092245SBram Moolenaar      ])
25177a092245SBram Moolenaar  CheckScriptFailure([
25187a092245SBram Moolenaar      'vim9script',
25197a092245SBram Moolenaar      'echo "yes"# something',
25207a092245SBram Moolenaar      ], 'E121:')
25217a092245SBram Moolenaar  CheckScriptFailure([
25227a092245SBram Moolenaar      'vim9script',
25237a092245SBram Moolenaar      'echo# something',
2524f8103f27SBram Moolenaar      ], 'E1144:')
25257a092245SBram Moolenaar  CheckScriptFailure([
25267a092245SBram Moolenaar      'echo "yes" # something',
25277a092245SBram Moolenaar      ], 'E121:')
25287a092245SBram Moolenaar
25294a8d9f2eSBram Moolenaar  exe "echo" # comment
25304a8d9f2eSBram Moolenaar  CheckDefFailure([
25314a8d9f2eSBram Moolenaar      'exe "echo"# comment',
25324a8d9f2eSBram Moolenaar      ], 'E488:')
25334a8d9f2eSBram Moolenaar  CheckScriptSuccess([
25344a8d9f2eSBram Moolenaar      'vim9script',
25354a8d9f2eSBram Moolenaar      'exe "echo" # something',
25364a8d9f2eSBram Moolenaar      ])
25374a8d9f2eSBram Moolenaar  CheckScriptFailure([
25384a8d9f2eSBram Moolenaar      'vim9script',
25394a8d9f2eSBram Moolenaar      'exe "echo"# something',
25404a8d9f2eSBram Moolenaar      ], 'E121:')
25414a8d9f2eSBram Moolenaar  CheckScriptFailure([
25424a8d9f2eSBram Moolenaar      'vim9script',
25434a8d9f2eSBram Moolenaar      'exe# something',
2544f8103f27SBram Moolenaar      ], 'E1144:')
25454a8d9f2eSBram Moolenaar  CheckScriptFailure([
25464a8d9f2eSBram Moolenaar      'exe "echo" # something',
25474a8d9f2eSBram Moolenaar      ], 'E121:')
25484a8d9f2eSBram Moolenaar
25497a092245SBram Moolenaar  CheckDefFailure([
25507a092245SBram Moolenaar      'try# comment',
25517a092245SBram Moolenaar      '  echo "yes"',
25527a092245SBram Moolenaar      'catch',
25537a092245SBram Moolenaar      'endtry',
2554f8103f27SBram Moolenaar      ], 'E1144:')
25552c5ed4e3SBram Moolenaar  CheckScriptFailure([
25562c5ed4e3SBram Moolenaar      'vim9script',
25572c5ed4e3SBram Moolenaar      'try# comment',
25582c5ed4e3SBram Moolenaar      'echo "yes"',
2559f8103f27SBram Moolenaar      ], 'E1144:')
25607a092245SBram Moolenaar  CheckDefFailure([
25617a092245SBram Moolenaar      'try',
2562a72cfb80SBram Moolenaar      '  throw#comment',
2563a72cfb80SBram Moolenaar      'catch',
2564a72cfb80SBram Moolenaar      'endtry',
2565f8103f27SBram Moolenaar      ], 'E1144:')
2566a72cfb80SBram Moolenaar  CheckDefFailure([
2567a72cfb80SBram Moolenaar      'try',
2568a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2569a72cfb80SBram Moolenaar      'catch',
2570a72cfb80SBram Moolenaar      'endtry',
2571a72cfb80SBram Moolenaar      ], 'E488:')
2572a72cfb80SBram Moolenaar  CheckDefFailure([
2573a72cfb80SBram Moolenaar      'try',
25747a092245SBram Moolenaar      '  echo "yes"',
25757a092245SBram Moolenaar      'catch# comment',
25767a092245SBram Moolenaar      'endtry',
2577f8103f27SBram Moolenaar      ], 'E1144:')
25782c5ed4e3SBram Moolenaar  CheckScriptFailure([
25792c5ed4e3SBram Moolenaar      'vim9script',
25802c5ed4e3SBram Moolenaar      'try',
25812c5ed4e3SBram Moolenaar      '  echo "yes"',
25822c5ed4e3SBram Moolenaar      'catch# comment',
25832c5ed4e3SBram Moolenaar      'endtry',
2584f8103f27SBram Moolenaar      ], 'E1144:')
25852c5ed4e3SBram Moolenaar  CheckDefFailure([
25862c5ed4e3SBram Moolenaar      'try',
25872c5ed4e3SBram Moolenaar      '  echo "yes"',
25882c5ed4e3SBram Moolenaar      'catch /pat/# comment',
25892c5ed4e3SBram Moolenaar      'endtry',
25902c5ed4e3SBram Moolenaar      ], 'E488:')
25917a092245SBram Moolenaar  CheckDefFailure([
25927a092245SBram Moolenaar      'try',
25937a092245SBram Moolenaar      'echo "yes"',
25947a092245SBram Moolenaar      'catch',
25957a092245SBram Moolenaar      'endtry# comment',
2596f8103f27SBram Moolenaar      ], 'E1144:')
25972c5ed4e3SBram Moolenaar  CheckScriptFailure([
25982c5ed4e3SBram Moolenaar      'vim9script',
25992c5ed4e3SBram Moolenaar      'try',
26002c5ed4e3SBram Moolenaar      '  echo "yes"',
26012c5ed4e3SBram Moolenaar      'catch',
26022c5ed4e3SBram Moolenaar      'endtry# comment',
2603f8103f27SBram Moolenaar      ], 'E1144:')
26042c5ed4e3SBram Moolenaar
26052c5ed4e3SBram Moolenaar  CheckScriptSuccess([
26062c5ed4e3SBram Moolenaar      'vim9script',
26072c5ed4e3SBram Moolenaar      'hi # comment',
26082c5ed4e3SBram Moolenaar      ])
26092c5ed4e3SBram Moolenaar  CheckScriptFailure([
26102c5ed4e3SBram Moolenaar      'vim9script',
26112c5ed4e3SBram Moolenaar      'hi# comment',
2612f8103f27SBram Moolenaar      ], 'E1144:')
26131966c248SBram Moolenaar  CheckScriptSuccess([
26141966c248SBram Moolenaar      'vim9script',
26151966c248SBram Moolenaar      'hi Search # comment',
26161966c248SBram Moolenaar      ])
26171966c248SBram Moolenaar  CheckScriptFailure([
26181966c248SBram Moolenaar      'vim9script',
26191966c248SBram Moolenaar      'hi Search# comment',
26201966c248SBram Moolenaar      ], 'E416:')
26211966c248SBram Moolenaar  CheckScriptSuccess([
26221966c248SBram Moolenaar      'vim9script',
26231966c248SBram Moolenaar      'hi link This Search # comment',
26241966c248SBram Moolenaar      ])
26251966c248SBram Moolenaar  CheckScriptFailure([
26261966c248SBram Moolenaar      'vim9script',
26271966c248SBram Moolenaar      'hi link This That# comment',
26281966c248SBram Moolenaar      ], 'E413:')
26291966c248SBram Moolenaar  CheckScriptSuccess([
26301966c248SBram Moolenaar      'vim9script',
26311966c248SBram Moolenaar      'hi clear This # comment',
26321966c248SBram Moolenaar      'hi clear # comment',
26331966c248SBram Moolenaar      ])
2634f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2635f5be8cdbSBram Moolenaar  # hi clear This# comment',
26361966c248SBram Moolenaar  CheckScriptFailure([
26371966c248SBram Moolenaar      'vim9script',
26381966c248SBram Moolenaar      'hi clear# comment',
26391966c248SBram Moolenaar      ], 'E416:')
26401966c248SBram Moolenaar
26411966c248SBram Moolenaar  CheckScriptSuccess([
26421966c248SBram Moolenaar      'vim9script',
26431966c248SBram Moolenaar      'hi Group term=bold',
26441966c248SBram Moolenaar      'match Group /todo/ # comment',
26451966c248SBram Moolenaar      ])
26461966c248SBram Moolenaar  CheckScriptFailure([
26471966c248SBram Moolenaar      'vim9script',
26481966c248SBram Moolenaar      'hi Group term=bold',
26491966c248SBram Moolenaar      'match Group /todo/# comment',
26501966c248SBram Moolenaar      ], 'E488:')
26511966c248SBram Moolenaar  CheckScriptSuccess([
26521966c248SBram Moolenaar      'vim9script',
26531966c248SBram Moolenaar      'match # comment',
26541966c248SBram Moolenaar      ])
26551966c248SBram Moolenaar  CheckScriptFailure([
26561966c248SBram Moolenaar      'vim9script',
26571966c248SBram Moolenaar      'match# comment',
2658f8103f27SBram Moolenaar      ], 'E1144:')
26591966c248SBram Moolenaar  CheckScriptSuccess([
26601966c248SBram Moolenaar      'vim9script',
26611966c248SBram Moolenaar      'match none # comment',
26621966c248SBram Moolenaar      ])
26631966c248SBram Moolenaar  CheckScriptFailure([
26641966c248SBram Moolenaar      'vim9script',
26651966c248SBram Moolenaar      'match none# comment',
26661966c248SBram Moolenaar      ], 'E475:')
26671966c248SBram Moolenaar
26681966c248SBram Moolenaar  CheckScriptSuccess([
26691966c248SBram Moolenaar      'vim9script',
26701966c248SBram Moolenaar      'menutrans clear # comment',
26711966c248SBram Moolenaar      ])
26721966c248SBram Moolenaar  CheckScriptFailure([
26731966c248SBram Moolenaar      'vim9script',
26741966c248SBram Moolenaar      'menutrans clear# comment text',
26751966c248SBram Moolenaar      ], 'E474:')
26761966c248SBram Moolenaar
26771966c248SBram Moolenaar  CheckScriptSuccess([
26781966c248SBram Moolenaar      'vim9script',
26791966c248SBram Moolenaar      'syntax clear # comment',
26801966c248SBram Moolenaar      ])
26811966c248SBram Moolenaar  CheckScriptFailure([
26821966c248SBram Moolenaar      'vim9script',
26831966c248SBram Moolenaar      'syntax clear# comment text',
26841966c248SBram Moolenaar      ], 'E28:')
26851966c248SBram Moolenaar  CheckScriptSuccess([
26861966c248SBram Moolenaar      'vim9script',
26871966c248SBram Moolenaar      'syntax keyword Word some',
26881966c248SBram Moolenaar      'syntax clear Word # comment',
26891966c248SBram Moolenaar      ])
26901966c248SBram Moolenaar  CheckScriptFailure([
26911966c248SBram Moolenaar      'vim9script',
26921966c248SBram Moolenaar      'syntax keyword Word some',
26931966c248SBram Moolenaar      'syntax clear Word# comment text',
26941966c248SBram Moolenaar      ], 'E28:')
26951966c248SBram Moolenaar
26961966c248SBram Moolenaar  CheckScriptSuccess([
26971966c248SBram Moolenaar      'vim9script',
26981966c248SBram Moolenaar      'syntax list # comment',
26991966c248SBram Moolenaar      ])
27001966c248SBram Moolenaar  CheckScriptFailure([
27011966c248SBram Moolenaar      'vim9script',
27021966c248SBram Moolenaar      'syntax list# comment text',
27031966c248SBram Moolenaar      ], 'E28:')
27041966c248SBram Moolenaar
27051966c248SBram Moolenaar  CheckScriptSuccess([
27061966c248SBram Moolenaar      'vim9script',
27071966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
27081966c248SBram Moolenaar      ])
27091966c248SBram Moolenaar  CheckScriptFailure([
27101966c248SBram Moolenaar      'vim9script',
27111966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
27121966c248SBram Moolenaar      ], 'E475:')
27131966c248SBram Moolenaar
27141966c248SBram Moolenaar  CheckScriptSuccess([
27151966c248SBram Moolenaar      'vim9script',
27161966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
27171966c248SBram Moolenaar      ])
27181966c248SBram Moolenaar  CheckScriptFailure([
27191966c248SBram Moolenaar      'vim9script',
27201966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
27211966c248SBram Moolenaar      ], 'E789:')
27221966c248SBram Moolenaar
27231966c248SBram Moolenaar  CheckScriptSuccess([
27241966c248SBram Moolenaar      'vim9script',
27251966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
27261966c248SBram Moolenaar      ])
27271966c248SBram Moolenaar  CheckScriptFailure([
27281966c248SBram Moolenaar      'vim9script',
27291966c248SBram Moolenaar      'syntax match Word /pat/# comment',
27301966c248SBram Moolenaar      ], 'E402:')
27311966c248SBram Moolenaar
27321966c248SBram Moolenaar  CheckScriptSuccess([
27331966c248SBram Moolenaar      'vim9script',
27341966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
27351966c248SBram Moolenaar      ])
27361966c248SBram Moolenaar  CheckScriptFailure([
27371966c248SBram Moolenaar      'vim9script',
27381966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
27391966c248SBram Moolenaar      ], 'E475:')
27401966c248SBram Moolenaar  CheckScriptFailure([
27411966c248SBram Moolenaar      'vim9script',
27421966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
27431966c248SBram Moolenaar      ], 'E406:')
27441966c248SBram Moolenaar  CheckScriptFailure([
27451966c248SBram Moolenaar      'vim9script',
27461966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
27471966c248SBram Moolenaar      ], 'E475:')
27481966c248SBram Moolenaar
27491966c248SBram Moolenaar  CheckScriptSuccess([
27501966c248SBram Moolenaar      'vim9script',
27511966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
27521966c248SBram Moolenaar      ])
27531966c248SBram Moolenaar  CheckScriptFailure([
27541966c248SBram Moolenaar      'vim9script',
27551966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2756d032f34aSBram Moolenaar      ], 'E402:')
27571966c248SBram Moolenaar
27581966c248SBram Moolenaar  CheckScriptSuccess([
27591966c248SBram Moolenaar      'vim9script',
27601966c248SBram Moolenaar      'syntax sync # comment',
27611966c248SBram Moolenaar      ])
27621966c248SBram Moolenaar  CheckScriptFailure([
27631966c248SBram Moolenaar      'vim9script',
27641966c248SBram Moolenaar      'syntax sync# comment',
27651966c248SBram Moolenaar      ], 'E404:')
27661966c248SBram Moolenaar  CheckScriptSuccess([
27671966c248SBram Moolenaar      'vim9script',
27681966c248SBram Moolenaar      'syntax sync ccomment # comment',
27691966c248SBram Moolenaar      ])
27701966c248SBram Moolenaar  CheckScriptFailure([
27711966c248SBram Moolenaar      'vim9script',
27721966c248SBram Moolenaar      'syntax sync ccomment# comment',
27731966c248SBram Moolenaar      ], 'E404:')
27741966c248SBram Moolenaar
27751966c248SBram Moolenaar  CheckScriptSuccess([
27761966c248SBram Moolenaar      'vim9script',
27771966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
27781966c248SBram Moolenaar      ])
27791966c248SBram Moolenaar  CheckScriptFailure([
27801966c248SBram Moolenaar      'vim9script',
27811966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
27821966c248SBram Moolenaar      ], 'E475:')
2783a72cfb80SBram Moolenaar
2784a72cfb80SBram Moolenaar  CheckScriptSuccess([
2785a72cfb80SBram Moolenaar      'vim9script',
2786a72cfb80SBram Moolenaar      'command Echo echo # comment',
2787a72cfb80SBram Moolenaar      'command Echo # comment',
27882d870f8dSBram Moolenaar      'delcommand Echo',
2789a72cfb80SBram Moolenaar      ])
2790a72cfb80SBram Moolenaar  CheckScriptFailure([
2791a72cfb80SBram Moolenaar      'vim9script',
2792a72cfb80SBram Moolenaar      'command Echo echo# comment',
2793a72cfb80SBram Moolenaar      'Echo',
2794f8103f27SBram Moolenaar      ], 'E1144:')
27952d870f8dSBram Moolenaar  delcommand Echo
279670249ee8SBram Moolenaar
279770249ee8SBram Moolenaar  var curdir = getcwd()
279870249ee8SBram Moolenaar  CheckScriptSuccess([
279970249ee8SBram Moolenaar      'command Echo cd " comment',
280070249ee8SBram Moolenaar      'Echo',
280170249ee8SBram Moolenaar      'delcommand Echo',
280270249ee8SBram Moolenaar      ])
280370249ee8SBram Moolenaar  CheckScriptSuccess([
2804090728adSBram Moolenaar      'vim9script',
280570249ee8SBram Moolenaar      'command Echo cd # comment',
280670249ee8SBram Moolenaar      'Echo',
280770249ee8SBram Moolenaar      'delcommand Echo',
280870249ee8SBram Moolenaar      ])
280970249ee8SBram Moolenaar  CheckScriptFailure([
281070249ee8SBram Moolenaar      'vim9script',
281170249ee8SBram Moolenaar      'command Echo cd " comment',
281270249ee8SBram Moolenaar      'Echo',
281370249ee8SBram Moolenaar      ], 'E344:')
281470249ee8SBram Moolenaar  delcommand Echo
281570249ee8SBram Moolenaar  chdir(curdir)
281670249ee8SBram Moolenaar
2817a72cfb80SBram Moolenaar  CheckScriptFailure([
2818a72cfb80SBram Moolenaar      'vim9script',
2819a72cfb80SBram Moolenaar      'command Echo# comment',
2820a72cfb80SBram Moolenaar      ], 'E182:')
2821a72cfb80SBram Moolenaar  CheckScriptFailure([
2822a72cfb80SBram Moolenaar      'vim9script',
2823a72cfb80SBram Moolenaar      'command Echo echo',
2824a72cfb80SBram Moolenaar      'command Echo# comment',
2825a72cfb80SBram Moolenaar      ], 'E182:')
28262d870f8dSBram Moolenaar  delcommand Echo
2827a72cfb80SBram Moolenaar
2828a72cfb80SBram Moolenaar  CheckScriptSuccess([
2829a72cfb80SBram Moolenaar      'vim9script',
2830a72cfb80SBram Moolenaar      'function # comment',
2831a72cfb80SBram Moolenaar      ])
2832a72cfb80SBram Moolenaar  CheckScriptFailure([
2833a72cfb80SBram Moolenaar      'vim9script',
28349898107fSBram Moolenaar      'function " comment',
28359898107fSBram Moolenaar      ], 'E129:')
28369898107fSBram Moolenaar  CheckScriptFailure([
28379898107fSBram Moolenaar      'vim9script',
2838a72cfb80SBram Moolenaar      'function# comment',
2839f8103f27SBram Moolenaar      ], 'E1144:')
2840a72cfb80SBram Moolenaar  CheckScriptSuccess([
2841a72cfb80SBram Moolenaar      'vim9script',
2842a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2843a72cfb80SBram Moolenaar      ])
2844a72cfb80SBram Moolenaar  CheckScriptFailure([
2845a72cfb80SBram Moolenaar      'vim9script',
2846a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2847a72cfb80SBram Moolenaar      ], 'E488:')
2848a72cfb80SBram Moolenaar
2849a72cfb80SBram Moolenaar  CheckScriptSuccess([
2850a72cfb80SBram Moolenaar      'vim9script',
28514c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2852a72cfb80SBram Moolenaar      'endfunc',
28534c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2854a72cfb80SBram Moolenaar      ])
2855a72cfb80SBram Moolenaar  CheckScriptFailure([
2856a72cfb80SBram Moolenaar      'vim9script',
28574c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2858a72cfb80SBram Moolenaar      'endfunc',
28594c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2860a72cfb80SBram Moolenaar      ], 'E488:')
2861a72cfb80SBram Moolenaar
2862a72cfb80SBram Moolenaar  CheckScriptSuccess([
2863a72cfb80SBram Moolenaar      'vim9script',
2864a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2865a72cfb80SBram Moolenaar      ])
2866a72cfb80SBram Moolenaar  CheckScriptFailure([
2867a72cfb80SBram Moolenaar      'vim9script',
2868a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2869a72cfb80SBram Moolenaar      ], 'E488:')
2870e7e4838fSBram Moolenaar
2871e7e4838fSBram Moolenaar  CheckScriptFailure([
2872e7e4838fSBram Moolenaar      'def Test() " comment',
2873e7e4838fSBram Moolenaar      'enddef',
2874e7e4838fSBram Moolenaar      ], 'E488:')
2875e7e4838fSBram Moolenaar  CheckScriptFailure([
2876e7e4838fSBram Moolenaar      'vim9script',
2877e7e4838fSBram Moolenaar      'def Test() " comment',
2878e7e4838fSBram Moolenaar      'enddef',
2879e7e4838fSBram Moolenaar      ], 'E488:')
2880e7e4838fSBram Moolenaar
2881e7e4838fSBram Moolenaar  CheckScriptSuccess([
2882e7e4838fSBram Moolenaar      'func Test() " comment',
2883e7e4838fSBram Moolenaar      'endfunc',
28842d870f8dSBram Moolenaar      'delfunc Test',
2885e7e4838fSBram Moolenaar      ])
28869898107fSBram Moolenaar  CheckScriptSuccess([
2887e7e4838fSBram Moolenaar      'vim9script',
2888e7e4838fSBram Moolenaar      'func Test() " comment',
2889e7e4838fSBram Moolenaar      'endfunc',
28909898107fSBram Moolenaar      ])
2891e7e4838fSBram Moolenaar
2892e7e4838fSBram Moolenaar  CheckScriptSuccess([
2893e7e4838fSBram Moolenaar      'def Test() # comment',
2894e7e4838fSBram Moolenaar      'enddef',
2895e7e4838fSBram Moolenaar      ])
2896e7e4838fSBram Moolenaar  CheckScriptFailure([
2897e7e4838fSBram Moolenaar      'func Test() # comment',
2898e7e4838fSBram Moolenaar      'endfunc',
2899e7e4838fSBram Moolenaar      ], 'E488:')
29002c5ed4e3SBram Moolenaarenddef
29012c5ed4e3SBram Moolenaar
29022c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
29032c5ed4e3SBram Moolenaar  CheckCanRunGui
29042c5ed4e3SBram Moolenaar
29052c5ed4e3SBram Moolenaar  CheckScriptFailure([
29062c5ed4e3SBram Moolenaar      'vim9script',
29072c5ed4e3SBram Moolenaar      'gui#comment'
2908f8103f27SBram Moolenaar      ], 'E1144:')
29092c5ed4e3SBram Moolenaar  CheckScriptFailure([
29102c5ed4e3SBram Moolenaar      'vim9script',
29112c5ed4e3SBram Moolenaar      'gui -f#comment'
29122c5ed4e3SBram Moolenaar      ], 'E499:')
29137a092245SBram Moolenaarenddef
29147a092245SBram Moolenaar
2915a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
29166797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
29176797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2918a26b9700SBram Moolenaar
2919a26b9700SBram Moolenaar  edit test.vim
2920a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2921a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2922a26b9700SBram Moolenaar
2923a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2924a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2925a26b9700SBram Moolenaar
2926a26b9700SBram Moolenaar  g:entered = 0
2927a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2928a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2929a26b9700SBram Moolenaar
2930a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2931a26b9700SBram Moolenaar
2932a26b9700SBram Moolenaar  au! TabEnter
2933a26b9700SBram Moolenaar  unlet g:entered
2934d72c1bf0SBram Moolenaar
2935d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2936d72c1bf0SBram Moolenaar      'vim9script',
29376797966dSBram Moolenaar      'g:var = 123',
2938e55b1c09SBram Moolenaar      'b:var = 456',
2939e55b1c09SBram Moolenaar      'w:var = 777',
2940e55b1c09SBram Moolenaar      't:var = 888',
2941d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2942d72c1bf0SBram Moolenaar      ])
2943d72c1bf0SBram Moolenaar
2944d72c1bf0SBram Moolenaar  CheckScriptFailure([
2945d72c1bf0SBram Moolenaar      'vim9script',
2946cfcd011fSBram Moolenaar      'let var = 123',
2947cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2948cfcd011fSBram Moolenaar
2949cfcd011fSBram Moolenaar  CheckScriptFailure([
2950cfcd011fSBram Moolenaar      'vim9script',
2951cfcd011fSBram Moolenaar      'var g:var = 123',
2952e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2953e55b1c09SBram Moolenaar
2954e55b1c09SBram Moolenaar  CheckScriptFailure([
2955e55b1c09SBram Moolenaar      'vim9script',
2956cfcd011fSBram Moolenaar      'var b:var = 123',
2957e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2958e55b1c09SBram Moolenaar
2959e55b1c09SBram Moolenaar  CheckScriptFailure([
2960e55b1c09SBram Moolenaar      'vim9script',
2961cfcd011fSBram Moolenaar      'var w:var = 123',
2962e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2963e55b1c09SBram Moolenaar
2964e55b1c09SBram Moolenaar  CheckScriptFailure([
2965e55b1c09SBram Moolenaar      'vim9script',
2966cfcd011fSBram Moolenaar      'var t:var = 123',
2967e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2968e55b1c09SBram Moolenaar
2969e55b1c09SBram Moolenaar  CheckScriptFailure([
2970e55b1c09SBram Moolenaar      'vim9script',
2971cfcd011fSBram Moolenaar      'var v:version = 123',
2972e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2973e55b1c09SBram Moolenaar
2974e55b1c09SBram Moolenaar  CheckScriptFailure([
2975e55b1c09SBram Moolenaar      'vim9script',
2976cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2977e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
29786797966dSBram Moolenaar
29796797966dSBram Moolenaar  CheckScriptFailure([
29806797966dSBram Moolenaar      'vim9script',
29816797966dSBram Moolenaar      'g:var = 123',
298232e35117SBram Moolenaar      'unlet g:var# comment1',
2983d72c1bf0SBram Moolenaar      ], 'E108:')
2984d72c1bf0SBram Moolenaar
2985d72c1bf0SBram Moolenaar  CheckScriptFailure([
2986d72c1bf0SBram Moolenaar      'let g:var = 123',
2987d72c1bf0SBram Moolenaar      'unlet g:var # something',
2988d72c1bf0SBram Moolenaar      ], 'E488:')
2989faac4104SBram Moolenaar
2990faac4104SBram Moolenaar  CheckScriptSuccess([
2991faac4104SBram Moolenaar      'vim9script',
299232e35117SBram Moolenaar      'if 1 # comment2',
2993faac4104SBram Moolenaar      '  echo "yes"',
2994faac4104SBram Moolenaar      'elseif 2 #comment',
2995faac4104SBram Moolenaar      '  echo "no"',
2996faac4104SBram Moolenaar      'endif',
2997faac4104SBram Moolenaar      ])
2998faac4104SBram Moolenaar
2999faac4104SBram Moolenaar  CheckScriptFailure([
3000faac4104SBram Moolenaar      'vim9script',
300132e35117SBram Moolenaar      'if 1# comment3',
3002faac4104SBram Moolenaar      '  echo "yes"',
3003faac4104SBram Moolenaar      'endif',
3004faac4104SBram Moolenaar      ], 'E15:')
3005faac4104SBram Moolenaar
3006faac4104SBram Moolenaar  CheckScriptFailure([
3007faac4104SBram Moolenaar      'vim9script',
300832e35117SBram Moolenaar      'if 0 # comment4',
3009faac4104SBram Moolenaar      '  echo "yes"',
3010faac4104SBram Moolenaar      'elseif 2#comment',
3011faac4104SBram Moolenaar      '  echo "no"',
3012faac4104SBram Moolenaar      'endif',
3013faac4104SBram Moolenaar      ], 'E15:')
3014faac4104SBram Moolenaar
3015faac4104SBram Moolenaar  CheckScriptSuccess([
3016faac4104SBram Moolenaar      'vim9script',
3017cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3018faac4104SBram Moolenaar      ])
3019faac4104SBram Moolenaar
3020faac4104SBram Moolenaar  CheckScriptFailure([
3021faac4104SBram Moolenaar      'vim9script',
3022cfcd011fSBram Moolenaar      'var v = 1# comment6',
302332e35117SBram Moolenaar      ], 'E15:')
3024faac4104SBram Moolenaar
3025faac4104SBram Moolenaar  CheckScriptSuccess([
3026faac4104SBram Moolenaar      'vim9script',
3027faac4104SBram Moolenaar      'new'
3028d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3029df069eecSBram Moolenaar      ':$',
3030faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3031faac4104SBram Moolenaar      'bwipe!',
3032faac4104SBram Moolenaar      ])
3033faac4104SBram Moolenaar
3034f5be8cdbSBram Moolenaar  CheckScriptFailure([
3035f5be8cdbSBram Moolenaar      'vim9script',
3036f5be8cdbSBram Moolenaar      'new'
3037d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3038f5be8cdbSBram Moolenaar      ':$',
3039f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3040f5be8cdbSBram Moolenaar      'bwipe!',
3041f5be8cdbSBram Moolenaar      ], 'E488:')
3042f5be8cdbSBram Moolenaar
3043f5be8cdbSBram Moolenaar  CheckScriptFailure([
3044f5be8cdbSBram Moolenaar      'vim9script',
3045f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3046f5be8cdbSBram Moolenaar      ], 'E477:')
3047a26b9700SBram Moolenaarenddef
3048a26b9700SBram Moolenaar
30497e5bd91dSBram Moolenaardef Test_finish()
3050cfcd011fSBram Moolenaar  var lines =<< trim END
30517e5bd91dSBram Moolenaar    vim9script
30526797966dSBram Moolenaar    g:res = 'one'
30537e5bd91dSBram Moolenaar    if v:false | finish | endif
30546797966dSBram Moolenaar    g:res = 'two'
30557e5bd91dSBram Moolenaar    finish
30566797966dSBram Moolenaar    g:res = 'three'
30577e5bd91dSBram Moolenaar  END
30587e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
30597e5bd91dSBram Moolenaar  source Xfinished
30607e5bd91dSBram Moolenaar  assert_equal('two', g:res)
30617e5bd91dSBram Moolenaar
30627e5bd91dSBram Moolenaar  unlet g:res
30637e5bd91dSBram Moolenaar  delete('Xfinished')
30647e5bd91dSBram Moolenaarenddef
30657e5bd91dSBram Moolenaar
3066a5d0077eSBram Moolenaardef Test_forward_declaration()
3067cfcd011fSBram Moolenaar  var lines =<< trim END
3068a5d0077eSBram Moolenaar    vim9script
3069a5d0077eSBram Moolenaar    def GetValue(): string
3070a5d0077eSBram Moolenaar      return theVal
3071a5d0077eSBram Moolenaar    enddef
3072cfcd011fSBram Moolenaar    var theVal = 'something'
3073822ba247SBram Moolenaar    g:initVal = GetValue()
3074a5d0077eSBram Moolenaar    theVal = 'else'
3075a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3076a5d0077eSBram Moolenaar  END
3077a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3078a5d0077eSBram Moolenaar  source Xforward
3079a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3080a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3081a5d0077eSBram Moolenaar
3082a5d0077eSBram Moolenaar  unlet g:initVal
3083a5d0077eSBram Moolenaar  unlet g:laterVal
3084a5d0077eSBram Moolenaar  delete('Xforward')
3085a5d0077eSBram Moolenaarenddef
3086a5d0077eSBram Moolenaar
30879721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3088a6294955SBram Moolenaar  var vim9_lines =<< trim END
3089a6294955SBram Moolenaar    vim9script
3090a6294955SBram Moolenaar    var local = 'local'
3091a6294955SBram Moolenaar    g:global = 'global'
3092a6294955SBram Moolenaar    export var exported = 'exported'
3093a6294955SBram Moolenaar    export def GetText(): string
3094a6294955SBram Moolenaar       return 'text'
3095a6294955SBram Moolenaar    enddef
3096a6294955SBram Moolenaar  END
3097a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3098a6294955SBram Moolenaar
3099cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
31009721fb4eSBram Moolenaar    source Xvim9_script.vim
31019721fb4eSBram Moolenaar
31029721fb4eSBram Moolenaar    call assert_false(exists('local'))
31039721fb4eSBram Moolenaar    call assert_false(exists('exported'))
31049721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
31059721fb4eSBram Moolenaar    call assert_equal('global', global)
31069721fb4eSBram Moolenaar    call assert_equal('global', g:global)
31079721fb4eSBram Moolenaar
31089721fb4eSBram Moolenaar    " imported variable becomes script-local
31099721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
31109721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
31119721fb4eSBram Moolenaar    call assert_false(exists('exported'))
31129721fb4eSBram Moolenaar
31139721fb4eSBram Moolenaar    " imported function becomes script-local
31149721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
31159721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
31169721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
31179721fb4eSBram Moolenaar  END
31189721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
31199721fb4eSBram Moolenaar
31209721fb4eSBram Moolenaar  source Xlegacy_script.vim
31219721fb4eSBram Moolenaar  assert_equal('global', g:global)
3122f5be8cdbSBram Moolenaar  unlet g:global
31239721fb4eSBram Moolenaar
31249721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
31259721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
31269721fb4eSBram Moolenaarenddef
3127a5d0077eSBram Moolenaar
31287d699701SBram Moolenaarfunc Test_vim9script_not_global()
31297d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
31307d699701SBram Moolenaar  let vim9lines =<< trim END
31317d699701SBram Moolenaar    vim9script
3132cfcd011fSBram Moolenaar    var name = 'local'
31337d699701SBram Moolenaar    func TheFunc()
31347d699701SBram Moolenaar      echo 'local'
31357d699701SBram Moolenaar    endfunc
31367d699701SBram Moolenaar    def DefFunc()
31377d699701SBram Moolenaar      echo 'local'
31387d699701SBram Moolenaar    enddef
31397d699701SBram Moolenaar  END
31407d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
31417d699701SBram Moolenaar  source Xvim9script.vim
31427d699701SBram Moolenaar  try
31437d699701SBram Moolenaar    echo g:var
31447d699701SBram Moolenaar    assert_report('did not fail')
31457d699701SBram Moolenaar  catch /E121:/
31467d699701SBram Moolenaar    " caught
31477d699701SBram Moolenaar  endtry
31487d699701SBram Moolenaar  try
31497d699701SBram Moolenaar    call TheFunc()
31507d699701SBram Moolenaar    assert_report('did not fail')
31517d699701SBram Moolenaar  catch /E117:/
31527d699701SBram Moolenaar    " caught
31537d699701SBram Moolenaar  endtry
31547d699701SBram Moolenaar  try
31557d699701SBram Moolenaar    call DefFunc()
31567d699701SBram Moolenaar    assert_report('did not fail')
31577d699701SBram Moolenaar  catch /E117:/
31587d699701SBram Moolenaar    " caught
31597d699701SBram Moolenaar  endtry
31607d699701SBram Moolenaar
316125859dd7SBram Moolenaar  call delete('Xvim9script.vim')
31627d699701SBram Moolenaarendfunc
31637d699701SBram Moolenaar
3164eeb27bfeSBram Moolenaardef Test_vim9_copen()
3165eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3166eeb27bfeSBram Moolenaar  copen
3167eeb27bfeSBram Moolenaar  quit
3168eeb27bfeSBram Moolenaarenddef
3169eeb27bfeSBram Moolenaar
317003290b84SBram Moolenaar" test using an auto-loaded function and variable
31712d6b20d6SBram Moolenaardef Test_vim9_autoload()
3172cfcd011fSBram Moolenaar  var lines =<< trim END
31732d6b20d6SBram Moolenaar     vim9script
317403290b84SBram Moolenaar     def some#gettest(): string
317503290b84SBram Moolenaar       return 'test'
317603290b84SBram Moolenaar     enddef
317703290b84SBram Moolenaar     g:some#name = 'name'
3178e3ffcd99SBram Moolenaar
3179e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3180e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3181e3ffcd99SBram Moolenaar     enddef
318203290b84SBram Moolenaar  END
318303290b84SBram Moolenaar
318403290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
318503290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
318603290b84SBram Moolenaar  var save_rtp = &rtp
318703290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
318803290b84SBram Moolenaar
318903290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
319003290b84SBram Moolenaar  assert_equal('name', g:some#name)
319103290b84SBram Moolenaar  g:some#other = 'other'
319203290b84SBram Moolenaar  assert_equal('other', g:some#other)
319303290b84SBram Moolenaar
3194e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3195e3ffcd99SBram Moolenaar
319617f700acSBram Moolenaar  # upper case script name works
319717f700acSBram Moolenaar  lines =<< trim END
319817f700acSBram Moolenaar     vim9script
319917f700acSBram Moolenaar     def Other#getOther(): string
320017f700acSBram Moolenaar       return 'other'
320117f700acSBram Moolenaar     enddef
320217f700acSBram Moolenaar  END
320317f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
320417f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
320517f700acSBram Moolenaar
320603290b84SBram Moolenaar  delete('Xdir', 'rf')
320703290b84SBram Moolenaar  &rtp = save_rtp
320803290b84SBram Moolenaarenddef
320903290b84SBram Moolenaar
321003290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
321103290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
321203290b84SBram Moolenaar  var lines =<< trim END
321303290b84SBram Moolenaar     vim9script
32142d6b20d6SBram Moolenaar     def foo#test()
32152d6b20d6SBram Moolenaar         echomsg getreg('"')
32162d6b20d6SBram Moolenaar     enddef
32172d6b20d6SBram Moolenaar  END
32182d6b20d6SBram Moolenaar
32192d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
32202d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3221cfcd011fSBram Moolenaar  var save_rtp = &rtp
32222d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
32232d6b20d6SBram Moolenaar  augroup test
32242d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
32252d6b20d6SBram Moolenaar  augroup END
32262d6b20d6SBram Moolenaar
32272d6b20d6SBram Moolenaar  normal Y
32282d6b20d6SBram Moolenaar
32292d6b20d6SBram Moolenaar  augroup test
32302d6b20d6SBram Moolenaar    autocmd!
32312d6b20d6SBram Moolenaar  augroup END
32322d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
32332d6b20d6SBram Moolenaar  &rtp = save_rtp
32342d6b20d6SBram Moolenaarenddef
32352d6b20d6SBram Moolenaar
323677e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
323777e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3238cfcd011fSBram Moolenaar  var lines =<< trim END
323977e5dcc3SBram Moolenaar      vim9script
324077e5dcc3SBram Moolenaar      def crash#func()
324177e5dcc3SBram Moolenaar          try
324277e5dcc3SBram Moolenaar              for x in List()
324377e5dcc3SBram Moolenaar              endfor
324477e5dcc3SBram Moolenaar          catch
324577e5dcc3SBram Moolenaar          endtry
324677e5dcc3SBram Moolenaar          g:ok = true
324777e5dcc3SBram Moolenaar      enddef
324877e5dcc3SBram Moolenaar      fu List()
324977e5dcc3SBram Moolenaar          invalid
325077e5dcc3SBram Moolenaar      endfu
325177e5dcc3SBram Moolenaar      try
325248e11c10SBram Moolenaar          alsoinvalid
325377e5dcc3SBram Moolenaar      catch /wontmatch/
325477e5dcc3SBram Moolenaar      endtry
325577e5dcc3SBram Moolenaar  END
325677e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
325777e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
325877e5dcc3SBram Moolenaar
325977e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
326077e5dcc3SBram Moolenaar  lines =<< trim END
326177e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
326277e5dcc3SBram Moolenaar    call crash#func()
326377e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
32649c4f5520SBram Moolenaar    qall!
326577e5dcc3SBram Moolenaar  END
326677e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
326777e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
326877e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
326977e5dcc3SBram Moolenaar
327077e5dcc3SBram Moolenaar  delete('Xdidit')
327177e5dcc3SBram Moolenaar  delete('Xscript')
327277e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
327303290b84SBram Moolenaar
327403290b84SBram Moolenaar  lines =<< trim END
327503290b84SBram Moolenaar    vim9script
327603290b84SBram Moolenaar    var foo#bar = 'asdf'
327703290b84SBram Moolenaar  END
327803290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
327977e5dcc3SBram Moolenaarenddef
328077e5dcc3SBram Moolenaar
328181e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
328281e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
328381e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3284cfcd011fSBram Moolenaar  var lines =<< trim END
328581e17fbeSBram Moolenaar    let s:counter = 1
328681e17fbeSBram Moolenaar    def s:Func()
328781e17fbeSBram Moolenaar      au! CursorHold
328881e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
328981e17fbeSBram Moolenaar    enddef
329081e17fbeSBram Moolenaar    call s:Func()
329181e17fbeSBram Moolenaar    doau CursorHold
329281e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
329381e17fbeSBram Moolenaar    au! CursorHold
329481e17fbeSBram Moolenaar  END
329581e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
329681e17fbeSBram Moolenaarenddef
329781e17fbeSBram Moolenaar
32983896a105SBram Moolenaardef Test_cmdline_win()
32993896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
33003896a105SBram Moolenaar  # the command line window.
33013896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3302cfcd011fSBram Moolenaar  var export_lines =<< trim END
33033896a105SBram Moolenaar    vim9script
3304cfcd011fSBram Moolenaar    export var That = 'yes'
33053896a105SBram Moolenaar  END
33063896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3307cfcd011fSBram Moolenaar  var import_lines =<< trim END
33083896a105SBram Moolenaar    vim9script
33093896a105SBram Moolenaar    import That from './Xexport.vim'
33103896a105SBram Moolenaar  END
33113896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3312cfcd011fSBram Moolenaar  var save_rtp = &rtp
33133896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
33143896a105SBram Moolenaar  syntax on
33153896a105SBram Moolenaar  augroup CmdWin
33163896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
33173896a105SBram Moolenaar  augroup END
33183896a105SBram Moolenaar  # this will open and also close the cmdline window
33193896a105SBram Moolenaar  feedkeys('q:', 'xt')
33203896a105SBram Moolenaar  assert_equal('yes', g:got_there)
33213896a105SBram Moolenaar
33223896a105SBram Moolenaar  augroup CmdWin
33233896a105SBram Moolenaar    au!
33243896a105SBram Moolenaar  augroup END
33253896a105SBram Moolenaar  &rtp = save_rtp
33263896a105SBram Moolenaar  delete('rtp', 'rf')
33273896a105SBram Moolenaarenddef
33283896a105SBram Moolenaar
3329e3d4685fSBram Moolenaardef Test_invalid_sid()
3330e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
333125859dd7SBram Moolenaar
33329c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3333d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3334e3d4685fSBram Moolenaar  endif
3335e3d4685fSBram Moolenaar  delete('Xdidit')
3336e3d4685fSBram Moolenaarenddef
3337e3d4685fSBram Moolenaar
33389ec7026fSBram Moolenaardef Test_restoring_cpo()
33399ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
33409ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
33419ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
33429ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
33439ec7026fSBram Moolenaar  endif
33449ec7026fSBram Moolenaar  delete('Xsourced')
33459ec7026fSBram Moolenaar  delete('Xclose')
3346090728adSBram Moolenaar  delete('Xdone')
33470123cc1eSBram Moolenaar
33480123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
33490123cc1eSBram Moolenaar  set cpo=aABceFsMny>
33500123cc1eSBram Moolenaar  edit XanotherScript
33510123cc1eSBram Moolenaar  so %
33520123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
33530123cc1eSBram Moolenaar  :1del
33540123cc1eSBram Moolenaar  w
33550123cc1eSBram Moolenaar  so %
33560123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
33570123cc1eSBram Moolenaar
33580123cc1eSBram Moolenaar  delete('XanotherScript')
33590123cc1eSBram Moolenaar  set cpo&vim
33609ec7026fSBram Moolenaarenddef
33619ec7026fSBram Moolenaar
3362ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3363ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
336437294bd6SBram Moolenaar  CheckScreendump
3365ffb7dcdbSBram Moolenaar  CheckFeature timers
336637294bd6SBram Moolenaar
3367ffb7dcdbSBram Moolenaar  let lines =<< trim END
336837294bd6SBram Moolenaar    vim9script
336937294bd6SBram Moolenaar    def script#func()
337037294bd6SBram Moolenaar    enddef
337137294bd6SBram Moolenaar  END
3372ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3373ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
337437294bd6SBram Moolenaar
3375ffb7dcdbSBram Moolenaar  let lines =<< trim END
337637294bd6SBram Moolenaar      vim9script
337737294bd6SBram Moolenaar      set cpo+=M
337837294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
337937294bd6SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, () => script#func())
338037294bd6SBram Moolenaar      setline(1, 'some text')
338137294bd6SBram Moolenaar  END
3382ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3383ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3384ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3385ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
338637294bd6SBram Moolenaar
3387ffb7dcdbSBram Moolenaar  " clean up
3388ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3389ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3390ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3391ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3392ffb7dcdbSBram Moolenaarendfunc
339337294bd6SBram Moolenaar
33949ec7026fSBram Moolenaar
3395f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3396cfcd011fSBram Moolenaar  var lines =<< trim END
3397cfcd011fSBram Moolenaar    var name: any
3398cfcd011fSBram Moolenaar    assert_equal(0, name)
3399f0afd9e1SBram Moolenaar  END
3400f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3401f0afd9e1SBram Moolenaarenddef
3402f0afd9e1SBram Moolenaar
34037e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
340458dbef33SBram Moolenaar  CheckRunVimInTerminal
340558dbef33SBram Moolenaar
34067e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
34077e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
34087e9210eaSBram Moolenaarendfunc
34097e9210eaSBram Moolenaar
34107e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
34119c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3412cfcd011fSBram Moolenaar  var lines =<< trim END
34139c4f5520SBram Moolenaar    func CheckAndQuit()
34149c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
34159c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
34169c4f5520SBram Moolenaar    endfunc
34179c4f5520SBram Moolenaar  END
34189c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
34199c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3420e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
34219c4f5520SBram Moolenaar  # define Afunc() on the command line
34229c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
34239c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
34242949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
34259c4f5520SBram Moolenaar
34269c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
34279c4f5520SBram Moolenaar  delete('XcallFunc')
34289c4f5520SBram Moolenaar  delete('Xdidcmd')
34299c4f5520SBram Moolenaarenddef
34309c4f5520SBram Moolenaar
3431fcdc5d83SBram Moolenaardef Test_script_var_scope()
3432fcdc5d83SBram Moolenaar  var lines =<< trim END
3433fcdc5d83SBram Moolenaar      vim9script
3434fcdc5d83SBram Moolenaar      if true
3435fcdc5d83SBram Moolenaar        if true
3436fcdc5d83SBram Moolenaar          var one = 'one'
3437fcdc5d83SBram Moolenaar          echo one
3438fcdc5d83SBram Moolenaar        endif
3439fcdc5d83SBram Moolenaar        echo one
3440fcdc5d83SBram Moolenaar      endif
3441fcdc5d83SBram Moolenaar  END
3442fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3443fcdc5d83SBram Moolenaar
3444fcdc5d83SBram Moolenaar  lines =<< trim END
3445fcdc5d83SBram Moolenaar      vim9script
3446fcdc5d83SBram Moolenaar      if true
3447fcdc5d83SBram Moolenaar        if false
3448fcdc5d83SBram Moolenaar          var one = 'one'
3449fcdc5d83SBram Moolenaar          echo one
3450fcdc5d83SBram Moolenaar        else
3451fcdc5d83SBram Moolenaar          var one = 'one'
3452fcdc5d83SBram Moolenaar          echo one
3453fcdc5d83SBram Moolenaar        endif
3454fcdc5d83SBram Moolenaar        echo one
3455fcdc5d83SBram Moolenaar      endif
3456fcdc5d83SBram Moolenaar  END
3457fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3458fcdc5d83SBram Moolenaar
3459fcdc5d83SBram Moolenaar  lines =<< trim END
3460fcdc5d83SBram Moolenaar      vim9script
3461fcdc5d83SBram Moolenaar      while true
3462fcdc5d83SBram Moolenaar        var one = 'one'
3463fcdc5d83SBram Moolenaar        echo one
3464fcdc5d83SBram Moolenaar        break
3465fcdc5d83SBram Moolenaar      endwhile
3466fcdc5d83SBram Moolenaar      echo one
3467fcdc5d83SBram Moolenaar  END
3468fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3469fcdc5d83SBram Moolenaar
3470fcdc5d83SBram Moolenaar  lines =<< trim END
3471fcdc5d83SBram Moolenaar      vim9script
3472fcdc5d83SBram Moolenaar      for i in range(1)
3473fcdc5d83SBram Moolenaar        var one = 'one'
3474fcdc5d83SBram Moolenaar        echo one
3475fcdc5d83SBram Moolenaar      endfor
3476fcdc5d83SBram Moolenaar      echo one
3477fcdc5d83SBram Moolenaar  END
3478fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
34799becdf2bSBram Moolenaar
34809becdf2bSBram Moolenaar  lines =<< trim END
34819becdf2bSBram Moolenaar      vim9script
34829becdf2bSBram Moolenaar      {
34839becdf2bSBram Moolenaar        var one = 'one'
34849becdf2bSBram Moolenaar        assert_equal('one', one)
34859becdf2bSBram Moolenaar      }
34869becdf2bSBram Moolenaar      assert_false(exists('one'))
34879becdf2bSBram Moolenaar      assert_false(exists('s:one'))
34889becdf2bSBram Moolenaar  END
34899becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
34909becdf2bSBram Moolenaar
34919becdf2bSBram Moolenaar  lines =<< trim END
34929becdf2bSBram Moolenaar      vim9script
34939becdf2bSBram Moolenaar      {
34949becdf2bSBram Moolenaar        var one = 'one'
34959becdf2bSBram Moolenaar        echo one
34969becdf2bSBram Moolenaar      }
34979becdf2bSBram Moolenaar      echo one
34989becdf2bSBram Moolenaar  END
34999becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3500fcdc5d83SBram Moolenaarenddef
3501fcdc5d83SBram Moolenaar
3502352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3503352134bbSBram Moolenaar  var lines =<< trim END
3504352134bbSBram Moolenaar    vim9script
3505352134bbSBram Moolenaar    def Callback(...l: any)
3506352134bbSBram Moolenaar      try
3507352134bbSBram Moolenaar        var x: string
3508352134bbSBram Moolenaar        var y: string
3509352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3510352134bbSBram Moolenaar        [x, y] = ['']
3511352134bbSBram Moolenaar      catch
3512352134bbSBram Moolenaar        g:caught = 'yes'
3513352134bbSBram Moolenaar      endtry
3514352134bbSBram Moolenaar    enddef
3515e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3516352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3517352134bbSBram Moolenaar  END
3518352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3519352134bbSBram Moolenaar
3520352134bbSBram Moolenaar  unlet g:caught
3521352134bbSBram Moolenaarenddef
3522352134bbSBram Moolenaar
3523631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3524631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3525631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3526631e8f93SBram Moolenaar  endif
3527631e8f93SBram Moolenaar  var lines =<< trim END
3528631e8f93SBram Moolenaar      vim9script
3529631e8f93SBram Moolenaar      var source: list<number>
3530631e8f93SBram Moolenaar      def Out_cb(...l: any)
3531631e8f93SBram Moolenaar          eval [][0]
3532631e8f93SBram Moolenaar      enddef
3533631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3534631e8f93SBram Moolenaar          sleep 1m
3535631e8f93SBram Moolenaar          source += l
3536631e8f93SBram Moolenaar      enddef
3537e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
35386f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
35396f17a3f0SBram Moolenaar        sleep 10m
35406f17a3f0SBram Moolenaar      endwhile
3541206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3542206c2a6eSBram Moolenaar      sleep 100m
3543631e8f93SBram Moolenaar  END
3544631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3545631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3546631e8f93SBram Moolenaar  delete('Xdef')
3547631e8f93SBram Moolenaarenddef
3548631e8f93SBram Moolenaar
35494324d87aSBram Moolenaardef InvokeNormal()
35504324d87aSBram Moolenaar  exe "norm! :m+1\r"
35514324d87aSBram Moolenaarenddef
35524324d87aSBram Moolenaar
35534324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
35544324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
35554324d87aSBram Moolenaar  new
35564324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
35574324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
35584324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
35594324d87aSBram Moolenaar  xunmap <F3>
3560b5b9480eSBram Moolenaarenddef
3561b5b9480eSBram Moolenaar
3562b5b9480eSBram Moolenaardef Test_white_space_after_command()
3563b5b9480eSBram Moolenaar  var lines =<< trim END
3564b5b9480eSBram Moolenaar    exit_cb: Func})
3565b5b9480eSBram Moolenaar  END
3566b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3567f8103f27SBram Moolenaar
3568f8103f27SBram Moolenaar  lines =<< trim END
3569f8103f27SBram Moolenaar    e#
3570f8103f27SBram Moolenaar  END
3571f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
35724324d87aSBram Moolenaarenddef
35734324d87aSBram Moolenaar
35744aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
35754aab88d9SBram Moolenaar  var lines =<< trim END
35764aab88d9SBram Moolenaar      vim9script
35774aab88d9SBram Moolenaar      if exists('g:guard')
35784aab88d9SBram Moolenaar        finish
35794aab88d9SBram Moolenaar      endif
35804aab88d9SBram Moolenaar      g:guard = 1
35814aab88d9SBram Moolenaar      var name = 'thename'
35824aab88d9SBram Moolenaar      def g:GetName(): string
35834aab88d9SBram Moolenaar        return name
35844aab88d9SBram Moolenaar      enddef
35854aab88d9SBram Moolenaar      def g:SetName(arg: string)
35864aab88d9SBram Moolenaar        name = arg
35874aab88d9SBram Moolenaar      enddef
35884aab88d9SBram Moolenaar  END
35894aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
35904aab88d9SBram Moolenaar  so XscriptTwice.vim
35914aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
35924aab88d9SBram Moolenaar  g:SetName('newname')
35934aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
35944aab88d9SBram Moolenaar  so XscriptTwice.vim
35954aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
35964aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
35974aab88d9SBram Moolenaar
35984aab88d9SBram Moolenaar  delfunc g:GetName
35994aab88d9SBram Moolenaar  delfunc g:SetName
36004aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
36014aab88d9SBram Moolenaar  unlet g:guard
36024aab88d9SBram Moolenaarenddef
36034aab88d9SBram Moolenaar
36044aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
36054aab88d9SBram Moolenaar  var exportlines =<< trim END
36064aab88d9SBram Moolenaar      vim9script
36074aab88d9SBram Moolenaar      if exists('g:guard')
36084aab88d9SBram Moolenaar        finish
36094aab88d9SBram Moolenaar      endif
36104aab88d9SBram Moolenaar      g:guard = 1
36114aab88d9SBram Moolenaar      export var name = 'someName'
36124aab88d9SBram Moolenaar  END
36134aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
36144aab88d9SBram Moolenaar
36154aab88d9SBram Moolenaar  var lines =<< trim END
36164aab88d9SBram Moolenaar      vim9script
36174aab88d9SBram Moolenaar      import name from './XexportScript.vim'
36184aab88d9SBram Moolenaar      def g:GetName(): string
36194aab88d9SBram Moolenaar        return name
36204aab88d9SBram Moolenaar      enddef
36214aab88d9SBram Moolenaar  END
36224aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
36234aab88d9SBram Moolenaar  so XscriptImport.vim
36244aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
36254aab88d9SBram Moolenaar
36264aab88d9SBram Moolenaar  so XexportScript.vim
36274aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
36284aab88d9SBram Moolenaar
36294aab88d9SBram Moolenaar  delfunc g:GetName
36304aab88d9SBram Moolenaar  delete('XexportScript.vim')
36314aab88d9SBram Moolenaar  delete('XscriptImport.vim')
36324aab88d9SBram Moolenaar  unlet g:guard
36334aab88d9SBram Moolenaarenddef
36344aab88d9SBram Moolenaar
363510b9421fSBram Moolenaardef Test_unsupported_commands()
363610b9421fSBram Moolenaar  var lines =<< trim END
363710b9421fSBram Moolenaar      ka
363810b9421fSBram Moolenaar  END
363910b9421fSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1100:')
364010b9421fSBram Moolenaar
364110b9421fSBram Moolenaar  lines =<< trim END
3642ada1d870SBram Moolenaar      :1ka
3643ada1d870SBram Moolenaar  END
3644ada1d870SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E481:')
3645ada1d870SBram Moolenaar
3646ada1d870SBram Moolenaar  lines =<< trim END
364710b9421fSBram Moolenaar    t
364810b9421fSBram Moolenaar  END
364910b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
365010b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
365110b9421fSBram Moolenaar
365210b9421fSBram Moolenaar  lines =<< trim END
365310b9421fSBram Moolenaar    x
365410b9421fSBram Moolenaar  END
365510b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
365610b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
365710b9421fSBram Moolenaar
365810b9421fSBram Moolenaar  lines =<< trim END
365910b9421fSBram Moolenaar    xit
366010b9421fSBram Moolenaar  END
366110b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
366210b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
366310b9421fSBram Moolenaarenddef
366410b9421fSBram Moolenaar
3665585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3666585fea7bSBram Moolenaardef Test_substitute_cmd()
3667585fea7bSBram Moolenaar  new
3668585fea7bSBram Moolenaar  setline(1, 'something')
3669585fea7bSBram Moolenaar  :substitute(some(other(
3670585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3671585fea7bSBram Moolenaar  bwipe!
3672585fea7bSBram Moolenaar
3673f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3674cfcd011fSBram Moolenaar  var lines =<< trim END
3675585fea7bSBram Moolenaar    vim9script
3676585fea7bSBram Moolenaar    new
3677585fea7bSBram Moolenaar    setline(1, 'something')
3678585fea7bSBram Moolenaar    :substitute(some(other(
3679585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3680585fea7bSBram Moolenaar    bwipe!
3681585fea7bSBram Moolenaar  END
3682585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3683585fea7bSBram Moolenaar  source Xvim9lines
3684585fea7bSBram Moolenaar
3685585fea7bSBram Moolenaar  delete('Xvim9lines')
3686585fea7bSBram Moolenaarenddef
3687585fea7bSBram Moolenaar
36888a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3689