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))
25*b8554304SBram Moolenaar
26*b8554304SBram Moolenaar  # missing command does not print the line
27*b8554304SBram Moolenaar  var lines =<< trim END
28*b8554304SBram Moolenaar    vim9script
29*b8554304SBram Moolenaar    :1|
30*b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
31*b8554304SBram Moolenaar    :|
32*b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
33*b8554304SBram Moolenaar  END
34*b8554304SBram Moolenaar  CheckScriptSuccess(lines)
35*b8554304SBram 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)
5808a7d6542SBram Moolenaarenddef
5818a7d6542SBram Moolenaar
5821430ceebSBram Moolenaardef Test_cnext_works_in_catch()
5831430ceebSBram Moolenaar  var lines =<< trim END
5841430ceebSBram Moolenaar      vim9script
5851430ceebSBram Moolenaar      au BufEnter * eval 0
5861430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
5871430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
5881430ceebSBram Moolenaar      var items = [
5891430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
5901430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
5911430ceebSBram Moolenaar        ]
5921430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
5931430ceebSBram Moolenaar      cwindow
5941430ceebSBram Moolenaar
5951430ceebSBram Moolenaar      def CnextOrCfirst()
5961430ceebSBram Moolenaar        # if cnext fails, cfirst is used
5971430ceebSBram Moolenaar        try
5981430ceebSBram Moolenaar          cnext
5991430ceebSBram Moolenaar        catch
6001430ceebSBram Moolenaar          cfirst
6011430ceebSBram Moolenaar        endtry
6021430ceebSBram Moolenaar      enddef
6031430ceebSBram Moolenaar
6041430ceebSBram Moolenaar      CnextOrCfirst()
6051430ceebSBram Moolenaar      CnextOrCfirst()
6061430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
6071430ceebSBram Moolenaar      qall
6081430ceebSBram Moolenaar  END
6091430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
6101430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
6111430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
6121430ceebSBram Moolenaar
6131430ceebSBram Moolenaar  delete('Xfile1')
6141430ceebSBram Moolenaar  delete('Xfile2')
6151430ceebSBram Moolenaar  delete('XCatchCnext')
6161430ceebSBram Moolenaar  delete('Xresult')
6171430ceebSBram Moolenaarenddef
6181430ceebSBram Moolenaar
6199e1d9e34SBram Moolenaardef Test_throw_skipped()
6209e1d9e34SBram Moolenaar  if 0
6219e1d9e34SBram Moolenaar    throw dontgethere
6229e1d9e34SBram Moolenaar  endif
6239e1d9e34SBram Moolenaarenddef
6249e1d9e34SBram Moolenaar
6258f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
6268f81b22eSBram Moolenaar  var lines =<< trim END
6278f81b22eSBram Moolenaar    vim9script
6288f81b22eSBram Moolenaar    def Func()
6298f81b22eSBram Moolenaar      throw 'error'
6308f81b22eSBram Moolenaar    enddef
6318f81b22eSBram Moolenaar    silent! Func()
6328f81b22eSBram Moolenaar  END
6338f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
6348f81b22eSBram Moolenaar  source XthrowSilenced
6358f81b22eSBram Moolenaar  delete('XthrowSilenced')
6368f81b22eSBram Moolenaarenddef
6378f81b22eSBram Moolenaar
638e859312eSBram Moolenaardef DeletedFunc(): list<any>
639e859312eSBram Moolenaar  return ['delete me']
640e859312eSBram Moolenaarenddef
641e859312eSBram Moolenaardefcompile
642e859312eSBram Moolenaardelfunc DeletedFunc
643e859312eSBram Moolenaar
644257cc5eeSBram Moolenaardef ThrowFromDef()
645a72cfb80SBram Moolenaar  throw "getout" # comment
646257cc5eeSBram Moolenaarenddef
647257cc5eeSBram Moolenaar
648257cc5eeSBram Moolenaarfunc CatchInFunc()
649257cc5eeSBram Moolenaar  try
650257cc5eeSBram Moolenaar    call ThrowFromDef()
651257cc5eeSBram Moolenaar  catch
652257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
653257cc5eeSBram Moolenaar  endtry
654257cc5eeSBram Moolenaarendfunc
655257cc5eeSBram Moolenaar
656257cc5eeSBram Moolenaardef CatchInDef()
657257cc5eeSBram Moolenaar  try
658257cc5eeSBram Moolenaar    ThrowFromDef()
659257cc5eeSBram Moolenaar  catch
660257cc5eeSBram Moolenaar    g:thrown_def = v:exception
661257cc5eeSBram Moolenaar  endtry
662257cc5eeSBram Moolenaarenddef
663257cc5eeSBram Moolenaar
664f575adffSBram Moolenaardef ReturnFinally(): string
665f575adffSBram Moolenaar  try
666f575adffSBram Moolenaar    return 'intry'
667373863edSBram Moolenaar  finall
668f575adffSBram Moolenaar    g:in_finally = 'finally'
669f575adffSBram Moolenaar  endtry
670f575adffSBram Moolenaar  return 'end'
671f575adffSBram Moolenaarenddef
672f575adffSBram Moolenaar
673257cc5eeSBram Moolenaardef Test_try_catch_nested()
674257cc5eeSBram Moolenaar  CatchInFunc()
675257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
676257cc5eeSBram Moolenaar
677257cc5eeSBram Moolenaar  CatchInDef()
678257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
679f575adffSBram Moolenaar
680f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
681f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
682f575adffSBram Moolenaarenddef
683f575adffSBram Moolenaar
6849939f57bSBram Moolenaardef TryOne(): number
6859939f57bSBram Moolenaar  try
6869939f57bSBram Moolenaar    return 0
6879939f57bSBram Moolenaar  catch
6889939f57bSBram Moolenaar  endtry
6899939f57bSBram Moolenaar  return 0
6909939f57bSBram Moolenaarenddef
6919939f57bSBram Moolenaar
6929939f57bSBram Moolenaardef TryTwo(n: number): string
6939939f57bSBram Moolenaar  try
694cfcd011fSBram Moolenaar    var x = {}
6959939f57bSBram Moolenaar  catch
6969939f57bSBram Moolenaar  endtry
6979939f57bSBram Moolenaar  return 'text'
6989939f57bSBram Moolenaarenddef
6999939f57bSBram Moolenaar
7009939f57bSBram Moolenaardef Test_try_catch_twice()
7019939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
7029939f57bSBram Moolenaarenddef
7039939f57bSBram Moolenaar
704f575adffSBram Moolenaardef Test_try_catch_match()
705cfcd011fSBram Moolenaar  var seq = 'a'
706f575adffSBram Moolenaar  try
707f575adffSBram Moolenaar    throw 'something'
708f575adffSBram Moolenaar  catch /nothing/
709f575adffSBram Moolenaar    seq ..= 'x'
710f575adffSBram Moolenaar  catch /some/
711f575adffSBram Moolenaar    seq ..= 'b'
712f575adffSBram Moolenaar  catch /asdf/
713f575adffSBram Moolenaar    seq ..= 'x'
714e8c4abbbSBram Moolenaar  catch ?a\?sdf?
715e8c4abbbSBram Moolenaar    seq ..= 'y'
716f575adffSBram Moolenaar  finally
717f575adffSBram Moolenaar    seq ..= 'c'
718f575adffSBram Moolenaar  endtry
719f575adffSBram Moolenaar  assert_equal('abc', seq)
720257cc5eeSBram Moolenaarenddef
721257cc5eeSBram Moolenaar
722e8c4abbbSBram Moolenaardef Test_try_catch_fails()
723d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
724d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
725d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
726d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
727d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
728d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
729d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
730d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
73113106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
732d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
733585fea7bSBram Moolenaar
734e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
735d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
736e8c4abbbSBram Moolenaarenddef
737e8c4abbbSBram Moolenaar
7387c5b3c03SBram Moolenaardef Try_catch_skipped()
7397c5b3c03SBram Moolenaar  var l = []
7407c5b3c03SBram Moolenaar  try
7417c5b3c03SBram Moolenaar  finally
7427c5b3c03SBram Moolenaar  endtry
7437c5b3c03SBram Moolenaar
7447c5b3c03SBram Moolenaar  if 1
7457c5b3c03SBram Moolenaar  else
7467c5b3c03SBram Moolenaar    try
7477c5b3c03SBram Moolenaar    endtry
7487c5b3c03SBram Moolenaar  endif
7497c5b3c03SBram Moolenaarenddef
7507c5b3c03SBram Moolenaar
7517c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
7527c5b3c03SBram Moolenaardef Test_try_catch_skipped()
7537c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
7547c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
7557c5b3c03SBram Moolenaarenddef
7567c5b3c03SBram Moolenaar
7577c5b3c03SBram Moolenaar
7587c5b3c03SBram Moolenaar
759006ad48bSBram Moolenaardef Test_throw_vimscript()
760f5be8cdbSBram Moolenaar  # only checks line continuation
761cfcd011fSBram Moolenaar  var lines =<< trim END
762006ad48bSBram Moolenaar      vim9script
763006ad48bSBram Moolenaar      try
764006ad48bSBram Moolenaar        throw 'one'
765006ad48bSBram Moolenaar              .. 'two'
766006ad48bSBram Moolenaar      catch
767006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
768006ad48bSBram Moolenaar      endtry
769006ad48bSBram Moolenaar  END
770006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
7711e021e63SBram Moolenaar
7721e021e63SBram Moolenaar  lines =<< trim END
7731e021e63SBram Moolenaar    vim9script
774352134bbSBram Moolenaar    @r = ''
7751e021e63SBram Moolenaar    def Func()
7761e021e63SBram Moolenaar      throw @r
7771e021e63SBram Moolenaar    enddef
7781e021e63SBram Moolenaar    var result = ''
7791e021e63SBram Moolenaar    try
7801e021e63SBram Moolenaar      Func()
7811e021e63SBram Moolenaar    catch /E1129:/
7821e021e63SBram Moolenaar      result = 'caught'
7831e021e63SBram Moolenaar    endtry
7841e021e63SBram Moolenaar    assert_equal('caught', result)
7851e021e63SBram Moolenaar  END
7861e021e63SBram Moolenaar  CheckScriptSuccess(lines)
787006ad48bSBram Moolenaarenddef
788006ad48bSBram Moolenaar
789ed677f55SBram Moolenaardef Test_error_in_nested_function()
79003dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
791cfcd011fSBram Moolenaar  var lines =<< trim END
792ed677f55SBram Moolenaar      vim9script
793ed677f55SBram Moolenaar      def Func()
794ed677f55SBram Moolenaar        Error()
795ed677f55SBram Moolenaar        g:test_var = 1
796ed677f55SBram Moolenaar      enddef
797ed677f55SBram Moolenaar      func Error() abort
798ed677f55SBram Moolenaar        eval [][0]
799ed677f55SBram Moolenaar      endfunc
800ed677f55SBram Moolenaar      Func()
801ed677f55SBram Moolenaar  END
802ed677f55SBram Moolenaar  g:test_var = 0
803ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
804ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
805ed677f55SBram Moolenaarenddef
806ed677f55SBram Moolenaar
80737c83711SBram Moolenaardef Test_cexpr_vimscript()
808f5be8cdbSBram Moolenaar  # only checks line continuation
80937c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
810cfcd011fSBram Moolenaar  var lines =<< trim END
81137c83711SBram Moolenaar      vim9script
81237c83711SBram Moolenaar      cexpr 'File'
81337c83711SBram Moolenaar                .. ' someFile' ..
81437c83711SBram Moolenaar                   ' line 19'
81537c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
81637c83711SBram Moolenaar  END
81737c83711SBram Moolenaar  CheckScriptSuccess(lines)
81837c83711SBram Moolenaar  set errorformat&
81937c83711SBram Moolenaarenddef
82037c83711SBram Moolenaar
821c9edd6b5SBram Moolenaardef Test_statusline_syntax()
822c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
823cfcd011fSBram Moolenaar  var lines =<< trim END
824c9edd6b5SBram Moolenaar      vim9script
825c9edd6b5SBram Moolenaar      func g:Status()
826c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
827c9edd6b5SBram Moolenaar      endfunc
828c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
829c9edd6b5SBram Moolenaar      redrawstatus
830c9edd6b5SBram Moolenaar      set laststatus statusline=
831c9edd6b5SBram Moolenaar  END
832c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
833c9edd6b5SBram Moolenaarenddef
834c9edd6b5SBram Moolenaar
835b209750bSBram Moolenaardef Test_list_vimscript()
836b209750bSBram Moolenaar  # checks line continuation and comments
837cfcd011fSBram Moolenaar  var lines =<< trim END
838b209750bSBram Moolenaar      vim9script
839cfcd011fSBram Moolenaar      var mylist = [
840b209750bSBram Moolenaar            'one',
841b209750bSBram Moolenaar            # comment
842b209750bSBram Moolenaar            'two', # empty line follows
843b209750bSBram Moolenaar
844b209750bSBram Moolenaar            'three',
845b209750bSBram Moolenaar            ]
846b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
847b209750bSBram Moolenaar  END
848b209750bSBram Moolenaar  CheckScriptSuccess(lines)
84966250c93SBram Moolenaar
85066250c93SBram Moolenaar  # check all lines from heredoc are kept
85166250c93SBram Moolenaar  lines =<< trim END
85266250c93SBram Moolenaar      # comment 1
85366250c93SBram Moolenaar      two
85466250c93SBram Moolenaar      # comment 3
85566250c93SBram Moolenaar
85666250c93SBram Moolenaar      five
85766250c93SBram Moolenaar      # comment 6
85866250c93SBram Moolenaar  END
85966250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
8604bce26bbSBram Moolenaar
8614bce26bbSBram Moolenaar  lines =<< trim END
8624bce26bbSBram Moolenaar    [{
8634bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
8644bce26bbSBram Moolenaar  END
8654bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
866b209750bSBram Moolenaarenddef
867b209750bSBram Moolenaar
8682a1381c3SBram Moolenaarif has('channel')
86940ee466cSBram Moolenaar  let someJob = test_null_job()
87040ee466cSBram Moolenaar
87140ee466cSBram Moolenaar  def FuncWithError()
87240ee466cSBram Moolenaar    echomsg g:someJob
87340ee466cSBram Moolenaar  enddef
87440ee466cSBram Moolenaar
87540ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
87640ee466cSBram Moolenaar    try
87740ee466cSBram Moolenaar      call FuncWithError()
87840ee466cSBram Moolenaar    catch
87940ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
88040ee466cSBram Moolenaar    endtry
88140ee466cSBram Moolenaar  endfunc
8822a1381c3SBram Moolenaarendif
88340ee466cSBram Moolenaar
8848a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
8858a7d6542SBram Moolenaar  vim9script
886cfcd011fSBram Moolenaar  var name: string = 'bob'
8878a7d6542SBram Moolenaar  def Concat(arg: string): string
8888a7d6542SBram Moolenaar    return name .. arg
8898a7d6542SBram Moolenaar  enddef
890227a69deSBram Moolenaar  g:result = Concat('bie')
891227a69deSBram Moolenaar  g:localname = name
8928a7d6542SBram Moolenaar
8938a7d6542SBram Moolenaar  export const CONST = 1234
894cfcd011fSBram Moolenaar  export var exported = 9876
895cfcd011fSBram Moolenaar  export var exp_name = 'John'
8968a7d6542SBram Moolenaar  export def Exported(): string
8978a7d6542SBram Moolenaar    return 'Exported'
8988a7d6542SBram Moolenaar  enddef
8998a7d6542SBram MoolenaarEND
9008a7d6542SBram Moolenaar
901b3ca9824SBram Moolenaardef Undo_export_script_lines()
902b3ca9824SBram Moolenaar  unlet g:result
903b3ca9824SBram Moolenaar  unlet g:localname
904b3ca9824SBram Moolenaarenddef
905b3ca9824SBram Moolenaar
9065269bd2aSBram Moolenaardef Test_vim9_import_export()
907cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
9088a7d6542SBram Moolenaar    vim9script
9098a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
9108a7d6542SBram Moolenaar    g:imported = exported
9116e587dcbSBram Moolenaar    exported += 3
9126e587dcbSBram Moolenaar    g:imported_added = exported
9138a7d6542SBram Moolenaar    g:imported_func = Exported()
9146e587dcbSBram Moolenaar
91540f4f7a4SBram Moolenaar    def GetExported(): string
916e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
91740f4f7a4SBram Moolenaar      return local_dict.ref()
91840f4f7a4SBram Moolenaar    enddef
91940f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
92040f4f7a4SBram Moolenaar
9216e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
9226e587dcbSBram Moolenaar    g:imported_name = exp_name
9236e587dcbSBram Moolenaar    exp_name ..= ' Doe'
9246e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
9255381c7a1SBram Moolenaar    g:imported_later = exported
9268a7d6542SBram Moolenaar  END
9278a7d6542SBram Moolenaar
9288a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
9298a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
9308a7d6542SBram Moolenaar
9318a7d6542SBram Moolenaar  source Ximport.vim
9328a7d6542SBram Moolenaar
9338a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
9348a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
9358a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
9366e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
9375381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
9388a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
93940f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
9406e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
9416e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
9428a7d6542SBram Moolenaar  assert_false(exists('g:name'))
9438a7d6542SBram Moolenaar
944b3ca9824SBram Moolenaar  Undo_export_script_lines()
9458a7d6542SBram Moolenaar  unlet g:imported
9466e587dcbSBram Moolenaar  unlet g:imported_added
9475381c7a1SBram Moolenaar  unlet g:imported_later
9488a7d6542SBram Moolenaar  unlet g:imported_func
9496e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
9508a7d6542SBram Moolenaar  delete('Ximport.vim')
951f2d5c240SBram Moolenaar
9521c991144SBram Moolenaar  # similar, with line breaks
953cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
9541c991144SBram Moolenaar    vim9script
9551c991144SBram Moolenaar    import {
9561c991144SBram Moolenaar        exported,
9571c991144SBram Moolenaar        Exported,
9581c991144SBram Moolenaar        }
9591c991144SBram Moolenaar        from
9601c991144SBram Moolenaar        './Xexport.vim'
9611c991144SBram Moolenaar    g:imported = exported
9621c991144SBram Moolenaar    exported += 5
9631c991144SBram Moolenaar    g:imported_added = exported
9641c991144SBram Moolenaar    g:imported_func = Exported()
9651c991144SBram Moolenaar  END
9661c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
9671c991144SBram Moolenaar  source Ximport_lbr.vim
9681c991144SBram Moolenaar
9691c991144SBram Moolenaar  assert_equal(9876, g:imported)
9701c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
9711c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
9721c991144SBram Moolenaar
9731c991144SBram Moolenaar  # exported script not sourced again
9741c991144SBram Moolenaar  assert_false(exists('g:result'))
9751c991144SBram Moolenaar  unlet g:imported
9761c991144SBram Moolenaar  unlet g:imported_added
9771c991144SBram Moolenaar  unlet g:imported_func
9781c991144SBram Moolenaar  delete('Ximport_lbr.vim')
9791c991144SBram Moolenaar
9801c991144SBram Moolenaar  # import inside :def function
981cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
9825381c7a1SBram Moolenaar    vim9script
9835381c7a1SBram Moolenaar    def ImportInDef()
9845381c7a1SBram Moolenaar      import exported from './Xexport.vim'
9855381c7a1SBram Moolenaar      g:imported = exported
9865381c7a1SBram Moolenaar      exported += 7
9875381c7a1SBram Moolenaar      g:imported_added = exported
9885381c7a1SBram Moolenaar    enddef
9895381c7a1SBram Moolenaar    ImportInDef()
9905381c7a1SBram Moolenaar  END
9915381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
9925381c7a1SBram Moolenaar  source Ximport2.vim
993f5be8cdbSBram Moolenaar  # TODO: this should be 9879
9945381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
9955381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
9965381c7a1SBram Moolenaar  unlet g:imported
9975381c7a1SBram Moolenaar  unlet g:imported_added
9985381c7a1SBram Moolenaar  delete('Ximport2.vim')
9995381c7a1SBram Moolenaar
1000cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1001f2d5c240SBram Moolenaar    vim9script
1002f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1003f2d5c240SBram Moolenaar    def UseExport()
1004f2d5c240SBram Moolenaar      g:imported = Export.exported
1005f2d5c240SBram Moolenaar    enddef
1006f2d5c240SBram Moolenaar    UseExport()
1007f2d5c240SBram Moolenaar  END
1008f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1009f2d5c240SBram Moolenaar  source Ximport.vim
10105381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1011f2d5c240SBram Moolenaar
1012cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1013599c89c8SBram Moolenaar    vim9script
1014599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1015599c89c8SBram Moolenaar    def Func()
1016cfcd011fSBram Moolenaar      var dummy = 1
1017cfcd011fSBram Moolenaar      var imported = Export + dummy
1018599c89c8SBram Moolenaar    enddef
1019822ba247SBram Moolenaar    defcompile
1020599c89c8SBram Moolenaar  END
1021599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
102244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1023599c89c8SBram Moolenaar
1024cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1025599c89c8SBram Moolenaar    vim9script
1026599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1027599c89c8SBram Moolenaar    def Func()
1028cfcd011fSBram Moolenaar      var imported = Export . exported
1029599c89c8SBram Moolenaar    enddef
1030822ba247SBram Moolenaar    defcompile
1031599c89c8SBram Moolenaar  END
1032599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
103344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1034599c89c8SBram Moolenaar
1035a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1036a6294955SBram Moolenaar    vim9script
1037a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1038a6294955SBram Moolenaar    var some = 'other'
1039a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1040a6294955SBram Moolenaar    defcompile
1041a6294955SBram Moolenaar  END
1042a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1043a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1044a6294955SBram Moolenaar
1045cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1046599c89c8SBram Moolenaar    vim9script
1047599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1048599c89c8SBram Moolenaar    def Func()
1049cfcd011fSBram Moolenaar      var imported = Export.
1050599c89c8SBram Moolenaar    enddef
1051822ba247SBram Moolenaar    defcompile
1052599c89c8SBram Moolenaar  END
1053599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
105444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1055599c89c8SBram Moolenaar
1056cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
10571c991144SBram Moolenaar    vim9script
10581c991144SBram Moolenaar    import *
10591c991144SBram Moolenaar        as Export
10601c991144SBram Moolenaar        from
10611c991144SBram Moolenaar        './Xexport.vim'
10621c991144SBram Moolenaar    def UseExport()
10631c991144SBram Moolenaar      g:imported = Export.exported
10641c991144SBram Moolenaar    enddef
10651c991144SBram Moolenaar    UseExport()
10661c991144SBram Moolenaar  END
10671c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
10681c991144SBram Moolenaar  source Ximport.vim
10691c991144SBram Moolenaar  assert_equal(9883, g:imported)
10701c991144SBram Moolenaar
1071cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1072f2d5c240SBram Moolenaar    vim9script
1073f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1074f2d5c240SBram Moolenaar  END
1075f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
107644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1077f2d5c240SBram Moolenaar
1078f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1079cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1080fa29c8abSBram Moolenaar    vim9script
1081fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1082fa29c8abSBram Moolenaar  END
1083fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
108444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1085fa29c8abSBram Moolenaar
1086f5be8cdbSBram Moolenaar  # try to import something that is already defined
1087cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
10885269bd2aSBram Moolenaar    vim9script
1089cfcd011fSBram Moolenaar    var exported = 'something'
10905269bd2aSBram Moolenaar    import exported from './Xexport.vim'
10915269bd2aSBram Moolenaar  END
10925269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
109344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
10945269bd2aSBram Moolenaar
1095f5be8cdbSBram Moolenaar  # try to import something that is already defined
10965269bd2aSBram Moolenaar  import_already_defined =<< trim END
10975269bd2aSBram Moolenaar    vim9script
1098cfcd011fSBram Moolenaar    var exported = 'something'
10995269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
11005269bd2aSBram Moolenaar  END
11015269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
110244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
11035269bd2aSBram Moolenaar
1104f5be8cdbSBram Moolenaar  # try to import something that is already defined
11055269bd2aSBram Moolenaar  import_already_defined =<< trim END
11065269bd2aSBram Moolenaar    vim9script
1107cfcd011fSBram Moolenaar    var exported = 'something'
11085269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
11095269bd2aSBram Moolenaar  END
11105269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
111144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
11125269bd2aSBram Moolenaar
1113918a4249SBram Moolenaar  # try changing an imported const
1114918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1115918a4249SBram Moolenaar    vim9script
1116918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1117918a4249SBram Moolenaar    def Assign()
1118918a4249SBram Moolenaar      CONST = 987
1119918a4249SBram Moolenaar    enddef
1120918a4249SBram Moolenaar    defcompile
1121918a4249SBram Moolenaar  END
1122918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1123918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1124918a4249SBram Moolenaar
1125f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1126cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1127fa29c8abSBram Moolenaar    vim9script
1128fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1129fa29c8abSBram Moolenaar  END
1130fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
113144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1132fa29c8abSBram Moolenaar
1133cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1134fa29c8abSBram Moolenaar    vim9script
1135fa29c8abSBram Moolenaar    import name './Xexport.vim'
1136fa29c8abSBram Moolenaar  END
1137fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
113844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1139fa29c8abSBram Moolenaar
1140cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1141fa29c8abSBram Moolenaar    vim9script
1142fa29c8abSBram Moolenaar    import name from Xexport.vim
1143fa29c8abSBram Moolenaar  END
1144fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
114544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1146fa29c8abSBram Moolenaar
1147cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1148fa29c8abSBram Moolenaar    vim9script
1149fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1150fa29c8abSBram Moolenaar  END
1151fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
115244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1153fa29c8abSBram Moolenaar
1154cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1155fa29c8abSBram Moolenaar    vim9script
1156fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1157fa29c8abSBram Moolenaar  END
11585269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
115944d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1160fa29c8abSBram Moolenaar
1161f2d5c240SBram Moolenaar  delete('Ximport.vim')
11625269bd2aSBram Moolenaar  delete('Ximport3.vim')
11638a7d6542SBram Moolenaar  delete('Xexport.vim')
11648a7d6542SBram Moolenaar
1165f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1166750802b5SBram Moolenaar  set cpo&vi
1167cfcd011fSBram Moolenaar  var cpo_before = &cpo
1168cfcd011fSBram Moolenaar  var lines =<< trim END
1169750802b5SBram Moolenaar    vim9script
1170750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1171750802b5SBram Moolenaar  END
1172750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1173750802b5SBram Moolenaar  source Xvim9_script
1174750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1175750802b5SBram Moolenaar  set cpo&vim
1176750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1177750802b5SBram Moolenaar  delete('Xvim9_script')
1178750802b5SBram Moolenaarenddef
1179750802b5SBram Moolenaar
1180803af686SBram Moolenaarfunc g:Trigger()
1181803af686SBram Moolenaar  source Ximport.vim
1182803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1183803af686SBram Moolenaarendfunc
1184803af686SBram Moolenaar
1185803af686SBram Moolenaardef Test_import_export_expr_map()
1186803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1187cfcd011fSBram Moolenaar  var export_lines =<< trim END
1188803af686SBram Moolenaar    vim9script
1189803af686SBram Moolenaar    export def That(): string
1190803af686SBram Moolenaar      return 'yes'
1191803af686SBram Moolenaar    enddef
1192803af686SBram Moolenaar  END
1193803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1194803af686SBram Moolenaar
1195cfcd011fSBram Moolenaar  var import_lines =<< trim END
1196803af686SBram Moolenaar    vim9script
1197803af686SBram Moolenaar    import That from './Xexport_that.vim'
1198803af686SBram Moolenaar    assert_equal('yes', That())
1199803af686SBram Moolenaar  END
1200803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1201803af686SBram Moolenaar
1202803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1203803af686SBram Moolenaar  feedkeys('trigger', "xt")
1204803af686SBram Moolenaar
1205730b2483SBram Moolenaar  delete('Xexport_that.vim')
1206803af686SBram Moolenaar  delete('Ximport.vim')
1207803af686SBram Moolenaar  nunmap trigger
1208803af686SBram Moolenaarenddef
1209803af686SBram Moolenaar
12108e1986e3SBram Moolenaardef Test_import_in_filetype()
12118e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
12128e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1213cfcd011fSBram Moolenaar  var export_lines =<< trim END
12148e1986e3SBram Moolenaar    vim9script
1215cfcd011fSBram Moolenaar    export var That = 'yes'
12168e1986e3SBram Moolenaar  END
1217730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
12188e1986e3SBram Moolenaar
1219cfcd011fSBram Moolenaar  var import_lines =<< trim END
12208e1986e3SBram Moolenaar    vim9script
1221730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
12228e1986e3SBram Moolenaar    assert_equal('yes', That)
12238e1986e3SBram Moolenaar    g:did_load_mytpe = 1
12248e1986e3SBram Moolenaar  END
12258e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
12268e1986e3SBram Moolenaar
1227cfcd011fSBram Moolenaar  var save_rtp = &rtp
12288e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
12298e1986e3SBram Moolenaar
12308e1986e3SBram Moolenaar  filetype plugin on
12318e1986e3SBram Moolenaar  copen
12328e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
12338e1986e3SBram Moolenaar
12348e1986e3SBram Moolenaar  quit!
1235730b2483SBram Moolenaar  delete('Xexport_ft.vim')
12368e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
12378e1986e3SBram Moolenaar  &rtp = save_rtp
12388e1986e3SBram Moolenaarenddef
12398e1986e3SBram Moolenaar
1240efa94447SBram Moolenaardef Test_use_import_in_mapping()
1241cfcd011fSBram Moolenaar  var lines =<< trim END
1242efa94447SBram Moolenaar      vim9script
1243efa94447SBram Moolenaar      export def Funcx()
1244efa94447SBram Moolenaar        g:result = 42
1245efa94447SBram Moolenaar      enddef
1246efa94447SBram Moolenaar  END
1247efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1248efa94447SBram Moolenaar  lines =<< trim END
1249efa94447SBram Moolenaar      vim9script
1250efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1251b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1252efa94447SBram Moolenaar  END
1253efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1254efa94447SBram Moolenaar
1255efa94447SBram Moolenaar  source Xmapscript.vim
1256b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1257efa94447SBram Moolenaar  assert_equal(42, g:result)
1258efa94447SBram Moolenaar
1259efa94447SBram Moolenaar  unlet g:result
1260efa94447SBram Moolenaar  delete('XsomeExport.vim')
1261efa94447SBram Moolenaar  delete('Xmapscript.vim')
1262b3ca9824SBram Moolenaar  nunmap <F3>
1263efa94447SBram Moolenaarenddef
1264efa94447SBram Moolenaar
1265750802b5SBram Moolenaardef Test_vim9script_fails()
12668a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
12678a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1268cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
12699721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1270cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1271750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1272750802b5SBram Moolenaar
1273cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1274c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1275c785b9a7SBram Moolenaar
1276e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1277e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
12788a7d6542SBram Moolenaarenddef
12798a7d6542SBram Moolenaar
1280f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1281101f4810SBram Moolenaar  CheckRunVimInTerminal
1282101f4810SBram Moolenaar
12839bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1284c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
12859bb3eb3eSBram Moolenaarendfunc
12869bb3eb3eSBram Moolenaar
1287c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1288cfcd011fSBram Moolenaar  var export =<< trim END
1289101f4810SBram Moolenaar    vim9script
1290101f4810SBram Moolenaar    export def Foo(): number
1291101f4810SBram Moolenaar        return 0
1292101f4810SBram Moolenaar    enddef
1293101f4810SBram Moolenaar  END
1294730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1295101f4810SBram Moolenaar
1296e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
12979bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
12982949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1299101f4810SBram Moolenaar
1300730b2483SBram Moolenaar  delete('XexportCmd.vim')
13019bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
13029bb3eb3eSBram Moolenaarenddef
1303101f4810SBram Moolenaar
13042b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
13052b32700dSBram Moolenaar  var lines =<< trim END
1306a6294955SBram Moolenaar    vim9script
1307a6294955SBram Moolenaar    export var exported = 'thexport'
1308a6294955SBram Moolenaar  END
1309a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1310a6294955SBram Moolenaar  lines =<< trim END
13112b32700dSBram Moolenaar    vim9script noclear
13122b32700dSBram Moolenaar    g:loadCount += 1
13132b32700dSBram Moolenaar    var s:reloaded = 'init'
1314a6294955SBram Moolenaar    import exported from './XExportReload'
13152b32700dSBram Moolenaar
13162b32700dSBram Moolenaar    def Again(): string
13172b32700dSBram Moolenaar      return 'again'
13182b32700dSBram Moolenaar    enddef
13192b32700dSBram Moolenaar
13202b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
13212b32700dSBram Moolenaar    var s:loaded = true
13222b32700dSBram Moolenaar
13232b32700dSBram Moolenaar    var s:notReloaded = 'yes'
13242b32700dSBram Moolenaar    s:reloaded = 'first'
13252b32700dSBram Moolenaar    def g:Values(): list<string>
1326a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
13272b32700dSBram Moolenaar    enddef
13282b32700dSBram Moolenaar
13292b32700dSBram Moolenaar    def Once(): string
13302b32700dSBram Moolenaar      return 'once'
13312b32700dSBram Moolenaar    enddef
13322b32700dSBram Moolenaar  END
13332b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
13342b32700dSBram Moolenaar  g:loadCount = 0
13352b32700dSBram Moolenaar  source XReloaded
13362b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1337a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
13382b32700dSBram Moolenaar  source XReloaded
13392b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1340a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
13412b32700dSBram Moolenaar  source XReloaded
13422b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1343a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
13442b32700dSBram Moolenaar
134548e11c10SBram Moolenaar  delete('XReloaded')
1346a6294955SBram Moolenaar  delete('XExportReload')
13472b32700dSBram Moolenaar  delfunc g:Values
13482b32700dSBram Moolenaar  unlet g:loadCount
13492b32700dSBram Moolenaarenddef
13502b32700dSBram Moolenaar
13514c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1352cfcd011fSBram Moolenaar  var lines =<< trim END
13538a7d6542SBram Moolenaar    vim9script
13548a7d6542SBram Moolenaar    const var = ''
1355cfcd011fSBram Moolenaar    var valone = 1234
13568a7d6542SBram Moolenaar    def MyFunc(arg: string)
13578a7d6542SBram Moolenaar       valone = 5678
13588a7d6542SBram Moolenaar    enddef
13598a7d6542SBram Moolenaar  END
1360cfcd011fSBram Moolenaar  var morelines =<< trim END
1361cfcd011fSBram Moolenaar    var valtwo = 222
13628a7d6542SBram Moolenaar    export def GetValtwo(): number
13638a7d6542SBram Moolenaar      return valtwo
13648a7d6542SBram Moolenaar    enddef
13658a7d6542SBram Moolenaar  END
136603afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
13678a7d6542SBram Moolenaar  source Xreload.vim
13688a7d6542SBram Moolenaar  source Xreload.vim
13698a7d6542SBram Moolenaar  source Xreload.vim
13708a7d6542SBram Moolenaar
1371cfcd011fSBram Moolenaar  var testlines =<< trim END
13728a7d6542SBram Moolenaar    vim9script
13738a7d6542SBram Moolenaar    def TheFunc()
13748a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
13758a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
13768a7d6542SBram Moolenaar    enddef
13778a7d6542SBram Moolenaar    TheFunc()
13788a7d6542SBram Moolenaar  END
13798a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
13808a7d6542SBram Moolenaar  source Ximport.vim
13818a7d6542SBram Moolenaar
1382f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1383f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
13848a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
13858a7d6542SBram Moolenaar  source Ximport.vim
13868a7d6542SBram Moolenaar
1387f5be8cdbSBram Moolenaar  # cannot declare a var twice
13888a7d6542SBram Moolenaar  lines =<< trim END
13898a7d6542SBram Moolenaar    vim9script
1390cfcd011fSBram Moolenaar    var valone = 1234
1391cfcd011fSBram Moolenaar    var valone = 5678
13928a7d6542SBram Moolenaar  END
13938a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
139444d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
13958a7d6542SBram Moolenaar
13968a7d6542SBram Moolenaar  delete('Xreload.vim')
13978a7d6542SBram Moolenaar  delete('Ximport.vim')
13988a7d6542SBram Moolenaarenddef
13998a7d6542SBram Moolenaar
140007a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
140107a65d26SBram Moolenaar" compiled function using that variable must fail.
140207a65d26SBram Moolenaardef Test_script_reload_change_type()
140307a65d26SBram Moolenaar  var lines =<< trim END
140407a65d26SBram Moolenaar    vim9script noclear
140507a65d26SBram Moolenaar    var str = 'string'
140607a65d26SBram Moolenaar    def g:GetStr(): string
140707a65d26SBram Moolenaar      return str .. 'xxx'
140807a65d26SBram Moolenaar    enddef
140907a65d26SBram Moolenaar  END
141007a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
141107a65d26SBram Moolenaar  source Xreload.vim
141207a65d26SBram Moolenaar  echo g:GetStr()
141307a65d26SBram Moolenaar
141407a65d26SBram Moolenaar  lines =<< trim END
141507a65d26SBram Moolenaar    vim9script noclear
141607a65d26SBram Moolenaar    var str = 1234
141707a65d26SBram Moolenaar  END
141807a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
141907a65d26SBram Moolenaar  source Xreload.vim
142007a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
142107a65d26SBram Moolenaar
142207a65d26SBram Moolenaar  delfunc g:GetStr
142307a65d26SBram Moolenaar  delete('Xreload.vim')
142407a65d26SBram Moolenaarenddef
142507a65d26SBram Moolenaar
142695006e3dSBram Moolenaardef s:RetSome(): string
142795006e3dSBram Moolenaar  return 'some'
142895006e3dSBram Moolenaarenddef
142995006e3dSBram Moolenaar
1430fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1431fe465a01SBram Moolenaar" script-local name.
1432fe465a01SBram Moolenaardef Test_vim9script_funcref()
1433cfcd011fSBram Moolenaar  var sortlines =<< trim END
1434fe465a01SBram Moolenaar      vim9script
1435fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1436bed36b93SBram Moolenaar        return i2 - i1
1437fe465a01SBram Moolenaar      enddef
1438fe465a01SBram Moolenaar
1439fe465a01SBram Moolenaar      export def FastSort(): list<number>
1440fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1441fe465a01SBram Moolenaar      enddef
1442fe465a01SBram Moolenaar  END
1443fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1444fe465a01SBram Moolenaar
1445cfcd011fSBram Moolenaar  var lines =<< trim END
1446fe465a01SBram Moolenaar    vim9script
1447fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1448fe465a01SBram Moolenaar    def Test()
1449fe465a01SBram Moolenaar      g:result = FastSort()
1450fe465a01SBram Moolenaar    enddef
1451fe465a01SBram Moolenaar    Test()
1452fe465a01SBram Moolenaar  END
1453fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1454fe465a01SBram Moolenaar
1455fe465a01SBram Moolenaar  source Xscript.vim
1456fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1457fe465a01SBram Moolenaar
1458fe465a01SBram Moolenaar  unlet g:result
1459fe465a01SBram Moolenaar  delete('Xsort.vim')
1460fe465a01SBram Moolenaar  delete('Xscript.vim')
146195006e3dSBram Moolenaar
1462cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
146395006e3dSBram Moolenaar  assert_equal('some', Funcref())
1464fe465a01SBram Moolenaarenddef
1465fe465a01SBram Moolenaar
1466601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1467601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1468601e76acSBram Moolenaar" function reference.
1469c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1470cfcd011fSBram Moolenaar  var filterLines =<< trim END
1471c620c055SBram Moolenaar    vim9script
1472c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1473c620c055SBram Moolenaar      return idx % 2 == 1
1474c620c055SBram Moolenaar    enddef
1475c620c055SBram Moolenaar    export def FastFilter(): list<number>
1476c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1477c620c055SBram Moolenaar    enddef
1478601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1479601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1480601e76acSBram Moolenaar    enddef
1481c620c055SBram Moolenaar  END
1482c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1483c620c055SBram Moolenaar
1484cfcd011fSBram Moolenaar  var lines =<< trim END
1485c620c055SBram Moolenaar    vim9script
1486601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1487c620c055SBram Moolenaar    def Test()
1488cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1489c620c055SBram Moolenaar    enddef
1490c620c055SBram Moolenaar    Test()
1491601e76acSBram Moolenaar    def TestDirect()
1492cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1493601e76acSBram Moolenaar    enddef
1494601e76acSBram Moolenaar    TestDirect()
1495c620c055SBram Moolenaar  END
1496601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1497c620c055SBram Moolenaar  delete('Xfilter.vim')
1498c620c055SBram Moolenaarenddef
1499c620c055SBram Moolenaar
15004c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1501cfcd011fSBram Moolenaar  var first_lines =<< trim END
15024c17ad94SBram Moolenaar    vim9script
15034c17ad94SBram Moolenaar    def FuncYes(): string
15044c17ad94SBram Moolenaar      return 'yes'
15054c17ad94SBram Moolenaar    enddef
15064c17ad94SBram Moolenaar  END
1507cfcd011fSBram Moolenaar  var withno_lines =<< trim END
15084c17ad94SBram Moolenaar    def FuncNo(): string
15094c17ad94SBram Moolenaar      return 'no'
15104c17ad94SBram Moolenaar    enddef
15114c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
15124c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
15134c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
151403afdcf1SBram Moolenaar    enddef
151503afdcf1SBram Moolenaar  END
1516cfcd011fSBram Moolenaar  var nono_lines =<< trim END
151703afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
151803afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
151944d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
15204c17ad94SBram Moolenaar    enddef
15214c17ad94SBram Moolenaar  END
15224c17ad94SBram Moolenaar
15234c17ad94SBram Moolenaar  # FuncNo() is defined
152403afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
15254c17ad94SBram Moolenaar  source Xreloaded.vim
15264c17ad94SBram Moolenaar  g:DoCheck(true)
15274c17ad94SBram Moolenaar
15284c17ad94SBram Moolenaar  # FuncNo() is not redefined
152903afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
15304c17ad94SBram Moolenaar  source Xreloaded.vim
15315082471fSBram Moolenaar  g:DoCheck(false)
15324c17ad94SBram Moolenaar
15334c17ad94SBram Moolenaar  # FuncNo() is back
153403afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
15354c17ad94SBram Moolenaar  source Xreloaded.vim
15365082471fSBram Moolenaar  g:DoCheck(false)
15374c17ad94SBram Moolenaar
15384c17ad94SBram Moolenaar  delete('Xreloaded.vim')
15394c17ad94SBram Moolenaarenddef
15404c17ad94SBram Moolenaar
154189483d40SBram Moolenaardef Test_vim9script_reload_delvar()
154289483d40SBram Moolenaar  # write the script with a script-local variable
1543cfcd011fSBram Moolenaar  var lines =<< trim END
154489483d40SBram Moolenaar    vim9script
1545cfcd011fSBram Moolenaar    var name = 'string'
154689483d40SBram Moolenaar  END
154789483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
154889483d40SBram Moolenaar  source XreloadVar.vim
154989483d40SBram Moolenaar
155089483d40SBram Moolenaar  # now write the script using the same variable locally - works
155189483d40SBram Moolenaar  lines =<< trim END
155289483d40SBram Moolenaar    vim9script
155389483d40SBram Moolenaar    def Func()
1554cfcd011fSBram Moolenaar      var name = 'string'
155589483d40SBram Moolenaar    enddef
155689483d40SBram Moolenaar  END
155789483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
155889483d40SBram Moolenaar  source XreloadVar.vim
155989483d40SBram Moolenaar
156089483d40SBram Moolenaar  delete('XreloadVar.vim')
156189483d40SBram Moolenaarenddef
156289483d40SBram Moolenaar
15638a7d6542SBram Moolenaardef Test_import_absolute()
1564cfcd011fSBram Moolenaar  var import_lines = [
1565e6085c53SBram Moolenaar        'vim9script',
1566e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1567e6085c53SBram Moolenaar        'def UseExported()',
1568e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1569e6085c53SBram Moolenaar        '  exported = 8888',
1570e6085c53SBram Moolenaar        '  g:imported_after = exported',
1571e6085c53SBram Moolenaar        'enddef',
1572e6085c53SBram Moolenaar        'UseExported()',
1573e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1574e6085c53SBram Moolenaar        ]
15758a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
15768a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
15778a7d6542SBram Moolenaar
15788a7d6542SBram Moolenaar  source Ximport_abs.vim
15798a7d6542SBram Moolenaar
15808a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
15814e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1582fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1583fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1584fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1585fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1586fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1587fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1588fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1589fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1590fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1591fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1592e6085c53SBram Moolenaar        g:import_disassembled)
1593b3ca9824SBram Moolenaar
1594b3ca9824SBram Moolenaar  Undo_export_script_lines()
15958a7d6542SBram Moolenaar  unlet g:imported_abs
15964e12a5dfSBram Moolenaar  unlet g:import_disassembled
15978a7d6542SBram Moolenaar
15988a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
15998a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
16008a7d6542SBram Moolenaarenddef
16018a7d6542SBram Moolenaar
16028a7d6542SBram Moolenaardef Test_import_rtp()
1603cfcd011fSBram Moolenaar  var import_lines = [
1604e6085c53SBram Moolenaar        'vim9script',
1605e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1606e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1607e6085c53SBram Moolenaar        ]
16088a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
16098a7d6542SBram Moolenaar  mkdir('import')
16108a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
16118a7d6542SBram Moolenaar
1612cfcd011fSBram Moolenaar  var save_rtp = &rtp
16138a7d6542SBram Moolenaar  &rtp = getcwd()
16148a7d6542SBram Moolenaar  source Ximport_rtp.vim
16158a7d6542SBram Moolenaar  &rtp = save_rtp
16168a7d6542SBram Moolenaar
16178a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
16188a7d6542SBram Moolenaar
1619b3ca9824SBram Moolenaar  Undo_export_script_lines()
1620b3ca9824SBram Moolenaar  unlet g:imported_rtp
16218a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
162289483d40SBram Moolenaar  delete('import', 'rf')
16238a7d6542SBram Moolenaarenddef
16248a7d6542SBram Moolenaar
162525e0f586SBram Moolenaardef Test_import_compile_error()
1626cfcd011fSBram Moolenaar  var export_lines = [
162725e0f586SBram Moolenaar        'vim9script',
162825e0f586SBram Moolenaar        'export def ExpFunc(): string',
162925e0f586SBram Moolenaar        '  return notDefined',
163025e0f586SBram Moolenaar        'enddef',
163125e0f586SBram Moolenaar        ]
163225e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
163325e0f586SBram Moolenaar
1634cfcd011fSBram Moolenaar  var import_lines = [
163525e0f586SBram Moolenaar        'vim9script',
163625e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
163725e0f586SBram Moolenaar        'def ImpFunc()',
163825e0f586SBram Moolenaar        '  echo ExpFunc()',
163925e0f586SBram Moolenaar        'enddef',
164025e0f586SBram Moolenaar        'defcompile',
164125e0f586SBram Moolenaar        ]
164225e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
164325e0f586SBram Moolenaar
164425e0f586SBram Moolenaar  try
164525e0f586SBram Moolenaar    source Ximport.vim
164625e0f586SBram Moolenaar  catch /E1001/
1647f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
16487707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
164925e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
165025e0f586SBram Moolenaar  endtry
165125e0f586SBram Moolenaar
165225e0f586SBram Moolenaar  delete('Xexported.vim')
165325e0f586SBram Moolenaar  delete('Ximport.vim')
165425e0f586SBram Moolenaarenddef
165525e0f586SBram Moolenaar
1656c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1657cfcd011fSBram Moolenaar  var lines = [
1658c4ce36d4SBram Moolenaar        'vim9script',
1659c4ce36d4SBram Moolenaar        'def Func()',
1660c4ce36d4SBram Moolenaar        '  eval [][0]',
1661c4ce36d4SBram Moolenaar        'enddef',
1662c4ce36d4SBram Moolenaar        'Func()',
1663c4ce36d4SBram Moolenaar        ]
1664c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1665c4ce36d4SBram Moolenaar
1666c4ce36d4SBram Moolenaar  for count in range(3)
1667c4ce36d4SBram Moolenaar    try
1668c4ce36d4SBram Moolenaar      source Xtestscript.vim
1669c4ce36d4SBram Moolenaar    catch /E684/
1670c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1671c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1672c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1673c4ce36d4SBram Moolenaar    endtry
1674c4ce36d4SBram Moolenaar  endfor
1675c4ce36d4SBram Moolenaar
1676c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1677c4ce36d4SBram Moolenaarenddef
1678c4ce36d4SBram Moolenaar
1679eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1680cfcd011fSBram Moolenaar  var export_lines =<< trim END
1681eef2102eSBram Moolenaar      vim9script
1682eef2102eSBram Moolenaar      export def Func()
1683eef2102eSBram Moolenaar        echo 'imported'
1684eef2102eSBram Moolenaar      enddef
1685eef2102eSBram Moolenaar  END
1686eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1687eef2102eSBram Moolenaar
1688cfcd011fSBram Moolenaar  var lines =<< trim END
1689eef2102eSBram Moolenaar    vim9script
1690eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1691eef2102eSBram Moolenaar    def Func()
1692eef2102eSBram Moolenaar      echo 'local to function'
1693eef2102eSBram Moolenaar    enddef
1694eef2102eSBram Moolenaar  END
1695eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1696eef2102eSBram Moolenaar
1697eef2102eSBram Moolenaar  lines =<< trim END
1698eef2102eSBram Moolenaar    vim9script
1699eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1700eef2102eSBram Moolenaar    def Outer()
1701eef2102eSBram Moolenaar      def Func()
1702eef2102eSBram Moolenaar        echo 'local to function'
1703eef2102eSBram Moolenaar      enddef
1704eef2102eSBram Moolenaar    enddef
1705eef2102eSBram Moolenaar    defcompile
1706eef2102eSBram Moolenaar  END
1707eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1708eef2102eSBram Moolenaar
1709eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1710eef2102eSBram Moolenaarenddef
1711eef2102eSBram Moolenaar
1712b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1713cfcd011fSBram Moolenaar  var lines =<< trim END
1714b9a2cac3SBram Moolenaar    vim9script
1715b9a2cac3SBram Moolenaar    def Func()
1716b9a2cac3SBram Moolenaar      echo 'one'
1717b9a2cac3SBram Moolenaar    enddef
1718b9a2cac3SBram Moolenaar    def Func()
1719b9a2cac3SBram Moolenaar      echo 'two'
1720b9a2cac3SBram Moolenaar    enddef
1721b9a2cac3SBram Moolenaar  END
1722b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1723fa211f3cSBram Moolenaar
1724fa211f3cSBram Moolenaar  lines =<< trim END
1725fa211f3cSBram Moolenaar    vim9script
1726fa211f3cSBram Moolenaar    def Foo(): string
1727fa211f3cSBram Moolenaar      return 'foo'
1728fa211f3cSBram Moolenaar      enddef
1729fa211f3cSBram Moolenaar    def Func()
1730cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1731fa211f3cSBram Moolenaar    enddef
1732fa211f3cSBram Moolenaar    defcompile
1733fa211f3cSBram Moolenaar  END
1734fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1735b9a2cac3SBram Moolenaarenddef
1736b9a2cac3SBram Moolenaar
17378a7d6542SBram Moolenaardef Test_fixed_size_list()
1738f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1739cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
17408a7d6542SBram Moolenaar  l->remove(0)
17418a7d6542SBram Moolenaar  l->add(5)
17428a7d6542SBram Moolenaar  l->insert(99, 1)
17430f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
17448a7d6542SBram Moolenaarenddef
17458a7d6542SBram Moolenaar
1746ae616494SBram Moolenaardef Test_no_insert_xit()
1747d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1748d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1749d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1750d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1751d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1752ae616494SBram Moolenaar
1753ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1754ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1755ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1756ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1757f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1758f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1759f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1760f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1761f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1762ae616494SBram Moolenaarenddef
1763ae616494SBram Moolenaar
1764158906cfSBram Moolenaardef IfElse(what: number): string
1765cfcd011fSBram Moolenaar  var res = ''
1766158906cfSBram Moolenaar  if what == 1
1767158906cfSBram Moolenaar    res = "one"
1768158906cfSBram Moolenaar  elseif what == 2
1769158906cfSBram Moolenaar    res = "two"
1770a259d8d3SBram Moolenaar  else
1771158906cfSBram Moolenaar    res = "three"
1772a259d8d3SBram Moolenaar  endif
1773158906cfSBram Moolenaar  return res
1774a259d8d3SBram Moolenaarenddef
1775a259d8d3SBram Moolenaar
1776158906cfSBram Moolenaardef Test_if_elseif_else()
1777158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1778158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1779158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
17800f18b6d1SBram Moolenaarenddef
17810f18b6d1SBram Moolenaar
1782e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1783d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1784d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1785d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1786ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1787d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
17886628b7ebSBram Moolenaar
17896628b7ebSBram Moolenaar  var lines =<< trim END
17906628b7ebSBram Moolenaar      var s = ''
17916628b7ebSBram Moolenaar      if s = ''
17926628b7ebSBram Moolenaar      endif
17936628b7ebSBram Moolenaar  END
17946628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
17956628b7ebSBram Moolenaar
17966628b7ebSBram Moolenaar  lines =<< trim END
17976628b7ebSBram Moolenaar      var s = ''
17986628b7ebSBram Moolenaar      if s == ''
17996628b7ebSBram Moolenaar      elseif s = ''
18006628b7ebSBram Moolenaar      endif
18016628b7ebSBram Moolenaar  END
18026628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
1803e8c4abbbSBram Moolenaarenddef
1804e8c4abbbSBram Moolenaar
18056d69bf60SBram Moolenaarlet g:bool_true = v:true
18066d69bf60SBram Moolenaarlet g:bool_false = v:false
18076d69bf60SBram Moolenaar
18086d69bf60SBram Moolenaardef Test_if_const_expr()
1809cfcd011fSBram Moolenaar  var res = false
18106d69bf60SBram Moolenaar  if true ? true : false
18116d69bf60SBram Moolenaar    res = true
18126d69bf60SBram Moolenaar  endif
18136d69bf60SBram Moolenaar  assert_equal(true, res)
18146d69bf60SBram Moolenaar
1815585fea7bSBram Moolenaar  g:glob = 2
1816585fea7bSBram Moolenaar  if false
18176797966dSBram Moolenaar    execute('g:glob = 3')
1818585fea7bSBram Moolenaar  endif
1819585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1820585fea7bSBram Moolenaar  if true
18216797966dSBram Moolenaar    execute('g:glob = 3')
1822585fea7bSBram Moolenaar  endif
1823585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1824585fea7bSBram Moolenaar
18256d69bf60SBram Moolenaar  res = false
18266d69bf60SBram Moolenaar  if g:bool_true ? true : false
18276d69bf60SBram Moolenaar    res = true
18286d69bf60SBram Moolenaar  endif
18296d69bf60SBram Moolenaar  assert_equal(true, res)
18306d69bf60SBram Moolenaar
18316d69bf60SBram Moolenaar  res = false
18326d69bf60SBram Moolenaar  if true ? g:bool_true : false
18336d69bf60SBram Moolenaar    res = true
18346d69bf60SBram Moolenaar  endif
18356d69bf60SBram Moolenaar  assert_equal(true, res)
18366d69bf60SBram Moolenaar
18376d69bf60SBram Moolenaar  res = false
18386d69bf60SBram Moolenaar  if true ? true : g:bool_false
18396d69bf60SBram Moolenaar    res = true
18406d69bf60SBram Moolenaar  endif
18416d69bf60SBram Moolenaar  assert_equal(true, res)
18426d69bf60SBram Moolenaar
18436d69bf60SBram Moolenaar  res = false
18446d69bf60SBram Moolenaar  if true ? false : true
18456d69bf60SBram Moolenaar    res = true
18466d69bf60SBram Moolenaar  endif
18476d69bf60SBram Moolenaar  assert_equal(false, res)
18486d69bf60SBram Moolenaar
18496d69bf60SBram Moolenaar  res = false
18506d69bf60SBram Moolenaar  if false ? false : true
18516d69bf60SBram Moolenaar    res = true
18526d69bf60SBram Moolenaar  endif
18536d69bf60SBram Moolenaar  assert_equal(true, res)
18546d69bf60SBram Moolenaar
18556d69bf60SBram Moolenaar  res = false
18566d69bf60SBram Moolenaar  if false ? true : false
18576d69bf60SBram Moolenaar    res = true
18586d69bf60SBram Moolenaar  endif
18596d69bf60SBram Moolenaar  assert_equal(false, res)
18606d69bf60SBram Moolenaar
18616d69bf60SBram Moolenaar  res = false
1862e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1863e8c4abbbSBram Moolenaar    res = true
1864e8c4abbbSBram Moolenaar  endif
1865e8c4abbbSBram Moolenaar  assert_equal(false, res)
1866e8c4abbbSBram Moolenaar
1867e8c4abbbSBram Moolenaar  res = false
18686d69bf60SBram Moolenaar  if true && true
18696d69bf60SBram Moolenaar    res = true
18706d69bf60SBram Moolenaar  endif
18716d69bf60SBram Moolenaar  assert_equal(true, res)
18726d69bf60SBram Moolenaar
18736d69bf60SBram Moolenaar  res = false
18746d69bf60SBram Moolenaar  if true && false
18756d69bf60SBram Moolenaar    res = true
18766d69bf60SBram Moolenaar  endif
18776d69bf60SBram Moolenaar  assert_equal(false, res)
18786d69bf60SBram Moolenaar
18796d69bf60SBram Moolenaar  res = false
18806d69bf60SBram Moolenaar  if g:bool_true && false
18816d69bf60SBram Moolenaar    res = true
18826d69bf60SBram Moolenaar  endif
18836d69bf60SBram Moolenaar  assert_equal(false, res)
18846d69bf60SBram Moolenaar
18856d69bf60SBram Moolenaar  res = false
18866d69bf60SBram Moolenaar  if true && g:bool_false
18876d69bf60SBram Moolenaar    res = true
18886d69bf60SBram Moolenaar  endif
18896d69bf60SBram Moolenaar  assert_equal(false, res)
18906d69bf60SBram Moolenaar
18916d69bf60SBram Moolenaar  res = false
18926d69bf60SBram Moolenaar  if false && false
18936d69bf60SBram Moolenaar    res = true
18946d69bf60SBram Moolenaar  endif
18956d69bf60SBram Moolenaar  assert_equal(false, res)
18966d69bf60SBram Moolenaar
18976d69bf60SBram Moolenaar  res = false
18986d69bf60SBram Moolenaar  if true || false
18996d69bf60SBram Moolenaar    res = true
19006d69bf60SBram Moolenaar  endif
19016d69bf60SBram Moolenaar  assert_equal(true, res)
19026d69bf60SBram Moolenaar
19036d69bf60SBram Moolenaar  res = false
19046d69bf60SBram Moolenaar  if g:bool_true || false
19056d69bf60SBram Moolenaar    res = true
19066d69bf60SBram Moolenaar  endif
19076d69bf60SBram Moolenaar  assert_equal(true, res)
19086d69bf60SBram Moolenaar
19096d69bf60SBram Moolenaar  res = false
19106d69bf60SBram Moolenaar  if true || g:bool_false
19116d69bf60SBram Moolenaar    res = true
19126d69bf60SBram Moolenaar  endif
19136d69bf60SBram Moolenaar  assert_equal(true, res)
19146d69bf60SBram Moolenaar
19156d69bf60SBram Moolenaar  res = false
19166d69bf60SBram Moolenaar  if false || false
19176d69bf60SBram Moolenaar    res = true
19186d69bf60SBram Moolenaar  endif
19196d69bf60SBram Moolenaar  assert_equal(false, res)
19203988f64fSBram Moolenaar
19213988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
19223988f64fSBram Moolenaar  if false | eval 0 | endif
19233988f64fSBram Moolenaar  if false | eval burp + 234 | endif
19243988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
19253988f64fSBram Moolenaar  if false
19263988f64fSBram Moolenaar    burp
19273988f64fSBram Moolenaar  endif
192880c34ca3SBram Moolenaarenddef
19296d69bf60SBram Moolenaar
193080c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1931d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1932d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1933d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1934d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
19356d69bf60SBram Moolenaarenddef
19366d69bf60SBram Moolenaar
193772abcf42SBram Moolenaardef RunNested(i: number): number
1938cfcd011fSBram Moolenaar  var x: number = 0
193972abcf42SBram Moolenaar  if i % 2
194072abcf42SBram Moolenaar    if 1
1941f5be8cdbSBram Moolenaar      # comment
194272abcf42SBram Moolenaar    else
1943f5be8cdbSBram Moolenaar      # comment
194472abcf42SBram Moolenaar    endif
194572abcf42SBram Moolenaar    x += 1
194672abcf42SBram Moolenaar  else
194772abcf42SBram Moolenaar    x += 1000
194872abcf42SBram Moolenaar  endif
194972abcf42SBram Moolenaar  return x
195072abcf42SBram Moolenaarenddef
195172abcf42SBram Moolenaar
195272abcf42SBram Moolenaardef Test_nested_if()
195372abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
195472abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
195572abcf42SBram Moolenaarenddef
195672abcf42SBram Moolenaar
1957ad39c094SBram Moolenaardef Test_execute_cmd()
1958e4984290SBram Moolenaar  # missing argument is ignored
1959e4984290SBram Moolenaar  execute
1960e4984290SBram Moolenaar  execute # comment
1961e4984290SBram Moolenaar
1962ad39c094SBram Moolenaar  new
1963ad39c094SBram Moolenaar  setline(1, 'default')
1964d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1965ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1966a72cfb80SBram Moolenaar
1967d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1968a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1969a72cfb80SBram Moolenaar
1970cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
1971cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
1972a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1973ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1974a72cfb80SBram Moolenaar
1975d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
1976ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1977a72cfb80SBram Moolenaar
1978cfcd011fSBram Moolenaar  var cmd_first = 'call '
1979cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
1980ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1981ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1982ad39c094SBram Moolenaar  bwipe!
1983585fea7bSBram Moolenaar
1984cfcd011fSBram Moolenaar  var n = true
19852d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
19862d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
19872d6b20d6SBram Moolenaar
1988e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
1989e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
1990e5abf7afSBram Moolenaar
1991d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
1992d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1993d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
1994ad39c094SBram Moolenaarenddef
1995ad39c094SBram Moolenaar
199647e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1997f5be8cdbSBram Moolenaar  # only checks line continuation
1998cfcd011fSBram Moolenaar  var lines =<< trim END
199947e880d6SBram Moolenaar      vim9script
200047e880d6SBram Moolenaar      execute 'g:someVar'
200147e880d6SBram Moolenaar                .. ' = ' ..
200247e880d6SBram Moolenaar                   '28'
200347e880d6SBram Moolenaar      assert_equal(28, g:someVar)
200447e880d6SBram Moolenaar      unlet g:someVar
200547e880d6SBram Moolenaar  END
200647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
200747e880d6SBram Moolenaarenddef
200847e880d6SBram Moolenaar
2009ad39c094SBram Moolenaardef Test_echo_cmd()
2010a72cfb80SBram Moolenaar  echo 'some' # comment
2011585fea7bSBram Moolenaar  echon 'thing'
2012ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2013ad39c094SBram Moolenaar
2014a72cfb80SBram Moolenaar  echo "some" # comment
2015a72cfb80SBram Moolenaar  echon "thing"
2016a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2017a72cfb80SBram Moolenaar
2018cfcd011fSBram Moolenaar  var str1 = 'some'
2019cfcd011fSBram Moolenaar  var str2 = 'more'
2020ad39c094SBram Moolenaar  echo str1 str2
2021ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2022a72cfb80SBram Moolenaar
2023d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2024ad39c094SBram Moolenaarenddef
2025ad39c094SBram Moolenaar
2026f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2027f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2028f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2029f93c7feaSBram Moolenaar  echo 'clear'
2030df069eecSBram Moolenaar  :1messages
2031f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2032f93c7feaSBram Moolenaar
2033d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2034f93c7feaSBram Moolenaarenddef
2035f93c7feaSBram Moolenaar
203647e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2037f5be8cdbSBram Moolenaar  # only checks line continuation
2038cfcd011fSBram Moolenaar  var lines =<< trim END
203947e880d6SBram Moolenaar      vim9script
204047e880d6SBram Moolenaar      echomsg 'here'
204147e880d6SBram Moolenaar                .. ' is ' ..
204247e880d6SBram Moolenaar                   'a message'
204347e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
204447e880d6SBram Moolenaar  END
204547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
204647e880d6SBram Moolenaarenddef
204747e880d6SBram Moolenaar
2048f93c7feaSBram Moolenaardef Test_echoerr_cmd()
204940ee466cSBram Moolenaar  try
205040ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
205140ee466cSBram Moolenaar  catch
205240ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
205340ee466cSBram Moolenaar  endtry
2054f93c7feaSBram Moolenaarenddef
2055f93c7feaSBram Moolenaar
205647e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2057f5be8cdbSBram Moolenaar  # only checks line continuation
2058cfcd011fSBram Moolenaar  var lines =<< trim END
205947e880d6SBram Moolenaar      vim9script
206047e880d6SBram Moolenaar      try
206147e880d6SBram Moolenaar        echoerr 'this'
206247e880d6SBram Moolenaar                .. ' is ' ..
206347e880d6SBram Moolenaar                   'wrong'
206447e880d6SBram Moolenaar      catch
206547e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
206647e880d6SBram Moolenaar      endtry
206747e880d6SBram Moolenaar  END
206847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
206947e880d6SBram Moolenaarenddef
207047e880d6SBram Moolenaar
207141fe0617SBram Moolenaardef Test_for_outside_of_function()
2072cfcd011fSBram Moolenaar  var lines =<< trim END
207341fe0617SBram Moolenaar    vim9script
207441fe0617SBram Moolenaar    new
207541fe0617SBram Moolenaar    for var in range(0, 3)
207641fe0617SBram Moolenaar      append(line('$'), var)
207741fe0617SBram Moolenaar    endfor
207841fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
207941fe0617SBram Moolenaar    bwipe!
208041fe0617SBram Moolenaar  END
208141fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
208241fe0617SBram Moolenaar  source Xvim9for.vim
208341fe0617SBram Moolenaar  delete('Xvim9for.vim')
208441fe0617SBram Moolenaarenddef
20858a7d6542SBram Moolenaar
2086e8c4abbbSBram Moolenaardef Test_for_loop()
2087cfcd011fSBram Moolenaar  var result = ''
2088e8c4abbbSBram Moolenaar  for cnt in range(7)
2089e8c4abbbSBram Moolenaar    if cnt == 4
2090e8c4abbbSBram Moolenaar      break
2091e8c4abbbSBram Moolenaar    endif
2092e8c4abbbSBram Moolenaar    if cnt == 2
2093e8c4abbbSBram Moolenaar      continue
2094e8c4abbbSBram Moolenaar    endif
2095e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2096e8c4abbbSBram Moolenaar  endfor
2097e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
20980ad3e894SBram Moolenaar
2099cfcd011fSBram Moolenaar  var concat = ''
21000ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
21010ad3e894SBram Moolenaar    concat ..= str
21020ad3e894SBram Moolenaar  endfor
21030ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
210438bd8de5SBram Moolenaar
210538bd8de5SBram Moolenaar  var total = 0
210638bd8de5SBram Moolenaar  for nr in
210738bd8de5SBram Moolenaar      [1, 2, 3]
210838bd8de5SBram Moolenaar    total += nr
210938bd8de5SBram Moolenaar  endfor
211038bd8de5SBram Moolenaar  assert_equal(6, total)
211138bd8de5SBram Moolenaar
211238bd8de5SBram Moolenaar  total = 0
211338bd8de5SBram Moolenaar  for nr
211438bd8de5SBram Moolenaar    in [1, 2, 3]
211538bd8de5SBram Moolenaar    total += nr
211638bd8de5SBram Moolenaar  endfor
211738bd8de5SBram Moolenaar  assert_equal(6, total)
211838bd8de5SBram Moolenaar
211938bd8de5SBram Moolenaar  total = 0
212038bd8de5SBram Moolenaar  for nr
212138bd8de5SBram Moolenaar    in
212238bd8de5SBram Moolenaar    [1, 2, 3]
212338bd8de5SBram Moolenaar    total += nr
212438bd8de5SBram Moolenaar  endfor
212538bd8de5SBram Moolenaar  assert_equal(6, total)
2126036d0714SBram Moolenaar
2127036d0714SBram Moolenaar  var res = ""
2128036d0714SBram Moolenaar  for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2129036d0714SBram Moolenaar    res ..= n .. s
2130036d0714SBram Moolenaar  endfor
2131036d0714SBram Moolenaar  assert_equal('1a2b', res)
2132e8c4abbbSBram Moolenaarenddef
2133e8c4abbbSBram Moolenaar
2134e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2135025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2136025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2137025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2138675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2139675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2140cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2141822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
21422d870f8dSBram Moolenaar  delfunc! g:Func
2143451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2144675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2145675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2146675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2147e8c4abbbSBram Moolenaarenddef
2148e8c4abbbSBram Moolenaar
2149ea87069dSBram Moolenaardef Test_for_loop_script_var()
2150ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2151ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2152ea87069dSBram Moolenaar
2153ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2154ea87069dSBram Moolenaar  var lines =<< trim END
2155ea87069dSBram Moolenaar    vim9script
2156ea87069dSBram Moolenaar    var total = 0
2157ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2158ea87069dSBram Moolenaar      total += s:var
2159ea87069dSBram Moolenaar    endfor
2160ea87069dSBram Moolenaar    assert_equal(6, total)
2161ea87069dSBram Moolenaar
2162ea87069dSBram Moolenaar    total = 0
2163ea87069dSBram Moolenaar    for var in [1, 2, 3]
2164ea87069dSBram Moolenaar      total += var
2165ea87069dSBram Moolenaar    endfor
2166ea87069dSBram Moolenaar    assert_equal(6, total)
2167ea87069dSBram Moolenaar  END
2168ea87069dSBram Moolenaarenddef
2169ea87069dSBram Moolenaar
2170792f786aSBram Moolenaardef Test_for_loop_unpack()
21714b8a0651SBram Moolenaar  var lines =<< trim END
2172792f786aSBram Moolenaar      var result = []
2173792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2174792f786aSBram Moolenaar        result->add(v1)
2175792f786aSBram Moolenaar        result->add(v2)
2176792f786aSBram Moolenaar      endfor
2177792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2178792f786aSBram Moolenaar
2179792f786aSBram Moolenaar      result = []
2180792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2181792f786aSBram Moolenaar        result->add(v1)
2182792f786aSBram Moolenaar        result->add(v2)
2183792f786aSBram Moolenaar        result->add(v3)
2184792f786aSBram Moolenaar      endfor
2185792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2186792f786aSBram Moolenaar
21874b8a0651SBram Moolenaar      result = []
21884b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
21894b8a0651SBram Moolenaar        result->add(&ts)
21904b8a0651SBram Moolenaar        result->add(&sw)
21914b8a0651SBram Moolenaar      endfor
21924b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
21934b8a0651SBram Moolenaar
21944b8a0651SBram Moolenaar      var slist: list<string>
21954b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
21964b8a0651SBram Moolenaar        slist->add($LOOPVAR)
21974b8a0651SBram Moolenaar        slist->add(@r)
21984b8a0651SBram Moolenaar        slist->add(v:errmsg)
21994b8a0651SBram Moolenaar      endfor
22004b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
22014b8a0651SBram Moolenaar
22024b8a0651SBram Moolenaar      slist = []
22034b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
22044b8a0651SBram Moolenaar        slist->add(g:globalvar)
22054b8a0651SBram Moolenaar        slist->add(b:bufvar)
22064b8a0651SBram Moolenaar        slist->add(w:winvar)
22074b8a0651SBram Moolenaar        slist->add(t:tabvar)
22084b8a0651SBram Moolenaar      endfor
22094b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2210f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
22114b8a0651SBram Moolenaar  END
22124b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
22134b8a0651SBram Moolenaar
22144b8a0651SBram Moolenaar  lines =<< trim END
2215792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2216792f786aSBram Moolenaar        echo v1 v2
2217792f786aSBram Moolenaar      endfor
2218792f786aSBram Moolenaar  END
2219792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2220792f786aSBram Moolenaar
2221792f786aSBram Moolenaar  lines =<< trim END
2222792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2223792f786aSBram Moolenaar        echo v1 v2
2224792f786aSBram Moolenaar      endfor
2225792f786aSBram Moolenaar  END
2226792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2227792f786aSBram Moolenaar
2228792f786aSBram Moolenaar  lines =<< trim END
2229792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2230792f786aSBram Moolenaar        echo v1
2231792f786aSBram Moolenaar      endfor
2232792f786aSBram Moolenaar  END
2233792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2234792f786aSBram Moolenaarenddef
2235792f786aSBram Moolenaar
2236c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2237c150c09eSBram Moolenaar  var looped = 0
2238c150c09eSBram Moolenaar  var cleanup = 0
2239c150c09eSBram Moolenaar  for i in range(3)
2240c150c09eSBram Moolenaar    looped += 1
2241c150c09eSBram Moolenaar    try
2242c150c09eSBram Moolenaar      eval [][0]
2243c150c09eSBram Moolenaar    catch
2244c150c09eSBram Moolenaar      continue
2245c150c09eSBram Moolenaar    finally
2246c150c09eSBram Moolenaar      cleanup += 1
2247c150c09eSBram Moolenaar    endtry
2248c150c09eSBram Moolenaar  endfor
2249c150c09eSBram Moolenaar  assert_equal(3, looped)
2250c150c09eSBram Moolenaar  assert_equal(3, cleanup)
2251c150c09eSBram Moolenaarenddef
2252c150c09eSBram Moolenaar
2253d0df1aacSBram Moolenaardef Test_while_loop()
2254cfcd011fSBram Moolenaar  var result = ''
2255cfcd011fSBram Moolenaar  var cnt = 0
2256d0df1aacSBram Moolenaar  while cnt < 555
2257d0df1aacSBram Moolenaar    if cnt == 3
2258d0df1aacSBram Moolenaar      break
2259d0df1aacSBram Moolenaar    endif
2260d0df1aacSBram Moolenaar    cnt += 1
2261d0df1aacSBram Moolenaar    if cnt == 2
2262d0df1aacSBram Moolenaar      continue
2263d0df1aacSBram Moolenaar    endif
2264d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2265d0df1aacSBram Moolenaar  endwhile
2266d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2267dee37dc7SBram Moolenaar
2268dee37dc7SBram Moolenaar  var s = ''
22690123cc1eSBram Moolenaar  while s == 'x' #{comment}
2270dee37dc7SBram Moolenaar  endwhile
2271d0df1aacSBram Moolenaarenddef
2272d0df1aacSBram Moolenaar
2273e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2274675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2275675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2276675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2277675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2278675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2279675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2280675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
22816628b7ebSBram Moolenaar
22826628b7ebSBram Moolenaar  var lines =<< trim END
22836628b7ebSBram Moolenaar      var s = ''
22846628b7ebSBram Moolenaar      while s = ''
22856628b7ebSBram Moolenaar      endwhile
22866628b7ebSBram Moolenaar  END
22876628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2288bd5da371SBram Moolenaarenddef
2289bd5da371SBram Moolenaar
22909645e2d9SBram Moolenaardef Test_interrupt_loop()
2291cfcd011fSBram Moolenaar  var caught = false
2292cfcd011fSBram Moolenaar  var x = 0
229397acfc78SBram Moolenaar  try
22949645e2d9SBram Moolenaar    while 1
22959645e2d9SBram Moolenaar      x += 1
22969645e2d9SBram Moolenaar      if x == 100
22979645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
22989645e2d9SBram Moolenaar      endif
22999645e2d9SBram Moolenaar    endwhile
230097acfc78SBram Moolenaar  catch
230197acfc78SBram Moolenaar    caught = true
230297acfc78SBram Moolenaar    assert_equal(100, x)
230397acfc78SBram Moolenaar  endtry
230497acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
230525859dd7SBram Moolenaar  # consume the CTRL-C
230625859dd7SBram Moolenaar  getchar(0)
23079645e2d9SBram Moolenaarenddef
230820431c9dSBram Moolenaar
23094fdae999SBram Moolenaardef Test_automatic_line_continuation()
2310cfcd011fSBram Moolenaar  var mylist = [
23114fdae999SBram Moolenaar      'one',
23124fdae999SBram Moolenaar      'two',
23134fdae999SBram Moolenaar      'three',
2314f5be8cdbSBram Moolenaar      ] # comment
23154fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
23164fdae999SBram Moolenaar
2317cfcd011fSBram Moolenaar  var mydict = {
2318e0de171eSBram Moolenaar      ['one']: 1,
2319e0de171eSBram Moolenaar      ['two']: 2,
2320e0de171eSBram Moolenaar      ['three']:
23214fdae999SBram Moolenaar          3,
2322f5be8cdbSBram Moolenaar      } # comment
2323e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2324e0de171eSBram Moolenaar  mydict = {
23252c330432SBram Moolenaar      one: 1,  # comment
23262c330432SBram Moolenaar      two:     # comment
23272c330432SBram Moolenaar           2,  # comment
23282c330432SBram Moolenaar      three: 3 # comment
23292c330432SBram Moolenaar      }
2330e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2331e0de171eSBram Moolenaar  mydict = {
23322c330432SBram Moolenaar      one: 1,
23334fdae999SBram Moolenaar      two:
23344fdae999SBram Moolenaar           2,
23352c330432SBram Moolenaar      three: 3
23364fdae999SBram Moolenaar      }
2337e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2338e6085c53SBram Moolenaar
2339e6085c53SBram Moolenaar  assert_equal(
2340e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2341e6085c53SBram Moolenaar        split('one two three')
2342e6085c53SBram Moolenaar        )
23434fdae999SBram Moolenaarenddef
23444fdae999SBram Moolenaar
23457a092245SBram Moolenaardef Test_vim9_comment()
23467a092245SBram Moolenaar  CheckScriptSuccess([
23477a092245SBram Moolenaar      'vim9script',
23487a092245SBram Moolenaar      '# something',
234993f82cbeSBram Moolenaar      '#something',
235093f82cbeSBram Moolenaar      '#{something',
23517a092245SBram Moolenaar      ])
235293f82cbeSBram Moolenaar
235393f82cbeSBram Moolenaar  split Xfile
235493f82cbeSBram Moolenaar  CheckScriptSuccess([
235593f82cbeSBram Moolenaar      'vim9script',
235693f82cbeSBram Moolenaar      'edit #something',
235793f82cbeSBram Moolenaar      ])
235893f82cbeSBram Moolenaar  CheckScriptSuccess([
235993f82cbeSBram Moolenaar      'vim9script',
236093f82cbeSBram Moolenaar      'edit #{something',
236193f82cbeSBram Moolenaar      ])
236293f82cbeSBram Moolenaar  close
236393f82cbeSBram Moolenaar
23647a092245SBram Moolenaar  CheckScriptFailure([
23657a092245SBram Moolenaar      'vim9script',
23667a092245SBram Moolenaar      ':# something',
23677a092245SBram Moolenaar      ], 'E488:')
23687a092245SBram Moolenaar  CheckScriptFailure([
23697a092245SBram Moolenaar      '# something',
23707a092245SBram Moolenaar      ], 'E488:')
23717a092245SBram Moolenaar  CheckScriptFailure([
23727a092245SBram Moolenaar      ':# something',
23737a092245SBram Moolenaar      ], 'E488:')
23747a092245SBram Moolenaar
23754a8d9f2eSBram Moolenaar  { # block start
23764a8d9f2eSBram Moolenaar  } # block end
23774a8d9f2eSBram Moolenaar  CheckDefFailure([
23784a8d9f2eSBram Moolenaar      '{# comment',
23794a8d9f2eSBram Moolenaar      ], 'E488:')
23804a8d9f2eSBram Moolenaar  CheckDefFailure([
23814a8d9f2eSBram Moolenaar      '{',
23824a8d9f2eSBram Moolenaar      '}# comment',
23834a8d9f2eSBram Moolenaar      ], 'E488:')
23844a8d9f2eSBram Moolenaar
23854a8d9f2eSBram Moolenaar  echo "yes" # comment
23864a8d9f2eSBram Moolenaar  CheckDefFailure([
23874a8d9f2eSBram Moolenaar      'echo "yes"# comment',
23884a8d9f2eSBram Moolenaar      ], 'E488:')
23897a092245SBram Moolenaar  CheckScriptSuccess([
23907a092245SBram Moolenaar      'vim9script',
23917a092245SBram Moolenaar      'echo "yes" # something',
23927a092245SBram Moolenaar      ])
23937a092245SBram Moolenaar  CheckScriptFailure([
23947a092245SBram Moolenaar      'vim9script',
23957a092245SBram Moolenaar      'echo "yes"# something',
23967a092245SBram Moolenaar      ], 'E121:')
23977a092245SBram Moolenaar  CheckScriptFailure([
23987a092245SBram Moolenaar      'vim9script',
23997a092245SBram Moolenaar      'echo# something',
2400f8103f27SBram Moolenaar      ], 'E1144:')
24017a092245SBram Moolenaar  CheckScriptFailure([
24027a092245SBram Moolenaar      'echo "yes" # something',
24037a092245SBram Moolenaar      ], 'E121:')
24047a092245SBram Moolenaar
24054a8d9f2eSBram Moolenaar  exe "echo" # comment
24064a8d9f2eSBram Moolenaar  CheckDefFailure([
24074a8d9f2eSBram Moolenaar      'exe "echo"# comment',
24084a8d9f2eSBram Moolenaar      ], 'E488:')
24094a8d9f2eSBram Moolenaar  CheckScriptSuccess([
24104a8d9f2eSBram Moolenaar      'vim9script',
24114a8d9f2eSBram Moolenaar      'exe "echo" # something',
24124a8d9f2eSBram Moolenaar      ])
24134a8d9f2eSBram Moolenaar  CheckScriptFailure([
24144a8d9f2eSBram Moolenaar      'vim9script',
24154a8d9f2eSBram Moolenaar      'exe "echo"# something',
24164a8d9f2eSBram Moolenaar      ], 'E121:')
24174a8d9f2eSBram Moolenaar  CheckScriptFailure([
24184a8d9f2eSBram Moolenaar      'vim9script',
24194a8d9f2eSBram Moolenaar      'exe# something',
2420f8103f27SBram Moolenaar      ], 'E1144:')
24214a8d9f2eSBram Moolenaar  CheckScriptFailure([
24224a8d9f2eSBram Moolenaar      'exe "echo" # something',
24234a8d9f2eSBram Moolenaar      ], 'E121:')
24244a8d9f2eSBram Moolenaar
24257a092245SBram Moolenaar  CheckDefFailure([
24267a092245SBram Moolenaar      'try# comment',
24277a092245SBram Moolenaar      '  echo "yes"',
24287a092245SBram Moolenaar      'catch',
24297a092245SBram Moolenaar      'endtry',
2430f8103f27SBram Moolenaar      ], 'E1144:')
24312c5ed4e3SBram Moolenaar  CheckScriptFailure([
24322c5ed4e3SBram Moolenaar      'vim9script',
24332c5ed4e3SBram Moolenaar      'try# comment',
24342c5ed4e3SBram Moolenaar      'echo "yes"',
2435f8103f27SBram Moolenaar      ], 'E1144:')
24367a092245SBram Moolenaar  CheckDefFailure([
24377a092245SBram Moolenaar      'try',
2438a72cfb80SBram Moolenaar      '  throw#comment',
2439a72cfb80SBram Moolenaar      'catch',
2440a72cfb80SBram Moolenaar      'endtry',
2441f8103f27SBram Moolenaar      ], 'E1144:')
2442a72cfb80SBram Moolenaar  CheckDefFailure([
2443a72cfb80SBram Moolenaar      'try',
2444a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2445a72cfb80SBram Moolenaar      'catch',
2446a72cfb80SBram Moolenaar      'endtry',
2447a72cfb80SBram Moolenaar      ], 'E488:')
2448a72cfb80SBram Moolenaar  CheckDefFailure([
2449a72cfb80SBram Moolenaar      'try',
24507a092245SBram Moolenaar      '  echo "yes"',
24517a092245SBram Moolenaar      'catch# comment',
24527a092245SBram Moolenaar      'endtry',
2453f8103f27SBram Moolenaar      ], 'E1144:')
24542c5ed4e3SBram Moolenaar  CheckScriptFailure([
24552c5ed4e3SBram Moolenaar      'vim9script',
24562c5ed4e3SBram Moolenaar      'try',
24572c5ed4e3SBram Moolenaar      '  echo "yes"',
24582c5ed4e3SBram Moolenaar      'catch# comment',
24592c5ed4e3SBram Moolenaar      'endtry',
2460f8103f27SBram Moolenaar      ], 'E1144:')
24612c5ed4e3SBram Moolenaar  CheckDefFailure([
24622c5ed4e3SBram Moolenaar      'try',
24632c5ed4e3SBram Moolenaar      '  echo "yes"',
24642c5ed4e3SBram Moolenaar      'catch /pat/# comment',
24652c5ed4e3SBram Moolenaar      'endtry',
24662c5ed4e3SBram Moolenaar      ], 'E488:')
24677a092245SBram Moolenaar  CheckDefFailure([
24687a092245SBram Moolenaar      'try',
24697a092245SBram Moolenaar      'echo "yes"',
24707a092245SBram Moolenaar      'catch',
24717a092245SBram Moolenaar      'endtry# comment',
2472f8103f27SBram Moolenaar      ], 'E1144:')
24732c5ed4e3SBram Moolenaar  CheckScriptFailure([
24742c5ed4e3SBram Moolenaar      'vim9script',
24752c5ed4e3SBram Moolenaar      'try',
24762c5ed4e3SBram Moolenaar      '  echo "yes"',
24772c5ed4e3SBram Moolenaar      'catch',
24782c5ed4e3SBram Moolenaar      'endtry# comment',
2479f8103f27SBram Moolenaar      ], 'E1144:')
24802c5ed4e3SBram Moolenaar
24812c5ed4e3SBram Moolenaar  CheckScriptSuccess([
24822c5ed4e3SBram Moolenaar      'vim9script',
24832c5ed4e3SBram Moolenaar      'hi # comment',
24842c5ed4e3SBram Moolenaar      ])
24852c5ed4e3SBram Moolenaar  CheckScriptFailure([
24862c5ed4e3SBram Moolenaar      'vim9script',
24872c5ed4e3SBram Moolenaar      'hi# comment',
2488f8103f27SBram Moolenaar      ], 'E1144:')
24891966c248SBram Moolenaar  CheckScriptSuccess([
24901966c248SBram Moolenaar      'vim9script',
24911966c248SBram Moolenaar      'hi Search # comment',
24921966c248SBram Moolenaar      ])
24931966c248SBram Moolenaar  CheckScriptFailure([
24941966c248SBram Moolenaar      'vim9script',
24951966c248SBram Moolenaar      'hi Search# comment',
24961966c248SBram Moolenaar      ], 'E416:')
24971966c248SBram Moolenaar  CheckScriptSuccess([
24981966c248SBram Moolenaar      'vim9script',
24991966c248SBram Moolenaar      'hi link This Search # comment',
25001966c248SBram Moolenaar      ])
25011966c248SBram Moolenaar  CheckScriptFailure([
25021966c248SBram Moolenaar      'vim9script',
25031966c248SBram Moolenaar      'hi link This That# comment',
25041966c248SBram Moolenaar      ], 'E413:')
25051966c248SBram Moolenaar  CheckScriptSuccess([
25061966c248SBram Moolenaar      'vim9script',
25071966c248SBram Moolenaar      'hi clear This # comment',
25081966c248SBram Moolenaar      'hi clear # comment',
25091966c248SBram Moolenaar      ])
2510f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2511f5be8cdbSBram Moolenaar  # hi clear This# comment',
25121966c248SBram Moolenaar  CheckScriptFailure([
25131966c248SBram Moolenaar      'vim9script',
25141966c248SBram Moolenaar      'hi clear# comment',
25151966c248SBram Moolenaar      ], 'E416:')
25161966c248SBram Moolenaar
25171966c248SBram Moolenaar  CheckScriptSuccess([
25181966c248SBram Moolenaar      'vim9script',
25191966c248SBram Moolenaar      'hi Group term=bold',
25201966c248SBram Moolenaar      'match Group /todo/ # comment',
25211966c248SBram Moolenaar      ])
25221966c248SBram Moolenaar  CheckScriptFailure([
25231966c248SBram Moolenaar      'vim9script',
25241966c248SBram Moolenaar      'hi Group term=bold',
25251966c248SBram Moolenaar      'match Group /todo/# comment',
25261966c248SBram Moolenaar      ], 'E488:')
25271966c248SBram Moolenaar  CheckScriptSuccess([
25281966c248SBram Moolenaar      'vim9script',
25291966c248SBram Moolenaar      'match # comment',
25301966c248SBram Moolenaar      ])
25311966c248SBram Moolenaar  CheckScriptFailure([
25321966c248SBram Moolenaar      'vim9script',
25331966c248SBram Moolenaar      'match# comment',
2534f8103f27SBram Moolenaar      ], 'E1144:')
25351966c248SBram Moolenaar  CheckScriptSuccess([
25361966c248SBram Moolenaar      'vim9script',
25371966c248SBram Moolenaar      'match none # comment',
25381966c248SBram Moolenaar      ])
25391966c248SBram Moolenaar  CheckScriptFailure([
25401966c248SBram Moolenaar      'vim9script',
25411966c248SBram Moolenaar      'match none# comment',
25421966c248SBram Moolenaar      ], 'E475:')
25431966c248SBram Moolenaar
25441966c248SBram Moolenaar  CheckScriptSuccess([
25451966c248SBram Moolenaar      'vim9script',
25461966c248SBram Moolenaar      'menutrans clear # comment',
25471966c248SBram Moolenaar      ])
25481966c248SBram Moolenaar  CheckScriptFailure([
25491966c248SBram Moolenaar      'vim9script',
25501966c248SBram Moolenaar      'menutrans clear# comment text',
25511966c248SBram Moolenaar      ], 'E474:')
25521966c248SBram Moolenaar
25531966c248SBram Moolenaar  CheckScriptSuccess([
25541966c248SBram Moolenaar      'vim9script',
25551966c248SBram Moolenaar      'syntax clear # comment',
25561966c248SBram Moolenaar      ])
25571966c248SBram Moolenaar  CheckScriptFailure([
25581966c248SBram Moolenaar      'vim9script',
25591966c248SBram Moolenaar      'syntax clear# comment text',
25601966c248SBram Moolenaar      ], 'E28:')
25611966c248SBram Moolenaar  CheckScriptSuccess([
25621966c248SBram Moolenaar      'vim9script',
25631966c248SBram Moolenaar      'syntax keyword Word some',
25641966c248SBram Moolenaar      'syntax clear Word # comment',
25651966c248SBram Moolenaar      ])
25661966c248SBram Moolenaar  CheckScriptFailure([
25671966c248SBram Moolenaar      'vim9script',
25681966c248SBram Moolenaar      'syntax keyword Word some',
25691966c248SBram Moolenaar      'syntax clear Word# comment text',
25701966c248SBram Moolenaar      ], 'E28:')
25711966c248SBram Moolenaar
25721966c248SBram Moolenaar  CheckScriptSuccess([
25731966c248SBram Moolenaar      'vim9script',
25741966c248SBram Moolenaar      'syntax list # comment',
25751966c248SBram Moolenaar      ])
25761966c248SBram Moolenaar  CheckScriptFailure([
25771966c248SBram Moolenaar      'vim9script',
25781966c248SBram Moolenaar      'syntax list# comment text',
25791966c248SBram Moolenaar      ], 'E28:')
25801966c248SBram Moolenaar
25811966c248SBram Moolenaar  CheckScriptSuccess([
25821966c248SBram Moolenaar      'vim9script',
25831966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
25841966c248SBram Moolenaar      ])
25851966c248SBram Moolenaar  CheckScriptFailure([
25861966c248SBram Moolenaar      'vim9script',
25871966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
25881966c248SBram Moolenaar      ], 'E475:')
25891966c248SBram Moolenaar
25901966c248SBram Moolenaar  CheckScriptSuccess([
25911966c248SBram Moolenaar      'vim9script',
25921966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
25931966c248SBram Moolenaar      ])
25941966c248SBram Moolenaar  CheckScriptFailure([
25951966c248SBram Moolenaar      'vim9script',
25961966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
25971966c248SBram Moolenaar      ], 'E789:')
25981966c248SBram Moolenaar
25991966c248SBram Moolenaar  CheckScriptSuccess([
26001966c248SBram Moolenaar      'vim9script',
26011966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
26021966c248SBram Moolenaar      ])
26031966c248SBram Moolenaar  CheckScriptFailure([
26041966c248SBram Moolenaar      'vim9script',
26051966c248SBram Moolenaar      'syntax match Word /pat/# comment',
26061966c248SBram Moolenaar      ], 'E402:')
26071966c248SBram Moolenaar
26081966c248SBram Moolenaar  CheckScriptSuccess([
26091966c248SBram Moolenaar      'vim9script',
26101966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
26111966c248SBram Moolenaar      ])
26121966c248SBram Moolenaar  CheckScriptFailure([
26131966c248SBram Moolenaar      'vim9script',
26141966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
26151966c248SBram Moolenaar      ], 'E475:')
26161966c248SBram Moolenaar  CheckScriptFailure([
26171966c248SBram Moolenaar      'vim9script',
26181966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
26191966c248SBram Moolenaar      ], 'E406:')
26201966c248SBram Moolenaar  CheckScriptFailure([
26211966c248SBram Moolenaar      'vim9script',
26221966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
26231966c248SBram Moolenaar      ], 'E475:')
26241966c248SBram Moolenaar
26251966c248SBram Moolenaar  CheckScriptSuccess([
26261966c248SBram Moolenaar      'vim9script',
26271966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
26281966c248SBram Moolenaar      ])
26291966c248SBram Moolenaar  CheckScriptFailure([
26301966c248SBram Moolenaar      'vim9script',
26311966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2632d032f34aSBram Moolenaar      ], 'E402:')
26331966c248SBram Moolenaar
26341966c248SBram Moolenaar  CheckScriptSuccess([
26351966c248SBram Moolenaar      'vim9script',
26361966c248SBram Moolenaar      'syntax sync # comment',
26371966c248SBram Moolenaar      ])
26381966c248SBram Moolenaar  CheckScriptFailure([
26391966c248SBram Moolenaar      'vim9script',
26401966c248SBram Moolenaar      'syntax sync# comment',
26411966c248SBram Moolenaar      ], 'E404:')
26421966c248SBram Moolenaar  CheckScriptSuccess([
26431966c248SBram Moolenaar      'vim9script',
26441966c248SBram Moolenaar      'syntax sync ccomment # comment',
26451966c248SBram Moolenaar      ])
26461966c248SBram Moolenaar  CheckScriptFailure([
26471966c248SBram Moolenaar      'vim9script',
26481966c248SBram Moolenaar      'syntax sync ccomment# comment',
26491966c248SBram Moolenaar      ], 'E404:')
26501966c248SBram Moolenaar
26511966c248SBram Moolenaar  CheckScriptSuccess([
26521966c248SBram Moolenaar      'vim9script',
26531966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
26541966c248SBram Moolenaar      ])
26551966c248SBram Moolenaar  CheckScriptFailure([
26561966c248SBram Moolenaar      'vim9script',
26571966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
26581966c248SBram Moolenaar      ], 'E475:')
2659a72cfb80SBram Moolenaar
2660a72cfb80SBram Moolenaar  CheckScriptSuccess([
2661a72cfb80SBram Moolenaar      'vim9script',
2662a72cfb80SBram Moolenaar      'command Echo echo # comment',
2663a72cfb80SBram Moolenaar      'command Echo # comment',
26642d870f8dSBram Moolenaar      'delcommand Echo',
2665a72cfb80SBram Moolenaar      ])
2666a72cfb80SBram Moolenaar  CheckScriptFailure([
2667a72cfb80SBram Moolenaar      'vim9script',
2668a72cfb80SBram Moolenaar      'command Echo echo# comment',
2669a72cfb80SBram Moolenaar      'Echo',
2670f8103f27SBram Moolenaar      ], 'E1144:')
26712d870f8dSBram Moolenaar  delcommand Echo
267270249ee8SBram Moolenaar
267370249ee8SBram Moolenaar  var curdir = getcwd()
267470249ee8SBram Moolenaar  CheckScriptSuccess([
267570249ee8SBram Moolenaar      'command Echo cd " comment',
267670249ee8SBram Moolenaar      'Echo',
267770249ee8SBram Moolenaar      'delcommand Echo',
267870249ee8SBram Moolenaar      ])
267970249ee8SBram Moolenaar  CheckScriptSuccess([
2680090728adSBram Moolenaar      'vim9script',
268170249ee8SBram Moolenaar      'command Echo cd # comment',
268270249ee8SBram Moolenaar      'Echo',
268370249ee8SBram Moolenaar      'delcommand Echo',
268470249ee8SBram Moolenaar      ])
268570249ee8SBram Moolenaar  CheckScriptFailure([
268670249ee8SBram Moolenaar      'vim9script',
268770249ee8SBram Moolenaar      'command Echo cd " comment',
268870249ee8SBram Moolenaar      'Echo',
268970249ee8SBram Moolenaar      ], 'E344:')
269070249ee8SBram Moolenaar  delcommand Echo
269170249ee8SBram Moolenaar  chdir(curdir)
269270249ee8SBram Moolenaar
2693a72cfb80SBram Moolenaar  CheckScriptFailure([
2694a72cfb80SBram Moolenaar      'vim9script',
2695a72cfb80SBram Moolenaar      'command Echo# comment',
2696a72cfb80SBram Moolenaar      ], 'E182:')
2697a72cfb80SBram Moolenaar  CheckScriptFailure([
2698a72cfb80SBram Moolenaar      'vim9script',
2699a72cfb80SBram Moolenaar      'command Echo echo',
2700a72cfb80SBram Moolenaar      'command Echo# comment',
2701a72cfb80SBram Moolenaar      ], 'E182:')
27022d870f8dSBram Moolenaar  delcommand Echo
2703a72cfb80SBram Moolenaar
2704a72cfb80SBram Moolenaar  CheckScriptSuccess([
2705a72cfb80SBram Moolenaar      'vim9script',
2706a72cfb80SBram Moolenaar      'function # comment',
2707a72cfb80SBram Moolenaar      ])
2708a72cfb80SBram Moolenaar  CheckScriptFailure([
2709a72cfb80SBram Moolenaar      'vim9script',
27109898107fSBram Moolenaar      'function " comment',
27119898107fSBram Moolenaar      ], 'E129:')
27129898107fSBram Moolenaar  CheckScriptFailure([
27139898107fSBram Moolenaar      'vim9script',
2714a72cfb80SBram Moolenaar      'function# comment',
2715f8103f27SBram Moolenaar      ], 'E1144:')
2716a72cfb80SBram Moolenaar  CheckScriptSuccess([
2717a72cfb80SBram Moolenaar      'vim9script',
2718a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2719a72cfb80SBram Moolenaar      ])
2720a72cfb80SBram Moolenaar  CheckScriptFailure([
2721a72cfb80SBram Moolenaar      'vim9script',
2722a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2723a72cfb80SBram Moolenaar      ], 'E488:')
2724a72cfb80SBram Moolenaar
2725a72cfb80SBram Moolenaar  CheckScriptSuccess([
2726a72cfb80SBram Moolenaar      'vim9script',
27274c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2728a72cfb80SBram Moolenaar      'endfunc',
27294c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2730a72cfb80SBram Moolenaar      ])
2731a72cfb80SBram Moolenaar  CheckScriptFailure([
2732a72cfb80SBram Moolenaar      'vim9script',
27334c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2734a72cfb80SBram Moolenaar      'endfunc',
27354c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2736a72cfb80SBram Moolenaar      ], 'E488:')
2737a72cfb80SBram Moolenaar
2738a72cfb80SBram Moolenaar  CheckScriptSuccess([
2739a72cfb80SBram Moolenaar      'vim9script',
2740a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2741a72cfb80SBram Moolenaar      ])
2742a72cfb80SBram Moolenaar  CheckScriptFailure([
2743a72cfb80SBram Moolenaar      'vim9script',
2744a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2745a72cfb80SBram Moolenaar      ], 'E488:')
2746e7e4838fSBram Moolenaar
2747e7e4838fSBram Moolenaar  CheckScriptFailure([
2748e7e4838fSBram Moolenaar      'def Test() " comment',
2749e7e4838fSBram Moolenaar      'enddef',
2750e7e4838fSBram Moolenaar      ], 'E488:')
2751e7e4838fSBram Moolenaar  CheckScriptFailure([
2752e7e4838fSBram Moolenaar      'vim9script',
2753e7e4838fSBram Moolenaar      'def Test() " comment',
2754e7e4838fSBram Moolenaar      'enddef',
2755e7e4838fSBram Moolenaar      ], 'E488:')
2756e7e4838fSBram Moolenaar
2757e7e4838fSBram Moolenaar  CheckScriptSuccess([
2758e7e4838fSBram Moolenaar      'func Test() " comment',
2759e7e4838fSBram Moolenaar      'endfunc',
27602d870f8dSBram Moolenaar      'delfunc Test',
2761e7e4838fSBram Moolenaar      ])
27629898107fSBram Moolenaar  CheckScriptSuccess([
2763e7e4838fSBram Moolenaar      'vim9script',
2764e7e4838fSBram Moolenaar      'func Test() " comment',
2765e7e4838fSBram Moolenaar      'endfunc',
27669898107fSBram Moolenaar      ])
2767e7e4838fSBram Moolenaar
2768e7e4838fSBram Moolenaar  CheckScriptSuccess([
2769e7e4838fSBram Moolenaar      'def Test() # comment',
2770e7e4838fSBram Moolenaar      'enddef',
2771e7e4838fSBram Moolenaar      ])
2772e7e4838fSBram Moolenaar  CheckScriptFailure([
2773e7e4838fSBram Moolenaar      'func Test() # comment',
2774e7e4838fSBram Moolenaar      'endfunc',
2775e7e4838fSBram Moolenaar      ], 'E488:')
27762c5ed4e3SBram Moolenaarenddef
27772c5ed4e3SBram Moolenaar
27782c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
27792c5ed4e3SBram Moolenaar  CheckCanRunGui
27802c5ed4e3SBram Moolenaar
27812c5ed4e3SBram Moolenaar  CheckScriptFailure([
27822c5ed4e3SBram Moolenaar      'vim9script',
27832c5ed4e3SBram Moolenaar      'gui#comment'
2784f8103f27SBram Moolenaar      ], 'E1144:')
27852c5ed4e3SBram Moolenaar  CheckScriptFailure([
27862c5ed4e3SBram Moolenaar      'vim9script',
27872c5ed4e3SBram Moolenaar      'gui -f#comment'
27882c5ed4e3SBram Moolenaar      ], 'E499:')
27897a092245SBram Moolenaarenddef
27907a092245SBram Moolenaar
2791a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
27926797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
27936797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2794a26b9700SBram Moolenaar
2795a26b9700SBram Moolenaar  edit test.vim
2796a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2797a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2798a26b9700SBram Moolenaar
2799a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2800a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2801a26b9700SBram Moolenaar
2802a26b9700SBram Moolenaar  g:entered = 0
2803a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2804a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2805a26b9700SBram Moolenaar
2806a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2807a26b9700SBram Moolenaar
2808a26b9700SBram Moolenaar  au! TabEnter
2809a26b9700SBram Moolenaar  unlet g:entered
2810d72c1bf0SBram Moolenaar
2811d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2812d72c1bf0SBram Moolenaar      'vim9script',
28136797966dSBram Moolenaar      'g:var = 123',
2814e55b1c09SBram Moolenaar      'b:var = 456',
2815e55b1c09SBram Moolenaar      'w:var = 777',
2816e55b1c09SBram Moolenaar      't:var = 888',
2817d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2818d72c1bf0SBram Moolenaar      ])
2819d72c1bf0SBram Moolenaar
2820d72c1bf0SBram Moolenaar  CheckScriptFailure([
2821d72c1bf0SBram Moolenaar      'vim9script',
2822cfcd011fSBram Moolenaar      'let var = 123',
2823cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2824cfcd011fSBram Moolenaar
2825cfcd011fSBram Moolenaar  CheckScriptFailure([
2826cfcd011fSBram Moolenaar      'vim9script',
2827cfcd011fSBram Moolenaar      'var g:var = 123',
2828e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2829e55b1c09SBram Moolenaar
2830e55b1c09SBram Moolenaar  CheckScriptFailure([
2831e55b1c09SBram Moolenaar      'vim9script',
2832cfcd011fSBram Moolenaar      'var b:var = 123',
2833e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2834e55b1c09SBram Moolenaar
2835e55b1c09SBram Moolenaar  CheckScriptFailure([
2836e55b1c09SBram Moolenaar      'vim9script',
2837cfcd011fSBram Moolenaar      'var w:var = 123',
2838e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2839e55b1c09SBram Moolenaar
2840e55b1c09SBram Moolenaar  CheckScriptFailure([
2841e55b1c09SBram Moolenaar      'vim9script',
2842cfcd011fSBram Moolenaar      'var t:var = 123',
2843e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2844e55b1c09SBram Moolenaar
2845e55b1c09SBram Moolenaar  CheckScriptFailure([
2846e55b1c09SBram Moolenaar      'vim9script',
2847cfcd011fSBram Moolenaar      'var v:version = 123',
2848e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2849e55b1c09SBram Moolenaar
2850e55b1c09SBram Moolenaar  CheckScriptFailure([
2851e55b1c09SBram Moolenaar      'vim9script',
2852cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2853e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
28546797966dSBram Moolenaar
28556797966dSBram Moolenaar  CheckScriptFailure([
28566797966dSBram Moolenaar      'vim9script',
28576797966dSBram Moolenaar      'g:var = 123',
285832e35117SBram Moolenaar      'unlet g:var# comment1',
2859d72c1bf0SBram Moolenaar      ], 'E108:')
2860d72c1bf0SBram Moolenaar
2861d72c1bf0SBram Moolenaar  CheckScriptFailure([
2862d72c1bf0SBram Moolenaar      'let g:var = 123',
2863d72c1bf0SBram Moolenaar      'unlet g:var # something',
2864d72c1bf0SBram Moolenaar      ], 'E488:')
2865faac4104SBram Moolenaar
2866faac4104SBram Moolenaar  CheckScriptSuccess([
2867faac4104SBram Moolenaar      'vim9script',
286832e35117SBram Moolenaar      'if 1 # comment2',
2869faac4104SBram Moolenaar      '  echo "yes"',
2870faac4104SBram Moolenaar      'elseif 2 #comment',
2871faac4104SBram Moolenaar      '  echo "no"',
2872faac4104SBram Moolenaar      'endif',
2873faac4104SBram Moolenaar      ])
2874faac4104SBram Moolenaar
2875faac4104SBram Moolenaar  CheckScriptFailure([
2876faac4104SBram Moolenaar      'vim9script',
287732e35117SBram Moolenaar      'if 1# comment3',
2878faac4104SBram Moolenaar      '  echo "yes"',
2879faac4104SBram Moolenaar      'endif',
2880faac4104SBram Moolenaar      ], 'E15:')
2881faac4104SBram Moolenaar
2882faac4104SBram Moolenaar  CheckScriptFailure([
2883faac4104SBram Moolenaar      'vim9script',
288432e35117SBram Moolenaar      'if 0 # comment4',
2885faac4104SBram Moolenaar      '  echo "yes"',
2886faac4104SBram Moolenaar      'elseif 2#comment',
2887faac4104SBram Moolenaar      '  echo "no"',
2888faac4104SBram Moolenaar      'endif',
2889faac4104SBram Moolenaar      ], 'E15:')
2890faac4104SBram Moolenaar
2891faac4104SBram Moolenaar  CheckScriptSuccess([
2892faac4104SBram Moolenaar      'vim9script',
2893cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2894faac4104SBram Moolenaar      ])
2895faac4104SBram Moolenaar
2896faac4104SBram Moolenaar  CheckScriptFailure([
2897faac4104SBram Moolenaar      'vim9script',
2898cfcd011fSBram Moolenaar      'var v = 1# comment6',
289932e35117SBram Moolenaar      ], 'E15:')
2900faac4104SBram Moolenaar
2901faac4104SBram Moolenaar  CheckScriptSuccess([
2902faac4104SBram Moolenaar      'vim9script',
2903faac4104SBram Moolenaar      'new'
2904d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2905df069eecSBram Moolenaar      ':$',
2906faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2907faac4104SBram Moolenaar      'bwipe!',
2908faac4104SBram Moolenaar      ])
2909faac4104SBram Moolenaar
2910f5be8cdbSBram Moolenaar  CheckScriptFailure([
2911f5be8cdbSBram Moolenaar      'vim9script',
2912f5be8cdbSBram Moolenaar      'new'
2913d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2914f5be8cdbSBram Moolenaar      ':$',
2915f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2916f5be8cdbSBram Moolenaar      'bwipe!',
2917f5be8cdbSBram Moolenaar      ], 'E488:')
2918f5be8cdbSBram Moolenaar
2919f5be8cdbSBram Moolenaar  CheckScriptFailure([
2920f5be8cdbSBram Moolenaar      'vim9script',
2921f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2922f5be8cdbSBram Moolenaar      ], 'E477:')
2923a26b9700SBram Moolenaarenddef
2924a26b9700SBram Moolenaar
29257e5bd91dSBram Moolenaardef Test_finish()
2926cfcd011fSBram Moolenaar  var lines =<< trim END
29277e5bd91dSBram Moolenaar    vim9script
29286797966dSBram Moolenaar    g:res = 'one'
29297e5bd91dSBram Moolenaar    if v:false | finish | endif
29306797966dSBram Moolenaar    g:res = 'two'
29317e5bd91dSBram Moolenaar    finish
29326797966dSBram Moolenaar    g:res = 'three'
29337e5bd91dSBram Moolenaar  END
29347e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
29357e5bd91dSBram Moolenaar  source Xfinished
29367e5bd91dSBram Moolenaar  assert_equal('two', g:res)
29377e5bd91dSBram Moolenaar
29387e5bd91dSBram Moolenaar  unlet g:res
29397e5bd91dSBram Moolenaar  delete('Xfinished')
29407e5bd91dSBram Moolenaarenddef
29417e5bd91dSBram Moolenaar
2942a5d0077eSBram Moolenaardef Test_forward_declaration()
2943cfcd011fSBram Moolenaar  var lines =<< trim END
2944a5d0077eSBram Moolenaar    vim9script
2945a5d0077eSBram Moolenaar    def GetValue(): string
2946a5d0077eSBram Moolenaar      return theVal
2947a5d0077eSBram Moolenaar    enddef
2948cfcd011fSBram Moolenaar    var theVal = 'something'
2949822ba247SBram Moolenaar    g:initVal = GetValue()
2950a5d0077eSBram Moolenaar    theVal = 'else'
2951a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2952a5d0077eSBram Moolenaar  END
2953a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2954a5d0077eSBram Moolenaar  source Xforward
2955a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2956a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2957a5d0077eSBram Moolenaar
2958a5d0077eSBram Moolenaar  unlet g:initVal
2959a5d0077eSBram Moolenaar  unlet g:laterVal
2960a5d0077eSBram Moolenaar  delete('Xforward')
2961a5d0077eSBram Moolenaarenddef
2962a5d0077eSBram Moolenaar
29639721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
2964a6294955SBram Moolenaar  var vim9_lines =<< trim END
2965a6294955SBram Moolenaar    vim9script
2966a6294955SBram Moolenaar    var local = 'local'
2967a6294955SBram Moolenaar    g:global = 'global'
2968a6294955SBram Moolenaar    export var exported = 'exported'
2969a6294955SBram Moolenaar    export def GetText(): string
2970a6294955SBram Moolenaar       return 'text'
2971a6294955SBram Moolenaar    enddef
2972a6294955SBram Moolenaar  END
2973a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
2974a6294955SBram Moolenaar
2975cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
29769721fb4eSBram Moolenaar    source Xvim9_script.vim
29779721fb4eSBram Moolenaar
29789721fb4eSBram Moolenaar    call assert_false(exists('local'))
29799721fb4eSBram Moolenaar    call assert_false(exists('exported'))
29809721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
29819721fb4eSBram Moolenaar    call assert_equal('global', global)
29829721fb4eSBram Moolenaar    call assert_equal('global', g:global)
29839721fb4eSBram Moolenaar
29849721fb4eSBram Moolenaar    " imported variable becomes script-local
29859721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
29869721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
29879721fb4eSBram Moolenaar    call assert_false(exists('exported'))
29889721fb4eSBram Moolenaar
29899721fb4eSBram Moolenaar    " imported function becomes script-local
29909721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
29919721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
29929721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
29939721fb4eSBram Moolenaar  END
29949721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
29959721fb4eSBram Moolenaar
29969721fb4eSBram Moolenaar  source Xlegacy_script.vim
29979721fb4eSBram Moolenaar  assert_equal('global', g:global)
2998f5be8cdbSBram Moolenaar  unlet g:global
29999721fb4eSBram Moolenaar
30009721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
30019721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
30029721fb4eSBram Moolenaarenddef
3003a5d0077eSBram Moolenaar
30047d699701SBram Moolenaarfunc Test_vim9script_not_global()
30057d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
30067d699701SBram Moolenaar  let vim9lines =<< trim END
30077d699701SBram Moolenaar    vim9script
3008cfcd011fSBram Moolenaar    var name = 'local'
30097d699701SBram Moolenaar    func TheFunc()
30107d699701SBram Moolenaar      echo 'local'
30117d699701SBram Moolenaar    endfunc
30127d699701SBram Moolenaar    def DefFunc()
30137d699701SBram Moolenaar      echo 'local'
30147d699701SBram Moolenaar    enddef
30157d699701SBram Moolenaar  END
30167d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
30177d699701SBram Moolenaar  source Xvim9script.vim
30187d699701SBram Moolenaar  try
30197d699701SBram Moolenaar    echo g:var
30207d699701SBram Moolenaar    assert_report('did not fail')
30217d699701SBram Moolenaar  catch /E121:/
30227d699701SBram Moolenaar    " caught
30237d699701SBram Moolenaar  endtry
30247d699701SBram Moolenaar  try
30257d699701SBram Moolenaar    call TheFunc()
30267d699701SBram Moolenaar    assert_report('did not fail')
30277d699701SBram Moolenaar  catch /E117:/
30287d699701SBram Moolenaar    " caught
30297d699701SBram Moolenaar  endtry
30307d699701SBram Moolenaar  try
30317d699701SBram Moolenaar    call DefFunc()
30327d699701SBram Moolenaar    assert_report('did not fail')
30337d699701SBram Moolenaar  catch /E117:/
30347d699701SBram Moolenaar    " caught
30357d699701SBram Moolenaar  endtry
30367d699701SBram Moolenaar
303725859dd7SBram Moolenaar  call delete('Xvim9script.vim')
30387d699701SBram Moolenaarendfunc
30397d699701SBram Moolenaar
3040eeb27bfeSBram Moolenaardef Test_vim9_copen()
3041eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3042eeb27bfeSBram Moolenaar  copen
3043eeb27bfeSBram Moolenaar  quit
3044eeb27bfeSBram Moolenaarenddef
3045eeb27bfeSBram Moolenaar
304603290b84SBram Moolenaar" test using an auto-loaded function and variable
30472d6b20d6SBram Moolenaardef Test_vim9_autoload()
3048cfcd011fSBram Moolenaar  var lines =<< trim END
30492d6b20d6SBram Moolenaar     vim9script
305003290b84SBram Moolenaar     def some#gettest(): string
305103290b84SBram Moolenaar       return 'test'
305203290b84SBram Moolenaar     enddef
305303290b84SBram Moolenaar     g:some#name = 'name'
305403290b84SBram Moolenaar  END
305503290b84SBram Moolenaar
305603290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
305703290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
305803290b84SBram Moolenaar  var save_rtp = &rtp
305903290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
306003290b84SBram Moolenaar
306103290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
306203290b84SBram Moolenaar  assert_equal('name', g:some#name)
306303290b84SBram Moolenaar  g:some#other = 'other'
306403290b84SBram Moolenaar  assert_equal('other', g:some#other)
306503290b84SBram Moolenaar
306617f700acSBram Moolenaar  # upper case script name works
306717f700acSBram Moolenaar  lines =<< trim END
306817f700acSBram Moolenaar     vim9script
306917f700acSBram Moolenaar     def Other#getOther(): string
307017f700acSBram Moolenaar       return 'other'
307117f700acSBram Moolenaar     enddef
307217f700acSBram Moolenaar  END
307317f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
307417f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
307517f700acSBram Moolenaar
307603290b84SBram Moolenaar  delete('Xdir', 'rf')
307703290b84SBram Moolenaar  &rtp = save_rtp
307803290b84SBram Moolenaarenddef
307903290b84SBram Moolenaar
308003290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
308103290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
308203290b84SBram Moolenaar  var lines =<< trim END
308303290b84SBram Moolenaar     vim9script
30842d6b20d6SBram Moolenaar     def foo#test()
30852d6b20d6SBram Moolenaar         echomsg getreg('"')
30862d6b20d6SBram Moolenaar     enddef
30872d6b20d6SBram Moolenaar  END
30882d6b20d6SBram Moolenaar
30892d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
30902d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3091cfcd011fSBram Moolenaar  var save_rtp = &rtp
30922d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
30932d6b20d6SBram Moolenaar  augroup test
30942d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
30952d6b20d6SBram Moolenaar  augroup END
30962d6b20d6SBram Moolenaar
30972d6b20d6SBram Moolenaar  normal Y
30982d6b20d6SBram Moolenaar
30992d6b20d6SBram Moolenaar  augroup test
31002d6b20d6SBram Moolenaar    autocmd!
31012d6b20d6SBram Moolenaar  augroup END
31022d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
31032d6b20d6SBram Moolenaar  &rtp = save_rtp
31042d6b20d6SBram Moolenaarenddef
31052d6b20d6SBram Moolenaar
310677e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
310777e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3108cfcd011fSBram Moolenaar  var lines =<< trim END
310977e5dcc3SBram Moolenaar      vim9script
311077e5dcc3SBram Moolenaar      def crash#func()
311177e5dcc3SBram Moolenaar          try
311277e5dcc3SBram Moolenaar              for x in List()
311377e5dcc3SBram Moolenaar              endfor
311477e5dcc3SBram Moolenaar          catch
311577e5dcc3SBram Moolenaar          endtry
311677e5dcc3SBram Moolenaar          g:ok = true
311777e5dcc3SBram Moolenaar      enddef
311877e5dcc3SBram Moolenaar      fu List()
311977e5dcc3SBram Moolenaar          invalid
312077e5dcc3SBram Moolenaar      endfu
312177e5dcc3SBram Moolenaar      try
312248e11c10SBram Moolenaar          alsoinvalid
312377e5dcc3SBram Moolenaar      catch /wontmatch/
312477e5dcc3SBram Moolenaar      endtry
312577e5dcc3SBram Moolenaar  END
312677e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
312777e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
312877e5dcc3SBram Moolenaar
312977e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
313077e5dcc3SBram Moolenaar  lines =<< trim END
313177e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
313277e5dcc3SBram Moolenaar    call crash#func()
313377e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
31349c4f5520SBram Moolenaar    qall!
313577e5dcc3SBram Moolenaar  END
313677e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
313777e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
313877e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
313977e5dcc3SBram Moolenaar
314077e5dcc3SBram Moolenaar  delete('Xdidit')
314177e5dcc3SBram Moolenaar  delete('Xscript')
314277e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
314303290b84SBram Moolenaar
314403290b84SBram Moolenaar  lines =<< trim END
314503290b84SBram Moolenaar    vim9script
314603290b84SBram Moolenaar    var foo#bar = 'asdf'
314703290b84SBram Moolenaar  END
314803290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
314977e5dcc3SBram Moolenaarenddef
315077e5dcc3SBram Moolenaar
315181e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
315281e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
315381e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3154cfcd011fSBram Moolenaar  var lines =<< trim END
315581e17fbeSBram Moolenaar    let s:counter = 1
315681e17fbeSBram Moolenaar    def s:Func()
315781e17fbeSBram Moolenaar      au! CursorHold
315881e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
315981e17fbeSBram Moolenaar    enddef
316081e17fbeSBram Moolenaar    call s:Func()
316181e17fbeSBram Moolenaar    doau CursorHold
316281e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
316381e17fbeSBram Moolenaar    au! CursorHold
316481e17fbeSBram Moolenaar  END
316581e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
316681e17fbeSBram Moolenaarenddef
316781e17fbeSBram Moolenaar
31683896a105SBram Moolenaardef Test_cmdline_win()
31693896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
31703896a105SBram Moolenaar  # the command line window.
31713896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3172cfcd011fSBram Moolenaar  var export_lines =<< trim END
31733896a105SBram Moolenaar    vim9script
3174cfcd011fSBram Moolenaar    export var That = 'yes'
31753896a105SBram Moolenaar  END
31763896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3177cfcd011fSBram Moolenaar  var import_lines =<< trim END
31783896a105SBram Moolenaar    vim9script
31793896a105SBram Moolenaar    import That from './Xexport.vim'
31803896a105SBram Moolenaar  END
31813896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3182cfcd011fSBram Moolenaar  var save_rtp = &rtp
31833896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
31843896a105SBram Moolenaar  syntax on
31853896a105SBram Moolenaar  augroup CmdWin
31863896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
31873896a105SBram Moolenaar  augroup END
31883896a105SBram Moolenaar  # this will open and also close the cmdline window
31893896a105SBram Moolenaar  feedkeys('q:', 'xt')
31903896a105SBram Moolenaar  assert_equal('yes', g:got_there)
31913896a105SBram Moolenaar
31923896a105SBram Moolenaar  augroup CmdWin
31933896a105SBram Moolenaar    au!
31943896a105SBram Moolenaar  augroup END
31953896a105SBram Moolenaar  &rtp = save_rtp
31963896a105SBram Moolenaar  delete('rtp', 'rf')
31973896a105SBram Moolenaarenddef
31983896a105SBram Moolenaar
3199e3d4685fSBram Moolenaardef Test_invalid_sid()
3200e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
320125859dd7SBram Moolenaar
32029c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3203d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3204e3d4685fSBram Moolenaar  endif
3205e3d4685fSBram Moolenaar  delete('Xdidit')
3206e3d4685fSBram Moolenaarenddef
3207e3d4685fSBram Moolenaar
32089ec7026fSBram Moolenaardef Test_restoring_cpo()
32099ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
32109ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
32119ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
32129ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
32139ec7026fSBram Moolenaar  endif
32149ec7026fSBram Moolenaar  delete('Xsourced')
32159ec7026fSBram Moolenaar  delete('Xclose')
3216090728adSBram Moolenaar  delete('Xdone')
32170123cc1eSBram Moolenaar
32180123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
32190123cc1eSBram Moolenaar  set cpo=aABceFsMny>
32200123cc1eSBram Moolenaar  edit XanotherScript
32210123cc1eSBram Moolenaar  so %
32220123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
32230123cc1eSBram Moolenaar  :1del
32240123cc1eSBram Moolenaar  w
32250123cc1eSBram Moolenaar  so %
32260123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
32270123cc1eSBram Moolenaar
32280123cc1eSBram Moolenaar  delete('XanotherScript')
32290123cc1eSBram Moolenaar  set cpo&vim
32309ec7026fSBram Moolenaarenddef
32319ec7026fSBram Moolenaar
32329ec7026fSBram Moolenaar
3233f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3234cfcd011fSBram Moolenaar  var lines =<< trim END
3235cfcd011fSBram Moolenaar    var name: any
3236cfcd011fSBram Moolenaar    assert_equal(0, name)
3237f0afd9e1SBram Moolenaar  END
3238f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3239f0afd9e1SBram Moolenaarenddef
3240f0afd9e1SBram Moolenaar
32417e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
324258dbef33SBram Moolenaar  CheckRunVimInTerminal
324358dbef33SBram Moolenaar
32447e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
32457e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
32467e9210eaSBram Moolenaarendfunc
32477e9210eaSBram Moolenaar
32487e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
32499c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3250cfcd011fSBram Moolenaar  var lines =<< trim END
32519c4f5520SBram Moolenaar    func CheckAndQuit()
32529c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
32539c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
32549c4f5520SBram Moolenaar    endfunc
32559c4f5520SBram Moolenaar  END
32569c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
32579c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3258e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
32599c4f5520SBram Moolenaar  # define Afunc() on the command line
32609c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
32619c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
32622949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
32639c4f5520SBram Moolenaar
32649c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
32659c4f5520SBram Moolenaar  delete('XcallFunc')
32669c4f5520SBram Moolenaar  delete('Xdidcmd')
32679c4f5520SBram Moolenaarenddef
32689c4f5520SBram Moolenaar
3269fcdc5d83SBram Moolenaardef Test_script_var_scope()
3270fcdc5d83SBram Moolenaar  var lines =<< trim END
3271fcdc5d83SBram Moolenaar      vim9script
3272fcdc5d83SBram Moolenaar      if true
3273fcdc5d83SBram Moolenaar        if true
3274fcdc5d83SBram Moolenaar          var one = 'one'
3275fcdc5d83SBram Moolenaar          echo one
3276fcdc5d83SBram Moolenaar        endif
3277fcdc5d83SBram Moolenaar        echo one
3278fcdc5d83SBram Moolenaar      endif
3279fcdc5d83SBram Moolenaar  END
3280fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3281fcdc5d83SBram Moolenaar
3282fcdc5d83SBram Moolenaar  lines =<< trim END
3283fcdc5d83SBram Moolenaar      vim9script
3284fcdc5d83SBram Moolenaar      if true
3285fcdc5d83SBram Moolenaar        if false
3286fcdc5d83SBram Moolenaar          var one = 'one'
3287fcdc5d83SBram Moolenaar          echo one
3288fcdc5d83SBram Moolenaar        else
3289fcdc5d83SBram Moolenaar          var one = 'one'
3290fcdc5d83SBram Moolenaar          echo one
3291fcdc5d83SBram Moolenaar        endif
3292fcdc5d83SBram Moolenaar        echo one
3293fcdc5d83SBram Moolenaar      endif
3294fcdc5d83SBram Moolenaar  END
3295fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3296fcdc5d83SBram Moolenaar
3297fcdc5d83SBram Moolenaar  lines =<< trim END
3298fcdc5d83SBram Moolenaar      vim9script
3299fcdc5d83SBram Moolenaar      while true
3300fcdc5d83SBram Moolenaar        var one = 'one'
3301fcdc5d83SBram Moolenaar        echo one
3302fcdc5d83SBram Moolenaar        break
3303fcdc5d83SBram Moolenaar      endwhile
3304fcdc5d83SBram Moolenaar      echo one
3305fcdc5d83SBram Moolenaar  END
3306fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3307fcdc5d83SBram Moolenaar
3308fcdc5d83SBram Moolenaar  lines =<< trim END
3309fcdc5d83SBram Moolenaar      vim9script
3310fcdc5d83SBram Moolenaar      for i in range(1)
3311fcdc5d83SBram Moolenaar        var one = 'one'
3312fcdc5d83SBram Moolenaar        echo one
3313fcdc5d83SBram Moolenaar      endfor
3314fcdc5d83SBram Moolenaar      echo one
3315fcdc5d83SBram Moolenaar  END
3316fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
33179becdf2bSBram Moolenaar
33189becdf2bSBram Moolenaar  lines =<< trim END
33199becdf2bSBram Moolenaar      vim9script
33209becdf2bSBram Moolenaar      {
33219becdf2bSBram Moolenaar        var one = 'one'
33229becdf2bSBram Moolenaar        assert_equal('one', one)
33239becdf2bSBram Moolenaar      }
33249becdf2bSBram Moolenaar      assert_false(exists('one'))
33259becdf2bSBram Moolenaar      assert_false(exists('s:one'))
33269becdf2bSBram Moolenaar  END
33279becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
33289becdf2bSBram Moolenaar
33299becdf2bSBram Moolenaar  lines =<< trim END
33309becdf2bSBram Moolenaar      vim9script
33319becdf2bSBram Moolenaar      {
33329becdf2bSBram Moolenaar        var one = 'one'
33339becdf2bSBram Moolenaar        echo one
33349becdf2bSBram Moolenaar      }
33359becdf2bSBram Moolenaar      echo one
33369becdf2bSBram Moolenaar  END
33379becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3338fcdc5d83SBram Moolenaarenddef
3339fcdc5d83SBram Moolenaar
3340352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3341352134bbSBram Moolenaar  var lines =<< trim END
3342352134bbSBram Moolenaar    vim9script
3343352134bbSBram Moolenaar    def Callback(...l: any)
3344352134bbSBram Moolenaar      try
3345352134bbSBram Moolenaar        var x: string
3346352134bbSBram Moolenaar        var y: string
3347352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3348352134bbSBram Moolenaar        [x, y] = ['']
3349352134bbSBram Moolenaar      catch
3350352134bbSBram Moolenaar        g:caught = 'yes'
3351352134bbSBram Moolenaar      endtry
3352352134bbSBram Moolenaar    enddef
3353e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3354352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3355352134bbSBram Moolenaar  END
3356352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3357352134bbSBram Moolenaar
3358352134bbSBram Moolenaar  unlet g:caught
3359352134bbSBram Moolenaarenddef
3360352134bbSBram Moolenaar
3361631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3362631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3363631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3364631e8f93SBram Moolenaar  endif
3365631e8f93SBram Moolenaar  var lines =<< trim END
3366631e8f93SBram Moolenaar      vim9script
3367631e8f93SBram Moolenaar      var source: list<number>
3368631e8f93SBram Moolenaar      def Out_cb(...l: any)
3369631e8f93SBram Moolenaar          eval [][0]
3370631e8f93SBram Moolenaar      enddef
3371631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3372631e8f93SBram Moolenaar          sleep 1m
3373631e8f93SBram Moolenaar          source += l
3374631e8f93SBram Moolenaar      enddef
3375e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
33766f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
33776f17a3f0SBram Moolenaar        sleep 10m
33786f17a3f0SBram Moolenaar      endwhile
3379206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3380206c2a6eSBram Moolenaar      sleep 100m
3381631e8f93SBram Moolenaar  END
3382631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3383631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3384631e8f93SBram Moolenaar  delete('Xdef')
3385631e8f93SBram Moolenaarenddef
3386631e8f93SBram Moolenaar
33874324d87aSBram Moolenaardef InvokeNormal()
33884324d87aSBram Moolenaar  exe "norm! :m+1\r"
33894324d87aSBram Moolenaarenddef
33904324d87aSBram Moolenaar
33914324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
33924324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
33934324d87aSBram Moolenaar  new
33944324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
33954324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
33964324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
33974324d87aSBram Moolenaar  xunmap <F3>
3398b5b9480eSBram Moolenaarenddef
3399b5b9480eSBram Moolenaar
3400b5b9480eSBram Moolenaardef Test_white_space_after_command()
3401b5b9480eSBram Moolenaar  var lines =<< trim END
3402b5b9480eSBram Moolenaar    exit_cb: Func})
3403b5b9480eSBram Moolenaar  END
3404b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3405f8103f27SBram Moolenaar
3406f8103f27SBram Moolenaar  lines =<< trim END
3407f8103f27SBram Moolenaar    e#
3408f8103f27SBram Moolenaar  END
3409f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
34104324d87aSBram Moolenaarenddef
34114324d87aSBram Moolenaar
34124aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
34134aab88d9SBram Moolenaar  var lines =<< trim END
34144aab88d9SBram Moolenaar      vim9script
34154aab88d9SBram Moolenaar      if exists('g:guard')
34164aab88d9SBram Moolenaar        finish
34174aab88d9SBram Moolenaar      endif
34184aab88d9SBram Moolenaar      g:guard = 1
34194aab88d9SBram Moolenaar      var name = 'thename'
34204aab88d9SBram Moolenaar      def g:GetName(): string
34214aab88d9SBram Moolenaar        return name
34224aab88d9SBram Moolenaar      enddef
34234aab88d9SBram Moolenaar      def g:SetName(arg: string)
34244aab88d9SBram Moolenaar        name = arg
34254aab88d9SBram Moolenaar      enddef
34264aab88d9SBram Moolenaar  END
34274aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
34284aab88d9SBram Moolenaar  so XscriptTwice.vim
34294aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
34304aab88d9SBram Moolenaar  g:SetName('newname')
34314aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
34324aab88d9SBram Moolenaar  so XscriptTwice.vim
34334aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
34344aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
34354aab88d9SBram Moolenaar
34364aab88d9SBram Moolenaar  delfunc g:GetName
34374aab88d9SBram Moolenaar  delfunc g:SetName
34384aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
34394aab88d9SBram Moolenaar  unlet g:guard
34404aab88d9SBram Moolenaarenddef
34414aab88d9SBram Moolenaar
34424aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
34434aab88d9SBram Moolenaar  var exportlines =<< trim END
34444aab88d9SBram Moolenaar      vim9script
34454aab88d9SBram Moolenaar      if exists('g:guard')
34464aab88d9SBram Moolenaar        finish
34474aab88d9SBram Moolenaar      endif
34484aab88d9SBram Moolenaar      g:guard = 1
34494aab88d9SBram Moolenaar      export var name = 'someName'
34504aab88d9SBram Moolenaar  END
34514aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
34524aab88d9SBram Moolenaar
34534aab88d9SBram Moolenaar  var lines =<< trim END
34544aab88d9SBram Moolenaar      vim9script
34554aab88d9SBram Moolenaar      import name from './XexportScript.vim'
34564aab88d9SBram Moolenaar      def g:GetName(): string
34574aab88d9SBram Moolenaar        return name
34584aab88d9SBram Moolenaar      enddef
34594aab88d9SBram Moolenaar  END
34604aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
34614aab88d9SBram Moolenaar  so XscriptImport.vim
34624aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
34634aab88d9SBram Moolenaar
34644aab88d9SBram Moolenaar  so XexportScript.vim
34654aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
34664aab88d9SBram Moolenaar
34674aab88d9SBram Moolenaar  delfunc g:GetName
34684aab88d9SBram Moolenaar  delete('XexportScript.vim')
34694aab88d9SBram Moolenaar  delete('XscriptImport.vim')
34704aab88d9SBram Moolenaar  unlet g:guard
34714aab88d9SBram Moolenaarenddef
34724aab88d9SBram Moolenaar
3473585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3474585fea7bSBram Moolenaardef Test_substitute_cmd()
3475585fea7bSBram Moolenaar  new
3476585fea7bSBram Moolenaar  setline(1, 'something')
3477585fea7bSBram Moolenaar  :substitute(some(other(
3478585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3479585fea7bSBram Moolenaar  bwipe!
3480585fea7bSBram Moolenaar
3481f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3482cfcd011fSBram Moolenaar  var lines =<< trim END
3483585fea7bSBram Moolenaar    vim9script
3484585fea7bSBram Moolenaar    new
3485585fea7bSBram Moolenaar    setline(1, 'something')
3486585fea7bSBram Moolenaar    :substitute(some(other(
3487585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3488585fea7bSBram Moolenaar    bwipe!
3489585fea7bSBram Moolenaar  END
3490585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3491585fea7bSBram Moolenaar  source Xvim9lines
3492585fea7bSBram Moolenaar
3493585fea7bSBram Moolenaar  delete('Xvim9lines')
3494585fea7bSBram Moolenaarenddef
3495585fea7bSBram Moolenaar
34968a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3497