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)
2618a7d6542SBram Moolenaarenddef
2628a7d6542SBram Moolenaar
26308052228SBram Moolenaardef Test_block_failure()
264cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
26508052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
26608052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
26708052228SBram Moolenaarenddef
2688a7d6542SBram Moolenaar
269fbbcd003SBram Moolenaardef Test_block_local_vars()
270fbbcd003SBram Moolenaar  var lines =<< trim END
271fbbcd003SBram Moolenaar      vim9script
272ed234f24SBram Moolenaar      v:testing = 1
273fbbcd003SBram Moolenaar      if true
274ed234f24SBram Moolenaar        var text = ['hello']
275ed234f24SBram Moolenaar        def SayHello(): list<string>
276fbbcd003SBram Moolenaar          return text
277fbbcd003SBram Moolenaar        enddef
278fbbcd003SBram Moolenaar        def SetText(v: string)
279ed234f24SBram Moolenaar          text = [v]
280fbbcd003SBram Moolenaar        enddef
281fbbcd003SBram Moolenaar      endif
282fbbcd003SBram Moolenaar
283fbbcd003SBram Moolenaar      if true
284ed234f24SBram Moolenaar        var text = ['again']
285ed234f24SBram Moolenaar        def SayAgain(): list<string>
286fbbcd003SBram Moolenaar          return text
287fbbcd003SBram Moolenaar        enddef
288fbbcd003SBram Moolenaar      endif
289ed234f24SBram Moolenaar
290ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
291ed234f24SBram Moolenaar      test_garbagecollect_now()
292ed234f24SBram Moolenaar
293fbbcd003SBram Moolenaar      defcompile
294fbbcd003SBram Moolenaar
295ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
296ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
297fbbcd003SBram Moolenaar
298fbbcd003SBram Moolenaar      SetText('foobar')
299ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
300ed234f24SBram Moolenaar
301ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
302ed234f24SBram Moolenaar      qall!
303fbbcd003SBram Moolenaar  END
304ed234f24SBram Moolenaar
305ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
306ed234f24SBram Moolenaar  # context gets garbage collected.
307ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
308ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
309ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
310ed234f24SBram Moolenaar
311ed234f24SBram Moolenaar  delete('Xscript')
312ed234f24SBram Moolenaar  delete('Xdidit')
313fbbcd003SBram Moolenaarenddef
314fbbcd003SBram Moolenaar
31539ca4127SBram Moolenaardef Test_block_local_vars_with_func()
31639ca4127SBram Moolenaar  var lines =<< trim END
31739ca4127SBram Moolenaar      vim9script
31839ca4127SBram Moolenaar      if true
31939ca4127SBram Moolenaar        var foo = 'foo'
32039ca4127SBram Moolenaar        if true
32139ca4127SBram Moolenaar          var bar = 'bar'
32239ca4127SBram Moolenaar          def Func(): list<string>
32339ca4127SBram Moolenaar            return [foo, bar]
32439ca4127SBram Moolenaar          enddef
32539ca4127SBram Moolenaar        endif
32639ca4127SBram Moolenaar      endif
32739ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
32839ca4127SBram Moolenaar      # "foo" and "bar"
32939ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
33039ca4127SBram Moolenaar  END
33139ca4127SBram Moolenaar  CheckScriptSuccess(lines)
33239ca4127SBram Moolenaarenddef
33339ca4127SBram Moolenaar
334d032f34aSBram Moolenaarfunc g:NoSuchFunc()
335d032f34aSBram Moolenaar  echo 'none'
336d032f34aSBram Moolenaarendfunc
337d032f34aSBram Moolenaar
3389e1d9e34SBram Moolenaardef Test_try_catch_throw()
339cfcd011fSBram Moolenaar  var l = []
3407a092245SBram Moolenaar  try # comment
3418a7d6542SBram Moolenaar    add(l, '1')
3428a7d6542SBram Moolenaar    throw 'wrong'
3438a7d6542SBram Moolenaar    add(l, '2')
3447a092245SBram Moolenaar  catch # comment
3458a7d6542SBram Moolenaar    add(l, v:exception)
3467a092245SBram Moolenaar  finally # comment
3478a7d6542SBram Moolenaar    add(l, '3')
3487a092245SBram Moolenaar  endtry # comment
3498a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
35068d130c6SBram Moolenaar
351e859312eSBram Moolenaar  l = []
352e859312eSBram Moolenaar  try
353e859312eSBram Moolenaar    try
354e859312eSBram Moolenaar      add(l, '1')
355e859312eSBram Moolenaar      throw 'wrong'
356e859312eSBram Moolenaar      add(l, '2')
357e859312eSBram Moolenaar    catch /right/
358e859312eSBram Moolenaar      add(l, v:exception)
359e859312eSBram Moolenaar    endtry
360e859312eSBram Moolenaar  catch /wrong/
361e859312eSBram Moolenaar    add(l, 'caught')
362373863edSBram Moolenaar  fina
363e859312eSBram Moolenaar    add(l, 'finally')
364e859312eSBram Moolenaar  endtry
365e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
366e859312eSBram Moolenaar
367cfcd011fSBram Moolenaar  var n: number
36868d130c6SBram Moolenaar  try
36968d130c6SBram Moolenaar    n = l[3]
37068d130c6SBram Moolenaar  catch /E684:/
37168d130c6SBram Moolenaar    n = 99
37268d130c6SBram Moolenaar  endtry
37368d130c6SBram Moolenaar  assert_equal(99, n)
37468d130c6SBram Moolenaar
37569f7050cSBram Moolenaar  var done = 'no'
37669f7050cSBram Moolenaar  if 0
37769f7050cSBram Moolenaar    try | catch | endtry
37869f7050cSBram Moolenaar  else
37969f7050cSBram Moolenaar    done = 'yes'
38069f7050cSBram Moolenaar  endif
38169f7050cSBram Moolenaar  assert_equal('yes', done)
38269f7050cSBram Moolenaar
38369f7050cSBram Moolenaar  done = 'no'
38469f7050cSBram Moolenaar  if 1
38569f7050cSBram Moolenaar    done = 'yes'
38669f7050cSBram Moolenaar  else
38769f7050cSBram Moolenaar    try | catch | endtry
38869f7050cSBram Moolenaar    done = 'never'
38969f7050cSBram Moolenaar  endif
39069f7050cSBram Moolenaar  assert_equal('yes', done)
39169f7050cSBram Moolenaar
39269f7050cSBram Moolenaar  if 1
39369f7050cSBram Moolenaar  else
39469f7050cSBram Moolenaar    try | catch /pat/ | endtry
39569f7050cSBram Moolenaar    try | catch /pat/
39669f7050cSBram Moolenaar    endtry
39769f7050cSBram Moolenaar    try
39869f7050cSBram Moolenaar    catch /pat/ | endtry
39969f7050cSBram Moolenaar    try
40069f7050cSBram Moolenaar    catch /pat/
40169f7050cSBram Moolenaar    endtry
40269f7050cSBram Moolenaar  endif
40369f7050cSBram Moolenaar
40468d130c6SBram Moolenaar  try
405cc673e74SBram Moolenaar    # string slice returns a string, not a number
40668d130c6SBram Moolenaar    n = g:astring[3]
4075e654230SBram Moolenaar  catch /E1012:/
40868d130c6SBram Moolenaar    n = 77
40968d130c6SBram Moolenaar  endtry
41068d130c6SBram Moolenaar  assert_equal(77, n)
41168d130c6SBram Moolenaar
41268d130c6SBram Moolenaar  try
41368d130c6SBram Moolenaar    n = l[g:astring]
4145e654230SBram Moolenaar  catch /E1012:/
41556acb094SBram Moolenaar    n = 88
41668d130c6SBram Moolenaar  endtry
41756acb094SBram Moolenaar  assert_equal(88, n)
41868d130c6SBram Moolenaar
41968d130c6SBram Moolenaar  try
42068d130c6SBram Moolenaar    n = s:does_not_exist
42168d130c6SBram Moolenaar  catch /E121:/
422f0b9f43cSBram Moolenaar    n = 111
423f0b9f43cSBram Moolenaar  endtry
424f0b9f43cSBram Moolenaar  assert_equal(111, n)
425f0b9f43cSBram Moolenaar
426f0b9f43cSBram Moolenaar  try
427f0b9f43cSBram Moolenaar    n = g:does_not_exist
428f0b9f43cSBram Moolenaar  catch /E121:/
42968d130c6SBram Moolenaar    n = 121
43068d130c6SBram Moolenaar  endtry
43168d130c6SBram Moolenaar  assert_equal(121, n)
43268d130c6SBram Moolenaar
433e0de171eSBram Moolenaar  var d = {one: 1}
43468d130c6SBram Moolenaar  try
43568d130c6SBram Moolenaar    n = d[g:astring]
43668d130c6SBram Moolenaar  catch /E716:/
43768d130c6SBram Moolenaar    n = 222
43868d130c6SBram Moolenaar  endtry
43968d130c6SBram Moolenaar  assert_equal(222, n)
440f0b9f43cSBram Moolenaar
441f0b9f43cSBram Moolenaar  try
442f0b9f43cSBram Moolenaar    n = -g:astring
443f0b9f43cSBram Moolenaar  catch /E39:/
444f0b9f43cSBram Moolenaar    n = 233
445f0b9f43cSBram Moolenaar  endtry
446f0b9f43cSBram Moolenaar  assert_equal(233, n)
447f0b9f43cSBram Moolenaar
448f0b9f43cSBram Moolenaar  try
449f0b9f43cSBram Moolenaar    n = +g:astring
450f0b9f43cSBram Moolenaar  catch /E1030:/
451f0b9f43cSBram Moolenaar    n = 244
452f0b9f43cSBram Moolenaar  endtry
453f0b9f43cSBram Moolenaar  assert_equal(244, n)
454f0b9f43cSBram Moolenaar
455f0b9f43cSBram Moolenaar  try
456f0b9f43cSBram Moolenaar    n = +g:alist
457f0b9f43cSBram Moolenaar  catch /E745:/
458f0b9f43cSBram Moolenaar    n = 255
459f0b9f43cSBram Moolenaar  endtry
460f0b9f43cSBram Moolenaar  assert_equal(255, n)
461f0b9f43cSBram Moolenaar
462cfcd011fSBram Moolenaar  var nd: dict<any>
463f0b9f43cSBram Moolenaar  try
4642e5910bfSBram Moolenaar    nd = {[g:alist]: 1}
4652e5910bfSBram Moolenaar  catch /E1105:/
466f0b9f43cSBram Moolenaar    n = 266
467f0b9f43cSBram Moolenaar  endtry
468f0b9f43cSBram Moolenaar  assert_equal(266, n)
469f0b9f43cSBram Moolenaar
470f0b9f43cSBram Moolenaar  try
471f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
472f0b9f43cSBram Moolenaar  catch /E1093:/
473f0b9f43cSBram Moolenaar    n = 277
474f0b9f43cSBram Moolenaar  endtry
475f0b9f43cSBram Moolenaar  assert_equal(277, n)
476f0b9f43cSBram Moolenaar
477e859312eSBram Moolenaar  try
478e859312eSBram Moolenaar    &ts = g:astring
4795e654230SBram Moolenaar  catch /E1012:/
480e859312eSBram Moolenaar    n = 288
481e859312eSBram Moolenaar  endtry
482e859312eSBram Moolenaar  assert_equal(288, n)
483e859312eSBram Moolenaar
484e859312eSBram Moolenaar  try
485e859312eSBram Moolenaar    &backspace = 'asdf'
486e859312eSBram Moolenaar  catch /E474:/
487e859312eSBram Moolenaar    n = 299
488e859312eSBram Moolenaar  endtry
489e859312eSBram Moolenaar  assert_equal(299, n)
490e859312eSBram Moolenaar
491e859312eSBram Moolenaar  l = [1]
492e859312eSBram Moolenaar  try
493e859312eSBram Moolenaar    l[3] = 3
494e859312eSBram Moolenaar  catch /E684:/
495e859312eSBram Moolenaar    n = 300
496e859312eSBram Moolenaar  endtry
497e859312eSBram Moolenaar  assert_equal(300, n)
498e859312eSBram Moolenaar
499e859312eSBram Moolenaar  try
500e859312eSBram Moolenaar    unlet g:does_not_exist
501e859312eSBram Moolenaar  catch /E108:/
502e859312eSBram Moolenaar    n = 322
503e859312eSBram Moolenaar  endtry
504e859312eSBram Moolenaar  assert_equal(322, n)
505e859312eSBram Moolenaar
506e859312eSBram Moolenaar  try
5072bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
508e859312eSBram Moolenaar  catch /E721:/
509e859312eSBram Moolenaar    n = 333
510e859312eSBram Moolenaar  endtry
511e859312eSBram Moolenaar  assert_equal(333, n)
512e859312eSBram Moolenaar
513e859312eSBram Moolenaar  try
514e859312eSBram Moolenaar    l = DeletedFunc()
515e859312eSBram Moolenaar  catch /E933:/
516e859312eSBram Moolenaar    n = 344
517e859312eSBram Moolenaar  endtry
518e859312eSBram Moolenaar  assert_equal(344, n)
519d032f34aSBram Moolenaar
520d032f34aSBram Moolenaar  try
521d032f34aSBram Moolenaar    echo len(v:true)
522d032f34aSBram Moolenaar  catch /E701:/
523d032f34aSBram Moolenaar    n = 355
524d032f34aSBram Moolenaar  endtry
525d032f34aSBram Moolenaar  assert_equal(355, n)
526d032f34aSBram Moolenaar
527cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
528d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
529d032f34aSBram Moolenaar  try
530d032f34aSBram Moolenaar    echo P()
531d032f34aSBram Moolenaar  catch /E117:/
532d032f34aSBram Moolenaar    n = 366
533d032f34aSBram Moolenaar  endtry
534d032f34aSBram Moolenaar  assert_equal(366, n)
535d032f34aSBram Moolenaar
536d032f34aSBram Moolenaar  try
537d032f34aSBram Moolenaar    echo g:NoSuchFunc()
538d032f34aSBram Moolenaar  catch /E117:/
539d032f34aSBram Moolenaar    n = 377
540d032f34aSBram Moolenaar  endtry
541d032f34aSBram Moolenaar  assert_equal(377, n)
542d032f34aSBram Moolenaar
543d032f34aSBram Moolenaar  try
544d032f34aSBram Moolenaar    echo g:alist + 4
545d032f34aSBram Moolenaar  catch /E745:/
546d032f34aSBram Moolenaar    n = 388
547d032f34aSBram Moolenaar  endtry
548d032f34aSBram Moolenaar  assert_equal(388, n)
549d032f34aSBram Moolenaar
550d032f34aSBram Moolenaar  try
551d032f34aSBram Moolenaar    echo 4 + g:alist
552d032f34aSBram Moolenaar  catch /E745:/
553d032f34aSBram Moolenaar    n = 399
554d032f34aSBram Moolenaar  endtry
555d032f34aSBram Moolenaar  assert_equal(399, n)
556d032f34aSBram Moolenaar
557d032f34aSBram Moolenaar  try
558d032f34aSBram Moolenaar    echo g:alist.member
559d032f34aSBram Moolenaar  catch /E715:/
560d032f34aSBram Moolenaar    n = 400
561d032f34aSBram Moolenaar  endtry
562d032f34aSBram Moolenaar  assert_equal(400, n)
563d032f34aSBram Moolenaar
564d032f34aSBram Moolenaar  try
565d032f34aSBram Moolenaar    echo d.member
566d032f34aSBram Moolenaar  catch /E716:/
567d032f34aSBram Moolenaar    n = 411
568d032f34aSBram Moolenaar  endtry
569d032f34aSBram Moolenaar  assert_equal(411, n)
570d9d7789bSBram Moolenaar
571d9d7789bSBram Moolenaar  var counter = 0
572d9d7789bSBram Moolenaar  for i in range(4)
573d9d7789bSBram Moolenaar    try
574d9d7789bSBram Moolenaar      eval [][0]
575d9d7789bSBram Moolenaar    catch
576d9d7789bSBram Moolenaar    endtry
577d9d7789bSBram Moolenaar    counter += 1
578d9d7789bSBram Moolenaar  endfor
579d9d7789bSBram Moolenaar  assert_equal(4, counter)
580*7e82c5f3SBram Moolenaar
581*7e82c5f3SBram Moolenaar  # return in finally after empty catch
582*7e82c5f3SBram Moolenaar  def ReturnInFinally(): number
583*7e82c5f3SBram Moolenaar    try
584*7e82c5f3SBram Moolenaar    finally
585*7e82c5f3SBram Moolenaar      return 4
586*7e82c5f3SBram Moolenaar    endtry
587*7e82c5f3SBram Moolenaar    return 2
588*7e82c5f3SBram Moolenaar  enddef
589*7e82c5f3SBram Moolenaar  assert_equal(4, ReturnInFinally())
5908a7d6542SBram Moolenaarenddef
5918a7d6542SBram Moolenaar
5921430ceebSBram Moolenaardef Test_cnext_works_in_catch()
5931430ceebSBram Moolenaar  var lines =<< trim END
5941430ceebSBram Moolenaar      vim9script
5951430ceebSBram Moolenaar      au BufEnter * eval 0
5961430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
5971430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
5981430ceebSBram Moolenaar      var items = [
5991430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
6001430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
6011430ceebSBram Moolenaar        ]
6021430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
6031430ceebSBram Moolenaar      cwindow
6041430ceebSBram Moolenaar
6051430ceebSBram Moolenaar      def CnextOrCfirst()
6061430ceebSBram Moolenaar        # if cnext fails, cfirst is used
6071430ceebSBram Moolenaar        try
6081430ceebSBram Moolenaar          cnext
6091430ceebSBram Moolenaar        catch
6101430ceebSBram Moolenaar          cfirst
6111430ceebSBram Moolenaar        endtry
6121430ceebSBram Moolenaar      enddef
6131430ceebSBram Moolenaar
6141430ceebSBram Moolenaar      CnextOrCfirst()
6151430ceebSBram Moolenaar      CnextOrCfirst()
6161430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
6171430ceebSBram Moolenaar      qall
6181430ceebSBram Moolenaar  END
6191430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
6201430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
6211430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
6221430ceebSBram Moolenaar
6231430ceebSBram Moolenaar  delete('Xfile1')
6241430ceebSBram Moolenaar  delete('Xfile2')
6251430ceebSBram Moolenaar  delete('XCatchCnext')
6261430ceebSBram Moolenaar  delete('Xresult')
6271430ceebSBram Moolenaarenddef
6281430ceebSBram Moolenaar
6299e1d9e34SBram Moolenaardef Test_throw_skipped()
6309e1d9e34SBram Moolenaar  if 0
6319e1d9e34SBram Moolenaar    throw dontgethere
6329e1d9e34SBram Moolenaar  endif
6339e1d9e34SBram Moolenaarenddef
6349e1d9e34SBram Moolenaar
6358f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
6368f81b22eSBram Moolenaar  var lines =<< trim END
6378f81b22eSBram Moolenaar    vim9script
6388f81b22eSBram Moolenaar    def Func()
6398f81b22eSBram Moolenaar      throw 'error'
6408f81b22eSBram Moolenaar    enddef
6418f81b22eSBram Moolenaar    silent! Func()
6428f81b22eSBram Moolenaar  END
6438f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
6448f81b22eSBram Moolenaar  source XthrowSilenced
6458f81b22eSBram Moolenaar  delete('XthrowSilenced')
6468f81b22eSBram Moolenaarenddef
6478f81b22eSBram Moolenaar
648e859312eSBram Moolenaardef DeletedFunc(): list<any>
649e859312eSBram Moolenaar  return ['delete me']
650e859312eSBram Moolenaarenddef
651e859312eSBram Moolenaardefcompile
652e859312eSBram Moolenaardelfunc DeletedFunc
653e859312eSBram Moolenaar
654257cc5eeSBram Moolenaardef ThrowFromDef()
655a72cfb80SBram Moolenaar  throw "getout" # comment
656257cc5eeSBram Moolenaarenddef
657257cc5eeSBram Moolenaar
658257cc5eeSBram Moolenaarfunc CatchInFunc()
659257cc5eeSBram Moolenaar  try
660257cc5eeSBram Moolenaar    call ThrowFromDef()
661257cc5eeSBram Moolenaar  catch
662257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
663257cc5eeSBram Moolenaar  endtry
664257cc5eeSBram Moolenaarendfunc
665257cc5eeSBram Moolenaar
666257cc5eeSBram Moolenaardef CatchInDef()
667257cc5eeSBram Moolenaar  try
668257cc5eeSBram Moolenaar    ThrowFromDef()
669257cc5eeSBram Moolenaar  catch
670257cc5eeSBram Moolenaar    g:thrown_def = v:exception
671257cc5eeSBram Moolenaar  endtry
672257cc5eeSBram Moolenaarenddef
673257cc5eeSBram Moolenaar
674f575adffSBram Moolenaardef ReturnFinally(): string
675f575adffSBram Moolenaar  try
676f575adffSBram Moolenaar    return 'intry'
677373863edSBram Moolenaar  finall
678f575adffSBram Moolenaar    g:in_finally = 'finally'
679f575adffSBram Moolenaar  endtry
680f575adffSBram Moolenaar  return 'end'
681f575adffSBram Moolenaarenddef
682f575adffSBram Moolenaar
683257cc5eeSBram Moolenaardef Test_try_catch_nested()
684257cc5eeSBram Moolenaar  CatchInFunc()
685257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
686257cc5eeSBram Moolenaar
687257cc5eeSBram Moolenaar  CatchInDef()
688257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
689f575adffSBram Moolenaar
690f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
691f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
692f575adffSBram Moolenaarenddef
693f575adffSBram Moolenaar
6949939f57bSBram Moolenaardef TryOne(): number
6959939f57bSBram Moolenaar  try
6969939f57bSBram Moolenaar    return 0
6979939f57bSBram Moolenaar  catch
6989939f57bSBram Moolenaar  endtry
6999939f57bSBram Moolenaar  return 0
7009939f57bSBram Moolenaarenddef
7019939f57bSBram Moolenaar
7029939f57bSBram Moolenaardef TryTwo(n: number): string
7039939f57bSBram Moolenaar  try
704cfcd011fSBram Moolenaar    var x = {}
7059939f57bSBram Moolenaar  catch
7069939f57bSBram Moolenaar  endtry
7079939f57bSBram Moolenaar  return 'text'
7089939f57bSBram Moolenaarenddef
7099939f57bSBram Moolenaar
7109939f57bSBram Moolenaardef Test_try_catch_twice()
7119939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
7129939f57bSBram Moolenaarenddef
7139939f57bSBram Moolenaar
714f575adffSBram Moolenaardef Test_try_catch_match()
715cfcd011fSBram Moolenaar  var seq = 'a'
716f575adffSBram Moolenaar  try
717f575adffSBram Moolenaar    throw 'something'
718f575adffSBram Moolenaar  catch /nothing/
719f575adffSBram Moolenaar    seq ..= 'x'
720f575adffSBram Moolenaar  catch /some/
721f575adffSBram Moolenaar    seq ..= 'b'
722f575adffSBram Moolenaar  catch /asdf/
723f575adffSBram Moolenaar    seq ..= 'x'
724e8c4abbbSBram Moolenaar  catch ?a\?sdf?
725e8c4abbbSBram Moolenaar    seq ..= 'y'
726f575adffSBram Moolenaar  finally
727f575adffSBram Moolenaar    seq ..= 'c'
728f575adffSBram Moolenaar  endtry
729f575adffSBram Moolenaar  assert_equal('abc', seq)
730257cc5eeSBram Moolenaarenddef
731257cc5eeSBram Moolenaar
732e8c4abbbSBram Moolenaardef Test_try_catch_fails()
733d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
734d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
735d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
736d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
737d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
738d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
739d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
740d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
74113106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
742d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
743585fea7bSBram Moolenaar
744e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
745d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
746e8c4abbbSBram Moolenaarenddef
747e8c4abbbSBram Moolenaar
7487c5b3c03SBram Moolenaardef Try_catch_skipped()
7497c5b3c03SBram Moolenaar  var l = []
7507c5b3c03SBram Moolenaar  try
7517c5b3c03SBram Moolenaar  finally
7527c5b3c03SBram Moolenaar  endtry
7537c5b3c03SBram Moolenaar
7547c5b3c03SBram Moolenaar  if 1
7557c5b3c03SBram Moolenaar  else
7567c5b3c03SBram Moolenaar    try
7577c5b3c03SBram Moolenaar    endtry
7587c5b3c03SBram Moolenaar  endif
7597c5b3c03SBram Moolenaarenddef
7607c5b3c03SBram Moolenaar
7617c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
7627c5b3c03SBram Moolenaardef Test_try_catch_skipped()
7637c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
7647c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
7657c5b3c03SBram Moolenaarenddef
7667c5b3c03SBram Moolenaar
7677c5b3c03SBram Moolenaar
7687c5b3c03SBram Moolenaar
769006ad48bSBram Moolenaardef Test_throw_vimscript()
770f5be8cdbSBram Moolenaar  # only checks line continuation
771cfcd011fSBram Moolenaar  var lines =<< trim END
772006ad48bSBram Moolenaar      vim9script
773006ad48bSBram Moolenaar      try
774006ad48bSBram Moolenaar        throw 'one'
775006ad48bSBram Moolenaar              .. 'two'
776006ad48bSBram Moolenaar      catch
777006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
778006ad48bSBram Moolenaar      endtry
779006ad48bSBram Moolenaar  END
780006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
7811e021e63SBram Moolenaar
7821e021e63SBram Moolenaar  lines =<< trim END
7831e021e63SBram Moolenaar    vim9script
784352134bbSBram Moolenaar    @r = ''
7851e021e63SBram Moolenaar    def Func()
7861e021e63SBram Moolenaar      throw @r
7871e021e63SBram Moolenaar    enddef
7881e021e63SBram Moolenaar    var result = ''
7891e021e63SBram Moolenaar    try
7901e021e63SBram Moolenaar      Func()
7911e021e63SBram Moolenaar    catch /E1129:/
7921e021e63SBram Moolenaar      result = 'caught'
7931e021e63SBram Moolenaar    endtry
7941e021e63SBram Moolenaar    assert_equal('caught', result)
7951e021e63SBram Moolenaar  END
7961e021e63SBram Moolenaar  CheckScriptSuccess(lines)
797006ad48bSBram Moolenaarenddef
798006ad48bSBram Moolenaar
799ed677f55SBram Moolenaardef Test_error_in_nested_function()
80003dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
801cfcd011fSBram Moolenaar  var lines =<< trim END
802ed677f55SBram Moolenaar      vim9script
803ed677f55SBram Moolenaar      def Func()
804ed677f55SBram Moolenaar        Error()
805ed677f55SBram Moolenaar        g:test_var = 1
806ed677f55SBram Moolenaar      enddef
807ed677f55SBram Moolenaar      func Error() abort
808ed677f55SBram Moolenaar        eval [][0]
809ed677f55SBram Moolenaar      endfunc
810ed677f55SBram Moolenaar      Func()
811ed677f55SBram Moolenaar  END
812ed677f55SBram Moolenaar  g:test_var = 0
813ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
814ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
815ed677f55SBram Moolenaarenddef
816ed677f55SBram Moolenaar
81737c83711SBram Moolenaardef Test_cexpr_vimscript()
818f5be8cdbSBram Moolenaar  # only checks line continuation
81937c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
820cfcd011fSBram Moolenaar  var lines =<< trim END
82137c83711SBram Moolenaar      vim9script
82237c83711SBram Moolenaar      cexpr 'File'
82337c83711SBram Moolenaar                .. ' someFile' ..
82437c83711SBram Moolenaar                   ' line 19'
82537c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
82637c83711SBram Moolenaar  END
82737c83711SBram Moolenaar  CheckScriptSuccess(lines)
82837c83711SBram Moolenaar  set errorformat&
82937c83711SBram Moolenaarenddef
83037c83711SBram Moolenaar
831c9edd6b5SBram Moolenaardef Test_statusline_syntax()
832c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
833cfcd011fSBram Moolenaar  var lines =<< trim END
834c9edd6b5SBram Moolenaar      vim9script
835c9edd6b5SBram Moolenaar      func g:Status()
836c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
837c9edd6b5SBram Moolenaar      endfunc
838c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
839c9edd6b5SBram Moolenaar      redrawstatus
840c9edd6b5SBram Moolenaar      set laststatus statusline=
841c9edd6b5SBram Moolenaar  END
842c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
843c9edd6b5SBram Moolenaarenddef
844c9edd6b5SBram Moolenaar
845b209750bSBram Moolenaardef Test_list_vimscript()
846b209750bSBram Moolenaar  # checks line continuation and comments
847cfcd011fSBram Moolenaar  var lines =<< trim END
848b209750bSBram Moolenaar      vim9script
849cfcd011fSBram Moolenaar      var mylist = [
850b209750bSBram Moolenaar            'one',
851b209750bSBram Moolenaar            # comment
852b209750bSBram Moolenaar            'two', # empty line follows
853b209750bSBram Moolenaar
854b209750bSBram Moolenaar            'three',
855b209750bSBram Moolenaar            ]
856b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
857b209750bSBram Moolenaar  END
858b209750bSBram Moolenaar  CheckScriptSuccess(lines)
85966250c93SBram Moolenaar
86066250c93SBram Moolenaar  # check all lines from heredoc are kept
86166250c93SBram Moolenaar  lines =<< trim END
86266250c93SBram Moolenaar      # comment 1
86366250c93SBram Moolenaar      two
86466250c93SBram Moolenaar      # comment 3
86566250c93SBram Moolenaar
86666250c93SBram Moolenaar      five
86766250c93SBram Moolenaar      # comment 6
86866250c93SBram Moolenaar  END
86966250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
8704bce26bbSBram Moolenaar
8714bce26bbSBram Moolenaar  lines =<< trim END
8724bce26bbSBram Moolenaar    [{
8734bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
8744bce26bbSBram Moolenaar  END
8754bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
876b209750bSBram Moolenaarenddef
877b209750bSBram Moolenaar
8782a1381c3SBram Moolenaarif has('channel')
87940ee466cSBram Moolenaar  let someJob = test_null_job()
88040ee466cSBram Moolenaar
88140ee466cSBram Moolenaar  def FuncWithError()
88240ee466cSBram Moolenaar    echomsg g:someJob
88340ee466cSBram Moolenaar  enddef
88440ee466cSBram Moolenaar
88540ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
88640ee466cSBram Moolenaar    try
88740ee466cSBram Moolenaar      call FuncWithError()
88840ee466cSBram Moolenaar    catch
88940ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
89040ee466cSBram Moolenaar    endtry
89140ee466cSBram Moolenaar  endfunc
8922a1381c3SBram Moolenaarendif
89340ee466cSBram Moolenaar
8948a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
8958a7d6542SBram Moolenaar  vim9script
896cfcd011fSBram Moolenaar  var name: string = 'bob'
8978a7d6542SBram Moolenaar  def Concat(arg: string): string
8988a7d6542SBram Moolenaar    return name .. arg
8998a7d6542SBram Moolenaar  enddef
900227a69deSBram Moolenaar  g:result = Concat('bie')
901227a69deSBram Moolenaar  g:localname = name
9028a7d6542SBram Moolenaar
9038a7d6542SBram Moolenaar  export const CONST = 1234
904cfcd011fSBram Moolenaar  export var exported = 9876
905cfcd011fSBram Moolenaar  export var exp_name = 'John'
9068a7d6542SBram Moolenaar  export def Exported(): string
9078a7d6542SBram Moolenaar    return 'Exported'
9088a7d6542SBram Moolenaar  enddef
9098a7d6542SBram MoolenaarEND
9108a7d6542SBram Moolenaar
911b3ca9824SBram Moolenaardef Undo_export_script_lines()
912b3ca9824SBram Moolenaar  unlet g:result
913b3ca9824SBram Moolenaar  unlet g:localname
914b3ca9824SBram Moolenaarenddef
915b3ca9824SBram Moolenaar
9165269bd2aSBram Moolenaardef Test_vim9_import_export()
917cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
9188a7d6542SBram Moolenaar    vim9script
9198a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
9208a7d6542SBram Moolenaar    g:imported = exported
9216e587dcbSBram Moolenaar    exported += 3
9226e587dcbSBram Moolenaar    g:imported_added = exported
9238a7d6542SBram Moolenaar    g:imported_func = Exported()
9246e587dcbSBram Moolenaar
92540f4f7a4SBram Moolenaar    def GetExported(): string
926e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
92740f4f7a4SBram Moolenaar      return local_dict.ref()
92840f4f7a4SBram Moolenaar    enddef
92940f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
93040f4f7a4SBram Moolenaar
9316e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
9326e587dcbSBram Moolenaar    g:imported_name = exp_name
9336e587dcbSBram Moolenaar    exp_name ..= ' Doe'
9346e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
9355381c7a1SBram Moolenaar    g:imported_later = exported
9368a7d6542SBram Moolenaar  END
9378a7d6542SBram Moolenaar
9388a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
9398a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
9408a7d6542SBram Moolenaar
9418a7d6542SBram Moolenaar  source Ximport.vim
9428a7d6542SBram Moolenaar
9438a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
9448a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
9458a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
9466e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
9475381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
9488a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
94940f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
9506e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
9516e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
9528a7d6542SBram Moolenaar  assert_false(exists('g:name'))
9538a7d6542SBram Moolenaar
954b3ca9824SBram Moolenaar  Undo_export_script_lines()
9558a7d6542SBram Moolenaar  unlet g:imported
9566e587dcbSBram Moolenaar  unlet g:imported_added
9575381c7a1SBram Moolenaar  unlet g:imported_later
9588a7d6542SBram Moolenaar  unlet g:imported_func
9596e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
9608a7d6542SBram Moolenaar  delete('Ximport.vim')
961f2d5c240SBram Moolenaar
9621c991144SBram Moolenaar  # similar, with line breaks
963cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
9641c991144SBram Moolenaar    vim9script
9651c991144SBram Moolenaar    import {
9661c991144SBram Moolenaar        exported,
9671c991144SBram Moolenaar        Exported,
9681c991144SBram Moolenaar        }
9691c991144SBram Moolenaar        from
9701c991144SBram Moolenaar        './Xexport.vim'
9711c991144SBram Moolenaar    g:imported = exported
9721c991144SBram Moolenaar    exported += 5
9731c991144SBram Moolenaar    g:imported_added = exported
9741c991144SBram Moolenaar    g:imported_func = Exported()
9751c991144SBram Moolenaar  END
9761c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
9771c991144SBram Moolenaar  source Ximport_lbr.vim
9781c991144SBram Moolenaar
9791c991144SBram Moolenaar  assert_equal(9876, g:imported)
9801c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
9811c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
9821c991144SBram Moolenaar
9831c991144SBram Moolenaar  # exported script not sourced again
9841c991144SBram Moolenaar  assert_false(exists('g:result'))
9851c991144SBram Moolenaar  unlet g:imported
9861c991144SBram Moolenaar  unlet g:imported_added
9871c991144SBram Moolenaar  unlet g:imported_func
9881c991144SBram Moolenaar  delete('Ximport_lbr.vim')
9891c991144SBram Moolenaar
9901c991144SBram Moolenaar  # import inside :def function
991cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
9925381c7a1SBram Moolenaar    vim9script
9935381c7a1SBram Moolenaar    def ImportInDef()
9945381c7a1SBram Moolenaar      import exported from './Xexport.vim'
9955381c7a1SBram Moolenaar      g:imported = exported
9965381c7a1SBram Moolenaar      exported += 7
9975381c7a1SBram Moolenaar      g:imported_added = exported
9985381c7a1SBram Moolenaar    enddef
9995381c7a1SBram Moolenaar    ImportInDef()
10005381c7a1SBram Moolenaar  END
10015381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
10025381c7a1SBram Moolenaar  source Ximport2.vim
1003f5be8cdbSBram Moolenaar  # TODO: this should be 9879
10045381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
10055381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
10065381c7a1SBram Moolenaar  unlet g:imported
10075381c7a1SBram Moolenaar  unlet g:imported_added
10085381c7a1SBram Moolenaar  delete('Ximport2.vim')
10095381c7a1SBram Moolenaar
1010cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1011f2d5c240SBram Moolenaar    vim9script
1012f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1013f2d5c240SBram Moolenaar    def UseExport()
1014f2d5c240SBram Moolenaar      g:imported = Export.exported
1015f2d5c240SBram Moolenaar    enddef
1016f2d5c240SBram Moolenaar    UseExport()
1017f2d5c240SBram Moolenaar  END
1018f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1019f2d5c240SBram Moolenaar  source Ximport.vim
10205381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1021f2d5c240SBram Moolenaar
1022cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1023599c89c8SBram Moolenaar    vim9script
1024599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1025599c89c8SBram Moolenaar    def Func()
1026cfcd011fSBram Moolenaar      var dummy = 1
1027cfcd011fSBram Moolenaar      var imported = Export + dummy
1028599c89c8SBram Moolenaar    enddef
1029822ba247SBram Moolenaar    defcompile
1030599c89c8SBram Moolenaar  END
1031599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
103244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1033599c89c8SBram Moolenaar
1034cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1035599c89c8SBram Moolenaar    vim9script
1036599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1037599c89c8SBram Moolenaar    def Func()
1038cfcd011fSBram Moolenaar      var imported = Export . exported
1039599c89c8SBram Moolenaar    enddef
1040822ba247SBram Moolenaar    defcompile
1041599c89c8SBram Moolenaar  END
1042599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
104344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1044599c89c8SBram Moolenaar
1045a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1046a6294955SBram Moolenaar    vim9script
1047a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1048a6294955SBram Moolenaar    var some = 'other'
1049a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1050a6294955SBram Moolenaar    defcompile
1051a6294955SBram Moolenaar  END
1052a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1053a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1054a6294955SBram Moolenaar
1055cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1056599c89c8SBram Moolenaar    vim9script
1057599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1058599c89c8SBram Moolenaar    def Func()
1059cfcd011fSBram Moolenaar      var imported = Export.
1060599c89c8SBram Moolenaar    enddef
1061822ba247SBram Moolenaar    defcompile
1062599c89c8SBram Moolenaar  END
1063599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
106444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1065599c89c8SBram Moolenaar
1066cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
10671c991144SBram Moolenaar    vim9script
10681c991144SBram Moolenaar    import *
10691c991144SBram Moolenaar        as Export
10701c991144SBram Moolenaar        from
10711c991144SBram Moolenaar        './Xexport.vim'
10721c991144SBram Moolenaar    def UseExport()
10731c991144SBram Moolenaar      g:imported = Export.exported
10741c991144SBram Moolenaar    enddef
10751c991144SBram Moolenaar    UseExport()
10761c991144SBram Moolenaar  END
10771c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
10781c991144SBram Moolenaar  source Ximport.vim
10791c991144SBram Moolenaar  assert_equal(9883, g:imported)
10801c991144SBram Moolenaar
1081cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1082f2d5c240SBram Moolenaar    vim9script
1083f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1084f2d5c240SBram Moolenaar  END
1085f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
108644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1087f2d5c240SBram Moolenaar
1088f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1089cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1090fa29c8abSBram Moolenaar    vim9script
1091fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1092fa29c8abSBram Moolenaar  END
1093fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
109444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1095fa29c8abSBram Moolenaar
1096f5be8cdbSBram Moolenaar  # try to import something that is already defined
1097cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
10985269bd2aSBram Moolenaar    vim9script
1099cfcd011fSBram Moolenaar    var exported = 'something'
11005269bd2aSBram Moolenaar    import exported from './Xexport.vim'
11015269bd2aSBram Moolenaar  END
11025269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
110344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
11045269bd2aSBram Moolenaar
1105f5be8cdbSBram Moolenaar  # try to import something that is already defined
11065269bd2aSBram Moolenaar  import_already_defined =<< trim END
11075269bd2aSBram Moolenaar    vim9script
1108cfcd011fSBram Moolenaar    var exported = 'something'
11095269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
11105269bd2aSBram Moolenaar  END
11115269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
111244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
11135269bd2aSBram Moolenaar
1114f5be8cdbSBram Moolenaar  # try to import something that is already defined
11155269bd2aSBram Moolenaar  import_already_defined =<< trim END
11165269bd2aSBram Moolenaar    vim9script
1117cfcd011fSBram Moolenaar    var exported = 'something'
11185269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
11195269bd2aSBram Moolenaar  END
11205269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
112144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
11225269bd2aSBram Moolenaar
1123918a4249SBram Moolenaar  # try changing an imported const
1124918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1125918a4249SBram Moolenaar    vim9script
1126918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1127918a4249SBram Moolenaar    def Assign()
1128918a4249SBram Moolenaar      CONST = 987
1129918a4249SBram Moolenaar    enddef
1130918a4249SBram Moolenaar    defcompile
1131918a4249SBram Moolenaar  END
1132918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1133918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1134918a4249SBram Moolenaar
1135f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1136cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1137fa29c8abSBram Moolenaar    vim9script
1138fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1139fa29c8abSBram Moolenaar  END
1140fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
114144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1142fa29c8abSBram Moolenaar
1143cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1144fa29c8abSBram Moolenaar    vim9script
1145fa29c8abSBram Moolenaar    import name './Xexport.vim'
1146fa29c8abSBram Moolenaar  END
1147fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
114844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1149fa29c8abSBram Moolenaar
1150cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1151fa29c8abSBram Moolenaar    vim9script
1152fa29c8abSBram Moolenaar    import name from Xexport.vim
1153fa29c8abSBram Moolenaar  END
1154fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
115544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1156fa29c8abSBram Moolenaar
1157cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1158fa29c8abSBram Moolenaar    vim9script
1159fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1160fa29c8abSBram Moolenaar  END
1161fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
116244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1163fa29c8abSBram Moolenaar
1164cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1165fa29c8abSBram Moolenaar    vim9script
1166fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1167fa29c8abSBram Moolenaar  END
11685269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
116944d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1170fa29c8abSBram Moolenaar
1171f2d5c240SBram Moolenaar  delete('Ximport.vim')
11725269bd2aSBram Moolenaar  delete('Ximport3.vim')
11738a7d6542SBram Moolenaar  delete('Xexport.vim')
11748a7d6542SBram Moolenaar
1175f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1176750802b5SBram Moolenaar  set cpo&vi
1177cfcd011fSBram Moolenaar  var cpo_before = &cpo
1178cfcd011fSBram Moolenaar  var lines =<< trim END
1179750802b5SBram Moolenaar    vim9script
1180750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1181750802b5SBram Moolenaar  END
1182750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1183750802b5SBram Moolenaar  source Xvim9_script
1184750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1185750802b5SBram Moolenaar  set cpo&vim
1186750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1187750802b5SBram Moolenaar  delete('Xvim9_script')
1188750802b5SBram Moolenaarenddef
1189750802b5SBram Moolenaar
1190803af686SBram Moolenaarfunc g:Trigger()
1191803af686SBram Moolenaar  source Ximport.vim
1192803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1193803af686SBram Moolenaarendfunc
1194803af686SBram Moolenaar
1195803af686SBram Moolenaardef Test_import_export_expr_map()
1196803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1197cfcd011fSBram Moolenaar  var export_lines =<< trim END
1198803af686SBram Moolenaar    vim9script
1199803af686SBram Moolenaar    export def That(): string
1200803af686SBram Moolenaar      return 'yes'
1201803af686SBram Moolenaar    enddef
1202803af686SBram Moolenaar  END
1203803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1204803af686SBram Moolenaar
1205cfcd011fSBram Moolenaar  var import_lines =<< trim END
1206803af686SBram Moolenaar    vim9script
1207803af686SBram Moolenaar    import That from './Xexport_that.vim'
1208803af686SBram Moolenaar    assert_equal('yes', That())
1209803af686SBram Moolenaar  END
1210803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1211803af686SBram Moolenaar
1212803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1213803af686SBram Moolenaar  feedkeys('trigger', "xt")
1214803af686SBram Moolenaar
1215730b2483SBram Moolenaar  delete('Xexport_that.vim')
1216803af686SBram Moolenaar  delete('Ximport.vim')
1217803af686SBram Moolenaar  nunmap trigger
1218803af686SBram Moolenaarenddef
1219803af686SBram Moolenaar
12208e1986e3SBram Moolenaardef Test_import_in_filetype()
12218e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
12228e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1223cfcd011fSBram Moolenaar  var export_lines =<< trim END
12248e1986e3SBram Moolenaar    vim9script
1225cfcd011fSBram Moolenaar    export var That = 'yes'
12268e1986e3SBram Moolenaar  END
1227730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
12288e1986e3SBram Moolenaar
1229cfcd011fSBram Moolenaar  var import_lines =<< trim END
12308e1986e3SBram Moolenaar    vim9script
1231730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
12328e1986e3SBram Moolenaar    assert_equal('yes', That)
12338e1986e3SBram Moolenaar    g:did_load_mytpe = 1
12348e1986e3SBram Moolenaar  END
12358e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
12368e1986e3SBram Moolenaar
1237cfcd011fSBram Moolenaar  var save_rtp = &rtp
12388e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
12398e1986e3SBram Moolenaar
12408e1986e3SBram Moolenaar  filetype plugin on
12418e1986e3SBram Moolenaar  copen
12428e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
12438e1986e3SBram Moolenaar
12448e1986e3SBram Moolenaar  quit!
1245730b2483SBram Moolenaar  delete('Xexport_ft.vim')
12468e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
12478e1986e3SBram Moolenaar  &rtp = save_rtp
12488e1986e3SBram Moolenaarenddef
12498e1986e3SBram Moolenaar
1250efa94447SBram Moolenaardef Test_use_import_in_mapping()
1251cfcd011fSBram Moolenaar  var lines =<< trim END
1252efa94447SBram Moolenaar      vim9script
1253efa94447SBram Moolenaar      export def Funcx()
1254efa94447SBram Moolenaar        g:result = 42
1255efa94447SBram Moolenaar      enddef
1256efa94447SBram Moolenaar  END
1257efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1258efa94447SBram Moolenaar  lines =<< trim END
1259efa94447SBram Moolenaar      vim9script
1260efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1261b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1262efa94447SBram Moolenaar  END
1263efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1264efa94447SBram Moolenaar
1265efa94447SBram Moolenaar  source Xmapscript.vim
1266b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1267efa94447SBram Moolenaar  assert_equal(42, g:result)
1268efa94447SBram Moolenaar
1269efa94447SBram Moolenaar  unlet g:result
1270efa94447SBram Moolenaar  delete('XsomeExport.vim')
1271efa94447SBram Moolenaar  delete('Xmapscript.vim')
1272b3ca9824SBram Moolenaar  nunmap <F3>
1273efa94447SBram Moolenaarenddef
1274efa94447SBram Moolenaar
1275d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1276d3f8a9eeSBram Moolenaar  var lines =<< trim END
1277d3f8a9eeSBram Moolenaar    if has(g:feature)
1278d3f8a9eeSBram Moolenaar      " legacy script
1279d3f8a9eeSBram Moolenaar      let g:legacy = 1
1280d3f8a9eeSBram Moolenaar      finish
1281d3f8a9eeSBram Moolenaar    endif
1282d3f8a9eeSBram Moolenaar    vim9script
1283d3f8a9eeSBram Moolenaar    g:legacy = 0
1284d3f8a9eeSBram Moolenaar  END
1285d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1286d3f8a9eeSBram Moolenaar  g:legacy = -1
1287d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1288d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1289d3f8a9eeSBram Moolenaar
1290d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1291d3f8a9eeSBram Moolenaar  g:legacy = -1
1292d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1293d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1294d3f8a9eeSBram Moolenaarenddef
1295d3f8a9eeSBram Moolenaar
1296750802b5SBram Moolenaardef Test_vim9script_fails()
12978a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
12988a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1299cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
13009721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1301cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1302750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1303750802b5SBram Moolenaar
1304cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1305c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1306c785b9a7SBram Moolenaar
1307e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1308e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
13098a7d6542SBram Moolenaarenddef
13108a7d6542SBram Moolenaar
1311f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1312101f4810SBram Moolenaar  CheckRunVimInTerminal
1313101f4810SBram Moolenaar
13149bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1315c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
13169bb3eb3eSBram Moolenaarendfunc
13179bb3eb3eSBram Moolenaar
1318c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1319cfcd011fSBram Moolenaar  var export =<< trim END
1320101f4810SBram Moolenaar    vim9script
1321101f4810SBram Moolenaar    export def Foo(): number
1322101f4810SBram Moolenaar        return 0
1323101f4810SBram Moolenaar    enddef
1324101f4810SBram Moolenaar  END
1325730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1326101f4810SBram Moolenaar
1327e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
13289bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
13292949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1330101f4810SBram Moolenaar
1331730b2483SBram Moolenaar  delete('XexportCmd.vim')
13329bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
13339bb3eb3eSBram Moolenaarenddef
1334101f4810SBram Moolenaar
13352b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
13362b32700dSBram Moolenaar  var lines =<< trim END
1337a6294955SBram Moolenaar    vim9script
1338a6294955SBram Moolenaar    export var exported = 'thexport'
1339a6294955SBram Moolenaar  END
1340a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1341a6294955SBram Moolenaar  lines =<< trim END
13422b32700dSBram Moolenaar    vim9script noclear
13432b32700dSBram Moolenaar    g:loadCount += 1
13442b32700dSBram Moolenaar    var s:reloaded = 'init'
1345a6294955SBram Moolenaar    import exported from './XExportReload'
13462b32700dSBram Moolenaar
13472b32700dSBram Moolenaar    def Again(): string
13482b32700dSBram Moolenaar      return 'again'
13492b32700dSBram Moolenaar    enddef
13502b32700dSBram Moolenaar
13512b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
13522b32700dSBram Moolenaar    var s:loaded = true
13532b32700dSBram Moolenaar
13542b32700dSBram Moolenaar    var s:notReloaded = 'yes'
13552b32700dSBram Moolenaar    s:reloaded = 'first'
13562b32700dSBram Moolenaar    def g:Values(): list<string>
1357a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
13582b32700dSBram Moolenaar    enddef
13592b32700dSBram Moolenaar
13602b32700dSBram Moolenaar    def Once(): string
13612b32700dSBram Moolenaar      return 'once'
13622b32700dSBram Moolenaar    enddef
13632b32700dSBram Moolenaar  END
13642b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
13652b32700dSBram Moolenaar  g:loadCount = 0
13662b32700dSBram Moolenaar  source XReloaded
13672b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1368a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
13692b32700dSBram Moolenaar  source XReloaded
13702b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1371a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
13722b32700dSBram Moolenaar  source XReloaded
13732b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1374a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
13752b32700dSBram Moolenaar
137648e11c10SBram Moolenaar  delete('XReloaded')
1377a6294955SBram Moolenaar  delete('XExportReload')
13782b32700dSBram Moolenaar  delfunc g:Values
13792b32700dSBram Moolenaar  unlet g:loadCount
13802b32700dSBram Moolenaarenddef
13812b32700dSBram Moolenaar
13824c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1383cfcd011fSBram Moolenaar  var lines =<< trim END
13848a7d6542SBram Moolenaar    vim9script
13858a7d6542SBram Moolenaar    const var = ''
1386cfcd011fSBram Moolenaar    var valone = 1234
13878a7d6542SBram Moolenaar    def MyFunc(arg: string)
13888a7d6542SBram Moolenaar       valone = 5678
13898a7d6542SBram Moolenaar    enddef
13908a7d6542SBram Moolenaar  END
1391cfcd011fSBram Moolenaar  var morelines =<< trim END
1392cfcd011fSBram Moolenaar    var valtwo = 222
13938a7d6542SBram Moolenaar    export def GetValtwo(): number
13948a7d6542SBram Moolenaar      return valtwo
13958a7d6542SBram Moolenaar    enddef
13968a7d6542SBram Moolenaar  END
139703afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
13988a7d6542SBram Moolenaar  source Xreload.vim
13998a7d6542SBram Moolenaar  source Xreload.vim
14008a7d6542SBram Moolenaar  source Xreload.vim
14018a7d6542SBram Moolenaar
1402cfcd011fSBram Moolenaar  var testlines =<< trim END
14038a7d6542SBram Moolenaar    vim9script
14048a7d6542SBram Moolenaar    def TheFunc()
14058a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
14068a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
14078a7d6542SBram Moolenaar    enddef
14088a7d6542SBram Moolenaar    TheFunc()
14098a7d6542SBram Moolenaar  END
14108a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
14118a7d6542SBram Moolenaar  source Ximport.vim
14128a7d6542SBram Moolenaar
1413f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1414f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
14158a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
14168a7d6542SBram Moolenaar  source Ximport.vim
14178a7d6542SBram Moolenaar
1418f5be8cdbSBram Moolenaar  # cannot declare a var twice
14198a7d6542SBram Moolenaar  lines =<< trim END
14208a7d6542SBram Moolenaar    vim9script
1421cfcd011fSBram Moolenaar    var valone = 1234
1422cfcd011fSBram Moolenaar    var valone = 5678
14238a7d6542SBram Moolenaar  END
14248a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
142544d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
14268a7d6542SBram Moolenaar
14278a7d6542SBram Moolenaar  delete('Xreload.vim')
14288a7d6542SBram Moolenaar  delete('Ximport.vim')
14298a7d6542SBram Moolenaarenddef
14308a7d6542SBram Moolenaar
143107a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
143207a65d26SBram Moolenaar" compiled function using that variable must fail.
143307a65d26SBram Moolenaardef Test_script_reload_change_type()
143407a65d26SBram Moolenaar  var lines =<< trim END
143507a65d26SBram Moolenaar    vim9script noclear
143607a65d26SBram Moolenaar    var str = 'string'
143707a65d26SBram Moolenaar    def g:GetStr(): string
143807a65d26SBram Moolenaar      return str .. 'xxx'
143907a65d26SBram Moolenaar    enddef
144007a65d26SBram Moolenaar  END
144107a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
144207a65d26SBram Moolenaar  source Xreload.vim
144307a65d26SBram Moolenaar  echo g:GetStr()
144407a65d26SBram Moolenaar
144507a65d26SBram Moolenaar  lines =<< trim END
144607a65d26SBram Moolenaar    vim9script noclear
144707a65d26SBram Moolenaar    var str = 1234
144807a65d26SBram Moolenaar  END
144907a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
145007a65d26SBram Moolenaar  source Xreload.vim
145107a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
145207a65d26SBram Moolenaar
145307a65d26SBram Moolenaar  delfunc g:GetStr
145407a65d26SBram Moolenaar  delete('Xreload.vim')
145507a65d26SBram Moolenaarenddef
145607a65d26SBram Moolenaar
145795006e3dSBram Moolenaardef s:RetSome(): string
145895006e3dSBram Moolenaar  return 'some'
145995006e3dSBram Moolenaarenddef
146095006e3dSBram Moolenaar
1461fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1462fe465a01SBram Moolenaar" script-local name.
1463fe465a01SBram Moolenaardef Test_vim9script_funcref()
1464cfcd011fSBram Moolenaar  var sortlines =<< trim END
1465fe465a01SBram Moolenaar      vim9script
1466fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1467bed36b93SBram Moolenaar        return i2 - i1
1468fe465a01SBram Moolenaar      enddef
1469fe465a01SBram Moolenaar
1470fe465a01SBram Moolenaar      export def FastSort(): list<number>
1471fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1472fe465a01SBram Moolenaar      enddef
1473fe465a01SBram Moolenaar  END
1474fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1475fe465a01SBram Moolenaar
1476cfcd011fSBram Moolenaar  var lines =<< trim END
1477fe465a01SBram Moolenaar    vim9script
1478fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1479fe465a01SBram Moolenaar    def Test()
1480fe465a01SBram Moolenaar      g:result = FastSort()
1481fe465a01SBram Moolenaar    enddef
1482fe465a01SBram Moolenaar    Test()
1483fe465a01SBram Moolenaar  END
1484fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1485fe465a01SBram Moolenaar
1486fe465a01SBram Moolenaar  source Xscript.vim
1487fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1488fe465a01SBram Moolenaar
1489fe465a01SBram Moolenaar  unlet g:result
1490fe465a01SBram Moolenaar  delete('Xsort.vim')
1491fe465a01SBram Moolenaar  delete('Xscript.vim')
149295006e3dSBram Moolenaar
1493cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
149495006e3dSBram Moolenaar  assert_equal('some', Funcref())
1495fe465a01SBram Moolenaarenddef
1496fe465a01SBram Moolenaar
1497601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1498601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1499601e76acSBram Moolenaar" function reference.
1500c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1501cfcd011fSBram Moolenaar  var filterLines =<< trim END
1502c620c055SBram Moolenaar    vim9script
1503c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1504c620c055SBram Moolenaar      return idx % 2 == 1
1505c620c055SBram Moolenaar    enddef
1506c620c055SBram Moolenaar    export def FastFilter(): list<number>
1507c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1508c620c055SBram Moolenaar    enddef
1509601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1510601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1511601e76acSBram Moolenaar    enddef
1512c620c055SBram Moolenaar  END
1513c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1514c620c055SBram Moolenaar
1515cfcd011fSBram Moolenaar  var lines =<< trim END
1516c620c055SBram Moolenaar    vim9script
1517601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1518c620c055SBram Moolenaar    def Test()
1519cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1520c620c055SBram Moolenaar    enddef
1521c620c055SBram Moolenaar    Test()
1522601e76acSBram Moolenaar    def TestDirect()
1523cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1524601e76acSBram Moolenaar    enddef
1525601e76acSBram Moolenaar    TestDirect()
1526c620c055SBram Moolenaar  END
1527601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1528c620c055SBram Moolenaar  delete('Xfilter.vim')
1529c620c055SBram Moolenaarenddef
1530c620c055SBram Moolenaar
15314c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1532cfcd011fSBram Moolenaar  var first_lines =<< trim END
15334c17ad94SBram Moolenaar    vim9script
15344c17ad94SBram Moolenaar    def FuncYes(): string
15354c17ad94SBram Moolenaar      return 'yes'
15364c17ad94SBram Moolenaar    enddef
15374c17ad94SBram Moolenaar  END
1538cfcd011fSBram Moolenaar  var withno_lines =<< trim END
15394c17ad94SBram Moolenaar    def FuncNo(): string
15404c17ad94SBram Moolenaar      return 'no'
15414c17ad94SBram Moolenaar    enddef
15424c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
15434c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
15444c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
154503afdcf1SBram Moolenaar    enddef
154603afdcf1SBram Moolenaar  END
1547cfcd011fSBram Moolenaar  var nono_lines =<< trim END
154803afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
154903afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
155044d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
15514c17ad94SBram Moolenaar    enddef
15524c17ad94SBram Moolenaar  END
15534c17ad94SBram Moolenaar
15544c17ad94SBram Moolenaar  # FuncNo() is defined
155503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
15564c17ad94SBram Moolenaar  source Xreloaded.vim
15574c17ad94SBram Moolenaar  g:DoCheck(true)
15584c17ad94SBram Moolenaar
15594c17ad94SBram Moolenaar  # FuncNo() is not redefined
156003afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
15614c17ad94SBram Moolenaar  source Xreloaded.vim
15625082471fSBram Moolenaar  g:DoCheck(false)
15634c17ad94SBram Moolenaar
15644c17ad94SBram Moolenaar  # FuncNo() is back
156503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
15664c17ad94SBram Moolenaar  source Xreloaded.vim
15675082471fSBram Moolenaar  g:DoCheck(false)
15684c17ad94SBram Moolenaar
15694c17ad94SBram Moolenaar  delete('Xreloaded.vim')
15704c17ad94SBram Moolenaarenddef
15714c17ad94SBram Moolenaar
157289483d40SBram Moolenaardef Test_vim9script_reload_delvar()
157389483d40SBram Moolenaar  # write the script with a script-local variable
1574cfcd011fSBram Moolenaar  var lines =<< trim END
157589483d40SBram Moolenaar    vim9script
1576cfcd011fSBram Moolenaar    var name = 'string'
157789483d40SBram Moolenaar  END
157889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
157989483d40SBram Moolenaar  source XreloadVar.vim
158089483d40SBram Moolenaar
158189483d40SBram Moolenaar  # now write the script using the same variable locally - works
158289483d40SBram Moolenaar  lines =<< trim END
158389483d40SBram Moolenaar    vim9script
158489483d40SBram Moolenaar    def Func()
1585cfcd011fSBram Moolenaar      var name = 'string'
158689483d40SBram Moolenaar    enddef
158789483d40SBram Moolenaar  END
158889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
158989483d40SBram Moolenaar  source XreloadVar.vim
159089483d40SBram Moolenaar
159189483d40SBram Moolenaar  delete('XreloadVar.vim')
159289483d40SBram Moolenaarenddef
159389483d40SBram Moolenaar
15948a7d6542SBram Moolenaardef Test_import_absolute()
1595cfcd011fSBram Moolenaar  var import_lines = [
1596e6085c53SBram Moolenaar        'vim9script',
1597e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1598e6085c53SBram Moolenaar        'def UseExported()',
1599e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1600e6085c53SBram Moolenaar        '  exported = 8888',
1601e6085c53SBram Moolenaar        '  g:imported_after = exported',
1602e6085c53SBram Moolenaar        'enddef',
1603e6085c53SBram Moolenaar        'UseExported()',
1604e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1605e6085c53SBram Moolenaar        ]
16068a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
16078a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
16088a7d6542SBram Moolenaar
16098a7d6542SBram Moolenaar  source Ximport_abs.vim
16108a7d6542SBram Moolenaar
16118a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
16124e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1613fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1614fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1615fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1616fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1617fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1618fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1619fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1620fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1621fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1622fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1623e6085c53SBram Moolenaar        g:import_disassembled)
1624b3ca9824SBram Moolenaar
1625b3ca9824SBram Moolenaar  Undo_export_script_lines()
16268a7d6542SBram Moolenaar  unlet g:imported_abs
16274e12a5dfSBram Moolenaar  unlet g:import_disassembled
16288a7d6542SBram Moolenaar
16298a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
16308a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
16318a7d6542SBram Moolenaarenddef
16328a7d6542SBram Moolenaar
16338a7d6542SBram Moolenaardef Test_import_rtp()
1634cfcd011fSBram Moolenaar  var import_lines = [
1635e6085c53SBram Moolenaar        'vim9script',
1636e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1637e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1638e6085c53SBram Moolenaar        ]
16398a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
16408a7d6542SBram Moolenaar  mkdir('import')
16418a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
16428a7d6542SBram Moolenaar
1643cfcd011fSBram Moolenaar  var save_rtp = &rtp
16448a7d6542SBram Moolenaar  &rtp = getcwd()
16458a7d6542SBram Moolenaar  source Ximport_rtp.vim
16468a7d6542SBram Moolenaar  &rtp = save_rtp
16478a7d6542SBram Moolenaar
16488a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
16498a7d6542SBram Moolenaar
1650b3ca9824SBram Moolenaar  Undo_export_script_lines()
1651b3ca9824SBram Moolenaar  unlet g:imported_rtp
16528a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
165389483d40SBram Moolenaar  delete('import', 'rf')
16548a7d6542SBram Moolenaarenddef
16558a7d6542SBram Moolenaar
165625e0f586SBram Moolenaardef Test_import_compile_error()
1657cfcd011fSBram Moolenaar  var export_lines = [
165825e0f586SBram Moolenaar        'vim9script',
165925e0f586SBram Moolenaar        'export def ExpFunc(): string',
166025e0f586SBram Moolenaar        '  return notDefined',
166125e0f586SBram Moolenaar        'enddef',
166225e0f586SBram Moolenaar        ]
166325e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
166425e0f586SBram Moolenaar
1665cfcd011fSBram Moolenaar  var import_lines = [
166625e0f586SBram Moolenaar        'vim9script',
166725e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
166825e0f586SBram Moolenaar        'def ImpFunc()',
166925e0f586SBram Moolenaar        '  echo ExpFunc()',
167025e0f586SBram Moolenaar        'enddef',
167125e0f586SBram Moolenaar        'defcompile',
167225e0f586SBram Moolenaar        ]
167325e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
167425e0f586SBram Moolenaar
167525e0f586SBram Moolenaar  try
167625e0f586SBram Moolenaar    source Ximport.vim
167725e0f586SBram Moolenaar  catch /E1001/
1678f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
16797707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
168025e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
168125e0f586SBram Moolenaar  endtry
168225e0f586SBram Moolenaar
168325e0f586SBram Moolenaar  delete('Xexported.vim')
168425e0f586SBram Moolenaar  delete('Ximport.vim')
168525e0f586SBram Moolenaarenddef
168625e0f586SBram Moolenaar
1687c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1688cfcd011fSBram Moolenaar  var lines = [
1689c4ce36d4SBram Moolenaar        'vim9script',
1690c4ce36d4SBram Moolenaar        'def Func()',
1691c4ce36d4SBram Moolenaar        '  eval [][0]',
1692c4ce36d4SBram Moolenaar        'enddef',
1693c4ce36d4SBram Moolenaar        'Func()',
1694c4ce36d4SBram Moolenaar        ]
1695c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1696c4ce36d4SBram Moolenaar
1697c4ce36d4SBram Moolenaar  for count in range(3)
1698c4ce36d4SBram Moolenaar    try
1699c4ce36d4SBram Moolenaar      source Xtestscript.vim
1700c4ce36d4SBram Moolenaar    catch /E684/
1701c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1702c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1703c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1704c4ce36d4SBram Moolenaar    endtry
1705c4ce36d4SBram Moolenaar  endfor
1706c4ce36d4SBram Moolenaar
1707c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1708c4ce36d4SBram Moolenaarenddef
1709c4ce36d4SBram Moolenaar
1710eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1711cfcd011fSBram Moolenaar  var export_lines =<< trim END
1712eef2102eSBram Moolenaar      vim9script
1713eef2102eSBram Moolenaar      export def Func()
1714eef2102eSBram Moolenaar        echo 'imported'
1715eef2102eSBram Moolenaar      enddef
1716eef2102eSBram Moolenaar  END
1717eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1718eef2102eSBram Moolenaar
1719cfcd011fSBram Moolenaar  var lines =<< trim END
1720eef2102eSBram Moolenaar    vim9script
1721eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1722eef2102eSBram Moolenaar    def Func()
1723eef2102eSBram Moolenaar      echo 'local to function'
1724eef2102eSBram Moolenaar    enddef
1725eef2102eSBram Moolenaar  END
1726eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1727eef2102eSBram Moolenaar
1728eef2102eSBram Moolenaar  lines =<< trim END
1729eef2102eSBram Moolenaar    vim9script
1730eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1731eef2102eSBram Moolenaar    def Outer()
1732eef2102eSBram Moolenaar      def Func()
1733eef2102eSBram Moolenaar        echo 'local to function'
1734eef2102eSBram Moolenaar      enddef
1735eef2102eSBram Moolenaar    enddef
1736eef2102eSBram Moolenaar    defcompile
1737eef2102eSBram Moolenaar  END
1738eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1739eef2102eSBram Moolenaar
1740eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1741eef2102eSBram Moolenaarenddef
1742eef2102eSBram Moolenaar
1743b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1744cfcd011fSBram Moolenaar  var lines =<< trim END
1745b9a2cac3SBram Moolenaar    vim9script
1746b9a2cac3SBram Moolenaar    def Func()
1747b9a2cac3SBram Moolenaar      echo 'one'
1748b9a2cac3SBram Moolenaar    enddef
1749b9a2cac3SBram Moolenaar    def Func()
1750b9a2cac3SBram Moolenaar      echo 'two'
1751b9a2cac3SBram Moolenaar    enddef
1752b9a2cac3SBram Moolenaar  END
1753b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1754fa211f3cSBram Moolenaar
1755fa211f3cSBram Moolenaar  lines =<< trim END
1756fa211f3cSBram Moolenaar    vim9script
1757fa211f3cSBram Moolenaar    def Foo(): string
1758fa211f3cSBram Moolenaar      return 'foo'
1759fa211f3cSBram Moolenaar      enddef
1760fa211f3cSBram Moolenaar    def Func()
1761cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1762fa211f3cSBram Moolenaar    enddef
1763fa211f3cSBram Moolenaar    defcompile
1764fa211f3cSBram Moolenaar  END
1765fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1766b9a2cac3SBram Moolenaarenddef
1767b9a2cac3SBram Moolenaar
17688a7d6542SBram Moolenaardef Test_fixed_size_list()
1769f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1770cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
17718a7d6542SBram Moolenaar  l->remove(0)
17728a7d6542SBram Moolenaar  l->add(5)
17738a7d6542SBram Moolenaar  l->insert(99, 1)
17740f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
17758a7d6542SBram Moolenaarenddef
17768a7d6542SBram Moolenaar
1777ae616494SBram Moolenaardef Test_no_insert_xit()
1778d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1779d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1780d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1781d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1782d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1783ae616494SBram Moolenaar
1784ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1785ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1786ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1787ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1788f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1789f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1790f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1791f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1792f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1793ae616494SBram Moolenaarenddef
1794ae616494SBram Moolenaar
1795158906cfSBram Moolenaardef IfElse(what: number): string
1796cfcd011fSBram Moolenaar  var res = ''
1797158906cfSBram Moolenaar  if what == 1
1798158906cfSBram Moolenaar    res = "one"
1799158906cfSBram Moolenaar  elseif what == 2
1800158906cfSBram Moolenaar    res = "two"
1801a259d8d3SBram Moolenaar  else
1802158906cfSBram Moolenaar    res = "three"
1803a259d8d3SBram Moolenaar  endif
1804158906cfSBram Moolenaar  return res
1805a259d8d3SBram Moolenaarenddef
1806a259d8d3SBram Moolenaar
1807158906cfSBram Moolenaardef Test_if_elseif_else()
1808158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1809158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1810158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
18110f18b6d1SBram Moolenaarenddef
18120f18b6d1SBram Moolenaar
1813e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1814d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1815d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1816d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1817ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1818d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
18196628b7ebSBram Moolenaar
18206628b7ebSBram Moolenaar  var lines =<< trim END
18216628b7ebSBram Moolenaar      var s = ''
18226628b7ebSBram Moolenaar      if s = ''
18236628b7ebSBram Moolenaar      endif
18246628b7ebSBram Moolenaar  END
18256628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
18266628b7ebSBram Moolenaar
18276628b7ebSBram Moolenaar  lines =<< trim END
18286628b7ebSBram Moolenaar      var s = ''
18296628b7ebSBram Moolenaar      if s == ''
18306628b7ebSBram Moolenaar      elseif s = ''
18316628b7ebSBram Moolenaar      endif
18326628b7ebSBram Moolenaar  END
18336628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
1834e8c4abbbSBram Moolenaarenddef
1835e8c4abbbSBram Moolenaar
18366d69bf60SBram Moolenaarlet g:bool_true = v:true
18376d69bf60SBram Moolenaarlet g:bool_false = v:false
18386d69bf60SBram Moolenaar
18396d69bf60SBram Moolenaardef Test_if_const_expr()
1840cfcd011fSBram Moolenaar  var res = false
18416d69bf60SBram Moolenaar  if true ? true : false
18426d69bf60SBram Moolenaar    res = true
18436d69bf60SBram Moolenaar  endif
18446d69bf60SBram Moolenaar  assert_equal(true, res)
18456d69bf60SBram Moolenaar
1846585fea7bSBram Moolenaar  g:glob = 2
1847585fea7bSBram Moolenaar  if false
18486797966dSBram Moolenaar    execute('g:glob = 3')
1849585fea7bSBram Moolenaar  endif
1850585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1851585fea7bSBram Moolenaar  if true
18526797966dSBram Moolenaar    execute('g:glob = 3')
1853585fea7bSBram Moolenaar  endif
1854585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1855585fea7bSBram Moolenaar
18566d69bf60SBram Moolenaar  res = false
18576d69bf60SBram Moolenaar  if g:bool_true ? true : false
18586d69bf60SBram Moolenaar    res = true
18596d69bf60SBram Moolenaar  endif
18606d69bf60SBram Moolenaar  assert_equal(true, res)
18616d69bf60SBram Moolenaar
18626d69bf60SBram Moolenaar  res = false
18636d69bf60SBram Moolenaar  if true ? g:bool_true : false
18646d69bf60SBram Moolenaar    res = true
18656d69bf60SBram Moolenaar  endif
18666d69bf60SBram Moolenaar  assert_equal(true, res)
18676d69bf60SBram Moolenaar
18686d69bf60SBram Moolenaar  res = false
18696d69bf60SBram Moolenaar  if true ? true : g:bool_false
18706d69bf60SBram Moolenaar    res = true
18716d69bf60SBram Moolenaar  endif
18726d69bf60SBram Moolenaar  assert_equal(true, res)
18736d69bf60SBram Moolenaar
18746d69bf60SBram Moolenaar  res = false
18756d69bf60SBram Moolenaar  if true ? false : true
18766d69bf60SBram Moolenaar    res = true
18776d69bf60SBram Moolenaar  endif
18786d69bf60SBram Moolenaar  assert_equal(false, res)
18796d69bf60SBram Moolenaar
18806d69bf60SBram Moolenaar  res = false
18816d69bf60SBram Moolenaar  if false ? false : true
18826d69bf60SBram Moolenaar    res = true
18836d69bf60SBram Moolenaar  endif
18846d69bf60SBram Moolenaar  assert_equal(true, res)
18856d69bf60SBram Moolenaar
18866d69bf60SBram Moolenaar  res = false
18876d69bf60SBram Moolenaar  if false ? true : false
18886d69bf60SBram Moolenaar    res = true
18896d69bf60SBram Moolenaar  endif
18906d69bf60SBram Moolenaar  assert_equal(false, res)
18916d69bf60SBram Moolenaar
18926d69bf60SBram Moolenaar  res = false
1893e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1894e8c4abbbSBram Moolenaar    res = true
1895e8c4abbbSBram Moolenaar  endif
1896e8c4abbbSBram Moolenaar  assert_equal(false, res)
1897e8c4abbbSBram Moolenaar
1898e8c4abbbSBram Moolenaar  res = false
18996d69bf60SBram Moolenaar  if true && true
19006d69bf60SBram Moolenaar    res = true
19016d69bf60SBram Moolenaar  endif
19026d69bf60SBram Moolenaar  assert_equal(true, res)
19036d69bf60SBram Moolenaar
19046d69bf60SBram Moolenaar  res = false
19056d69bf60SBram Moolenaar  if true && false
19066d69bf60SBram Moolenaar    res = true
19076d69bf60SBram Moolenaar  endif
19086d69bf60SBram Moolenaar  assert_equal(false, res)
19096d69bf60SBram Moolenaar
19106d69bf60SBram Moolenaar  res = false
19116d69bf60SBram Moolenaar  if g:bool_true && false
19126d69bf60SBram Moolenaar    res = true
19136d69bf60SBram Moolenaar  endif
19146d69bf60SBram Moolenaar  assert_equal(false, res)
19156d69bf60SBram Moolenaar
19166d69bf60SBram Moolenaar  res = false
19176d69bf60SBram Moolenaar  if true && g:bool_false
19186d69bf60SBram Moolenaar    res = true
19196d69bf60SBram Moolenaar  endif
19206d69bf60SBram Moolenaar  assert_equal(false, res)
19216d69bf60SBram Moolenaar
19226d69bf60SBram Moolenaar  res = false
19236d69bf60SBram Moolenaar  if false && false
19246d69bf60SBram Moolenaar    res = true
19256d69bf60SBram Moolenaar  endif
19266d69bf60SBram Moolenaar  assert_equal(false, res)
19276d69bf60SBram Moolenaar
19286d69bf60SBram Moolenaar  res = false
19296d69bf60SBram Moolenaar  if true || false
19306d69bf60SBram Moolenaar    res = true
19316d69bf60SBram Moolenaar  endif
19326d69bf60SBram Moolenaar  assert_equal(true, res)
19336d69bf60SBram Moolenaar
19346d69bf60SBram Moolenaar  res = false
19356d69bf60SBram Moolenaar  if 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 || 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 false || false
19486d69bf60SBram Moolenaar    res = true
19496d69bf60SBram Moolenaar  endif
19506d69bf60SBram Moolenaar  assert_equal(false, res)
19513988f64fSBram Moolenaar
19523988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
19533988f64fSBram Moolenaar  if false | eval 0 | endif
19543988f64fSBram Moolenaar  if false | eval burp + 234 | endif
19553988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
19563988f64fSBram Moolenaar  if false
19573988f64fSBram Moolenaar    burp
19583988f64fSBram Moolenaar  endif
195980c34ca3SBram Moolenaarenddef
19606d69bf60SBram Moolenaar
196180c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1962d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1963d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1964d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1965d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
19666d69bf60SBram Moolenaarenddef
19676d69bf60SBram Moolenaar
196872abcf42SBram Moolenaardef RunNested(i: number): number
1969cfcd011fSBram Moolenaar  var x: number = 0
197072abcf42SBram Moolenaar  if i % 2
197172abcf42SBram Moolenaar    if 1
1972f5be8cdbSBram Moolenaar      # comment
197372abcf42SBram Moolenaar    else
1974f5be8cdbSBram Moolenaar      # comment
197572abcf42SBram Moolenaar    endif
197672abcf42SBram Moolenaar    x += 1
197772abcf42SBram Moolenaar  else
197872abcf42SBram Moolenaar    x += 1000
197972abcf42SBram Moolenaar  endif
198072abcf42SBram Moolenaar  return x
198172abcf42SBram Moolenaarenddef
198272abcf42SBram Moolenaar
198372abcf42SBram Moolenaardef Test_nested_if()
198472abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
198572abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
198672abcf42SBram Moolenaarenddef
198772abcf42SBram Moolenaar
1988ad39c094SBram Moolenaardef Test_execute_cmd()
1989e4984290SBram Moolenaar  # missing argument is ignored
1990e4984290SBram Moolenaar  execute
1991e4984290SBram Moolenaar  execute # comment
1992e4984290SBram Moolenaar
1993ad39c094SBram Moolenaar  new
1994ad39c094SBram Moolenaar  setline(1, 'default')
1995d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1996ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1997a72cfb80SBram Moolenaar
1998d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1999a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2000a72cfb80SBram Moolenaar
2001cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2002cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2003a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2004ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2005a72cfb80SBram Moolenaar
2006d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2007ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2008a72cfb80SBram Moolenaar
2009cfcd011fSBram Moolenaar  var cmd_first = 'call '
2010cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2011ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2012ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2013ad39c094SBram Moolenaar  bwipe!
2014585fea7bSBram Moolenaar
2015cfcd011fSBram Moolenaar  var n = true
20162d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
20172d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
20182d6b20d6SBram Moolenaar
2019e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2020e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2021e5abf7afSBram Moolenaar
2022d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2023d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2024d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2025ad39c094SBram Moolenaarenddef
2026ad39c094SBram Moolenaar
202747e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2028f5be8cdbSBram Moolenaar  # only checks line continuation
2029cfcd011fSBram Moolenaar  var lines =<< trim END
203047e880d6SBram Moolenaar      vim9script
203147e880d6SBram Moolenaar      execute 'g:someVar'
203247e880d6SBram Moolenaar                .. ' = ' ..
203347e880d6SBram Moolenaar                   '28'
203447e880d6SBram Moolenaar      assert_equal(28, g:someVar)
203547e880d6SBram Moolenaar      unlet g:someVar
203647e880d6SBram Moolenaar  END
203747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
203847e880d6SBram Moolenaarenddef
203947e880d6SBram Moolenaar
2040ad39c094SBram Moolenaardef Test_echo_cmd()
2041a72cfb80SBram Moolenaar  echo 'some' # comment
2042585fea7bSBram Moolenaar  echon 'thing'
2043ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2044ad39c094SBram Moolenaar
2045a72cfb80SBram Moolenaar  echo "some" # comment
2046a72cfb80SBram Moolenaar  echon "thing"
2047a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2048a72cfb80SBram Moolenaar
2049cfcd011fSBram Moolenaar  var str1 = 'some'
2050cfcd011fSBram Moolenaar  var str2 = 'more'
2051ad39c094SBram Moolenaar  echo str1 str2
2052ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2053a72cfb80SBram Moolenaar
2054d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2055ad39c094SBram Moolenaarenddef
2056ad39c094SBram Moolenaar
2057f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2058f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2059f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2060f93c7feaSBram Moolenaar  echo 'clear'
2061df069eecSBram Moolenaar  :1messages
2062f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2063f93c7feaSBram Moolenaar
2064d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2065f93c7feaSBram Moolenaarenddef
2066f93c7feaSBram Moolenaar
206747e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2068f5be8cdbSBram Moolenaar  # only checks line continuation
2069cfcd011fSBram Moolenaar  var lines =<< trim END
207047e880d6SBram Moolenaar      vim9script
207147e880d6SBram Moolenaar      echomsg 'here'
207247e880d6SBram Moolenaar                .. ' is ' ..
207347e880d6SBram Moolenaar                   'a message'
207447e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
207547e880d6SBram Moolenaar  END
207647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
207747e880d6SBram Moolenaarenddef
207847e880d6SBram Moolenaar
2079f93c7feaSBram Moolenaardef Test_echoerr_cmd()
208040ee466cSBram Moolenaar  try
208140ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
208240ee466cSBram Moolenaar  catch
208340ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
208440ee466cSBram Moolenaar  endtry
2085f93c7feaSBram Moolenaarenddef
2086f93c7feaSBram Moolenaar
208747e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2088f5be8cdbSBram Moolenaar  # only checks line continuation
2089cfcd011fSBram Moolenaar  var lines =<< trim END
209047e880d6SBram Moolenaar      vim9script
209147e880d6SBram Moolenaar      try
209247e880d6SBram Moolenaar        echoerr 'this'
209347e880d6SBram Moolenaar                .. ' is ' ..
209447e880d6SBram Moolenaar                   'wrong'
209547e880d6SBram Moolenaar      catch
209647e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
209747e880d6SBram Moolenaar      endtry
209847e880d6SBram Moolenaar  END
209947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
210047e880d6SBram Moolenaarenddef
210147e880d6SBram Moolenaar
210241fe0617SBram Moolenaardef Test_for_outside_of_function()
2103cfcd011fSBram Moolenaar  var lines =<< trim END
210441fe0617SBram Moolenaar    vim9script
210541fe0617SBram Moolenaar    new
210641fe0617SBram Moolenaar    for var in range(0, 3)
210741fe0617SBram Moolenaar      append(line('$'), var)
210841fe0617SBram Moolenaar    endfor
210941fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
211041fe0617SBram Moolenaar    bwipe!
211141fe0617SBram Moolenaar  END
211241fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
211341fe0617SBram Moolenaar  source Xvim9for.vim
211441fe0617SBram Moolenaar  delete('Xvim9for.vim')
211541fe0617SBram Moolenaarenddef
21168a7d6542SBram Moolenaar
2117e8c4abbbSBram Moolenaardef Test_for_loop()
2118cfcd011fSBram Moolenaar  var result = ''
2119e8c4abbbSBram Moolenaar  for cnt in range(7)
2120e8c4abbbSBram Moolenaar    if cnt == 4
2121e8c4abbbSBram Moolenaar      break
2122e8c4abbbSBram Moolenaar    endif
2123e8c4abbbSBram Moolenaar    if cnt == 2
2124e8c4abbbSBram Moolenaar      continue
2125e8c4abbbSBram Moolenaar    endif
2126e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2127e8c4abbbSBram Moolenaar  endfor
2128e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
21290ad3e894SBram Moolenaar
2130cfcd011fSBram Moolenaar  var concat = ''
21310ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
21320ad3e894SBram Moolenaar    concat ..= str
21330ad3e894SBram Moolenaar  endfor
21340ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
213538bd8de5SBram Moolenaar
213638bd8de5SBram Moolenaar  var total = 0
213738bd8de5SBram Moolenaar  for nr in
213838bd8de5SBram Moolenaar      [1, 2, 3]
213938bd8de5SBram Moolenaar    total += nr
214038bd8de5SBram Moolenaar  endfor
214138bd8de5SBram Moolenaar  assert_equal(6, total)
214238bd8de5SBram Moolenaar
214338bd8de5SBram Moolenaar  total = 0
214438bd8de5SBram Moolenaar  for nr
214538bd8de5SBram Moolenaar    in [1, 2, 3]
214638bd8de5SBram Moolenaar    total += nr
214738bd8de5SBram Moolenaar  endfor
214838bd8de5SBram Moolenaar  assert_equal(6, total)
214938bd8de5SBram Moolenaar
215038bd8de5SBram Moolenaar  total = 0
215138bd8de5SBram Moolenaar  for nr
215238bd8de5SBram Moolenaar    in
215338bd8de5SBram Moolenaar    [1, 2, 3]
215438bd8de5SBram Moolenaar    total += nr
215538bd8de5SBram Moolenaar  endfor
215638bd8de5SBram Moolenaar  assert_equal(6, total)
2157036d0714SBram Moolenaar
2158036d0714SBram Moolenaar  var res = ""
2159036d0714SBram Moolenaar  for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2160036d0714SBram Moolenaar    res ..= n .. s
2161036d0714SBram Moolenaar  endfor
2162036d0714SBram Moolenaar  assert_equal('1a2b', res)
2163e8c4abbbSBram Moolenaarenddef
2164e8c4abbbSBram Moolenaar
2165e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2166025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2167025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2168025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2169675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2170675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2171cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2172822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
21732d870f8dSBram Moolenaar  delfunc! g:Func
2174451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2175675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2176675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2177675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2178e8c4abbbSBram Moolenaarenddef
2179e8c4abbbSBram Moolenaar
2180ea87069dSBram Moolenaardef Test_for_loop_script_var()
2181ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2182ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2183ea87069dSBram Moolenaar
2184ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2185ea87069dSBram Moolenaar  var lines =<< trim END
2186ea87069dSBram Moolenaar    vim9script
2187ea87069dSBram Moolenaar    var total = 0
2188ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2189ea87069dSBram Moolenaar      total += s:var
2190ea87069dSBram Moolenaar    endfor
2191ea87069dSBram Moolenaar    assert_equal(6, total)
2192ea87069dSBram Moolenaar
2193ea87069dSBram Moolenaar    total = 0
2194ea87069dSBram Moolenaar    for var in [1, 2, 3]
2195ea87069dSBram Moolenaar      total += var
2196ea87069dSBram Moolenaar    endfor
2197ea87069dSBram Moolenaar    assert_equal(6, total)
2198ea87069dSBram Moolenaar  END
2199ea87069dSBram Moolenaarenddef
2200ea87069dSBram Moolenaar
2201792f786aSBram Moolenaardef Test_for_loop_unpack()
22024b8a0651SBram Moolenaar  var lines =<< trim END
2203792f786aSBram Moolenaar      var result = []
2204792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2205792f786aSBram Moolenaar        result->add(v1)
2206792f786aSBram Moolenaar        result->add(v2)
2207792f786aSBram Moolenaar      endfor
2208792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2209792f786aSBram Moolenaar
2210792f786aSBram Moolenaar      result = []
2211792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2212792f786aSBram Moolenaar        result->add(v1)
2213792f786aSBram Moolenaar        result->add(v2)
2214792f786aSBram Moolenaar        result->add(v3)
2215792f786aSBram Moolenaar      endfor
2216792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2217792f786aSBram Moolenaar
22184b8a0651SBram Moolenaar      result = []
22194b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
22204b8a0651SBram Moolenaar        result->add(&ts)
22214b8a0651SBram Moolenaar        result->add(&sw)
22224b8a0651SBram Moolenaar      endfor
22234b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
22244b8a0651SBram Moolenaar
22254b8a0651SBram Moolenaar      var slist: list<string>
22264b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
22274b8a0651SBram Moolenaar        slist->add($LOOPVAR)
22284b8a0651SBram Moolenaar        slist->add(@r)
22294b8a0651SBram Moolenaar        slist->add(v:errmsg)
22304b8a0651SBram Moolenaar      endfor
22314b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
22324b8a0651SBram Moolenaar
22334b8a0651SBram Moolenaar      slist = []
22344b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
22354b8a0651SBram Moolenaar        slist->add(g:globalvar)
22364b8a0651SBram Moolenaar        slist->add(b:bufvar)
22374b8a0651SBram Moolenaar        slist->add(w:winvar)
22384b8a0651SBram Moolenaar        slist->add(t:tabvar)
22394b8a0651SBram Moolenaar      endfor
22404b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2241f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
22424b8a0651SBram Moolenaar  END
22434b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
22444b8a0651SBram Moolenaar
22454b8a0651SBram Moolenaar  lines =<< trim END
2246792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2247792f786aSBram Moolenaar        echo v1 v2
2248792f786aSBram Moolenaar      endfor
2249792f786aSBram Moolenaar  END
2250792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2251792f786aSBram Moolenaar
2252792f786aSBram Moolenaar  lines =<< trim END
2253792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2254792f786aSBram Moolenaar        echo v1 v2
2255792f786aSBram Moolenaar      endfor
2256792f786aSBram Moolenaar  END
2257792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2258792f786aSBram Moolenaar
2259792f786aSBram Moolenaar  lines =<< trim END
2260792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2261792f786aSBram Moolenaar        echo v1
2262792f786aSBram Moolenaar      endfor
2263792f786aSBram Moolenaar  END
2264792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2265792f786aSBram Moolenaarenddef
2266792f786aSBram Moolenaar
2267c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2268c150c09eSBram Moolenaar  var looped = 0
2269c150c09eSBram Moolenaar  var cleanup = 0
2270c150c09eSBram Moolenaar  for i in range(3)
2271c150c09eSBram Moolenaar    looped += 1
2272c150c09eSBram Moolenaar    try
2273c150c09eSBram Moolenaar      eval [][0]
2274c150c09eSBram Moolenaar    catch
2275c150c09eSBram Moolenaar      continue
2276c150c09eSBram Moolenaar    finally
2277c150c09eSBram Moolenaar      cleanup += 1
2278c150c09eSBram Moolenaar    endtry
2279c150c09eSBram Moolenaar  endfor
2280c150c09eSBram Moolenaar  assert_equal(3, looped)
2281c150c09eSBram Moolenaar  assert_equal(3, cleanup)
2282c150c09eSBram Moolenaarenddef
2283c150c09eSBram Moolenaar
2284d0df1aacSBram Moolenaardef Test_while_loop()
2285cfcd011fSBram Moolenaar  var result = ''
2286cfcd011fSBram Moolenaar  var cnt = 0
2287d0df1aacSBram Moolenaar  while cnt < 555
2288d0df1aacSBram Moolenaar    if cnt == 3
2289d0df1aacSBram Moolenaar      break
2290d0df1aacSBram Moolenaar    endif
2291d0df1aacSBram Moolenaar    cnt += 1
2292d0df1aacSBram Moolenaar    if cnt == 2
2293d0df1aacSBram Moolenaar      continue
2294d0df1aacSBram Moolenaar    endif
2295d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2296d0df1aacSBram Moolenaar  endwhile
2297d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2298dee37dc7SBram Moolenaar
2299dee37dc7SBram Moolenaar  var s = ''
23000123cc1eSBram Moolenaar  while s == 'x' #{comment}
2301dee37dc7SBram Moolenaar  endwhile
2302d0df1aacSBram Moolenaarenddef
2303d0df1aacSBram Moolenaar
2304e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2305675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2306675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2307675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2308675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2309675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2310675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2311675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
23126628b7ebSBram Moolenaar
23136628b7ebSBram Moolenaar  var lines =<< trim END
23146628b7ebSBram Moolenaar      var s = ''
23156628b7ebSBram Moolenaar      while s = ''
23166628b7ebSBram Moolenaar      endwhile
23176628b7ebSBram Moolenaar  END
23186628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2319bd5da371SBram Moolenaarenddef
2320bd5da371SBram Moolenaar
23219645e2d9SBram Moolenaardef Test_interrupt_loop()
2322cfcd011fSBram Moolenaar  var caught = false
2323cfcd011fSBram Moolenaar  var x = 0
232497acfc78SBram Moolenaar  try
23259645e2d9SBram Moolenaar    while 1
23269645e2d9SBram Moolenaar      x += 1
23279645e2d9SBram Moolenaar      if x == 100
23289645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
23299645e2d9SBram Moolenaar      endif
23309645e2d9SBram Moolenaar    endwhile
233197acfc78SBram Moolenaar  catch
233297acfc78SBram Moolenaar    caught = true
233397acfc78SBram Moolenaar    assert_equal(100, x)
233497acfc78SBram Moolenaar  endtry
233597acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
233625859dd7SBram Moolenaar  # consume the CTRL-C
233725859dd7SBram Moolenaar  getchar(0)
23389645e2d9SBram Moolenaarenddef
233920431c9dSBram Moolenaar
23404fdae999SBram Moolenaardef Test_automatic_line_continuation()
2341cfcd011fSBram Moolenaar  var mylist = [
23424fdae999SBram Moolenaar      'one',
23434fdae999SBram Moolenaar      'two',
23444fdae999SBram Moolenaar      'three',
2345f5be8cdbSBram Moolenaar      ] # comment
23464fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
23474fdae999SBram Moolenaar
2348cfcd011fSBram Moolenaar  var mydict = {
2349e0de171eSBram Moolenaar      ['one']: 1,
2350e0de171eSBram Moolenaar      ['two']: 2,
2351e0de171eSBram Moolenaar      ['three']:
23524fdae999SBram Moolenaar          3,
2353f5be8cdbSBram Moolenaar      } # comment
2354e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2355e0de171eSBram Moolenaar  mydict = {
23562c330432SBram Moolenaar      one: 1,  # comment
23572c330432SBram Moolenaar      two:     # comment
23582c330432SBram Moolenaar           2,  # comment
23592c330432SBram Moolenaar      three: 3 # comment
23602c330432SBram Moolenaar      }
2361e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2362e0de171eSBram Moolenaar  mydict = {
23632c330432SBram Moolenaar      one: 1,
23644fdae999SBram Moolenaar      two:
23654fdae999SBram Moolenaar           2,
23662c330432SBram Moolenaar      three: 3
23674fdae999SBram Moolenaar      }
2368e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2369e6085c53SBram Moolenaar
2370e6085c53SBram Moolenaar  assert_equal(
2371e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2372e6085c53SBram Moolenaar        split('one two three')
2373e6085c53SBram Moolenaar        )
23744fdae999SBram Moolenaarenddef
23754fdae999SBram Moolenaar
23767a092245SBram Moolenaardef Test_vim9_comment()
23777a092245SBram Moolenaar  CheckScriptSuccess([
23787a092245SBram Moolenaar      'vim9script',
23797a092245SBram Moolenaar      '# something',
238093f82cbeSBram Moolenaar      '#something',
238193f82cbeSBram Moolenaar      '#{something',
23827a092245SBram Moolenaar      ])
238393f82cbeSBram Moolenaar
238493f82cbeSBram Moolenaar  split Xfile
238593f82cbeSBram Moolenaar  CheckScriptSuccess([
238693f82cbeSBram Moolenaar      'vim9script',
238793f82cbeSBram Moolenaar      'edit #something',
238893f82cbeSBram Moolenaar      ])
238993f82cbeSBram Moolenaar  CheckScriptSuccess([
239093f82cbeSBram Moolenaar      'vim9script',
239193f82cbeSBram Moolenaar      'edit #{something',
239293f82cbeSBram Moolenaar      ])
239393f82cbeSBram Moolenaar  close
239493f82cbeSBram Moolenaar
23957a092245SBram Moolenaar  CheckScriptFailure([
23967a092245SBram Moolenaar      'vim9script',
23977a092245SBram Moolenaar      ':# something',
23987a092245SBram Moolenaar      ], 'E488:')
23997a092245SBram Moolenaar  CheckScriptFailure([
24007a092245SBram Moolenaar      '# something',
24017a092245SBram Moolenaar      ], 'E488:')
24027a092245SBram Moolenaar  CheckScriptFailure([
24037a092245SBram Moolenaar      ':# something',
24047a092245SBram Moolenaar      ], 'E488:')
24057a092245SBram Moolenaar
24064a8d9f2eSBram Moolenaar  { # block start
24074a8d9f2eSBram Moolenaar  } # block end
24084a8d9f2eSBram Moolenaar  CheckDefFailure([
24094a8d9f2eSBram Moolenaar      '{# comment',
24104a8d9f2eSBram Moolenaar      ], 'E488:')
24114a8d9f2eSBram Moolenaar  CheckDefFailure([
24124a8d9f2eSBram Moolenaar      '{',
24134a8d9f2eSBram Moolenaar      '}# comment',
24144a8d9f2eSBram Moolenaar      ], 'E488:')
24154a8d9f2eSBram Moolenaar
24164a8d9f2eSBram Moolenaar  echo "yes" # comment
24174a8d9f2eSBram Moolenaar  CheckDefFailure([
24184a8d9f2eSBram Moolenaar      'echo "yes"# comment',
24194a8d9f2eSBram Moolenaar      ], 'E488:')
24207a092245SBram Moolenaar  CheckScriptSuccess([
24217a092245SBram Moolenaar      'vim9script',
24227a092245SBram Moolenaar      'echo "yes" # something',
24237a092245SBram Moolenaar      ])
24247a092245SBram Moolenaar  CheckScriptFailure([
24257a092245SBram Moolenaar      'vim9script',
24267a092245SBram Moolenaar      'echo "yes"# something',
24277a092245SBram Moolenaar      ], 'E121:')
24287a092245SBram Moolenaar  CheckScriptFailure([
24297a092245SBram Moolenaar      'vim9script',
24307a092245SBram Moolenaar      'echo# something',
2431f8103f27SBram Moolenaar      ], 'E1144:')
24327a092245SBram Moolenaar  CheckScriptFailure([
24337a092245SBram Moolenaar      'echo "yes" # something',
24347a092245SBram Moolenaar      ], 'E121:')
24357a092245SBram Moolenaar
24364a8d9f2eSBram Moolenaar  exe "echo" # comment
24374a8d9f2eSBram Moolenaar  CheckDefFailure([
24384a8d9f2eSBram Moolenaar      'exe "echo"# comment',
24394a8d9f2eSBram Moolenaar      ], 'E488:')
24404a8d9f2eSBram Moolenaar  CheckScriptSuccess([
24414a8d9f2eSBram Moolenaar      'vim9script',
24424a8d9f2eSBram Moolenaar      'exe "echo" # something',
24434a8d9f2eSBram Moolenaar      ])
24444a8d9f2eSBram Moolenaar  CheckScriptFailure([
24454a8d9f2eSBram Moolenaar      'vim9script',
24464a8d9f2eSBram Moolenaar      'exe "echo"# something',
24474a8d9f2eSBram Moolenaar      ], 'E121:')
24484a8d9f2eSBram Moolenaar  CheckScriptFailure([
24494a8d9f2eSBram Moolenaar      'vim9script',
24504a8d9f2eSBram Moolenaar      'exe# something',
2451f8103f27SBram Moolenaar      ], 'E1144:')
24524a8d9f2eSBram Moolenaar  CheckScriptFailure([
24534a8d9f2eSBram Moolenaar      'exe "echo" # something',
24544a8d9f2eSBram Moolenaar      ], 'E121:')
24554a8d9f2eSBram Moolenaar
24567a092245SBram Moolenaar  CheckDefFailure([
24577a092245SBram Moolenaar      'try# comment',
24587a092245SBram Moolenaar      '  echo "yes"',
24597a092245SBram Moolenaar      'catch',
24607a092245SBram Moolenaar      'endtry',
2461f8103f27SBram Moolenaar      ], 'E1144:')
24622c5ed4e3SBram Moolenaar  CheckScriptFailure([
24632c5ed4e3SBram Moolenaar      'vim9script',
24642c5ed4e3SBram Moolenaar      'try# comment',
24652c5ed4e3SBram Moolenaar      'echo "yes"',
2466f8103f27SBram Moolenaar      ], 'E1144:')
24677a092245SBram Moolenaar  CheckDefFailure([
24687a092245SBram Moolenaar      'try',
2469a72cfb80SBram Moolenaar      '  throw#comment',
2470a72cfb80SBram Moolenaar      'catch',
2471a72cfb80SBram Moolenaar      'endtry',
2472f8103f27SBram Moolenaar      ], 'E1144:')
2473a72cfb80SBram Moolenaar  CheckDefFailure([
2474a72cfb80SBram Moolenaar      'try',
2475a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2476a72cfb80SBram Moolenaar      'catch',
2477a72cfb80SBram Moolenaar      'endtry',
2478a72cfb80SBram Moolenaar      ], 'E488:')
2479a72cfb80SBram Moolenaar  CheckDefFailure([
2480a72cfb80SBram Moolenaar      'try',
24817a092245SBram Moolenaar      '  echo "yes"',
24827a092245SBram Moolenaar      'catch# comment',
24837a092245SBram Moolenaar      'endtry',
2484f8103f27SBram Moolenaar      ], 'E1144:')
24852c5ed4e3SBram Moolenaar  CheckScriptFailure([
24862c5ed4e3SBram Moolenaar      'vim9script',
24872c5ed4e3SBram Moolenaar      'try',
24882c5ed4e3SBram Moolenaar      '  echo "yes"',
24892c5ed4e3SBram Moolenaar      'catch# comment',
24902c5ed4e3SBram Moolenaar      'endtry',
2491f8103f27SBram Moolenaar      ], 'E1144:')
24922c5ed4e3SBram Moolenaar  CheckDefFailure([
24932c5ed4e3SBram Moolenaar      'try',
24942c5ed4e3SBram Moolenaar      '  echo "yes"',
24952c5ed4e3SBram Moolenaar      'catch /pat/# comment',
24962c5ed4e3SBram Moolenaar      'endtry',
24972c5ed4e3SBram Moolenaar      ], 'E488:')
24987a092245SBram Moolenaar  CheckDefFailure([
24997a092245SBram Moolenaar      'try',
25007a092245SBram Moolenaar      'echo "yes"',
25017a092245SBram Moolenaar      'catch',
25027a092245SBram Moolenaar      'endtry# comment',
2503f8103f27SBram Moolenaar      ], 'E1144:')
25042c5ed4e3SBram Moolenaar  CheckScriptFailure([
25052c5ed4e3SBram Moolenaar      'vim9script',
25062c5ed4e3SBram Moolenaar      'try',
25072c5ed4e3SBram Moolenaar      '  echo "yes"',
25082c5ed4e3SBram Moolenaar      'catch',
25092c5ed4e3SBram Moolenaar      'endtry# comment',
2510f8103f27SBram Moolenaar      ], 'E1144:')
25112c5ed4e3SBram Moolenaar
25122c5ed4e3SBram Moolenaar  CheckScriptSuccess([
25132c5ed4e3SBram Moolenaar      'vim9script',
25142c5ed4e3SBram Moolenaar      'hi # comment',
25152c5ed4e3SBram Moolenaar      ])
25162c5ed4e3SBram Moolenaar  CheckScriptFailure([
25172c5ed4e3SBram Moolenaar      'vim9script',
25182c5ed4e3SBram Moolenaar      'hi# comment',
2519f8103f27SBram Moolenaar      ], 'E1144:')
25201966c248SBram Moolenaar  CheckScriptSuccess([
25211966c248SBram Moolenaar      'vim9script',
25221966c248SBram Moolenaar      'hi Search # comment',
25231966c248SBram Moolenaar      ])
25241966c248SBram Moolenaar  CheckScriptFailure([
25251966c248SBram Moolenaar      'vim9script',
25261966c248SBram Moolenaar      'hi Search# comment',
25271966c248SBram Moolenaar      ], 'E416:')
25281966c248SBram Moolenaar  CheckScriptSuccess([
25291966c248SBram Moolenaar      'vim9script',
25301966c248SBram Moolenaar      'hi link This Search # comment',
25311966c248SBram Moolenaar      ])
25321966c248SBram Moolenaar  CheckScriptFailure([
25331966c248SBram Moolenaar      'vim9script',
25341966c248SBram Moolenaar      'hi link This That# comment',
25351966c248SBram Moolenaar      ], 'E413:')
25361966c248SBram Moolenaar  CheckScriptSuccess([
25371966c248SBram Moolenaar      'vim9script',
25381966c248SBram Moolenaar      'hi clear This # comment',
25391966c248SBram Moolenaar      'hi clear # comment',
25401966c248SBram Moolenaar      ])
2541f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2542f5be8cdbSBram Moolenaar  # hi clear This# comment',
25431966c248SBram Moolenaar  CheckScriptFailure([
25441966c248SBram Moolenaar      'vim9script',
25451966c248SBram Moolenaar      'hi clear# comment',
25461966c248SBram Moolenaar      ], 'E416:')
25471966c248SBram Moolenaar
25481966c248SBram Moolenaar  CheckScriptSuccess([
25491966c248SBram Moolenaar      'vim9script',
25501966c248SBram Moolenaar      'hi Group term=bold',
25511966c248SBram Moolenaar      'match Group /todo/ # comment',
25521966c248SBram Moolenaar      ])
25531966c248SBram Moolenaar  CheckScriptFailure([
25541966c248SBram Moolenaar      'vim9script',
25551966c248SBram Moolenaar      'hi Group term=bold',
25561966c248SBram Moolenaar      'match Group /todo/# comment',
25571966c248SBram Moolenaar      ], 'E488:')
25581966c248SBram Moolenaar  CheckScriptSuccess([
25591966c248SBram Moolenaar      'vim9script',
25601966c248SBram Moolenaar      'match # comment',
25611966c248SBram Moolenaar      ])
25621966c248SBram Moolenaar  CheckScriptFailure([
25631966c248SBram Moolenaar      'vim9script',
25641966c248SBram Moolenaar      'match# comment',
2565f8103f27SBram Moolenaar      ], 'E1144:')
25661966c248SBram Moolenaar  CheckScriptSuccess([
25671966c248SBram Moolenaar      'vim9script',
25681966c248SBram Moolenaar      'match none # comment',
25691966c248SBram Moolenaar      ])
25701966c248SBram Moolenaar  CheckScriptFailure([
25711966c248SBram Moolenaar      'vim9script',
25721966c248SBram Moolenaar      'match none# comment',
25731966c248SBram Moolenaar      ], 'E475:')
25741966c248SBram Moolenaar
25751966c248SBram Moolenaar  CheckScriptSuccess([
25761966c248SBram Moolenaar      'vim9script',
25771966c248SBram Moolenaar      'menutrans clear # comment',
25781966c248SBram Moolenaar      ])
25791966c248SBram Moolenaar  CheckScriptFailure([
25801966c248SBram Moolenaar      'vim9script',
25811966c248SBram Moolenaar      'menutrans clear# comment text',
25821966c248SBram Moolenaar      ], 'E474:')
25831966c248SBram Moolenaar
25841966c248SBram Moolenaar  CheckScriptSuccess([
25851966c248SBram Moolenaar      'vim9script',
25861966c248SBram Moolenaar      'syntax clear # comment',
25871966c248SBram Moolenaar      ])
25881966c248SBram Moolenaar  CheckScriptFailure([
25891966c248SBram Moolenaar      'vim9script',
25901966c248SBram Moolenaar      'syntax clear# comment text',
25911966c248SBram Moolenaar      ], 'E28:')
25921966c248SBram Moolenaar  CheckScriptSuccess([
25931966c248SBram Moolenaar      'vim9script',
25941966c248SBram Moolenaar      'syntax keyword Word some',
25951966c248SBram Moolenaar      'syntax clear Word # comment',
25961966c248SBram Moolenaar      ])
25971966c248SBram Moolenaar  CheckScriptFailure([
25981966c248SBram Moolenaar      'vim9script',
25991966c248SBram Moolenaar      'syntax keyword Word some',
26001966c248SBram Moolenaar      'syntax clear Word# comment text',
26011966c248SBram Moolenaar      ], 'E28:')
26021966c248SBram Moolenaar
26031966c248SBram Moolenaar  CheckScriptSuccess([
26041966c248SBram Moolenaar      'vim9script',
26051966c248SBram Moolenaar      'syntax list # comment',
26061966c248SBram Moolenaar      ])
26071966c248SBram Moolenaar  CheckScriptFailure([
26081966c248SBram Moolenaar      'vim9script',
26091966c248SBram Moolenaar      'syntax list# comment text',
26101966c248SBram Moolenaar      ], 'E28:')
26111966c248SBram Moolenaar
26121966c248SBram Moolenaar  CheckScriptSuccess([
26131966c248SBram Moolenaar      'vim9script',
26141966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
26151966c248SBram Moolenaar      ])
26161966c248SBram Moolenaar  CheckScriptFailure([
26171966c248SBram Moolenaar      'vim9script',
26181966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
26191966c248SBram Moolenaar      ], 'E475:')
26201966c248SBram Moolenaar
26211966c248SBram Moolenaar  CheckScriptSuccess([
26221966c248SBram Moolenaar      'vim9script',
26231966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
26241966c248SBram Moolenaar      ])
26251966c248SBram Moolenaar  CheckScriptFailure([
26261966c248SBram Moolenaar      'vim9script',
26271966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
26281966c248SBram Moolenaar      ], 'E789:')
26291966c248SBram Moolenaar
26301966c248SBram Moolenaar  CheckScriptSuccess([
26311966c248SBram Moolenaar      'vim9script',
26321966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
26331966c248SBram Moolenaar      ])
26341966c248SBram Moolenaar  CheckScriptFailure([
26351966c248SBram Moolenaar      'vim9script',
26361966c248SBram Moolenaar      'syntax match Word /pat/# comment',
26371966c248SBram Moolenaar      ], 'E402:')
26381966c248SBram Moolenaar
26391966c248SBram Moolenaar  CheckScriptSuccess([
26401966c248SBram Moolenaar      'vim9script',
26411966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
26421966c248SBram Moolenaar      ])
26431966c248SBram Moolenaar  CheckScriptFailure([
26441966c248SBram Moolenaar      'vim9script',
26451966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
26461966c248SBram Moolenaar      ], 'E475:')
26471966c248SBram Moolenaar  CheckScriptFailure([
26481966c248SBram Moolenaar      'vim9script',
26491966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
26501966c248SBram Moolenaar      ], 'E406:')
26511966c248SBram Moolenaar  CheckScriptFailure([
26521966c248SBram Moolenaar      'vim9script',
26531966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
26541966c248SBram Moolenaar      ], 'E475:')
26551966c248SBram Moolenaar
26561966c248SBram Moolenaar  CheckScriptSuccess([
26571966c248SBram Moolenaar      'vim9script',
26581966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
26591966c248SBram Moolenaar      ])
26601966c248SBram Moolenaar  CheckScriptFailure([
26611966c248SBram Moolenaar      'vim9script',
26621966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2663d032f34aSBram Moolenaar      ], 'E402:')
26641966c248SBram Moolenaar
26651966c248SBram Moolenaar  CheckScriptSuccess([
26661966c248SBram Moolenaar      'vim9script',
26671966c248SBram Moolenaar      'syntax sync # comment',
26681966c248SBram Moolenaar      ])
26691966c248SBram Moolenaar  CheckScriptFailure([
26701966c248SBram Moolenaar      'vim9script',
26711966c248SBram Moolenaar      'syntax sync# comment',
26721966c248SBram Moolenaar      ], 'E404:')
26731966c248SBram Moolenaar  CheckScriptSuccess([
26741966c248SBram Moolenaar      'vim9script',
26751966c248SBram Moolenaar      'syntax sync ccomment # comment',
26761966c248SBram Moolenaar      ])
26771966c248SBram Moolenaar  CheckScriptFailure([
26781966c248SBram Moolenaar      'vim9script',
26791966c248SBram Moolenaar      'syntax sync ccomment# comment',
26801966c248SBram Moolenaar      ], 'E404:')
26811966c248SBram Moolenaar
26821966c248SBram Moolenaar  CheckScriptSuccess([
26831966c248SBram Moolenaar      'vim9script',
26841966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
26851966c248SBram Moolenaar      ])
26861966c248SBram Moolenaar  CheckScriptFailure([
26871966c248SBram Moolenaar      'vim9script',
26881966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
26891966c248SBram Moolenaar      ], 'E475:')
2690a72cfb80SBram Moolenaar
2691a72cfb80SBram Moolenaar  CheckScriptSuccess([
2692a72cfb80SBram Moolenaar      'vim9script',
2693a72cfb80SBram Moolenaar      'command Echo echo # comment',
2694a72cfb80SBram Moolenaar      'command Echo # comment',
26952d870f8dSBram Moolenaar      'delcommand Echo',
2696a72cfb80SBram Moolenaar      ])
2697a72cfb80SBram Moolenaar  CheckScriptFailure([
2698a72cfb80SBram Moolenaar      'vim9script',
2699a72cfb80SBram Moolenaar      'command Echo echo# comment',
2700a72cfb80SBram Moolenaar      'Echo',
2701f8103f27SBram Moolenaar      ], 'E1144:')
27022d870f8dSBram Moolenaar  delcommand Echo
270370249ee8SBram Moolenaar
270470249ee8SBram Moolenaar  var curdir = getcwd()
270570249ee8SBram Moolenaar  CheckScriptSuccess([
270670249ee8SBram Moolenaar      'command Echo cd " comment',
270770249ee8SBram Moolenaar      'Echo',
270870249ee8SBram Moolenaar      'delcommand Echo',
270970249ee8SBram Moolenaar      ])
271070249ee8SBram Moolenaar  CheckScriptSuccess([
2711090728adSBram Moolenaar      'vim9script',
271270249ee8SBram Moolenaar      'command Echo cd # comment',
271370249ee8SBram Moolenaar      'Echo',
271470249ee8SBram Moolenaar      'delcommand Echo',
271570249ee8SBram Moolenaar      ])
271670249ee8SBram Moolenaar  CheckScriptFailure([
271770249ee8SBram Moolenaar      'vim9script',
271870249ee8SBram Moolenaar      'command Echo cd " comment',
271970249ee8SBram Moolenaar      'Echo',
272070249ee8SBram Moolenaar      ], 'E344:')
272170249ee8SBram Moolenaar  delcommand Echo
272270249ee8SBram Moolenaar  chdir(curdir)
272370249ee8SBram Moolenaar
2724a72cfb80SBram Moolenaar  CheckScriptFailure([
2725a72cfb80SBram Moolenaar      'vim9script',
2726a72cfb80SBram Moolenaar      'command Echo# comment',
2727a72cfb80SBram Moolenaar      ], 'E182:')
2728a72cfb80SBram Moolenaar  CheckScriptFailure([
2729a72cfb80SBram Moolenaar      'vim9script',
2730a72cfb80SBram Moolenaar      'command Echo echo',
2731a72cfb80SBram Moolenaar      'command Echo# comment',
2732a72cfb80SBram Moolenaar      ], 'E182:')
27332d870f8dSBram Moolenaar  delcommand Echo
2734a72cfb80SBram Moolenaar
2735a72cfb80SBram Moolenaar  CheckScriptSuccess([
2736a72cfb80SBram Moolenaar      'vim9script',
2737a72cfb80SBram Moolenaar      'function # comment',
2738a72cfb80SBram Moolenaar      ])
2739a72cfb80SBram Moolenaar  CheckScriptFailure([
2740a72cfb80SBram Moolenaar      'vim9script',
27419898107fSBram Moolenaar      'function " comment',
27429898107fSBram Moolenaar      ], 'E129:')
27439898107fSBram Moolenaar  CheckScriptFailure([
27449898107fSBram Moolenaar      'vim9script',
2745a72cfb80SBram Moolenaar      'function# comment',
2746f8103f27SBram Moolenaar      ], 'E1144:')
2747a72cfb80SBram Moolenaar  CheckScriptSuccess([
2748a72cfb80SBram Moolenaar      'vim9script',
2749a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2750a72cfb80SBram Moolenaar      ])
2751a72cfb80SBram Moolenaar  CheckScriptFailure([
2752a72cfb80SBram Moolenaar      'vim9script',
2753a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2754a72cfb80SBram Moolenaar      ], 'E488:')
2755a72cfb80SBram Moolenaar
2756a72cfb80SBram Moolenaar  CheckScriptSuccess([
2757a72cfb80SBram Moolenaar      'vim9script',
27584c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2759a72cfb80SBram Moolenaar      'endfunc',
27604c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2761a72cfb80SBram Moolenaar      ])
2762a72cfb80SBram Moolenaar  CheckScriptFailure([
2763a72cfb80SBram Moolenaar      'vim9script',
27644c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2765a72cfb80SBram Moolenaar      'endfunc',
27664c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2767a72cfb80SBram Moolenaar      ], 'E488:')
2768a72cfb80SBram Moolenaar
2769a72cfb80SBram Moolenaar  CheckScriptSuccess([
2770a72cfb80SBram Moolenaar      'vim9script',
2771a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2772a72cfb80SBram Moolenaar      ])
2773a72cfb80SBram Moolenaar  CheckScriptFailure([
2774a72cfb80SBram Moolenaar      'vim9script',
2775a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2776a72cfb80SBram Moolenaar      ], 'E488:')
2777e7e4838fSBram Moolenaar
2778e7e4838fSBram Moolenaar  CheckScriptFailure([
2779e7e4838fSBram Moolenaar      'def Test() " comment',
2780e7e4838fSBram Moolenaar      'enddef',
2781e7e4838fSBram Moolenaar      ], 'E488:')
2782e7e4838fSBram Moolenaar  CheckScriptFailure([
2783e7e4838fSBram Moolenaar      'vim9script',
2784e7e4838fSBram Moolenaar      'def Test() " comment',
2785e7e4838fSBram Moolenaar      'enddef',
2786e7e4838fSBram Moolenaar      ], 'E488:')
2787e7e4838fSBram Moolenaar
2788e7e4838fSBram Moolenaar  CheckScriptSuccess([
2789e7e4838fSBram Moolenaar      'func Test() " comment',
2790e7e4838fSBram Moolenaar      'endfunc',
27912d870f8dSBram Moolenaar      'delfunc Test',
2792e7e4838fSBram Moolenaar      ])
27939898107fSBram Moolenaar  CheckScriptSuccess([
2794e7e4838fSBram Moolenaar      'vim9script',
2795e7e4838fSBram Moolenaar      'func Test() " comment',
2796e7e4838fSBram Moolenaar      'endfunc',
27979898107fSBram Moolenaar      ])
2798e7e4838fSBram Moolenaar
2799e7e4838fSBram Moolenaar  CheckScriptSuccess([
2800e7e4838fSBram Moolenaar      'def Test() # comment',
2801e7e4838fSBram Moolenaar      'enddef',
2802e7e4838fSBram Moolenaar      ])
2803e7e4838fSBram Moolenaar  CheckScriptFailure([
2804e7e4838fSBram Moolenaar      'func Test() # comment',
2805e7e4838fSBram Moolenaar      'endfunc',
2806e7e4838fSBram Moolenaar      ], 'E488:')
28072c5ed4e3SBram Moolenaarenddef
28082c5ed4e3SBram Moolenaar
28092c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
28102c5ed4e3SBram Moolenaar  CheckCanRunGui
28112c5ed4e3SBram Moolenaar
28122c5ed4e3SBram Moolenaar  CheckScriptFailure([
28132c5ed4e3SBram Moolenaar      'vim9script',
28142c5ed4e3SBram Moolenaar      'gui#comment'
2815f8103f27SBram Moolenaar      ], 'E1144:')
28162c5ed4e3SBram Moolenaar  CheckScriptFailure([
28172c5ed4e3SBram Moolenaar      'vim9script',
28182c5ed4e3SBram Moolenaar      'gui -f#comment'
28192c5ed4e3SBram Moolenaar      ], 'E499:')
28207a092245SBram Moolenaarenddef
28217a092245SBram Moolenaar
2822a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
28236797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
28246797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2825a26b9700SBram Moolenaar
2826a26b9700SBram Moolenaar  edit test.vim
2827a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2828a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2829a26b9700SBram Moolenaar
2830a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2831a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2832a26b9700SBram Moolenaar
2833a26b9700SBram Moolenaar  g:entered = 0
2834a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2835a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2836a26b9700SBram Moolenaar
2837a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2838a26b9700SBram Moolenaar
2839a26b9700SBram Moolenaar  au! TabEnter
2840a26b9700SBram Moolenaar  unlet g:entered
2841d72c1bf0SBram Moolenaar
2842d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2843d72c1bf0SBram Moolenaar      'vim9script',
28446797966dSBram Moolenaar      'g:var = 123',
2845e55b1c09SBram Moolenaar      'b:var = 456',
2846e55b1c09SBram Moolenaar      'w:var = 777',
2847e55b1c09SBram Moolenaar      't:var = 888',
2848d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2849d72c1bf0SBram Moolenaar      ])
2850d72c1bf0SBram Moolenaar
2851d72c1bf0SBram Moolenaar  CheckScriptFailure([
2852d72c1bf0SBram Moolenaar      'vim9script',
2853cfcd011fSBram Moolenaar      'let var = 123',
2854cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2855cfcd011fSBram Moolenaar
2856cfcd011fSBram Moolenaar  CheckScriptFailure([
2857cfcd011fSBram Moolenaar      'vim9script',
2858cfcd011fSBram Moolenaar      'var g:var = 123',
2859e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2860e55b1c09SBram Moolenaar
2861e55b1c09SBram Moolenaar  CheckScriptFailure([
2862e55b1c09SBram Moolenaar      'vim9script',
2863cfcd011fSBram Moolenaar      'var b:var = 123',
2864e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2865e55b1c09SBram Moolenaar
2866e55b1c09SBram Moolenaar  CheckScriptFailure([
2867e55b1c09SBram Moolenaar      'vim9script',
2868cfcd011fSBram Moolenaar      'var w:var = 123',
2869e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2870e55b1c09SBram Moolenaar
2871e55b1c09SBram Moolenaar  CheckScriptFailure([
2872e55b1c09SBram Moolenaar      'vim9script',
2873cfcd011fSBram Moolenaar      'var t:var = 123',
2874e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2875e55b1c09SBram Moolenaar
2876e55b1c09SBram Moolenaar  CheckScriptFailure([
2877e55b1c09SBram Moolenaar      'vim9script',
2878cfcd011fSBram Moolenaar      'var v:version = 123',
2879e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2880e55b1c09SBram Moolenaar
2881e55b1c09SBram Moolenaar  CheckScriptFailure([
2882e55b1c09SBram Moolenaar      'vim9script',
2883cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2884e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
28856797966dSBram Moolenaar
28866797966dSBram Moolenaar  CheckScriptFailure([
28876797966dSBram Moolenaar      'vim9script',
28886797966dSBram Moolenaar      'g:var = 123',
288932e35117SBram Moolenaar      'unlet g:var# comment1',
2890d72c1bf0SBram Moolenaar      ], 'E108:')
2891d72c1bf0SBram Moolenaar
2892d72c1bf0SBram Moolenaar  CheckScriptFailure([
2893d72c1bf0SBram Moolenaar      'let g:var = 123',
2894d72c1bf0SBram Moolenaar      'unlet g:var # something',
2895d72c1bf0SBram Moolenaar      ], 'E488:')
2896faac4104SBram Moolenaar
2897faac4104SBram Moolenaar  CheckScriptSuccess([
2898faac4104SBram Moolenaar      'vim9script',
289932e35117SBram Moolenaar      'if 1 # comment2',
2900faac4104SBram Moolenaar      '  echo "yes"',
2901faac4104SBram Moolenaar      'elseif 2 #comment',
2902faac4104SBram Moolenaar      '  echo "no"',
2903faac4104SBram Moolenaar      'endif',
2904faac4104SBram Moolenaar      ])
2905faac4104SBram Moolenaar
2906faac4104SBram Moolenaar  CheckScriptFailure([
2907faac4104SBram Moolenaar      'vim9script',
290832e35117SBram Moolenaar      'if 1# comment3',
2909faac4104SBram Moolenaar      '  echo "yes"',
2910faac4104SBram Moolenaar      'endif',
2911faac4104SBram Moolenaar      ], 'E15:')
2912faac4104SBram Moolenaar
2913faac4104SBram Moolenaar  CheckScriptFailure([
2914faac4104SBram Moolenaar      'vim9script',
291532e35117SBram Moolenaar      'if 0 # comment4',
2916faac4104SBram Moolenaar      '  echo "yes"',
2917faac4104SBram Moolenaar      'elseif 2#comment',
2918faac4104SBram Moolenaar      '  echo "no"',
2919faac4104SBram Moolenaar      'endif',
2920faac4104SBram Moolenaar      ], 'E15:')
2921faac4104SBram Moolenaar
2922faac4104SBram Moolenaar  CheckScriptSuccess([
2923faac4104SBram Moolenaar      'vim9script',
2924cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2925faac4104SBram Moolenaar      ])
2926faac4104SBram Moolenaar
2927faac4104SBram Moolenaar  CheckScriptFailure([
2928faac4104SBram Moolenaar      'vim9script',
2929cfcd011fSBram Moolenaar      'var v = 1# comment6',
293032e35117SBram Moolenaar      ], 'E15:')
2931faac4104SBram Moolenaar
2932faac4104SBram Moolenaar  CheckScriptSuccess([
2933faac4104SBram Moolenaar      'vim9script',
2934faac4104SBram Moolenaar      'new'
2935d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2936df069eecSBram Moolenaar      ':$',
2937faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2938faac4104SBram Moolenaar      'bwipe!',
2939faac4104SBram Moolenaar      ])
2940faac4104SBram Moolenaar
2941f5be8cdbSBram Moolenaar  CheckScriptFailure([
2942f5be8cdbSBram Moolenaar      'vim9script',
2943f5be8cdbSBram Moolenaar      'new'
2944d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2945f5be8cdbSBram Moolenaar      ':$',
2946f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2947f5be8cdbSBram Moolenaar      'bwipe!',
2948f5be8cdbSBram Moolenaar      ], 'E488:')
2949f5be8cdbSBram Moolenaar
2950f5be8cdbSBram Moolenaar  CheckScriptFailure([
2951f5be8cdbSBram Moolenaar      'vim9script',
2952f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2953f5be8cdbSBram Moolenaar      ], 'E477:')
2954a26b9700SBram Moolenaarenddef
2955a26b9700SBram Moolenaar
29567e5bd91dSBram Moolenaardef Test_finish()
2957cfcd011fSBram Moolenaar  var lines =<< trim END
29587e5bd91dSBram Moolenaar    vim9script
29596797966dSBram Moolenaar    g:res = 'one'
29607e5bd91dSBram Moolenaar    if v:false | finish | endif
29616797966dSBram Moolenaar    g:res = 'two'
29627e5bd91dSBram Moolenaar    finish
29636797966dSBram Moolenaar    g:res = 'three'
29647e5bd91dSBram Moolenaar  END
29657e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
29667e5bd91dSBram Moolenaar  source Xfinished
29677e5bd91dSBram Moolenaar  assert_equal('two', g:res)
29687e5bd91dSBram Moolenaar
29697e5bd91dSBram Moolenaar  unlet g:res
29707e5bd91dSBram Moolenaar  delete('Xfinished')
29717e5bd91dSBram Moolenaarenddef
29727e5bd91dSBram Moolenaar
2973a5d0077eSBram Moolenaardef Test_forward_declaration()
2974cfcd011fSBram Moolenaar  var lines =<< trim END
2975a5d0077eSBram Moolenaar    vim9script
2976a5d0077eSBram Moolenaar    def GetValue(): string
2977a5d0077eSBram Moolenaar      return theVal
2978a5d0077eSBram Moolenaar    enddef
2979cfcd011fSBram Moolenaar    var theVal = 'something'
2980822ba247SBram Moolenaar    g:initVal = GetValue()
2981a5d0077eSBram Moolenaar    theVal = 'else'
2982a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2983a5d0077eSBram Moolenaar  END
2984a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2985a5d0077eSBram Moolenaar  source Xforward
2986a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2987a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2988a5d0077eSBram Moolenaar
2989a5d0077eSBram Moolenaar  unlet g:initVal
2990a5d0077eSBram Moolenaar  unlet g:laterVal
2991a5d0077eSBram Moolenaar  delete('Xforward')
2992a5d0077eSBram Moolenaarenddef
2993a5d0077eSBram Moolenaar
29949721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
2995a6294955SBram Moolenaar  var vim9_lines =<< trim END
2996a6294955SBram Moolenaar    vim9script
2997a6294955SBram Moolenaar    var local = 'local'
2998a6294955SBram Moolenaar    g:global = 'global'
2999a6294955SBram Moolenaar    export var exported = 'exported'
3000a6294955SBram Moolenaar    export def GetText(): string
3001a6294955SBram Moolenaar       return 'text'
3002a6294955SBram Moolenaar    enddef
3003a6294955SBram Moolenaar  END
3004a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3005a6294955SBram Moolenaar
3006cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
30079721fb4eSBram Moolenaar    source Xvim9_script.vim
30089721fb4eSBram Moolenaar
30099721fb4eSBram Moolenaar    call assert_false(exists('local'))
30109721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30119721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
30129721fb4eSBram Moolenaar    call assert_equal('global', global)
30139721fb4eSBram Moolenaar    call assert_equal('global', g:global)
30149721fb4eSBram Moolenaar
30159721fb4eSBram Moolenaar    " imported variable becomes script-local
30169721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
30179721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
30189721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30199721fb4eSBram Moolenaar
30209721fb4eSBram Moolenaar    " imported function becomes script-local
30219721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
30229721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
30239721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
30249721fb4eSBram Moolenaar  END
30259721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
30269721fb4eSBram Moolenaar
30279721fb4eSBram Moolenaar  source Xlegacy_script.vim
30289721fb4eSBram Moolenaar  assert_equal('global', g:global)
3029f5be8cdbSBram Moolenaar  unlet g:global
30309721fb4eSBram Moolenaar
30319721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
30329721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
30339721fb4eSBram Moolenaarenddef
3034a5d0077eSBram Moolenaar
30357d699701SBram Moolenaarfunc Test_vim9script_not_global()
30367d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
30377d699701SBram Moolenaar  let vim9lines =<< trim END
30387d699701SBram Moolenaar    vim9script
3039cfcd011fSBram Moolenaar    var name = 'local'
30407d699701SBram Moolenaar    func TheFunc()
30417d699701SBram Moolenaar      echo 'local'
30427d699701SBram Moolenaar    endfunc
30437d699701SBram Moolenaar    def DefFunc()
30447d699701SBram Moolenaar      echo 'local'
30457d699701SBram Moolenaar    enddef
30467d699701SBram Moolenaar  END
30477d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
30487d699701SBram Moolenaar  source Xvim9script.vim
30497d699701SBram Moolenaar  try
30507d699701SBram Moolenaar    echo g:var
30517d699701SBram Moolenaar    assert_report('did not fail')
30527d699701SBram Moolenaar  catch /E121:/
30537d699701SBram Moolenaar    " caught
30547d699701SBram Moolenaar  endtry
30557d699701SBram Moolenaar  try
30567d699701SBram Moolenaar    call TheFunc()
30577d699701SBram Moolenaar    assert_report('did not fail')
30587d699701SBram Moolenaar  catch /E117:/
30597d699701SBram Moolenaar    " caught
30607d699701SBram Moolenaar  endtry
30617d699701SBram Moolenaar  try
30627d699701SBram Moolenaar    call DefFunc()
30637d699701SBram Moolenaar    assert_report('did not fail')
30647d699701SBram Moolenaar  catch /E117:/
30657d699701SBram Moolenaar    " caught
30667d699701SBram Moolenaar  endtry
30677d699701SBram Moolenaar
306825859dd7SBram Moolenaar  call delete('Xvim9script.vim')
30697d699701SBram Moolenaarendfunc
30707d699701SBram Moolenaar
3071eeb27bfeSBram Moolenaardef Test_vim9_copen()
3072eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3073eeb27bfeSBram Moolenaar  copen
3074eeb27bfeSBram Moolenaar  quit
3075eeb27bfeSBram Moolenaarenddef
3076eeb27bfeSBram Moolenaar
307703290b84SBram Moolenaar" test using an auto-loaded function and variable
30782d6b20d6SBram Moolenaardef Test_vim9_autoload()
3079cfcd011fSBram Moolenaar  var lines =<< trim END
30802d6b20d6SBram Moolenaar     vim9script
308103290b84SBram Moolenaar     def some#gettest(): string
308203290b84SBram Moolenaar       return 'test'
308303290b84SBram Moolenaar     enddef
308403290b84SBram Moolenaar     g:some#name = 'name'
308503290b84SBram Moolenaar  END
308603290b84SBram Moolenaar
308703290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
308803290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
308903290b84SBram Moolenaar  var save_rtp = &rtp
309003290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
309103290b84SBram Moolenaar
309203290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
309303290b84SBram Moolenaar  assert_equal('name', g:some#name)
309403290b84SBram Moolenaar  g:some#other = 'other'
309503290b84SBram Moolenaar  assert_equal('other', g:some#other)
309603290b84SBram Moolenaar
309717f700acSBram Moolenaar  # upper case script name works
309817f700acSBram Moolenaar  lines =<< trim END
309917f700acSBram Moolenaar     vim9script
310017f700acSBram Moolenaar     def Other#getOther(): string
310117f700acSBram Moolenaar       return 'other'
310217f700acSBram Moolenaar     enddef
310317f700acSBram Moolenaar  END
310417f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
310517f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
310617f700acSBram Moolenaar
310703290b84SBram Moolenaar  delete('Xdir', 'rf')
310803290b84SBram Moolenaar  &rtp = save_rtp
310903290b84SBram Moolenaarenddef
311003290b84SBram Moolenaar
311103290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
311203290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
311303290b84SBram Moolenaar  var lines =<< trim END
311403290b84SBram Moolenaar     vim9script
31152d6b20d6SBram Moolenaar     def foo#test()
31162d6b20d6SBram Moolenaar         echomsg getreg('"')
31172d6b20d6SBram Moolenaar     enddef
31182d6b20d6SBram Moolenaar  END
31192d6b20d6SBram Moolenaar
31202d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
31212d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3122cfcd011fSBram Moolenaar  var save_rtp = &rtp
31232d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
31242d6b20d6SBram Moolenaar  augroup test
31252d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
31262d6b20d6SBram Moolenaar  augroup END
31272d6b20d6SBram Moolenaar
31282d6b20d6SBram Moolenaar  normal Y
31292d6b20d6SBram Moolenaar
31302d6b20d6SBram Moolenaar  augroup test
31312d6b20d6SBram Moolenaar    autocmd!
31322d6b20d6SBram Moolenaar  augroup END
31332d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
31342d6b20d6SBram Moolenaar  &rtp = save_rtp
31352d6b20d6SBram Moolenaarenddef
31362d6b20d6SBram Moolenaar
313777e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
313877e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3139cfcd011fSBram Moolenaar  var lines =<< trim END
314077e5dcc3SBram Moolenaar      vim9script
314177e5dcc3SBram Moolenaar      def crash#func()
314277e5dcc3SBram Moolenaar          try
314377e5dcc3SBram Moolenaar              for x in List()
314477e5dcc3SBram Moolenaar              endfor
314577e5dcc3SBram Moolenaar          catch
314677e5dcc3SBram Moolenaar          endtry
314777e5dcc3SBram Moolenaar          g:ok = true
314877e5dcc3SBram Moolenaar      enddef
314977e5dcc3SBram Moolenaar      fu List()
315077e5dcc3SBram Moolenaar          invalid
315177e5dcc3SBram Moolenaar      endfu
315277e5dcc3SBram Moolenaar      try
315348e11c10SBram Moolenaar          alsoinvalid
315477e5dcc3SBram Moolenaar      catch /wontmatch/
315577e5dcc3SBram Moolenaar      endtry
315677e5dcc3SBram Moolenaar  END
315777e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
315877e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
315977e5dcc3SBram Moolenaar
316077e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
316177e5dcc3SBram Moolenaar  lines =<< trim END
316277e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
316377e5dcc3SBram Moolenaar    call crash#func()
316477e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
31659c4f5520SBram Moolenaar    qall!
316677e5dcc3SBram Moolenaar  END
316777e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
316877e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
316977e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
317077e5dcc3SBram Moolenaar
317177e5dcc3SBram Moolenaar  delete('Xdidit')
317277e5dcc3SBram Moolenaar  delete('Xscript')
317377e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
317403290b84SBram Moolenaar
317503290b84SBram Moolenaar  lines =<< trim END
317603290b84SBram Moolenaar    vim9script
317703290b84SBram Moolenaar    var foo#bar = 'asdf'
317803290b84SBram Moolenaar  END
317903290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
318077e5dcc3SBram Moolenaarenddef
318177e5dcc3SBram Moolenaar
318281e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
318381e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
318481e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3185cfcd011fSBram Moolenaar  var lines =<< trim END
318681e17fbeSBram Moolenaar    let s:counter = 1
318781e17fbeSBram Moolenaar    def s:Func()
318881e17fbeSBram Moolenaar      au! CursorHold
318981e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
319081e17fbeSBram Moolenaar    enddef
319181e17fbeSBram Moolenaar    call s:Func()
319281e17fbeSBram Moolenaar    doau CursorHold
319381e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
319481e17fbeSBram Moolenaar    au! CursorHold
319581e17fbeSBram Moolenaar  END
319681e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
319781e17fbeSBram Moolenaarenddef
319881e17fbeSBram Moolenaar
31993896a105SBram Moolenaardef Test_cmdline_win()
32003896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
32013896a105SBram Moolenaar  # the command line window.
32023896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3203cfcd011fSBram Moolenaar  var export_lines =<< trim END
32043896a105SBram Moolenaar    vim9script
3205cfcd011fSBram Moolenaar    export var That = 'yes'
32063896a105SBram Moolenaar  END
32073896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3208cfcd011fSBram Moolenaar  var import_lines =<< trim END
32093896a105SBram Moolenaar    vim9script
32103896a105SBram Moolenaar    import That from './Xexport.vim'
32113896a105SBram Moolenaar  END
32123896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3213cfcd011fSBram Moolenaar  var save_rtp = &rtp
32143896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
32153896a105SBram Moolenaar  syntax on
32163896a105SBram Moolenaar  augroup CmdWin
32173896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
32183896a105SBram Moolenaar  augroup END
32193896a105SBram Moolenaar  # this will open and also close the cmdline window
32203896a105SBram Moolenaar  feedkeys('q:', 'xt')
32213896a105SBram Moolenaar  assert_equal('yes', g:got_there)
32223896a105SBram Moolenaar
32233896a105SBram Moolenaar  augroup CmdWin
32243896a105SBram Moolenaar    au!
32253896a105SBram Moolenaar  augroup END
32263896a105SBram Moolenaar  &rtp = save_rtp
32273896a105SBram Moolenaar  delete('rtp', 'rf')
32283896a105SBram Moolenaarenddef
32293896a105SBram Moolenaar
3230e3d4685fSBram Moolenaardef Test_invalid_sid()
3231e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
323225859dd7SBram Moolenaar
32339c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3234d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3235e3d4685fSBram Moolenaar  endif
3236e3d4685fSBram Moolenaar  delete('Xdidit')
3237e3d4685fSBram Moolenaarenddef
3238e3d4685fSBram Moolenaar
32399ec7026fSBram Moolenaardef Test_restoring_cpo()
32409ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
32419ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
32429ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
32439ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
32449ec7026fSBram Moolenaar  endif
32459ec7026fSBram Moolenaar  delete('Xsourced')
32469ec7026fSBram Moolenaar  delete('Xclose')
3247090728adSBram Moolenaar  delete('Xdone')
32480123cc1eSBram Moolenaar
32490123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
32500123cc1eSBram Moolenaar  set cpo=aABceFsMny>
32510123cc1eSBram Moolenaar  edit XanotherScript
32520123cc1eSBram Moolenaar  so %
32530123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
32540123cc1eSBram Moolenaar  :1del
32550123cc1eSBram Moolenaar  w
32560123cc1eSBram Moolenaar  so %
32570123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
32580123cc1eSBram Moolenaar
32590123cc1eSBram Moolenaar  delete('XanotherScript')
32600123cc1eSBram Moolenaar  set cpo&vim
32619ec7026fSBram Moolenaarenddef
32629ec7026fSBram Moolenaar
32639ec7026fSBram Moolenaar
3264f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3265cfcd011fSBram Moolenaar  var lines =<< trim END
3266cfcd011fSBram Moolenaar    var name: any
3267cfcd011fSBram Moolenaar    assert_equal(0, name)
3268f0afd9e1SBram Moolenaar  END
3269f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3270f0afd9e1SBram Moolenaarenddef
3271f0afd9e1SBram Moolenaar
32727e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
327358dbef33SBram Moolenaar  CheckRunVimInTerminal
327458dbef33SBram Moolenaar
32757e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
32767e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
32777e9210eaSBram Moolenaarendfunc
32787e9210eaSBram Moolenaar
32797e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
32809c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3281cfcd011fSBram Moolenaar  var lines =<< trim END
32829c4f5520SBram Moolenaar    func CheckAndQuit()
32839c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
32849c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
32859c4f5520SBram Moolenaar    endfunc
32869c4f5520SBram Moolenaar  END
32879c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
32889c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3289e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
32909c4f5520SBram Moolenaar  # define Afunc() on the command line
32919c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
32929c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
32932949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
32949c4f5520SBram Moolenaar
32959c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
32969c4f5520SBram Moolenaar  delete('XcallFunc')
32979c4f5520SBram Moolenaar  delete('Xdidcmd')
32989c4f5520SBram Moolenaarenddef
32999c4f5520SBram Moolenaar
3300fcdc5d83SBram Moolenaardef Test_script_var_scope()
3301fcdc5d83SBram Moolenaar  var lines =<< trim END
3302fcdc5d83SBram Moolenaar      vim9script
3303fcdc5d83SBram Moolenaar      if true
3304fcdc5d83SBram Moolenaar        if true
3305fcdc5d83SBram Moolenaar          var one = 'one'
3306fcdc5d83SBram Moolenaar          echo one
3307fcdc5d83SBram Moolenaar        endif
3308fcdc5d83SBram Moolenaar        echo one
3309fcdc5d83SBram Moolenaar      endif
3310fcdc5d83SBram Moolenaar  END
3311fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3312fcdc5d83SBram Moolenaar
3313fcdc5d83SBram Moolenaar  lines =<< trim END
3314fcdc5d83SBram Moolenaar      vim9script
3315fcdc5d83SBram Moolenaar      if true
3316fcdc5d83SBram Moolenaar        if false
3317fcdc5d83SBram Moolenaar          var one = 'one'
3318fcdc5d83SBram Moolenaar          echo one
3319fcdc5d83SBram Moolenaar        else
3320fcdc5d83SBram Moolenaar          var one = 'one'
3321fcdc5d83SBram Moolenaar          echo one
3322fcdc5d83SBram Moolenaar        endif
3323fcdc5d83SBram Moolenaar        echo one
3324fcdc5d83SBram Moolenaar      endif
3325fcdc5d83SBram Moolenaar  END
3326fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3327fcdc5d83SBram Moolenaar
3328fcdc5d83SBram Moolenaar  lines =<< trim END
3329fcdc5d83SBram Moolenaar      vim9script
3330fcdc5d83SBram Moolenaar      while true
3331fcdc5d83SBram Moolenaar        var one = 'one'
3332fcdc5d83SBram Moolenaar        echo one
3333fcdc5d83SBram Moolenaar        break
3334fcdc5d83SBram Moolenaar      endwhile
3335fcdc5d83SBram Moolenaar      echo one
3336fcdc5d83SBram Moolenaar  END
3337fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3338fcdc5d83SBram Moolenaar
3339fcdc5d83SBram Moolenaar  lines =<< trim END
3340fcdc5d83SBram Moolenaar      vim9script
3341fcdc5d83SBram Moolenaar      for i in range(1)
3342fcdc5d83SBram Moolenaar        var one = 'one'
3343fcdc5d83SBram Moolenaar        echo one
3344fcdc5d83SBram Moolenaar      endfor
3345fcdc5d83SBram Moolenaar      echo one
3346fcdc5d83SBram Moolenaar  END
3347fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
33489becdf2bSBram Moolenaar
33499becdf2bSBram Moolenaar  lines =<< trim END
33509becdf2bSBram Moolenaar      vim9script
33519becdf2bSBram Moolenaar      {
33529becdf2bSBram Moolenaar        var one = 'one'
33539becdf2bSBram Moolenaar        assert_equal('one', one)
33549becdf2bSBram Moolenaar      }
33559becdf2bSBram Moolenaar      assert_false(exists('one'))
33569becdf2bSBram Moolenaar      assert_false(exists('s:one'))
33579becdf2bSBram Moolenaar  END
33589becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
33599becdf2bSBram Moolenaar
33609becdf2bSBram Moolenaar  lines =<< trim END
33619becdf2bSBram Moolenaar      vim9script
33629becdf2bSBram Moolenaar      {
33639becdf2bSBram Moolenaar        var one = 'one'
33649becdf2bSBram Moolenaar        echo one
33659becdf2bSBram Moolenaar      }
33669becdf2bSBram Moolenaar      echo one
33679becdf2bSBram Moolenaar  END
33689becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3369fcdc5d83SBram Moolenaarenddef
3370fcdc5d83SBram Moolenaar
3371352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3372352134bbSBram Moolenaar  var lines =<< trim END
3373352134bbSBram Moolenaar    vim9script
3374352134bbSBram Moolenaar    def Callback(...l: any)
3375352134bbSBram Moolenaar      try
3376352134bbSBram Moolenaar        var x: string
3377352134bbSBram Moolenaar        var y: string
3378352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3379352134bbSBram Moolenaar        [x, y] = ['']
3380352134bbSBram Moolenaar      catch
3381352134bbSBram Moolenaar        g:caught = 'yes'
3382352134bbSBram Moolenaar      endtry
3383352134bbSBram Moolenaar    enddef
3384e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3385352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3386352134bbSBram Moolenaar  END
3387352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3388352134bbSBram Moolenaar
3389352134bbSBram Moolenaar  unlet g:caught
3390352134bbSBram Moolenaarenddef
3391352134bbSBram Moolenaar
3392631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3393631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3394631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3395631e8f93SBram Moolenaar  endif
3396631e8f93SBram Moolenaar  var lines =<< trim END
3397631e8f93SBram Moolenaar      vim9script
3398631e8f93SBram Moolenaar      var source: list<number>
3399631e8f93SBram Moolenaar      def Out_cb(...l: any)
3400631e8f93SBram Moolenaar          eval [][0]
3401631e8f93SBram Moolenaar      enddef
3402631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3403631e8f93SBram Moolenaar          sleep 1m
3404631e8f93SBram Moolenaar          source += l
3405631e8f93SBram Moolenaar      enddef
3406e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
34076f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
34086f17a3f0SBram Moolenaar        sleep 10m
34096f17a3f0SBram Moolenaar      endwhile
3410206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3411206c2a6eSBram Moolenaar      sleep 100m
3412631e8f93SBram Moolenaar  END
3413631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3414631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3415631e8f93SBram Moolenaar  delete('Xdef')
3416631e8f93SBram Moolenaarenddef
3417631e8f93SBram Moolenaar
34184324d87aSBram Moolenaardef InvokeNormal()
34194324d87aSBram Moolenaar  exe "norm! :m+1\r"
34204324d87aSBram Moolenaarenddef
34214324d87aSBram Moolenaar
34224324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
34234324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
34244324d87aSBram Moolenaar  new
34254324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
34264324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
34274324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
34284324d87aSBram Moolenaar  xunmap <F3>
3429b5b9480eSBram Moolenaarenddef
3430b5b9480eSBram Moolenaar
3431b5b9480eSBram Moolenaardef Test_white_space_after_command()
3432b5b9480eSBram Moolenaar  var lines =<< trim END
3433b5b9480eSBram Moolenaar    exit_cb: Func})
3434b5b9480eSBram Moolenaar  END
3435b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3436f8103f27SBram Moolenaar
3437f8103f27SBram Moolenaar  lines =<< trim END
3438f8103f27SBram Moolenaar    e#
3439f8103f27SBram Moolenaar  END
3440f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
34414324d87aSBram Moolenaarenddef
34424324d87aSBram Moolenaar
34434aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
34444aab88d9SBram Moolenaar  var lines =<< trim END
34454aab88d9SBram Moolenaar      vim9script
34464aab88d9SBram Moolenaar      if exists('g:guard')
34474aab88d9SBram Moolenaar        finish
34484aab88d9SBram Moolenaar      endif
34494aab88d9SBram Moolenaar      g:guard = 1
34504aab88d9SBram Moolenaar      var name = 'thename'
34514aab88d9SBram Moolenaar      def g:GetName(): string
34524aab88d9SBram Moolenaar        return name
34534aab88d9SBram Moolenaar      enddef
34544aab88d9SBram Moolenaar      def g:SetName(arg: string)
34554aab88d9SBram Moolenaar        name = arg
34564aab88d9SBram Moolenaar      enddef
34574aab88d9SBram Moolenaar  END
34584aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
34594aab88d9SBram Moolenaar  so XscriptTwice.vim
34604aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
34614aab88d9SBram Moolenaar  g:SetName('newname')
34624aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
34634aab88d9SBram Moolenaar  so XscriptTwice.vim
34644aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
34654aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
34664aab88d9SBram Moolenaar
34674aab88d9SBram Moolenaar  delfunc g:GetName
34684aab88d9SBram Moolenaar  delfunc g:SetName
34694aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
34704aab88d9SBram Moolenaar  unlet g:guard
34714aab88d9SBram Moolenaarenddef
34724aab88d9SBram Moolenaar
34734aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
34744aab88d9SBram Moolenaar  var exportlines =<< trim END
34754aab88d9SBram Moolenaar      vim9script
34764aab88d9SBram Moolenaar      if exists('g:guard')
34774aab88d9SBram Moolenaar        finish
34784aab88d9SBram Moolenaar      endif
34794aab88d9SBram Moolenaar      g:guard = 1
34804aab88d9SBram Moolenaar      export var name = 'someName'
34814aab88d9SBram Moolenaar  END
34824aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
34834aab88d9SBram Moolenaar
34844aab88d9SBram Moolenaar  var lines =<< trim END
34854aab88d9SBram Moolenaar      vim9script
34864aab88d9SBram Moolenaar      import name from './XexportScript.vim'
34874aab88d9SBram Moolenaar      def g:GetName(): string
34884aab88d9SBram Moolenaar        return name
34894aab88d9SBram Moolenaar      enddef
34904aab88d9SBram Moolenaar  END
34914aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
34924aab88d9SBram Moolenaar  so XscriptImport.vim
34934aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
34944aab88d9SBram Moolenaar
34954aab88d9SBram Moolenaar  so XexportScript.vim
34964aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
34974aab88d9SBram Moolenaar
34984aab88d9SBram Moolenaar  delfunc g:GetName
34994aab88d9SBram Moolenaar  delete('XexportScript.vim')
35004aab88d9SBram Moolenaar  delete('XscriptImport.vim')
35014aab88d9SBram Moolenaar  unlet g:guard
35024aab88d9SBram Moolenaarenddef
35034aab88d9SBram Moolenaar
350410b9421fSBram Moolenaardef Test_unsupported_commands()
350510b9421fSBram Moolenaar  var lines =<< trim END
350610b9421fSBram Moolenaar      ka
350710b9421fSBram Moolenaar  END
350810b9421fSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1100:')
350910b9421fSBram Moolenaar
351010b9421fSBram Moolenaar  lines =<< trim END
3511ada1d870SBram Moolenaar      :1ka
3512ada1d870SBram Moolenaar  END
3513ada1d870SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E481:')
3514ada1d870SBram Moolenaar
3515ada1d870SBram Moolenaar  lines =<< trim END
351610b9421fSBram Moolenaar    t
351710b9421fSBram Moolenaar  END
351810b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
351910b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
352010b9421fSBram Moolenaar
352110b9421fSBram Moolenaar  lines =<< trim END
352210b9421fSBram Moolenaar    x
352310b9421fSBram Moolenaar  END
352410b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
352510b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
352610b9421fSBram Moolenaar
352710b9421fSBram Moolenaar  lines =<< trim END
352810b9421fSBram Moolenaar    xit
352910b9421fSBram Moolenaar  END
353010b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
353110b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
353210b9421fSBram Moolenaarenddef
353310b9421fSBram Moolenaar
3534585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3535585fea7bSBram Moolenaardef Test_substitute_cmd()
3536585fea7bSBram Moolenaar  new
3537585fea7bSBram Moolenaar  setline(1, 'something')
3538585fea7bSBram Moolenaar  :substitute(some(other(
3539585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3540585fea7bSBram Moolenaar  bwipe!
3541585fea7bSBram Moolenaar
3542f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3543cfcd011fSBram Moolenaar  var lines =<< trim END
3544585fea7bSBram Moolenaar    vim9script
3545585fea7bSBram Moolenaar    new
3546585fea7bSBram Moolenaar    setline(1, 'something')
3547585fea7bSBram Moolenaar    :substitute(some(other(
3548585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3549585fea7bSBram Moolenaar    bwipe!
3550585fea7bSBram Moolenaar  END
3551585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3552585fea7bSBram Moolenaar  source Xvim9lines
3553585fea7bSBram Moolenaar
3554585fea7bSBram Moolenaar  delete('Xvim9lines')
3555585fea7bSBram Moolenaarenddef
3556585fea7bSBram Moolenaar
35578a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3558