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()
1034f2d5c240SBram Moolenaar      g:imported = Export.exported
1035f2d5c240SBram Moolenaar    enddef
1036f2d5c240SBram Moolenaar    UseExport()
1037f2d5c240SBram Moolenaar  END
1038f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1039f2d5c240SBram Moolenaar  source Ximport.vim
10405381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1041f2d5c240SBram Moolenaar
1042cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1043599c89c8SBram Moolenaar    vim9script
1044599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1045599c89c8SBram Moolenaar    def Func()
1046cfcd011fSBram Moolenaar      var dummy = 1
1047cfcd011fSBram Moolenaar      var imported = Export + dummy
1048599c89c8SBram Moolenaar    enddef
1049822ba247SBram Moolenaar    defcompile
1050599c89c8SBram Moolenaar  END
1051599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
105244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1053599c89c8SBram Moolenaar
1054cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1055599c89c8SBram Moolenaar    vim9script
1056599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1057599c89c8SBram Moolenaar    def Func()
1058cfcd011fSBram Moolenaar      var imported = Export . exported
1059599c89c8SBram Moolenaar    enddef
1060822ba247SBram Moolenaar    defcompile
1061599c89c8SBram Moolenaar  END
1062599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
106344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1064599c89c8SBram Moolenaar
1065a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1066a6294955SBram Moolenaar    vim9script
1067a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1068a6294955SBram Moolenaar    var some = 'other'
1069a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1070a6294955SBram Moolenaar    defcompile
1071a6294955SBram Moolenaar  END
1072a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1073a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1074a6294955SBram Moolenaar
1075cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1076599c89c8SBram Moolenaar    vim9script
1077599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1078599c89c8SBram Moolenaar    def Func()
1079cfcd011fSBram Moolenaar      var imported = Export.
1080599c89c8SBram Moolenaar    enddef
1081822ba247SBram Moolenaar    defcompile
1082599c89c8SBram Moolenaar  END
1083599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
108444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1085599c89c8SBram Moolenaar
1086cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
10871c991144SBram Moolenaar    vim9script
10881c991144SBram Moolenaar    import *
10891c991144SBram Moolenaar        as Export
10901c991144SBram Moolenaar        from
10911c991144SBram Moolenaar        './Xexport.vim'
10921c991144SBram Moolenaar    def UseExport()
10931c991144SBram Moolenaar      g:imported = Export.exported
10941c991144SBram Moolenaar    enddef
10951c991144SBram Moolenaar    UseExport()
10961c991144SBram Moolenaar  END
10971c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
10981c991144SBram Moolenaar  source Ximport.vim
10991c991144SBram Moolenaar  assert_equal(9883, g:imported)
11001c991144SBram Moolenaar
1101cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1102f2d5c240SBram Moolenaar    vim9script
1103f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1104f2d5c240SBram Moolenaar  END
1105f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
110644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1107f2d5c240SBram Moolenaar
1108f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1109cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1110fa29c8abSBram Moolenaar    vim9script
1111fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1112fa29c8abSBram Moolenaar  END
1113fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
111444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1115fa29c8abSBram Moolenaar
1116f5be8cdbSBram Moolenaar  # try to import something that is already defined
1117cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
11185269bd2aSBram Moolenaar    vim9script
1119cfcd011fSBram Moolenaar    var exported = 'something'
11205269bd2aSBram Moolenaar    import exported from './Xexport.vim'
11215269bd2aSBram Moolenaar  END
11225269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1123057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11245269bd2aSBram Moolenaar
1125f5be8cdbSBram Moolenaar  # try to import something that is already defined
11265269bd2aSBram Moolenaar  import_already_defined =<< trim END
11275269bd2aSBram Moolenaar    vim9script
1128cfcd011fSBram Moolenaar    var exported = 'something'
11295269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
11305269bd2aSBram Moolenaar  END
11315269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1132057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11335269bd2aSBram Moolenaar
1134f5be8cdbSBram Moolenaar  # try to import something that is already defined
11355269bd2aSBram Moolenaar  import_already_defined =<< trim END
11365269bd2aSBram Moolenaar    vim9script
1137cfcd011fSBram Moolenaar    var exported = 'something'
11385269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
11395269bd2aSBram Moolenaar  END
11405269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1141057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11425269bd2aSBram Moolenaar
1143918a4249SBram Moolenaar  # try changing an imported const
1144918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1145918a4249SBram Moolenaar    vim9script
1146918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1147918a4249SBram Moolenaar    def Assign()
1148918a4249SBram Moolenaar      CONST = 987
1149918a4249SBram Moolenaar    enddef
1150918a4249SBram Moolenaar    defcompile
1151918a4249SBram Moolenaar  END
1152918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1153918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1154918a4249SBram Moolenaar
11550f2a5cc6SBram Moolenaar  # try changing an imported final
11560f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
11570f2a5cc6SBram Moolenaar    vim9script
11580f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
11590f2a5cc6SBram Moolenaar    def Assign()
11600f2a5cc6SBram Moolenaar      theList = [2]
11610f2a5cc6SBram Moolenaar    enddef
11620f2a5cc6SBram Moolenaar    defcompile
11630f2a5cc6SBram Moolenaar  END
11640f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
11650f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
11660f2a5cc6SBram Moolenaar
1167f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1168cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1169fa29c8abSBram Moolenaar    vim9script
1170fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1171fa29c8abSBram Moolenaar  END
1172fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
117344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1174fa29c8abSBram Moolenaar
1175cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1176fa29c8abSBram Moolenaar    vim9script
1177fa29c8abSBram Moolenaar    import name './Xexport.vim'
1178fa29c8abSBram Moolenaar  END
1179fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
118044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1181fa29c8abSBram Moolenaar
1182cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1183fa29c8abSBram Moolenaar    vim9script
1184fa29c8abSBram Moolenaar    import name from Xexport.vim
1185fa29c8abSBram Moolenaar  END
1186fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
118744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1188fa29c8abSBram Moolenaar
1189cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1190fa29c8abSBram Moolenaar    vim9script
1191fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1192fa29c8abSBram Moolenaar  END
1193fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
119444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1195fa29c8abSBram Moolenaar
1196cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1197fa29c8abSBram Moolenaar    vim9script
1198fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1199fa29c8abSBram Moolenaar  END
12005269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
120144d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1202fa29c8abSBram Moolenaar
1203f2d5c240SBram Moolenaar  delete('Ximport.vim')
12045269bd2aSBram Moolenaar  delete('Ximport3.vim')
12058a7d6542SBram Moolenaar  delete('Xexport.vim')
12068a7d6542SBram Moolenaar
1207f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1208750802b5SBram Moolenaar  set cpo&vi
1209cfcd011fSBram Moolenaar  var cpo_before = &cpo
1210cfcd011fSBram Moolenaar  var lines =<< trim END
1211750802b5SBram Moolenaar    vim9script
1212750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1213750802b5SBram Moolenaar  END
1214750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1215750802b5SBram Moolenaar  source Xvim9_script
1216750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1217750802b5SBram Moolenaar  set cpo&vim
1218750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1219750802b5SBram Moolenaar  delete('Xvim9_script')
1220750802b5SBram Moolenaarenddef
1221750802b5SBram Moolenaar
12220a84284eSBram Moolenaardef Test_import_as()
12230a84284eSBram Moolenaar  var export_lines =<< trim END
12240a84284eSBram Moolenaar    vim9script
12250a84284eSBram Moolenaar    export var one = 1
12260a84284eSBram Moolenaar    export var yes = 'yes'
12270a84284eSBram Moolenaar  END
12280a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
12290a84284eSBram Moolenaar
12300a84284eSBram Moolenaar  var import_lines =<< trim END
12310a84284eSBram Moolenaar    vim9script
12320a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
12330a84284eSBram Moolenaar    assert_equal(1, thatOne)
12340a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
12350a84284eSBram Moolenaar    assert_equal('yes', yesYes)
12360a84284eSBram Moolenaar  END
12370a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
12380a84284eSBram Moolenaar
12390a84284eSBram Moolenaar  import_lines =<< trim END
12400a84284eSBram Moolenaar    vim9script
12410a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
12420a84284eSBram Moolenaar    assert_equal(1, thatOne)
12430a84284eSBram Moolenaar    assert_equal('yes', yesYes)
12440a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
12450a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
12460a84284eSBram Moolenaar  END
12470a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
12480a84284eSBram Moolenaar
12490a84284eSBram Moolenaar  delete('XexportAs')
12500a84284eSBram Moolenaarenddef
12510a84284eSBram Moolenaar
1252803af686SBram Moolenaarfunc g:Trigger()
1253803af686SBram Moolenaar  source Ximport.vim
1254803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1255803af686SBram Moolenaarendfunc
1256803af686SBram Moolenaar
1257803af686SBram Moolenaardef Test_import_export_expr_map()
1258803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1259cfcd011fSBram Moolenaar  var export_lines =<< trim END
1260803af686SBram Moolenaar    vim9script
1261803af686SBram Moolenaar    export def That(): string
1262803af686SBram Moolenaar      return 'yes'
1263803af686SBram Moolenaar    enddef
1264803af686SBram Moolenaar  END
1265803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1266803af686SBram Moolenaar
1267cfcd011fSBram Moolenaar  var import_lines =<< trim END
1268803af686SBram Moolenaar    vim9script
1269803af686SBram Moolenaar    import That from './Xexport_that.vim'
1270803af686SBram Moolenaar    assert_equal('yes', That())
1271803af686SBram Moolenaar  END
1272803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1273803af686SBram Moolenaar
1274803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1275803af686SBram Moolenaar  feedkeys('trigger', "xt")
1276803af686SBram Moolenaar
1277730b2483SBram Moolenaar  delete('Xexport_that.vim')
1278803af686SBram Moolenaar  delete('Ximport.vim')
1279803af686SBram Moolenaar  nunmap trigger
1280803af686SBram Moolenaarenddef
1281803af686SBram Moolenaar
12828e1986e3SBram Moolenaardef Test_import_in_filetype()
12838e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
12848e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1285cfcd011fSBram Moolenaar  var export_lines =<< trim END
12868e1986e3SBram Moolenaar    vim9script
1287cfcd011fSBram Moolenaar    export var That = 'yes'
12888e1986e3SBram Moolenaar  END
1289730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
12908e1986e3SBram Moolenaar
1291cfcd011fSBram Moolenaar  var import_lines =<< trim END
12928e1986e3SBram Moolenaar    vim9script
1293730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
12948e1986e3SBram Moolenaar    assert_equal('yes', That)
12958e1986e3SBram Moolenaar    g:did_load_mytpe = 1
12968e1986e3SBram Moolenaar  END
12978e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
12988e1986e3SBram Moolenaar
1299cfcd011fSBram Moolenaar  var save_rtp = &rtp
13008e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
13018e1986e3SBram Moolenaar
13028e1986e3SBram Moolenaar  filetype plugin on
13038e1986e3SBram Moolenaar  copen
13048e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
13058e1986e3SBram Moolenaar
13068e1986e3SBram Moolenaar  quit!
1307730b2483SBram Moolenaar  delete('Xexport_ft.vim')
13088e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
13098e1986e3SBram Moolenaar  &rtp = save_rtp
13108e1986e3SBram Moolenaarenddef
13118e1986e3SBram Moolenaar
1312efa94447SBram Moolenaardef Test_use_import_in_mapping()
1313cfcd011fSBram Moolenaar  var lines =<< trim END
1314efa94447SBram Moolenaar      vim9script
1315efa94447SBram Moolenaar      export def Funcx()
1316efa94447SBram Moolenaar        g:result = 42
1317efa94447SBram Moolenaar      enddef
1318efa94447SBram Moolenaar  END
1319efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1320efa94447SBram Moolenaar  lines =<< trim END
1321efa94447SBram Moolenaar      vim9script
1322efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1323b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1324efa94447SBram Moolenaar  END
1325efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1326efa94447SBram Moolenaar
1327efa94447SBram Moolenaar  source Xmapscript.vim
1328b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1329efa94447SBram Moolenaar  assert_equal(42, g:result)
1330efa94447SBram Moolenaar
1331efa94447SBram Moolenaar  unlet g:result
1332efa94447SBram Moolenaar  delete('XsomeExport.vim')
1333efa94447SBram Moolenaar  delete('Xmapscript.vim')
1334b3ca9824SBram Moolenaar  nunmap <F3>
1335efa94447SBram Moolenaarenddef
1336efa94447SBram Moolenaar
1337d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1338d3f8a9eeSBram Moolenaar  var lines =<< trim END
1339d3f8a9eeSBram Moolenaar    if has(g:feature)
1340d3f8a9eeSBram Moolenaar      " legacy script
1341d3f8a9eeSBram Moolenaar      let g:legacy = 1
1342d3f8a9eeSBram Moolenaar      finish
1343d3f8a9eeSBram Moolenaar    endif
1344d3f8a9eeSBram Moolenaar    vim9script
1345d3f8a9eeSBram Moolenaar    g:legacy = 0
1346d3f8a9eeSBram Moolenaar  END
1347d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1348d3f8a9eeSBram Moolenaar  g:legacy = -1
1349d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1350d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1351d3f8a9eeSBram Moolenaar
1352d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1353d3f8a9eeSBram Moolenaar  g:legacy = -1
1354d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1355d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1356d3f8a9eeSBram Moolenaarenddef
1357d3f8a9eeSBram Moolenaar
1358750802b5SBram Moolenaardef Test_vim9script_fails()
13598a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
13608a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1361cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
13629721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1363cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1364750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1365750802b5SBram Moolenaar
1366cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1367c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1368c785b9a7SBram Moolenaar
1369e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1370e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
13718a7d6542SBram Moolenaarenddef
13728a7d6542SBram Moolenaar
1373f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1374101f4810SBram Moolenaar  CheckRunVimInTerminal
1375101f4810SBram Moolenaar
13769bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1377c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
13789bb3eb3eSBram Moolenaarendfunc
13799bb3eb3eSBram Moolenaar
1380c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1381cfcd011fSBram Moolenaar  var export =<< trim END
1382101f4810SBram Moolenaar    vim9script
1383101f4810SBram Moolenaar    export def Foo(): number
1384101f4810SBram Moolenaar        return 0
1385101f4810SBram Moolenaar    enddef
1386101f4810SBram Moolenaar  END
1387730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1388101f4810SBram Moolenaar
1389e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
13909bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
13912949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1392101f4810SBram Moolenaar
1393730b2483SBram Moolenaar  delete('XexportCmd.vim')
13949bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
13959bb3eb3eSBram Moolenaarenddef
1396101f4810SBram Moolenaar
13972b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
13982b32700dSBram Moolenaar  var lines =<< trim END
1399a6294955SBram Moolenaar    vim9script
1400a6294955SBram Moolenaar    export var exported = 'thexport'
1401a6294955SBram Moolenaar  END
1402a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1403a6294955SBram Moolenaar  lines =<< trim END
14042b32700dSBram Moolenaar    vim9script noclear
14052b32700dSBram Moolenaar    g:loadCount += 1
14062b32700dSBram Moolenaar    var s:reloaded = 'init'
1407a6294955SBram Moolenaar    import exported from './XExportReload'
14082b32700dSBram Moolenaar
14092b32700dSBram Moolenaar    def Again(): string
14102b32700dSBram Moolenaar      return 'again'
14112b32700dSBram Moolenaar    enddef
14122b32700dSBram Moolenaar
14132b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
14142b32700dSBram Moolenaar    var s:loaded = true
14152b32700dSBram Moolenaar
14162b32700dSBram Moolenaar    var s:notReloaded = 'yes'
14172b32700dSBram Moolenaar    s:reloaded = 'first'
14182b32700dSBram Moolenaar    def g:Values(): list<string>
1419a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
14202b32700dSBram Moolenaar    enddef
14212b32700dSBram Moolenaar
14222b32700dSBram Moolenaar    def Once(): string
14232b32700dSBram Moolenaar      return 'once'
14242b32700dSBram Moolenaar    enddef
14252b32700dSBram Moolenaar  END
14262b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
14272b32700dSBram Moolenaar  g:loadCount = 0
14282b32700dSBram Moolenaar  source XReloaded
14292b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1430a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
14312b32700dSBram Moolenaar  source XReloaded
14322b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1433a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
14342b32700dSBram Moolenaar  source XReloaded
14352b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1436a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
14372b32700dSBram Moolenaar
143848e11c10SBram Moolenaar  delete('XReloaded')
1439a6294955SBram Moolenaar  delete('XExportReload')
14402b32700dSBram Moolenaar  delfunc g:Values
14412b32700dSBram Moolenaar  unlet g:loadCount
14422b32700dSBram Moolenaarenddef
14432b32700dSBram Moolenaar
14444c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1445cfcd011fSBram Moolenaar  var lines =<< trim END
14468a7d6542SBram Moolenaar    vim9script
14478a7d6542SBram Moolenaar    const var = ''
1448cfcd011fSBram Moolenaar    var valone = 1234
14498a7d6542SBram Moolenaar    def MyFunc(arg: string)
14508a7d6542SBram Moolenaar       valone = 5678
14518a7d6542SBram Moolenaar    enddef
14528a7d6542SBram Moolenaar  END
1453cfcd011fSBram Moolenaar  var morelines =<< trim END
1454cfcd011fSBram Moolenaar    var valtwo = 222
14558a7d6542SBram Moolenaar    export def GetValtwo(): number
14568a7d6542SBram Moolenaar      return valtwo
14578a7d6542SBram Moolenaar    enddef
14588a7d6542SBram Moolenaar  END
145903afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
14608a7d6542SBram Moolenaar  source Xreload.vim
14618a7d6542SBram Moolenaar  source Xreload.vim
14628a7d6542SBram Moolenaar  source Xreload.vim
14638a7d6542SBram Moolenaar
1464cfcd011fSBram Moolenaar  var testlines =<< trim END
14658a7d6542SBram Moolenaar    vim9script
14668a7d6542SBram Moolenaar    def TheFunc()
14678a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
14688a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
14698a7d6542SBram Moolenaar    enddef
14708a7d6542SBram Moolenaar    TheFunc()
14718a7d6542SBram Moolenaar  END
14728a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
14738a7d6542SBram Moolenaar  source Ximport.vim
14748a7d6542SBram Moolenaar
1475f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1476f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
14778a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
14788a7d6542SBram Moolenaar  source Ximport.vim
14798a7d6542SBram Moolenaar
1480f5be8cdbSBram Moolenaar  # cannot declare a var twice
14818a7d6542SBram Moolenaar  lines =<< trim END
14828a7d6542SBram Moolenaar    vim9script
1483cfcd011fSBram Moolenaar    var valone = 1234
1484cfcd011fSBram Moolenaar    var valone = 5678
14858a7d6542SBram Moolenaar  END
14868a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
148744d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
14888a7d6542SBram Moolenaar
14898a7d6542SBram Moolenaar  delete('Xreload.vim')
14908a7d6542SBram Moolenaar  delete('Ximport.vim')
14918a7d6542SBram Moolenaarenddef
14928a7d6542SBram Moolenaar
149307a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
149407a65d26SBram Moolenaar" compiled function using that variable must fail.
149507a65d26SBram Moolenaardef Test_script_reload_change_type()
149607a65d26SBram Moolenaar  var lines =<< trim END
149707a65d26SBram Moolenaar    vim9script noclear
149807a65d26SBram Moolenaar    var str = 'string'
149907a65d26SBram Moolenaar    def g:GetStr(): string
150007a65d26SBram Moolenaar      return str .. 'xxx'
150107a65d26SBram Moolenaar    enddef
150207a65d26SBram Moolenaar  END
150307a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
150407a65d26SBram Moolenaar  source Xreload.vim
150507a65d26SBram Moolenaar  echo g:GetStr()
150607a65d26SBram Moolenaar
150707a65d26SBram Moolenaar  lines =<< trim END
150807a65d26SBram Moolenaar    vim9script noclear
150907a65d26SBram Moolenaar    var str = 1234
151007a65d26SBram Moolenaar  END
151107a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
151207a65d26SBram Moolenaar  source Xreload.vim
151307a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
151407a65d26SBram Moolenaar
151507a65d26SBram Moolenaar  delfunc g:GetStr
151607a65d26SBram Moolenaar  delete('Xreload.vim')
151707a65d26SBram Moolenaarenddef
151807a65d26SBram Moolenaar
15196c3843caSBram Moolenaardef Test_script_var_shadows_function()
15206c3843caSBram Moolenaar  var lines =<< trim END
15216c3843caSBram Moolenaar      vim9script
15226c3843caSBram Moolenaar      def Func(): number
15236c3843caSBram Moolenaar        return 123
15246c3843caSBram Moolenaar      enddef
15256c3843caSBram Moolenaar      var Func = 1
15266c3843caSBram Moolenaar  END
15276c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
15286c3843caSBram Moolenaarenddef
15296c3843caSBram Moolenaar
153095006e3dSBram Moolenaardef s:RetSome(): string
153195006e3dSBram Moolenaar  return 'some'
153295006e3dSBram Moolenaarenddef
153395006e3dSBram Moolenaar
1534fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1535fe465a01SBram Moolenaar" script-local name.
1536fe465a01SBram Moolenaardef Test_vim9script_funcref()
1537cfcd011fSBram Moolenaar  var sortlines =<< trim END
1538fe465a01SBram Moolenaar      vim9script
1539fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1540bed36b93SBram Moolenaar        return i2 - i1
1541fe465a01SBram Moolenaar      enddef
1542fe465a01SBram Moolenaar
1543fe465a01SBram Moolenaar      export def FastSort(): list<number>
1544fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1545fe465a01SBram Moolenaar      enddef
1546fe465a01SBram Moolenaar  END
1547fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1548fe465a01SBram Moolenaar
1549cfcd011fSBram Moolenaar  var lines =<< trim END
1550fe465a01SBram Moolenaar    vim9script
1551fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1552fe465a01SBram Moolenaar    def Test()
1553fe465a01SBram Moolenaar      g:result = FastSort()
1554fe465a01SBram Moolenaar    enddef
1555fe465a01SBram Moolenaar    Test()
1556fe465a01SBram Moolenaar  END
1557fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1558fe465a01SBram Moolenaar
1559fe465a01SBram Moolenaar  source Xscript.vim
1560fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1561fe465a01SBram Moolenaar
1562fe465a01SBram Moolenaar  unlet g:result
1563fe465a01SBram Moolenaar  delete('Xsort.vim')
1564fe465a01SBram Moolenaar  delete('Xscript.vim')
156595006e3dSBram Moolenaar
1566cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
156795006e3dSBram Moolenaar  assert_equal('some', Funcref())
1568fe465a01SBram Moolenaarenddef
1569fe465a01SBram Moolenaar
1570601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1571601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1572601e76acSBram Moolenaar" function reference.
1573c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1574cfcd011fSBram Moolenaar  var filterLines =<< trim END
1575c620c055SBram Moolenaar    vim9script
1576c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1577c620c055SBram Moolenaar      return idx % 2 == 1
1578c620c055SBram Moolenaar    enddef
1579c620c055SBram Moolenaar    export def FastFilter(): list<number>
1580c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1581c620c055SBram Moolenaar    enddef
1582601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1583601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1584601e76acSBram Moolenaar    enddef
1585c620c055SBram Moolenaar  END
1586c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1587c620c055SBram Moolenaar
1588cfcd011fSBram Moolenaar  var lines =<< trim END
1589c620c055SBram Moolenaar    vim9script
1590601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1591c620c055SBram Moolenaar    def Test()
1592cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1593c620c055SBram Moolenaar    enddef
1594c620c055SBram Moolenaar    Test()
1595601e76acSBram Moolenaar    def TestDirect()
1596cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1597601e76acSBram Moolenaar    enddef
1598601e76acSBram Moolenaar    TestDirect()
1599c620c055SBram Moolenaar  END
1600601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1601c620c055SBram Moolenaar  delete('Xfilter.vim')
1602c620c055SBram Moolenaarenddef
1603c620c055SBram Moolenaar
16044c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1605cfcd011fSBram Moolenaar  var first_lines =<< trim END
16064c17ad94SBram Moolenaar    vim9script
16074c17ad94SBram Moolenaar    def FuncYes(): string
16084c17ad94SBram Moolenaar      return 'yes'
16094c17ad94SBram Moolenaar    enddef
16104c17ad94SBram Moolenaar  END
1611cfcd011fSBram Moolenaar  var withno_lines =<< trim END
16124c17ad94SBram Moolenaar    def FuncNo(): string
16134c17ad94SBram Moolenaar      return 'no'
16144c17ad94SBram Moolenaar    enddef
16154c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
16164c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
16174c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
161803afdcf1SBram Moolenaar    enddef
161903afdcf1SBram Moolenaar  END
1620cfcd011fSBram Moolenaar  var nono_lines =<< trim END
162103afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
162203afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
162344d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
16244c17ad94SBram Moolenaar    enddef
16254c17ad94SBram Moolenaar  END
16264c17ad94SBram Moolenaar
16274c17ad94SBram Moolenaar  # FuncNo() is defined
162803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16294c17ad94SBram Moolenaar  source Xreloaded.vim
16304c17ad94SBram Moolenaar  g:DoCheck(true)
16314c17ad94SBram Moolenaar
16324c17ad94SBram Moolenaar  # FuncNo() is not redefined
163303afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
16344c17ad94SBram Moolenaar  source Xreloaded.vim
16355082471fSBram Moolenaar  g:DoCheck(false)
16364c17ad94SBram Moolenaar
16374c17ad94SBram Moolenaar  # FuncNo() is back
163803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16394c17ad94SBram Moolenaar  source Xreloaded.vim
16405082471fSBram Moolenaar  g:DoCheck(false)
16414c17ad94SBram Moolenaar
16424c17ad94SBram Moolenaar  delete('Xreloaded.vim')
16434c17ad94SBram Moolenaarenddef
16444c17ad94SBram Moolenaar
164589483d40SBram Moolenaardef Test_vim9script_reload_delvar()
164689483d40SBram Moolenaar  # write the script with a script-local variable
1647cfcd011fSBram Moolenaar  var lines =<< trim END
164889483d40SBram Moolenaar    vim9script
1649cfcd011fSBram Moolenaar    var name = 'string'
165089483d40SBram Moolenaar  END
165189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
165289483d40SBram Moolenaar  source XreloadVar.vim
165389483d40SBram Moolenaar
165489483d40SBram Moolenaar  # now write the script using the same variable locally - works
165589483d40SBram Moolenaar  lines =<< trim END
165689483d40SBram Moolenaar    vim9script
165789483d40SBram Moolenaar    def Func()
1658cfcd011fSBram Moolenaar      var name = 'string'
165989483d40SBram Moolenaar    enddef
166089483d40SBram Moolenaar  END
166189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
166289483d40SBram Moolenaar  source XreloadVar.vim
166389483d40SBram Moolenaar
166489483d40SBram Moolenaar  delete('XreloadVar.vim')
166589483d40SBram Moolenaarenddef
166689483d40SBram Moolenaar
16678a7d6542SBram Moolenaardef Test_import_absolute()
1668cfcd011fSBram Moolenaar  var import_lines = [
1669e6085c53SBram Moolenaar        'vim9script',
1670e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1671e6085c53SBram Moolenaar        'def UseExported()',
1672e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1673e6085c53SBram Moolenaar        '  exported = 8888',
1674e6085c53SBram Moolenaar        '  g:imported_after = exported',
1675e6085c53SBram Moolenaar        'enddef',
1676e6085c53SBram Moolenaar        'UseExported()',
1677e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1678e6085c53SBram Moolenaar        ]
16798a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
16808a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
16818a7d6542SBram Moolenaar
16828a7d6542SBram Moolenaar  source Ximport_abs.vim
16838a7d6542SBram Moolenaar
16848a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
16854e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1686fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1687fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1688fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1689fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1690fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1691fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1692fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1693fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1694fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1695fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1696e6085c53SBram Moolenaar        g:import_disassembled)
1697b3ca9824SBram Moolenaar
1698b3ca9824SBram Moolenaar  Undo_export_script_lines()
16998a7d6542SBram Moolenaar  unlet g:imported_abs
17004e12a5dfSBram Moolenaar  unlet g:import_disassembled
17018a7d6542SBram Moolenaar
17028a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
17038a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
17048a7d6542SBram Moolenaarenddef
17058a7d6542SBram Moolenaar
17068a7d6542SBram Moolenaardef Test_import_rtp()
1707cfcd011fSBram Moolenaar  var import_lines = [
1708e6085c53SBram Moolenaar        'vim9script',
1709e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1710e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1711e6085c53SBram Moolenaar        ]
17128a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
17138a7d6542SBram Moolenaar  mkdir('import')
17148a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
17158a7d6542SBram Moolenaar
1716cfcd011fSBram Moolenaar  var save_rtp = &rtp
17178a7d6542SBram Moolenaar  &rtp = getcwd()
17188a7d6542SBram Moolenaar  source Ximport_rtp.vim
17198a7d6542SBram Moolenaar  &rtp = save_rtp
17208a7d6542SBram Moolenaar
17218a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
17228a7d6542SBram Moolenaar
1723b3ca9824SBram Moolenaar  Undo_export_script_lines()
1724b3ca9824SBram Moolenaar  unlet g:imported_rtp
17258a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
172689483d40SBram Moolenaar  delete('import', 'rf')
17278a7d6542SBram Moolenaarenddef
17288a7d6542SBram Moolenaar
172925e0f586SBram Moolenaardef Test_import_compile_error()
1730cfcd011fSBram Moolenaar  var export_lines = [
173125e0f586SBram Moolenaar        'vim9script',
173225e0f586SBram Moolenaar        'export def ExpFunc(): string',
173325e0f586SBram Moolenaar        '  return notDefined',
173425e0f586SBram Moolenaar        'enddef',
173525e0f586SBram Moolenaar        ]
173625e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
173725e0f586SBram Moolenaar
1738cfcd011fSBram Moolenaar  var import_lines = [
173925e0f586SBram Moolenaar        'vim9script',
174025e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
174125e0f586SBram Moolenaar        'def ImpFunc()',
174225e0f586SBram Moolenaar        '  echo ExpFunc()',
174325e0f586SBram Moolenaar        'enddef',
174425e0f586SBram Moolenaar        'defcompile',
174525e0f586SBram Moolenaar        ]
174625e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
174725e0f586SBram Moolenaar
174825e0f586SBram Moolenaar  try
174925e0f586SBram Moolenaar    source Ximport.vim
175025e0f586SBram Moolenaar  catch /E1001/
1751f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
17527707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
175325e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
175425e0f586SBram Moolenaar  endtry
175525e0f586SBram Moolenaar
175625e0f586SBram Moolenaar  delete('Xexported.vim')
175725e0f586SBram Moolenaar  delete('Ximport.vim')
175825e0f586SBram Moolenaarenddef
175925e0f586SBram Moolenaar
1760c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1761cfcd011fSBram Moolenaar  var lines = [
1762c4ce36d4SBram Moolenaar        'vim9script',
1763c4ce36d4SBram Moolenaar        'def Func()',
1764c4ce36d4SBram Moolenaar        '  eval [][0]',
1765c4ce36d4SBram Moolenaar        'enddef',
1766c4ce36d4SBram Moolenaar        'Func()',
1767c4ce36d4SBram Moolenaar        ]
1768c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1769c4ce36d4SBram Moolenaar
1770c4ce36d4SBram Moolenaar  for count in range(3)
1771c4ce36d4SBram Moolenaar    try
1772c4ce36d4SBram Moolenaar      source Xtestscript.vim
1773c4ce36d4SBram Moolenaar    catch /E684/
1774c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1775c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1776c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1777c4ce36d4SBram Moolenaar    endtry
1778c4ce36d4SBram Moolenaar  endfor
1779c4ce36d4SBram Moolenaar
1780c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1781c4ce36d4SBram Moolenaarenddef
1782c4ce36d4SBram Moolenaar
1783eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1784cfcd011fSBram Moolenaar  var export_lines =<< trim END
1785eef2102eSBram Moolenaar      vim9script
1786eef2102eSBram Moolenaar      export def Func()
1787eef2102eSBram Moolenaar        echo 'imported'
1788eef2102eSBram Moolenaar      enddef
1789eef2102eSBram Moolenaar  END
1790eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1791eef2102eSBram Moolenaar
1792cfcd011fSBram Moolenaar  var lines =<< trim END
1793eef2102eSBram Moolenaar    vim9script
1794eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1795eef2102eSBram Moolenaar    def Func()
1796eef2102eSBram Moolenaar      echo 'local to function'
1797eef2102eSBram Moolenaar    enddef
1798eef2102eSBram Moolenaar  END
1799eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1800eef2102eSBram Moolenaar
1801eef2102eSBram Moolenaar  lines =<< trim END
1802eef2102eSBram Moolenaar    vim9script
1803eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1804eef2102eSBram Moolenaar    def Outer()
1805eef2102eSBram Moolenaar      def Func()
1806eef2102eSBram Moolenaar        echo 'local to function'
1807eef2102eSBram Moolenaar      enddef
1808eef2102eSBram Moolenaar    enddef
1809eef2102eSBram Moolenaar    defcompile
1810eef2102eSBram Moolenaar  END
1811eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1812eef2102eSBram Moolenaar
1813eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1814eef2102eSBram Moolenaarenddef
1815eef2102eSBram Moolenaar
1816b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1817cfcd011fSBram Moolenaar  var lines =<< trim END
1818b9a2cac3SBram Moolenaar    vim9script
1819b9a2cac3SBram Moolenaar    def Func()
1820b9a2cac3SBram Moolenaar      echo 'one'
1821b9a2cac3SBram Moolenaar    enddef
1822b9a2cac3SBram Moolenaar    def Func()
1823b9a2cac3SBram Moolenaar      echo 'two'
1824b9a2cac3SBram Moolenaar    enddef
1825b9a2cac3SBram Moolenaar  END
1826b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1827fa211f3cSBram Moolenaar
1828fa211f3cSBram Moolenaar  lines =<< trim END
1829fa211f3cSBram Moolenaar    vim9script
1830fa211f3cSBram Moolenaar    def Foo(): string
1831fa211f3cSBram Moolenaar      return 'foo'
1832fa211f3cSBram Moolenaar      enddef
1833fa211f3cSBram Moolenaar    def Func()
1834cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1835fa211f3cSBram Moolenaar    enddef
1836fa211f3cSBram Moolenaar    defcompile
1837fa211f3cSBram Moolenaar  END
1838fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1839b9a2cac3SBram Moolenaarenddef
1840b9a2cac3SBram Moolenaar
18418a7d6542SBram Moolenaardef Test_fixed_size_list()
1842f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1843cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
18448a7d6542SBram Moolenaar  l->remove(0)
18458a7d6542SBram Moolenaar  l->add(5)
18468a7d6542SBram Moolenaar  l->insert(99, 1)
18470f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
18488a7d6542SBram Moolenaarenddef
18498a7d6542SBram Moolenaar
1850ae616494SBram Moolenaardef Test_no_insert_xit()
1851d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1852d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1853d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1854d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1855d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1856ae616494SBram Moolenaar
1857ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1858ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1859ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1860ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1861f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1862f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1863f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1864f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1865f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1866ae616494SBram Moolenaarenddef
1867ae616494SBram Moolenaar
1868158906cfSBram Moolenaardef IfElse(what: number): string
1869cfcd011fSBram Moolenaar  var res = ''
1870158906cfSBram Moolenaar  if what == 1
1871158906cfSBram Moolenaar    res = "one"
1872158906cfSBram Moolenaar  elseif what == 2
1873158906cfSBram Moolenaar    res = "two"
1874a259d8d3SBram Moolenaar  else
1875158906cfSBram Moolenaar    res = "three"
1876a259d8d3SBram Moolenaar  endif
1877158906cfSBram Moolenaar  return res
1878a259d8d3SBram Moolenaarenddef
1879a259d8d3SBram Moolenaar
1880158906cfSBram Moolenaardef Test_if_elseif_else()
1881158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1882158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1883158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
18840f18b6d1SBram Moolenaarenddef
18850f18b6d1SBram Moolenaar
1886e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1887d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1888d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1889d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1890ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1891d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
18926628b7ebSBram Moolenaar
18936628b7ebSBram Moolenaar  var lines =<< trim END
18946628b7ebSBram Moolenaar      var s = ''
18956628b7ebSBram Moolenaar      if s = ''
18966628b7ebSBram Moolenaar      endif
18976628b7ebSBram Moolenaar  END
18986628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
18996628b7ebSBram Moolenaar
19006628b7ebSBram Moolenaar  lines =<< trim END
19016628b7ebSBram Moolenaar      var s = ''
19026628b7ebSBram Moolenaar      if s == ''
19036628b7ebSBram Moolenaar      elseif s = ''
19046628b7ebSBram Moolenaar      endif
19056628b7ebSBram Moolenaar  END
19066628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
1907e8c4abbbSBram Moolenaarenddef
1908e8c4abbbSBram Moolenaar
19096d69bf60SBram Moolenaarlet g:bool_true = v:true
19106d69bf60SBram Moolenaarlet g:bool_false = v:false
19116d69bf60SBram Moolenaar
19126d69bf60SBram Moolenaardef Test_if_const_expr()
1913cfcd011fSBram Moolenaar  var res = false
19146d69bf60SBram Moolenaar  if true ? true : false
19156d69bf60SBram Moolenaar    res = true
19166d69bf60SBram Moolenaar  endif
19176d69bf60SBram Moolenaar  assert_equal(true, res)
19186d69bf60SBram Moolenaar
1919585fea7bSBram Moolenaar  g:glob = 2
1920585fea7bSBram Moolenaar  if false
19216797966dSBram Moolenaar    execute('g:glob = 3')
1922585fea7bSBram Moolenaar  endif
1923585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1924585fea7bSBram Moolenaar  if true
19256797966dSBram Moolenaar    execute('g:glob = 3')
1926585fea7bSBram Moolenaar  endif
1927585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1928585fea7bSBram Moolenaar
19296d69bf60SBram Moolenaar  res = false
19306d69bf60SBram Moolenaar  if g:bool_true ? true : false
19316d69bf60SBram Moolenaar    res = true
19326d69bf60SBram Moolenaar  endif
19336d69bf60SBram Moolenaar  assert_equal(true, res)
19346d69bf60SBram Moolenaar
19356d69bf60SBram Moolenaar  res = false
19366d69bf60SBram Moolenaar  if true ? g:bool_true : false
19376d69bf60SBram Moolenaar    res = true
19386d69bf60SBram Moolenaar  endif
19396d69bf60SBram Moolenaar  assert_equal(true, res)
19406d69bf60SBram Moolenaar
19416d69bf60SBram Moolenaar  res = false
19426d69bf60SBram Moolenaar  if true ? true : g:bool_false
19436d69bf60SBram Moolenaar    res = true
19446d69bf60SBram Moolenaar  endif
19456d69bf60SBram Moolenaar  assert_equal(true, res)
19466d69bf60SBram Moolenaar
19476d69bf60SBram Moolenaar  res = false
19486d69bf60SBram Moolenaar  if true ? false : true
19496d69bf60SBram Moolenaar    res = true
19506d69bf60SBram Moolenaar  endif
19516d69bf60SBram Moolenaar  assert_equal(false, res)
19526d69bf60SBram Moolenaar
19536d69bf60SBram Moolenaar  res = false
19546d69bf60SBram Moolenaar  if false ? false : true
19556d69bf60SBram Moolenaar    res = true
19566d69bf60SBram Moolenaar  endif
19576d69bf60SBram Moolenaar  assert_equal(true, res)
19586d69bf60SBram Moolenaar
19596d69bf60SBram Moolenaar  res = false
19606d69bf60SBram Moolenaar  if false ? true : false
19616d69bf60SBram Moolenaar    res = true
19626d69bf60SBram Moolenaar  endif
19636d69bf60SBram Moolenaar  assert_equal(false, res)
19646d69bf60SBram Moolenaar
19656d69bf60SBram Moolenaar  res = false
1966e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1967e8c4abbbSBram Moolenaar    res = true
1968e8c4abbbSBram Moolenaar  endif
1969e8c4abbbSBram Moolenaar  assert_equal(false, res)
1970e8c4abbbSBram Moolenaar
1971e8c4abbbSBram Moolenaar  res = false
19726d69bf60SBram Moolenaar  if true && true
19736d69bf60SBram Moolenaar    res = true
19746d69bf60SBram Moolenaar  endif
19756d69bf60SBram Moolenaar  assert_equal(true, res)
19766d69bf60SBram Moolenaar
19776d69bf60SBram Moolenaar  res = false
19786d69bf60SBram Moolenaar  if true && false
19796d69bf60SBram Moolenaar    res = true
19806d69bf60SBram Moolenaar  endif
19816d69bf60SBram Moolenaar  assert_equal(false, res)
19826d69bf60SBram Moolenaar
19836d69bf60SBram Moolenaar  res = false
19846d69bf60SBram Moolenaar  if g:bool_true && false
19856d69bf60SBram Moolenaar    res = true
19866d69bf60SBram Moolenaar  endif
19876d69bf60SBram Moolenaar  assert_equal(false, res)
19886d69bf60SBram Moolenaar
19896d69bf60SBram Moolenaar  res = false
19906d69bf60SBram Moolenaar  if true && g:bool_false
19916d69bf60SBram Moolenaar    res = true
19926d69bf60SBram Moolenaar  endif
19936d69bf60SBram Moolenaar  assert_equal(false, res)
19946d69bf60SBram Moolenaar
19956d69bf60SBram Moolenaar  res = false
19966d69bf60SBram Moolenaar  if false && false
19976d69bf60SBram Moolenaar    res = true
19986d69bf60SBram Moolenaar  endif
19996d69bf60SBram Moolenaar  assert_equal(false, res)
20006d69bf60SBram Moolenaar
20016d69bf60SBram Moolenaar  res = false
20026d69bf60SBram Moolenaar  if true || false
20036d69bf60SBram Moolenaar    res = true
20046d69bf60SBram Moolenaar  endif
20056d69bf60SBram Moolenaar  assert_equal(true, res)
20066d69bf60SBram Moolenaar
20076d69bf60SBram Moolenaar  res = false
20086d69bf60SBram Moolenaar  if g:bool_true || false
20096d69bf60SBram Moolenaar    res = true
20106d69bf60SBram Moolenaar  endif
20116d69bf60SBram Moolenaar  assert_equal(true, res)
20126d69bf60SBram Moolenaar
20136d69bf60SBram Moolenaar  res = false
20146d69bf60SBram Moolenaar  if true || g:bool_false
20156d69bf60SBram Moolenaar    res = true
20166d69bf60SBram Moolenaar  endif
20176d69bf60SBram Moolenaar  assert_equal(true, res)
20186d69bf60SBram Moolenaar
20196d69bf60SBram Moolenaar  res = false
20206d69bf60SBram Moolenaar  if false || false
20216d69bf60SBram Moolenaar    res = true
20226d69bf60SBram Moolenaar  endif
20236d69bf60SBram Moolenaar  assert_equal(false, res)
20243988f64fSBram Moolenaar
20253988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
20263988f64fSBram Moolenaar  if false | eval 0 | endif
20273988f64fSBram Moolenaar  if false | eval burp + 234 | endif
20283988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
20293988f64fSBram Moolenaar  if false
20303988f64fSBram Moolenaar    burp
20313988f64fSBram Moolenaar  endif
203280c34ca3SBram Moolenaarenddef
20336d69bf60SBram Moolenaar
203480c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2035d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2036d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2037d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2038d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
20396d69bf60SBram Moolenaarenddef
20406d69bf60SBram Moolenaar
204172abcf42SBram Moolenaardef RunNested(i: number): number
2042cfcd011fSBram Moolenaar  var x: number = 0
204372abcf42SBram Moolenaar  if i % 2
204472abcf42SBram Moolenaar    if 1
2045f5be8cdbSBram Moolenaar      # comment
204672abcf42SBram Moolenaar    else
2047f5be8cdbSBram Moolenaar      # comment
204872abcf42SBram Moolenaar    endif
204972abcf42SBram Moolenaar    x += 1
205072abcf42SBram Moolenaar  else
205172abcf42SBram Moolenaar    x += 1000
205272abcf42SBram Moolenaar  endif
205372abcf42SBram Moolenaar  return x
205472abcf42SBram Moolenaarenddef
205572abcf42SBram Moolenaar
205672abcf42SBram Moolenaardef Test_nested_if()
205772abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
205872abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
205972abcf42SBram Moolenaarenddef
206072abcf42SBram Moolenaar
2061ad39c094SBram Moolenaardef Test_execute_cmd()
2062e4984290SBram Moolenaar  # missing argument is ignored
2063e4984290SBram Moolenaar  execute
2064e4984290SBram Moolenaar  execute # comment
2065e4984290SBram Moolenaar
2066ad39c094SBram Moolenaar  new
2067ad39c094SBram Moolenaar  setline(1, 'default')
2068d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2069ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2070a72cfb80SBram Moolenaar
2071d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2072a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2073a72cfb80SBram Moolenaar
2074cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2075cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2076a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2077ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2078a72cfb80SBram Moolenaar
2079d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2080ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2081a72cfb80SBram Moolenaar
2082cfcd011fSBram Moolenaar  var cmd_first = 'call '
2083cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2084ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2085ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2086ad39c094SBram Moolenaar  bwipe!
2087585fea7bSBram Moolenaar
2088cfcd011fSBram Moolenaar  var n = true
20892d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
20902d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
20912d6b20d6SBram Moolenaar
2092e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2093e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2094e5abf7afSBram Moolenaar
2095d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2096d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2097d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2098ad39c094SBram Moolenaarenddef
2099ad39c094SBram Moolenaar
210047e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2101f5be8cdbSBram Moolenaar  # only checks line continuation
2102cfcd011fSBram Moolenaar  var lines =<< trim END
210347e880d6SBram Moolenaar      vim9script
210447e880d6SBram Moolenaar      execute 'g:someVar'
210547e880d6SBram Moolenaar                .. ' = ' ..
210647e880d6SBram Moolenaar                   '28'
210747e880d6SBram Moolenaar      assert_equal(28, g:someVar)
210847e880d6SBram Moolenaar      unlet g:someVar
210947e880d6SBram Moolenaar  END
211047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
211147e880d6SBram Moolenaarenddef
211247e880d6SBram Moolenaar
2113ad39c094SBram Moolenaardef Test_echo_cmd()
2114a72cfb80SBram Moolenaar  echo 'some' # comment
2115585fea7bSBram Moolenaar  echon 'thing'
2116ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2117ad39c094SBram Moolenaar
2118a72cfb80SBram Moolenaar  echo "some" # comment
2119a72cfb80SBram Moolenaar  echon "thing"
2120a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2121a72cfb80SBram Moolenaar
2122cfcd011fSBram Moolenaar  var str1 = 'some'
2123cfcd011fSBram Moolenaar  var str2 = 'more'
2124ad39c094SBram Moolenaar  echo str1 str2
2125ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2126a72cfb80SBram Moolenaar
2127d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2128ad39c094SBram Moolenaarenddef
2129ad39c094SBram Moolenaar
2130f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2131f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2132f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2133f93c7feaSBram Moolenaar  echo 'clear'
2134df069eecSBram Moolenaar  :1messages
2135f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2136f93c7feaSBram Moolenaar
2137d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2138f93c7feaSBram Moolenaarenddef
2139f93c7feaSBram Moolenaar
214047e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2141f5be8cdbSBram Moolenaar  # only checks line continuation
2142cfcd011fSBram Moolenaar  var lines =<< trim END
214347e880d6SBram Moolenaar      vim9script
214447e880d6SBram Moolenaar      echomsg 'here'
214547e880d6SBram Moolenaar                .. ' is ' ..
214647e880d6SBram Moolenaar                   'a message'
214747e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
214847e880d6SBram Moolenaar  END
214947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
215047e880d6SBram Moolenaarenddef
215147e880d6SBram Moolenaar
2152f93c7feaSBram Moolenaardef Test_echoerr_cmd()
215340ee466cSBram Moolenaar  try
215440ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
215540ee466cSBram Moolenaar  catch
215640ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
215740ee466cSBram Moolenaar  endtry
2158f93c7feaSBram Moolenaarenddef
2159f93c7feaSBram Moolenaar
216047e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2161f5be8cdbSBram Moolenaar  # only checks line continuation
2162cfcd011fSBram Moolenaar  var lines =<< trim END
216347e880d6SBram Moolenaar      vim9script
216447e880d6SBram Moolenaar      try
216547e880d6SBram Moolenaar        echoerr 'this'
216647e880d6SBram Moolenaar                .. ' is ' ..
216747e880d6SBram Moolenaar                   'wrong'
216847e880d6SBram Moolenaar      catch
216947e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
217047e880d6SBram Moolenaar      endtry
217147e880d6SBram Moolenaar  END
217247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
217347e880d6SBram Moolenaarenddef
217447e880d6SBram Moolenaar
217541fe0617SBram Moolenaardef Test_for_outside_of_function()
2176cfcd011fSBram Moolenaar  var lines =<< trim END
217741fe0617SBram Moolenaar    vim9script
217841fe0617SBram Moolenaar    new
217941fe0617SBram Moolenaar    for var in range(0, 3)
218041fe0617SBram Moolenaar      append(line('$'), var)
218141fe0617SBram Moolenaar    endfor
218241fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
218341fe0617SBram Moolenaar    bwipe!
218441fe0617SBram Moolenaar  END
218541fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
218641fe0617SBram Moolenaar  source Xvim9for.vim
218741fe0617SBram Moolenaar  delete('Xvim9for.vim')
218841fe0617SBram Moolenaarenddef
21898a7d6542SBram Moolenaar
2190e8c4abbbSBram Moolenaardef Test_for_loop()
2191cfcd011fSBram Moolenaar  var result = ''
2192e8c4abbbSBram Moolenaar  for cnt in range(7)
2193e8c4abbbSBram Moolenaar    if cnt == 4
2194e8c4abbbSBram Moolenaar      break
2195e8c4abbbSBram Moolenaar    endif
2196e8c4abbbSBram Moolenaar    if cnt == 2
2197e8c4abbbSBram Moolenaar      continue
2198e8c4abbbSBram Moolenaar    endif
2199e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2200e8c4abbbSBram Moolenaar  endfor
2201e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
22020ad3e894SBram Moolenaar
2203cfcd011fSBram Moolenaar  var concat = ''
22040ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
22050ad3e894SBram Moolenaar    concat ..= str
22060ad3e894SBram Moolenaar  endfor
22070ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
220838bd8de5SBram Moolenaar
220938bd8de5SBram Moolenaar  var total = 0
221038bd8de5SBram Moolenaar  for nr in
221138bd8de5SBram Moolenaar      [1, 2, 3]
221238bd8de5SBram Moolenaar    total += nr
221338bd8de5SBram Moolenaar  endfor
221438bd8de5SBram Moolenaar  assert_equal(6, total)
221538bd8de5SBram Moolenaar
221638bd8de5SBram Moolenaar  total = 0
221738bd8de5SBram Moolenaar  for nr
221838bd8de5SBram Moolenaar    in [1, 2, 3]
221938bd8de5SBram Moolenaar    total += nr
222038bd8de5SBram Moolenaar  endfor
222138bd8de5SBram Moolenaar  assert_equal(6, total)
222238bd8de5SBram Moolenaar
222338bd8de5SBram Moolenaar  total = 0
222438bd8de5SBram Moolenaar  for nr
222538bd8de5SBram Moolenaar    in
222638bd8de5SBram Moolenaar    [1, 2, 3]
222738bd8de5SBram Moolenaar    total += nr
222838bd8de5SBram Moolenaar  endfor
222938bd8de5SBram Moolenaar  assert_equal(6, total)
2230036d0714SBram Moolenaar
2231036d0714SBram Moolenaar  var res = ""
2232036d0714SBram Moolenaar  for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2233036d0714SBram Moolenaar    res ..= n .. s
2234036d0714SBram Moolenaar  endfor
2235036d0714SBram Moolenaar  assert_equal('1a2b', res)
2236e8c4abbbSBram Moolenaarenddef
2237e8c4abbbSBram Moolenaar
2238e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2239025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2240025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2241025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2242675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2243675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2244cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2245822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
22462d870f8dSBram Moolenaar  delfunc! g:Func
2247451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2248675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2249675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2250675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2251e8c4abbbSBram Moolenaarenddef
2252e8c4abbbSBram Moolenaar
2253ea87069dSBram Moolenaardef Test_for_loop_script_var()
2254ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2255ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2256ea87069dSBram Moolenaar
2257ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2258ea87069dSBram Moolenaar  var lines =<< trim END
2259ea87069dSBram Moolenaar    vim9script
2260ea87069dSBram Moolenaar    var total = 0
2261ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2262ea87069dSBram Moolenaar      total += s:var
2263ea87069dSBram Moolenaar    endfor
2264ea87069dSBram Moolenaar    assert_equal(6, total)
2265ea87069dSBram Moolenaar
2266ea87069dSBram Moolenaar    total = 0
2267ea87069dSBram Moolenaar    for var in [1, 2, 3]
2268ea87069dSBram Moolenaar      total += var
2269ea87069dSBram Moolenaar    endfor
2270ea87069dSBram Moolenaar    assert_equal(6, total)
2271ea87069dSBram Moolenaar  END
2272ea87069dSBram Moolenaarenddef
2273ea87069dSBram Moolenaar
2274792f786aSBram Moolenaardef Test_for_loop_unpack()
22754b8a0651SBram Moolenaar  var lines =<< trim END
2276792f786aSBram Moolenaar      var result = []
2277792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2278792f786aSBram Moolenaar        result->add(v1)
2279792f786aSBram Moolenaar        result->add(v2)
2280792f786aSBram Moolenaar      endfor
2281792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2282792f786aSBram Moolenaar
2283792f786aSBram Moolenaar      result = []
2284792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2285792f786aSBram Moolenaar        result->add(v1)
2286792f786aSBram Moolenaar        result->add(v2)
2287792f786aSBram Moolenaar        result->add(v3)
2288792f786aSBram Moolenaar      endfor
2289792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2290792f786aSBram Moolenaar
22914b8a0651SBram Moolenaar      result = []
22924b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
22934b8a0651SBram Moolenaar        result->add(&ts)
22944b8a0651SBram Moolenaar        result->add(&sw)
22954b8a0651SBram Moolenaar      endfor
22964b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
22974b8a0651SBram Moolenaar
22984b8a0651SBram Moolenaar      var slist: list<string>
22994b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
23004b8a0651SBram Moolenaar        slist->add($LOOPVAR)
23014b8a0651SBram Moolenaar        slist->add(@r)
23024b8a0651SBram Moolenaar        slist->add(v:errmsg)
23034b8a0651SBram Moolenaar      endfor
23044b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
23054b8a0651SBram Moolenaar
23064b8a0651SBram Moolenaar      slist = []
23074b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
23084b8a0651SBram Moolenaar        slist->add(g:globalvar)
23094b8a0651SBram Moolenaar        slist->add(b:bufvar)
23104b8a0651SBram Moolenaar        slist->add(w:winvar)
23114b8a0651SBram Moolenaar        slist->add(t:tabvar)
23124b8a0651SBram Moolenaar      endfor
23134b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2314f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
23154b8a0651SBram Moolenaar  END
23164b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
23174b8a0651SBram Moolenaar
23184b8a0651SBram Moolenaar  lines =<< trim END
2319792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2320792f786aSBram Moolenaar        echo v1 v2
2321792f786aSBram Moolenaar      endfor
2322792f786aSBram Moolenaar  END
2323792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2324792f786aSBram Moolenaar
2325792f786aSBram Moolenaar  lines =<< trim END
2326792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2327792f786aSBram Moolenaar        echo v1 v2
2328792f786aSBram Moolenaar      endfor
2329792f786aSBram Moolenaar  END
2330792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2331792f786aSBram Moolenaar
2332792f786aSBram Moolenaar  lines =<< trim END
2333792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2334792f786aSBram Moolenaar        echo v1
2335792f786aSBram Moolenaar      endfor
2336792f786aSBram Moolenaar  END
2337792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2338792f786aSBram Moolenaarenddef
2339792f786aSBram Moolenaar
2340c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2341c150c09eSBram Moolenaar  var looped = 0
2342c150c09eSBram Moolenaar  var cleanup = 0
2343c150c09eSBram Moolenaar  for i in range(3)
2344c150c09eSBram Moolenaar    looped += 1
2345c150c09eSBram Moolenaar    try
2346c150c09eSBram Moolenaar      eval [][0]
2347c150c09eSBram Moolenaar    catch
2348c150c09eSBram Moolenaar      continue
2349c150c09eSBram Moolenaar    finally
2350c150c09eSBram Moolenaar      cleanup += 1
2351c150c09eSBram Moolenaar    endtry
2352c150c09eSBram Moolenaar  endfor
2353c150c09eSBram Moolenaar  assert_equal(3, looped)
2354c150c09eSBram Moolenaar  assert_equal(3, cleanup)
2355c150c09eSBram Moolenaarenddef
2356c150c09eSBram Moolenaar
2357d0df1aacSBram Moolenaardef Test_while_loop()
2358cfcd011fSBram Moolenaar  var result = ''
2359cfcd011fSBram Moolenaar  var cnt = 0
2360d0df1aacSBram Moolenaar  while cnt < 555
2361d0df1aacSBram Moolenaar    if cnt == 3
2362d0df1aacSBram Moolenaar      break
2363d0df1aacSBram Moolenaar    endif
2364d0df1aacSBram Moolenaar    cnt += 1
2365d0df1aacSBram Moolenaar    if cnt == 2
2366d0df1aacSBram Moolenaar      continue
2367d0df1aacSBram Moolenaar    endif
2368d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2369d0df1aacSBram Moolenaar  endwhile
2370d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2371dee37dc7SBram Moolenaar
2372dee37dc7SBram Moolenaar  var s = ''
23730123cc1eSBram Moolenaar  while s == 'x' #{comment}
2374dee37dc7SBram Moolenaar  endwhile
2375d0df1aacSBram Moolenaarenddef
2376d0df1aacSBram Moolenaar
2377e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2378675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2379675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2380675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2381675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2382675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2383675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2384675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
23856628b7ebSBram Moolenaar
23866628b7ebSBram Moolenaar  var lines =<< trim END
23876628b7ebSBram Moolenaar      var s = ''
23886628b7ebSBram Moolenaar      while s = ''
23896628b7ebSBram Moolenaar      endwhile
23906628b7ebSBram Moolenaar  END
23916628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2392bd5da371SBram Moolenaarenddef
2393bd5da371SBram Moolenaar
23949645e2d9SBram Moolenaardef Test_interrupt_loop()
2395cfcd011fSBram Moolenaar  var caught = false
2396cfcd011fSBram Moolenaar  var x = 0
239797acfc78SBram Moolenaar  try
23989645e2d9SBram Moolenaar    while 1
23999645e2d9SBram Moolenaar      x += 1
24009645e2d9SBram Moolenaar      if x == 100
24019645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
24029645e2d9SBram Moolenaar      endif
24039645e2d9SBram Moolenaar    endwhile
240497acfc78SBram Moolenaar  catch
240597acfc78SBram Moolenaar    caught = true
240697acfc78SBram Moolenaar    assert_equal(100, x)
240797acfc78SBram Moolenaar  endtry
240897acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
240925859dd7SBram Moolenaar  # consume the CTRL-C
241025859dd7SBram Moolenaar  getchar(0)
24119645e2d9SBram Moolenaarenddef
241220431c9dSBram Moolenaar
24134fdae999SBram Moolenaardef Test_automatic_line_continuation()
2414cfcd011fSBram Moolenaar  var mylist = [
24154fdae999SBram Moolenaar      'one',
24164fdae999SBram Moolenaar      'two',
24174fdae999SBram Moolenaar      'three',
2418f5be8cdbSBram Moolenaar      ] # comment
24194fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
24204fdae999SBram Moolenaar
2421cfcd011fSBram Moolenaar  var mydict = {
2422e0de171eSBram Moolenaar      ['one']: 1,
2423e0de171eSBram Moolenaar      ['two']: 2,
2424e0de171eSBram Moolenaar      ['three']:
24254fdae999SBram Moolenaar          3,
2426f5be8cdbSBram Moolenaar      } # comment
2427e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2428e0de171eSBram Moolenaar  mydict = {
24292c330432SBram Moolenaar      one: 1,  # comment
24302c330432SBram Moolenaar      two:     # comment
24312c330432SBram Moolenaar           2,  # comment
24322c330432SBram Moolenaar      three: 3 # comment
24332c330432SBram Moolenaar      }
2434e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2435e0de171eSBram Moolenaar  mydict = {
24362c330432SBram Moolenaar      one: 1,
24374fdae999SBram Moolenaar      two:
24384fdae999SBram Moolenaar           2,
24392c330432SBram Moolenaar      three: 3
24404fdae999SBram Moolenaar      }
2441e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2442e6085c53SBram Moolenaar
2443e6085c53SBram Moolenaar  assert_equal(
2444e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2445e6085c53SBram Moolenaar        split('one two three')
2446e6085c53SBram Moolenaar        )
24474fdae999SBram Moolenaarenddef
24484fdae999SBram Moolenaar
24497a092245SBram Moolenaardef Test_vim9_comment()
24507a092245SBram Moolenaar  CheckScriptSuccess([
24517a092245SBram Moolenaar      'vim9script',
24527a092245SBram Moolenaar      '# something',
245393f82cbeSBram Moolenaar      '#something',
245493f82cbeSBram Moolenaar      '#{something',
24557a092245SBram Moolenaar      ])
245693f82cbeSBram Moolenaar
245793f82cbeSBram Moolenaar  split Xfile
245893f82cbeSBram Moolenaar  CheckScriptSuccess([
245993f82cbeSBram Moolenaar      'vim9script',
246093f82cbeSBram Moolenaar      'edit #something',
246193f82cbeSBram Moolenaar      ])
246293f82cbeSBram Moolenaar  CheckScriptSuccess([
246393f82cbeSBram Moolenaar      'vim9script',
246493f82cbeSBram Moolenaar      'edit #{something',
246593f82cbeSBram Moolenaar      ])
246693f82cbeSBram Moolenaar  close
246793f82cbeSBram Moolenaar
24687a092245SBram Moolenaar  CheckScriptFailure([
24697a092245SBram Moolenaar      'vim9script',
24707a092245SBram Moolenaar      ':# something',
24717a092245SBram Moolenaar      ], 'E488:')
24727a092245SBram Moolenaar  CheckScriptFailure([
24737a092245SBram Moolenaar      '# something',
24747a092245SBram Moolenaar      ], 'E488:')
24757a092245SBram Moolenaar  CheckScriptFailure([
24767a092245SBram Moolenaar      ':# something',
24777a092245SBram Moolenaar      ], 'E488:')
24787a092245SBram Moolenaar
24794a8d9f2eSBram Moolenaar  { # block start
24804a8d9f2eSBram Moolenaar  } # block end
24814a8d9f2eSBram Moolenaar  CheckDefFailure([
24824a8d9f2eSBram Moolenaar      '{# comment',
24834a8d9f2eSBram Moolenaar      ], 'E488:')
24844a8d9f2eSBram Moolenaar  CheckDefFailure([
24854a8d9f2eSBram Moolenaar      '{',
24864a8d9f2eSBram Moolenaar      '}# comment',
24874a8d9f2eSBram Moolenaar      ], 'E488:')
24884a8d9f2eSBram Moolenaar
24894a8d9f2eSBram Moolenaar  echo "yes" # comment
24904a8d9f2eSBram Moolenaar  CheckDefFailure([
24914a8d9f2eSBram Moolenaar      'echo "yes"# comment',
24924a8d9f2eSBram Moolenaar      ], 'E488:')
24937a092245SBram Moolenaar  CheckScriptSuccess([
24947a092245SBram Moolenaar      'vim9script',
24957a092245SBram Moolenaar      'echo "yes" # something',
24967a092245SBram Moolenaar      ])
24977a092245SBram Moolenaar  CheckScriptFailure([
24987a092245SBram Moolenaar      'vim9script',
24997a092245SBram Moolenaar      'echo "yes"# something',
25007a092245SBram Moolenaar      ], 'E121:')
25017a092245SBram Moolenaar  CheckScriptFailure([
25027a092245SBram Moolenaar      'vim9script',
25037a092245SBram Moolenaar      'echo# something',
2504f8103f27SBram Moolenaar      ], 'E1144:')
25057a092245SBram Moolenaar  CheckScriptFailure([
25067a092245SBram Moolenaar      'echo "yes" # something',
25077a092245SBram Moolenaar      ], 'E121:')
25087a092245SBram Moolenaar
25094a8d9f2eSBram Moolenaar  exe "echo" # comment
25104a8d9f2eSBram Moolenaar  CheckDefFailure([
25114a8d9f2eSBram Moolenaar      'exe "echo"# comment',
25124a8d9f2eSBram Moolenaar      ], 'E488:')
25134a8d9f2eSBram Moolenaar  CheckScriptSuccess([
25144a8d9f2eSBram Moolenaar      'vim9script',
25154a8d9f2eSBram Moolenaar      'exe "echo" # something',
25164a8d9f2eSBram Moolenaar      ])
25174a8d9f2eSBram Moolenaar  CheckScriptFailure([
25184a8d9f2eSBram Moolenaar      'vim9script',
25194a8d9f2eSBram Moolenaar      'exe "echo"# something',
25204a8d9f2eSBram Moolenaar      ], 'E121:')
25214a8d9f2eSBram Moolenaar  CheckScriptFailure([
25224a8d9f2eSBram Moolenaar      'vim9script',
25234a8d9f2eSBram Moolenaar      'exe# something',
2524f8103f27SBram Moolenaar      ], 'E1144:')
25254a8d9f2eSBram Moolenaar  CheckScriptFailure([
25264a8d9f2eSBram Moolenaar      'exe "echo" # something',
25274a8d9f2eSBram Moolenaar      ], 'E121:')
25284a8d9f2eSBram Moolenaar
25297a092245SBram Moolenaar  CheckDefFailure([
25307a092245SBram Moolenaar      'try# comment',
25317a092245SBram Moolenaar      '  echo "yes"',
25327a092245SBram Moolenaar      'catch',
25337a092245SBram Moolenaar      'endtry',
2534f8103f27SBram Moolenaar      ], 'E1144:')
25352c5ed4e3SBram Moolenaar  CheckScriptFailure([
25362c5ed4e3SBram Moolenaar      'vim9script',
25372c5ed4e3SBram Moolenaar      'try# comment',
25382c5ed4e3SBram Moolenaar      'echo "yes"',
2539f8103f27SBram Moolenaar      ], 'E1144:')
25407a092245SBram Moolenaar  CheckDefFailure([
25417a092245SBram Moolenaar      'try',
2542a72cfb80SBram Moolenaar      '  throw#comment',
2543a72cfb80SBram Moolenaar      'catch',
2544a72cfb80SBram Moolenaar      'endtry',
2545f8103f27SBram Moolenaar      ], 'E1144:')
2546a72cfb80SBram Moolenaar  CheckDefFailure([
2547a72cfb80SBram Moolenaar      'try',
2548a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2549a72cfb80SBram Moolenaar      'catch',
2550a72cfb80SBram Moolenaar      'endtry',
2551a72cfb80SBram Moolenaar      ], 'E488:')
2552a72cfb80SBram Moolenaar  CheckDefFailure([
2553a72cfb80SBram Moolenaar      'try',
25547a092245SBram Moolenaar      '  echo "yes"',
25557a092245SBram Moolenaar      'catch# comment',
25567a092245SBram Moolenaar      'endtry',
2557f8103f27SBram Moolenaar      ], 'E1144:')
25582c5ed4e3SBram Moolenaar  CheckScriptFailure([
25592c5ed4e3SBram Moolenaar      'vim9script',
25602c5ed4e3SBram Moolenaar      'try',
25612c5ed4e3SBram Moolenaar      '  echo "yes"',
25622c5ed4e3SBram Moolenaar      'catch# comment',
25632c5ed4e3SBram Moolenaar      'endtry',
2564f8103f27SBram Moolenaar      ], 'E1144:')
25652c5ed4e3SBram Moolenaar  CheckDefFailure([
25662c5ed4e3SBram Moolenaar      'try',
25672c5ed4e3SBram Moolenaar      '  echo "yes"',
25682c5ed4e3SBram Moolenaar      'catch /pat/# comment',
25692c5ed4e3SBram Moolenaar      'endtry',
25702c5ed4e3SBram Moolenaar      ], 'E488:')
25717a092245SBram Moolenaar  CheckDefFailure([
25727a092245SBram Moolenaar      'try',
25737a092245SBram Moolenaar      'echo "yes"',
25747a092245SBram Moolenaar      'catch',
25757a092245SBram Moolenaar      'endtry# comment',
2576f8103f27SBram Moolenaar      ], 'E1144:')
25772c5ed4e3SBram Moolenaar  CheckScriptFailure([
25782c5ed4e3SBram Moolenaar      'vim9script',
25792c5ed4e3SBram Moolenaar      'try',
25802c5ed4e3SBram Moolenaar      '  echo "yes"',
25812c5ed4e3SBram Moolenaar      'catch',
25822c5ed4e3SBram Moolenaar      'endtry# comment',
2583f8103f27SBram Moolenaar      ], 'E1144:')
25842c5ed4e3SBram Moolenaar
25852c5ed4e3SBram Moolenaar  CheckScriptSuccess([
25862c5ed4e3SBram Moolenaar      'vim9script',
25872c5ed4e3SBram Moolenaar      'hi # comment',
25882c5ed4e3SBram Moolenaar      ])
25892c5ed4e3SBram Moolenaar  CheckScriptFailure([
25902c5ed4e3SBram Moolenaar      'vim9script',
25912c5ed4e3SBram Moolenaar      'hi# comment',
2592f8103f27SBram Moolenaar      ], 'E1144:')
25931966c248SBram Moolenaar  CheckScriptSuccess([
25941966c248SBram Moolenaar      'vim9script',
25951966c248SBram Moolenaar      'hi Search # comment',
25961966c248SBram Moolenaar      ])
25971966c248SBram Moolenaar  CheckScriptFailure([
25981966c248SBram Moolenaar      'vim9script',
25991966c248SBram Moolenaar      'hi Search# comment',
26001966c248SBram Moolenaar      ], 'E416:')
26011966c248SBram Moolenaar  CheckScriptSuccess([
26021966c248SBram Moolenaar      'vim9script',
26031966c248SBram Moolenaar      'hi link This Search # comment',
26041966c248SBram Moolenaar      ])
26051966c248SBram Moolenaar  CheckScriptFailure([
26061966c248SBram Moolenaar      'vim9script',
26071966c248SBram Moolenaar      'hi link This That# comment',
26081966c248SBram Moolenaar      ], 'E413:')
26091966c248SBram Moolenaar  CheckScriptSuccess([
26101966c248SBram Moolenaar      'vim9script',
26111966c248SBram Moolenaar      'hi clear This # comment',
26121966c248SBram Moolenaar      'hi clear # comment',
26131966c248SBram Moolenaar      ])
2614f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2615f5be8cdbSBram Moolenaar  # hi clear This# comment',
26161966c248SBram Moolenaar  CheckScriptFailure([
26171966c248SBram Moolenaar      'vim9script',
26181966c248SBram Moolenaar      'hi clear# comment',
26191966c248SBram Moolenaar      ], 'E416:')
26201966c248SBram Moolenaar
26211966c248SBram Moolenaar  CheckScriptSuccess([
26221966c248SBram Moolenaar      'vim9script',
26231966c248SBram Moolenaar      'hi Group term=bold',
26241966c248SBram Moolenaar      'match Group /todo/ # comment',
26251966c248SBram Moolenaar      ])
26261966c248SBram Moolenaar  CheckScriptFailure([
26271966c248SBram Moolenaar      'vim9script',
26281966c248SBram Moolenaar      'hi Group term=bold',
26291966c248SBram Moolenaar      'match Group /todo/# comment',
26301966c248SBram Moolenaar      ], 'E488:')
26311966c248SBram Moolenaar  CheckScriptSuccess([
26321966c248SBram Moolenaar      'vim9script',
26331966c248SBram Moolenaar      'match # comment',
26341966c248SBram Moolenaar      ])
26351966c248SBram Moolenaar  CheckScriptFailure([
26361966c248SBram Moolenaar      'vim9script',
26371966c248SBram Moolenaar      'match# comment',
2638f8103f27SBram Moolenaar      ], 'E1144:')
26391966c248SBram Moolenaar  CheckScriptSuccess([
26401966c248SBram Moolenaar      'vim9script',
26411966c248SBram Moolenaar      'match none # comment',
26421966c248SBram Moolenaar      ])
26431966c248SBram Moolenaar  CheckScriptFailure([
26441966c248SBram Moolenaar      'vim9script',
26451966c248SBram Moolenaar      'match none# comment',
26461966c248SBram Moolenaar      ], 'E475:')
26471966c248SBram Moolenaar
26481966c248SBram Moolenaar  CheckScriptSuccess([
26491966c248SBram Moolenaar      'vim9script',
26501966c248SBram Moolenaar      'menutrans clear # comment',
26511966c248SBram Moolenaar      ])
26521966c248SBram Moolenaar  CheckScriptFailure([
26531966c248SBram Moolenaar      'vim9script',
26541966c248SBram Moolenaar      'menutrans clear# comment text',
26551966c248SBram Moolenaar      ], 'E474:')
26561966c248SBram Moolenaar
26571966c248SBram Moolenaar  CheckScriptSuccess([
26581966c248SBram Moolenaar      'vim9script',
26591966c248SBram Moolenaar      'syntax clear # comment',
26601966c248SBram Moolenaar      ])
26611966c248SBram Moolenaar  CheckScriptFailure([
26621966c248SBram Moolenaar      'vim9script',
26631966c248SBram Moolenaar      'syntax clear# comment text',
26641966c248SBram Moolenaar      ], 'E28:')
26651966c248SBram Moolenaar  CheckScriptSuccess([
26661966c248SBram Moolenaar      'vim9script',
26671966c248SBram Moolenaar      'syntax keyword Word some',
26681966c248SBram Moolenaar      'syntax clear Word # comment',
26691966c248SBram Moolenaar      ])
26701966c248SBram Moolenaar  CheckScriptFailure([
26711966c248SBram Moolenaar      'vim9script',
26721966c248SBram Moolenaar      'syntax keyword Word some',
26731966c248SBram Moolenaar      'syntax clear Word# comment text',
26741966c248SBram Moolenaar      ], 'E28:')
26751966c248SBram Moolenaar
26761966c248SBram Moolenaar  CheckScriptSuccess([
26771966c248SBram Moolenaar      'vim9script',
26781966c248SBram Moolenaar      'syntax list # comment',
26791966c248SBram Moolenaar      ])
26801966c248SBram Moolenaar  CheckScriptFailure([
26811966c248SBram Moolenaar      'vim9script',
26821966c248SBram Moolenaar      'syntax list# comment text',
26831966c248SBram Moolenaar      ], 'E28:')
26841966c248SBram Moolenaar
26851966c248SBram Moolenaar  CheckScriptSuccess([
26861966c248SBram Moolenaar      'vim9script',
26871966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
26881966c248SBram Moolenaar      ])
26891966c248SBram Moolenaar  CheckScriptFailure([
26901966c248SBram Moolenaar      'vim9script',
26911966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
26921966c248SBram Moolenaar      ], 'E475:')
26931966c248SBram Moolenaar
26941966c248SBram Moolenaar  CheckScriptSuccess([
26951966c248SBram Moolenaar      'vim9script',
26961966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
26971966c248SBram Moolenaar      ])
26981966c248SBram Moolenaar  CheckScriptFailure([
26991966c248SBram Moolenaar      'vim9script',
27001966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
27011966c248SBram Moolenaar      ], 'E789:')
27021966c248SBram Moolenaar
27031966c248SBram Moolenaar  CheckScriptSuccess([
27041966c248SBram Moolenaar      'vim9script',
27051966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
27061966c248SBram Moolenaar      ])
27071966c248SBram Moolenaar  CheckScriptFailure([
27081966c248SBram Moolenaar      'vim9script',
27091966c248SBram Moolenaar      'syntax match Word /pat/# comment',
27101966c248SBram Moolenaar      ], 'E402:')
27111966c248SBram Moolenaar
27121966c248SBram Moolenaar  CheckScriptSuccess([
27131966c248SBram Moolenaar      'vim9script',
27141966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
27151966c248SBram Moolenaar      ])
27161966c248SBram Moolenaar  CheckScriptFailure([
27171966c248SBram Moolenaar      'vim9script',
27181966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
27191966c248SBram Moolenaar      ], 'E475:')
27201966c248SBram Moolenaar  CheckScriptFailure([
27211966c248SBram Moolenaar      'vim9script',
27221966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
27231966c248SBram Moolenaar      ], 'E406:')
27241966c248SBram Moolenaar  CheckScriptFailure([
27251966c248SBram Moolenaar      'vim9script',
27261966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
27271966c248SBram Moolenaar      ], 'E475:')
27281966c248SBram Moolenaar
27291966c248SBram Moolenaar  CheckScriptSuccess([
27301966c248SBram Moolenaar      'vim9script',
27311966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
27321966c248SBram Moolenaar      ])
27331966c248SBram Moolenaar  CheckScriptFailure([
27341966c248SBram Moolenaar      'vim9script',
27351966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2736d032f34aSBram Moolenaar      ], 'E402:')
27371966c248SBram Moolenaar
27381966c248SBram Moolenaar  CheckScriptSuccess([
27391966c248SBram Moolenaar      'vim9script',
27401966c248SBram Moolenaar      'syntax sync # comment',
27411966c248SBram Moolenaar      ])
27421966c248SBram Moolenaar  CheckScriptFailure([
27431966c248SBram Moolenaar      'vim9script',
27441966c248SBram Moolenaar      'syntax sync# comment',
27451966c248SBram Moolenaar      ], 'E404:')
27461966c248SBram Moolenaar  CheckScriptSuccess([
27471966c248SBram Moolenaar      'vim9script',
27481966c248SBram Moolenaar      'syntax sync ccomment # comment',
27491966c248SBram Moolenaar      ])
27501966c248SBram Moolenaar  CheckScriptFailure([
27511966c248SBram Moolenaar      'vim9script',
27521966c248SBram Moolenaar      'syntax sync ccomment# comment',
27531966c248SBram Moolenaar      ], 'E404:')
27541966c248SBram Moolenaar
27551966c248SBram Moolenaar  CheckScriptSuccess([
27561966c248SBram Moolenaar      'vim9script',
27571966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
27581966c248SBram Moolenaar      ])
27591966c248SBram Moolenaar  CheckScriptFailure([
27601966c248SBram Moolenaar      'vim9script',
27611966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
27621966c248SBram Moolenaar      ], 'E475:')
2763a72cfb80SBram Moolenaar
2764a72cfb80SBram Moolenaar  CheckScriptSuccess([
2765a72cfb80SBram Moolenaar      'vim9script',
2766a72cfb80SBram Moolenaar      'command Echo echo # comment',
2767a72cfb80SBram Moolenaar      'command Echo # comment',
27682d870f8dSBram Moolenaar      'delcommand Echo',
2769a72cfb80SBram Moolenaar      ])
2770a72cfb80SBram Moolenaar  CheckScriptFailure([
2771a72cfb80SBram Moolenaar      'vim9script',
2772a72cfb80SBram Moolenaar      'command Echo echo# comment',
2773a72cfb80SBram Moolenaar      'Echo',
2774f8103f27SBram Moolenaar      ], 'E1144:')
27752d870f8dSBram Moolenaar  delcommand Echo
277670249ee8SBram Moolenaar
277770249ee8SBram Moolenaar  var curdir = getcwd()
277870249ee8SBram Moolenaar  CheckScriptSuccess([
277970249ee8SBram Moolenaar      'command Echo cd " comment',
278070249ee8SBram Moolenaar      'Echo',
278170249ee8SBram Moolenaar      'delcommand Echo',
278270249ee8SBram Moolenaar      ])
278370249ee8SBram Moolenaar  CheckScriptSuccess([
2784090728adSBram Moolenaar      'vim9script',
278570249ee8SBram Moolenaar      'command Echo cd # comment',
278670249ee8SBram Moolenaar      'Echo',
278770249ee8SBram Moolenaar      'delcommand Echo',
278870249ee8SBram Moolenaar      ])
278970249ee8SBram Moolenaar  CheckScriptFailure([
279070249ee8SBram Moolenaar      'vim9script',
279170249ee8SBram Moolenaar      'command Echo cd " comment',
279270249ee8SBram Moolenaar      'Echo',
279370249ee8SBram Moolenaar      ], 'E344:')
279470249ee8SBram Moolenaar  delcommand Echo
279570249ee8SBram Moolenaar  chdir(curdir)
279670249ee8SBram Moolenaar
2797a72cfb80SBram Moolenaar  CheckScriptFailure([
2798a72cfb80SBram Moolenaar      'vim9script',
2799a72cfb80SBram Moolenaar      'command Echo# comment',
2800a72cfb80SBram Moolenaar      ], 'E182:')
2801a72cfb80SBram Moolenaar  CheckScriptFailure([
2802a72cfb80SBram Moolenaar      'vim9script',
2803a72cfb80SBram Moolenaar      'command Echo echo',
2804a72cfb80SBram Moolenaar      'command Echo# comment',
2805a72cfb80SBram Moolenaar      ], 'E182:')
28062d870f8dSBram Moolenaar  delcommand Echo
2807a72cfb80SBram Moolenaar
2808a72cfb80SBram Moolenaar  CheckScriptSuccess([
2809a72cfb80SBram Moolenaar      'vim9script',
2810a72cfb80SBram Moolenaar      'function # comment',
2811a72cfb80SBram Moolenaar      ])
2812a72cfb80SBram Moolenaar  CheckScriptFailure([
2813a72cfb80SBram Moolenaar      'vim9script',
28149898107fSBram Moolenaar      'function " comment',
28159898107fSBram Moolenaar      ], 'E129:')
28169898107fSBram Moolenaar  CheckScriptFailure([
28179898107fSBram Moolenaar      'vim9script',
2818a72cfb80SBram Moolenaar      'function# comment',
2819f8103f27SBram Moolenaar      ], 'E1144:')
2820a72cfb80SBram Moolenaar  CheckScriptSuccess([
2821a72cfb80SBram Moolenaar      'vim9script',
2822a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2823a72cfb80SBram Moolenaar      ])
2824a72cfb80SBram Moolenaar  CheckScriptFailure([
2825a72cfb80SBram Moolenaar      'vim9script',
2826a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2827a72cfb80SBram Moolenaar      ], 'E488:')
2828a72cfb80SBram Moolenaar
2829a72cfb80SBram Moolenaar  CheckScriptSuccess([
2830a72cfb80SBram Moolenaar      'vim9script',
28314c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2832a72cfb80SBram Moolenaar      'endfunc',
28334c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2834a72cfb80SBram Moolenaar      ])
2835a72cfb80SBram Moolenaar  CheckScriptFailure([
2836a72cfb80SBram Moolenaar      'vim9script',
28374c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2838a72cfb80SBram Moolenaar      'endfunc',
28394c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2840a72cfb80SBram Moolenaar      ], 'E488:')
2841a72cfb80SBram Moolenaar
2842a72cfb80SBram Moolenaar  CheckScriptSuccess([
2843a72cfb80SBram Moolenaar      'vim9script',
2844a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2845a72cfb80SBram Moolenaar      ])
2846a72cfb80SBram Moolenaar  CheckScriptFailure([
2847a72cfb80SBram Moolenaar      'vim9script',
2848a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2849a72cfb80SBram Moolenaar      ], 'E488:')
2850e7e4838fSBram Moolenaar
2851e7e4838fSBram Moolenaar  CheckScriptFailure([
2852e7e4838fSBram Moolenaar      'def Test() " comment',
2853e7e4838fSBram Moolenaar      'enddef',
2854e7e4838fSBram Moolenaar      ], 'E488:')
2855e7e4838fSBram Moolenaar  CheckScriptFailure([
2856e7e4838fSBram Moolenaar      'vim9script',
2857e7e4838fSBram Moolenaar      'def Test() " comment',
2858e7e4838fSBram Moolenaar      'enddef',
2859e7e4838fSBram Moolenaar      ], 'E488:')
2860e7e4838fSBram Moolenaar
2861e7e4838fSBram Moolenaar  CheckScriptSuccess([
2862e7e4838fSBram Moolenaar      'func Test() " comment',
2863e7e4838fSBram Moolenaar      'endfunc',
28642d870f8dSBram Moolenaar      'delfunc Test',
2865e7e4838fSBram Moolenaar      ])
28669898107fSBram Moolenaar  CheckScriptSuccess([
2867e7e4838fSBram Moolenaar      'vim9script',
2868e7e4838fSBram Moolenaar      'func Test() " comment',
2869e7e4838fSBram Moolenaar      'endfunc',
28709898107fSBram Moolenaar      ])
2871e7e4838fSBram Moolenaar
2872e7e4838fSBram Moolenaar  CheckScriptSuccess([
2873e7e4838fSBram Moolenaar      'def Test() # comment',
2874e7e4838fSBram Moolenaar      'enddef',
2875e7e4838fSBram Moolenaar      ])
2876e7e4838fSBram Moolenaar  CheckScriptFailure([
2877e7e4838fSBram Moolenaar      'func Test() # comment',
2878e7e4838fSBram Moolenaar      'endfunc',
2879e7e4838fSBram Moolenaar      ], 'E488:')
28802c5ed4e3SBram Moolenaarenddef
28812c5ed4e3SBram Moolenaar
28822c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
28832c5ed4e3SBram Moolenaar  CheckCanRunGui
28842c5ed4e3SBram Moolenaar
28852c5ed4e3SBram Moolenaar  CheckScriptFailure([
28862c5ed4e3SBram Moolenaar      'vim9script',
28872c5ed4e3SBram Moolenaar      'gui#comment'
2888f8103f27SBram Moolenaar      ], 'E1144:')
28892c5ed4e3SBram Moolenaar  CheckScriptFailure([
28902c5ed4e3SBram Moolenaar      'vim9script',
28912c5ed4e3SBram Moolenaar      'gui -f#comment'
28922c5ed4e3SBram Moolenaar      ], 'E499:')
28937a092245SBram Moolenaarenddef
28947a092245SBram Moolenaar
2895a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
28966797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
28976797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2898a26b9700SBram Moolenaar
2899a26b9700SBram Moolenaar  edit test.vim
2900a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2901a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2902a26b9700SBram Moolenaar
2903a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2904a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2905a26b9700SBram Moolenaar
2906a26b9700SBram Moolenaar  g:entered = 0
2907a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2908a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2909a26b9700SBram Moolenaar
2910a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2911a26b9700SBram Moolenaar
2912a26b9700SBram Moolenaar  au! TabEnter
2913a26b9700SBram Moolenaar  unlet g:entered
2914d72c1bf0SBram Moolenaar
2915d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2916d72c1bf0SBram Moolenaar      'vim9script',
29176797966dSBram Moolenaar      'g:var = 123',
2918e55b1c09SBram Moolenaar      'b:var = 456',
2919e55b1c09SBram Moolenaar      'w:var = 777',
2920e55b1c09SBram Moolenaar      't:var = 888',
2921d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2922d72c1bf0SBram Moolenaar      ])
2923d72c1bf0SBram Moolenaar
2924d72c1bf0SBram Moolenaar  CheckScriptFailure([
2925d72c1bf0SBram Moolenaar      'vim9script',
2926cfcd011fSBram Moolenaar      'let var = 123',
2927cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2928cfcd011fSBram Moolenaar
2929cfcd011fSBram Moolenaar  CheckScriptFailure([
2930cfcd011fSBram Moolenaar      'vim9script',
2931cfcd011fSBram Moolenaar      'var g:var = 123',
2932e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2933e55b1c09SBram Moolenaar
2934e55b1c09SBram Moolenaar  CheckScriptFailure([
2935e55b1c09SBram Moolenaar      'vim9script',
2936cfcd011fSBram Moolenaar      'var b:var = 123',
2937e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2938e55b1c09SBram Moolenaar
2939e55b1c09SBram Moolenaar  CheckScriptFailure([
2940e55b1c09SBram Moolenaar      'vim9script',
2941cfcd011fSBram Moolenaar      'var w:var = 123',
2942e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2943e55b1c09SBram Moolenaar
2944e55b1c09SBram Moolenaar  CheckScriptFailure([
2945e55b1c09SBram Moolenaar      'vim9script',
2946cfcd011fSBram Moolenaar      'var t:var = 123',
2947e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2948e55b1c09SBram Moolenaar
2949e55b1c09SBram Moolenaar  CheckScriptFailure([
2950e55b1c09SBram Moolenaar      'vim9script',
2951cfcd011fSBram Moolenaar      'var v:version = 123',
2952e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2953e55b1c09SBram Moolenaar
2954e55b1c09SBram Moolenaar  CheckScriptFailure([
2955e55b1c09SBram Moolenaar      'vim9script',
2956cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2957e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
29586797966dSBram Moolenaar
29596797966dSBram Moolenaar  CheckScriptFailure([
29606797966dSBram Moolenaar      'vim9script',
29616797966dSBram Moolenaar      'g:var = 123',
296232e35117SBram Moolenaar      'unlet g:var# comment1',
2963d72c1bf0SBram Moolenaar      ], 'E108:')
2964d72c1bf0SBram Moolenaar
2965d72c1bf0SBram Moolenaar  CheckScriptFailure([
2966d72c1bf0SBram Moolenaar      'let g:var = 123',
2967d72c1bf0SBram Moolenaar      'unlet g:var # something',
2968d72c1bf0SBram Moolenaar      ], 'E488:')
2969faac4104SBram Moolenaar
2970faac4104SBram Moolenaar  CheckScriptSuccess([
2971faac4104SBram Moolenaar      'vim9script',
297232e35117SBram Moolenaar      'if 1 # comment2',
2973faac4104SBram Moolenaar      '  echo "yes"',
2974faac4104SBram Moolenaar      'elseif 2 #comment',
2975faac4104SBram Moolenaar      '  echo "no"',
2976faac4104SBram Moolenaar      'endif',
2977faac4104SBram Moolenaar      ])
2978faac4104SBram Moolenaar
2979faac4104SBram Moolenaar  CheckScriptFailure([
2980faac4104SBram Moolenaar      'vim9script',
298132e35117SBram Moolenaar      'if 1# comment3',
2982faac4104SBram Moolenaar      '  echo "yes"',
2983faac4104SBram Moolenaar      'endif',
2984faac4104SBram Moolenaar      ], 'E15:')
2985faac4104SBram Moolenaar
2986faac4104SBram Moolenaar  CheckScriptFailure([
2987faac4104SBram Moolenaar      'vim9script',
298832e35117SBram Moolenaar      'if 0 # comment4',
2989faac4104SBram Moolenaar      '  echo "yes"',
2990faac4104SBram Moolenaar      'elseif 2#comment',
2991faac4104SBram Moolenaar      '  echo "no"',
2992faac4104SBram Moolenaar      'endif',
2993faac4104SBram Moolenaar      ], 'E15:')
2994faac4104SBram Moolenaar
2995faac4104SBram Moolenaar  CheckScriptSuccess([
2996faac4104SBram Moolenaar      'vim9script',
2997cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2998faac4104SBram Moolenaar      ])
2999faac4104SBram Moolenaar
3000faac4104SBram Moolenaar  CheckScriptFailure([
3001faac4104SBram Moolenaar      'vim9script',
3002cfcd011fSBram Moolenaar      'var v = 1# comment6',
300332e35117SBram Moolenaar      ], 'E15:')
3004faac4104SBram Moolenaar
3005faac4104SBram Moolenaar  CheckScriptSuccess([
3006faac4104SBram Moolenaar      'vim9script',
3007faac4104SBram Moolenaar      'new'
3008d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3009df069eecSBram Moolenaar      ':$',
3010faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3011faac4104SBram Moolenaar      'bwipe!',
3012faac4104SBram Moolenaar      ])
3013faac4104SBram Moolenaar
3014f5be8cdbSBram Moolenaar  CheckScriptFailure([
3015f5be8cdbSBram Moolenaar      'vim9script',
3016f5be8cdbSBram Moolenaar      'new'
3017d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3018f5be8cdbSBram Moolenaar      ':$',
3019f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3020f5be8cdbSBram Moolenaar      'bwipe!',
3021f5be8cdbSBram Moolenaar      ], 'E488:')
3022f5be8cdbSBram Moolenaar
3023f5be8cdbSBram Moolenaar  CheckScriptFailure([
3024f5be8cdbSBram Moolenaar      'vim9script',
3025f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3026f5be8cdbSBram Moolenaar      ], 'E477:')
3027a26b9700SBram Moolenaarenddef
3028a26b9700SBram Moolenaar
30297e5bd91dSBram Moolenaardef Test_finish()
3030cfcd011fSBram Moolenaar  var lines =<< trim END
30317e5bd91dSBram Moolenaar    vim9script
30326797966dSBram Moolenaar    g:res = 'one'
30337e5bd91dSBram Moolenaar    if v:false | finish | endif
30346797966dSBram Moolenaar    g:res = 'two'
30357e5bd91dSBram Moolenaar    finish
30366797966dSBram Moolenaar    g:res = 'three'
30377e5bd91dSBram Moolenaar  END
30387e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
30397e5bd91dSBram Moolenaar  source Xfinished
30407e5bd91dSBram Moolenaar  assert_equal('two', g:res)
30417e5bd91dSBram Moolenaar
30427e5bd91dSBram Moolenaar  unlet g:res
30437e5bd91dSBram Moolenaar  delete('Xfinished')
30447e5bd91dSBram Moolenaarenddef
30457e5bd91dSBram Moolenaar
3046a5d0077eSBram Moolenaardef Test_forward_declaration()
3047cfcd011fSBram Moolenaar  var lines =<< trim END
3048a5d0077eSBram Moolenaar    vim9script
3049a5d0077eSBram Moolenaar    def GetValue(): string
3050a5d0077eSBram Moolenaar      return theVal
3051a5d0077eSBram Moolenaar    enddef
3052cfcd011fSBram Moolenaar    var theVal = 'something'
3053822ba247SBram Moolenaar    g:initVal = GetValue()
3054a5d0077eSBram Moolenaar    theVal = 'else'
3055a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3056a5d0077eSBram Moolenaar  END
3057a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3058a5d0077eSBram Moolenaar  source Xforward
3059a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3060a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3061a5d0077eSBram Moolenaar
3062a5d0077eSBram Moolenaar  unlet g:initVal
3063a5d0077eSBram Moolenaar  unlet g:laterVal
3064a5d0077eSBram Moolenaar  delete('Xforward')
3065a5d0077eSBram Moolenaarenddef
3066a5d0077eSBram Moolenaar
30679721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3068a6294955SBram Moolenaar  var vim9_lines =<< trim END
3069a6294955SBram Moolenaar    vim9script
3070a6294955SBram Moolenaar    var local = 'local'
3071a6294955SBram Moolenaar    g:global = 'global'
3072a6294955SBram Moolenaar    export var exported = 'exported'
3073a6294955SBram Moolenaar    export def GetText(): string
3074a6294955SBram Moolenaar       return 'text'
3075a6294955SBram Moolenaar    enddef
3076a6294955SBram Moolenaar  END
3077a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3078a6294955SBram Moolenaar
3079cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
30809721fb4eSBram Moolenaar    source Xvim9_script.vim
30819721fb4eSBram Moolenaar
30829721fb4eSBram Moolenaar    call assert_false(exists('local'))
30839721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30849721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
30859721fb4eSBram Moolenaar    call assert_equal('global', global)
30869721fb4eSBram Moolenaar    call assert_equal('global', g:global)
30879721fb4eSBram Moolenaar
30889721fb4eSBram Moolenaar    " imported variable becomes script-local
30899721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
30909721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
30919721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30929721fb4eSBram Moolenaar
30939721fb4eSBram Moolenaar    " imported function becomes script-local
30949721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
30959721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
30969721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
30979721fb4eSBram Moolenaar  END
30989721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
30999721fb4eSBram Moolenaar
31009721fb4eSBram Moolenaar  source Xlegacy_script.vim
31019721fb4eSBram Moolenaar  assert_equal('global', g:global)
3102f5be8cdbSBram Moolenaar  unlet g:global
31039721fb4eSBram Moolenaar
31049721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
31059721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
31069721fb4eSBram Moolenaarenddef
3107a5d0077eSBram Moolenaar
31087d699701SBram Moolenaarfunc Test_vim9script_not_global()
31097d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
31107d699701SBram Moolenaar  let vim9lines =<< trim END
31117d699701SBram Moolenaar    vim9script
3112cfcd011fSBram Moolenaar    var name = 'local'
31137d699701SBram Moolenaar    func TheFunc()
31147d699701SBram Moolenaar      echo 'local'
31157d699701SBram Moolenaar    endfunc
31167d699701SBram Moolenaar    def DefFunc()
31177d699701SBram Moolenaar      echo 'local'
31187d699701SBram Moolenaar    enddef
31197d699701SBram Moolenaar  END
31207d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
31217d699701SBram Moolenaar  source Xvim9script.vim
31227d699701SBram Moolenaar  try
31237d699701SBram Moolenaar    echo g:var
31247d699701SBram Moolenaar    assert_report('did not fail')
31257d699701SBram Moolenaar  catch /E121:/
31267d699701SBram Moolenaar    " caught
31277d699701SBram Moolenaar  endtry
31287d699701SBram Moolenaar  try
31297d699701SBram Moolenaar    call TheFunc()
31307d699701SBram Moolenaar    assert_report('did not fail')
31317d699701SBram Moolenaar  catch /E117:/
31327d699701SBram Moolenaar    " caught
31337d699701SBram Moolenaar  endtry
31347d699701SBram Moolenaar  try
31357d699701SBram Moolenaar    call DefFunc()
31367d699701SBram Moolenaar    assert_report('did not fail')
31377d699701SBram Moolenaar  catch /E117:/
31387d699701SBram Moolenaar    " caught
31397d699701SBram Moolenaar  endtry
31407d699701SBram Moolenaar
314125859dd7SBram Moolenaar  call delete('Xvim9script.vim')
31427d699701SBram Moolenaarendfunc
31437d699701SBram Moolenaar
3144eeb27bfeSBram Moolenaardef Test_vim9_copen()
3145eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3146eeb27bfeSBram Moolenaar  copen
3147eeb27bfeSBram Moolenaar  quit
3148eeb27bfeSBram Moolenaarenddef
3149eeb27bfeSBram Moolenaar
315003290b84SBram Moolenaar" test using an auto-loaded function and variable
31512d6b20d6SBram Moolenaardef Test_vim9_autoload()
3152cfcd011fSBram Moolenaar  var lines =<< trim END
31532d6b20d6SBram Moolenaar     vim9script
315403290b84SBram Moolenaar     def some#gettest(): string
315503290b84SBram Moolenaar       return 'test'
315603290b84SBram Moolenaar     enddef
315703290b84SBram Moolenaar     g:some#name = 'name'
3158e3ffcd99SBram Moolenaar
3159e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3160e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3161e3ffcd99SBram Moolenaar     enddef
316203290b84SBram Moolenaar  END
316303290b84SBram Moolenaar
316403290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
316503290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
316603290b84SBram Moolenaar  var save_rtp = &rtp
316703290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
316803290b84SBram Moolenaar
316903290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
317003290b84SBram Moolenaar  assert_equal('name', g:some#name)
317103290b84SBram Moolenaar  g:some#other = 'other'
317203290b84SBram Moolenaar  assert_equal('other', g:some#other)
317303290b84SBram Moolenaar
3174e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3175e3ffcd99SBram Moolenaar
317617f700acSBram Moolenaar  # upper case script name works
317717f700acSBram Moolenaar  lines =<< trim END
317817f700acSBram Moolenaar     vim9script
317917f700acSBram Moolenaar     def Other#getOther(): string
318017f700acSBram Moolenaar       return 'other'
318117f700acSBram Moolenaar     enddef
318217f700acSBram Moolenaar  END
318317f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
318417f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
318517f700acSBram Moolenaar
318603290b84SBram Moolenaar  delete('Xdir', 'rf')
318703290b84SBram Moolenaar  &rtp = save_rtp
318803290b84SBram Moolenaarenddef
318903290b84SBram Moolenaar
319003290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
319103290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
319203290b84SBram Moolenaar  var lines =<< trim END
319303290b84SBram Moolenaar     vim9script
31942d6b20d6SBram Moolenaar     def foo#test()
31952d6b20d6SBram Moolenaar         echomsg getreg('"')
31962d6b20d6SBram Moolenaar     enddef
31972d6b20d6SBram Moolenaar  END
31982d6b20d6SBram Moolenaar
31992d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
32002d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3201cfcd011fSBram Moolenaar  var save_rtp = &rtp
32022d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
32032d6b20d6SBram Moolenaar  augroup test
32042d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
32052d6b20d6SBram Moolenaar  augroup END
32062d6b20d6SBram Moolenaar
32072d6b20d6SBram Moolenaar  normal Y
32082d6b20d6SBram Moolenaar
32092d6b20d6SBram Moolenaar  augroup test
32102d6b20d6SBram Moolenaar    autocmd!
32112d6b20d6SBram Moolenaar  augroup END
32122d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
32132d6b20d6SBram Moolenaar  &rtp = save_rtp
32142d6b20d6SBram Moolenaarenddef
32152d6b20d6SBram Moolenaar
321677e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
321777e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3218cfcd011fSBram Moolenaar  var lines =<< trim END
321977e5dcc3SBram Moolenaar      vim9script
322077e5dcc3SBram Moolenaar      def crash#func()
322177e5dcc3SBram Moolenaar          try
322277e5dcc3SBram Moolenaar              for x in List()
322377e5dcc3SBram Moolenaar              endfor
322477e5dcc3SBram Moolenaar          catch
322577e5dcc3SBram Moolenaar          endtry
322677e5dcc3SBram Moolenaar          g:ok = true
322777e5dcc3SBram Moolenaar      enddef
322877e5dcc3SBram Moolenaar      fu List()
322977e5dcc3SBram Moolenaar          invalid
323077e5dcc3SBram Moolenaar      endfu
323177e5dcc3SBram Moolenaar      try
323248e11c10SBram Moolenaar          alsoinvalid
323377e5dcc3SBram Moolenaar      catch /wontmatch/
323477e5dcc3SBram Moolenaar      endtry
323577e5dcc3SBram Moolenaar  END
323677e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
323777e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
323877e5dcc3SBram Moolenaar
323977e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
324077e5dcc3SBram Moolenaar  lines =<< trim END
324177e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
324277e5dcc3SBram Moolenaar    call crash#func()
324377e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
32449c4f5520SBram Moolenaar    qall!
324577e5dcc3SBram Moolenaar  END
324677e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
324777e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
324877e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
324977e5dcc3SBram Moolenaar
325077e5dcc3SBram Moolenaar  delete('Xdidit')
325177e5dcc3SBram Moolenaar  delete('Xscript')
325277e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
325303290b84SBram Moolenaar
325403290b84SBram Moolenaar  lines =<< trim END
325503290b84SBram Moolenaar    vim9script
325603290b84SBram Moolenaar    var foo#bar = 'asdf'
325703290b84SBram Moolenaar  END
325803290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
325977e5dcc3SBram Moolenaarenddef
326077e5dcc3SBram Moolenaar
326181e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
326281e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
326381e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3264cfcd011fSBram Moolenaar  var lines =<< trim END
326581e17fbeSBram Moolenaar    let s:counter = 1
326681e17fbeSBram Moolenaar    def s:Func()
326781e17fbeSBram Moolenaar      au! CursorHold
326881e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
326981e17fbeSBram Moolenaar    enddef
327081e17fbeSBram Moolenaar    call s:Func()
327181e17fbeSBram Moolenaar    doau CursorHold
327281e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
327381e17fbeSBram Moolenaar    au! CursorHold
327481e17fbeSBram Moolenaar  END
327581e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
327681e17fbeSBram Moolenaarenddef
327781e17fbeSBram Moolenaar
32783896a105SBram Moolenaardef Test_cmdline_win()
32793896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
32803896a105SBram Moolenaar  # the command line window.
32813896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3282cfcd011fSBram Moolenaar  var export_lines =<< trim END
32833896a105SBram Moolenaar    vim9script
3284cfcd011fSBram Moolenaar    export var That = 'yes'
32853896a105SBram Moolenaar  END
32863896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3287cfcd011fSBram Moolenaar  var import_lines =<< trim END
32883896a105SBram Moolenaar    vim9script
32893896a105SBram Moolenaar    import That from './Xexport.vim'
32903896a105SBram Moolenaar  END
32913896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3292cfcd011fSBram Moolenaar  var save_rtp = &rtp
32933896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
32943896a105SBram Moolenaar  syntax on
32953896a105SBram Moolenaar  augroup CmdWin
32963896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
32973896a105SBram Moolenaar  augroup END
32983896a105SBram Moolenaar  # this will open and also close the cmdline window
32993896a105SBram Moolenaar  feedkeys('q:', 'xt')
33003896a105SBram Moolenaar  assert_equal('yes', g:got_there)
33013896a105SBram Moolenaar
33023896a105SBram Moolenaar  augroup CmdWin
33033896a105SBram Moolenaar    au!
33043896a105SBram Moolenaar  augroup END
33053896a105SBram Moolenaar  &rtp = save_rtp
33063896a105SBram Moolenaar  delete('rtp', 'rf')
33073896a105SBram Moolenaarenddef
33083896a105SBram Moolenaar
3309e3d4685fSBram Moolenaardef Test_invalid_sid()
3310e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
331125859dd7SBram Moolenaar
33129c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3313d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3314e3d4685fSBram Moolenaar  endif
3315e3d4685fSBram Moolenaar  delete('Xdidit')
3316e3d4685fSBram Moolenaarenddef
3317e3d4685fSBram Moolenaar
33189ec7026fSBram Moolenaardef Test_restoring_cpo()
33199ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
33209ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
33219ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
33229ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
33239ec7026fSBram Moolenaar  endif
33249ec7026fSBram Moolenaar  delete('Xsourced')
33259ec7026fSBram Moolenaar  delete('Xclose')
3326090728adSBram Moolenaar  delete('Xdone')
33270123cc1eSBram Moolenaar
33280123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
33290123cc1eSBram Moolenaar  set cpo=aABceFsMny>
33300123cc1eSBram Moolenaar  edit XanotherScript
33310123cc1eSBram Moolenaar  so %
33320123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
33330123cc1eSBram Moolenaar  :1del
33340123cc1eSBram Moolenaar  w
33350123cc1eSBram Moolenaar  so %
33360123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
33370123cc1eSBram Moolenaar
33380123cc1eSBram Moolenaar  delete('XanotherScript')
33390123cc1eSBram Moolenaar  set cpo&vim
33409ec7026fSBram Moolenaarenddef
33419ec7026fSBram Moolenaar
3342*ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3343*ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
334437294bd6SBram Moolenaar  CheckScreendump
3345*ffb7dcdbSBram Moolenaar  CheckFeature timers
334637294bd6SBram Moolenaar
3347*ffb7dcdbSBram Moolenaar  let lines =<< trim END
334837294bd6SBram Moolenaar    vim9script
334937294bd6SBram Moolenaar    def script#func()
335037294bd6SBram Moolenaar    enddef
335137294bd6SBram Moolenaar  END
3352*ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3353*ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
335437294bd6SBram Moolenaar
3355*ffb7dcdbSBram Moolenaar  let lines =<< trim END
335637294bd6SBram Moolenaar      vim9script
335737294bd6SBram Moolenaar      set cpo+=M
335837294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
335937294bd6SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, () => script#func())
336037294bd6SBram Moolenaar      setline(1, 'some text')
336137294bd6SBram Moolenaar  END
3362*ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3363*ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3364*ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3365*ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
336637294bd6SBram Moolenaar
3367*ffb7dcdbSBram Moolenaar  " clean up
3368*ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3369*ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3370*ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3371*ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3372*ffb7dcdbSBram Moolenaarendfunc
337337294bd6SBram Moolenaar
33749ec7026fSBram Moolenaar
3375f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3376cfcd011fSBram Moolenaar  var lines =<< trim END
3377cfcd011fSBram Moolenaar    var name: any
3378cfcd011fSBram Moolenaar    assert_equal(0, name)
3379f0afd9e1SBram Moolenaar  END
3380f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3381f0afd9e1SBram Moolenaarenddef
3382f0afd9e1SBram Moolenaar
33837e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
338458dbef33SBram Moolenaar  CheckRunVimInTerminal
338558dbef33SBram Moolenaar
33867e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
33877e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
33887e9210eaSBram Moolenaarendfunc
33897e9210eaSBram Moolenaar
33907e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
33919c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3392cfcd011fSBram Moolenaar  var lines =<< trim END
33939c4f5520SBram Moolenaar    func CheckAndQuit()
33949c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
33959c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
33969c4f5520SBram Moolenaar    endfunc
33979c4f5520SBram Moolenaar  END
33989c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
33999c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3400e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
34019c4f5520SBram Moolenaar  # define Afunc() on the command line
34029c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
34039c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
34042949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
34059c4f5520SBram Moolenaar
34069c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
34079c4f5520SBram Moolenaar  delete('XcallFunc')
34089c4f5520SBram Moolenaar  delete('Xdidcmd')
34099c4f5520SBram Moolenaarenddef
34109c4f5520SBram Moolenaar
3411fcdc5d83SBram Moolenaardef Test_script_var_scope()
3412fcdc5d83SBram Moolenaar  var lines =<< trim END
3413fcdc5d83SBram Moolenaar      vim9script
3414fcdc5d83SBram Moolenaar      if true
3415fcdc5d83SBram Moolenaar        if true
3416fcdc5d83SBram Moolenaar          var one = 'one'
3417fcdc5d83SBram Moolenaar          echo one
3418fcdc5d83SBram Moolenaar        endif
3419fcdc5d83SBram Moolenaar        echo one
3420fcdc5d83SBram Moolenaar      endif
3421fcdc5d83SBram Moolenaar  END
3422fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3423fcdc5d83SBram Moolenaar
3424fcdc5d83SBram Moolenaar  lines =<< trim END
3425fcdc5d83SBram Moolenaar      vim9script
3426fcdc5d83SBram Moolenaar      if true
3427fcdc5d83SBram Moolenaar        if false
3428fcdc5d83SBram Moolenaar          var one = 'one'
3429fcdc5d83SBram Moolenaar          echo one
3430fcdc5d83SBram Moolenaar        else
3431fcdc5d83SBram Moolenaar          var one = 'one'
3432fcdc5d83SBram Moolenaar          echo one
3433fcdc5d83SBram Moolenaar        endif
3434fcdc5d83SBram Moolenaar        echo one
3435fcdc5d83SBram Moolenaar      endif
3436fcdc5d83SBram Moolenaar  END
3437fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3438fcdc5d83SBram Moolenaar
3439fcdc5d83SBram Moolenaar  lines =<< trim END
3440fcdc5d83SBram Moolenaar      vim9script
3441fcdc5d83SBram Moolenaar      while true
3442fcdc5d83SBram Moolenaar        var one = 'one'
3443fcdc5d83SBram Moolenaar        echo one
3444fcdc5d83SBram Moolenaar        break
3445fcdc5d83SBram Moolenaar      endwhile
3446fcdc5d83SBram Moolenaar      echo one
3447fcdc5d83SBram Moolenaar  END
3448fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3449fcdc5d83SBram Moolenaar
3450fcdc5d83SBram Moolenaar  lines =<< trim END
3451fcdc5d83SBram Moolenaar      vim9script
3452fcdc5d83SBram Moolenaar      for i in range(1)
3453fcdc5d83SBram Moolenaar        var one = 'one'
3454fcdc5d83SBram Moolenaar        echo one
3455fcdc5d83SBram Moolenaar      endfor
3456fcdc5d83SBram Moolenaar      echo one
3457fcdc5d83SBram Moolenaar  END
3458fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
34599becdf2bSBram Moolenaar
34609becdf2bSBram Moolenaar  lines =<< trim END
34619becdf2bSBram Moolenaar      vim9script
34629becdf2bSBram Moolenaar      {
34639becdf2bSBram Moolenaar        var one = 'one'
34649becdf2bSBram Moolenaar        assert_equal('one', one)
34659becdf2bSBram Moolenaar      }
34669becdf2bSBram Moolenaar      assert_false(exists('one'))
34679becdf2bSBram Moolenaar      assert_false(exists('s:one'))
34689becdf2bSBram Moolenaar  END
34699becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
34709becdf2bSBram Moolenaar
34719becdf2bSBram Moolenaar  lines =<< trim END
34729becdf2bSBram Moolenaar      vim9script
34739becdf2bSBram Moolenaar      {
34749becdf2bSBram Moolenaar        var one = 'one'
34759becdf2bSBram Moolenaar        echo one
34769becdf2bSBram Moolenaar      }
34779becdf2bSBram Moolenaar      echo one
34789becdf2bSBram Moolenaar  END
34799becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3480fcdc5d83SBram Moolenaarenddef
3481fcdc5d83SBram Moolenaar
3482352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3483352134bbSBram Moolenaar  var lines =<< trim END
3484352134bbSBram Moolenaar    vim9script
3485352134bbSBram Moolenaar    def Callback(...l: any)
3486352134bbSBram Moolenaar      try
3487352134bbSBram Moolenaar        var x: string
3488352134bbSBram Moolenaar        var y: string
3489352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3490352134bbSBram Moolenaar        [x, y] = ['']
3491352134bbSBram Moolenaar      catch
3492352134bbSBram Moolenaar        g:caught = 'yes'
3493352134bbSBram Moolenaar      endtry
3494352134bbSBram Moolenaar    enddef
3495e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3496352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3497352134bbSBram Moolenaar  END
3498352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3499352134bbSBram Moolenaar
3500352134bbSBram Moolenaar  unlet g:caught
3501352134bbSBram Moolenaarenddef
3502352134bbSBram Moolenaar
3503631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3504631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3505631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3506631e8f93SBram Moolenaar  endif
3507631e8f93SBram Moolenaar  var lines =<< trim END
3508631e8f93SBram Moolenaar      vim9script
3509631e8f93SBram Moolenaar      var source: list<number>
3510631e8f93SBram Moolenaar      def Out_cb(...l: any)
3511631e8f93SBram Moolenaar          eval [][0]
3512631e8f93SBram Moolenaar      enddef
3513631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3514631e8f93SBram Moolenaar          sleep 1m
3515631e8f93SBram Moolenaar          source += l
3516631e8f93SBram Moolenaar      enddef
3517e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
35186f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
35196f17a3f0SBram Moolenaar        sleep 10m
35206f17a3f0SBram Moolenaar      endwhile
3521206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3522206c2a6eSBram Moolenaar      sleep 100m
3523631e8f93SBram Moolenaar  END
3524631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3525631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3526631e8f93SBram Moolenaar  delete('Xdef')
3527631e8f93SBram Moolenaarenddef
3528631e8f93SBram Moolenaar
35294324d87aSBram Moolenaardef InvokeNormal()
35304324d87aSBram Moolenaar  exe "norm! :m+1\r"
35314324d87aSBram Moolenaarenddef
35324324d87aSBram Moolenaar
35334324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
35344324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
35354324d87aSBram Moolenaar  new
35364324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
35374324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
35384324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
35394324d87aSBram Moolenaar  xunmap <F3>
3540b5b9480eSBram Moolenaarenddef
3541b5b9480eSBram Moolenaar
3542b5b9480eSBram Moolenaardef Test_white_space_after_command()
3543b5b9480eSBram Moolenaar  var lines =<< trim END
3544b5b9480eSBram Moolenaar    exit_cb: Func})
3545b5b9480eSBram Moolenaar  END
3546b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3547f8103f27SBram Moolenaar
3548f8103f27SBram Moolenaar  lines =<< trim END
3549f8103f27SBram Moolenaar    e#
3550f8103f27SBram Moolenaar  END
3551f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
35524324d87aSBram Moolenaarenddef
35534324d87aSBram Moolenaar
35544aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
35554aab88d9SBram Moolenaar  var lines =<< trim END
35564aab88d9SBram Moolenaar      vim9script
35574aab88d9SBram Moolenaar      if exists('g:guard')
35584aab88d9SBram Moolenaar        finish
35594aab88d9SBram Moolenaar      endif
35604aab88d9SBram Moolenaar      g:guard = 1
35614aab88d9SBram Moolenaar      var name = 'thename'
35624aab88d9SBram Moolenaar      def g:GetName(): string
35634aab88d9SBram Moolenaar        return name
35644aab88d9SBram Moolenaar      enddef
35654aab88d9SBram Moolenaar      def g:SetName(arg: string)
35664aab88d9SBram Moolenaar        name = arg
35674aab88d9SBram Moolenaar      enddef
35684aab88d9SBram Moolenaar  END
35694aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
35704aab88d9SBram Moolenaar  so XscriptTwice.vim
35714aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
35724aab88d9SBram Moolenaar  g:SetName('newname')
35734aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
35744aab88d9SBram Moolenaar  so XscriptTwice.vim
35754aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
35764aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
35774aab88d9SBram Moolenaar
35784aab88d9SBram Moolenaar  delfunc g:GetName
35794aab88d9SBram Moolenaar  delfunc g:SetName
35804aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
35814aab88d9SBram Moolenaar  unlet g:guard
35824aab88d9SBram Moolenaarenddef
35834aab88d9SBram Moolenaar
35844aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
35854aab88d9SBram Moolenaar  var exportlines =<< trim END
35864aab88d9SBram Moolenaar      vim9script
35874aab88d9SBram Moolenaar      if exists('g:guard')
35884aab88d9SBram Moolenaar        finish
35894aab88d9SBram Moolenaar      endif
35904aab88d9SBram Moolenaar      g:guard = 1
35914aab88d9SBram Moolenaar      export var name = 'someName'
35924aab88d9SBram Moolenaar  END
35934aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
35944aab88d9SBram Moolenaar
35954aab88d9SBram Moolenaar  var lines =<< trim END
35964aab88d9SBram Moolenaar      vim9script
35974aab88d9SBram Moolenaar      import name from './XexportScript.vim'
35984aab88d9SBram Moolenaar      def g:GetName(): string
35994aab88d9SBram Moolenaar        return name
36004aab88d9SBram Moolenaar      enddef
36014aab88d9SBram Moolenaar  END
36024aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
36034aab88d9SBram Moolenaar  so XscriptImport.vim
36044aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
36054aab88d9SBram Moolenaar
36064aab88d9SBram Moolenaar  so XexportScript.vim
36074aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
36084aab88d9SBram Moolenaar
36094aab88d9SBram Moolenaar  delfunc g:GetName
36104aab88d9SBram Moolenaar  delete('XexportScript.vim')
36114aab88d9SBram Moolenaar  delete('XscriptImport.vim')
36124aab88d9SBram Moolenaar  unlet g:guard
36134aab88d9SBram Moolenaarenddef
36144aab88d9SBram Moolenaar
361510b9421fSBram Moolenaardef Test_unsupported_commands()
361610b9421fSBram Moolenaar  var lines =<< trim END
361710b9421fSBram Moolenaar      ka
361810b9421fSBram Moolenaar  END
361910b9421fSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1100:')
362010b9421fSBram Moolenaar
362110b9421fSBram Moolenaar  lines =<< trim END
3622ada1d870SBram Moolenaar      :1ka
3623ada1d870SBram Moolenaar  END
3624ada1d870SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E481:')
3625ada1d870SBram Moolenaar
3626ada1d870SBram Moolenaar  lines =<< trim END
362710b9421fSBram Moolenaar    t
362810b9421fSBram Moolenaar  END
362910b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
363010b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
363110b9421fSBram Moolenaar
363210b9421fSBram Moolenaar  lines =<< trim END
363310b9421fSBram Moolenaar    x
363410b9421fSBram Moolenaar  END
363510b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
363610b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
363710b9421fSBram Moolenaar
363810b9421fSBram Moolenaar  lines =<< trim END
363910b9421fSBram Moolenaar    xit
364010b9421fSBram Moolenaar  END
364110b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
364210b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
364310b9421fSBram Moolenaarenddef
364410b9421fSBram Moolenaar
3645585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3646585fea7bSBram Moolenaardef Test_substitute_cmd()
3647585fea7bSBram Moolenaar  new
3648585fea7bSBram Moolenaar  setline(1, 'something')
3649585fea7bSBram Moolenaar  :substitute(some(other(
3650585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3651585fea7bSBram Moolenaar  bwipe!
3652585fea7bSBram Moolenaar
3653f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3654cfcd011fSBram Moolenaar  var lines =<< trim END
3655585fea7bSBram Moolenaar    vim9script
3656585fea7bSBram Moolenaar    new
3657585fea7bSBram Moolenaar    setline(1, 'something')
3658585fea7bSBram Moolenaar    :substitute(some(other(
3659585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3660585fea7bSBram Moolenaar    bwipe!
3661585fea7bSBram Moolenaar  END
3662585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3663585fea7bSBram Moolenaar  source Xvim9lines
3664585fea7bSBram Moolenaar
3665585fea7bSBram Moolenaar  delete('Xvim9lines')
3666585fea7bSBram Moolenaarenddef
3667585fea7bSBram Moolenaar
36688a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3669