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
88a7d6542SBram Moolenaar
95d72ce69SBram Moolenaardef Test_range_only()
105d72ce69SBram Moolenaar  new
115d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
125d72ce69SBram Moolenaar  :/Blah/
135d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
14c2af0affSBram Moolenaar  bwipe!
15c2af0affSBram Moolenaar
16c2af0affSBram Moolenaar  # without range commands use current line
17c2af0affSBram Moolenaar  new
18c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
19c2af0affSBram Moolenaar  :2
20c2af0affSBram Moolenaar  print
21c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
22c2af0affSBram Moolenaar  :3
23c2af0affSBram Moolenaar  list
24c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
25b8554304SBram Moolenaar
26b8554304SBram Moolenaar  # missing command does not print the line
27b8554304SBram Moolenaar  var lines =<< trim END
28b8554304SBram Moolenaar    vim9script
29b8554304SBram Moolenaar    :1|
30b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
31b8554304SBram Moolenaar    :|
32b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
33b8554304SBram Moolenaar  END
34b8554304SBram Moolenaar  CheckScriptSuccess(lines)
35b8554304SBram Moolenaar
36c2af0affSBram Moolenaar  bwipe!
37025cb1caSBram Moolenaar
38025cb1caSBram Moolenaar  # won't generate anything
39025cb1caSBram Moolenaar  if false
40025cb1caSBram Moolenaar    :123
41025cb1caSBram Moolenaar  endif
425d72ce69SBram Moolenaarenddef
435d72ce69SBram Moolenaar
44a6e67e4fSBram Moolenaarlet g:alist = [7]
45a6e67e4fSBram Moolenaarlet g:astring = 'text'
46f0b9f43cSBram Moolenaarlet g:anumber = 123
476e587dcbSBram Moolenaar
484c17ad94SBram Moolenaardef Test_delfunction()
49f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
504c17ad94SBram Moolenaar  CheckScriptSuccess([
514c17ad94SBram Moolenaar      'vim9script',
524c17ad94SBram Moolenaar      'func CheckMe()',
534c17ad94SBram Moolenaar      '  return 123',
544c17ad94SBram Moolenaar      'endfunc',
554c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
564c17ad94SBram Moolenaar      ])
574c17ad94SBram Moolenaar
58f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
594c17ad94SBram Moolenaar  CheckScriptFailure([
604c17ad94SBram Moolenaar      'vim9script',
614c17ad94SBram Moolenaar      'func DeleteMe1()',
624c17ad94SBram Moolenaar      'endfunc',
634c17ad94SBram Moolenaar      'delfunction DeleteMe1',
644c17ad94SBram Moolenaar      ], 'E1084:')
654c17ad94SBram Moolenaar  CheckScriptFailure([
664c17ad94SBram Moolenaar      'vim9script',
674c17ad94SBram Moolenaar      'func DeleteMe2()',
684c17ad94SBram Moolenaar      'endfunc',
694c17ad94SBram Moolenaar      'def DoThat()',
704c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
714c17ad94SBram Moolenaar      'enddef',
724c17ad94SBram Moolenaar      'DoThat()',
734c17ad94SBram Moolenaar      ], 'E1084:')
744c17ad94SBram Moolenaar  CheckScriptFailure([
754c17ad94SBram Moolenaar      'vim9script',
764c17ad94SBram Moolenaar      'def DeleteMe3()',
774c17ad94SBram Moolenaar      'enddef',
784c17ad94SBram Moolenaar      'delfunction DeleteMe3',
794c17ad94SBram Moolenaar      ], 'E1084:')
804c17ad94SBram Moolenaar  CheckScriptFailure([
814c17ad94SBram Moolenaar      'vim9script',
824c17ad94SBram Moolenaar      'def DeleteMe4()',
834c17ad94SBram Moolenaar      'enddef',
844c17ad94SBram Moolenaar      'def DoThat()',
854c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
864c17ad94SBram Moolenaar      'enddef',
874c17ad94SBram Moolenaar      'DoThat()',
884c17ad94SBram Moolenaar      ], 'E1084:')
89925e9fd6SBram Moolenaar
90925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
91cfcd011fSBram Moolenaar  var lines =<< trim END
92925e9fd6SBram Moolenaar      vim9script
93925e9fd6SBram Moolenaar      def g:Global(): string
94925e9fd6SBram Moolenaar        return "yes"
95925e9fd6SBram Moolenaar      enddef
96925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
97925e9fd6SBram Moolenaar      def! g:Global(): string
98925e9fd6SBram Moolenaar        return "no"
99925e9fd6SBram Moolenaar      enddef
100925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
101925e9fd6SBram Moolenaar      delfunc g:Global
102925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
103925e9fd6SBram Moolenaar  END
104925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
105925e9fd6SBram Moolenaar
106925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
107925e9fd6SBram Moolenaar  lines =<< trim END
108925e9fd6SBram Moolenaar      vim9script
109925e9fd6SBram Moolenaar      func g:Global()
110925e9fd6SBram Moolenaar        return "yes"
111925e9fd6SBram Moolenaar      endfunc
112925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
113925e9fd6SBram Moolenaar      def! g:Global(): string
114925e9fd6SBram Moolenaar        return "no"
115925e9fd6SBram Moolenaar      enddef
116925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
117925e9fd6SBram Moolenaar      delfunc g:Global
118925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
119925e9fd6SBram Moolenaar  END
120925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
121925e9fd6SBram Moolenaar
122925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
123925e9fd6SBram Moolenaar  lines =<< trim END
124925e9fd6SBram Moolenaar      vim9script
125925e9fd6SBram Moolenaar      def g:Global(): string
126925e9fd6SBram Moolenaar        return "yes"
127925e9fd6SBram Moolenaar      enddef
128925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
129925e9fd6SBram Moolenaar      func! g:Global()
130925e9fd6SBram Moolenaar        return "no"
131925e9fd6SBram Moolenaar      endfunc
132925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
133925e9fd6SBram Moolenaar      delfunc g:Global
134925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
135925e9fd6SBram Moolenaar  END
136925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1374c17ad94SBram Moolenaarenddef
1384c17ad94SBram Moolenaar
13908052228SBram Moolenaardef Test_wrong_type()
140cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
143cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
144599c89c8SBram Moolenaar
145cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
146cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
14742a480bfSBram Moolenaar
148cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
149cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
150cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
151cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
152cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
153cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
154cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
155cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
156cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
157cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
158cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
159a0a9f43aSBram Moolenaar
160cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
161cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
16208052228SBram Moolenaarenddef
1638a7d6542SBram Moolenaar
16410c65860SBram Moolenaardef Test_script_wrong_type()
16510c65860SBram Moolenaar  var lines =<< trim END
16610c65860SBram Moolenaar      vim9script
16710c65860SBram Moolenaar      var s:dict: dict<string>
16810c65860SBram Moolenaar      s:dict['a'] = ['x']
16910c65860SBram Moolenaar  END
17010c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
17110c65860SBram Moolenaarenddef
17210c65860SBram Moolenaar
17308052228SBram Moolenaardef Test_const()
174cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
175cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
176cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
17730fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
17830fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
179dbeecb2bSBram Moolenaar
180cfcd011fSBram Moolenaar  var lines =<< trim END
18130fd8204SBram Moolenaar    final list = [1, 2, 3]
182dbeecb2bSBram Moolenaar    list[0] = 4
1830b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
18430fd8204SBram Moolenaar    const other = [5, 6, 7]
1850b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
18671abe482SBram Moolenaar
187cfcd011fSBram Moolenaar    var varlist = [7, 8]
18830fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
18971abe482SBram Moolenaar    varlist[0] = 77
19071abe482SBram Moolenaar    # TODO: does not work yet
19171abe482SBram Moolenaar    # constlist[1][1] = 88
192cfcd011fSBram Moolenaar    var cl = constlist[1]
19371abe482SBram Moolenaar    cl[1] = 88
19471abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
19571abe482SBram Moolenaar
196e0de171eSBram Moolenaar    var vardict = {five: 5, six: 6}
197e0de171eSBram Moolenaar    const constdict = {one: 1, two: vardict, three: 3}
19871abe482SBram Moolenaar    vardict['five'] = 55
19971abe482SBram Moolenaar    # TODO: does not work yet
20071abe482SBram Moolenaar    # constdict['two']['six'] = 66
201cfcd011fSBram Moolenaar    var cd = constdict['two']
20271abe482SBram Moolenaar    cd['six'] = 66
203e0de171eSBram Moolenaar    constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
204dbeecb2bSBram Moolenaar  END
205dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
20608052228SBram Moolenaarenddef
2078a7d6542SBram Moolenaar
2080b4c66c6SBram Moolenaardef Test_const_bang()
209cfcd011fSBram Moolenaar  var lines =<< trim END
21030fd8204SBram Moolenaar      const var = 234
2110b4c66c6SBram Moolenaar      var = 99
2120b4c66c6SBram Moolenaar  END
2130b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
2140b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
2150b4c66c6SBram Moolenaar
2160b4c66c6SBram Moolenaar  lines =<< trim END
21730fd8204SBram Moolenaar      const ll = [2, 3, 4]
2180b4c66c6SBram Moolenaar      ll[0] = 99
2190b4c66c6SBram Moolenaar  END
2200b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2210b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2220b4c66c6SBram Moolenaar
2230b4c66c6SBram Moolenaar  lines =<< trim END
22430fd8204SBram Moolenaar      const ll = [2, 3, 4]
2250b4c66c6SBram Moolenaar      ll[3] = 99
2260b4c66c6SBram Moolenaar  END
2270b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2280b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2290b4c66c6SBram Moolenaar
2300b4c66c6SBram Moolenaar  lines =<< trim END
231e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2320b4c66c6SBram Moolenaar      dd["one"] = 99
2330b4c66c6SBram Moolenaar  END
2340b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2350b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2360b4c66c6SBram Moolenaar
2370b4c66c6SBram Moolenaar  lines =<< trim END
238e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2390b4c66c6SBram Moolenaar      dd["three"] = 99
2400b4c66c6SBram Moolenaar  END
2410b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2420b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2430b4c66c6SBram Moolenaarenddef
2440b4c66c6SBram Moolenaar
245df069eecSBram Moolenaardef Test_range_no_colon()
246d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
247d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
248d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
249d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
250df069eecSBram Moolenaarenddef
251df069eecSBram Moolenaar
252df069eecSBram Moolenaar
2538a7d6542SBram Moolenaardef Test_block()
254cfcd011fSBram Moolenaar  var outer = 1
2558a7d6542SBram Moolenaar  {
256cfcd011fSBram Moolenaar    var inner = 2
2578a7d6542SBram Moolenaar    assert_equal(1, outer)
2588a7d6542SBram Moolenaar    assert_equal(2, inner)
2598a7d6542SBram Moolenaar  }
2608a7d6542SBram Moolenaar  assert_equal(1, outer)
2613f1e9f00SBram Moolenaar
2623f1e9f00SBram Moolenaar  {|echo 'yes'|}
2638a7d6542SBram Moolenaarenddef
2648a7d6542SBram Moolenaar
26508052228SBram Moolenaardef Test_block_failure()
266cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
26708052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
26808052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
26908052228SBram Moolenaarenddef
2708a7d6542SBram Moolenaar
271fbbcd003SBram Moolenaardef Test_block_local_vars()
272fbbcd003SBram Moolenaar  var lines =<< trim END
273fbbcd003SBram Moolenaar      vim9script
274ed234f24SBram Moolenaar      v:testing = 1
275fbbcd003SBram Moolenaar      if true
276ed234f24SBram Moolenaar        var text = ['hello']
277ed234f24SBram Moolenaar        def SayHello(): list<string>
278fbbcd003SBram Moolenaar          return text
279fbbcd003SBram Moolenaar        enddef
280fbbcd003SBram Moolenaar        def SetText(v: string)
281ed234f24SBram Moolenaar          text = [v]
282fbbcd003SBram Moolenaar        enddef
283fbbcd003SBram Moolenaar      endif
284fbbcd003SBram Moolenaar
285fbbcd003SBram Moolenaar      if true
286ed234f24SBram Moolenaar        var text = ['again']
287ed234f24SBram Moolenaar        def SayAgain(): list<string>
288fbbcd003SBram Moolenaar          return text
289fbbcd003SBram Moolenaar        enddef
290fbbcd003SBram Moolenaar      endif
291ed234f24SBram Moolenaar
292ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
293ed234f24SBram Moolenaar      test_garbagecollect_now()
294ed234f24SBram Moolenaar
295fbbcd003SBram Moolenaar      defcompile
296fbbcd003SBram Moolenaar
297ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
298ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
299fbbcd003SBram Moolenaar
300fbbcd003SBram Moolenaar      SetText('foobar')
301ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
302ed234f24SBram Moolenaar
303ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
304ed234f24SBram Moolenaar      qall!
305fbbcd003SBram Moolenaar  END
306ed234f24SBram Moolenaar
307ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
308ed234f24SBram Moolenaar  # context gets garbage collected.
309ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
310ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
311ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
312ed234f24SBram Moolenaar
313ed234f24SBram Moolenaar  delete('Xscript')
314ed234f24SBram Moolenaar  delete('Xdidit')
315fbbcd003SBram Moolenaarenddef
316fbbcd003SBram Moolenaar
31739ca4127SBram Moolenaardef Test_block_local_vars_with_func()
31839ca4127SBram Moolenaar  var lines =<< trim END
31939ca4127SBram Moolenaar      vim9script
32039ca4127SBram Moolenaar      if true
32139ca4127SBram Moolenaar        var foo = 'foo'
32239ca4127SBram Moolenaar        if true
32339ca4127SBram Moolenaar          var bar = 'bar'
32439ca4127SBram Moolenaar          def Func(): list<string>
32539ca4127SBram Moolenaar            return [foo, bar]
32639ca4127SBram Moolenaar          enddef
32739ca4127SBram Moolenaar        endif
32839ca4127SBram Moolenaar      endif
32939ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
33039ca4127SBram Moolenaar      # "foo" and "bar"
33139ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
33239ca4127SBram Moolenaar  END
33339ca4127SBram Moolenaar  CheckScriptSuccess(lines)
33439ca4127SBram Moolenaarenddef
33539ca4127SBram Moolenaar
336d032f34aSBram Moolenaarfunc g:NoSuchFunc()
337d032f34aSBram Moolenaar  echo 'none'
338d032f34aSBram Moolenaarendfunc
339d032f34aSBram Moolenaar
3409e1d9e34SBram Moolenaardef Test_try_catch_throw()
341cfcd011fSBram Moolenaar  var l = []
3427a092245SBram Moolenaar  try # comment
3438a7d6542SBram Moolenaar    add(l, '1')
3448a7d6542SBram Moolenaar    throw 'wrong'
3458a7d6542SBram Moolenaar    add(l, '2')
3467a092245SBram Moolenaar  catch # comment
3478a7d6542SBram Moolenaar    add(l, v:exception)
3487a092245SBram Moolenaar  finally # comment
3498a7d6542SBram Moolenaar    add(l, '3')
3507a092245SBram Moolenaar  endtry # comment
3518a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
35268d130c6SBram Moolenaar
353e859312eSBram Moolenaar  l = []
354e859312eSBram Moolenaar  try
355e859312eSBram Moolenaar    try
356e859312eSBram Moolenaar      add(l, '1')
357e859312eSBram Moolenaar      throw 'wrong'
358e859312eSBram Moolenaar      add(l, '2')
359e859312eSBram Moolenaar    catch /right/
360e859312eSBram Moolenaar      add(l, v:exception)
361e859312eSBram Moolenaar    endtry
362e859312eSBram Moolenaar  catch /wrong/
363e859312eSBram Moolenaar    add(l, 'caught')
364373863edSBram Moolenaar  fina
365e859312eSBram Moolenaar    add(l, 'finally')
366e859312eSBram Moolenaar  endtry
367e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
368e859312eSBram Moolenaar
369cfcd011fSBram Moolenaar  var n: number
37068d130c6SBram Moolenaar  try
37168d130c6SBram Moolenaar    n = l[3]
37268d130c6SBram Moolenaar  catch /E684:/
37368d130c6SBram Moolenaar    n = 99
37468d130c6SBram Moolenaar  endtry
37568d130c6SBram Moolenaar  assert_equal(99, n)
37668d130c6SBram Moolenaar
37769f7050cSBram Moolenaar  var done = 'no'
37869f7050cSBram Moolenaar  if 0
37969f7050cSBram Moolenaar    try | catch | endtry
38069f7050cSBram Moolenaar  else
38169f7050cSBram Moolenaar    done = 'yes'
38269f7050cSBram Moolenaar  endif
38369f7050cSBram Moolenaar  assert_equal('yes', done)
38469f7050cSBram Moolenaar
38569f7050cSBram Moolenaar  done = 'no'
38669f7050cSBram Moolenaar  if 1
38769f7050cSBram Moolenaar    done = 'yes'
38869f7050cSBram Moolenaar  else
38969f7050cSBram Moolenaar    try | catch | endtry
39069f7050cSBram Moolenaar    done = 'never'
39169f7050cSBram Moolenaar  endif
39269f7050cSBram Moolenaar  assert_equal('yes', done)
39369f7050cSBram Moolenaar
39469f7050cSBram Moolenaar  if 1
39569f7050cSBram Moolenaar  else
39669f7050cSBram Moolenaar    try | catch /pat/ | endtry
39769f7050cSBram Moolenaar    try | catch /pat/
39869f7050cSBram Moolenaar    endtry
39969f7050cSBram Moolenaar    try
40069f7050cSBram Moolenaar    catch /pat/ | endtry
40169f7050cSBram Moolenaar    try
40269f7050cSBram Moolenaar    catch /pat/
40369f7050cSBram Moolenaar    endtry
40469f7050cSBram Moolenaar  endif
40569f7050cSBram Moolenaar
40668d130c6SBram Moolenaar  try
407cc673e74SBram Moolenaar    # string slice returns a string, not a number
40868d130c6SBram Moolenaar    n = g:astring[3]
4095e654230SBram Moolenaar  catch /E1012:/
41068d130c6SBram Moolenaar    n = 77
41168d130c6SBram Moolenaar  endtry
41268d130c6SBram Moolenaar  assert_equal(77, n)
41368d130c6SBram Moolenaar
41468d130c6SBram Moolenaar  try
41568d130c6SBram Moolenaar    n = l[g:astring]
4165e654230SBram Moolenaar  catch /E1012:/
41756acb094SBram Moolenaar    n = 88
41868d130c6SBram Moolenaar  endtry
41956acb094SBram Moolenaar  assert_equal(88, n)
42068d130c6SBram Moolenaar
42168d130c6SBram Moolenaar  try
42268d130c6SBram Moolenaar    n = s:does_not_exist
42368d130c6SBram Moolenaar  catch /E121:/
424f0b9f43cSBram Moolenaar    n = 111
425f0b9f43cSBram Moolenaar  endtry
426f0b9f43cSBram Moolenaar  assert_equal(111, n)
427f0b9f43cSBram Moolenaar
428f0b9f43cSBram Moolenaar  try
429f0b9f43cSBram Moolenaar    n = g:does_not_exist
430f0b9f43cSBram Moolenaar  catch /E121:/
43168d130c6SBram Moolenaar    n = 121
43268d130c6SBram Moolenaar  endtry
43368d130c6SBram Moolenaar  assert_equal(121, n)
43468d130c6SBram Moolenaar
435e0de171eSBram Moolenaar  var d = {one: 1}
43668d130c6SBram Moolenaar  try
43768d130c6SBram Moolenaar    n = d[g:astring]
43868d130c6SBram Moolenaar  catch /E716:/
43968d130c6SBram Moolenaar    n = 222
44068d130c6SBram Moolenaar  endtry
44168d130c6SBram Moolenaar  assert_equal(222, n)
442f0b9f43cSBram Moolenaar
443f0b9f43cSBram Moolenaar  try
444f0b9f43cSBram Moolenaar    n = -g:astring
445f0b9f43cSBram Moolenaar  catch /E39:/
446f0b9f43cSBram Moolenaar    n = 233
447f0b9f43cSBram Moolenaar  endtry
448f0b9f43cSBram Moolenaar  assert_equal(233, n)
449f0b9f43cSBram Moolenaar
450f0b9f43cSBram Moolenaar  try
451f0b9f43cSBram Moolenaar    n = +g:astring
452f0b9f43cSBram Moolenaar  catch /E1030:/
453f0b9f43cSBram Moolenaar    n = 244
454f0b9f43cSBram Moolenaar  endtry
455f0b9f43cSBram Moolenaar  assert_equal(244, n)
456f0b9f43cSBram Moolenaar
457f0b9f43cSBram Moolenaar  try
458f0b9f43cSBram Moolenaar    n = +g:alist
459f0b9f43cSBram Moolenaar  catch /E745:/
460f0b9f43cSBram Moolenaar    n = 255
461f0b9f43cSBram Moolenaar  endtry
462f0b9f43cSBram Moolenaar  assert_equal(255, n)
463f0b9f43cSBram Moolenaar
464cfcd011fSBram Moolenaar  var nd: dict<any>
465f0b9f43cSBram Moolenaar  try
4662e5910bfSBram Moolenaar    nd = {[g:alist]: 1}
4672e5910bfSBram Moolenaar  catch /E1105:/
468f0b9f43cSBram Moolenaar    n = 266
469f0b9f43cSBram Moolenaar  endtry
470f0b9f43cSBram Moolenaar  assert_equal(266, n)
471f0b9f43cSBram Moolenaar
472f0b9f43cSBram Moolenaar  try
473f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
474f0b9f43cSBram Moolenaar  catch /E1093:/
475f0b9f43cSBram Moolenaar    n = 277
476f0b9f43cSBram Moolenaar  endtry
477f0b9f43cSBram Moolenaar  assert_equal(277, n)
478f0b9f43cSBram Moolenaar
479e859312eSBram Moolenaar  try
480e859312eSBram Moolenaar    &ts = g:astring
4815e654230SBram Moolenaar  catch /E1012:/
482e859312eSBram Moolenaar    n = 288
483e859312eSBram Moolenaar  endtry
484e859312eSBram Moolenaar  assert_equal(288, n)
485e859312eSBram Moolenaar
486e859312eSBram Moolenaar  try
487e859312eSBram Moolenaar    &backspace = 'asdf'
488e859312eSBram Moolenaar  catch /E474:/
489e859312eSBram Moolenaar    n = 299
490e859312eSBram Moolenaar  endtry
491e859312eSBram Moolenaar  assert_equal(299, n)
492e859312eSBram Moolenaar
493e859312eSBram Moolenaar  l = [1]
494e859312eSBram Moolenaar  try
495e859312eSBram Moolenaar    l[3] = 3
496e859312eSBram Moolenaar  catch /E684:/
497e859312eSBram Moolenaar    n = 300
498e859312eSBram Moolenaar  endtry
499e859312eSBram Moolenaar  assert_equal(300, n)
500e859312eSBram Moolenaar
501e859312eSBram Moolenaar  try
502e859312eSBram Moolenaar    unlet g:does_not_exist
503e859312eSBram Moolenaar  catch /E108:/
504e859312eSBram Moolenaar    n = 322
505e859312eSBram Moolenaar  endtry
506e859312eSBram Moolenaar  assert_equal(322, n)
507e859312eSBram Moolenaar
508e859312eSBram Moolenaar  try
5092bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
510e859312eSBram Moolenaar  catch /E721:/
511e859312eSBram Moolenaar    n = 333
512e859312eSBram Moolenaar  endtry
513e859312eSBram Moolenaar  assert_equal(333, n)
514e859312eSBram Moolenaar
515e859312eSBram Moolenaar  try
516e859312eSBram Moolenaar    l = DeletedFunc()
517e859312eSBram Moolenaar  catch /E933:/
518e859312eSBram Moolenaar    n = 344
519e859312eSBram Moolenaar  endtry
520e859312eSBram Moolenaar  assert_equal(344, n)
521d032f34aSBram Moolenaar
522d032f34aSBram Moolenaar  try
523d032f34aSBram Moolenaar    echo len(v:true)
524d032f34aSBram Moolenaar  catch /E701:/
525d032f34aSBram Moolenaar    n = 355
526d032f34aSBram Moolenaar  endtry
527d032f34aSBram Moolenaar  assert_equal(355, n)
528d032f34aSBram Moolenaar
529cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
530d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
531d032f34aSBram Moolenaar  try
532d032f34aSBram Moolenaar    echo P()
533d032f34aSBram Moolenaar  catch /E117:/
534d032f34aSBram Moolenaar    n = 366
535d032f34aSBram Moolenaar  endtry
536d032f34aSBram Moolenaar  assert_equal(366, n)
537d032f34aSBram Moolenaar
538d032f34aSBram Moolenaar  try
539d032f34aSBram Moolenaar    echo g:NoSuchFunc()
540d032f34aSBram Moolenaar  catch /E117:/
541d032f34aSBram Moolenaar    n = 377
542d032f34aSBram Moolenaar  endtry
543d032f34aSBram Moolenaar  assert_equal(377, n)
544d032f34aSBram Moolenaar
545d032f34aSBram Moolenaar  try
546d032f34aSBram Moolenaar    echo g:alist + 4
547d032f34aSBram Moolenaar  catch /E745:/
548d032f34aSBram Moolenaar    n = 388
549d032f34aSBram Moolenaar  endtry
550d032f34aSBram Moolenaar  assert_equal(388, n)
551d032f34aSBram Moolenaar
552d032f34aSBram Moolenaar  try
553d032f34aSBram Moolenaar    echo 4 + g:alist
554d032f34aSBram Moolenaar  catch /E745:/
555d032f34aSBram Moolenaar    n = 399
556d032f34aSBram Moolenaar  endtry
557d032f34aSBram Moolenaar  assert_equal(399, n)
558d032f34aSBram Moolenaar
559d032f34aSBram Moolenaar  try
560d032f34aSBram Moolenaar    echo g:alist.member
561d032f34aSBram Moolenaar  catch /E715:/
562d032f34aSBram Moolenaar    n = 400
563d032f34aSBram Moolenaar  endtry
564d032f34aSBram Moolenaar  assert_equal(400, n)
565d032f34aSBram Moolenaar
566d032f34aSBram Moolenaar  try
567d032f34aSBram Moolenaar    echo d.member
568d032f34aSBram Moolenaar  catch /E716:/
569d032f34aSBram Moolenaar    n = 411
570d032f34aSBram Moolenaar  endtry
571d032f34aSBram Moolenaar  assert_equal(411, n)
572d9d7789bSBram Moolenaar
573d9d7789bSBram Moolenaar  var counter = 0
574d9d7789bSBram Moolenaar  for i in range(4)
575d9d7789bSBram Moolenaar    try
576d9d7789bSBram Moolenaar      eval [][0]
577d9d7789bSBram Moolenaar    catch
578d9d7789bSBram Moolenaar    endtry
579d9d7789bSBram Moolenaar    counter += 1
580d9d7789bSBram Moolenaar  endfor
581d9d7789bSBram Moolenaar  assert_equal(4, counter)
5827e82c5f3SBram Moolenaar
5837e82c5f3SBram Moolenaar  # return in finally after empty catch
5847e82c5f3SBram Moolenaar  def ReturnInFinally(): number
5857e82c5f3SBram Moolenaar    try
5867e82c5f3SBram Moolenaar    finally
5877e82c5f3SBram Moolenaar      return 4
5887e82c5f3SBram Moolenaar    endtry
5897e82c5f3SBram Moolenaar    return 2
5907e82c5f3SBram Moolenaar  enddef
5917e82c5f3SBram Moolenaar  assert_equal(4, ReturnInFinally())
5928a7d6542SBram Moolenaarenddef
5938a7d6542SBram Moolenaar
5949cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
5959cb577a6SBram Moolenaar  # return in try block returns normally
5969cb577a6SBram Moolenaar  def ReturnInTry(): string
5979cb577a6SBram Moolenaar    try
5989cb577a6SBram Moolenaar      return '"some message"'
5999cb577a6SBram Moolenaar    catch
6009cb577a6SBram Moolenaar    endtry
6019cb577a6SBram Moolenaar    return 'not reached'
6029cb577a6SBram Moolenaar  enddef
6039cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
6049cb577a6SBram Moolenaarenddef
6059cb577a6SBram Moolenaar
6061430ceebSBram Moolenaardef Test_cnext_works_in_catch()
6071430ceebSBram Moolenaar  var lines =<< trim END
6081430ceebSBram Moolenaar      vim9script
6091430ceebSBram Moolenaar      au BufEnter * eval 0
6101430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
6111430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
6121430ceebSBram Moolenaar      var items = [
6131430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
6141430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
6151430ceebSBram Moolenaar        ]
6161430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
6171430ceebSBram Moolenaar      cwindow
6181430ceebSBram Moolenaar
6191430ceebSBram Moolenaar      def CnextOrCfirst()
6201430ceebSBram Moolenaar        # if cnext fails, cfirst is used
6211430ceebSBram Moolenaar        try
6221430ceebSBram Moolenaar          cnext
6231430ceebSBram Moolenaar        catch
6241430ceebSBram Moolenaar          cfirst
6251430ceebSBram Moolenaar        endtry
6261430ceebSBram Moolenaar      enddef
6271430ceebSBram Moolenaar
6281430ceebSBram Moolenaar      CnextOrCfirst()
6291430ceebSBram Moolenaar      CnextOrCfirst()
6301430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
6311430ceebSBram Moolenaar      qall
6321430ceebSBram Moolenaar  END
6331430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
6341430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
6351430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
6361430ceebSBram Moolenaar
6371430ceebSBram Moolenaar  delete('Xfile1')
6381430ceebSBram Moolenaar  delete('Xfile2')
6391430ceebSBram Moolenaar  delete('XCatchCnext')
6401430ceebSBram Moolenaar  delete('Xresult')
6411430ceebSBram Moolenaarenddef
6421430ceebSBram Moolenaar
6439e1d9e34SBram Moolenaardef Test_throw_skipped()
6449e1d9e34SBram Moolenaar  if 0
6459e1d9e34SBram Moolenaar    throw dontgethere
6469e1d9e34SBram Moolenaar  endif
6479e1d9e34SBram Moolenaarenddef
6489e1d9e34SBram Moolenaar
6498f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
6508f81b22eSBram Moolenaar  var lines =<< trim END
6518f81b22eSBram Moolenaar    vim9script
6528f81b22eSBram Moolenaar    def Func()
6538f81b22eSBram Moolenaar      throw 'error'
6548f81b22eSBram Moolenaar    enddef
6558f81b22eSBram Moolenaar    silent! Func()
6568f81b22eSBram Moolenaar  END
6578f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
6588f81b22eSBram Moolenaar  source XthrowSilenced
6598f81b22eSBram Moolenaar  delete('XthrowSilenced')
6608f81b22eSBram Moolenaarenddef
6618f81b22eSBram Moolenaar
662e859312eSBram Moolenaardef DeletedFunc(): list<any>
663e859312eSBram Moolenaar  return ['delete me']
664e859312eSBram Moolenaarenddef
665e859312eSBram Moolenaardefcompile
666e859312eSBram Moolenaardelfunc DeletedFunc
667e859312eSBram Moolenaar
668257cc5eeSBram Moolenaardef ThrowFromDef()
669a72cfb80SBram Moolenaar  throw "getout" # comment
670257cc5eeSBram Moolenaarenddef
671257cc5eeSBram Moolenaar
672257cc5eeSBram Moolenaarfunc CatchInFunc()
673257cc5eeSBram Moolenaar  try
674257cc5eeSBram Moolenaar    call ThrowFromDef()
675257cc5eeSBram Moolenaar  catch
676257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
677257cc5eeSBram Moolenaar  endtry
678257cc5eeSBram Moolenaarendfunc
679257cc5eeSBram Moolenaar
680257cc5eeSBram Moolenaardef CatchInDef()
681257cc5eeSBram Moolenaar  try
682257cc5eeSBram Moolenaar    ThrowFromDef()
683257cc5eeSBram Moolenaar  catch
684257cc5eeSBram Moolenaar    g:thrown_def = v:exception
685257cc5eeSBram Moolenaar  endtry
686257cc5eeSBram Moolenaarenddef
687257cc5eeSBram Moolenaar
688f575adffSBram Moolenaardef ReturnFinally(): string
689f575adffSBram Moolenaar  try
690f575adffSBram Moolenaar    return 'intry'
691373863edSBram Moolenaar  finall
692f575adffSBram Moolenaar    g:in_finally = 'finally'
693f575adffSBram Moolenaar  endtry
694f575adffSBram Moolenaar  return 'end'
695f575adffSBram Moolenaarenddef
696f575adffSBram Moolenaar
697257cc5eeSBram Moolenaardef Test_try_catch_nested()
698257cc5eeSBram Moolenaar  CatchInFunc()
699257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
700257cc5eeSBram Moolenaar
701257cc5eeSBram Moolenaar  CatchInDef()
702257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
703f575adffSBram Moolenaar
704f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
705f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
706f575adffSBram Moolenaarenddef
707f575adffSBram Moolenaar
7089939f57bSBram Moolenaardef TryOne(): number
7099939f57bSBram Moolenaar  try
7109939f57bSBram Moolenaar    return 0
7119939f57bSBram Moolenaar  catch
7129939f57bSBram Moolenaar  endtry
7139939f57bSBram Moolenaar  return 0
7149939f57bSBram Moolenaarenddef
7159939f57bSBram Moolenaar
7169939f57bSBram Moolenaardef TryTwo(n: number): string
7179939f57bSBram Moolenaar  try
718cfcd011fSBram Moolenaar    var x = {}
7199939f57bSBram Moolenaar  catch
7209939f57bSBram Moolenaar  endtry
7219939f57bSBram Moolenaar  return 'text'
7229939f57bSBram Moolenaarenddef
7239939f57bSBram Moolenaar
7249939f57bSBram Moolenaardef Test_try_catch_twice()
7259939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
7269939f57bSBram Moolenaarenddef
7279939f57bSBram Moolenaar
728f575adffSBram Moolenaardef Test_try_catch_match()
729cfcd011fSBram Moolenaar  var seq = 'a'
730f575adffSBram Moolenaar  try
731f575adffSBram Moolenaar    throw 'something'
732f575adffSBram Moolenaar  catch /nothing/
733f575adffSBram Moolenaar    seq ..= 'x'
734f575adffSBram Moolenaar  catch /some/
735f575adffSBram Moolenaar    seq ..= 'b'
736f575adffSBram Moolenaar  catch /asdf/
737f575adffSBram Moolenaar    seq ..= 'x'
738e8c4abbbSBram Moolenaar  catch ?a\?sdf?
739e8c4abbbSBram Moolenaar    seq ..= 'y'
740f575adffSBram Moolenaar  finally
741f575adffSBram Moolenaar    seq ..= 'c'
742f575adffSBram Moolenaar  endtry
743f575adffSBram Moolenaar  assert_equal('abc', seq)
744257cc5eeSBram Moolenaarenddef
745257cc5eeSBram Moolenaar
746e8c4abbbSBram Moolenaardef Test_try_catch_fails()
747d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
748d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
749d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
750d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
751d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
752d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
753d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
754d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
75513106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
756d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
757585fea7bSBram Moolenaar
758e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
759d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
760e8c4abbbSBram Moolenaarenddef
761e8c4abbbSBram Moolenaar
7627c5b3c03SBram Moolenaardef Try_catch_skipped()
7637c5b3c03SBram Moolenaar  var l = []
7647c5b3c03SBram Moolenaar  try
7657c5b3c03SBram Moolenaar  finally
7667c5b3c03SBram Moolenaar  endtry
7677c5b3c03SBram Moolenaar
7687c5b3c03SBram Moolenaar  if 1
7697c5b3c03SBram Moolenaar  else
7707c5b3c03SBram Moolenaar    try
7717c5b3c03SBram Moolenaar    endtry
7727c5b3c03SBram Moolenaar  endif
7737c5b3c03SBram Moolenaarenddef
7747c5b3c03SBram Moolenaar
7757c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
7767c5b3c03SBram Moolenaardef Test_try_catch_skipped()
7777c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
7787c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
7797c5b3c03SBram Moolenaarenddef
7807c5b3c03SBram Moolenaar
7817c5b3c03SBram Moolenaar
7827c5b3c03SBram Moolenaar
783006ad48bSBram Moolenaardef Test_throw_vimscript()
784f5be8cdbSBram Moolenaar  # only checks line continuation
785cfcd011fSBram Moolenaar  var lines =<< trim END
786006ad48bSBram Moolenaar      vim9script
787006ad48bSBram Moolenaar      try
788006ad48bSBram Moolenaar        throw 'one'
789006ad48bSBram Moolenaar              .. 'two'
790006ad48bSBram Moolenaar      catch
791006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
792006ad48bSBram Moolenaar      endtry
793006ad48bSBram Moolenaar  END
794006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
7951e021e63SBram Moolenaar
7961e021e63SBram Moolenaar  lines =<< trim END
7971e021e63SBram Moolenaar    vim9script
798352134bbSBram Moolenaar    @r = ''
7991e021e63SBram Moolenaar    def Func()
8001e021e63SBram Moolenaar      throw @r
8011e021e63SBram Moolenaar    enddef
8021e021e63SBram Moolenaar    var result = ''
8031e021e63SBram Moolenaar    try
8041e021e63SBram Moolenaar      Func()
8051e021e63SBram Moolenaar    catch /E1129:/
8061e021e63SBram Moolenaar      result = 'caught'
8071e021e63SBram Moolenaar    endtry
8081e021e63SBram Moolenaar    assert_equal('caught', result)
8091e021e63SBram Moolenaar  END
8101e021e63SBram Moolenaar  CheckScriptSuccess(lines)
811006ad48bSBram Moolenaarenddef
812006ad48bSBram Moolenaar
813ed677f55SBram Moolenaardef Test_error_in_nested_function()
81403dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
815cfcd011fSBram Moolenaar  var lines =<< trim END
816ed677f55SBram Moolenaar      vim9script
817ed677f55SBram Moolenaar      def Func()
818ed677f55SBram Moolenaar        Error()
819ed677f55SBram Moolenaar        g:test_var = 1
820ed677f55SBram Moolenaar      enddef
821ed677f55SBram Moolenaar      func Error() abort
822ed677f55SBram Moolenaar        eval [][0]
823ed677f55SBram Moolenaar      endfunc
824ed677f55SBram Moolenaar      Func()
825ed677f55SBram Moolenaar  END
826ed677f55SBram Moolenaar  g:test_var = 0
827ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
828ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
829ed677f55SBram Moolenaarenddef
830ed677f55SBram Moolenaar
83137c83711SBram Moolenaardef Test_cexpr_vimscript()
832f5be8cdbSBram Moolenaar  # only checks line continuation
83337c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
834cfcd011fSBram Moolenaar  var lines =<< trim END
83537c83711SBram Moolenaar      vim9script
83637c83711SBram Moolenaar      cexpr 'File'
83737c83711SBram Moolenaar                .. ' someFile' ..
83837c83711SBram Moolenaar                   ' line 19'
83937c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
84037c83711SBram Moolenaar  END
84137c83711SBram Moolenaar  CheckScriptSuccess(lines)
84237c83711SBram Moolenaar  set errorformat&
84337c83711SBram Moolenaarenddef
84437c83711SBram Moolenaar
845c9edd6b5SBram Moolenaardef Test_statusline_syntax()
846c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
847cfcd011fSBram Moolenaar  var lines =<< trim END
848c9edd6b5SBram Moolenaar      vim9script
849c9edd6b5SBram Moolenaar      func g:Status()
850c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
851c9edd6b5SBram Moolenaar      endfunc
852c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
853c9edd6b5SBram Moolenaar      redrawstatus
854c9edd6b5SBram Moolenaar      set laststatus statusline=
855c9edd6b5SBram Moolenaar  END
856c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
857c9edd6b5SBram Moolenaarenddef
858c9edd6b5SBram Moolenaar
859b209750bSBram Moolenaardef Test_list_vimscript()
860b209750bSBram Moolenaar  # checks line continuation and comments
861cfcd011fSBram Moolenaar  var lines =<< trim END
862b209750bSBram Moolenaar      vim9script
863cfcd011fSBram Moolenaar      var mylist = [
864b209750bSBram Moolenaar            'one',
865b209750bSBram Moolenaar            # comment
866b209750bSBram Moolenaar            'two', # empty line follows
867b209750bSBram Moolenaar
868b209750bSBram Moolenaar            'three',
869b209750bSBram Moolenaar            ]
870b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
871b209750bSBram Moolenaar  END
872b209750bSBram Moolenaar  CheckScriptSuccess(lines)
87366250c93SBram Moolenaar
87466250c93SBram Moolenaar  # check all lines from heredoc are kept
87566250c93SBram Moolenaar  lines =<< trim END
87666250c93SBram Moolenaar      # comment 1
87766250c93SBram Moolenaar      two
87866250c93SBram Moolenaar      # comment 3
87966250c93SBram Moolenaar
88066250c93SBram Moolenaar      five
88166250c93SBram Moolenaar      # comment 6
88266250c93SBram Moolenaar  END
88366250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
8844bce26bbSBram Moolenaar
8854bce26bbSBram Moolenaar  lines =<< trim END
8864bce26bbSBram Moolenaar    [{
8874bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
8884bce26bbSBram Moolenaar  END
8894bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
890b209750bSBram Moolenaarenddef
891b209750bSBram Moolenaar
8922a1381c3SBram Moolenaarif has('channel')
89340ee466cSBram Moolenaar  let someJob = test_null_job()
89440ee466cSBram Moolenaar
89540ee466cSBram Moolenaar  def FuncWithError()
89640ee466cSBram Moolenaar    echomsg g:someJob
89740ee466cSBram Moolenaar  enddef
89840ee466cSBram Moolenaar
89940ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
90040ee466cSBram Moolenaar    try
90140ee466cSBram Moolenaar      call FuncWithError()
90240ee466cSBram Moolenaar    catch
90340ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
90440ee466cSBram Moolenaar    endtry
90540ee466cSBram Moolenaar  endfunc
9062a1381c3SBram Moolenaarendif
90740ee466cSBram Moolenaar
9088a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
9098a7d6542SBram Moolenaar  vim9script
910cfcd011fSBram Moolenaar  var name: string = 'bob'
9118a7d6542SBram Moolenaar  def Concat(arg: string): string
9128a7d6542SBram Moolenaar    return name .. arg
9138a7d6542SBram Moolenaar  enddef
914227a69deSBram Moolenaar  g:result = Concat('bie')
915227a69deSBram Moolenaar  g:localname = name
9168a7d6542SBram Moolenaar
9178a7d6542SBram Moolenaar  export const CONST = 1234
918cfcd011fSBram Moolenaar  export var exported = 9876
919cfcd011fSBram Moolenaar  export var exp_name = 'John'
9208a7d6542SBram Moolenaar  export def Exported(): string
9218a7d6542SBram Moolenaar    return 'Exported'
9228a7d6542SBram Moolenaar  enddef
9230f2a5cc6SBram Moolenaar  export final theList = [1]
9248a7d6542SBram MoolenaarEND
9258a7d6542SBram Moolenaar
926b3ca9824SBram Moolenaardef Undo_export_script_lines()
927b3ca9824SBram Moolenaar  unlet g:result
928b3ca9824SBram Moolenaar  unlet g:localname
929b3ca9824SBram Moolenaarenddef
930b3ca9824SBram Moolenaar
9315269bd2aSBram Moolenaardef Test_vim9_import_export()
932cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
9338a7d6542SBram Moolenaar    vim9script
9348a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
9358a7d6542SBram Moolenaar    g:imported = exported
9366e587dcbSBram Moolenaar    exported += 3
9376e587dcbSBram Moolenaar    g:imported_added = exported
9388a7d6542SBram Moolenaar    g:imported_func = Exported()
9396e587dcbSBram Moolenaar
94040f4f7a4SBram Moolenaar    def GetExported(): string
941e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
94240f4f7a4SBram Moolenaar      return local_dict.ref()
94340f4f7a4SBram Moolenaar    enddef
94440f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
94540f4f7a4SBram Moolenaar
9466e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
9476e587dcbSBram Moolenaar    g:imported_name = exp_name
9486e587dcbSBram Moolenaar    exp_name ..= ' Doe'
9496e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
9505381c7a1SBram Moolenaar    g:imported_later = exported
9510f2a5cc6SBram Moolenaar
9520f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
9530f2a5cc6SBram Moolenaar    theList->add(2)
9540f2a5cc6SBram Moolenaar    assert_equal([1, 2], theList)
9558a7d6542SBram Moolenaar  END
9568a7d6542SBram Moolenaar
9578a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
9588a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
9598a7d6542SBram Moolenaar
9608a7d6542SBram Moolenaar  source Ximport.vim
9618a7d6542SBram Moolenaar
9628a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
9638a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
9648a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
9656e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
9665381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
9678a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
96840f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
9696e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
9706e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
9718a7d6542SBram Moolenaar  assert_false(exists('g:name'))
9728a7d6542SBram Moolenaar
973b3ca9824SBram Moolenaar  Undo_export_script_lines()
9748a7d6542SBram Moolenaar  unlet g:imported
9756e587dcbSBram Moolenaar  unlet g:imported_added
9765381c7a1SBram Moolenaar  unlet g:imported_later
9778a7d6542SBram Moolenaar  unlet g:imported_func
9786e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
9798a7d6542SBram Moolenaar  delete('Ximport.vim')
980f2d5c240SBram Moolenaar
9811c991144SBram Moolenaar  # similar, with line breaks
982cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
9831c991144SBram Moolenaar    vim9script
9841c991144SBram Moolenaar    import {
9851c991144SBram Moolenaar        exported,
9861c991144SBram Moolenaar        Exported,
9871c991144SBram Moolenaar        }
9881c991144SBram Moolenaar        from
9891c991144SBram Moolenaar        './Xexport.vim'
9901c991144SBram Moolenaar    g:imported = exported
9911c991144SBram Moolenaar    exported += 5
9921c991144SBram Moolenaar    g:imported_added = exported
9931c991144SBram Moolenaar    g:imported_func = Exported()
9941c991144SBram Moolenaar  END
9951c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
9961c991144SBram Moolenaar  source Ximport_lbr.vim
9971c991144SBram Moolenaar
9981c991144SBram Moolenaar  assert_equal(9876, g:imported)
9991c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
10001c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
10011c991144SBram Moolenaar
10021c991144SBram Moolenaar  # exported script not sourced again
10031c991144SBram Moolenaar  assert_false(exists('g:result'))
10041c991144SBram Moolenaar  unlet g:imported
10051c991144SBram Moolenaar  unlet g:imported_added
10061c991144SBram Moolenaar  unlet g:imported_func
10071c991144SBram Moolenaar  delete('Ximport_lbr.vim')
10081c991144SBram Moolenaar
10091c991144SBram Moolenaar  # import inside :def function
1010cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
10115381c7a1SBram Moolenaar    vim9script
10125381c7a1SBram Moolenaar    def ImportInDef()
10135381c7a1SBram Moolenaar      import exported from './Xexport.vim'
10145381c7a1SBram Moolenaar      g:imported = exported
10155381c7a1SBram Moolenaar      exported += 7
10165381c7a1SBram Moolenaar      g:imported_added = exported
10175381c7a1SBram Moolenaar    enddef
10185381c7a1SBram Moolenaar    ImportInDef()
10195381c7a1SBram Moolenaar  END
10205381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
10215381c7a1SBram Moolenaar  source Ximport2.vim
1022f5be8cdbSBram Moolenaar  # TODO: this should be 9879
10235381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
10245381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
10255381c7a1SBram Moolenaar  unlet g:imported
10265381c7a1SBram Moolenaar  unlet g:imported_added
10275381c7a1SBram Moolenaar  delete('Ximport2.vim')
10285381c7a1SBram Moolenaar
1029cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1030f2d5c240SBram Moolenaar    vim9script
1031f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1032f2d5c240SBram Moolenaar    def UseExport()
1033f2d5c240SBram Moolenaar      g:imported = Export.exported
1034f2d5c240SBram Moolenaar    enddef
1035f2d5c240SBram Moolenaar    UseExport()
1036f2d5c240SBram Moolenaar  END
1037f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1038f2d5c240SBram Moolenaar  source Ximport.vim
10395381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1040f2d5c240SBram Moolenaar
1041cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1042599c89c8SBram Moolenaar    vim9script
1043599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1044599c89c8SBram Moolenaar    def Func()
1045cfcd011fSBram Moolenaar      var dummy = 1
1046cfcd011fSBram Moolenaar      var imported = Export + dummy
1047599c89c8SBram Moolenaar    enddef
1048822ba247SBram Moolenaar    defcompile
1049599c89c8SBram Moolenaar  END
1050599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
105144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1052599c89c8SBram Moolenaar
1053cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1054599c89c8SBram Moolenaar    vim9script
1055599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1056599c89c8SBram Moolenaar    def Func()
1057cfcd011fSBram Moolenaar      var imported = Export . exported
1058599c89c8SBram Moolenaar    enddef
1059822ba247SBram Moolenaar    defcompile
1060599c89c8SBram Moolenaar  END
1061599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
106244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1063599c89c8SBram Moolenaar
1064a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1065a6294955SBram Moolenaar    vim9script
1066a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1067a6294955SBram Moolenaar    var some = 'other'
1068a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1069a6294955SBram Moolenaar    defcompile
1070a6294955SBram Moolenaar  END
1071a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1072a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1073a6294955SBram Moolenaar
1074cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1075599c89c8SBram Moolenaar    vim9script
1076599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1077599c89c8SBram Moolenaar    def Func()
1078cfcd011fSBram Moolenaar      var imported = Export.
1079599c89c8SBram Moolenaar    enddef
1080822ba247SBram Moolenaar    defcompile
1081599c89c8SBram Moolenaar  END
1082599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
108344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1084599c89c8SBram Moolenaar
1085cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
10861c991144SBram Moolenaar    vim9script
10871c991144SBram Moolenaar    import *
10881c991144SBram Moolenaar        as Export
10891c991144SBram Moolenaar        from
10901c991144SBram Moolenaar        './Xexport.vim'
10911c991144SBram Moolenaar    def UseExport()
10921c991144SBram Moolenaar      g:imported = Export.exported
10931c991144SBram Moolenaar    enddef
10941c991144SBram Moolenaar    UseExport()
10951c991144SBram Moolenaar  END
10961c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
10971c991144SBram Moolenaar  source Ximport.vim
10981c991144SBram Moolenaar  assert_equal(9883, g:imported)
10991c991144SBram Moolenaar
1100cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1101f2d5c240SBram Moolenaar    vim9script
1102f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1103f2d5c240SBram Moolenaar  END
1104f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
110544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1106f2d5c240SBram Moolenaar
1107f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1108cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1109fa29c8abSBram Moolenaar    vim9script
1110fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1111fa29c8abSBram Moolenaar  END
1112fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
111344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1114fa29c8abSBram Moolenaar
1115f5be8cdbSBram Moolenaar  # try to import something that is already defined
1116cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
11175269bd2aSBram Moolenaar    vim9script
1118cfcd011fSBram Moolenaar    var exported = 'something'
11195269bd2aSBram Moolenaar    import exported from './Xexport.vim'
11205269bd2aSBram Moolenaar  END
11215269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1122057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11235269bd2aSBram Moolenaar
1124f5be8cdbSBram Moolenaar  # try to import something that is already defined
11255269bd2aSBram Moolenaar  import_already_defined =<< trim END
11265269bd2aSBram Moolenaar    vim9script
1127cfcd011fSBram Moolenaar    var exported = 'something'
11285269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
11295269bd2aSBram Moolenaar  END
11305269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1131057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11325269bd2aSBram Moolenaar
1133f5be8cdbSBram Moolenaar  # try to import something that is already defined
11345269bd2aSBram Moolenaar  import_already_defined =<< trim END
11355269bd2aSBram Moolenaar    vim9script
1136cfcd011fSBram Moolenaar    var exported = 'something'
11375269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
11385269bd2aSBram Moolenaar  END
11395269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1140057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
11415269bd2aSBram Moolenaar
1142918a4249SBram Moolenaar  # try changing an imported const
1143918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1144918a4249SBram Moolenaar    vim9script
1145918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1146918a4249SBram Moolenaar    def Assign()
1147918a4249SBram Moolenaar      CONST = 987
1148918a4249SBram Moolenaar    enddef
1149918a4249SBram Moolenaar    defcompile
1150918a4249SBram Moolenaar  END
1151918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1152918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1153918a4249SBram Moolenaar
11540f2a5cc6SBram Moolenaar  # try changing an imported final
11550f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
11560f2a5cc6SBram Moolenaar    vim9script
11570f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
11580f2a5cc6SBram Moolenaar    def Assign()
11590f2a5cc6SBram Moolenaar      theList = [2]
11600f2a5cc6SBram Moolenaar    enddef
11610f2a5cc6SBram Moolenaar    defcompile
11620f2a5cc6SBram Moolenaar  END
11630f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
11640f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
11650f2a5cc6SBram Moolenaar
1166f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1167cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1168fa29c8abSBram Moolenaar    vim9script
1169fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1170fa29c8abSBram Moolenaar  END
1171fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
117244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1173fa29c8abSBram Moolenaar
1174cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1175fa29c8abSBram Moolenaar    vim9script
1176fa29c8abSBram Moolenaar    import name './Xexport.vim'
1177fa29c8abSBram Moolenaar  END
1178fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
117944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1180fa29c8abSBram Moolenaar
1181cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1182fa29c8abSBram Moolenaar    vim9script
1183fa29c8abSBram Moolenaar    import name from Xexport.vim
1184fa29c8abSBram Moolenaar  END
1185fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
118644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1187fa29c8abSBram Moolenaar
1188cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1189fa29c8abSBram Moolenaar    vim9script
1190fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1191fa29c8abSBram Moolenaar  END
1192fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
119344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1194fa29c8abSBram Moolenaar
1195cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1196fa29c8abSBram Moolenaar    vim9script
1197fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1198fa29c8abSBram Moolenaar  END
11995269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
120044d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1201fa29c8abSBram Moolenaar
1202f2d5c240SBram Moolenaar  delete('Ximport.vim')
12035269bd2aSBram Moolenaar  delete('Ximport3.vim')
12048a7d6542SBram Moolenaar  delete('Xexport.vim')
12058a7d6542SBram Moolenaar
1206f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1207750802b5SBram Moolenaar  set cpo&vi
1208cfcd011fSBram Moolenaar  var cpo_before = &cpo
1209cfcd011fSBram Moolenaar  var lines =<< trim END
1210750802b5SBram Moolenaar    vim9script
1211750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1212750802b5SBram Moolenaar  END
1213750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1214750802b5SBram Moolenaar  source Xvim9_script
1215750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1216750802b5SBram Moolenaar  set cpo&vim
1217750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1218750802b5SBram Moolenaar  delete('Xvim9_script')
1219750802b5SBram Moolenaarenddef
1220750802b5SBram Moolenaar
12210a84284eSBram Moolenaardef Test_import_as()
12220a84284eSBram Moolenaar  var export_lines =<< trim END
12230a84284eSBram Moolenaar    vim9script
12240a84284eSBram Moolenaar    export var one = 1
12250a84284eSBram Moolenaar    export var yes = 'yes'
12260a84284eSBram Moolenaar  END
12270a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
12280a84284eSBram Moolenaar
12290a84284eSBram Moolenaar  var import_lines =<< trim END
12300a84284eSBram Moolenaar    vim9script
12310a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
12320a84284eSBram Moolenaar    assert_equal(1, thatOne)
12330a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
12340a84284eSBram Moolenaar    assert_equal('yes', yesYes)
12350a84284eSBram Moolenaar  END
12360a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
12370a84284eSBram Moolenaar
12380a84284eSBram Moolenaar  import_lines =<< trim END
12390a84284eSBram Moolenaar    vim9script
12400a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
12410a84284eSBram Moolenaar    assert_equal(1, thatOne)
12420a84284eSBram Moolenaar    assert_equal('yes', yesYes)
12430a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
12440a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
12450a84284eSBram Moolenaar  END
12460a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
12470a84284eSBram Moolenaar
12480a84284eSBram Moolenaar  delete('XexportAs')
12490a84284eSBram Moolenaarenddef
12500a84284eSBram Moolenaar
1251803af686SBram Moolenaarfunc g:Trigger()
1252803af686SBram Moolenaar  source Ximport.vim
1253803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1254803af686SBram Moolenaarendfunc
1255803af686SBram Moolenaar
1256803af686SBram Moolenaardef Test_import_export_expr_map()
1257803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1258cfcd011fSBram Moolenaar  var export_lines =<< trim END
1259803af686SBram Moolenaar    vim9script
1260803af686SBram Moolenaar    export def That(): string
1261803af686SBram Moolenaar      return 'yes'
1262803af686SBram Moolenaar    enddef
1263803af686SBram Moolenaar  END
1264803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1265803af686SBram Moolenaar
1266cfcd011fSBram Moolenaar  var import_lines =<< trim END
1267803af686SBram Moolenaar    vim9script
1268803af686SBram Moolenaar    import That from './Xexport_that.vim'
1269803af686SBram Moolenaar    assert_equal('yes', That())
1270803af686SBram Moolenaar  END
1271803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1272803af686SBram Moolenaar
1273803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1274803af686SBram Moolenaar  feedkeys('trigger', "xt")
1275803af686SBram Moolenaar
1276730b2483SBram Moolenaar  delete('Xexport_that.vim')
1277803af686SBram Moolenaar  delete('Ximport.vim')
1278803af686SBram Moolenaar  nunmap trigger
1279803af686SBram Moolenaarenddef
1280803af686SBram Moolenaar
12818e1986e3SBram Moolenaardef Test_import_in_filetype()
12828e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
12838e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1284cfcd011fSBram Moolenaar  var export_lines =<< trim END
12858e1986e3SBram Moolenaar    vim9script
1286cfcd011fSBram Moolenaar    export var That = 'yes'
12878e1986e3SBram Moolenaar  END
1288730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
12898e1986e3SBram Moolenaar
1290cfcd011fSBram Moolenaar  var import_lines =<< trim END
12918e1986e3SBram Moolenaar    vim9script
1292730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
12938e1986e3SBram Moolenaar    assert_equal('yes', That)
12948e1986e3SBram Moolenaar    g:did_load_mytpe = 1
12958e1986e3SBram Moolenaar  END
12968e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
12978e1986e3SBram Moolenaar
1298cfcd011fSBram Moolenaar  var save_rtp = &rtp
12998e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
13008e1986e3SBram Moolenaar
13018e1986e3SBram Moolenaar  filetype plugin on
13028e1986e3SBram Moolenaar  copen
13038e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
13048e1986e3SBram Moolenaar
13058e1986e3SBram Moolenaar  quit!
1306730b2483SBram Moolenaar  delete('Xexport_ft.vim')
13078e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
13088e1986e3SBram Moolenaar  &rtp = save_rtp
13098e1986e3SBram Moolenaarenddef
13108e1986e3SBram Moolenaar
1311efa94447SBram Moolenaardef Test_use_import_in_mapping()
1312cfcd011fSBram Moolenaar  var lines =<< trim END
1313efa94447SBram Moolenaar      vim9script
1314efa94447SBram Moolenaar      export def Funcx()
1315efa94447SBram Moolenaar        g:result = 42
1316efa94447SBram Moolenaar      enddef
1317efa94447SBram Moolenaar  END
1318efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1319efa94447SBram Moolenaar  lines =<< trim END
1320efa94447SBram Moolenaar      vim9script
1321efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1322b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1323efa94447SBram Moolenaar  END
1324efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1325efa94447SBram Moolenaar
1326efa94447SBram Moolenaar  source Xmapscript.vim
1327b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1328efa94447SBram Moolenaar  assert_equal(42, g:result)
1329efa94447SBram Moolenaar
1330efa94447SBram Moolenaar  unlet g:result
1331efa94447SBram Moolenaar  delete('XsomeExport.vim')
1332efa94447SBram Moolenaar  delete('Xmapscript.vim')
1333b3ca9824SBram Moolenaar  nunmap <F3>
1334efa94447SBram Moolenaarenddef
1335efa94447SBram Moolenaar
1336d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1337d3f8a9eeSBram Moolenaar  var lines =<< trim END
1338d3f8a9eeSBram Moolenaar    if has(g:feature)
1339d3f8a9eeSBram Moolenaar      " legacy script
1340d3f8a9eeSBram Moolenaar      let g:legacy = 1
1341d3f8a9eeSBram Moolenaar      finish
1342d3f8a9eeSBram Moolenaar    endif
1343d3f8a9eeSBram Moolenaar    vim9script
1344d3f8a9eeSBram Moolenaar    g:legacy = 0
1345d3f8a9eeSBram Moolenaar  END
1346d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1347d3f8a9eeSBram Moolenaar  g:legacy = -1
1348d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1349d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1350d3f8a9eeSBram Moolenaar
1351d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1352d3f8a9eeSBram Moolenaar  g:legacy = -1
1353d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1354d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1355d3f8a9eeSBram Moolenaarenddef
1356d3f8a9eeSBram Moolenaar
1357750802b5SBram Moolenaardef Test_vim9script_fails()
13588a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
13598a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1360cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
13619721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1362cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1363750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1364750802b5SBram Moolenaar
1365cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1366c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1367c785b9a7SBram Moolenaar
1368e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1369e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
13708a7d6542SBram Moolenaarenddef
13718a7d6542SBram Moolenaar
1372f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1373101f4810SBram Moolenaar  CheckRunVimInTerminal
1374101f4810SBram Moolenaar
13759bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1376c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
13779bb3eb3eSBram Moolenaarendfunc
13789bb3eb3eSBram Moolenaar
1379c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1380cfcd011fSBram Moolenaar  var export =<< trim END
1381101f4810SBram Moolenaar    vim9script
1382101f4810SBram Moolenaar    export def Foo(): number
1383101f4810SBram Moolenaar        return 0
1384101f4810SBram Moolenaar    enddef
1385101f4810SBram Moolenaar  END
1386730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1387101f4810SBram Moolenaar
1388e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
13899bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
13902949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1391101f4810SBram Moolenaar
1392730b2483SBram Moolenaar  delete('XexportCmd.vim')
13939bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
13949bb3eb3eSBram Moolenaarenddef
1395101f4810SBram Moolenaar
13962b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
13972b32700dSBram Moolenaar  var lines =<< trim END
1398a6294955SBram Moolenaar    vim9script
1399a6294955SBram Moolenaar    export var exported = 'thexport'
1400a6294955SBram Moolenaar  END
1401a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1402a6294955SBram Moolenaar  lines =<< trim END
14032b32700dSBram Moolenaar    vim9script noclear
14042b32700dSBram Moolenaar    g:loadCount += 1
14052b32700dSBram Moolenaar    var s:reloaded = 'init'
1406a6294955SBram Moolenaar    import exported from './XExportReload'
14072b32700dSBram Moolenaar
14082b32700dSBram Moolenaar    def Again(): string
14092b32700dSBram Moolenaar      return 'again'
14102b32700dSBram Moolenaar    enddef
14112b32700dSBram Moolenaar
14122b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
14132b32700dSBram Moolenaar    var s:loaded = true
14142b32700dSBram Moolenaar
14152b32700dSBram Moolenaar    var s:notReloaded = 'yes'
14162b32700dSBram Moolenaar    s:reloaded = 'first'
14172b32700dSBram Moolenaar    def g:Values(): list<string>
1418a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
14192b32700dSBram Moolenaar    enddef
14202b32700dSBram Moolenaar
14212b32700dSBram Moolenaar    def Once(): string
14222b32700dSBram Moolenaar      return 'once'
14232b32700dSBram Moolenaar    enddef
14242b32700dSBram Moolenaar  END
14252b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
14262b32700dSBram Moolenaar  g:loadCount = 0
14272b32700dSBram Moolenaar  source XReloaded
14282b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1429a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
14302b32700dSBram Moolenaar  source XReloaded
14312b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1432a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
14332b32700dSBram Moolenaar  source XReloaded
14342b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1435a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
14362b32700dSBram Moolenaar
143748e11c10SBram Moolenaar  delete('XReloaded')
1438a6294955SBram Moolenaar  delete('XExportReload')
14392b32700dSBram Moolenaar  delfunc g:Values
14402b32700dSBram Moolenaar  unlet g:loadCount
14412b32700dSBram Moolenaarenddef
14422b32700dSBram Moolenaar
14434c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1444cfcd011fSBram Moolenaar  var lines =<< trim END
14458a7d6542SBram Moolenaar    vim9script
14468a7d6542SBram Moolenaar    const var = ''
1447cfcd011fSBram Moolenaar    var valone = 1234
14488a7d6542SBram Moolenaar    def MyFunc(arg: string)
14498a7d6542SBram Moolenaar       valone = 5678
14508a7d6542SBram Moolenaar    enddef
14518a7d6542SBram Moolenaar  END
1452cfcd011fSBram Moolenaar  var morelines =<< trim END
1453cfcd011fSBram Moolenaar    var valtwo = 222
14548a7d6542SBram Moolenaar    export def GetValtwo(): number
14558a7d6542SBram Moolenaar      return valtwo
14568a7d6542SBram Moolenaar    enddef
14578a7d6542SBram Moolenaar  END
145803afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
14598a7d6542SBram Moolenaar  source Xreload.vim
14608a7d6542SBram Moolenaar  source Xreload.vim
14618a7d6542SBram Moolenaar  source Xreload.vim
14628a7d6542SBram Moolenaar
1463cfcd011fSBram Moolenaar  var testlines =<< trim END
14648a7d6542SBram Moolenaar    vim9script
14658a7d6542SBram Moolenaar    def TheFunc()
14668a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
14678a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
14688a7d6542SBram Moolenaar    enddef
14698a7d6542SBram Moolenaar    TheFunc()
14708a7d6542SBram Moolenaar  END
14718a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
14728a7d6542SBram Moolenaar  source Ximport.vim
14738a7d6542SBram Moolenaar
1474f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1475f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
14768a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
14778a7d6542SBram Moolenaar  source Ximport.vim
14788a7d6542SBram Moolenaar
1479f5be8cdbSBram Moolenaar  # cannot declare a var twice
14808a7d6542SBram Moolenaar  lines =<< trim END
14818a7d6542SBram Moolenaar    vim9script
1482cfcd011fSBram Moolenaar    var valone = 1234
1483cfcd011fSBram Moolenaar    var valone = 5678
14848a7d6542SBram Moolenaar  END
14858a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
148644d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
14878a7d6542SBram Moolenaar
14888a7d6542SBram Moolenaar  delete('Xreload.vim')
14898a7d6542SBram Moolenaar  delete('Ximport.vim')
14908a7d6542SBram Moolenaarenddef
14918a7d6542SBram Moolenaar
149207a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
149307a65d26SBram Moolenaar" compiled function using that variable must fail.
149407a65d26SBram Moolenaardef Test_script_reload_change_type()
149507a65d26SBram Moolenaar  var lines =<< trim END
149607a65d26SBram Moolenaar    vim9script noclear
149707a65d26SBram Moolenaar    var str = 'string'
149807a65d26SBram Moolenaar    def g:GetStr(): string
149907a65d26SBram Moolenaar      return str .. 'xxx'
150007a65d26SBram Moolenaar    enddef
150107a65d26SBram Moolenaar  END
150207a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
150307a65d26SBram Moolenaar  source Xreload.vim
150407a65d26SBram Moolenaar  echo g:GetStr()
150507a65d26SBram Moolenaar
150607a65d26SBram Moolenaar  lines =<< trim END
150707a65d26SBram Moolenaar    vim9script noclear
150807a65d26SBram Moolenaar    var str = 1234
150907a65d26SBram Moolenaar  END
151007a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
151107a65d26SBram Moolenaar  source Xreload.vim
151207a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
151307a65d26SBram Moolenaar
151407a65d26SBram Moolenaar  delfunc g:GetStr
151507a65d26SBram Moolenaar  delete('Xreload.vim')
151607a65d26SBram Moolenaarenddef
151707a65d26SBram Moolenaar
15186c3843caSBram Moolenaardef Test_script_var_shadows_function()
15196c3843caSBram Moolenaar  var lines =<< trim END
15206c3843caSBram Moolenaar      vim9script
15216c3843caSBram Moolenaar      def Func(): number
15226c3843caSBram Moolenaar        return 123
15236c3843caSBram Moolenaar      enddef
15246c3843caSBram Moolenaar      var Func = 1
15256c3843caSBram Moolenaar  END
15266c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
15276c3843caSBram Moolenaarenddef
15286c3843caSBram Moolenaar
152995006e3dSBram Moolenaardef s:RetSome(): string
153095006e3dSBram Moolenaar  return 'some'
153195006e3dSBram Moolenaarenddef
153295006e3dSBram Moolenaar
1533fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1534fe465a01SBram Moolenaar" script-local name.
1535fe465a01SBram Moolenaardef Test_vim9script_funcref()
1536cfcd011fSBram Moolenaar  var sortlines =<< trim END
1537fe465a01SBram Moolenaar      vim9script
1538fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1539bed36b93SBram Moolenaar        return i2 - i1
1540fe465a01SBram Moolenaar      enddef
1541fe465a01SBram Moolenaar
1542fe465a01SBram Moolenaar      export def FastSort(): list<number>
1543fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1544fe465a01SBram Moolenaar      enddef
1545fe465a01SBram Moolenaar  END
1546fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1547fe465a01SBram Moolenaar
1548cfcd011fSBram Moolenaar  var lines =<< trim END
1549fe465a01SBram Moolenaar    vim9script
1550fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1551fe465a01SBram Moolenaar    def Test()
1552fe465a01SBram Moolenaar      g:result = FastSort()
1553fe465a01SBram Moolenaar    enddef
1554fe465a01SBram Moolenaar    Test()
1555fe465a01SBram Moolenaar  END
1556fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1557fe465a01SBram Moolenaar
1558fe465a01SBram Moolenaar  source Xscript.vim
1559fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1560fe465a01SBram Moolenaar
1561fe465a01SBram Moolenaar  unlet g:result
1562fe465a01SBram Moolenaar  delete('Xsort.vim')
1563fe465a01SBram Moolenaar  delete('Xscript.vim')
156495006e3dSBram Moolenaar
1565cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
156695006e3dSBram Moolenaar  assert_equal('some', Funcref())
1567fe465a01SBram Moolenaarenddef
1568fe465a01SBram Moolenaar
1569601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1570601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1571601e76acSBram Moolenaar" function reference.
1572c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1573cfcd011fSBram Moolenaar  var filterLines =<< trim END
1574c620c055SBram Moolenaar    vim9script
1575c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1576c620c055SBram Moolenaar      return idx % 2 == 1
1577c620c055SBram Moolenaar    enddef
1578c620c055SBram Moolenaar    export def FastFilter(): list<number>
1579c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1580c620c055SBram Moolenaar    enddef
1581601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1582601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1583601e76acSBram Moolenaar    enddef
1584c620c055SBram Moolenaar  END
1585c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1586c620c055SBram Moolenaar
1587cfcd011fSBram Moolenaar  var lines =<< trim END
1588c620c055SBram Moolenaar    vim9script
1589601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1590c620c055SBram Moolenaar    def Test()
1591cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1592c620c055SBram Moolenaar    enddef
1593c620c055SBram Moolenaar    Test()
1594601e76acSBram Moolenaar    def TestDirect()
1595cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1596601e76acSBram Moolenaar    enddef
1597601e76acSBram Moolenaar    TestDirect()
1598c620c055SBram Moolenaar  END
1599601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1600c620c055SBram Moolenaar  delete('Xfilter.vim')
1601c620c055SBram Moolenaarenddef
1602c620c055SBram Moolenaar
16034c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1604cfcd011fSBram Moolenaar  var first_lines =<< trim END
16054c17ad94SBram Moolenaar    vim9script
16064c17ad94SBram Moolenaar    def FuncYes(): string
16074c17ad94SBram Moolenaar      return 'yes'
16084c17ad94SBram Moolenaar    enddef
16094c17ad94SBram Moolenaar  END
1610cfcd011fSBram Moolenaar  var withno_lines =<< trim END
16114c17ad94SBram Moolenaar    def FuncNo(): string
16124c17ad94SBram Moolenaar      return 'no'
16134c17ad94SBram Moolenaar    enddef
16144c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
16154c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
16164c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
161703afdcf1SBram Moolenaar    enddef
161803afdcf1SBram Moolenaar  END
1619cfcd011fSBram Moolenaar  var nono_lines =<< trim END
162003afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
162103afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
162244d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
16234c17ad94SBram Moolenaar    enddef
16244c17ad94SBram Moolenaar  END
16254c17ad94SBram Moolenaar
16264c17ad94SBram Moolenaar  # FuncNo() is defined
162703afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16284c17ad94SBram Moolenaar  source Xreloaded.vim
16294c17ad94SBram Moolenaar  g:DoCheck(true)
16304c17ad94SBram Moolenaar
16314c17ad94SBram Moolenaar  # FuncNo() is not redefined
163203afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
16334c17ad94SBram Moolenaar  source Xreloaded.vim
16345082471fSBram Moolenaar  g:DoCheck(false)
16354c17ad94SBram Moolenaar
16364c17ad94SBram Moolenaar  # FuncNo() is back
163703afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
16384c17ad94SBram Moolenaar  source Xreloaded.vim
16395082471fSBram Moolenaar  g:DoCheck(false)
16404c17ad94SBram Moolenaar
16414c17ad94SBram Moolenaar  delete('Xreloaded.vim')
16424c17ad94SBram Moolenaarenddef
16434c17ad94SBram Moolenaar
164489483d40SBram Moolenaardef Test_vim9script_reload_delvar()
164589483d40SBram Moolenaar  # write the script with a script-local variable
1646cfcd011fSBram Moolenaar  var lines =<< trim END
164789483d40SBram Moolenaar    vim9script
1648cfcd011fSBram Moolenaar    var name = 'string'
164989483d40SBram Moolenaar  END
165089483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
165189483d40SBram Moolenaar  source XreloadVar.vim
165289483d40SBram Moolenaar
165389483d40SBram Moolenaar  # now write the script using the same variable locally - works
165489483d40SBram Moolenaar  lines =<< trim END
165589483d40SBram Moolenaar    vim9script
165689483d40SBram Moolenaar    def Func()
1657cfcd011fSBram Moolenaar      var name = 'string'
165889483d40SBram Moolenaar    enddef
165989483d40SBram Moolenaar  END
166089483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
166189483d40SBram Moolenaar  source XreloadVar.vim
166289483d40SBram Moolenaar
166389483d40SBram Moolenaar  delete('XreloadVar.vim')
166489483d40SBram Moolenaarenddef
166589483d40SBram Moolenaar
16668a7d6542SBram Moolenaardef Test_import_absolute()
1667cfcd011fSBram Moolenaar  var import_lines = [
1668e6085c53SBram Moolenaar        'vim9script',
1669e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1670e6085c53SBram Moolenaar        'def UseExported()',
1671e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1672e6085c53SBram Moolenaar        '  exported = 8888',
1673e6085c53SBram Moolenaar        '  g:imported_after = exported',
1674e6085c53SBram Moolenaar        'enddef',
1675e6085c53SBram Moolenaar        'UseExported()',
1676e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1677e6085c53SBram Moolenaar        ]
16788a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
16798a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
16808a7d6542SBram Moolenaar
16818a7d6542SBram Moolenaar  source Ximport_abs.vim
16828a7d6542SBram Moolenaar
16838a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
16844e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1685fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1686fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1687fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1688fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1689fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1690fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1691fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1692fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1693fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1694fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1695e6085c53SBram Moolenaar        g:import_disassembled)
1696b3ca9824SBram Moolenaar
1697b3ca9824SBram Moolenaar  Undo_export_script_lines()
16988a7d6542SBram Moolenaar  unlet g:imported_abs
16994e12a5dfSBram Moolenaar  unlet g:import_disassembled
17008a7d6542SBram Moolenaar
17018a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
17028a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
17038a7d6542SBram Moolenaarenddef
17048a7d6542SBram Moolenaar
17058a7d6542SBram Moolenaardef Test_import_rtp()
1706cfcd011fSBram Moolenaar  var import_lines = [
1707e6085c53SBram Moolenaar        'vim9script',
1708e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1709e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1710e6085c53SBram Moolenaar        ]
17118a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
17128a7d6542SBram Moolenaar  mkdir('import')
17138a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
17148a7d6542SBram Moolenaar
1715cfcd011fSBram Moolenaar  var save_rtp = &rtp
17168a7d6542SBram Moolenaar  &rtp = getcwd()
17178a7d6542SBram Moolenaar  source Ximport_rtp.vim
17188a7d6542SBram Moolenaar  &rtp = save_rtp
17198a7d6542SBram Moolenaar
17208a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
17218a7d6542SBram Moolenaar
1722b3ca9824SBram Moolenaar  Undo_export_script_lines()
1723b3ca9824SBram Moolenaar  unlet g:imported_rtp
17248a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
172589483d40SBram Moolenaar  delete('import', 'rf')
17268a7d6542SBram Moolenaarenddef
17278a7d6542SBram Moolenaar
172825e0f586SBram Moolenaardef Test_import_compile_error()
1729cfcd011fSBram Moolenaar  var export_lines = [
173025e0f586SBram Moolenaar        'vim9script',
173125e0f586SBram Moolenaar        'export def ExpFunc(): string',
173225e0f586SBram Moolenaar        '  return notDefined',
173325e0f586SBram Moolenaar        'enddef',
173425e0f586SBram Moolenaar        ]
173525e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
173625e0f586SBram Moolenaar
1737cfcd011fSBram Moolenaar  var import_lines = [
173825e0f586SBram Moolenaar        'vim9script',
173925e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
174025e0f586SBram Moolenaar        'def ImpFunc()',
174125e0f586SBram Moolenaar        '  echo ExpFunc()',
174225e0f586SBram Moolenaar        'enddef',
174325e0f586SBram Moolenaar        'defcompile',
174425e0f586SBram Moolenaar        ]
174525e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
174625e0f586SBram Moolenaar
174725e0f586SBram Moolenaar  try
174825e0f586SBram Moolenaar    source Ximport.vim
174925e0f586SBram Moolenaar  catch /E1001/
1750f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
17517707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
175225e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
175325e0f586SBram Moolenaar  endtry
175425e0f586SBram Moolenaar
175525e0f586SBram Moolenaar  delete('Xexported.vim')
175625e0f586SBram Moolenaar  delete('Ximport.vim')
175725e0f586SBram Moolenaarenddef
175825e0f586SBram Moolenaar
1759c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1760cfcd011fSBram Moolenaar  var lines = [
1761c4ce36d4SBram Moolenaar        'vim9script',
1762c4ce36d4SBram Moolenaar        'def Func()',
1763c4ce36d4SBram Moolenaar        '  eval [][0]',
1764c4ce36d4SBram Moolenaar        'enddef',
1765c4ce36d4SBram Moolenaar        'Func()',
1766c4ce36d4SBram Moolenaar        ]
1767c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1768c4ce36d4SBram Moolenaar
1769c4ce36d4SBram Moolenaar  for count in range(3)
1770c4ce36d4SBram Moolenaar    try
1771c4ce36d4SBram Moolenaar      source Xtestscript.vim
1772c4ce36d4SBram Moolenaar    catch /E684/
1773c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1774c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1775c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1776c4ce36d4SBram Moolenaar    endtry
1777c4ce36d4SBram Moolenaar  endfor
1778c4ce36d4SBram Moolenaar
1779c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1780c4ce36d4SBram Moolenaarenddef
1781c4ce36d4SBram Moolenaar
1782eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1783cfcd011fSBram Moolenaar  var export_lines =<< trim END
1784eef2102eSBram Moolenaar      vim9script
1785eef2102eSBram Moolenaar      export def Func()
1786eef2102eSBram Moolenaar        echo 'imported'
1787eef2102eSBram Moolenaar      enddef
1788eef2102eSBram Moolenaar  END
1789eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1790eef2102eSBram Moolenaar
1791cfcd011fSBram Moolenaar  var lines =<< trim END
1792eef2102eSBram Moolenaar    vim9script
1793eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1794eef2102eSBram Moolenaar    def Func()
1795eef2102eSBram Moolenaar      echo 'local to function'
1796eef2102eSBram Moolenaar    enddef
1797eef2102eSBram Moolenaar  END
1798eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1799eef2102eSBram Moolenaar
1800eef2102eSBram Moolenaar  lines =<< trim END
1801eef2102eSBram Moolenaar    vim9script
1802eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1803eef2102eSBram Moolenaar    def Outer()
1804eef2102eSBram Moolenaar      def Func()
1805eef2102eSBram Moolenaar        echo 'local to function'
1806eef2102eSBram Moolenaar      enddef
1807eef2102eSBram Moolenaar    enddef
1808eef2102eSBram Moolenaar    defcompile
1809eef2102eSBram Moolenaar  END
1810eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1811eef2102eSBram Moolenaar
1812eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1813eef2102eSBram Moolenaarenddef
1814eef2102eSBram Moolenaar
1815b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1816cfcd011fSBram Moolenaar  var lines =<< trim END
1817b9a2cac3SBram Moolenaar    vim9script
1818b9a2cac3SBram Moolenaar    def Func()
1819b9a2cac3SBram Moolenaar      echo 'one'
1820b9a2cac3SBram Moolenaar    enddef
1821b9a2cac3SBram Moolenaar    def Func()
1822b9a2cac3SBram Moolenaar      echo 'two'
1823b9a2cac3SBram Moolenaar    enddef
1824b9a2cac3SBram Moolenaar  END
1825b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1826fa211f3cSBram Moolenaar
1827fa211f3cSBram Moolenaar  lines =<< trim END
1828fa211f3cSBram Moolenaar    vim9script
1829fa211f3cSBram Moolenaar    def Foo(): string
1830fa211f3cSBram Moolenaar      return 'foo'
1831fa211f3cSBram Moolenaar      enddef
1832fa211f3cSBram Moolenaar    def Func()
1833cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1834fa211f3cSBram Moolenaar    enddef
1835fa211f3cSBram Moolenaar    defcompile
1836fa211f3cSBram Moolenaar  END
1837fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1838b9a2cac3SBram Moolenaarenddef
1839b9a2cac3SBram Moolenaar
18408a7d6542SBram Moolenaardef Test_fixed_size_list()
1841f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1842cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
18438a7d6542SBram Moolenaar  l->remove(0)
18448a7d6542SBram Moolenaar  l->add(5)
18458a7d6542SBram Moolenaar  l->insert(99, 1)
18460f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
18478a7d6542SBram Moolenaarenddef
18488a7d6542SBram Moolenaar
1849ae616494SBram Moolenaardef Test_no_insert_xit()
1850d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1851d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1852d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1853d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1854d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1855ae616494SBram Moolenaar
1856ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1857ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1858ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1859ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1860f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1861f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1862f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1863f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1864f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1865ae616494SBram Moolenaarenddef
1866ae616494SBram Moolenaar
1867158906cfSBram Moolenaardef IfElse(what: number): string
1868cfcd011fSBram Moolenaar  var res = ''
1869158906cfSBram Moolenaar  if what == 1
1870158906cfSBram Moolenaar    res = "one"
1871158906cfSBram Moolenaar  elseif what == 2
1872158906cfSBram Moolenaar    res = "two"
1873a259d8d3SBram Moolenaar  else
1874158906cfSBram Moolenaar    res = "three"
1875a259d8d3SBram Moolenaar  endif
1876158906cfSBram Moolenaar  return res
1877a259d8d3SBram Moolenaarenddef
1878a259d8d3SBram Moolenaar
1879158906cfSBram Moolenaardef Test_if_elseif_else()
1880158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1881158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1882158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
18830f18b6d1SBram Moolenaarenddef
18840f18b6d1SBram Moolenaar
1885e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1886d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1887d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1888d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1889ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1890d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
18916628b7ebSBram Moolenaar
18926628b7ebSBram Moolenaar  var lines =<< trim END
18936628b7ebSBram Moolenaar      var s = ''
18946628b7ebSBram Moolenaar      if s = ''
18956628b7ebSBram Moolenaar      endif
18966628b7ebSBram Moolenaar  END
18976628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
18986628b7ebSBram Moolenaar
18996628b7ebSBram Moolenaar  lines =<< trim END
19006628b7ebSBram Moolenaar      var s = ''
19016628b7ebSBram Moolenaar      if s == ''
19026628b7ebSBram Moolenaar      elseif s = ''
19036628b7ebSBram Moolenaar      endif
19046628b7ebSBram Moolenaar  END
19056628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
1906e8c4abbbSBram Moolenaarenddef
1907e8c4abbbSBram Moolenaar
19086d69bf60SBram Moolenaarlet g:bool_true = v:true
19096d69bf60SBram Moolenaarlet g:bool_false = v:false
19106d69bf60SBram Moolenaar
19116d69bf60SBram Moolenaardef Test_if_const_expr()
1912cfcd011fSBram Moolenaar  var res = false
19136d69bf60SBram Moolenaar  if true ? true : false
19146d69bf60SBram Moolenaar    res = true
19156d69bf60SBram Moolenaar  endif
19166d69bf60SBram Moolenaar  assert_equal(true, res)
19176d69bf60SBram Moolenaar
1918585fea7bSBram Moolenaar  g:glob = 2
1919585fea7bSBram Moolenaar  if false
19206797966dSBram Moolenaar    execute('g:glob = 3')
1921585fea7bSBram Moolenaar  endif
1922585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1923585fea7bSBram Moolenaar  if true
19246797966dSBram Moolenaar    execute('g:glob = 3')
1925585fea7bSBram Moolenaar  endif
1926585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1927585fea7bSBram Moolenaar
19286d69bf60SBram Moolenaar  res = false
19296d69bf60SBram Moolenaar  if g:bool_true ? true : false
19306d69bf60SBram Moolenaar    res = true
19316d69bf60SBram Moolenaar  endif
19326d69bf60SBram Moolenaar  assert_equal(true, res)
19336d69bf60SBram Moolenaar
19346d69bf60SBram Moolenaar  res = false
19356d69bf60SBram Moolenaar  if true ? g:bool_true : false
19366d69bf60SBram Moolenaar    res = true
19376d69bf60SBram Moolenaar  endif
19386d69bf60SBram Moolenaar  assert_equal(true, res)
19396d69bf60SBram Moolenaar
19406d69bf60SBram Moolenaar  res = false
19416d69bf60SBram Moolenaar  if true ? true : g:bool_false
19426d69bf60SBram Moolenaar    res = true
19436d69bf60SBram Moolenaar  endif
19446d69bf60SBram Moolenaar  assert_equal(true, res)
19456d69bf60SBram Moolenaar
19466d69bf60SBram Moolenaar  res = false
19476d69bf60SBram Moolenaar  if true ? false : true
19486d69bf60SBram Moolenaar    res = true
19496d69bf60SBram Moolenaar  endif
19506d69bf60SBram Moolenaar  assert_equal(false, res)
19516d69bf60SBram Moolenaar
19526d69bf60SBram Moolenaar  res = false
19536d69bf60SBram Moolenaar  if false ? false : true
19546d69bf60SBram Moolenaar    res = true
19556d69bf60SBram Moolenaar  endif
19566d69bf60SBram Moolenaar  assert_equal(true, res)
19576d69bf60SBram Moolenaar
19586d69bf60SBram Moolenaar  res = false
19596d69bf60SBram Moolenaar  if false ? true : false
19606d69bf60SBram Moolenaar    res = true
19616d69bf60SBram Moolenaar  endif
19626d69bf60SBram Moolenaar  assert_equal(false, res)
19636d69bf60SBram Moolenaar
19646d69bf60SBram Moolenaar  res = false
1965e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1966e8c4abbbSBram Moolenaar    res = true
1967e8c4abbbSBram Moolenaar  endif
1968e8c4abbbSBram Moolenaar  assert_equal(false, res)
1969e8c4abbbSBram Moolenaar
1970e8c4abbbSBram Moolenaar  res = false
19716d69bf60SBram Moolenaar  if true && true
19726d69bf60SBram Moolenaar    res = true
19736d69bf60SBram Moolenaar  endif
19746d69bf60SBram Moolenaar  assert_equal(true, res)
19756d69bf60SBram Moolenaar
19766d69bf60SBram Moolenaar  res = false
19776d69bf60SBram Moolenaar  if true && false
19786d69bf60SBram Moolenaar    res = true
19796d69bf60SBram Moolenaar  endif
19806d69bf60SBram Moolenaar  assert_equal(false, res)
19816d69bf60SBram Moolenaar
19826d69bf60SBram Moolenaar  res = false
19836d69bf60SBram Moolenaar  if g:bool_true && false
19846d69bf60SBram Moolenaar    res = true
19856d69bf60SBram Moolenaar  endif
19866d69bf60SBram Moolenaar  assert_equal(false, res)
19876d69bf60SBram Moolenaar
19886d69bf60SBram Moolenaar  res = false
19896d69bf60SBram Moolenaar  if true && g:bool_false
19906d69bf60SBram Moolenaar    res = true
19916d69bf60SBram Moolenaar  endif
19926d69bf60SBram Moolenaar  assert_equal(false, res)
19936d69bf60SBram Moolenaar
19946d69bf60SBram Moolenaar  res = false
19956d69bf60SBram Moolenaar  if false && false
19966d69bf60SBram Moolenaar    res = true
19976d69bf60SBram Moolenaar  endif
19986d69bf60SBram Moolenaar  assert_equal(false, res)
19996d69bf60SBram Moolenaar
20006d69bf60SBram Moolenaar  res = false
20016d69bf60SBram Moolenaar  if true || false
20026d69bf60SBram Moolenaar    res = true
20036d69bf60SBram Moolenaar  endif
20046d69bf60SBram Moolenaar  assert_equal(true, res)
20056d69bf60SBram Moolenaar
20066d69bf60SBram Moolenaar  res = false
20076d69bf60SBram Moolenaar  if g:bool_true || false
20086d69bf60SBram Moolenaar    res = true
20096d69bf60SBram Moolenaar  endif
20106d69bf60SBram Moolenaar  assert_equal(true, res)
20116d69bf60SBram Moolenaar
20126d69bf60SBram Moolenaar  res = false
20136d69bf60SBram Moolenaar  if true || g:bool_false
20146d69bf60SBram Moolenaar    res = true
20156d69bf60SBram Moolenaar  endif
20166d69bf60SBram Moolenaar  assert_equal(true, res)
20176d69bf60SBram Moolenaar
20186d69bf60SBram Moolenaar  res = false
20196d69bf60SBram Moolenaar  if false || false
20206d69bf60SBram Moolenaar    res = true
20216d69bf60SBram Moolenaar  endif
20226d69bf60SBram Moolenaar  assert_equal(false, res)
20233988f64fSBram Moolenaar
20243988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
20253988f64fSBram Moolenaar  if false | eval 0 | endif
20263988f64fSBram Moolenaar  if false | eval burp + 234 | endif
20273988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
20283988f64fSBram Moolenaar  if false
20293988f64fSBram Moolenaar    burp
20303988f64fSBram Moolenaar  endif
203180c34ca3SBram Moolenaarenddef
20326d69bf60SBram Moolenaar
203380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2034d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2035d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2036d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2037d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
20386d69bf60SBram Moolenaarenddef
20396d69bf60SBram Moolenaar
204072abcf42SBram Moolenaardef RunNested(i: number): number
2041cfcd011fSBram Moolenaar  var x: number = 0
204272abcf42SBram Moolenaar  if i % 2
204372abcf42SBram Moolenaar    if 1
2044f5be8cdbSBram Moolenaar      # comment
204572abcf42SBram Moolenaar    else
2046f5be8cdbSBram Moolenaar      # comment
204772abcf42SBram Moolenaar    endif
204872abcf42SBram Moolenaar    x += 1
204972abcf42SBram Moolenaar  else
205072abcf42SBram Moolenaar    x += 1000
205172abcf42SBram Moolenaar  endif
205272abcf42SBram Moolenaar  return x
205372abcf42SBram Moolenaarenddef
205472abcf42SBram Moolenaar
205572abcf42SBram Moolenaardef Test_nested_if()
205672abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
205772abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
205872abcf42SBram Moolenaarenddef
205972abcf42SBram Moolenaar
2060ad39c094SBram Moolenaardef Test_execute_cmd()
2061e4984290SBram Moolenaar  # missing argument is ignored
2062e4984290SBram Moolenaar  execute
2063e4984290SBram Moolenaar  execute # comment
2064e4984290SBram Moolenaar
2065ad39c094SBram Moolenaar  new
2066ad39c094SBram Moolenaar  setline(1, 'default')
2067d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2068ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2069a72cfb80SBram Moolenaar
2070d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2071a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2072a72cfb80SBram Moolenaar
2073cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2074cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2075a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2076ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2077a72cfb80SBram Moolenaar
2078d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2079ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2080a72cfb80SBram Moolenaar
2081cfcd011fSBram Moolenaar  var cmd_first = 'call '
2082cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2083ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2084ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2085ad39c094SBram Moolenaar  bwipe!
2086585fea7bSBram Moolenaar
2087cfcd011fSBram Moolenaar  var n = true
20882d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
20892d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
20902d6b20d6SBram Moolenaar
2091e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2092e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2093e5abf7afSBram Moolenaar
2094d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2095d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2096d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2097ad39c094SBram Moolenaarenddef
2098ad39c094SBram Moolenaar
209947e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2100f5be8cdbSBram Moolenaar  # only checks line continuation
2101cfcd011fSBram Moolenaar  var lines =<< trim END
210247e880d6SBram Moolenaar      vim9script
210347e880d6SBram Moolenaar      execute 'g:someVar'
210447e880d6SBram Moolenaar                .. ' = ' ..
210547e880d6SBram Moolenaar                   '28'
210647e880d6SBram Moolenaar      assert_equal(28, g:someVar)
210747e880d6SBram Moolenaar      unlet g:someVar
210847e880d6SBram Moolenaar  END
210947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
211047e880d6SBram Moolenaarenddef
211147e880d6SBram Moolenaar
2112ad39c094SBram Moolenaardef Test_echo_cmd()
2113a72cfb80SBram Moolenaar  echo 'some' # comment
2114585fea7bSBram Moolenaar  echon 'thing'
2115ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2116ad39c094SBram Moolenaar
2117a72cfb80SBram Moolenaar  echo "some" # comment
2118a72cfb80SBram Moolenaar  echon "thing"
2119a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2120a72cfb80SBram Moolenaar
2121cfcd011fSBram Moolenaar  var str1 = 'some'
2122cfcd011fSBram Moolenaar  var str2 = 'more'
2123ad39c094SBram Moolenaar  echo str1 str2
2124ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2125a72cfb80SBram Moolenaar
2126d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2127ad39c094SBram Moolenaarenddef
2128ad39c094SBram Moolenaar
2129f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2130f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2131f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2132f93c7feaSBram Moolenaar  echo 'clear'
2133df069eecSBram Moolenaar  :1messages
2134f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2135f93c7feaSBram Moolenaar
2136d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2137f93c7feaSBram Moolenaarenddef
2138f93c7feaSBram Moolenaar
213947e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2140f5be8cdbSBram Moolenaar  # only checks line continuation
2141cfcd011fSBram Moolenaar  var lines =<< trim END
214247e880d6SBram Moolenaar      vim9script
214347e880d6SBram Moolenaar      echomsg 'here'
214447e880d6SBram Moolenaar                .. ' is ' ..
214547e880d6SBram Moolenaar                   'a message'
214647e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
214747e880d6SBram Moolenaar  END
214847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
214947e880d6SBram Moolenaarenddef
215047e880d6SBram Moolenaar
2151f93c7feaSBram Moolenaardef Test_echoerr_cmd()
215240ee466cSBram Moolenaar  try
215340ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
215440ee466cSBram Moolenaar  catch
215540ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
215640ee466cSBram Moolenaar  endtry
2157f93c7feaSBram Moolenaarenddef
2158f93c7feaSBram Moolenaar
215947e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2160f5be8cdbSBram Moolenaar  # only checks line continuation
2161cfcd011fSBram Moolenaar  var lines =<< trim END
216247e880d6SBram Moolenaar      vim9script
216347e880d6SBram Moolenaar      try
216447e880d6SBram Moolenaar        echoerr 'this'
216547e880d6SBram Moolenaar                .. ' is ' ..
216647e880d6SBram Moolenaar                   'wrong'
216747e880d6SBram Moolenaar      catch
216847e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
216947e880d6SBram Moolenaar      endtry
217047e880d6SBram Moolenaar  END
217147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
217247e880d6SBram Moolenaarenddef
217347e880d6SBram Moolenaar
217441fe0617SBram Moolenaardef Test_for_outside_of_function()
2175cfcd011fSBram Moolenaar  var lines =<< trim END
217641fe0617SBram Moolenaar    vim9script
217741fe0617SBram Moolenaar    new
217841fe0617SBram Moolenaar    for var in range(0, 3)
217941fe0617SBram Moolenaar      append(line('$'), var)
218041fe0617SBram Moolenaar    endfor
218141fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
218241fe0617SBram Moolenaar    bwipe!
218341fe0617SBram Moolenaar  END
218441fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
218541fe0617SBram Moolenaar  source Xvim9for.vim
218641fe0617SBram Moolenaar  delete('Xvim9for.vim')
218741fe0617SBram Moolenaarenddef
21888a7d6542SBram Moolenaar
2189e8c4abbbSBram Moolenaardef Test_for_loop()
2190cfcd011fSBram Moolenaar  var result = ''
2191e8c4abbbSBram Moolenaar  for cnt in range(7)
2192e8c4abbbSBram Moolenaar    if cnt == 4
2193e8c4abbbSBram Moolenaar      break
2194e8c4abbbSBram Moolenaar    endif
2195e8c4abbbSBram Moolenaar    if cnt == 2
2196e8c4abbbSBram Moolenaar      continue
2197e8c4abbbSBram Moolenaar    endif
2198e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2199e8c4abbbSBram Moolenaar  endfor
2200e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
22010ad3e894SBram Moolenaar
2202cfcd011fSBram Moolenaar  var concat = ''
22030ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
22040ad3e894SBram Moolenaar    concat ..= str
22050ad3e894SBram Moolenaar  endfor
22060ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
220738bd8de5SBram Moolenaar
220838bd8de5SBram Moolenaar  var total = 0
220938bd8de5SBram Moolenaar  for nr in
221038bd8de5SBram Moolenaar      [1, 2, 3]
221138bd8de5SBram Moolenaar    total += nr
221238bd8de5SBram Moolenaar  endfor
221338bd8de5SBram Moolenaar  assert_equal(6, total)
221438bd8de5SBram Moolenaar
221538bd8de5SBram Moolenaar  total = 0
221638bd8de5SBram Moolenaar  for nr
221738bd8de5SBram Moolenaar    in [1, 2, 3]
221838bd8de5SBram Moolenaar    total += nr
221938bd8de5SBram Moolenaar  endfor
222038bd8de5SBram Moolenaar  assert_equal(6, total)
222138bd8de5SBram Moolenaar
222238bd8de5SBram Moolenaar  total = 0
222338bd8de5SBram Moolenaar  for nr
222438bd8de5SBram Moolenaar    in
222538bd8de5SBram Moolenaar    [1, 2, 3]
222638bd8de5SBram Moolenaar    total += nr
222738bd8de5SBram Moolenaar  endfor
222838bd8de5SBram Moolenaar  assert_equal(6, total)
2229036d0714SBram Moolenaar
2230036d0714SBram Moolenaar  var res = ""
2231036d0714SBram Moolenaar  for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2232036d0714SBram Moolenaar    res ..= n .. s
2233036d0714SBram Moolenaar  endfor
2234036d0714SBram Moolenaar  assert_equal('1a2b', res)
2235e8c4abbbSBram Moolenaarenddef
2236e8c4abbbSBram Moolenaar
2237e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2238025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2239025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2240025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2241675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2242675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2243cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2244822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
22452d870f8dSBram Moolenaar  delfunc! g:Func
2246451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2247675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2248675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2249675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2250e8c4abbbSBram Moolenaarenddef
2251e8c4abbbSBram Moolenaar
2252ea87069dSBram Moolenaardef Test_for_loop_script_var()
2253ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2254ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2255ea87069dSBram Moolenaar
2256ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2257ea87069dSBram Moolenaar  var lines =<< trim END
2258ea87069dSBram Moolenaar    vim9script
2259ea87069dSBram Moolenaar    var total = 0
2260ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2261ea87069dSBram Moolenaar      total += s:var
2262ea87069dSBram Moolenaar    endfor
2263ea87069dSBram Moolenaar    assert_equal(6, total)
2264ea87069dSBram Moolenaar
2265ea87069dSBram Moolenaar    total = 0
2266ea87069dSBram Moolenaar    for var in [1, 2, 3]
2267ea87069dSBram Moolenaar      total += var
2268ea87069dSBram Moolenaar    endfor
2269ea87069dSBram Moolenaar    assert_equal(6, total)
2270ea87069dSBram Moolenaar  END
2271ea87069dSBram Moolenaarenddef
2272ea87069dSBram Moolenaar
2273792f786aSBram Moolenaardef Test_for_loop_unpack()
22744b8a0651SBram Moolenaar  var lines =<< trim END
2275792f786aSBram Moolenaar      var result = []
2276792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2277792f786aSBram Moolenaar        result->add(v1)
2278792f786aSBram Moolenaar        result->add(v2)
2279792f786aSBram Moolenaar      endfor
2280792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2281792f786aSBram Moolenaar
2282792f786aSBram Moolenaar      result = []
2283792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2284792f786aSBram Moolenaar        result->add(v1)
2285792f786aSBram Moolenaar        result->add(v2)
2286792f786aSBram Moolenaar        result->add(v3)
2287792f786aSBram Moolenaar      endfor
2288792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2289792f786aSBram Moolenaar
22904b8a0651SBram Moolenaar      result = []
22914b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
22924b8a0651SBram Moolenaar        result->add(&ts)
22934b8a0651SBram Moolenaar        result->add(&sw)
22944b8a0651SBram Moolenaar      endfor
22954b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
22964b8a0651SBram Moolenaar
22974b8a0651SBram Moolenaar      var slist: list<string>
22984b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
22994b8a0651SBram Moolenaar        slist->add($LOOPVAR)
23004b8a0651SBram Moolenaar        slist->add(@r)
23014b8a0651SBram Moolenaar        slist->add(v:errmsg)
23024b8a0651SBram Moolenaar      endfor
23034b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
23044b8a0651SBram Moolenaar
23054b8a0651SBram Moolenaar      slist = []
23064b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
23074b8a0651SBram Moolenaar        slist->add(g:globalvar)
23084b8a0651SBram Moolenaar        slist->add(b:bufvar)
23094b8a0651SBram Moolenaar        slist->add(w:winvar)
23104b8a0651SBram Moolenaar        slist->add(t:tabvar)
23114b8a0651SBram Moolenaar      endfor
23124b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2313f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
23144b8a0651SBram Moolenaar  END
23154b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
23164b8a0651SBram Moolenaar
23174b8a0651SBram Moolenaar  lines =<< trim END
2318792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2319792f786aSBram Moolenaar        echo v1 v2
2320792f786aSBram Moolenaar      endfor
2321792f786aSBram Moolenaar  END
2322792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2323792f786aSBram Moolenaar
2324792f786aSBram Moolenaar  lines =<< trim END
2325792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2326792f786aSBram Moolenaar        echo v1 v2
2327792f786aSBram Moolenaar      endfor
2328792f786aSBram Moolenaar  END
2329792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2330792f786aSBram Moolenaar
2331792f786aSBram Moolenaar  lines =<< trim END
2332792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2333792f786aSBram Moolenaar        echo v1
2334792f786aSBram Moolenaar      endfor
2335792f786aSBram Moolenaar  END
2336792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2337792f786aSBram Moolenaarenddef
2338792f786aSBram Moolenaar
2339c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2340c150c09eSBram Moolenaar  var looped = 0
2341c150c09eSBram Moolenaar  var cleanup = 0
2342c150c09eSBram Moolenaar  for i in range(3)
2343c150c09eSBram Moolenaar    looped += 1
2344c150c09eSBram Moolenaar    try
2345c150c09eSBram Moolenaar      eval [][0]
2346c150c09eSBram Moolenaar    catch
2347c150c09eSBram Moolenaar      continue
2348c150c09eSBram Moolenaar    finally
2349c150c09eSBram Moolenaar      cleanup += 1
2350c150c09eSBram Moolenaar    endtry
2351c150c09eSBram Moolenaar  endfor
2352c150c09eSBram Moolenaar  assert_equal(3, looped)
2353c150c09eSBram Moolenaar  assert_equal(3, cleanup)
2354c150c09eSBram Moolenaarenddef
2355c150c09eSBram Moolenaar
2356d0df1aacSBram Moolenaardef Test_while_loop()
2357cfcd011fSBram Moolenaar  var result = ''
2358cfcd011fSBram Moolenaar  var cnt = 0
2359d0df1aacSBram Moolenaar  while cnt < 555
2360d0df1aacSBram Moolenaar    if cnt == 3
2361d0df1aacSBram Moolenaar      break
2362d0df1aacSBram Moolenaar    endif
2363d0df1aacSBram Moolenaar    cnt += 1
2364d0df1aacSBram Moolenaar    if cnt == 2
2365d0df1aacSBram Moolenaar      continue
2366d0df1aacSBram Moolenaar    endif
2367d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2368d0df1aacSBram Moolenaar  endwhile
2369d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2370dee37dc7SBram Moolenaar
2371dee37dc7SBram Moolenaar  var s = ''
23720123cc1eSBram Moolenaar  while s == 'x' #{comment}
2373dee37dc7SBram Moolenaar  endwhile
2374d0df1aacSBram Moolenaarenddef
2375d0df1aacSBram Moolenaar
2376e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2377675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2378675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2379675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2380675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2381675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2382675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2383675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
23846628b7ebSBram Moolenaar
23856628b7ebSBram Moolenaar  var lines =<< trim END
23866628b7ebSBram Moolenaar      var s = ''
23876628b7ebSBram Moolenaar      while s = ''
23886628b7ebSBram Moolenaar      endwhile
23896628b7ebSBram Moolenaar  END
23906628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2391bd5da371SBram Moolenaarenddef
2392bd5da371SBram Moolenaar
23939645e2d9SBram Moolenaardef Test_interrupt_loop()
2394cfcd011fSBram Moolenaar  var caught = false
2395cfcd011fSBram Moolenaar  var x = 0
239697acfc78SBram Moolenaar  try
23979645e2d9SBram Moolenaar    while 1
23989645e2d9SBram Moolenaar      x += 1
23999645e2d9SBram Moolenaar      if x == 100
24009645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
24019645e2d9SBram Moolenaar      endif
24029645e2d9SBram Moolenaar    endwhile
240397acfc78SBram Moolenaar  catch
240497acfc78SBram Moolenaar    caught = true
240597acfc78SBram Moolenaar    assert_equal(100, x)
240697acfc78SBram Moolenaar  endtry
240797acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
240825859dd7SBram Moolenaar  # consume the CTRL-C
240925859dd7SBram Moolenaar  getchar(0)
24109645e2d9SBram Moolenaarenddef
241120431c9dSBram Moolenaar
24124fdae999SBram Moolenaardef Test_automatic_line_continuation()
2413cfcd011fSBram Moolenaar  var mylist = [
24144fdae999SBram Moolenaar      'one',
24154fdae999SBram Moolenaar      'two',
24164fdae999SBram Moolenaar      'three',
2417f5be8cdbSBram Moolenaar      ] # comment
24184fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
24194fdae999SBram Moolenaar
2420cfcd011fSBram Moolenaar  var mydict = {
2421e0de171eSBram Moolenaar      ['one']: 1,
2422e0de171eSBram Moolenaar      ['two']: 2,
2423e0de171eSBram Moolenaar      ['three']:
24244fdae999SBram Moolenaar          3,
2425f5be8cdbSBram Moolenaar      } # comment
2426e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2427e0de171eSBram Moolenaar  mydict = {
24282c330432SBram Moolenaar      one: 1,  # comment
24292c330432SBram Moolenaar      two:     # comment
24302c330432SBram Moolenaar           2,  # comment
24312c330432SBram Moolenaar      three: 3 # comment
24322c330432SBram Moolenaar      }
2433e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2434e0de171eSBram Moolenaar  mydict = {
24352c330432SBram Moolenaar      one: 1,
24364fdae999SBram Moolenaar      two:
24374fdae999SBram Moolenaar           2,
24382c330432SBram Moolenaar      three: 3
24394fdae999SBram Moolenaar      }
2440e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2441e6085c53SBram Moolenaar
2442e6085c53SBram Moolenaar  assert_equal(
2443e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2444e6085c53SBram Moolenaar        split('one two three')
2445e6085c53SBram Moolenaar        )
24464fdae999SBram Moolenaarenddef
24474fdae999SBram Moolenaar
24487a092245SBram Moolenaardef Test_vim9_comment()
24497a092245SBram Moolenaar  CheckScriptSuccess([
24507a092245SBram Moolenaar      'vim9script',
24517a092245SBram Moolenaar      '# something',
245293f82cbeSBram Moolenaar      '#something',
245393f82cbeSBram Moolenaar      '#{something',
24547a092245SBram Moolenaar      ])
245593f82cbeSBram Moolenaar
245693f82cbeSBram Moolenaar  split Xfile
245793f82cbeSBram Moolenaar  CheckScriptSuccess([
245893f82cbeSBram Moolenaar      'vim9script',
245993f82cbeSBram Moolenaar      'edit #something',
246093f82cbeSBram Moolenaar      ])
246193f82cbeSBram Moolenaar  CheckScriptSuccess([
246293f82cbeSBram Moolenaar      'vim9script',
246393f82cbeSBram Moolenaar      'edit #{something',
246493f82cbeSBram Moolenaar      ])
246593f82cbeSBram Moolenaar  close
246693f82cbeSBram Moolenaar
24677a092245SBram Moolenaar  CheckScriptFailure([
24687a092245SBram Moolenaar      'vim9script',
24697a092245SBram Moolenaar      ':# something',
24707a092245SBram Moolenaar      ], 'E488:')
24717a092245SBram Moolenaar  CheckScriptFailure([
24727a092245SBram Moolenaar      '# something',
24737a092245SBram Moolenaar      ], 'E488:')
24747a092245SBram Moolenaar  CheckScriptFailure([
24757a092245SBram Moolenaar      ':# something',
24767a092245SBram Moolenaar      ], 'E488:')
24777a092245SBram Moolenaar
24784a8d9f2eSBram Moolenaar  { # block start
24794a8d9f2eSBram Moolenaar  } # block end
24804a8d9f2eSBram Moolenaar  CheckDefFailure([
24814a8d9f2eSBram Moolenaar      '{# comment',
24824a8d9f2eSBram Moolenaar      ], 'E488:')
24834a8d9f2eSBram Moolenaar  CheckDefFailure([
24844a8d9f2eSBram Moolenaar      '{',
24854a8d9f2eSBram Moolenaar      '}# comment',
24864a8d9f2eSBram Moolenaar      ], 'E488:')
24874a8d9f2eSBram Moolenaar
24884a8d9f2eSBram Moolenaar  echo "yes" # comment
24894a8d9f2eSBram Moolenaar  CheckDefFailure([
24904a8d9f2eSBram Moolenaar      'echo "yes"# comment',
24914a8d9f2eSBram Moolenaar      ], 'E488:')
24927a092245SBram Moolenaar  CheckScriptSuccess([
24937a092245SBram Moolenaar      'vim9script',
24947a092245SBram Moolenaar      'echo "yes" # something',
24957a092245SBram Moolenaar      ])
24967a092245SBram Moolenaar  CheckScriptFailure([
24977a092245SBram Moolenaar      'vim9script',
24987a092245SBram Moolenaar      'echo "yes"# something',
24997a092245SBram Moolenaar      ], 'E121:')
25007a092245SBram Moolenaar  CheckScriptFailure([
25017a092245SBram Moolenaar      'vim9script',
25027a092245SBram Moolenaar      'echo# something',
2503f8103f27SBram Moolenaar      ], 'E1144:')
25047a092245SBram Moolenaar  CheckScriptFailure([
25057a092245SBram Moolenaar      'echo "yes" # something',
25067a092245SBram Moolenaar      ], 'E121:')
25077a092245SBram Moolenaar
25084a8d9f2eSBram Moolenaar  exe "echo" # comment
25094a8d9f2eSBram Moolenaar  CheckDefFailure([
25104a8d9f2eSBram Moolenaar      'exe "echo"# comment',
25114a8d9f2eSBram Moolenaar      ], 'E488:')
25124a8d9f2eSBram Moolenaar  CheckScriptSuccess([
25134a8d9f2eSBram Moolenaar      'vim9script',
25144a8d9f2eSBram Moolenaar      'exe "echo" # something',
25154a8d9f2eSBram Moolenaar      ])
25164a8d9f2eSBram Moolenaar  CheckScriptFailure([
25174a8d9f2eSBram Moolenaar      'vim9script',
25184a8d9f2eSBram Moolenaar      'exe "echo"# something',
25194a8d9f2eSBram Moolenaar      ], 'E121:')
25204a8d9f2eSBram Moolenaar  CheckScriptFailure([
25214a8d9f2eSBram Moolenaar      'vim9script',
25224a8d9f2eSBram Moolenaar      'exe# something',
2523f8103f27SBram Moolenaar      ], 'E1144:')
25244a8d9f2eSBram Moolenaar  CheckScriptFailure([
25254a8d9f2eSBram Moolenaar      'exe "echo" # something',
25264a8d9f2eSBram Moolenaar      ], 'E121:')
25274a8d9f2eSBram Moolenaar
25287a092245SBram Moolenaar  CheckDefFailure([
25297a092245SBram Moolenaar      'try# comment',
25307a092245SBram Moolenaar      '  echo "yes"',
25317a092245SBram Moolenaar      'catch',
25327a092245SBram Moolenaar      'endtry',
2533f8103f27SBram Moolenaar      ], 'E1144:')
25342c5ed4e3SBram Moolenaar  CheckScriptFailure([
25352c5ed4e3SBram Moolenaar      'vim9script',
25362c5ed4e3SBram Moolenaar      'try# comment',
25372c5ed4e3SBram Moolenaar      'echo "yes"',
2538f8103f27SBram Moolenaar      ], 'E1144:')
25397a092245SBram Moolenaar  CheckDefFailure([
25407a092245SBram Moolenaar      'try',
2541a72cfb80SBram Moolenaar      '  throw#comment',
2542a72cfb80SBram Moolenaar      'catch',
2543a72cfb80SBram Moolenaar      'endtry',
2544f8103f27SBram Moolenaar      ], 'E1144:')
2545a72cfb80SBram Moolenaar  CheckDefFailure([
2546a72cfb80SBram Moolenaar      'try',
2547a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2548a72cfb80SBram Moolenaar      'catch',
2549a72cfb80SBram Moolenaar      'endtry',
2550a72cfb80SBram Moolenaar      ], 'E488:')
2551a72cfb80SBram Moolenaar  CheckDefFailure([
2552a72cfb80SBram Moolenaar      'try',
25537a092245SBram Moolenaar      '  echo "yes"',
25547a092245SBram Moolenaar      'catch# comment',
25557a092245SBram Moolenaar      'endtry',
2556f8103f27SBram Moolenaar      ], 'E1144:')
25572c5ed4e3SBram Moolenaar  CheckScriptFailure([
25582c5ed4e3SBram Moolenaar      'vim9script',
25592c5ed4e3SBram Moolenaar      'try',
25602c5ed4e3SBram Moolenaar      '  echo "yes"',
25612c5ed4e3SBram Moolenaar      'catch# comment',
25622c5ed4e3SBram Moolenaar      'endtry',
2563f8103f27SBram Moolenaar      ], 'E1144:')
25642c5ed4e3SBram Moolenaar  CheckDefFailure([
25652c5ed4e3SBram Moolenaar      'try',
25662c5ed4e3SBram Moolenaar      '  echo "yes"',
25672c5ed4e3SBram Moolenaar      'catch /pat/# comment',
25682c5ed4e3SBram Moolenaar      'endtry',
25692c5ed4e3SBram Moolenaar      ], 'E488:')
25707a092245SBram Moolenaar  CheckDefFailure([
25717a092245SBram Moolenaar      'try',
25727a092245SBram Moolenaar      'echo "yes"',
25737a092245SBram Moolenaar      'catch',
25747a092245SBram Moolenaar      'endtry# comment',
2575f8103f27SBram Moolenaar      ], 'E1144:')
25762c5ed4e3SBram Moolenaar  CheckScriptFailure([
25772c5ed4e3SBram Moolenaar      'vim9script',
25782c5ed4e3SBram Moolenaar      'try',
25792c5ed4e3SBram Moolenaar      '  echo "yes"',
25802c5ed4e3SBram Moolenaar      'catch',
25812c5ed4e3SBram Moolenaar      'endtry# comment',
2582f8103f27SBram Moolenaar      ], 'E1144:')
25832c5ed4e3SBram Moolenaar
25842c5ed4e3SBram Moolenaar  CheckScriptSuccess([
25852c5ed4e3SBram Moolenaar      'vim9script',
25862c5ed4e3SBram Moolenaar      'hi # comment',
25872c5ed4e3SBram Moolenaar      ])
25882c5ed4e3SBram Moolenaar  CheckScriptFailure([
25892c5ed4e3SBram Moolenaar      'vim9script',
25902c5ed4e3SBram Moolenaar      'hi# comment',
2591f8103f27SBram Moolenaar      ], 'E1144:')
25921966c248SBram Moolenaar  CheckScriptSuccess([
25931966c248SBram Moolenaar      'vim9script',
25941966c248SBram Moolenaar      'hi Search # comment',
25951966c248SBram Moolenaar      ])
25961966c248SBram Moolenaar  CheckScriptFailure([
25971966c248SBram Moolenaar      'vim9script',
25981966c248SBram Moolenaar      'hi Search# comment',
25991966c248SBram Moolenaar      ], 'E416:')
26001966c248SBram Moolenaar  CheckScriptSuccess([
26011966c248SBram Moolenaar      'vim9script',
26021966c248SBram Moolenaar      'hi link This Search # comment',
26031966c248SBram Moolenaar      ])
26041966c248SBram Moolenaar  CheckScriptFailure([
26051966c248SBram Moolenaar      'vim9script',
26061966c248SBram Moolenaar      'hi link This That# comment',
26071966c248SBram Moolenaar      ], 'E413:')
26081966c248SBram Moolenaar  CheckScriptSuccess([
26091966c248SBram Moolenaar      'vim9script',
26101966c248SBram Moolenaar      'hi clear This # comment',
26111966c248SBram Moolenaar      'hi clear # comment',
26121966c248SBram Moolenaar      ])
2613f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2614f5be8cdbSBram Moolenaar  # hi clear This# comment',
26151966c248SBram Moolenaar  CheckScriptFailure([
26161966c248SBram Moolenaar      'vim9script',
26171966c248SBram Moolenaar      'hi clear# comment',
26181966c248SBram Moolenaar      ], 'E416:')
26191966c248SBram Moolenaar
26201966c248SBram Moolenaar  CheckScriptSuccess([
26211966c248SBram Moolenaar      'vim9script',
26221966c248SBram Moolenaar      'hi Group term=bold',
26231966c248SBram Moolenaar      'match Group /todo/ # comment',
26241966c248SBram Moolenaar      ])
26251966c248SBram Moolenaar  CheckScriptFailure([
26261966c248SBram Moolenaar      'vim9script',
26271966c248SBram Moolenaar      'hi Group term=bold',
26281966c248SBram Moolenaar      'match Group /todo/# comment',
26291966c248SBram Moolenaar      ], 'E488:')
26301966c248SBram Moolenaar  CheckScriptSuccess([
26311966c248SBram Moolenaar      'vim9script',
26321966c248SBram Moolenaar      'match # comment',
26331966c248SBram Moolenaar      ])
26341966c248SBram Moolenaar  CheckScriptFailure([
26351966c248SBram Moolenaar      'vim9script',
26361966c248SBram Moolenaar      'match# comment',
2637f8103f27SBram Moolenaar      ], 'E1144:')
26381966c248SBram Moolenaar  CheckScriptSuccess([
26391966c248SBram Moolenaar      'vim9script',
26401966c248SBram Moolenaar      'match none # comment',
26411966c248SBram Moolenaar      ])
26421966c248SBram Moolenaar  CheckScriptFailure([
26431966c248SBram Moolenaar      'vim9script',
26441966c248SBram Moolenaar      'match none# comment',
26451966c248SBram Moolenaar      ], 'E475:')
26461966c248SBram Moolenaar
26471966c248SBram Moolenaar  CheckScriptSuccess([
26481966c248SBram Moolenaar      'vim9script',
26491966c248SBram Moolenaar      'menutrans clear # comment',
26501966c248SBram Moolenaar      ])
26511966c248SBram Moolenaar  CheckScriptFailure([
26521966c248SBram Moolenaar      'vim9script',
26531966c248SBram Moolenaar      'menutrans clear# comment text',
26541966c248SBram Moolenaar      ], 'E474:')
26551966c248SBram Moolenaar
26561966c248SBram Moolenaar  CheckScriptSuccess([
26571966c248SBram Moolenaar      'vim9script',
26581966c248SBram Moolenaar      'syntax clear # comment',
26591966c248SBram Moolenaar      ])
26601966c248SBram Moolenaar  CheckScriptFailure([
26611966c248SBram Moolenaar      'vim9script',
26621966c248SBram Moolenaar      'syntax clear# comment text',
26631966c248SBram Moolenaar      ], 'E28:')
26641966c248SBram Moolenaar  CheckScriptSuccess([
26651966c248SBram Moolenaar      'vim9script',
26661966c248SBram Moolenaar      'syntax keyword Word some',
26671966c248SBram Moolenaar      'syntax clear Word # comment',
26681966c248SBram Moolenaar      ])
26691966c248SBram Moolenaar  CheckScriptFailure([
26701966c248SBram Moolenaar      'vim9script',
26711966c248SBram Moolenaar      'syntax keyword Word some',
26721966c248SBram Moolenaar      'syntax clear Word# comment text',
26731966c248SBram Moolenaar      ], 'E28:')
26741966c248SBram Moolenaar
26751966c248SBram Moolenaar  CheckScriptSuccess([
26761966c248SBram Moolenaar      'vim9script',
26771966c248SBram Moolenaar      'syntax list # comment',
26781966c248SBram Moolenaar      ])
26791966c248SBram Moolenaar  CheckScriptFailure([
26801966c248SBram Moolenaar      'vim9script',
26811966c248SBram Moolenaar      'syntax list# comment text',
26821966c248SBram Moolenaar      ], 'E28:')
26831966c248SBram Moolenaar
26841966c248SBram Moolenaar  CheckScriptSuccess([
26851966c248SBram Moolenaar      'vim9script',
26861966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
26871966c248SBram Moolenaar      ])
26881966c248SBram Moolenaar  CheckScriptFailure([
26891966c248SBram Moolenaar      'vim9script',
26901966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
26911966c248SBram Moolenaar      ], 'E475:')
26921966c248SBram Moolenaar
26931966c248SBram Moolenaar  CheckScriptSuccess([
26941966c248SBram Moolenaar      'vim9script',
26951966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
26961966c248SBram Moolenaar      ])
26971966c248SBram Moolenaar  CheckScriptFailure([
26981966c248SBram Moolenaar      'vim9script',
26991966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
27001966c248SBram Moolenaar      ], 'E789:')
27011966c248SBram Moolenaar
27021966c248SBram Moolenaar  CheckScriptSuccess([
27031966c248SBram Moolenaar      'vim9script',
27041966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
27051966c248SBram Moolenaar      ])
27061966c248SBram Moolenaar  CheckScriptFailure([
27071966c248SBram Moolenaar      'vim9script',
27081966c248SBram Moolenaar      'syntax match Word /pat/# comment',
27091966c248SBram Moolenaar      ], 'E402:')
27101966c248SBram Moolenaar
27111966c248SBram Moolenaar  CheckScriptSuccess([
27121966c248SBram Moolenaar      'vim9script',
27131966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
27141966c248SBram Moolenaar      ])
27151966c248SBram Moolenaar  CheckScriptFailure([
27161966c248SBram Moolenaar      'vim9script',
27171966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
27181966c248SBram Moolenaar      ], 'E475:')
27191966c248SBram Moolenaar  CheckScriptFailure([
27201966c248SBram Moolenaar      'vim9script',
27211966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
27221966c248SBram Moolenaar      ], 'E406:')
27231966c248SBram Moolenaar  CheckScriptFailure([
27241966c248SBram Moolenaar      'vim9script',
27251966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
27261966c248SBram Moolenaar      ], 'E475:')
27271966c248SBram Moolenaar
27281966c248SBram Moolenaar  CheckScriptSuccess([
27291966c248SBram Moolenaar      'vim9script',
27301966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
27311966c248SBram Moolenaar      ])
27321966c248SBram Moolenaar  CheckScriptFailure([
27331966c248SBram Moolenaar      'vim9script',
27341966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2735d032f34aSBram Moolenaar      ], 'E402:')
27361966c248SBram Moolenaar
27371966c248SBram Moolenaar  CheckScriptSuccess([
27381966c248SBram Moolenaar      'vim9script',
27391966c248SBram Moolenaar      'syntax sync # comment',
27401966c248SBram Moolenaar      ])
27411966c248SBram Moolenaar  CheckScriptFailure([
27421966c248SBram Moolenaar      'vim9script',
27431966c248SBram Moolenaar      'syntax sync# comment',
27441966c248SBram Moolenaar      ], 'E404:')
27451966c248SBram Moolenaar  CheckScriptSuccess([
27461966c248SBram Moolenaar      'vim9script',
27471966c248SBram Moolenaar      'syntax sync ccomment # comment',
27481966c248SBram Moolenaar      ])
27491966c248SBram Moolenaar  CheckScriptFailure([
27501966c248SBram Moolenaar      'vim9script',
27511966c248SBram Moolenaar      'syntax sync ccomment# comment',
27521966c248SBram Moolenaar      ], 'E404:')
27531966c248SBram Moolenaar
27541966c248SBram Moolenaar  CheckScriptSuccess([
27551966c248SBram Moolenaar      'vim9script',
27561966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
27571966c248SBram Moolenaar      ])
27581966c248SBram Moolenaar  CheckScriptFailure([
27591966c248SBram Moolenaar      'vim9script',
27601966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
27611966c248SBram Moolenaar      ], 'E475:')
2762a72cfb80SBram Moolenaar
2763a72cfb80SBram Moolenaar  CheckScriptSuccess([
2764a72cfb80SBram Moolenaar      'vim9script',
2765a72cfb80SBram Moolenaar      'command Echo echo # comment',
2766a72cfb80SBram Moolenaar      'command Echo # comment',
27672d870f8dSBram Moolenaar      'delcommand Echo',
2768a72cfb80SBram Moolenaar      ])
2769a72cfb80SBram Moolenaar  CheckScriptFailure([
2770a72cfb80SBram Moolenaar      'vim9script',
2771a72cfb80SBram Moolenaar      'command Echo echo# comment',
2772a72cfb80SBram Moolenaar      'Echo',
2773f8103f27SBram Moolenaar      ], 'E1144:')
27742d870f8dSBram Moolenaar  delcommand Echo
277570249ee8SBram Moolenaar
277670249ee8SBram Moolenaar  var curdir = getcwd()
277770249ee8SBram Moolenaar  CheckScriptSuccess([
277870249ee8SBram Moolenaar      'command Echo cd " comment',
277970249ee8SBram Moolenaar      'Echo',
278070249ee8SBram Moolenaar      'delcommand Echo',
278170249ee8SBram Moolenaar      ])
278270249ee8SBram Moolenaar  CheckScriptSuccess([
2783090728adSBram Moolenaar      'vim9script',
278470249ee8SBram Moolenaar      'command Echo cd # comment',
278570249ee8SBram Moolenaar      'Echo',
278670249ee8SBram Moolenaar      'delcommand Echo',
278770249ee8SBram Moolenaar      ])
278870249ee8SBram Moolenaar  CheckScriptFailure([
278970249ee8SBram Moolenaar      'vim9script',
279070249ee8SBram Moolenaar      'command Echo cd " comment',
279170249ee8SBram Moolenaar      'Echo',
279270249ee8SBram Moolenaar      ], 'E344:')
279370249ee8SBram Moolenaar  delcommand Echo
279470249ee8SBram Moolenaar  chdir(curdir)
279570249ee8SBram Moolenaar
2796a72cfb80SBram Moolenaar  CheckScriptFailure([
2797a72cfb80SBram Moolenaar      'vim9script',
2798a72cfb80SBram Moolenaar      'command Echo# comment',
2799a72cfb80SBram Moolenaar      ], 'E182:')
2800a72cfb80SBram Moolenaar  CheckScriptFailure([
2801a72cfb80SBram Moolenaar      'vim9script',
2802a72cfb80SBram Moolenaar      'command Echo echo',
2803a72cfb80SBram Moolenaar      'command Echo# comment',
2804a72cfb80SBram Moolenaar      ], 'E182:')
28052d870f8dSBram Moolenaar  delcommand Echo
2806a72cfb80SBram Moolenaar
2807a72cfb80SBram Moolenaar  CheckScriptSuccess([
2808a72cfb80SBram Moolenaar      'vim9script',
2809a72cfb80SBram Moolenaar      'function # comment',
2810a72cfb80SBram Moolenaar      ])
2811a72cfb80SBram Moolenaar  CheckScriptFailure([
2812a72cfb80SBram Moolenaar      'vim9script',
28139898107fSBram Moolenaar      'function " comment',
28149898107fSBram Moolenaar      ], 'E129:')
28159898107fSBram Moolenaar  CheckScriptFailure([
28169898107fSBram Moolenaar      'vim9script',
2817a72cfb80SBram Moolenaar      'function# comment',
2818f8103f27SBram Moolenaar      ], 'E1144:')
2819a72cfb80SBram Moolenaar  CheckScriptSuccess([
2820a72cfb80SBram Moolenaar      'vim9script',
2821a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2822a72cfb80SBram Moolenaar      ])
2823a72cfb80SBram Moolenaar  CheckScriptFailure([
2824a72cfb80SBram Moolenaar      'vim9script',
2825a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2826a72cfb80SBram Moolenaar      ], 'E488:')
2827a72cfb80SBram Moolenaar
2828a72cfb80SBram Moolenaar  CheckScriptSuccess([
2829a72cfb80SBram Moolenaar      'vim9script',
28304c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2831a72cfb80SBram Moolenaar      'endfunc',
28324c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2833a72cfb80SBram Moolenaar      ])
2834a72cfb80SBram Moolenaar  CheckScriptFailure([
2835a72cfb80SBram Moolenaar      'vim9script',
28364c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2837a72cfb80SBram Moolenaar      'endfunc',
28384c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2839a72cfb80SBram Moolenaar      ], 'E488:')
2840a72cfb80SBram Moolenaar
2841a72cfb80SBram Moolenaar  CheckScriptSuccess([
2842a72cfb80SBram Moolenaar      'vim9script',
2843a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2844a72cfb80SBram Moolenaar      ])
2845a72cfb80SBram Moolenaar  CheckScriptFailure([
2846a72cfb80SBram Moolenaar      'vim9script',
2847a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2848a72cfb80SBram Moolenaar      ], 'E488:')
2849e7e4838fSBram Moolenaar
2850e7e4838fSBram Moolenaar  CheckScriptFailure([
2851e7e4838fSBram Moolenaar      'def Test() " comment',
2852e7e4838fSBram Moolenaar      'enddef',
2853e7e4838fSBram Moolenaar      ], 'E488:')
2854e7e4838fSBram Moolenaar  CheckScriptFailure([
2855e7e4838fSBram Moolenaar      'vim9script',
2856e7e4838fSBram Moolenaar      'def Test() " comment',
2857e7e4838fSBram Moolenaar      'enddef',
2858e7e4838fSBram Moolenaar      ], 'E488:')
2859e7e4838fSBram Moolenaar
2860e7e4838fSBram Moolenaar  CheckScriptSuccess([
2861e7e4838fSBram Moolenaar      'func Test() " comment',
2862e7e4838fSBram Moolenaar      'endfunc',
28632d870f8dSBram Moolenaar      'delfunc Test',
2864e7e4838fSBram Moolenaar      ])
28659898107fSBram Moolenaar  CheckScriptSuccess([
2866e7e4838fSBram Moolenaar      'vim9script',
2867e7e4838fSBram Moolenaar      'func Test() " comment',
2868e7e4838fSBram Moolenaar      'endfunc',
28699898107fSBram Moolenaar      ])
2870e7e4838fSBram Moolenaar
2871e7e4838fSBram Moolenaar  CheckScriptSuccess([
2872e7e4838fSBram Moolenaar      'def Test() # comment',
2873e7e4838fSBram Moolenaar      'enddef',
2874e7e4838fSBram Moolenaar      ])
2875e7e4838fSBram Moolenaar  CheckScriptFailure([
2876e7e4838fSBram Moolenaar      'func Test() # comment',
2877e7e4838fSBram Moolenaar      'endfunc',
2878e7e4838fSBram Moolenaar      ], 'E488:')
28792c5ed4e3SBram Moolenaarenddef
28802c5ed4e3SBram Moolenaar
28812c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
28822c5ed4e3SBram Moolenaar  CheckCanRunGui
28832c5ed4e3SBram Moolenaar
28842c5ed4e3SBram Moolenaar  CheckScriptFailure([
28852c5ed4e3SBram Moolenaar      'vim9script',
28862c5ed4e3SBram Moolenaar      'gui#comment'
2887f8103f27SBram Moolenaar      ], 'E1144:')
28882c5ed4e3SBram Moolenaar  CheckScriptFailure([
28892c5ed4e3SBram Moolenaar      'vim9script',
28902c5ed4e3SBram Moolenaar      'gui -f#comment'
28912c5ed4e3SBram Moolenaar      ], 'E499:')
28927a092245SBram Moolenaarenddef
28937a092245SBram Moolenaar
2894a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
28956797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
28966797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2897a26b9700SBram Moolenaar
2898a26b9700SBram Moolenaar  edit test.vim
2899a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2900a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2901a26b9700SBram Moolenaar
2902a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2903a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2904a26b9700SBram Moolenaar
2905a26b9700SBram Moolenaar  g:entered = 0
2906a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2907a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2908a26b9700SBram Moolenaar
2909a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2910a26b9700SBram Moolenaar
2911a26b9700SBram Moolenaar  au! TabEnter
2912a26b9700SBram Moolenaar  unlet g:entered
2913d72c1bf0SBram Moolenaar
2914d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2915d72c1bf0SBram Moolenaar      'vim9script',
29166797966dSBram Moolenaar      'g:var = 123',
2917e55b1c09SBram Moolenaar      'b:var = 456',
2918e55b1c09SBram Moolenaar      'w:var = 777',
2919e55b1c09SBram Moolenaar      't:var = 888',
2920d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2921d72c1bf0SBram Moolenaar      ])
2922d72c1bf0SBram Moolenaar
2923d72c1bf0SBram Moolenaar  CheckScriptFailure([
2924d72c1bf0SBram Moolenaar      'vim9script',
2925cfcd011fSBram Moolenaar      'let var = 123',
2926cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2927cfcd011fSBram Moolenaar
2928cfcd011fSBram Moolenaar  CheckScriptFailure([
2929cfcd011fSBram Moolenaar      'vim9script',
2930cfcd011fSBram Moolenaar      'var g:var = 123',
2931e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2932e55b1c09SBram Moolenaar
2933e55b1c09SBram Moolenaar  CheckScriptFailure([
2934e55b1c09SBram Moolenaar      'vim9script',
2935cfcd011fSBram Moolenaar      'var b:var = 123',
2936e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2937e55b1c09SBram Moolenaar
2938e55b1c09SBram Moolenaar  CheckScriptFailure([
2939e55b1c09SBram Moolenaar      'vim9script',
2940cfcd011fSBram Moolenaar      'var w:var = 123',
2941e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2942e55b1c09SBram Moolenaar
2943e55b1c09SBram Moolenaar  CheckScriptFailure([
2944e55b1c09SBram Moolenaar      'vim9script',
2945cfcd011fSBram Moolenaar      'var t:var = 123',
2946e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2947e55b1c09SBram Moolenaar
2948e55b1c09SBram Moolenaar  CheckScriptFailure([
2949e55b1c09SBram Moolenaar      'vim9script',
2950cfcd011fSBram Moolenaar      'var v:version = 123',
2951e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2952e55b1c09SBram Moolenaar
2953e55b1c09SBram Moolenaar  CheckScriptFailure([
2954e55b1c09SBram Moolenaar      'vim9script',
2955cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2956e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
29576797966dSBram Moolenaar
29586797966dSBram Moolenaar  CheckScriptFailure([
29596797966dSBram Moolenaar      'vim9script',
29606797966dSBram Moolenaar      'g:var = 123',
296132e35117SBram Moolenaar      'unlet g:var# comment1',
2962d72c1bf0SBram Moolenaar      ], 'E108:')
2963d72c1bf0SBram Moolenaar
2964d72c1bf0SBram Moolenaar  CheckScriptFailure([
2965d72c1bf0SBram Moolenaar      'let g:var = 123',
2966d72c1bf0SBram Moolenaar      'unlet g:var # something',
2967d72c1bf0SBram Moolenaar      ], 'E488:')
2968faac4104SBram Moolenaar
2969faac4104SBram Moolenaar  CheckScriptSuccess([
2970faac4104SBram Moolenaar      'vim9script',
297132e35117SBram Moolenaar      'if 1 # comment2',
2972faac4104SBram Moolenaar      '  echo "yes"',
2973faac4104SBram Moolenaar      'elseif 2 #comment',
2974faac4104SBram Moolenaar      '  echo "no"',
2975faac4104SBram Moolenaar      'endif',
2976faac4104SBram Moolenaar      ])
2977faac4104SBram Moolenaar
2978faac4104SBram Moolenaar  CheckScriptFailure([
2979faac4104SBram Moolenaar      'vim9script',
298032e35117SBram Moolenaar      'if 1# comment3',
2981faac4104SBram Moolenaar      '  echo "yes"',
2982faac4104SBram Moolenaar      'endif',
2983faac4104SBram Moolenaar      ], 'E15:')
2984faac4104SBram Moolenaar
2985faac4104SBram Moolenaar  CheckScriptFailure([
2986faac4104SBram Moolenaar      'vim9script',
298732e35117SBram Moolenaar      'if 0 # comment4',
2988faac4104SBram Moolenaar      '  echo "yes"',
2989faac4104SBram Moolenaar      'elseif 2#comment',
2990faac4104SBram Moolenaar      '  echo "no"',
2991faac4104SBram Moolenaar      'endif',
2992faac4104SBram Moolenaar      ], 'E15:')
2993faac4104SBram Moolenaar
2994faac4104SBram Moolenaar  CheckScriptSuccess([
2995faac4104SBram Moolenaar      'vim9script',
2996cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2997faac4104SBram Moolenaar      ])
2998faac4104SBram Moolenaar
2999faac4104SBram Moolenaar  CheckScriptFailure([
3000faac4104SBram Moolenaar      'vim9script',
3001cfcd011fSBram Moolenaar      'var v = 1# comment6',
300232e35117SBram Moolenaar      ], 'E15:')
3003faac4104SBram Moolenaar
3004faac4104SBram Moolenaar  CheckScriptSuccess([
3005faac4104SBram Moolenaar      'vim9script',
3006faac4104SBram Moolenaar      'new'
3007d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3008df069eecSBram Moolenaar      ':$',
3009faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3010faac4104SBram Moolenaar      'bwipe!',
3011faac4104SBram Moolenaar      ])
3012faac4104SBram Moolenaar
3013f5be8cdbSBram Moolenaar  CheckScriptFailure([
3014f5be8cdbSBram Moolenaar      'vim9script',
3015f5be8cdbSBram Moolenaar      'new'
3016d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3017f5be8cdbSBram Moolenaar      ':$',
3018f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3019f5be8cdbSBram Moolenaar      'bwipe!',
3020f5be8cdbSBram Moolenaar      ], 'E488:')
3021f5be8cdbSBram Moolenaar
3022f5be8cdbSBram Moolenaar  CheckScriptFailure([
3023f5be8cdbSBram Moolenaar      'vim9script',
3024f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3025f5be8cdbSBram Moolenaar      ], 'E477:')
3026a26b9700SBram Moolenaarenddef
3027a26b9700SBram Moolenaar
30287e5bd91dSBram Moolenaardef Test_finish()
3029cfcd011fSBram Moolenaar  var lines =<< trim END
30307e5bd91dSBram Moolenaar    vim9script
30316797966dSBram Moolenaar    g:res = 'one'
30327e5bd91dSBram Moolenaar    if v:false | finish | endif
30336797966dSBram Moolenaar    g:res = 'two'
30347e5bd91dSBram Moolenaar    finish
30356797966dSBram Moolenaar    g:res = 'three'
30367e5bd91dSBram Moolenaar  END
30377e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
30387e5bd91dSBram Moolenaar  source Xfinished
30397e5bd91dSBram Moolenaar  assert_equal('two', g:res)
30407e5bd91dSBram Moolenaar
30417e5bd91dSBram Moolenaar  unlet g:res
30427e5bd91dSBram Moolenaar  delete('Xfinished')
30437e5bd91dSBram Moolenaarenddef
30447e5bd91dSBram Moolenaar
3045a5d0077eSBram Moolenaardef Test_forward_declaration()
3046cfcd011fSBram Moolenaar  var lines =<< trim END
3047a5d0077eSBram Moolenaar    vim9script
3048a5d0077eSBram Moolenaar    def GetValue(): string
3049a5d0077eSBram Moolenaar      return theVal
3050a5d0077eSBram Moolenaar    enddef
3051cfcd011fSBram Moolenaar    var theVal = 'something'
3052822ba247SBram Moolenaar    g:initVal = GetValue()
3053a5d0077eSBram Moolenaar    theVal = 'else'
3054a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3055a5d0077eSBram Moolenaar  END
3056a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3057a5d0077eSBram Moolenaar  source Xforward
3058a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3059a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3060a5d0077eSBram Moolenaar
3061a5d0077eSBram Moolenaar  unlet g:initVal
3062a5d0077eSBram Moolenaar  unlet g:laterVal
3063a5d0077eSBram Moolenaar  delete('Xforward')
3064a5d0077eSBram Moolenaarenddef
3065a5d0077eSBram Moolenaar
30669721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3067a6294955SBram Moolenaar  var vim9_lines =<< trim END
3068a6294955SBram Moolenaar    vim9script
3069a6294955SBram Moolenaar    var local = 'local'
3070a6294955SBram Moolenaar    g:global = 'global'
3071a6294955SBram Moolenaar    export var exported = 'exported'
3072a6294955SBram Moolenaar    export def GetText(): string
3073a6294955SBram Moolenaar       return 'text'
3074a6294955SBram Moolenaar    enddef
3075a6294955SBram Moolenaar  END
3076a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3077a6294955SBram Moolenaar
3078cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
30799721fb4eSBram Moolenaar    source Xvim9_script.vim
30809721fb4eSBram Moolenaar
30819721fb4eSBram Moolenaar    call assert_false(exists('local'))
30829721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30839721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
30849721fb4eSBram Moolenaar    call assert_equal('global', global)
30859721fb4eSBram Moolenaar    call assert_equal('global', g:global)
30869721fb4eSBram Moolenaar
30879721fb4eSBram Moolenaar    " imported variable becomes script-local
30889721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
30899721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
30909721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30919721fb4eSBram Moolenaar
30929721fb4eSBram Moolenaar    " imported function becomes script-local
30939721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
30949721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
30959721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
30969721fb4eSBram Moolenaar  END
30979721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
30989721fb4eSBram Moolenaar
30999721fb4eSBram Moolenaar  source Xlegacy_script.vim
31009721fb4eSBram Moolenaar  assert_equal('global', g:global)
3101f5be8cdbSBram Moolenaar  unlet g:global
31029721fb4eSBram Moolenaar
31039721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
31049721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
31059721fb4eSBram Moolenaarenddef
3106a5d0077eSBram Moolenaar
31077d699701SBram Moolenaarfunc Test_vim9script_not_global()
31087d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
31097d699701SBram Moolenaar  let vim9lines =<< trim END
31107d699701SBram Moolenaar    vim9script
3111cfcd011fSBram Moolenaar    var name = 'local'
31127d699701SBram Moolenaar    func TheFunc()
31137d699701SBram Moolenaar      echo 'local'
31147d699701SBram Moolenaar    endfunc
31157d699701SBram Moolenaar    def DefFunc()
31167d699701SBram Moolenaar      echo 'local'
31177d699701SBram Moolenaar    enddef
31187d699701SBram Moolenaar  END
31197d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
31207d699701SBram Moolenaar  source Xvim9script.vim
31217d699701SBram Moolenaar  try
31227d699701SBram Moolenaar    echo g:var
31237d699701SBram Moolenaar    assert_report('did not fail')
31247d699701SBram Moolenaar  catch /E121:/
31257d699701SBram Moolenaar    " caught
31267d699701SBram Moolenaar  endtry
31277d699701SBram Moolenaar  try
31287d699701SBram Moolenaar    call TheFunc()
31297d699701SBram Moolenaar    assert_report('did not fail')
31307d699701SBram Moolenaar  catch /E117:/
31317d699701SBram Moolenaar    " caught
31327d699701SBram Moolenaar  endtry
31337d699701SBram Moolenaar  try
31347d699701SBram Moolenaar    call DefFunc()
31357d699701SBram Moolenaar    assert_report('did not fail')
31367d699701SBram Moolenaar  catch /E117:/
31377d699701SBram Moolenaar    " caught
31387d699701SBram Moolenaar  endtry
31397d699701SBram Moolenaar
314025859dd7SBram Moolenaar  call delete('Xvim9script.vim')
31417d699701SBram Moolenaarendfunc
31427d699701SBram Moolenaar
3143eeb27bfeSBram Moolenaardef Test_vim9_copen()
3144eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3145eeb27bfeSBram Moolenaar  copen
3146eeb27bfeSBram Moolenaar  quit
3147eeb27bfeSBram Moolenaarenddef
3148eeb27bfeSBram Moolenaar
314903290b84SBram Moolenaar" test using an auto-loaded function and variable
31502d6b20d6SBram Moolenaardef Test_vim9_autoload()
3151cfcd011fSBram Moolenaar  var lines =<< trim END
31522d6b20d6SBram Moolenaar     vim9script
315303290b84SBram Moolenaar     def some#gettest(): string
315403290b84SBram Moolenaar       return 'test'
315503290b84SBram Moolenaar     enddef
315603290b84SBram Moolenaar     g:some#name = 'name'
3157*e3ffcd99SBram Moolenaar
3158*e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3159*e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3160*e3ffcd99SBram Moolenaar     enddef
316103290b84SBram Moolenaar  END
316203290b84SBram Moolenaar
316303290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
316403290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
316503290b84SBram Moolenaar  var save_rtp = &rtp
316603290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
316703290b84SBram Moolenaar
316803290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
316903290b84SBram Moolenaar  assert_equal('name', g:some#name)
317003290b84SBram Moolenaar  g:some#other = 'other'
317103290b84SBram Moolenaar  assert_equal('other', g:some#other)
317203290b84SBram Moolenaar
3173*e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3174*e3ffcd99SBram Moolenaar
317517f700acSBram Moolenaar  # upper case script name works
317617f700acSBram Moolenaar  lines =<< trim END
317717f700acSBram Moolenaar     vim9script
317817f700acSBram Moolenaar     def Other#getOther(): string
317917f700acSBram Moolenaar       return 'other'
318017f700acSBram Moolenaar     enddef
318117f700acSBram Moolenaar  END
318217f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
318317f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
318417f700acSBram Moolenaar
318503290b84SBram Moolenaar  delete('Xdir', 'rf')
318603290b84SBram Moolenaar  &rtp = save_rtp
318703290b84SBram Moolenaarenddef
318803290b84SBram Moolenaar
318903290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
319003290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
319103290b84SBram Moolenaar  var lines =<< trim END
319203290b84SBram Moolenaar     vim9script
31932d6b20d6SBram Moolenaar     def foo#test()
31942d6b20d6SBram Moolenaar         echomsg getreg('"')
31952d6b20d6SBram Moolenaar     enddef
31962d6b20d6SBram Moolenaar  END
31972d6b20d6SBram Moolenaar
31982d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
31992d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3200cfcd011fSBram Moolenaar  var save_rtp = &rtp
32012d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
32022d6b20d6SBram Moolenaar  augroup test
32032d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
32042d6b20d6SBram Moolenaar  augroup END
32052d6b20d6SBram Moolenaar
32062d6b20d6SBram Moolenaar  normal Y
32072d6b20d6SBram Moolenaar
32082d6b20d6SBram Moolenaar  augroup test
32092d6b20d6SBram Moolenaar    autocmd!
32102d6b20d6SBram Moolenaar  augroup END
32112d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
32122d6b20d6SBram Moolenaar  &rtp = save_rtp
32132d6b20d6SBram Moolenaarenddef
32142d6b20d6SBram Moolenaar
321577e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
321677e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3217cfcd011fSBram Moolenaar  var lines =<< trim END
321877e5dcc3SBram Moolenaar      vim9script
321977e5dcc3SBram Moolenaar      def crash#func()
322077e5dcc3SBram Moolenaar          try
322177e5dcc3SBram Moolenaar              for x in List()
322277e5dcc3SBram Moolenaar              endfor
322377e5dcc3SBram Moolenaar          catch
322477e5dcc3SBram Moolenaar          endtry
322577e5dcc3SBram Moolenaar          g:ok = true
322677e5dcc3SBram Moolenaar      enddef
322777e5dcc3SBram Moolenaar      fu List()
322877e5dcc3SBram Moolenaar          invalid
322977e5dcc3SBram Moolenaar      endfu
323077e5dcc3SBram Moolenaar      try
323148e11c10SBram Moolenaar          alsoinvalid
323277e5dcc3SBram Moolenaar      catch /wontmatch/
323377e5dcc3SBram Moolenaar      endtry
323477e5dcc3SBram Moolenaar  END
323577e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
323677e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
323777e5dcc3SBram Moolenaar
323877e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
323977e5dcc3SBram Moolenaar  lines =<< trim END
324077e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
324177e5dcc3SBram Moolenaar    call crash#func()
324277e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
32439c4f5520SBram Moolenaar    qall!
324477e5dcc3SBram Moolenaar  END
324577e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
324677e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
324777e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
324877e5dcc3SBram Moolenaar
324977e5dcc3SBram Moolenaar  delete('Xdidit')
325077e5dcc3SBram Moolenaar  delete('Xscript')
325177e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
325203290b84SBram Moolenaar
325303290b84SBram Moolenaar  lines =<< trim END
325403290b84SBram Moolenaar    vim9script
325503290b84SBram Moolenaar    var foo#bar = 'asdf'
325603290b84SBram Moolenaar  END
325703290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
325877e5dcc3SBram Moolenaarenddef
325977e5dcc3SBram Moolenaar
326081e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
326181e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
326281e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3263cfcd011fSBram Moolenaar  var lines =<< trim END
326481e17fbeSBram Moolenaar    let s:counter = 1
326581e17fbeSBram Moolenaar    def s:Func()
326681e17fbeSBram Moolenaar      au! CursorHold
326781e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
326881e17fbeSBram Moolenaar    enddef
326981e17fbeSBram Moolenaar    call s:Func()
327081e17fbeSBram Moolenaar    doau CursorHold
327181e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
327281e17fbeSBram Moolenaar    au! CursorHold
327381e17fbeSBram Moolenaar  END
327481e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
327581e17fbeSBram Moolenaarenddef
327681e17fbeSBram Moolenaar
32773896a105SBram Moolenaardef Test_cmdline_win()
32783896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
32793896a105SBram Moolenaar  # the command line window.
32803896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3281cfcd011fSBram Moolenaar  var export_lines =<< trim END
32823896a105SBram Moolenaar    vim9script
3283cfcd011fSBram Moolenaar    export var That = 'yes'
32843896a105SBram Moolenaar  END
32853896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3286cfcd011fSBram Moolenaar  var import_lines =<< trim END
32873896a105SBram Moolenaar    vim9script
32883896a105SBram Moolenaar    import That from './Xexport.vim'
32893896a105SBram Moolenaar  END
32903896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3291cfcd011fSBram Moolenaar  var save_rtp = &rtp
32923896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
32933896a105SBram Moolenaar  syntax on
32943896a105SBram Moolenaar  augroup CmdWin
32953896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
32963896a105SBram Moolenaar  augroup END
32973896a105SBram Moolenaar  # this will open and also close the cmdline window
32983896a105SBram Moolenaar  feedkeys('q:', 'xt')
32993896a105SBram Moolenaar  assert_equal('yes', g:got_there)
33003896a105SBram Moolenaar
33013896a105SBram Moolenaar  augroup CmdWin
33023896a105SBram Moolenaar    au!
33033896a105SBram Moolenaar  augroup END
33043896a105SBram Moolenaar  &rtp = save_rtp
33053896a105SBram Moolenaar  delete('rtp', 'rf')
33063896a105SBram Moolenaarenddef
33073896a105SBram Moolenaar
3308e3d4685fSBram Moolenaardef Test_invalid_sid()
3309e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
331025859dd7SBram Moolenaar
33119c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3312d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3313e3d4685fSBram Moolenaar  endif
3314e3d4685fSBram Moolenaar  delete('Xdidit')
3315e3d4685fSBram Moolenaarenddef
3316e3d4685fSBram Moolenaar
33179ec7026fSBram Moolenaardef Test_restoring_cpo()
33189ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
33199ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
33209ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
33219ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
33229ec7026fSBram Moolenaar  endif
33239ec7026fSBram Moolenaar  delete('Xsourced')
33249ec7026fSBram Moolenaar  delete('Xclose')
3325090728adSBram Moolenaar  delete('Xdone')
33260123cc1eSBram Moolenaar
33270123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
33280123cc1eSBram Moolenaar  set cpo=aABceFsMny>
33290123cc1eSBram Moolenaar  edit XanotherScript
33300123cc1eSBram Moolenaar  so %
33310123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
33320123cc1eSBram Moolenaar  :1del
33330123cc1eSBram Moolenaar  w
33340123cc1eSBram Moolenaar  so %
33350123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
33360123cc1eSBram Moolenaar
33370123cc1eSBram Moolenaar  delete('XanotherScript')
33380123cc1eSBram Moolenaar  set cpo&vim
33399ec7026fSBram Moolenaarenddef
33409ec7026fSBram Moolenaar
33419ec7026fSBram Moolenaar
3342f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3343cfcd011fSBram Moolenaar  var lines =<< trim END
3344cfcd011fSBram Moolenaar    var name: any
3345cfcd011fSBram Moolenaar    assert_equal(0, name)
3346f0afd9e1SBram Moolenaar  END
3347f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3348f0afd9e1SBram Moolenaarenddef
3349f0afd9e1SBram Moolenaar
33507e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
335158dbef33SBram Moolenaar  CheckRunVimInTerminal
335258dbef33SBram Moolenaar
33537e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
33547e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
33557e9210eaSBram Moolenaarendfunc
33567e9210eaSBram Moolenaar
33577e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
33589c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3359cfcd011fSBram Moolenaar  var lines =<< trim END
33609c4f5520SBram Moolenaar    func CheckAndQuit()
33619c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
33629c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
33639c4f5520SBram Moolenaar    endfunc
33649c4f5520SBram Moolenaar  END
33659c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
33669c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3367e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
33689c4f5520SBram Moolenaar  # define Afunc() on the command line
33699c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
33709c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
33712949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
33729c4f5520SBram Moolenaar
33739c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
33749c4f5520SBram Moolenaar  delete('XcallFunc')
33759c4f5520SBram Moolenaar  delete('Xdidcmd')
33769c4f5520SBram Moolenaarenddef
33779c4f5520SBram Moolenaar
3378fcdc5d83SBram Moolenaardef Test_script_var_scope()
3379fcdc5d83SBram Moolenaar  var lines =<< trim END
3380fcdc5d83SBram Moolenaar      vim9script
3381fcdc5d83SBram Moolenaar      if true
3382fcdc5d83SBram Moolenaar        if true
3383fcdc5d83SBram Moolenaar          var one = 'one'
3384fcdc5d83SBram Moolenaar          echo one
3385fcdc5d83SBram Moolenaar        endif
3386fcdc5d83SBram Moolenaar        echo one
3387fcdc5d83SBram Moolenaar      endif
3388fcdc5d83SBram Moolenaar  END
3389fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3390fcdc5d83SBram Moolenaar
3391fcdc5d83SBram Moolenaar  lines =<< trim END
3392fcdc5d83SBram Moolenaar      vim9script
3393fcdc5d83SBram Moolenaar      if true
3394fcdc5d83SBram Moolenaar        if false
3395fcdc5d83SBram Moolenaar          var one = 'one'
3396fcdc5d83SBram Moolenaar          echo one
3397fcdc5d83SBram Moolenaar        else
3398fcdc5d83SBram Moolenaar          var one = 'one'
3399fcdc5d83SBram Moolenaar          echo one
3400fcdc5d83SBram Moolenaar        endif
3401fcdc5d83SBram Moolenaar        echo one
3402fcdc5d83SBram Moolenaar      endif
3403fcdc5d83SBram Moolenaar  END
3404fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3405fcdc5d83SBram Moolenaar
3406fcdc5d83SBram Moolenaar  lines =<< trim END
3407fcdc5d83SBram Moolenaar      vim9script
3408fcdc5d83SBram Moolenaar      while true
3409fcdc5d83SBram Moolenaar        var one = 'one'
3410fcdc5d83SBram Moolenaar        echo one
3411fcdc5d83SBram Moolenaar        break
3412fcdc5d83SBram Moolenaar      endwhile
3413fcdc5d83SBram Moolenaar      echo one
3414fcdc5d83SBram Moolenaar  END
3415fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3416fcdc5d83SBram Moolenaar
3417fcdc5d83SBram Moolenaar  lines =<< trim END
3418fcdc5d83SBram Moolenaar      vim9script
3419fcdc5d83SBram Moolenaar      for i in range(1)
3420fcdc5d83SBram Moolenaar        var one = 'one'
3421fcdc5d83SBram Moolenaar        echo one
3422fcdc5d83SBram Moolenaar      endfor
3423fcdc5d83SBram Moolenaar      echo one
3424fcdc5d83SBram Moolenaar  END
3425fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
34269becdf2bSBram Moolenaar
34279becdf2bSBram Moolenaar  lines =<< trim END
34289becdf2bSBram Moolenaar      vim9script
34299becdf2bSBram Moolenaar      {
34309becdf2bSBram Moolenaar        var one = 'one'
34319becdf2bSBram Moolenaar        assert_equal('one', one)
34329becdf2bSBram Moolenaar      }
34339becdf2bSBram Moolenaar      assert_false(exists('one'))
34349becdf2bSBram Moolenaar      assert_false(exists('s:one'))
34359becdf2bSBram Moolenaar  END
34369becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
34379becdf2bSBram Moolenaar
34389becdf2bSBram Moolenaar  lines =<< trim END
34399becdf2bSBram Moolenaar      vim9script
34409becdf2bSBram Moolenaar      {
34419becdf2bSBram Moolenaar        var one = 'one'
34429becdf2bSBram Moolenaar        echo one
34439becdf2bSBram Moolenaar      }
34449becdf2bSBram Moolenaar      echo one
34459becdf2bSBram Moolenaar  END
34469becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3447fcdc5d83SBram Moolenaarenddef
3448fcdc5d83SBram Moolenaar
3449352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3450352134bbSBram Moolenaar  var lines =<< trim END
3451352134bbSBram Moolenaar    vim9script
3452352134bbSBram Moolenaar    def Callback(...l: any)
3453352134bbSBram Moolenaar      try
3454352134bbSBram Moolenaar        var x: string
3455352134bbSBram Moolenaar        var y: string
3456352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3457352134bbSBram Moolenaar        [x, y] = ['']
3458352134bbSBram Moolenaar      catch
3459352134bbSBram Moolenaar        g:caught = 'yes'
3460352134bbSBram Moolenaar      endtry
3461352134bbSBram Moolenaar    enddef
3462e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3463352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3464352134bbSBram Moolenaar  END
3465352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3466352134bbSBram Moolenaar
3467352134bbSBram Moolenaar  unlet g:caught
3468352134bbSBram Moolenaarenddef
3469352134bbSBram Moolenaar
3470631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3471631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3472631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3473631e8f93SBram Moolenaar  endif
3474631e8f93SBram Moolenaar  var lines =<< trim END
3475631e8f93SBram Moolenaar      vim9script
3476631e8f93SBram Moolenaar      var source: list<number>
3477631e8f93SBram Moolenaar      def Out_cb(...l: any)
3478631e8f93SBram Moolenaar          eval [][0]
3479631e8f93SBram Moolenaar      enddef
3480631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3481631e8f93SBram Moolenaar          sleep 1m
3482631e8f93SBram Moolenaar          source += l
3483631e8f93SBram Moolenaar      enddef
3484e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
34856f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
34866f17a3f0SBram Moolenaar        sleep 10m
34876f17a3f0SBram Moolenaar      endwhile
3488206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3489206c2a6eSBram Moolenaar      sleep 100m
3490631e8f93SBram Moolenaar  END
3491631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3492631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3493631e8f93SBram Moolenaar  delete('Xdef')
3494631e8f93SBram Moolenaarenddef
3495631e8f93SBram Moolenaar
34964324d87aSBram Moolenaardef InvokeNormal()
34974324d87aSBram Moolenaar  exe "norm! :m+1\r"
34984324d87aSBram Moolenaarenddef
34994324d87aSBram Moolenaar
35004324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
35014324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
35024324d87aSBram Moolenaar  new
35034324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
35044324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
35054324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
35064324d87aSBram Moolenaar  xunmap <F3>
3507b5b9480eSBram Moolenaarenddef
3508b5b9480eSBram Moolenaar
3509b5b9480eSBram Moolenaardef Test_white_space_after_command()
3510b5b9480eSBram Moolenaar  var lines =<< trim END
3511b5b9480eSBram Moolenaar    exit_cb: Func})
3512b5b9480eSBram Moolenaar  END
3513b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3514f8103f27SBram Moolenaar
3515f8103f27SBram Moolenaar  lines =<< trim END
3516f8103f27SBram Moolenaar    e#
3517f8103f27SBram Moolenaar  END
3518f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
35194324d87aSBram Moolenaarenddef
35204324d87aSBram Moolenaar
35214aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
35224aab88d9SBram Moolenaar  var lines =<< trim END
35234aab88d9SBram Moolenaar      vim9script
35244aab88d9SBram Moolenaar      if exists('g:guard')
35254aab88d9SBram Moolenaar        finish
35264aab88d9SBram Moolenaar      endif
35274aab88d9SBram Moolenaar      g:guard = 1
35284aab88d9SBram Moolenaar      var name = 'thename'
35294aab88d9SBram Moolenaar      def g:GetName(): string
35304aab88d9SBram Moolenaar        return name
35314aab88d9SBram Moolenaar      enddef
35324aab88d9SBram Moolenaar      def g:SetName(arg: string)
35334aab88d9SBram Moolenaar        name = arg
35344aab88d9SBram Moolenaar      enddef
35354aab88d9SBram Moolenaar  END
35364aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
35374aab88d9SBram Moolenaar  so XscriptTwice.vim
35384aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
35394aab88d9SBram Moolenaar  g:SetName('newname')
35404aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
35414aab88d9SBram Moolenaar  so XscriptTwice.vim
35424aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
35434aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
35444aab88d9SBram Moolenaar
35454aab88d9SBram Moolenaar  delfunc g:GetName
35464aab88d9SBram Moolenaar  delfunc g:SetName
35474aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
35484aab88d9SBram Moolenaar  unlet g:guard
35494aab88d9SBram Moolenaarenddef
35504aab88d9SBram Moolenaar
35514aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
35524aab88d9SBram Moolenaar  var exportlines =<< trim END
35534aab88d9SBram Moolenaar      vim9script
35544aab88d9SBram Moolenaar      if exists('g:guard')
35554aab88d9SBram Moolenaar        finish
35564aab88d9SBram Moolenaar      endif
35574aab88d9SBram Moolenaar      g:guard = 1
35584aab88d9SBram Moolenaar      export var name = 'someName'
35594aab88d9SBram Moolenaar  END
35604aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
35614aab88d9SBram Moolenaar
35624aab88d9SBram Moolenaar  var lines =<< trim END
35634aab88d9SBram Moolenaar      vim9script
35644aab88d9SBram Moolenaar      import name from './XexportScript.vim'
35654aab88d9SBram Moolenaar      def g:GetName(): string
35664aab88d9SBram Moolenaar        return name
35674aab88d9SBram Moolenaar      enddef
35684aab88d9SBram Moolenaar  END
35694aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
35704aab88d9SBram Moolenaar  so XscriptImport.vim
35714aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
35724aab88d9SBram Moolenaar
35734aab88d9SBram Moolenaar  so XexportScript.vim
35744aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
35754aab88d9SBram Moolenaar
35764aab88d9SBram Moolenaar  delfunc g:GetName
35774aab88d9SBram Moolenaar  delete('XexportScript.vim')
35784aab88d9SBram Moolenaar  delete('XscriptImport.vim')
35794aab88d9SBram Moolenaar  unlet g:guard
35804aab88d9SBram Moolenaarenddef
35814aab88d9SBram Moolenaar
358210b9421fSBram Moolenaardef Test_unsupported_commands()
358310b9421fSBram Moolenaar  var lines =<< trim END
358410b9421fSBram Moolenaar      ka
358510b9421fSBram Moolenaar  END
358610b9421fSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1100:')
358710b9421fSBram Moolenaar
358810b9421fSBram Moolenaar  lines =<< trim END
3589ada1d870SBram Moolenaar      :1ka
3590ada1d870SBram Moolenaar  END
3591ada1d870SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E481:')
3592ada1d870SBram Moolenaar
3593ada1d870SBram Moolenaar  lines =<< trim END
359410b9421fSBram Moolenaar    t
359510b9421fSBram Moolenaar  END
359610b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
359710b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
359810b9421fSBram Moolenaar
359910b9421fSBram Moolenaar  lines =<< trim END
360010b9421fSBram Moolenaar    x
360110b9421fSBram Moolenaar  END
360210b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
360310b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
360410b9421fSBram Moolenaar
360510b9421fSBram Moolenaar  lines =<< trim END
360610b9421fSBram Moolenaar    xit
360710b9421fSBram Moolenaar  END
360810b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
360910b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
361010b9421fSBram Moolenaarenddef
361110b9421fSBram Moolenaar
3612585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3613585fea7bSBram Moolenaardef Test_substitute_cmd()
3614585fea7bSBram Moolenaar  new
3615585fea7bSBram Moolenaar  setline(1, 'something')
3616585fea7bSBram Moolenaar  :substitute(some(other(
3617585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3618585fea7bSBram Moolenaar  bwipe!
3619585fea7bSBram Moolenaar
3620f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3621cfcd011fSBram Moolenaar  var lines =<< trim END
3622585fea7bSBram Moolenaar    vim9script
3623585fea7bSBram Moolenaar    new
3624585fea7bSBram Moolenaar    setline(1, 'something')
3625585fea7bSBram Moolenaar    :substitute(some(other(
3626585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3627585fea7bSBram Moolenaar    bwipe!
3628585fea7bSBram Moolenaar  END
3629585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3630585fea7bSBram Moolenaar  source Xvim9lines
3631585fea7bSBram Moolenaar
3632585fea7bSBram Moolenaar  delete('Xvim9lines')
3633585fea7bSBram Moolenaarenddef
3634585fea7bSBram Moolenaar
36358a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3636