18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
7e3d4685fSBram Moolenaarsource shared.vim
88a7d6542SBram Moolenaar
95d72ce69SBram Moolenaardef Test_range_only()
105d72ce69SBram Moolenaar  new
115d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
125d72ce69SBram Moolenaar  :/Blah/
135d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
14c2af0affSBram Moolenaar  bwipe!
15c2af0affSBram Moolenaar
16c2af0affSBram Moolenaar  # without range commands use current line
17c2af0affSBram Moolenaar  new
18c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
19c2af0affSBram Moolenaar  :2
20c2af0affSBram Moolenaar  print
21c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
22c2af0affSBram Moolenaar  :3
23c2af0affSBram Moolenaar  list
24c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
25b8554304SBram Moolenaar
26b8554304SBram Moolenaar  # missing command does not print the line
27b8554304SBram Moolenaar  var lines =<< trim END
28b8554304SBram Moolenaar    vim9script
29b8554304SBram Moolenaar    :1|
30b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
31b8554304SBram Moolenaar    :|
32b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
33b8554304SBram Moolenaar  END
34b8554304SBram Moolenaar  CheckScriptSuccess(lines)
35b8554304SBram Moolenaar
36c2af0affSBram Moolenaar  bwipe!
37025cb1caSBram Moolenaar
38025cb1caSBram Moolenaar  # won't generate anything
39025cb1caSBram Moolenaar  if false
40025cb1caSBram Moolenaar    :123
41025cb1caSBram Moolenaar  endif
425d72ce69SBram Moolenaarenddef
435d72ce69SBram Moolenaar
44a6e67e4fSBram Moolenaarlet g:alist = [7]
45a6e67e4fSBram Moolenaarlet g:astring = 'text'
46f0b9f43cSBram Moolenaarlet g:anumber = 123
476e587dcbSBram Moolenaar
484c17ad94SBram Moolenaardef Test_delfunction()
49f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
504c17ad94SBram Moolenaar  CheckScriptSuccess([
514c17ad94SBram Moolenaar      'vim9script',
524c17ad94SBram Moolenaar      'func CheckMe()',
534c17ad94SBram Moolenaar      '  return 123',
544c17ad94SBram Moolenaar      'endfunc',
554c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
564c17ad94SBram Moolenaar      ])
574c17ad94SBram Moolenaar
58f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
594c17ad94SBram Moolenaar  CheckScriptFailure([
604c17ad94SBram Moolenaar      'vim9script',
614c17ad94SBram Moolenaar      'func DeleteMe1()',
624c17ad94SBram Moolenaar      'endfunc',
634c17ad94SBram Moolenaar      'delfunction DeleteMe1',
644c17ad94SBram Moolenaar      ], 'E1084:')
654c17ad94SBram Moolenaar  CheckScriptFailure([
664c17ad94SBram Moolenaar      'vim9script',
674c17ad94SBram Moolenaar      'func DeleteMe2()',
684c17ad94SBram Moolenaar      'endfunc',
694c17ad94SBram Moolenaar      'def DoThat()',
704c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
714c17ad94SBram Moolenaar      'enddef',
724c17ad94SBram Moolenaar      'DoThat()',
734c17ad94SBram Moolenaar      ], 'E1084:')
744c17ad94SBram Moolenaar  CheckScriptFailure([
754c17ad94SBram Moolenaar      'vim9script',
764c17ad94SBram Moolenaar      'def DeleteMe3()',
774c17ad94SBram Moolenaar      'enddef',
784c17ad94SBram Moolenaar      'delfunction DeleteMe3',
794c17ad94SBram Moolenaar      ], 'E1084:')
804c17ad94SBram Moolenaar  CheckScriptFailure([
814c17ad94SBram Moolenaar      'vim9script',
824c17ad94SBram Moolenaar      'def DeleteMe4()',
834c17ad94SBram Moolenaar      'enddef',
844c17ad94SBram Moolenaar      'def DoThat()',
854c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
864c17ad94SBram Moolenaar      'enddef',
874c17ad94SBram Moolenaar      'DoThat()',
884c17ad94SBram Moolenaar      ], 'E1084:')
89925e9fd6SBram Moolenaar
90925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
91cfcd011fSBram Moolenaar  var lines =<< trim END
92925e9fd6SBram Moolenaar      vim9script
93925e9fd6SBram Moolenaar      def g:Global(): string
94925e9fd6SBram Moolenaar        return "yes"
95925e9fd6SBram Moolenaar      enddef
96925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
97925e9fd6SBram Moolenaar      def! g:Global(): string
98925e9fd6SBram Moolenaar        return "no"
99925e9fd6SBram Moolenaar      enddef
100925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
101925e9fd6SBram Moolenaar      delfunc g:Global
102925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
103925e9fd6SBram Moolenaar  END
104925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
105925e9fd6SBram Moolenaar
106925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
107925e9fd6SBram Moolenaar  lines =<< trim END
108925e9fd6SBram Moolenaar      vim9script
109925e9fd6SBram Moolenaar      func g:Global()
110925e9fd6SBram Moolenaar        return "yes"
111925e9fd6SBram Moolenaar      endfunc
112925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
113925e9fd6SBram Moolenaar      def! g:Global(): string
114925e9fd6SBram Moolenaar        return "no"
115925e9fd6SBram Moolenaar      enddef
116925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
117925e9fd6SBram Moolenaar      delfunc g:Global
118925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
119925e9fd6SBram Moolenaar  END
120925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
121925e9fd6SBram Moolenaar
122925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
123925e9fd6SBram Moolenaar  lines =<< trim END
124925e9fd6SBram Moolenaar      vim9script
125925e9fd6SBram Moolenaar      def g:Global(): string
126925e9fd6SBram Moolenaar        return "yes"
127925e9fd6SBram Moolenaar      enddef
128925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
129925e9fd6SBram Moolenaar      func! g:Global()
130925e9fd6SBram Moolenaar        return "no"
131925e9fd6SBram Moolenaar      endfunc
132925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
133925e9fd6SBram Moolenaar      delfunc g:Global
134925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
135925e9fd6SBram Moolenaar  END
136925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1374c17ad94SBram Moolenaarenddef
1384c17ad94SBram Moolenaar
13908052228SBram Moolenaardef Test_wrong_type()
140cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
143cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
144599c89c8SBram Moolenaar
145cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
146cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
14742a480bfSBram Moolenaar
148cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
149cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
150cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
151cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
152cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
153cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
154cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
155cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
156cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
157cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
158cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
159a0a9f43aSBram Moolenaar
160cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
161cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
16208052228SBram Moolenaarenddef
1638a7d6542SBram Moolenaar
16410c65860SBram Moolenaardef Test_script_wrong_type()
16510c65860SBram Moolenaar  var lines =<< trim END
16610c65860SBram Moolenaar      vim9script
16710c65860SBram Moolenaar      var s:dict: dict<string>
16810c65860SBram Moolenaar      s:dict['a'] = ['x']
16910c65860SBram Moolenaar  END
17010c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
17110c65860SBram Moolenaarenddef
17210c65860SBram Moolenaar
17308052228SBram Moolenaardef Test_const()
174cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
175cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
176cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
17730fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
17830fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
179dbeecb2bSBram Moolenaar
180cfcd011fSBram Moolenaar  var lines =<< trim END
18130fd8204SBram Moolenaar    final list = [1, 2, 3]
182dbeecb2bSBram Moolenaar    list[0] = 4
1830b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
18430fd8204SBram Moolenaar    const other = [5, 6, 7]
1850b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
18671abe482SBram Moolenaar
187cfcd011fSBram Moolenaar    var varlist = [7, 8]
18830fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
18971abe482SBram Moolenaar    varlist[0] = 77
19071abe482SBram Moolenaar    # TODO: does not work yet
19171abe482SBram Moolenaar    # constlist[1][1] = 88
192cfcd011fSBram Moolenaar    var cl = constlist[1]
19371abe482SBram Moolenaar    cl[1] = 88
19471abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
19571abe482SBram Moolenaar
196e0de171eSBram Moolenaar    var vardict = {five: 5, six: 6}
197e0de171eSBram Moolenaar    const constdict = {one: 1, two: vardict, three: 3}
19871abe482SBram Moolenaar    vardict['five'] = 55
19971abe482SBram Moolenaar    # TODO: does not work yet
20071abe482SBram Moolenaar    # constdict['two']['six'] = 66
201cfcd011fSBram Moolenaar    var cd = constdict['two']
20271abe482SBram Moolenaar    cd['six'] = 66
203e0de171eSBram Moolenaar    constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
204dbeecb2bSBram Moolenaar  END
205dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
20608052228SBram Moolenaarenddef
2078a7d6542SBram Moolenaar
2080b4c66c6SBram Moolenaardef Test_const_bang()
209cfcd011fSBram Moolenaar  var lines =<< trim END
21030fd8204SBram Moolenaar      const var = 234
2110b4c66c6SBram Moolenaar      var = 99
2120b4c66c6SBram Moolenaar  END
2130b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
2140b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
2150b4c66c6SBram Moolenaar
2160b4c66c6SBram Moolenaar  lines =<< trim END
21730fd8204SBram Moolenaar      const ll = [2, 3, 4]
2180b4c66c6SBram Moolenaar      ll[0] = 99
2190b4c66c6SBram Moolenaar  END
2200b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2210b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2220b4c66c6SBram Moolenaar
2230b4c66c6SBram Moolenaar  lines =<< trim END
22430fd8204SBram Moolenaar      const ll = [2, 3, 4]
2250b4c66c6SBram Moolenaar      ll[3] = 99
2260b4c66c6SBram Moolenaar  END
2270b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2280b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2290b4c66c6SBram Moolenaar
2300b4c66c6SBram Moolenaar  lines =<< trim END
231e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2320b4c66c6SBram Moolenaar      dd["one"] = 99
2330b4c66c6SBram Moolenaar  END
2340b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2350b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2360b4c66c6SBram Moolenaar
2370b4c66c6SBram Moolenaar  lines =<< trim END
238e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2390b4c66c6SBram Moolenaar      dd["three"] = 99
2400b4c66c6SBram Moolenaar  END
2410b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2420b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2430b4c66c6SBram Moolenaarenddef
2440b4c66c6SBram Moolenaar
245df069eecSBram Moolenaardef Test_range_no_colon()
246d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
247d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
248d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
249d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
250df069eecSBram Moolenaarenddef
251df069eecSBram Moolenaar
252df069eecSBram Moolenaar
2538a7d6542SBram Moolenaardef Test_block()
254cfcd011fSBram Moolenaar  var outer = 1
2558a7d6542SBram Moolenaar  {
256cfcd011fSBram Moolenaar    var inner = 2
2578a7d6542SBram Moolenaar    assert_equal(1, outer)
2588a7d6542SBram Moolenaar    assert_equal(2, inner)
2598a7d6542SBram Moolenaar  }
2608a7d6542SBram Moolenaar  assert_equal(1, outer)
2618a7d6542SBram Moolenaarenddef
2628a7d6542SBram Moolenaar
26308052228SBram Moolenaardef Test_block_failure()
264cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
26508052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
26608052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
26708052228SBram Moolenaarenddef
2688a7d6542SBram Moolenaar
269fbbcd003SBram Moolenaardef Test_block_local_vars()
270fbbcd003SBram Moolenaar  var lines =<< trim END
271fbbcd003SBram Moolenaar      vim9script
272ed234f24SBram Moolenaar      v:testing = 1
273fbbcd003SBram Moolenaar      if true
274ed234f24SBram Moolenaar        var text = ['hello']
275ed234f24SBram Moolenaar        def SayHello(): list<string>
276fbbcd003SBram Moolenaar          return text
277fbbcd003SBram Moolenaar        enddef
278fbbcd003SBram Moolenaar        def SetText(v: string)
279ed234f24SBram Moolenaar          text = [v]
280fbbcd003SBram Moolenaar        enddef
281fbbcd003SBram Moolenaar      endif
282fbbcd003SBram Moolenaar
283fbbcd003SBram Moolenaar      if true
284ed234f24SBram Moolenaar        var text = ['again']
285ed234f24SBram Moolenaar        def SayAgain(): list<string>
286fbbcd003SBram Moolenaar          return text
287fbbcd003SBram Moolenaar        enddef
288fbbcd003SBram Moolenaar      endif
289ed234f24SBram Moolenaar
290ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
291ed234f24SBram Moolenaar      test_garbagecollect_now()
292ed234f24SBram Moolenaar
293fbbcd003SBram Moolenaar      defcompile
294fbbcd003SBram Moolenaar
295ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
296ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
297fbbcd003SBram Moolenaar
298fbbcd003SBram Moolenaar      SetText('foobar')
299ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
300ed234f24SBram Moolenaar
301ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
302ed234f24SBram Moolenaar      qall!
303fbbcd003SBram Moolenaar  END
304ed234f24SBram Moolenaar
305ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
306ed234f24SBram Moolenaar  # context gets garbage collected.
307ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
308ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
309ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
310ed234f24SBram Moolenaar
311ed234f24SBram Moolenaar  delete('Xscript')
312ed234f24SBram Moolenaar  delete('Xdidit')
313fbbcd003SBram Moolenaarenddef
314fbbcd003SBram Moolenaar
31539ca4127SBram Moolenaardef Test_block_local_vars_with_func()
31639ca4127SBram Moolenaar  var lines =<< trim END
31739ca4127SBram Moolenaar      vim9script
31839ca4127SBram Moolenaar      if true
31939ca4127SBram Moolenaar        var foo = 'foo'
32039ca4127SBram Moolenaar        if true
32139ca4127SBram Moolenaar          var bar = 'bar'
32239ca4127SBram Moolenaar          def Func(): list<string>
32339ca4127SBram Moolenaar            return [foo, bar]
32439ca4127SBram Moolenaar          enddef
32539ca4127SBram Moolenaar        endif
32639ca4127SBram Moolenaar      endif
32739ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
32839ca4127SBram Moolenaar      # "foo" and "bar"
32939ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
33039ca4127SBram Moolenaar  END
33139ca4127SBram Moolenaar  CheckScriptSuccess(lines)
33239ca4127SBram Moolenaarenddef
33339ca4127SBram Moolenaar
334d032f34aSBram Moolenaarfunc g:NoSuchFunc()
335d032f34aSBram Moolenaar  echo 'none'
336d032f34aSBram Moolenaarendfunc
337d032f34aSBram Moolenaar
3389e1d9e34SBram Moolenaardef Test_try_catch_throw()
339cfcd011fSBram Moolenaar  var l = []
3407a092245SBram Moolenaar  try # comment
3418a7d6542SBram Moolenaar    add(l, '1')
3428a7d6542SBram Moolenaar    throw 'wrong'
3438a7d6542SBram Moolenaar    add(l, '2')
3447a092245SBram Moolenaar  catch # comment
3458a7d6542SBram Moolenaar    add(l, v:exception)
3467a092245SBram Moolenaar  finally # comment
3478a7d6542SBram Moolenaar    add(l, '3')
3487a092245SBram Moolenaar  endtry # comment
3498a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
35068d130c6SBram Moolenaar
351e859312eSBram Moolenaar  l = []
352e859312eSBram Moolenaar  try
353e859312eSBram Moolenaar    try
354e859312eSBram Moolenaar      add(l, '1')
355e859312eSBram Moolenaar      throw 'wrong'
356e859312eSBram Moolenaar      add(l, '2')
357e859312eSBram Moolenaar    catch /right/
358e859312eSBram Moolenaar      add(l, v:exception)
359e859312eSBram Moolenaar    endtry
360e859312eSBram Moolenaar  catch /wrong/
361e859312eSBram Moolenaar    add(l, 'caught')
362373863edSBram Moolenaar  fina
363e859312eSBram Moolenaar    add(l, 'finally')
364e859312eSBram Moolenaar  endtry
365e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
366e859312eSBram Moolenaar
367cfcd011fSBram Moolenaar  var n: number
36868d130c6SBram Moolenaar  try
36968d130c6SBram Moolenaar    n = l[3]
37068d130c6SBram Moolenaar  catch /E684:/
37168d130c6SBram Moolenaar    n = 99
37268d130c6SBram Moolenaar  endtry
37368d130c6SBram Moolenaar  assert_equal(99, n)
37468d130c6SBram Moolenaar
37569f7050cSBram Moolenaar  var done = 'no'
37669f7050cSBram Moolenaar  if 0
37769f7050cSBram Moolenaar    try | catch | endtry
37869f7050cSBram Moolenaar  else
37969f7050cSBram Moolenaar    done = 'yes'
38069f7050cSBram Moolenaar  endif
38169f7050cSBram Moolenaar  assert_equal('yes', done)
38269f7050cSBram Moolenaar
38369f7050cSBram Moolenaar  done = 'no'
38469f7050cSBram Moolenaar  if 1
38569f7050cSBram Moolenaar    done = 'yes'
38669f7050cSBram Moolenaar  else
38769f7050cSBram Moolenaar    try | catch | endtry
38869f7050cSBram Moolenaar    done = 'never'
38969f7050cSBram Moolenaar  endif
39069f7050cSBram Moolenaar  assert_equal('yes', done)
39169f7050cSBram Moolenaar
39269f7050cSBram Moolenaar  if 1
39369f7050cSBram Moolenaar  else
39469f7050cSBram Moolenaar    try | catch /pat/ | endtry
39569f7050cSBram Moolenaar    try | catch /pat/
39669f7050cSBram Moolenaar    endtry
39769f7050cSBram Moolenaar    try
39869f7050cSBram Moolenaar    catch /pat/ | endtry
39969f7050cSBram Moolenaar    try
40069f7050cSBram Moolenaar    catch /pat/
40169f7050cSBram Moolenaar    endtry
40269f7050cSBram Moolenaar  endif
40369f7050cSBram Moolenaar
40468d130c6SBram Moolenaar  try
405cc673e74SBram Moolenaar    # string slice returns a string, not a number
40668d130c6SBram Moolenaar    n = g:astring[3]
4075e654230SBram Moolenaar  catch /E1012:/
40868d130c6SBram Moolenaar    n = 77
40968d130c6SBram Moolenaar  endtry
41068d130c6SBram Moolenaar  assert_equal(77, n)
41168d130c6SBram Moolenaar
41268d130c6SBram Moolenaar  try
41368d130c6SBram Moolenaar    n = l[g:astring]
4145e654230SBram Moolenaar  catch /E1012:/
41556acb094SBram Moolenaar    n = 88
41668d130c6SBram Moolenaar  endtry
41756acb094SBram Moolenaar  assert_equal(88, n)
41868d130c6SBram Moolenaar
41968d130c6SBram Moolenaar  try
42068d130c6SBram Moolenaar    n = s:does_not_exist
42168d130c6SBram Moolenaar  catch /E121:/
422f0b9f43cSBram Moolenaar    n = 111
423f0b9f43cSBram Moolenaar  endtry
424f0b9f43cSBram Moolenaar  assert_equal(111, n)
425f0b9f43cSBram Moolenaar
426f0b9f43cSBram Moolenaar  try
427f0b9f43cSBram Moolenaar    n = g:does_not_exist
428f0b9f43cSBram Moolenaar  catch /E121:/
42968d130c6SBram Moolenaar    n = 121
43068d130c6SBram Moolenaar  endtry
43168d130c6SBram Moolenaar  assert_equal(121, n)
43268d130c6SBram Moolenaar
433e0de171eSBram Moolenaar  var d = {one: 1}
43468d130c6SBram Moolenaar  try
43568d130c6SBram Moolenaar    n = d[g:astring]
43668d130c6SBram Moolenaar  catch /E716:/
43768d130c6SBram Moolenaar    n = 222
43868d130c6SBram Moolenaar  endtry
43968d130c6SBram Moolenaar  assert_equal(222, n)
440f0b9f43cSBram Moolenaar
441f0b9f43cSBram Moolenaar  try
442f0b9f43cSBram Moolenaar    n = -g:astring
443f0b9f43cSBram Moolenaar  catch /E39:/
444f0b9f43cSBram Moolenaar    n = 233
445f0b9f43cSBram Moolenaar  endtry
446f0b9f43cSBram Moolenaar  assert_equal(233, n)
447f0b9f43cSBram Moolenaar
448f0b9f43cSBram Moolenaar  try
449f0b9f43cSBram Moolenaar    n = +g:astring
450f0b9f43cSBram Moolenaar  catch /E1030:/
451f0b9f43cSBram Moolenaar    n = 244
452f0b9f43cSBram Moolenaar  endtry
453f0b9f43cSBram Moolenaar  assert_equal(244, n)
454f0b9f43cSBram Moolenaar
455f0b9f43cSBram Moolenaar  try
456f0b9f43cSBram Moolenaar    n = +g:alist
457f0b9f43cSBram Moolenaar  catch /E745:/
458f0b9f43cSBram Moolenaar    n = 255
459f0b9f43cSBram Moolenaar  endtry
460f0b9f43cSBram Moolenaar  assert_equal(255, n)
461f0b9f43cSBram Moolenaar
462cfcd011fSBram Moolenaar  var nd: dict<any>
463f0b9f43cSBram Moolenaar  try
4642e5910bfSBram Moolenaar    nd = {[g:alist]: 1}
4652e5910bfSBram Moolenaar  catch /E1105:/
466f0b9f43cSBram Moolenaar    n = 266
467f0b9f43cSBram Moolenaar  endtry
468f0b9f43cSBram Moolenaar  assert_equal(266, n)
469f0b9f43cSBram Moolenaar
470f0b9f43cSBram Moolenaar  try
471f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
472f0b9f43cSBram Moolenaar  catch /E1093:/
473f0b9f43cSBram Moolenaar    n = 277
474f0b9f43cSBram Moolenaar  endtry
475f0b9f43cSBram Moolenaar  assert_equal(277, n)
476f0b9f43cSBram Moolenaar
477e859312eSBram Moolenaar  try
478e859312eSBram Moolenaar    &ts = g:astring
4795e654230SBram Moolenaar  catch /E1012:/
480e859312eSBram Moolenaar    n = 288
481e859312eSBram Moolenaar  endtry
482e859312eSBram Moolenaar  assert_equal(288, n)
483e859312eSBram Moolenaar
484e859312eSBram Moolenaar  try
485e859312eSBram Moolenaar    &backspace = 'asdf'
486e859312eSBram Moolenaar  catch /E474:/
487e859312eSBram Moolenaar    n = 299
488e859312eSBram Moolenaar  endtry
489e859312eSBram Moolenaar  assert_equal(299, n)
490e859312eSBram Moolenaar
491e859312eSBram Moolenaar  l = [1]
492e859312eSBram Moolenaar  try
493e859312eSBram Moolenaar    l[3] = 3
494e859312eSBram Moolenaar  catch /E684:/
495e859312eSBram Moolenaar    n = 300
496e859312eSBram Moolenaar  endtry
497e859312eSBram Moolenaar  assert_equal(300, n)
498e859312eSBram Moolenaar
499e859312eSBram Moolenaar  try
500e859312eSBram Moolenaar    unlet g:does_not_exist
501e859312eSBram Moolenaar  catch /E108:/
502e859312eSBram Moolenaar    n = 322
503e859312eSBram Moolenaar  endtry
504e859312eSBram Moolenaar  assert_equal(322, n)
505e859312eSBram Moolenaar
506e859312eSBram Moolenaar  try
5072bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
508e859312eSBram Moolenaar  catch /E721:/
509e859312eSBram Moolenaar    n = 333
510e859312eSBram Moolenaar  endtry
511e859312eSBram Moolenaar  assert_equal(333, n)
512e859312eSBram Moolenaar
513e859312eSBram Moolenaar  try
514e859312eSBram Moolenaar    l = DeletedFunc()
515e859312eSBram Moolenaar  catch /E933:/
516e859312eSBram Moolenaar    n = 344
517e859312eSBram Moolenaar  endtry
518e859312eSBram Moolenaar  assert_equal(344, n)
519d032f34aSBram Moolenaar
520d032f34aSBram Moolenaar  try
521d032f34aSBram Moolenaar    echo len(v:true)
522d032f34aSBram Moolenaar  catch /E701:/
523d032f34aSBram Moolenaar    n = 355
524d032f34aSBram Moolenaar  endtry
525d032f34aSBram Moolenaar  assert_equal(355, n)
526d032f34aSBram Moolenaar
527cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
528d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
529d032f34aSBram Moolenaar  try
530d032f34aSBram Moolenaar    echo P()
531d032f34aSBram Moolenaar  catch /E117:/
532d032f34aSBram Moolenaar    n = 366
533d032f34aSBram Moolenaar  endtry
534d032f34aSBram Moolenaar  assert_equal(366, n)
535d032f34aSBram Moolenaar
536d032f34aSBram Moolenaar  try
537d032f34aSBram Moolenaar    echo g:NoSuchFunc()
538d032f34aSBram Moolenaar  catch /E117:/
539d032f34aSBram Moolenaar    n = 377
540d032f34aSBram Moolenaar  endtry
541d032f34aSBram Moolenaar  assert_equal(377, n)
542d032f34aSBram Moolenaar
543d032f34aSBram Moolenaar  try
544d032f34aSBram Moolenaar    echo g:alist + 4
545d032f34aSBram Moolenaar  catch /E745:/
546d032f34aSBram Moolenaar    n = 388
547d032f34aSBram Moolenaar  endtry
548d032f34aSBram Moolenaar  assert_equal(388, n)
549d032f34aSBram Moolenaar
550d032f34aSBram Moolenaar  try
551d032f34aSBram Moolenaar    echo 4 + g:alist
552d032f34aSBram Moolenaar  catch /E745:/
553d032f34aSBram Moolenaar    n = 399
554d032f34aSBram Moolenaar  endtry
555d032f34aSBram Moolenaar  assert_equal(399, n)
556d032f34aSBram Moolenaar
557d032f34aSBram Moolenaar  try
558d032f34aSBram Moolenaar    echo g:alist.member
559d032f34aSBram Moolenaar  catch /E715:/
560d032f34aSBram Moolenaar    n = 400
561d032f34aSBram Moolenaar  endtry
562d032f34aSBram Moolenaar  assert_equal(400, n)
563d032f34aSBram Moolenaar
564d032f34aSBram Moolenaar  try
565d032f34aSBram Moolenaar    echo d.member
566d032f34aSBram Moolenaar  catch /E716:/
567d032f34aSBram Moolenaar    n = 411
568d032f34aSBram Moolenaar  endtry
569d032f34aSBram Moolenaar  assert_equal(411, n)
570d9d7789bSBram Moolenaar
571d9d7789bSBram Moolenaar  var counter = 0
572d9d7789bSBram Moolenaar  for i in range(4)
573d9d7789bSBram Moolenaar    try
574d9d7789bSBram Moolenaar      eval [][0]
575d9d7789bSBram Moolenaar    catch
576d9d7789bSBram Moolenaar    endtry
577d9d7789bSBram Moolenaar    counter += 1
578d9d7789bSBram Moolenaar  endfor
579d9d7789bSBram Moolenaar  assert_equal(4, counter)
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
1265*d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1266*d3f8a9eeSBram Moolenaar  var lines =<< trim END
1267*d3f8a9eeSBram Moolenaar    if has(g:feature)
1268*d3f8a9eeSBram Moolenaar      " legacy script
1269*d3f8a9eeSBram Moolenaar      let g:legacy = 1
1270*d3f8a9eeSBram Moolenaar      finish
1271*d3f8a9eeSBram Moolenaar    endif
1272*d3f8a9eeSBram Moolenaar    vim9script
1273*d3f8a9eeSBram Moolenaar    g:legacy = 0
1274*d3f8a9eeSBram Moolenaar  END
1275*d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1276*d3f8a9eeSBram Moolenaar  g:legacy = -1
1277*d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1278*d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1279*d3f8a9eeSBram Moolenaar
1280*d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1281*d3f8a9eeSBram Moolenaar  g:legacy = -1
1282*d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1283*d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1284*d3f8a9eeSBram Moolenaarenddef
1285*d3f8a9eeSBram Moolenaar
1286750802b5SBram Moolenaardef Test_vim9script_fails()
12878a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
12888a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1289cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
12909721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1291cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1292750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1293750802b5SBram Moolenaar
1294cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1295c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1296c785b9a7SBram Moolenaar
1297e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1298e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
12998a7d6542SBram Moolenaarenddef
13008a7d6542SBram Moolenaar
1301f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1302101f4810SBram Moolenaar  CheckRunVimInTerminal
1303101f4810SBram Moolenaar
13049bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1305c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
13069bb3eb3eSBram Moolenaarendfunc
13079bb3eb3eSBram Moolenaar
1308c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1309cfcd011fSBram Moolenaar  var export =<< trim END
1310101f4810SBram Moolenaar    vim9script
1311101f4810SBram Moolenaar    export def Foo(): number
1312101f4810SBram Moolenaar        return 0
1313101f4810SBram Moolenaar    enddef
1314101f4810SBram Moolenaar  END
1315730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1316101f4810SBram Moolenaar
1317e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
13189bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
13192949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1320101f4810SBram Moolenaar
1321730b2483SBram Moolenaar  delete('XexportCmd.vim')
13229bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
13239bb3eb3eSBram Moolenaarenddef
1324101f4810SBram Moolenaar
13252b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
13262b32700dSBram Moolenaar  var lines =<< trim END
1327a6294955SBram Moolenaar    vim9script
1328a6294955SBram Moolenaar    export var exported = 'thexport'
1329a6294955SBram Moolenaar  END
1330a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1331a6294955SBram Moolenaar  lines =<< trim END
13322b32700dSBram Moolenaar    vim9script noclear
13332b32700dSBram Moolenaar    g:loadCount += 1
13342b32700dSBram Moolenaar    var s:reloaded = 'init'
1335a6294955SBram Moolenaar    import exported from './XExportReload'
13362b32700dSBram Moolenaar
13372b32700dSBram Moolenaar    def Again(): string
13382b32700dSBram Moolenaar      return 'again'
13392b32700dSBram Moolenaar    enddef
13402b32700dSBram Moolenaar
13412b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
13422b32700dSBram Moolenaar    var s:loaded = true
13432b32700dSBram Moolenaar
13442b32700dSBram Moolenaar    var s:notReloaded = 'yes'
13452b32700dSBram Moolenaar    s:reloaded = 'first'
13462b32700dSBram Moolenaar    def g:Values(): list<string>
1347a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
13482b32700dSBram Moolenaar    enddef
13492b32700dSBram Moolenaar
13502b32700dSBram Moolenaar    def Once(): string
13512b32700dSBram Moolenaar      return 'once'
13522b32700dSBram Moolenaar    enddef
13532b32700dSBram Moolenaar  END
13542b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
13552b32700dSBram Moolenaar  g:loadCount = 0
13562b32700dSBram Moolenaar  source XReloaded
13572b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1358a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
13592b32700dSBram Moolenaar  source XReloaded
13602b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1361a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
13622b32700dSBram Moolenaar  source XReloaded
13632b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1364a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
13652b32700dSBram Moolenaar
136648e11c10SBram Moolenaar  delete('XReloaded')
1367a6294955SBram Moolenaar  delete('XExportReload')
13682b32700dSBram Moolenaar  delfunc g:Values
13692b32700dSBram Moolenaar  unlet g:loadCount
13702b32700dSBram Moolenaarenddef
13712b32700dSBram Moolenaar
13724c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1373cfcd011fSBram Moolenaar  var lines =<< trim END
13748a7d6542SBram Moolenaar    vim9script
13758a7d6542SBram Moolenaar    const var = ''
1376cfcd011fSBram Moolenaar    var valone = 1234
13778a7d6542SBram Moolenaar    def MyFunc(arg: string)
13788a7d6542SBram Moolenaar       valone = 5678
13798a7d6542SBram Moolenaar    enddef
13808a7d6542SBram Moolenaar  END
1381cfcd011fSBram Moolenaar  var morelines =<< trim END
1382cfcd011fSBram Moolenaar    var valtwo = 222
13838a7d6542SBram Moolenaar    export def GetValtwo(): number
13848a7d6542SBram Moolenaar      return valtwo
13858a7d6542SBram Moolenaar    enddef
13868a7d6542SBram Moolenaar  END
138703afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
13888a7d6542SBram Moolenaar  source Xreload.vim
13898a7d6542SBram Moolenaar  source Xreload.vim
13908a7d6542SBram Moolenaar  source Xreload.vim
13918a7d6542SBram Moolenaar
1392cfcd011fSBram Moolenaar  var testlines =<< trim END
13938a7d6542SBram Moolenaar    vim9script
13948a7d6542SBram Moolenaar    def TheFunc()
13958a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
13968a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
13978a7d6542SBram Moolenaar    enddef
13988a7d6542SBram Moolenaar    TheFunc()
13998a7d6542SBram Moolenaar  END
14008a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
14018a7d6542SBram Moolenaar  source Ximport.vim
14028a7d6542SBram Moolenaar
1403f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1404f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
14058a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
14068a7d6542SBram Moolenaar  source Ximport.vim
14078a7d6542SBram Moolenaar
1408f5be8cdbSBram Moolenaar  # cannot declare a var twice
14098a7d6542SBram Moolenaar  lines =<< trim END
14108a7d6542SBram Moolenaar    vim9script
1411cfcd011fSBram Moolenaar    var valone = 1234
1412cfcd011fSBram Moolenaar    var valone = 5678
14138a7d6542SBram Moolenaar  END
14148a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
141544d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
14168a7d6542SBram Moolenaar
14178a7d6542SBram Moolenaar  delete('Xreload.vim')
14188a7d6542SBram Moolenaar  delete('Ximport.vim')
14198a7d6542SBram Moolenaarenddef
14208a7d6542SBram Moolenaar
142107a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
142207a65d26SBram Moolenaar" compiled function using that variable must fail.
142307a65d26SBram Moolenaardef Test_script_reload_change_type()
142407a65d26SBram Moolenaar  var lines =<< trim END
142507a65d26SBram Moolenaar    vim9script noclear
142607a65d26SBram Moolenaar    var str = 'string'
142707a65d26SBram Moolenaar    def g:GetStr(): string
142807a65d26SBram Moolenaar      return str .. 'xxx'
142907a65d26SBram Moolenaar    enddef
143007a65d26SBram Moolenaar  END
143107a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
143207a65d26SBram Moolenaar  source Xreload.vim
143307a65d26SBram Moolenaar  echo g:GetStr()
143407a65d26SBram Moolenaar
143507a65d26SBram Moolenaar  lines =<< trim END
143607a65d26SBram Moolenaar    vim9script noclear
143707a65d26SBram Moolenaar    var str = 1234
143807a65d26SBram Moolenaar  END
143907a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
144007a65d26SBram Moolenaar  source Xreload.vim
144107a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
144207a65d26SBram Moolenaar
144307a65d26SBram Moolenaar  delfunc g:GetStr
144407a65d26SBram Moolenaar  delete('Xreload.vim')
144507a65d26SBram Moolenaarenddef
144607a65d26SBram Moolenaar
144795006e3dSBram Moolenaardef s:RetSome(): string
144895006e3dSBram Moolenaar  return 'some'
144995006e3dSBram Moolenaarenddef
145095006e3dSBram Moolenaar
1451fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1452fe465a01SBram Moolenaar" script-local name.
1453fe465a01SBram Moolenaardef Test_vim9script_funcref()
1454cfcd011fSBram Moolenaar  var sortlines =<< trim END
1455fe465a01SBram Moolenaar      vim9script
1456fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1457bed36b93SBram Moolenaar        return i2 - i1
1458fe465a01SBram Moolenaar      enddef
1459fe465a01SBram Moolenaar
1460fe465a01SBram Moolenaar      export def FastSort(): list<number>
1461fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1462fe465a01SBram Moolenaar      enddef
1463fe465a01SBram Moolenaar  END
1464fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1465fe465a01SBram Moolenaar
1466cfcd011fSBram Moolenaar  var lines =<< trim END
1467fe465a01SBram Moolenaar    vim9script
1468fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1469fe465a01SBram Moolenaar    def Test()
1470fe465a01SBram Moolenaar      g:result = FastSort()
1471fe465a01SBram Moolenaar    enddef
1472fe465a01SBram Moolenaar    Test()
1473fe465a01SBram Moolenaar  END
1474fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1475fe465a01SBram Moolenaar
1476fe465a01SBram Moolenaar  source Xscript.vim
1477fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1478fe465a01SBram Moolenaar
1479fe465a01SBram Moolenaar  unlet g:result
1480fe465a01SBram Moolenaar  delete('Xsort.vim')
1481fe465a01SBram Moolenaar  delete('Xscript.vim')
148295006e3dSBram Moolenaar
1483cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
148495006e3dSBram Moolenaar  assert_equal('some', Funcref())
1485fe465a01SBram Moolenaarenddef
1486fe465a01SBram Moolenaar
1487601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1488601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1489601e76acSBram Moolenaar" function reference.
1490c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1491cfcd011fSBram Moolenaar  var filterLines =<< trim END
1492c620c055SBram Moolenaar    vim9script
1493c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1494c620c055SBram Moolenaar      return idx % 2 == 1
1495c620c055SBram Moolenaar    enddef
1496c620c055SBram Moolenaar    export def FastFilter(): list<number>
1497c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1498c620c055SBram Moolenaar    enddef
1499601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1500601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1501601e76acSBram Moolenaar    enddef
1502c620c055SBram Moolenaar  END
1503c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1504c620c055SBram Moolenaar
1505cfcd011fSBram Moolenaar  var lines =<< trim END
1506c620c055SBram Moolenaar    vim9script
1507601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1508c620c055SBram Moolenaar    def Test()
1509cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1510c620c055SBram Moolenaar    enddef
1511c620c055SBram Moolenaar    Test()
1512601e76acSBram Moolenaar    def TestDirect()
1513cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1514601e76acSBram Moolenaar    enddef
1515601e76acSBram Moolenaar    TestDirect()
1516c620c055SBram Moolenaar  END
1517601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1518c620c055SBram Moolenaar  delete('Xfilter.vim')
1519c620c055SBram Moolenaarenddef
1520c620c055SBram Moolenaar
15214c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1522cfcd011fSBram Moolenaar  var first_lines =<< trim END
15234c17ad94SBram Moolenaar    vim9script
15244c17ad94SBram Moolenaar    def FuncYes(): string
15254c17ad94SBram Moolenaar      return 'yes'
15264c17ad94SBram Moolenaar    enddef
15274c17ad94SBram Moolenaar  END
1528cfcd011fSBram Moolenaar  var withno_lines =<< trim END
15294c17ad94SBram Moolenaar    def FuncNo(): string
15304c17ad94SBram Moolenaar      return 'no'
15314c17ad94SBram Moolenaar    enddef
15324c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
15334c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
15344c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
153503afdcf1SBram Moolenaar    enddef
153603afdcf1SBram Moolenaar  END
1537cfcd011fSBram Moolenaar  var nono_lines =<< trim END
153803afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
153903afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
154044d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
15414c17ad94SBram Moolenaar    enddef
15424c17ad94SBram Moolenaar  END
15434c17ad94SBram Moolenaar
15444c17ad94SBram Moolenaar  # FuncNo() is defined
154503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
15464c17ad94SBram Moolenaar  source Xreloaded.vim
15474c17ad94SBram Moolenaar  g:DoCheck(true)
15484c17ad94SBram Moolenaar
15494c17ad94SBram Moolenaar  # FuncNo() is not redefined
155003afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
15514c17ad94SBram Moolenaar  source Xreloaded.vim
15525082471fSBram Moolenaar  g:DoCheck(false)
15534c17ad94SBram Moolenaar
15544c17ad94SBram Moolenaar  # FuncNo() is back
155503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
15564c17ad94SBram Moolenaar  source Xreloaded.vim
15575082471fSBram Moolenaar  g:DoCheck(false)
15584c17ad94SBram Moolenaar
15594c17ad94SBram Moolenaar  delete('Xreloaded.vim')
15604c17ad94SBram Moolenaarenddef
15614c17ad94SBram Moolenaar
156289483d40SBram Moolenaardef Test_vim9script_reload_delvar()
156389483d40SBram Moolenaar  # write the script with a script-local variable
1564cfcd011fSBram Moolenaar  var lines =<< trim END
156589483d40SBram Moolenaar    vim9script
1566cfcd011fSBram Moolenaar    var name = 'string'
156789483d40SBram Moolenaar  END
156889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
156989483d40SBram Moolenaar  source XreloadVar.vim
157089483d40SBram Moolenaar
157189483d40SBram Moolenaar  # now write the script using the same variable locally - works
157289483d40SBram Moolenaar  lines =<< trim END
157389483d40SBram Moolenaar    vim9script
157489483d40SBram Moolenaar    def Func()
1575cfcd011fSBram Moolenaar      var name = 'string'
157689483d40SBram Moolenaar    enddef
157789483d40SBram Moolenaar  END
157889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
157989483d40SBram Moolenaar  source XreloadVar.vim
158089483d40SBram Moolenaar
158189483d40SBram Moolenaar  delete('XreloadVar.vim')
158289483d40SBram Moolenaarenddef
158389483d40SBram Moolenaar
15848a7d6542SBram Moolenaardef Test_import_absolute()
1585cfcd011fSBram Moolenaar  var import_lines = [
1586e6085c53SBram Moolenaar        'vim9script',
1587e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1588e6085c53SBram Moolenaar        'def UseExported()',
1589e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1590e6085c53SBram Moolenaar        '  exported = 8888',
1591e6085c53SBram Moolenaar        '  g:imported_after = exported',
1592e6085c53SBram Moolenaar        'enddef',
1593e6085c53SBram Moolenaar        'UseExported()',
1594e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1595e6085c53SBram Moolenaar        ]
15968a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
15978a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
15988a7d6542SBram Moolenaar
15998a7d6542SBram Moolenaar  source Ximport_abs.vim
16008a7d6542SBram Moolenaar
16018a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
16024e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1603fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1604fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1605fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1606fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1607fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1608fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1609fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1610fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1611fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1612fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1613e6085c53SBram Moolenaar        g:import_disassembled)
1614b3ca9824SBram Moolenaar
1615b3ca9824SBram Moolenaar  Undo_export_script_lines()
16168a7d6542SBram Moolenaar  unlet g:imported_abs
16174e12a5dfSBram Moolenaar  unlet g:import_disassembled
16188a7d6542SBram Moolenaar
16198a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
16208a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
16218a7d6542SBram Moolenaarenddef
16228a7d6542SBram Moolenaar
16238a7d6542SBram Moolenaardef Test_import_rtp()
1624cfcd011fSBram Moolenaar  var import_lines = [
1625e6085c53SBram Moolenaar        'vim9script',
1626e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1627e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1628e6085c53SBram Moolenaar        ]
16298a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
16308a7d6542SBram Moolenaar  mkdir('import')
16318a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
16328a7d6542SBram Moolenaar
1633cfcd011fSBram Moolenaar  var save_rtp = &rtp
16348a7d6542SBram Moolenaar  &rtp = getcwd()
16358a7d6542SBram Moolenaar  source Ximport_rtp.vim
16368a7d6542SBram Moolenaar  &rtp = save_rtp
16378a7d6542SBram Moolenaar
16388a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
16398a7d6542SBram Moolenaar
1640b3ca9824SBram Moolenaar  Undo_export_script_lines()
1641b3ca9824SBram Moolenaar  unlet g:imported_rtp
16428a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
164389483d40SBram Moolenaar  delete('import', 'rf')
16448a7d6542SBram Moolenaarenddef
16458a7d6542SBram Moolenaar
164625e0f586SBram Moolenaardef Test_import_compile_error()
1647cfcd011fSBram Moolenaar  var export_lines = [
164825e0f586SBram Moolenaar        'vim9script',
164925e0f586SBram Moolenaar        'export def ExpFunc(): string',
165025e0f586SBram Moolenaar        '  return notDefined',
165125e0f586SBram Moolenaar        'enddef',
165225e0f586SBram Moolenaar        ]
165325e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
165425e0f586SBram Moolenaar
1655cfcd011fSBram Moolenaar  var import_lines = [
165625e0f586SBram Moolenaar        'vim9script',
165725e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
165825e0f586SBram Moolenaar        'def ImpFunc()',
165925e0f586SBram Moolenaar        '  echo ExpFunc()',
166025e0f586SBram Moolenaar        'enddef',
166125e0f586SBram Moolenaar        'defcompile',
166225e0f586SBram Moolenaar        ]
166325e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
166425e0f586SBram Moolenaar
166525e0f586SBram Moolenaar  try
166625e0f586SBram Moolenaar    source Ximport.vim
166725e0f586SBram Moolenaar  catch /E1001/
1668f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
16697707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
167025e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
167125e0f586SBram Moolenaar  endtry
167225e0f586SBram Moolenaar
167325e0f586SBram Moolenaar  delete('Xexported.vim')
167425e0f586SBram Moolenaar  delete('Ximport.vim')
167525e0f586SBram Moolenaarenddef
167625e0f586SBram Moolenaar
1677c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1678cfcd011fSBram Moolenaar  var lines = [
1679c4ce36d4SBram Moolenaar        'vim9script',
1680c4ce36d4SBram Moolenaar        'def Func()',
1681c4ce36d4SBram Moolenaar        '  eval [][0]',
1682c4ce36d4SBram Moolenaar        'enddef',
1683c4ce36d4SBram Moolenaar        'Func()',
1684c4ce36d4SBram Moolenaar        ]
1685c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1686c4ce36d4SBram Moolenaar
1687c4ce36d4SBram Moolenaar  for count in range(3)
1688c4ce36d4SBram Moolenaar    try
1689c4ce36d4SBram Moolenaar      source Xtestscript.vim
1690c4ce36d4SBram Moolenaar    catch /E684/
1691c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1692c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1693c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1694c4ce36d4SBram Moolenaar    endtry
1695c4ce36d4SBram Moolenaar  endfor
1696c4ce36d4SBram Moolenaar
1697c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1698c4ce36d4SBram Moolenaarenddef
1699c4ce36d4SBram Moolenaar
1700eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1701cfcd011fSBram Moolenaar  var export_lines =<< trim END
1702eef2102eSBram Moolenaar      vim9script
1703eef2102eSBram Moolenaar      export def Func()
1704eef2102eSBram Moolenaar        echo 'imported'
1705eef2102eSBram Moolenaar      enddef
1706eef2102eSBram Moolenaar  END
1707eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1708eef2102eSBram Moolenaar
1709cfcd011fSBram Moolenaar  var lines =<< trim END
1710eef2102eSBram Moolenaar    vim9script
1711eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1712eef2102eSBram Moolenaar    def Func()
1713eef2102eSBram Moolenaar      echo 'local to function'
1714eef2102eSBram Moolenaar    enddef
1715eef2102eSBram Moolenaar  END
1716eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1717eef2102eSBram Moolenaar
1718eef2102eSBram Moolenaar  lines =<< trim END
1719eef2102eSBram Moolenaar    vim9script
1720eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1721eef2102eSBram Moolenaar    def Outer()
1722eef2102eSBram Moolenaar      def Func()
1723eef2102eSBram Moolenaar        echo 'local to function'
1724eef2102eSBram Moolenaar      enddef
1725eef2102eSBram Moolenaar    enddef
1726eef2102eSBram Moolenaar    defcompile
1727eef2102eSBram Moolenaar  END
1728eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1729eef2102eSBram Moolenaar
1730eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1731eef2102eSBram Moolenaarenddef
1732eef2102eSBram Moolenaar
1733b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1734cfcd011fSBram Moolenaar  var lines =<< trim END
1735b9a2cac3SBram Moolenaar    vim9script
1736b9a2cac3SBram Moolenaar    def Func()
1737b9a2cac3SBram Moolenaar      echo 'one'
1738b9a2cac3SBram Moolenaar    enddef
1739b9a2cac3SBram Moolenaar    def Func()
1740b9a2cac3SBram Moolenaar      echo 'two'
1741b9a2cac3SBram Moolenaar    enddef
1742b9a2cac3SBram Moolenaar  END
1743b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1744fa211f3cSBram Moolenaar
1745fa211f3cSBram Moolenaar  lines =<< trim END
1746fa211f3cSBram Moolenaar    vim9script
1747fa211f3cSBram Moolenaar    def Foo(): string
1748fa211f3cSBram Moolenaar      return 'foo'
1749fa211f3cSBram Moolenaar      enddef
1750fa211f3cSBram Moolenaar    def Func()
1751cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1752fa211f3cSBram Moolenaar    enddef
1753fa211f3cSBram Moolenaar    defcompile
1754fa211f3cSBram Moolenaar  END
1755fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1756b9a2cac3SBram Moolenaarenddef
1757b9a2cac3SBram Moolenaar
17588a7d6542SBram Moolenaardef Test_fixed_size_list()
1759f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1760cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
17618a7d6542SBram Moolenaar  l->remove(0)
17628a7d6542SBram Moolenaar  l->add(5)
17638a7d6542SBram Moolenaar  l->insert(99, 1)
17640f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
17658a7d6542SBram Moolenaarenddef
17668a7d6542SBram Moolenaar
1767ae616494SBram Moolenaardef Test_no_insert_xit()
1768d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1769d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1770d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1771d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1772d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1773ae616494SBram Moolenaar
1774ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1775ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1776ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1777ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1778f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1779f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1780f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1781f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1782f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1783ae616494SBram Moolenaarenddef
1784ae616494SBram Moolenaar
1785158906cfSBram Moolenaardef IfElse(what: number): string
1786cfcd011fSBram Moolenaar  var res = ''
1787158906cfSBram Moolenaar  if what == 1
1788158906cfSBram Moolenaar    res = "one"
1789158906cfSBram Moolenaar  elseif what == 2
1790158906cfSBram Moolenaar    res = "two"
1791a259d8d3SBram Moolenaar  else
1792158906cfSBram Moolenaar    res = "three"
1793a259d8d3SBram Moolenaar  endif
1794158906cfSBram Moolenaar  return res
1795a259d8d3SBram Moolenaarenddef
1796a259d8d3SBram Moolenaar
1797158906cfSBram Moolenaardef Test_if_elseif_else()
1798158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1799158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1800158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
18010f18b6d1SBram Moolenaarenddef
18020f18b6d1SBram Moolenaar
1803e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1804d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1805d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1806d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1807ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1808d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
18096628b7ebSBram Moolenaar
18106628b7ebSBram Moolenaar  var lines =<< trim END
18116628b7ebSBram Moolenaar      var s = ''
18126628b7ebSBram Moolenaar      if s = ''
18136628b7ebSBram Moolenaar      endif
18146628b7ebSBram Moolenaar  END
18156628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
18166628b7ebSBram Moolenaar
18176628b7ebSBram Moolenaar  lines =<< trim END
18186628b7ebSBram Moolenaar      var s = ''
18196628b7ebSBram Moolenaar      if s == ''
18206628b7ebSBram Moolenaar      elseif s = ''
18216628b7ebSBram Moolenaar      endif
18226628b7ebSBram Moolenaar  END
18236628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
1824e8c4abbbSBram Moolenaarenddef
1825e8c4abbbSBram Moolenaar
18266d69bf60SBram Moolenaarlet g:bool_true = v:true
18276d69bf60SBram Moolenaarlet g:bool_false = v:false
18286d69bf60SBram Moolenaar
18296d69bf60SBram Moolenaardef Test_if_const_expr()
1830cfcd011fSBram Moolenaar  var res = false
18316d69bf60SBram Moolenaar  if true ? true : false
18326d69bf60SBram Moolenaar    res = true
18336d69bf60SBram Moolenaar  endif
18346d69bf60SBram Moolenaar  assert_equal(true, res)
18356d69bf60SBram Moolenaar
1836585fea7bSBram Moolenaar  g:glob = 2
1837585fea7bSBram Moolenaar  if false
18386797966dSBram Moolenaar    execute('g:glob = 3')
1839585fea7bSBram Moolenaar  endif
1840585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1841585fea7bSBram Moolenaar  if true
18426797966dSBram Moolenaar    execute('g:glob = 3')
1843585fea7bSBram Moolenaar  endif
1844585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1845585fea7bSBram Moolenaar
18466d69bf60SBram Moolenaar  res = false
18476d69bf60SBram Moolenaar  if g:bool_true ? true : false
18486d69bf60SBram Moolenaar    res = true
18496d69bf60SBram Moolenaar  endif
18506d69bf60SBram Moolenaar  assert_equal(true, res)
18516d69bf60SBram Moolenaar
18526d69bf60SBram Moolenaar  res = false
18536d69bf60SBram Moolenaar  if true ? g:bool_true : false
18546d69bf60SBram Moolenaar    res = true
18556d69bf60SBram Moolenaar  endif
18566d69bf60SBram Moolenaar  assert_equal(true, res)
18576d69bf60SBram Moolenaar
18586d69bf60SBram Moolenaar  res = false
18596d69bf60SBram Moolenaar  if true ? true : g:bool_false
18606d69bf60SBram Moolenaar    res = true
18616d69bf60SBram Moolenaar  endif
18626d69bf60SBram Moolenaar  assert_equal(true, res)
18636d69bf60SBram Moolenaar
18646d69bf60SBram Moolenaar  res = false
18656d69bf60SBram Moolenaar  if true ? false : true
18666d69bf60SBram Moolenaar    res = true
18676d69bf60SBram Moolenaar  endif
18686d69bf60SBram Moolenaar  assert_equal(false, res)
18696d69bf60SBram Moolenaar
18706d69bf60SBram Moolenaar  res = false
18716d69bf60SBram Moolenaar  if false ? false : true
18726d69bf60SBram Moolenaar    res = true
18736d69bf60SBram Moolenaar  endif
18746d69bf60SBram Moolenaar  assert_equal(true, res)
18756d69bf60SBram Moolenaar
18766d69bf60SBram Moolenaar  res = false
18776d69bf60SBram Moolenaar  if false ? true : false
18786d69bf60SBram Moolenaar    res = true
18796d69bf60SBram Moolenaar  endif
18806d69bf60SBram Moolenaar  assert_equal(false, res)
18816d69bf60SBram Moolenaar
18826d69bf60SBram Moolenaar  res = false
1883e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1884e8c4abbbSBram Moolenaar    res = true
1885e8c4abbbSBram Moolenaar  endif
1886e8c4abbbSBram Moolenaar  assert_equal(false, res)
1887e8c4abbbSBram Moolenaar
1888e8c4abbbSBram Moolenaar  res = false
18896d69bf60SBram Moolenaar  if true && true
18906d69bf60SBram Moolenaar    res = true
18916d69bf60SBram Moolenaar  endif
18926d69bf60SBram Moolenaar  assert_equal(true, res)
18936d69bf60SBram Moolenaar
18946d69bf60SBram Moolenaar  res = false
18956d69bf60SBram Moolenaar  if true && false
18966d69bf60SBram Moolenaar    res = true
18976d69bf60SBram Moolenaar  endif
18986d69bf60SBram Moolenaar  assert_equal(false, res)
18996d69bf60SBram Moolenaar
19006d69bf60SBram Moolenaar  res = false
19016d69bf60SBram Moolenaar  if g:bool_true && false
19026d69bf60SBram Moolenaar    res = true
19036d69bf60SBram Moolenaar  endif
19046d69bf60SBram Moolenaar  assert_equal(false, res)
19056d69bf60SBram Moolenaar
19066d69bf60SBram Moolenaar  res = false
19076d69bf60SBram Moolenaar  if true && g:bool_false
19086d69bf60SBram Moolenaar    res = true
19096d69bf60SBram Moolenaar  endif
19106d69bf60SBram Moolenaar  assert_equal(false, res)
19116d69bf60SBram Moolenaar
19126d69bf60SBram Moolenaar  res = false
19136d69bf60SBram Moolenaar  if false && false
19146d69bf60SBram Moolenaar    res = true
19156d69bf60SBram Moolenaar  endif
19166d69bf60SBram Moolenaar  assert_equal(false, res)
19176d69bf60SBram Moolenaar
19186d69bf60SBram Moolenaar  res = false
19196d69bf60SBram Moolenaar  if true || false
19206d69bf60SBram Moolenaar    res = true
19216d69bf60SBram Moolenaar  endif
19226d69bf60SBram Moolenaar  assert_equal(true, res)
19236d69bf60SBram Moolenaar
19246d69bf60SBram Moolenaar  res = false
19256d69bf60SBram Moolenaar  if g:bool_true || false
19266d69bf60SBram Moolenaar    res = true
19276d69bf60SBram Moolenaar  endif
19286d69bf60SBram Moolenaar  assert_equal(true, res)
19296d69bf60SBram Moolenaar
19306d69bf60SBram Moolenaar  res = false
19316d69bf60SBram Moolenaar  if true || g:bool_false
19326d69bf60SBram Moolenaar    res = true
19336d69bf60SBram Moolenaar  endif
19346d69bf60SBram Moolenaar  assert_equal(true, res)
19356d69bf60SBram Moolenaar
19366d69bf60SBram Moolenaar  res = false
19376d69bf60SBram Moolenaar  if false || false
19386d69bf60SBram Moolenaar    res = true
19396d69bf60SBram Moolenaar  endif
19406d69bf60SBram Moolenaar  assert_equal(false, res)
19413988f64fSBram Moolenaar
19423988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
19433988f64fSBram Moolenaar  if false | eval 0 | endif
19443988f64fSBram Moolenaar  if false | eval burp + 234 | endif
19453988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
19463988f64fSBram Moolenaar  if false
19473988f64fSBram Moolenaar    burp
19483988f64fSBram Moolenaar  endif
194980c34ca3SBram Moolenaarenddef
19506d69bf60SBram Moolenaar
195180c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1952d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1953d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1954d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1955d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
19566d69bf60SBram Moolenaarenddef
19576d69bf60SBram Moolenaar
195872abcf42SBram Moolenaardef RunNested(i: number): number
1959cfcd011fSBram Moolenaar  var x: number = 0
196072abcf42SBram Moolenaar  if i % 2
196172abcf42SBram Moolenaar    if 1
1962f5be8cdbSBram Moolenaar      # comment
196372abcf42SBram Moolenaar    else
1964f5be8cdbSBram Moolenaar      # comment
196572abcf42SBram Moolenaar    endif
196672abcf42SBram Moolenaar    x += 1
196772abcf42SBram Moolenaar  else
196872abcf42SBram Moolenaar    x += 1000
196972abcf42SBram Moolenaar  endif
197072abcf42SBram Moolenaar  return x
197172abcf42SBram Moolenaarenddef
197272abcf42SBram Moolenaar
197372abcf42SBram Moolenaardef Test_nested_if()
197472abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
197572abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
197672abcf42SBram Moolenaarenddef
197772abcf42SBram Moolenaar
1978ad39c094SBram Moolenaardef Test_execute_cmd()
1979e4984290SBram Moolenaar  # missing argument is ignored
1980e4984290SBram Moolenaar  execute
1981e4984290SBram Moolenaar  execute # comment
1982e4984290SBram Moolenaar
1983ad39c094SBram Moolenaar  new
1984ad39c094SBram Moolenaar  setline(1, 'default')
1985d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1986ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1987a72cfb80SBram Moolenaar
1988d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1989a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1990a72cfb80SBram Moolenaar
1991cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
1992cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
1993a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1994ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1995a72cfb80SBram Moolenaar
1996d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
1997ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1998a72cfb80SBram Moolenaar
1999cfcd011fSBram Moolenaar  var cmd_first = 'call '
2000cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2001ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2002ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2003ad39c094SBram Moolenaar  bwipe!
2004585fea7bSBram Moolenaar
2005cfcd011fSBram Moolenaar  var n = true
20062d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
20072d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
20082d6b20d6SBram Moolenaar
2009e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2010e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2011e5abf7afSBram Moolenaar
2012d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2013d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2014d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2015ad39c094SBram Moolenaarenddef
2016ad39c094SBram Moolenaar
201747e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2018f5be8cdbSBram Moolenaar  # only checks line continuation
2019cfcd011fSBram Moolenaar  var lines =<< trim END
202047e880d6SBram Moolenaar      vim9script
202147e880d6SBram Moolenaar      execute 'g:someVar'
202247e880d6SBram Moolenaar                .. ' = ' ..
202347e880d6SBram Moolenaar                   '28'
202447e880d6SBram Moolenaar      assert_equal(28, g:someVar)
202547e880d6SBram Moolenaar      unlet g:someVar
202647e880d6SBram Moolenaar  END
202747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
202847e880d6SBram Moolenaarenddef
202947e880d6SBram Moolenaar
2030ad39c094SBram Moolenaardef Test_echo_cmd()
2031a72cfb80SBram Moolenaar  echo 'some' # comment
2032585fea7bSBram Moolenaar  echon 'thing'
2033ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2034ad39c094SBram Moolenaar
2035a72cfb80SBram Moolenaar  echo "some" # comment
2036a72cfb80SBram Moolenaar  echon "thing"
2037a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2038a72cfb80SBram Moolenaar
2039cfcd011fSBram Moolenaar  var str1 = 'some'
2040cfcd011fSBram Moolenaar  var str2 = 'more'
2041ad39c094SBram Moolenaar  echo str1 str2
2042ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2043a72cfb80SBram Moolenaar
2044d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2045ad39c094SBram Moolenaarenddef
2046ad39c094SBram Moolenaar
2047f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2048f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2049f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2050f93c7feaSBram Moolenaar  echo 'clear'
2051df069eecSBram Moolenaar  :1messages
2052f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2053f93c7feaSBram Moolenaar
2054d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2055f93c7feaSBram Moolenaarenddef
2056f93c7feaSBram Moolenaar
205747e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2058f5be8cdbSBram Moolenaar  # only checks line continuation
2059cfcd011fSBram Moolenaar  var lines =<< trim END
206047e880d6SBram Moolenaar      vim9script
206147e880d6SBram Moolenaar      echomsg 'here'
206247e880d6SBram Moolenaar                .. ' is ' ..
206347e880d6SBram Moolenaar                   'a message'
206447e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
206547e880d6SBram Moolenaar  END
206647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
206747e880d6SBram Moolenaarenddef
206847e880d6SBram Moolenaar
2069f93c7feaSBram Moolenaardef Test_echoerr_cmd()
207040ee466cSBram Moolenaar  try
207140ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
207240ee466cSBram Moolenaar  catch
207340ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
207440ee466cSBram Moolenaar  endtry
2075f93c7feaSBram Moolenaarenddef
2076f93c7feaSBram Moolenaar
207747e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2078f5be8cdbSBram Moolenaar  # only checks line continuation
2079cfcd011fSBram Moolenaar  var lines =<< trim END
208047e880d6SBram Moolenaar      vim9script
208147e880d6SBram Moolenaar      try
208247e880d6SBram Moolenaar        echoerr 'this'
208347e880d6SBram Moolenaar                .. ' is ' ..
208447e880d6SBram Moolenaar                   'wrong'
208547e880d6SBram Moolenaar      catch
208647e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
208747e880d6SBram Moolenaar      endtry
208847e880d6SBram Moolenaar  END
208947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
209047e880d6SBram Moolenaarenddef
209147e880d6SBram Moolenaar
209241fe0617SBram Moolenaardef Test_for_outside_of_function()
2093cfcd011fSBram Moolenaar  var lines =<< trim END
209441fe0617SBram Moolenaar    vim9script
209541fe0617SBram Moolenaar    new
209641fe0617SBram Moolenaar    for var in range(0, 3)
209741fe0617SBram Moolenaar      append(line('$'), var)
209841fe0617SBram Moolenaar    endfor
209941fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
210041fe0617SBram Moolenaar    bwipe!
210141fe0617SBram Moolenaar  END
210241fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
210341fe0617SBram Moolenaar  source Xvim9for.vim
210441fe0617SBram Moolenaar  delete('Xvim9for.vim')
210541fe0617SBram Moolenaarenddef
21068a7d6542SBram Moolenaar
2107e8c4abbbSBram Moolenaardef Test_for_loop()
2108cfcd011fSBram Moolenaar  var result = ''
2109e8c4abbbSBram Moolenaar  for cnt in range(7)
2110e8c4abbbSBram Moolenaar    if cnt == 4
2111e8c4abbbSBram Moolenaar      break
2112e8c4abbbSBram Moolenaar    endif
2113e8c4abbbSBram Moolenaar    if cnt == 2
2114e8c4abbbSBram Moolenaar      continue
2115e8c4abbbSBram Moolenaar    endif
2116e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2117e8c4abbbSBram Moolenaar  endfor
2118e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
21190ad3e894SBram Moolenaar
2120cfcd011fSBram Moolenaar  var concat = ''
21210ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
21220ad3e894SBram Moolenaar    concat ..= str
21230ad3e894SBram Moolenaar  endfor
21240ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
212538bd8de5SBram Moolenaar
212638bd8de5SBram Moolenaar  var total = 0
212738bd8de5SBram Moolenaar  for nr in
212838bd8de5SBram Moolenaar      [1, 2, 3]
212938bd8de5SBram Moolenaar    total += nr
213038bd8de5SBram Moolenaar  endfor
213138bd8de5SBram Moolenaar  assert_equal(6, total)
213238bd8de5SBram Moolenaar
213338bd8de5SBram Moolenaar  total = 0
213438bd8de5SBram Moolenaar  for nr
213538bd8de5SBram Moolenaar    in [1, 2, 3]
213638bd8de5SBram Moolenaar    total += nr
213738bd8de5SBram Moolenaar  endfor
213838bd8de5SBram Moolenaar  assert_equal(6, total)
213938bd8de5SBram Moolenaar
214038bd8de5SBram Moolenaar  total = 0
214138bd8de5SBram Moolenaar  for nr
214238bd8de5SBram Moolenaar    in
214338bd8de5SBram Moolenaar    [1, 2, 3]
214438bd8de5SBram Moolenaar    total += nr
214538bd8de5SBram Moolenaar  endfor
214638bd8de5SBram Moolenaar  assert_equal(6, total)
2147036d0714SBram Moolenaar
2148036d0714SBram Moolenaar  var res = ""
2149036d0714SBram Moolenaar  for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2150036d0714SBram Moolenaar    res ..= n .. s
2151036d0714SBram Moolenaar  endfor
2152036d0714SBram Moolenaar  assert_equal('1a2b', res)
2153e8c4abbbSBram Moolenaarenddef
2154e8c4abbbSBram Moolenaar
2155e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2156025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2157025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2158025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2159675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2160675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2161cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2162822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
21632d870f8dSBram Moolenaar  delfunc! g:Func
2164451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2165675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2166675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2167675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2168e8c4abbbSBram Moolenaarenddef
2169e8c4abbbSBram Moolenaar
2170ea87069dSBram Moolenaardef Test_for_loop_script_var()
2171ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2172ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2173ea87069dSBram Moolenaar
2174ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2175ea87069dSBram Moolenaar  var lines =<< trim END
2176ea87069dSBram Moolenaar    vim9script
2177ea87069dSBram Moolenaar    var total = 0
2178ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2179ea87069dSBram Moolenaar      total += s:var
2180ea87069dSBram Moolenaar    endfor
2181ea87069dSBram Moolenaar    assert_equal(6, total)
2182ea87069dSBram Moolenaar
2183ea87069dSBram Moolenaar    total = 0
2184ea87069dSBram Moolenaar    for var in [1, 2, 3]
2185ea87069dSBram Moolenaar      total += var
2186ea87069dSBram Moolenaar    endfor
2187ea87069dSBram Moolenaar    assert_equal(6, total)
2188ea87069dSBram Moolenaar  END
2189ea87069dSBram Moolenaarenddef
2190ea87069dSBram Moolenaar
2191792f786aSBram Moolenaardef Test_for_loop_unpack()
21924b8a0651SBram Moolenaar  var lines =<< trim END
2193792f786aSBram Moolenaar      var result = []
2194792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2195792f786aSBram Moolenaar        result->add(v1)
2196792f786aSBram Moolenaar        result->add(v2)
2197792f786aSBram Moolenaar      endfor
2198792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2199792f786aSBram Moolenaar
2200792f786aSBram Moolenaar      result = []
2201792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2202792f786aSBram Moolenaar        result->add(v1)
2203792f786aSBram Moolenaar        result->add(v2)
2204792f786aSBram Moolenaar        result->add(v3)
2205792f786aSBram Moolenaar      endfor
2206792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2207792f786aSBram Moolenaar
22084b8a0651SBram Moolenaar      result = []
22094b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
22104b8a0651SBram Moolenaar        result->add(&ts)
22114b8a0651SBram Moolenaar        result->add(&sw)
22124b8a0651SBram Moolenaar      endfor
22134b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
22144b8a0651SBram Moolenaar
22154b8a0651SBram Moolenaar      var slist: list<string>
22164b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
22174b8a0651SBram Moolenaar        slist->add($LOOPVAR)
22184b8a0651SBram Moolenaar        slist->add(@r)
22194b8a0651SBram Moolenaar        slist->add(v:errmsg)
22204b8a0651SBram Moolenaar      endfor
22214b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
22224b8a0651SBram Moolenaar
22234b8a0651SBram Moolenaar      slist = []
22244b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
22254b8a0651SBram Moolenaar        slist->add(g:globalvar)
22264b8a0651SBram Moolenaar        slist->add(b:bufvar)
22274b8a0651SBram Moolenaar        slist->add(w:winvar)
22284b8a0651SBram Moolenaar        slist->add(t:tabvar)
22294b8a0651SBram Moolenaar      endfor
22304b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2231f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
22324b8a0651SBram Moolenaar  END
22334b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
22344b8a0651SBram Moolenaar
22354b8a0651SBram Moolenaar  lines =<< trim END
2236792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2237792f786aSBram Moolenaar        echo v1 v2
2238792f786aSBram Moolenaar      endfor
2239792f786aSBram Moolenaar  END
2240792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2241792f786aSBram Moolenaar
2242792f786aSBram Moolenaar  lines =<< trim END
2243792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2244792f786aSBram Moolenaar        echo v1 v2
2245792f786aSBram Moolenaar      endfor
2246792f786aSBram Moolenaar  END
2247792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2248792f786aSBram Moolenaar
2249792f786aSBram Moolenaar  lines =<< trim END
2250792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2251792f786aSBram Moolenaar        echo v1
2252792f786aSBram Moolenaar      endfor
2253792f786aSBram Moolenaar  END
2254792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2255792f786aSBram Moolenaarenddef
2256792f786aSBram Moolenaar
2257c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2258c150c09eSBram Moolenaar  var looped = 0
2259c150c09eSBram Moolenaar  var cleanup = 0
2260c150c09eSBram Moolenaar  for i in range(3)
2261c150c09eSBram Moolenaar    looped += 1
2262c150c09eSBram Moolenaar    try
2263c150c09eSBram Moolenaar      eval [][0]
2264c150c09eSBram Moolenaar    catch
2265c150c09eSBram Moolenaar      continue
2266c150c09eSBram Moolenaar    finally
2267c150c09eSBram Moolenaar      cleanup += 1
2268c150c09eSBram Moolenaar    endtry
2269c150c09eSBram Moolenaar  endfor
2270c150c09eSBram Moolenaar  assert_equal(3, looped)
2271c150c09eSBram Moolenaar  assert_equal(3, cleanup)
2272c150c09eSBram Moolenaarenddef
2273c150c09eSBram Moolenaar
2274d0df1aacSBram Moolenaardef Test_while_loop()
2275cfcd011fSBram Moolenaar  var result = ''
2276cfcd011fSBram Moolenaar  var cnt = 0
2277d0df1aacSBram Moolenaar  while cnt < 555
2278d0df1aacSBram Moolenaar    if cnt == 3
2279d0df1aacSBram Moolenaar      break
2280d0df1aacSBram Moolenaar    endif
2281d0df1aacSBram Moolenaar    cnt += 1
2282d0df1aacSBram Moolenaar    if cnt == 2
2283d0df1aacSBram Moolenaar      continue
2284d0df1aacSBram Moolenaar    endif
2285d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2286d0df1aacSBram Moolenaar  endwhile
2287d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2288dee37dc7SBram Moolenaar
2289dee37dc7SBram Moolenaar  var s = ''
22900123cc1eSBram Moolenaar  while s == 'x' #{comment}
2291dee37dc7SBram Moolenaar  endwhile
2292d0df1aacSBram Moolenaarenddef
2293d0df1aacSBram Moolenaar
2294e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2295675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2296675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2297675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2298675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2299675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2300675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2301675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
23026628b7ebSBram Moolenaar
23036628b7ebSBram Moolenaar  var lines =<< trim END
23046628b7ebSBram Moolenaar      var s = ''
23056628b7ebSBram Moolenaar      while s = ''
23066628b7ebSBram Moolenaar      endwhile
23076628b7ebSBram Moolenaar  END
23086628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2309bd5da371SBram Moolenaarenddef
2310bd5da371SBram Moolenaar
23119645e2d9SBram Moolenaardef Test_interrupt_loop()
2312cfcd011fSBram Moolenaar  var caught = false
2313cfcd011fSBram Moolenaar  var x = 0
231497acfc78SBram Moolenaar  try
23159645e2d9SBram Moolenaar    while 1
23169645e2d9SBram Moolenaar      x += 1
23179645e2d9SBram Moolenaar      if x == 100
23189645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
23199645e2d9SBram Moolenaar      endif
23209645e2d9SBram Moolenaar    endwhile
232197acfc78SBram Moolenaar  catch
232297acfc78SBram Moolenaar    caught = true
232397acfc78SBram Moolenaar    assert_equal(100, x)
232497acfc78SBram Moolenaar  endtry
232597acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
232625859dd7SBram Moolenaar  # consume the CTRL-C
232725859dd7SBram Moolenaar  getchar(0)
23289645e2d9SBram Moolenaarenddef
232920431c9dSBram Moolenaar
23304fdae999SBram Moolenaardef Test_automatic_line_continuation()
2331cfcd011fSBram Moolenaar  var mylist = [
23324fdae999SBram Moolenaar      'one',
23334fdae999SBram Moolenaar      'two',
23344fdae999SBram Moolenaar      'three',
2335f5be8cdbSBram Moolenaar      ] # comment
23364fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
23374fdae999SBram Moolenaar
2338cfcd011fSBram Moolenaar  var mydict = {
2339e0de171eSBram Moolenaar      ['one']: 1,
2340e0de171eSBram Moolenaar      ['two']: 2,
2341e0de171eSBram Moolenaar      ['three']:
23424fdae999SBram Moolenaar          3,
2343f5be8cdbSBram Moolenaar      } # comment
2344e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2345e0de171eSBram Moolenaar  mydict = {
23462c330432SBram Moolenaar      one: 1,  # comment
23472c330432SBram Moolenaar      two:     # comment
23482c330432SBram Moolenaar           2,  # comment
23492c330432SBram Moolenaar      three: 3 # comment
23502c330432SBram Moolenaar      }
2351e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2352e0de171eSBram Moolenaar  mydict = {
23532c330432SBram Moolenaar      one: 1,
23544fdae999SBram Moolenaar      two:
23554fdae999SBram Moolenaar           2,
23562c330432SBram Moolenaar      three: 3
23574fdae999SBram Moolenaar      }
2358e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2359e6085c53SBram Moolenaar
2360e6085c53SBram Moolenaar  assert_equal(
2361e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2362e6085c53SBram Moolenaar        split('one two three')
2363e6085c53SBram Moolenaar        )
23644fdae999SBram Moolenaarenddef
23654fdae999SBram Moolenaar
23667a092245SBram Moolenaardef Test_vim9_comment()
23677a092245SBram Moolenaar  CheckScriptSuccess([
23687a092245SBram Moolenaar      'vim9script',
23697a092245SBram Moolenaar      '# something',
237093f82cbeSBram Moolenaar      '#something',
237193f82cbeSBram Moolenaar      '#{something',
23727a092245SBram Moolenaar      ])
237393f82cbeSBram Moolenaar
237493f82cbeSBram Moolenaar  split Xfile
237593f82cbeSBram Moolenaar  CheckScriptSuccess([
237693f82cbeSBram Moolenaar      'vim9script',
237793f82cbeSBram Moolenaar      'edit #something',
237893f82cbeSBram Moolenaar      ])
237993f82cbeSBram Moolenaar  CheckScriptSuccess([
238093f82cbeSBram Moolenaar      'vim9script',
238193f82cbeSBram Moolenaar      'edit #{something',
238293f82cbeSBram Moolenaar      ])
238393f82cbeSBram Moolenaar  close
238493f82cbeSBram Moolenaar
23857a092245SBram Moolenaar  CheckScriptFailure([
23867a092245SBram Moolenaar      'vim9script',
23877a092245SBram Moolenaar      ':# something',
23887a092245SBram Moolenaar      ], 'E488:')
23897a092245SBram Moolenaar  CheckScriptFailure([
23907a092245SBram Moolenaar      '# something',
23917a092245SBram Moolenaar      ], 'E488:')
23927a092245SBram Moolenaar  CheckScriptFailure([
23937a092245SBram Moolenaar      ':# something',
23947a092245SBram Moolenaar      ], 'E488:')
23957a092245SBram Moolenaar
23964a8d9f2eSBram Moolenaar  { # block start
23974a8d9f2eSBram Moolenaar  } # block end
23984a8d9f2eSBram Moolenaar  CheckDefFailure([
23994a8d9f2eSBram Moolenaar      '{# comment',
24004a8d9f2eSBram Moolenaar      ], 'E488:')
24014a8d9f2eSBram Moolenaar  CheckDefFailure([
24024a8d9f2eSBram Moolenaar      '{',
24034a8d9f2eSBram Moolenaar      '}# comment',
24044a8d9f2eSBram Moolenaar      ], 'E488:')
24054a8d9f2eSBram Moolenaar
24064a8d9f2eSBram Moolenaar  echo "yes" # comment
24074a8d9f2eSBram Moolenaar  CheckDefFailure([
24084a8d9f2eSBram Moolenaar      'echo "yes"# comment',
24094a8d9f2eSBram Moolenaar      ], 'E488:')
24107a092245SBram Moolenaar  CheckScriptSuccess([
24117a092245SBram Moolenaar      'vim9script',
24127a092245SBram Moolenaar      'echo "yes" # something',
24137a092245SBram Moolenaar      ])
24147a092245SBram Moolenaar  CheckScriptFailure([
24157a092245SBram Moolenaar      'vim9script',
24167a092245SBram Moolenaar      'echo "yes"# something',
24177a092245SBram Moolenaar      ], 'E121:')
24187a092245SBram Moolenaar  CheckScriptFailure([
24197a092245SBram Moolenaar      'vim9script',
24207a092245SBram Moolenaar      'echo# something',
2421f8103f27SBram Moolenaar      ], 'E1144:')
24227a092245SBram Moolenaar  CheckScriptFailure([
24237a092245SBram Moolenaar      'echo "yes" # something',
24247a092245SBram Moolenaar      ], 'E121:')
24257a092245SBram Moolenaar
24264a8d9f2eSBram Moolenaar  exe "echo" # comment
24274a8d9f2eSBram Moolenaar  CheckDefFailure([
24284a8d9f2eSBram Moolenaar      'exe "echo"# comment',
24294a8d9f2eSBram Moolenaar      ], 'E488:')
24304a8d9f2eSBram Moolenaar  CheckScriptSuccess([
24314a8d9f2eSBram Moolenaar      'vim9script',
24324a8d9f2eSBram Moolenaar      'exe "echo" # something',
24334a8d9f2eSBram Moolenaar      ])
24344a8d9f2eSBram Moolenaar  CheckScriptFailure([
24354a8d9f2eSBram Moolenaar      'vim9script',
24364a8d9f2eSBram Moolenaar      'exe "echo"# something',
24374a8d9f2eSBram Moolenaar      ], 'E121:')
24384a8d9f2eSBram Moolenaar  CheckScriptFailure([
24394a8d9f2eSBram Moolenaar      'vim9script',
24404a8d9f2eSBram Moolenaar      'exe# something',
2441f8103f27SBram Moolenaar      ], 'E1144:')
24424a8d9f2eSBram Moolenaar  CheckScriptFailure([
24434a8d9f2eSBram Moolenaar      'exe "echo" # something',
24444a8d9f2eSBram Moolenaar      ], 'E121:')
24454a8d9f2eSBram Moolenaar
24467a092245SBram Moolenaar  CheckDefFailure([
24477a092245SBram Moolenaar      'try# comment',
24487a092245SBram Moolenaar      '  echo "yes"',
24497a092245SBram Moolenaar      'catch',
24507a092245SBram Moolenaar      'endtry',
2451f8103f27SBram Moolenaar      ], 'E1144:')
24522c5ed4e3SBram Moolenaar  CheckScriptFailure([
24532c5ed4e3SBram Moolenaar      'vim9script',
24542c5ed4e3SBram Moolenaar      'try# comment',
24552c5ed4e3SBram Moolenaar      'echo "yes"',
2456f8103f27SBram Moolenaar      ], 'E1144:')
24577a092245SBram Moolenaar  CheckDefFailure([
24587a092245SBram Moolenaar      'try',
2459a72cfb80SBram Moolenaar      '  throw#comment',
2460a72cfb80SBram Moolenaar      'catch',
2461a72cfb80SBram Moolenaar      'endtry',
2462f8103f27SBram Moolenaar      ], 'E1144:')
2463a72cfb80SBram Moolenaar  CheckDefFailure([
2464a72cfb80SBram Moolenaar      'try',
2465a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2466a72cfb80SBram Moolenaar      'catch',
2467a72cfb80SBram Moolenaar      'endtry',
2468a72cfb80SBram Moolenaar      ], 'E488:')
2469a72cfb80SBram Moolenaar  CheckDefFailure([
2470a72cfb80SBram Moolenaar      'try',
24717a092245SBram Moolenaar      '  echo "yes"',
24727a092245SBram Moolenaar      'catch# comment',
24737a092245SBram Moolenaar      'endtry',
2474f8103f27SBram Moolenaar      ], 'E1144:')
24752c5ed4e3SBram Moolenaar  CheckScriptFailure([
24762c5ed4e3SBram Moolenaar      'vim9script',
24772c5ed4e3SBram Moolenaar      'try',
24782c5ed4e3SBram Moolenaar      '  echo "yes"',
24792c5ed4e3SBram Moolenaar      'catch# comment',
24802c5ed4e3SBram Moolenaar      'endtry',
2481f8103f27SBram Moolenaar      ], 'E1144:')
24822c5ed4e3SBram Moolenaar  CheckDefFailure([
24832c5ed4e3SBram Moolenaar      'try',
24842c5ed4e3SBram Moolenaar      '  echo "yes"',
24852c5ed4e3SBram Moolenaar      'catch /pat/# comment',
24862c5ed4e3SBram Moolenaar      'endtry',
24872c5ed4e3SBram Moolenaar      ], 'E488:')
24887a092245SBram Moolenaar  CheckDefFailure([
24897a092245SBram Moolenaar      'try',
24907a092245SBram Moolenaar      'echo "yes"',
24917a092245SBram Moolenaar      'catch',
24927a092245SBram Moolenaar      'endtry# comment',
2493f8103f27SBram Moolenaar      ], 'E1144:')
24942c5ed4e3SBram Moolenaar  CheckScriptFailure([
24952c5ed4e3SBram Moolenaar      'vim9script',
24962c5ed4e3SBram Moolenaar      'try',
24972c5ed4e3SBram Moolenaar      '  echo "yes"',
24982c5ed4e3SBram Moolenaar      'catch',
24992c5ed4e3SBram Moolenaar      'endtry# comment',
2500f8103f27SBram Moolenaar      ], 'E1144:')
25012c5ed4e3SBram Moolenaar
25022c5ed4e3SBram Moolenaar  CheckScriptSuccess([
25032c5ed4e3SBram Moolenaar      'vim9script',
25042c5ed4e3SBram Moolenaar      'hi # comment',
25052c5ed4e3SBram Moolenaar      ])
25062c5ed4e3SBram Moolenaar  CheckScriptFailure([
25072c5ed4e3SBram Moolenaar      'vim9script',
25082c5ed4e3SBram Moolenaar      'hi# comment',
2509f8103f27SBram Moolenaar      ], 'E1144:')
25101966c248SBram Moolenaar  CheckScriptSuccess([
25111966c248SBram Moolenaar      'vim9script',
25121966c248SBram Moolenaar      'hi Search # comment',
25131966c248SBram Moolenaar      ])
25141966c248SBram Moolenaar  CheckScriptFailure([
25151966c248SBram Moolenaar      'vim9script',
25161966c248SBram Moolenaar      'hi Search# comment',
25171966c248SBram Moolenaar      ], 'E416:')
25181966c248SBram Moolenaar  CheckScriptSuccess([
25191966c248SBram Moolenaar      'vim9script',
25201966c248SBram Moolenaar      'hi link This Search # comment',
25211966c248SBram Moolenaar      ])
25221966c248SBram Moolenaar  CheckScriptFailure([
25231966c248SBram Moolenaar      'vim9script',
25241966c248SBram Moolenaar      'hi link This That# comment',
25251966c248SBram Moolenaar      ], 'E413:')
25261966c248SBram Moolenaar  CheckScriptSuccess([
25271966c248SBram Moolenaar      'vim9script',
25281966c248SBram Moolenaar      'hi clear This # comment',
25291966c248SBram Moolenaar      'hi clear # comment',
25301966c248SBram Moolenaar      ])
2531f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2532f5be8cdbSBram Moolenaar  # hi clear This# comment',
25331966c248SBram Moolenaar  CheckScriptFailure([
25341966c248SBram Moolenaar      'vim9script',
25351966c248SBram Moolenaar      'hi clear# comment',
25361966c248SBram Moolenaar      ], 'E416:')
25371966c248SBram Moolenaar
25381966c248SBram Moolenaar  CheckScriptSuccess([
25391966c248SBram Moolenaar      'vim9script',
25401966c248SBram Moolenaar      'hi Group term=bold',
25411966c248SBram Moolenaar      'match Group /todo/ # comment',
25421966c248SBram Moolenaar      ])
25431966c248SBram Moolenaar  CheckScriptFailure([
25441966c248SBram Moolenaar      'vim9script',
25451966c248SBram Moolenaar      'hi Group term=bold',
25461966c248SBram Moolenaar      'match Group /todo/# comment',
25471966c248SBram Moolenaar      ], 'E488:')
25481966c248SBram Moolenaar  CheckScriptSuccess([
25491966c248SBram Moolenaar      'vim9script',
25501966c248SBram Moolenaar      'match # comment',
25511966c248SBram Moolenaar      ])
25521966c248SBram Moolenaar  CheckScriptFailure([
25531966c248SBram Moolenaar      'vim9script',
25541966c248SBram Moolenaar      'match# comment',
2555f8103f27SBram Moolenaar      ], 'E1144:')
25561966c248SBram Moolenaar  CheckScriptSuccess([
25571966c248SBram Moolenaar      'vim9script',
25581966c248SBram Moolenaar      'match none # comment',
25591966c248SBram Moolenaar      ])
25601966c248SBram Moolenaar  CheckScriptFailure([
25611966c248SBram Moolenaar      'vim9script',
25621966c248SBram Moolenaar      'match none# comment',
25631966c248SBram Moolenaar      ], 'E475:')
25641966c248SBram Moolenaar
25651966c248SBram Moolenaar  CheckScriptSuccess([
25661966c248SBram Moolenaar      'vim9script',
25671966c248SBram Moolenaar      'menutrans clear # comment',
25681966c248SBram Moolenaar      ])
25691966c248SBram Moolenaar  CheckScriptFailure([
25701966c248SBram Moolenaar      'vim9script',
25711966c248SBram Moolenaar      'menutrans clear# comment text',
25721966c248SBram Moolenaar      ], 'E474:')
25731966c248SBram Moolenaar
25741966c248SBram Moolenaar  CheckScriptSuccess([
25751966c248SBram Moolenaar      'vim9script',
25761966c248SBram Moolenaar      'syntax clear # comment',
25771966c248SBram Moolenaar      ])
25781966c248SBram Moolenaar  CheckScriptFailure([
25791966c248SBram Moolenaar      'vim9script',
25801966c248SBram Moolenaar      'syntax clear# comment text',
25811966c248SBram Moolenaar      ], 'E28:')
25821966c248SBram Moolenaar  CheckScriptSuccess([
25831966c248SBram Moolenaar      'vim9script',
25841966c248SBram Moolenaar      'syntax keyword Word some',
25851966c248SBram Moolenaar      'syntax clear Word # comment',
25861966c248SBram Moolenaar      ])
25871966c248SBram Moolenaar  CheckScriptFailure([
25881966c248SBram Moolenaar      'vim9script',
25891966c248SBram Moolenaar      'syntax keyword Word some',
25901966c248SBram Moolenaar      'syntax clear Word# comment text',
25911966c248SBram Moolenaar      ], 'E28:')
25921966c248SBram Moolenaar
25931966c248SBram Moolenaar  CheckScriptSuccess([
25941966c248SBram Moolenaar      'vim9script',
25951966c248SBram Moolenaar      'syntax list # comment',
25961966c248SBram Moolenaar      ])
25971966c248SBram Moolenaar  CheckScriptFailure([
25981966c248SBram Moolenaar      'vim9script',
25991966c248SBram Moolenaar      'syntax list# comment text',
26001966c248SBram Moolenaar      ], 'E28:')
26011966c248SBram Moolenaar
26021966c248SBram Moolenaar  CheckScriptSuccess([
26031966c248SBram Moolenaar      'vim9script',
26041966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
26051966c248SBram Moolenaar      ])
26061966c248SBram Moolenaar  CheckScriptFailure([
26071966c248SBram Moolenaar      'vim9script',
26081966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
26091966c248SBram Moolenaar      ], 'E475:')
26101966c248SBram Moolenaar
26111966c248SBram Moolenaar  CheckScriptSuccess([
26121966c248SBram Moolenaar      'vim9script',
26131966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
26141966c248SBram Moolenaar      ])
26151966c248SBram Moolenaar  CheckScriptFailure([
26161966c248SBram Moolenaar      'vim9script',
26171966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
26181966c248SBram Moolenaar      ], 'E789:')
26191966c248SBram Moolenaar
26201966c248SBram Moolenaar  CheckScriptSuccess([
26211966c248SBram Moolenaar      'vim9script',
26221966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
26231966c248SBram Moolenaar      ])
26241966c248SBram Moolenaar  CheckScriptFailure([
26251966c248SBram Moolenaar      'vim9script',
26261966c248SBram Moolenaar      'syntax match Word /pat/# comment',
26271966c248SBram Moolenaar      ], 'E402:')
26281966c248SBram Moolenaar
26291966c248SBram Moolenaar  CheckScriptSuccess([
26301966c248SBram Moolenaar      'vim9script',
26311966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
26321966c248SBram Moolenaar      ])
26331966c248SBram Moolenaar  CheckScriptFailure([
26341966c248SBram Moolenaar      'vim9script',
26351966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
26361966c248SBram Moolenaar      ], 'E475:')
26371966c248SBram Moolenaar  CheckScriptFailure([
26381966c248SBram Moolenaar      'vim9script',
26391966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
26401966c248SBram Moolenaar      ], 'E406:')
26411966c248SBram Moolenaar  CheckScriptFailure([
26421966c248SBram Moolenaar      'vim9script',
26431966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
26441966c248SBram Moolenaar      ], 'E475:')
26451966c248SBram Moolenaar
26461966c248SBram Moolenaar  CheckScriptSuccess([
26471966c248SBram Moolenaar      'vim9script',
26481966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
26491966c248SBram Moolenaar      ])
26501966c248SBram Moolenaar  CheckScriptFailure([
26511966c248SBram Moolenaar      'vim9script',
26521966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2653d032f34aSBram Moolenaar      ], 'E402:')
26541966c248SBram Moolenaar
26551966c248SBram Moolenaar  CheckScriptSuccess([
26561966c248SBram Moolenaar      'vim9script',
26571966c248SBram Moolenaar      'syntax sync # comment',
26581966c248SBram Moolenaar      ])
26591966c248SBram Moolenaar  CheckScriptFailure([
26601966c248SBram Moolenaar      'vim9script',
26611966c248SBram Moolenaar      'syntax sync# comment',
26621966c248SBram Moolenaar      ], 'E404:')
26631966c248SBram Moolenaar  CheckScriptSuccess([
26641966c248SBram Moolenaar      'vim9script',
26651966c248SBram Moolenaar      'syntax sync ccomment # comment',
26661966c248SBram Moolenaar      ])
26671966c248SBram Moolenaar  CheckScriptFailure([
26681966c248SBram Moolenaar      'vim9script',
26691966c248SBram Moolenaar      'syntax sync ccomment# comment',
26701966c248SBram Moolenaar      ], 'E404:')
26711966c248SBram Moolenaar
26721966c248SBram Moolenaar  CheckScriptSuccess([
26731966c248SBram Moolenaar      'vim9script',
26741966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
26751966c248SBram Moolenaar      ])
26761966c248SBram Moolenaar  CheckScriptFailure([
26771966c248SBram Moolenaar      'vim9script',
26781966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
26791966c248SBram Moolenaar      ], 'E475:')
2680a72cfb80SBram Moolenaar
2681a72cfb80SBram Moolenaar  CheckScriptSuccess([
2682a72cfb80SBram Moolenaar      'vim9script',
2683a72cfb80SBram Moolenaar      'command Echo echo # comment',
2684a72cfb80SBram Moolenaar      'command Echo # comment',
26852d870f8dSBram Moolenaar      'delcommand Echo',
2686a72cfb80SBram Moolenaar      ])
2687a72cfb80SBram Moolenaar  CheckScriptFailure([
2688a72cfb80SBram Moolenaar      'vim9script',
2689a72cfb80SBram Moolenaar      'command Echo echo# comment',
2690a72cfb80SBram Moolenaar      'Echo',
2691f8103f27SBram Moolenaar      ], 'E1144:')
26922d870f8dSBram Moolenaar  delcommand Echo
269370249ee8SBram Moolenaar
269470249ee8SBram Moolenaar  var curdir = getcwd()
269570249ee8SBram Moolenaar  CheckScriptSuccess([
269670249ee8SBram Moolenaar      'command Echo cd " comment',
269770249ee8SBram Moolenaar      'Echo',
269870249ee8SBram Moolenaar      'delcommand Echo',
269970249ee8SBram Moolenaar      ])
270070249ee8SBram Moolenaar  CheckScriptSuccess([
2701090728adSBram Moolenaar      'vim9script',
270270249ee8SBram Moolenaar      'command Echo cd # comment',
270370249ee8SBram Moolenaar      'Echo',
270470249ee8SBram Moolenaar      'delcommand Echo',
270570249ee8SBram Moolenaar      ])
270670249ee8SBram Moolenaar  CheckScriptFailure([
270770249ee8SBram Moolenaar      'vim9script',
270870249ee8SBram Moolenaar      'command Echo cd " comment',
270970249ee8SBram Moolenaar      'Echo',
271070249ee8SBram Moolenaar      ], 'E344:')
271170249ee8SBram Moolenaar  delcommand Echo
271270249ee8SBram Moolenaar  chdir(curdir)
271370249ee8SBram Moolenaar
2714a72cfb80SBram Moolenaar  CheckScriptFailure([
2715a72cfb80SBram Moolenaar      'vim9script',
2716a72cfb80SBram Moolenaar      'command Echo# comment',
2717a72cfb80SBram Moolenaar      ], 'E182:')
2718a72cfb80SBram Moolenaar  CheckScriptFailure([
2719a72cfb80SBram Moolenaar      'vim9script',
2720a72cfb80SBram Moolenaar      'command Echo echo',
2721a72cfb80SBram Moolenaar      'command Echo# comment',
2722a72cfb80SBram Moolenaar      ], 'E182:')
27232d870f8dSBram Moolenaar  delcommand Echo
2724a72cfb80SBram Moolenaar
2725a72cfb80SBram Moolenaar  CheckScriptSuccess([
2726a72cfb80SBram Moolenaar      'vim9script',
2727a72cfb80SBram Moolenaar      'function # comment',
2728a72cfb80SBram Moolenaar      ])
2729a72cfb80SBram Moolenaar  CheckScriptFailure([
2730a72cfb80SBram Moolenaar      'vim9script',
27319898107fSBram Moolenaar      'function " comment',
27329898107fSBram Moolenaar      ], 'E129:')
27339898107fSBram Moolenaar  CheckScriptFailure([
27349898107fSBram Moolenaar      'vim9script',
2735a72cfb80SBram Moolenaar      'function# comment',
2736f8103f27SBram Moolenaar      ], 'E1144:')
2737a72cfb80SBram Moolenaar  CheckScriptSuccess([
2738a72cfb80SBram Moolenaar      'vim9script',
2739a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2740a72cfb80SBram Moolenaar      ])
2741a72cfb80SBram Moolenaar  CheckScriptFailure([
2742a72cfb80SBram Moolenaar      'vim9script',
2743a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2744a72cfb80SBram Moolenaar      ], 'E488:')
2745a72cfb80SBram Moolenaar
2746a72cfb80SBram Moolenaar  CheckScriptSuccess([
2747a72cfb80SBram Moolenaar      'vim9script',
27484c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2749a72cfb80SBram Moolenaar      'endfunc',
27504c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2751a72cfb80SBram Moolenaar      ])
2752a72cfb80SBram Moolenaar  CheckScriptFailure([
2753a72cfb80SBram Moolenaar      'vim9script',
27544c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2755a72cfb80SBram Moolenaar      'endfunc',
27564c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2757a72cfb80SBram Moolenaar      ], 'E488:')
2758a72cfb80SBram Moolenaar
2759a72cfb80SBram Moolenaar  CheckScriptSuccess([
2760a72cfb80SBram Moolenaar      'vim9script',
2761a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2762a72cfb80SBram Moolenaar      ])
2763a72cfb80SBram Moolenaar  CheckScriptFailure([
2764a72cfb80SBram Moolenaar      'vim9script',
2765a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2766a72cfb80SBram Moolenaar      ], 'E488:')
2767e7e4838fSBram Moolenaar
2768e7e4838fSBram Moolenaar  CheckScriptFailure([
2769e7e4838fSBram Moolenaar      'def Test() " comment',
2770e7e4838fSBram Moolenaar      'enddef',
2771e7e4838fSBram Moolenaar      ], 'E488:')
2772e7e4838fSBram Moolenaar  CheckScriptFailure([
2773e7e4838fSBram Moolenaar      'vim9script',
2774e7e4838fSBram Moolenaar      'def Test() " comment',
2775e7e4838fSBram Moolenaar      'enddef',
2776e7e4838fSBram Moolenaar      ], 'E488:')
2777e7e4838fSBram Moolenaar
2778e7e4838fSBram Moolenaar  CheckScriptSuccess([
2779e7e4838fSBram Moolenaar      'func Test() " comment',
2780e7e4838fSBram Moolenaar      'endfunc',
27812d870f8dSBram Moolenaar      'delfunc Test',
2782e7e4838fSBram Moolenaar      ])
27839898107fSBram Moolenaar  CheckScriptSuccess([
2784e7e4838fSBram Moolenaar      'vim9script',
2785e7e4838fSBram Moolenaar      'func Test() " comment',
2786e7e4838fSBram Moolenaar      'endfunc',
27879898107fSBram Moolenaar      ])
2788e7e4838fSBram Moolenaar
2789e7e4838fSBram Moolenaar  CheckScriptSuccess([
2790e7e4838fSBram Moolenaar      'def Test() # comment',
2791e7e4838fSBram Moolenaar      'enddef',
2792e7e4838fSBram Moolenaar      ])
2793e7e4838fSBram Moolenaar  CheckScriptFailure([
2794e7e4838fSBram Moolenaar      'func Test() # comment',
2795e7e4838fSBram Moolenaar      'endfunc',
2796e7e4838fSBram Moolenaar      ], 'E488:')
27972c5ed4e3SBram Moolenaarenddef
27982c5ed4e3SBram Moolenaar
27992c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
28002c5ed4e3SBram Moolenaar  CheckCanRunGui
28012c5ed4e3SBram Moolenaar
28022c5ed4e3SBram Moolenaar  CheckScriptFailure([
28032c5ed4e3SBram Moolenaar      'vim9script',
28042c5ed4e3SBram Moolenaar      'gui#comment'
2805f8103f27SBram Moolenaar      ], 'E1144:')
28062c5ed4e3SBram Moolenaar  CheckScriptFailure([
28072c5ed4e3SBram Moolenaar      'vim9script',
28082c5ed4e3SBram Moolenaar      'gui -f#comment'
28092c5ed4e3SBram Moolenaar      ], 'E499:')
28107a092245SBram Moolenaarenddef
28117a092245SBram Moolenaar
2812a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
28136797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
28146797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2815a26b9700SBram Moolenaar
2816a26b9700SBram Moolenaar  edit test.vim
2817a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2818a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2819a26b9700SBram Moolenaar
2820a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2821a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2822a26b9700SBram Moolenaar
2823a26b9700SBram Moolenaar  g:entered = 0
2824a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2825a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2826a26b9700SBram Moolenaar
2827a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2828a26b9700SBram Moolenaar
2829a26b9700SBram Moolenaar  au! TabEnter
2830a26b9700SBram Moolenaar  unlet g:entered
2831d72c1bf0SBram Moolenaar
2832d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2833d72c1bf0SBram Moolenaar      'vim9script',
28346797966dSBram Moolenaar      'g:var = 123',
2835e55b1c09SBram Moolenaar      'b:var = 456',
2836e55b1c09SBram Moolenaar      'w:var = 777',
2837e55b1c09SBram Moolenaar      't:var = 888',
2838d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2839d72c1bf0SBram Moolenaar      ])
2840d72c1bf0SBram Moolenaar
2841d72c1bf0SBram Moolenaar  CheckScriptFailure([
2842d72c1bf0SBram Moolenaar      'vim9script',
2843cfcd011fSBram Moolenaar      'let var = 123',
2844cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2845cfcd011fSBram Moolenaar
2846cfcd011fSBram Moolenaar  CheckScriptFailure([
2847cfcd011fSBram Moolenaar      'vim9script',
2848cfcd011fSBram Moolenaar      'var g:var = 123',
2849e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2850e55b1c09SBram Moolenaar
2851e55b1c09SBram Moolenaar  CheckScriptFailure([
2852e55b1c09SBram Moolenaar      'vim9script',
2853cfcd011fSBram Moolenaar      'var b:var = 123',
2854e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2855e55b1c09SBram Moolenaar
2856e55b1c09SBram Moolenaar  CheckScriptFailure([
2857e55b1c09SBram Moolenaar      'vim9script',
2858cfcd011fSBram Moolenaar      'var w:var = 123',
2859e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2860e55b1c09SBram Moolenaar
2861e55b1c09SBram Moolenaar  CheckScriptFailure([
2862e55b1c09SBram Moolenaar      'vim9script',
2863cfcd011fSBram Moolenaar      'var t:var = 123',
2864e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2865e55b1c09SBram Moolenaar
2866e55b1c09SBram Moolenaar  CheckScriptFailure([
2867e55b1c09SBram Moolenaar      'vim9script',
2868cfcd011fSBram Moolenaar      'var v:version = 123',
2869e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2870e55b1c09SBram Moolenaar
2871e55b1c09SBram Moolenaar  CheckScriptFailure([
2872e55b1c09SBram Moolenaar      'vim9script',
2873cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2874e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
28756797966dSBram Moolenaar
28766797966dSBram Moolenaar  CheckScriptFailure([
28776797966dSBram Moolenaar      'vim9script',
28786797966dSBram Moolenaar      'g:var = 123',
287932e35117SBram Moolenaar      'unlet g:var# comment1',
2880d72c1bf0SBram Moolenaar      ], 'E108:')
2881d72c1bf0SBram Moolenaar
2882d72c1bf0SBram Moolenaar  CheckScriptFailure([
2883d72c1bf0SBram Moolenaar      'let g:var = 123',
2884d72c1bf0SBram Moolenaar      'unlet g:var # something',
2885d72c1bf0SBram Moolenaar      ], 'E488:')
2886faac4104SBram Moolenaar
2887faac4104SBram Moolenaar  CheckScriptSuccess([
2888faac4104SBram Moolenaar      'vim9script',
288932e35117SBram Moolenaar      'if 1 # comment2',
2890faac4104SBram Moolenaar      '  echo "yes"',
2891faac4104SBram Moolenaar      'elseif 2 #comment',
2892faac4104SBram Moolenaar      '  echo "no"',
2893faac4104SBram Moolenaar      'endif',
2894faac4104SBram Moolenaar      ])
2895faac4104SBram Moolenaar
2896faac4104SBram Moolenaar  CheckScriptFailure([
2897faac4104SBram Moolenaar      'vim9script',
289832e35117SBram Moolenaar      'if 1# comment3',
2899faac4104SBram Moolenaar      '  echo "yes"',
2900faac4104SBram Moolenaar      'endif',
2901faac4104SBram Moolenaar      ], 'E15:')
2902faac4104SBram Moolenaar
2903faac4104SBram Moolenaar  CheckScriptFailure([
2904faac4104SBram Moolenaar      'vim9script',
290532e35117SBram Moolenaar      'if 0 # comment4',
2906faac4104SBram Moolenaar      '  echo "yes"',
2907faac4104SBram Moolenaar      'elseif 2#comment',
2908faac4104SBram Moolenaar      '  echo "no"',
2909faac4104SBram Moolenaar      'endif',
2910faac4104SBram Moolenaar      ], 'E15:')
2911faac4104SBram Moolenaar
2912faac4104SBram Moolenaar  CheckScriptSuccess([
2913faac4104SBram Moolenaar      'vim9script',
2914cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2915faac4104SBram Moolenaar      ])
2916faac4104SBram Moolenaar
2917faac4104SBram Moolenaar  CheckScriptFailure([
2918faac4104SBram Moolenaar      'vim9script',
2919cfcd011fSBram Moolenaar      'var v = 1# comment6',
292032e35117SBram Moolenaar      ], 'E15:')
2921faac4104SBram Moolenaar
2922faac4104SBram Moolenaar  CheckScriptSuccess([
2923faac4104SBram Moolenaar      'vim9script',
2924faac4104SBram Moolenaar      'new'
2925d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2926df069eecSBram Moolenaar      ':$',
2927faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2928faac4104SBram Moolenaar      'bwipe!',
2929faac4104SBram Moolenaar      ])
2930faac4104SBram Moolenaar
2931f5be8cdbSBram Moolenaar  CheckScriptFailure([
2932f5be8cdbSBram Moolenaar      'vim9script',
2933f5be8cdbSBram Moolenaar      'new'
2934d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2935f5be8cdbSBram Moolenaar      ':$',
2936f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2937f5be8cdbSBram Moolenaar      'bwipe!',
2938f5be8cdbSBram Moolenaar      ], 'E488:')
2939f5be8cdbSBram Moolenaar
2940f5be8cdbSBram Moolenaar  CheckScriptFailure([
2941f5be8cdbSBram Moolenaar      'vim9script',
2942f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2943f5be8cdbSBram Moolenaar      ], 'E477:')
2944a26b9700SBram Moolenaarenddef
2945a26b9700SBram Moolenaar
29467e5bd91dSBram Moolenaardef Test_finish()
2947cfcd011fSBram Moolenaar  var lines =<< trim END
29487e5bd91dSBram Moolenaar    vim9script
29496797966dSBram Moolenaar    g:res = 'one'
29507e5bd91dSBram Moolenaar    if v:false | finish | endif
29516797966dSBram Moolenaar    g:res = 'two'
29527e5bd91dSBram Moolenaar    finish
29536797966dSBram Moolenaar    g:res = 'three'
29547e5bd91dSBram Moolenaar  END
29557e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
29567e5bd91dSBram Moolenaar  source Xfinished
29577e5bd91dSBram Moolenaar  assert_equal('two', g:res)
29587e5bd91dSBram Moolenaar
29597e5bd91dSBram Moolenaar  unlet g:res
29607e5bd91dSBram Moolenaar  delete('Xfinished')
29617e5bd91dSBram Moolenaarenddef
29627e5bd91dSBram Moolenaar
2963a5d0077eSBram Moolenaardef Test_forward_declaration()
2964cfcd011fSBram Moolenaar  var lines =<< trim END
2965a5d0077eSBram Moolenaar    vim9script
2966a5d0077eSBram Moolenaar    def GetValue(): string
2967a5d0077eSBram Moolenaar      return theVal
2968a5d0077eSBram Moolenaar    enddef
2969cfcd011fSBram Moolenaar    var theVal = 'something'
2970822ba247SBram Moolenaar    g:initVal = GetValue()
2971a5d0077eSBram Moolenaar    theVal = 'else'
2972a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2973a5d0077eSBram Moolenaar  END
2974a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2975a5d0077eSBram Moolenaar  source Xforward
2976a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2977a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2978a5d0077eSBram Moolenaar
2979a5d0077eSBram Moolenaar  unlet g:initVal
2980a5d0077eSBram Moolenaar  unlet g:laterVal
2981a5d0077eSBram Moolenaar  delete('Xforward')
2982a5d0077eSBram Moolenaarenddef
2983a5d0077eSBram Moolenaar
29849721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
2985a6294955SBram Moolenaar  var vim9_lines =<< trim END
2986a6294955SBram Moolenaar    vim9script
2987a6294955SBram Moolenaar    var local = 'local'
2988a6294955SBram Moolenaar    g:global = 'global'
2989a6294955SBram Moolenaar    export var exported = 'exported'
2990a6294955SBram Moolenaar    export def GetText(): string
2991a6294955SBram Moolenaar       return 'text'
2992a6294955SBram Moolenaar    enddef
2993a6294955SBram Moolenaar  END
2994a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
2995a6294955SBram Moolenaar
2996cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
29979721fb4eSBram Moolenaar    source Xvim9_script.vim
29989721fb4eSBram Moolenaar
29999721fb4eSBram Moolenaar    call assert_false(exists('local'))
30009721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30019721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
30029721fb4eSBram Moolenaar    call assert_equal('global', global)
30039721fb4eSBram Moolenaar    call assert_equal('global', g:global)
30049721fb4eSBram Moolenaar
30059721fb4eSBram Moolenaar    " imported variable becomes script-local
30069721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
30079721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
30089721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30099721fb4eSBram Moolenaar
30109721fb4eSBram Moolenaar    " imported function becomes script-local
30119721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
30129721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
30139721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
30149721fb4eSBram Moolenaar  END
30159721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
30169721fb4eSBram Moolenaar
30179721fb4eSBram Moolenaar  source Xlegacy_script.vim
30189721fb4eSBram Moolenaar  assert_equal('global', g:global)
3019f5be8cdbSBram Moolenaar  unlet g:global
30209721fb4eSBram Moolenaar
30219721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
30229721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
30239721fb4eSBram Moolenaarenddef
3024a5d0077eSBram Moolenaar
30257d699701SBram Moolenaarfunc Test_vim9script_not_global()
30267d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
30277d699701SBram Moolenaar  let vim9lines =<< trim END
30287d699701SBram Moolenaar    vim9script
3029cfcd011fSBram Moolenaar    var name = 'local'
30307d699701SBram Moolenaar    func TheFunc()
30317d699701SBram Moolenaar      echo 'local'
30327d699701SBram Moolenaar    endfunc
30337d699701SBram Moolenaar    def DefFunc()
30347d699701SBram Moolenaar      echo 'local'
30357d699701SBram Moolenaar    enddef
30367d699701SBram Moolenaar  END
30377d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
30387d699701SBram Moolenaar  source Xvim9script.vim
30397d699701SBram Moolenaar  try
30407d699701SBram Moolenaar    echo g:var
30417d699701SBram Moolenaar    assert_report('did not fail')
30427d699701SBram Moolenaar  catch /E121:/
30437d699701SBram Moolenaar    " caught
30447d699701SBram Moolenaar  endtry
30457d699701SBram Moolenaar  try
30467d699701SBram Moolenaar    call TheFunc()
30477d699701SBram Moolenaar    assert_report('did not fail')
30487d699701SBram Moolenaar  catch /E117:/
30497d699701SBram Moolenaar    " caught
30507d699701SBram Moolenaar  endtry
30517d699701SBram Moolenaar  try
30527d699701SBram Moolenaar    call DefFunc()
30537d699701SBram Moolenaar    assert_report('did not fail')
30547d699701SBram Moolenaar  catch /E117:/
30557d699701SBram Moolenaar    " caught
30567d699701SBram Moolenaar  endtry
30577d699701SBram Moolenaar
305825859dd7SBram Moolenaar  call delete('Xvim9script.vim')
30597d699701SBram Moolenaarendfunc
30607d699701SBram Moolenaar
3061eeb27bfeSBram Moolenaardef Test_vim9_copen()
3062eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3063eeb27bfeSBram Moolenaar  copen
3064eeb27bfeSBram Moolenaar  quit
3065eeb27bfeSBram Moolenaarenddef
3066eeb27bfeSBram Moolenaar
306703290b84SBram Moolenaar" test using an auto-loaded function and variable
30682d6b20d6SBram Moolenaardef Test_vim9_autoload()
3069cfcd011fSBram Moolenaar  var lines =<< trim END
30702d6b20d6SBram Moolenaar     vim9script
307103290b84SBram Moolenaar     def some#gettest(): string
307203290b84SBram Moolenaar       return 'test'
307303290b84SBram Moolenaar     enddef
307403290b84SBram Moolenaar     g:some#name = 'name'
307503290b84SBram Moolenaar  END
307603290b84SBram Moolenaar
307703290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
307803290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
307903290b84SBram Moolenaar  var save_rtp = &rtp
308003290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
308103290b84SBram Moolenaar
308203290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
308303290b84SBram Moolenaar  assert_equal('name', g:some#name)
308403290b84SBram Moolenaar  g:some#other = 'other'
308503290b84SBram Moolenaar  assert_equal('other', g:some#other)
308603290b84SBram Moolenaar
308717f700acSBram Moolenaar  # upper case script name works
308817f700acSBram Moolenaar  lines =<< trim END
308917f700acSBram Moolenaar     vim9script
309017f700acSBram Moolenaar     def Other#getOther(): string
309117f700acSBram Moolenaar       return 'other'
309217f700acSBram Moolenaar     enddef
309317f700acSBram Moolenaar  END
309417f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
309517f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
309617f700acSBram Moolenaar
309703290b84SBram Moolenaar  delete('Xdir', 'rf')
309803290b84SBram Moolenaar  &rtp = save_rtp
309903290b84SBram Moolenaarenddef
310003290b84SBram Moolenaar
310103290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
310203290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
310303290b84SBram Moolenaar  var lines =<< trim END
310403290b84SBram Moolenaar     vim9script
31052d6b20d6SBram Moolenaar     def foo#test()
31062d6b20d6SBram Moolenaar         echomsg getreg('"')
31072d6b20d6SBram Moolenaar     enddef
31082d6b20d6SBram Moolenaar  END
31092d6b20d6SBram Moolenaar
31102d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
31112d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3112cfcd011fSBram Moolenaar  var save_rtp = &rtp
31132d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
31142d6b20d6SBram Moolenaar  augroup test
31152d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
31162d6b20d6SBram Moolenaar  augroup END
31172d6b20d6SBram Moolenaar
31182d6b20d6SBram Moolenaar  normal Y
31192d6b20d6SBram Moolenaar
31202d6b20d6SBram Moolenaar  augroup test
31212d6b20d6SBram Moolenaar    autocmd!
31222d6b20d6SBram Moolenaar  augroup END
31232d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
31242d6b20d6SBram Moolenaar  &rtp = save_rtp
31252d6b20d6SBram Moolenaarenddef
31262d6b20d6SBram Moolenaar
312777e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
312877e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3129cfcd011fSBram Moolenaar  var lines =<< trim END
313077e5dcc3SBram Moolenaar      vim9script
313177e5dcc3SBram Moolenaar      def crash#func()
313277e5dcc3SBram Moolenaar          try
313377e5dcc3SBram Moolenaar              for x in List()
313477e5dcc3SBram Moolenaar              endfor
313577e5dcc3SBram Moolenaar          catch
313677e5dcc3SBram Moolenaar          endtry
313777e5dcc3SBram Moolenaar          g:ok = true
313877e5dcc3SBram Moolenaar      enddef
313977e5dcc3SBram Moolenaar      fu List()
314077e5dcc3SBram Moolenaar          invalid
314177e5dcc3SBram Moolenaar      endfu
314277e5dcc3SBram Moolenaar      try
314348e11c10SBram Moolenaar          alsoinvalid
314477e5dcc3SBram Moolenaar      catch /wontmatch/
314577e5dcc3SBram Moolenaar      endtry
314677e5dcc3SBram Moolenaar  END
314777e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
314877e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
314977e5dcc3SBram Moolenaar
315077e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
315177e5dcc3SBram Moolenaar  lines =<< trim END
315277e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
315377e5dcc3SBram Moolenaar    call crash#func()
315477e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
31559c4f5520SBram Moolenaar    qall!
315677e5dcc3SBram Moolenaar  END
315777e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
315877e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
315977e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
316077e5dcc3SBram Moolenaar
316177e5dcc3SBram Moolenaar  delete('Xdidit')
316277e5dcc3SBram Moolenaar  delete('Xscript')
316377e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
316403290b84SBram Moolenaar
316503290b84SBram Moolenaar  lines =<< trim END
316603290b84SBram Moolenaar    vim9script
316703290b84SBram Moolenaar    var foo#bar = 'asdf'
316803290b84SBram Moolenaar  END
316903290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
317077e5dcc3SBram Moolenaarenddef
317177e5dcc3SBram Moolenaar
317281e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
317381e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
317481e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3175cfcd011fSBram Moolenaar  var lines =<< trim END
317681e17fbeSBram Moolenaar    let s:counter = 1
317781e17fbeSBram Moolenaar    def s:Func()
317881e17fbeSBram Moolenaar      au! CursorHold
317981e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
318081e17fbeSBram Moolenaar    enddef
318181e17fbeSBram Moolenaar    call s:Func()
318281e17fbeSBram Moolenaar    doau CursorHold
318381e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
318481e17fbeSBram Moolenaar    au! CursorHold
318581e17fbeSBram Moolenaar  END
318681e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
318781e17fbeSBram Moolenaarenddef
318881e17fbeSBram Moolenaar
31893896a105SBram Moolenaardef Test_cmdline_win()
31903896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
31913896a105SBram Moolenaar  # the command line window.
31923896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3193cfcd011fSBram Moolenaar  var export_lines =<< trim END
31943896a105SBram Moolenaar    vim9script
3195cfcd011fSBram Moolenaar    export var That = 'yes'
31963896a105SBram Moolenaar  END
31973896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3198cfcd011fSBram Moolenaar  var import_lines =<< trim END
31993896a105SBram Moolenaar    vim9script
32003896a105SBram Moolenaar    import That from './Xexport.vim'
32013896a105SBram Moolenaar  END
32023896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3203cfcd011fSBram Moolenaar  var save_rtp = &rtp
32043896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
32053896a105SBram Moolenaar  syntax on
32063896a105SBram Moolenaar  augroup CmdWin
32073896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
32083896a105SBram Moolenaar  augroup END
32093896a105SBram Moolenaar  # this will open and also close the cmdline window
32103896a105SBram Moolenaar  feedkeys('q:', 'xt')
32113896a105SBram Moolenaar  assert_equal('yes', g:got_there)
32123896a105SBram Moolenaar
32133896a105SBram Moolenaar  augroup CmdWin
32143896a105SBram Moolenaar    au!
32153896a105SBram Moolenaar  augroup END
32163896a105SBram Moolenaar  &rtp = save_rtp
32173896a105SBram Moolenaar  delete('rtp', 'rf')
32183896a105SBram Moolenaarenddef
32193896a105SBram Moolenaar
3220e3d4685fSBram Moolenaardef Test_invalid_sid()
3221e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
322225859dd7SBram Moolenaar
32239c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3224d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3225e3d4685fSBram Moolenaar  endif
3226e3d4685fSBram Moolenaar  delete('Xdidit')
3227e3d4685fSBram Moolenaarenddef
3228e3d4685fSBram Moolenaar
32299ec7026fSBram Moolenaardef Test_restoring_cpo()
32309ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
32319ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
32329ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
32339ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
32349ec7026fSBram Moolenaar  endif
32359ec7026fSBram Moolenaar  delete('Xsourced')
32369ec7026fSBram Moolenaar  delete('Xclose')
3237090728adSBram Moolenaar  delete('Xdone')
32380123cc1eSBram Moolenaar
32390123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
32400123cc1eSBram Moolenaar  set cpo=aABceFsMny>
32410123cc1eSBram Moolenaar  edit XanotherScript
32420123cc1eSBram Moolenaar  so %
32430123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
32440123cc1eSBram Moolenaar  :1del
32450123cc1eSBram Moolenaar  w
32460123cc1eSBram Moolenaar  so %
32470123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
32480123cc1eSBram Moolenaar
32490123cc1eSBram Moolenaar  delete('XanotherScript')
32500123cc1eSBram Moolenaar  set cpo&vim
32519ec7026fSBram Moolenaarenddef
32529ec7026fSBram Moolenaar
32539ec7026fSBram Moolenaar
3254f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3255cfcd011fSBram Moolenaar  var lines =<< trim END
3256cfcd011fSBram Moolenaar    var name: any
3257cfcd011fSBram Moolenaar    assert_equal(0, name)
3258f0afd9e1SBram Moolenaar  END
3259f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3260f0afd9e1SBram Moolenaarenddef
3261f0afd9e1SBram Moolenaar
32627e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
326358dbef33SBram Moolenaar  CheckRunVimInTerminal
326458dbef33SBram Moolenaar
32657e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
32667e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
32677e9210eaSBram Moolenaarendfunc
32687e9210eaSBram Moolenaar
32697e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
32709c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3271cfcd011fSBram Moolenaar  var lines =<< trim END
32729c4f5520SBram Moolenaar    func CheckAndQuit()
32739c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
32749c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
32759c4f5520SBram Moolenaar    endfunc
32769c4f5520SBram Moolenaar  END
32779c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
32789c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3279e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
32809c4f5520SBram Moolenaar  # define Afunc() on the command line
32819c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
32829c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
32832949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
32849c4f5520SBram Moolenaar
32859c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
32869c4f5520SBram Moolenaar  delete('XcallFunc')
32879c4f5520SBram Moolenaar  delete('Xdidcmd')
32889c4f5520SBram Moolenaarenddef
32899c4f5520SBram Moolenaar
3290fcdc5d83SBram Moolenaardef Test_script_var_scope()
3291fcdc5d83SBram Moolenaar  var lines =<< trim END
3292fcdc5d83SBram Moolenaar      vim9script
3293fcdc5d83SBram Moolenaar      if true
3294fcdc5d83SBram Moolenaar        if true
3295fcdc5d83SBram Moolenaar          var one = 'one'
3296fcdc5d83SBram Moolenaar          echo one
3297fcdc5d83SBram Moolenaar        endif
3298fcdc5d83SBram Moolenaar        echo one
3299fcdc5d83SBram Moolenaar      endif
3300fcdc5d83SBram Moolenaar  END
3301fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3302fcdc5d83SBram Moolenaar
3303fcdc5d83SBram Moolenaar  lines =<< trim END
3304fcdc5d83SBram Moolenaar      vim9script
3305fcdc5d83SBram Moolenaar      if true
3306fcdc5d83SBram Moolenaar        if false
3307fcdc5d83SBram Moolenaar          var one = 'one'
3308fcdc5d83SBram Moolenaar          echo one
3309fcdc5d83SBram Moolenaar        else
3310fcdc5d83SBram Moolenaar          var one = 'one'
3311fcdc5d83SBram Moolenaar          echo one
3312fcdc5d83SBram Moolenaar        endif
3313fcdc5d83SBram Moolenaar        echo one
3314fcdc5d83SBram Moolenaar      endif
3315fcdc5d83SBram Moolenaar  END
3316fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3317fcdc5d83SBram Moolenaar
3318fcdc5d83SBram Moolenaar  lines =<< trim END
3319fcdc5d83SBram Moolenaar      vim9script
3320fcdc5d83SBram Moolenaar      while true
3321fcdc5d83SBram Moolenaar        var one = 'one'
3322fcdc5d83SBram Moolenaar        echo one
3323fcdc5d83SBram Moolenaar        break
3324fcdc5d83SBram Moolenaar      endwhile
3325fcdc5d83SBram Moolenaar      echo one
3326fcdc5d83SBram Moolenaar  END
3327fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3328fcdc5d83SBram Moolenaar
3329fcdc5d83SBram Moolenaar  lines =<< trim END
3330fcdc5d83SBram Moolenaar      vim9script
3331fcdc5d83SBram Moolenaar      for i in range(1)
3332fcdc5d83SBram Moolenaar        var one = 'one'
3333fcdc5d83SBram Moolenaar        echo one
3334fcdc5d83SBram Moolenaar      endfor
3335fcdc5d83SBram Moolenaar      echo one
3336fcdc5d83SBram Moolenaar  END
3337fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
33389becdf2bSBram Moolenaar
33399becdf2bSBram Moolenaar  lines =<< trim END
33409becdf2bSBram Moolenaar      vim9script
33419becdf2bSBram Moolenaar      {
33429becdf2bSBram Moolenaar        var one = 'one'
33439becdf2bSBram Moolenaar        assert_equal('one', one)
33449becdf2bSBram Moolenaar      }
33459becdf2bSBram Moolenaar      assert_false(exists('one'))
33469becdf2bSBram Moolenaar      assert_false(exists('s:one'))
33479becdf2bSBram Moolenaar  END
33489becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
33499becdf2bSBram Moolenaar
33509becdf2bSBram Moolenaar  lines =<< trim END
33519becdf2bSBram Moolenaar      vim9script
33529becdf2bSBram Moolenaar      {
33539becdf2bSBram Moolenaar        var one = 'one'
33549becdf2bSBram Moolenaar        echo one
33559becdf2bSBram Moolenaar      }
33569becdf2bSBram Moolenaar      echo one
33579becdf2bSBram Moolenaar  END
33589becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3359fcdc5d83SBram Moolenaarenddef
3360fcdc5d83SBram Moolenaar
3361352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3362352134bbSBram Moolenaar  var lines =<< trim END
3363352134bbSBram Moolenaar    vim9script
3364352134bbSBram Moolenaar    def Callback(...l: any)
3365352134bbSBram Moolenaar      try
3366352134bbSBram Moolenaar        var x: string
3367352134bbSBram Moolenaar        var y: string
3368352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3369352134bbSBram Moolenaar        [x, y] = ['']
3370352134bbSBram Moolenaar      catch
3371352134bbSBram Moolenaar        g:caught = 'yes'
3372352134bbSBram Moolenaar      endtry
3373352134bbSBram Moolenaar    enddef
3374e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3375352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3376352134bbSBram Moolenaar  END
3377352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3378352134bbSBram Moolenaar
3379352134bbSBram Moolenaar  unlet g:caught
3380352134bbSBram Moolenaarenddef
3381352134bbSBram Moolenaar
3382631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3383631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3384631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3385631e8f93SBram Moolenaar  endif
3386631e8f93SBram Moolenaar  var lines =<< trim END
3387631e8f93SBram Moolenaar      vim9script
3388631e8f93SBram Moolenaar      var source: list<number>
3389631e8f93SBram Moolenaar      def Out_cb(...l: any)
3390631e8f93SBram Moolenaar          eval [][0]
3391631e8f93SBram Moolenaar      enddef
3392631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3393631e8f93SBram Moolenaar          sleep 1m
3394631e8f93SBram Moolenaar          source += l
3395631e8f93SBram Moolenaar      enddef
3396e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
33976f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
33986f17a3f0SBram Moolenaar        sleep 10m
33996f17a3f0SBram Moolenaar      endwhile
3400206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
3401206c2a6eSBram Moolenaar      sleep 100m
3402631e8f93SBram Moolenaar  END
3403631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3404631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3405631e8f93SBram Moolenaar  delete('Xdef')
3406631e8f93SBram Moolenaarenddef
3407631e8f93SBram Moolenaar
34084324d87aSBram Moolenaardef InvokeNormal()
34094324d87aSBram Moolenaar  exe "norm! :m+1\r"
34104324d87aSBram Moolenaarenddef
34114324d87aSBram Moolenaar
34124324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
34134324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
34144324d87aSBram Moolenaar  new
34154324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
34164324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
34174324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
34184324d87aSBram Moolenaar  xunmap <F3>
3419b5b9480eSBram Moolenaarenddef
3420b5b9480eSBram Moolenaar
3421b5b9480eSBram Moolenaardef Test_white_space_after_command()
3422b5b9480eSBram Moolenaar  var lines =<< trim END
3423b5b9480eSBram Moolenaar    exit_cb: Func})
3424b5b9480eSBram Moolenaar  END
3425b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3426f8103f27SBram Moolenaar
3427f8103f27SBram Moolenaar  lines =<< trim END
3428f8103f27SBram Moolenaar    e#
3429f8103f27SBram Moolenaar  END
3430f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
34314324d87aSBram Moolenaarenddef
34324324d87aSBram Moolenaar
34334aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
34344aab88d9SBram Moolenaar  var lines =<< trim END
34354aab88d9SBram Moolenaar      vim9script
34364aab88d9SBram Moolenaar      if exists('g:guard')
34374aab88d9SBram Moolenaar        finish
34384aab88d9SBram Moolenaar      endif
34394aab88d9SBram Moolenaar      g:guard = 1
34404aab88d9SBram Moolenaar      var name = 'thename'
34414aab88d9SBram Moolenaar      def g:GetName(): string
34424aab88d9SBram Moolenaar        return name
34434aab88d9SBram Moolenaar      enddef
34444aab88d9SBram Moolenaar      def g:SetName(arg: string)
34454aab88d9SBram Moolenaar        name = arg
34464aab88d9SBram Moolenaar      enddef
34474aab88d9SBram Moolenaar  END
34484aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
34494aab88d9SBram Moolenaar  so XscriptTwice.vim
34504aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
34514aab88d9SBram Moolenaar  g:SetName('newname')
34524aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
34534aab88d9SBram Moolenaar  so XscriptTwice.vim
34544aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
34554aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
34564aab88d9SBram Moolenaar
34574aab88d9SBram Moolenaar  delfunc g:GetName
34584aab88d9SBram Moolenaar  delfunc g:SetName
34594aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
34604aab88d9SBram Moolenaar  unlet g:guard
34614aab88d9SBram Moolenaarenddef
34624aab88d9SBram Moolenaar
34634aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
34644aab88d9SBram Moolenaar  var exportlines =<< trim END
34654aab88d9SBram Moolenaar      vim9script
34664aab88d9SBram Moolenaar      if exists('g:guard')
34674aab88d9SBram Moolenaar        finish
34684aab88d9SBram Moolenaar      endif
34694aab88d9SBram Moolenaar      g:guard = 1
34704aab88d9SBram Moolenaar      export var name = 'someName'
34714aab88d9SBram Moolenaar  END
34724aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
34734aab88d9SBram Moolenaar
34744aab88d9SBram Moolenaar  var lines =<< trim END
34754aab88d9SBram Moolenaar      vim9script
34764aab88d9SBram Moolenaar      import name from './XexportScript.vim'
34774aab88d9SBram Moolenaar      def g:GetName(): string
34784aab88d9SBram Moolenaar        return name
34794aab88d9SBram Moolenaar      enddef
34804aab88d9SBram Moolenaar  END
34814aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
34824aab88d9SBram Moolenaar  so XscriptImport.vim
34834aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
34844aab88d9SBram Moolenaar
34854aab88d9SBram Moolenaar  so XexportScript.vim
34864aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
34874aab88d9SBram Moolenaar
34884aab88d9SBram Moolenaar  delfunc g:GetName
34894aab88d9SBram Moolenaar  delete('XexportScript.vim')
34904aab88d9SBram Moolenaar  delete('XscriptImport.vim')
34914aab88d9SBram Moolenaar  unlet g:guard
34924aab88d9SBram Moolenaarenddef
34934aab88d9SBram Moolenaar
3494585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3495585fea7bSBram Moolenaardef Test_substitute_cmd()
3496585fea7bSBram Moolenaar  new
3497585fea7bSBram Moolenaar  setline(1, 'something')
3498585fea7bSBram Moolenaar  :substitute(some(other(
3499585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3500585fea7bSBram Moolenaar  bwipe!
3501585fea7bSBram Moolenaar
3502f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3503cfcd011fSBram Moolenaar  var lines =<< trim END
3504585fea7bSBram Moolenaar    vim9script
3505585fea7bSBram Moolenaar    new
3506585fea7bSBram Moolenaar    setline(1, 'something')
3507585fea7bSBram Moolenaar    :substitute(some(other(
3508585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3509585fea7bSBram Moolenaar    bwipe!
3510585fea7bSBram Moolenaar  END
3511585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3512585fea7bSBram Moolenaar  source Xvim9lines
3513585fea7bSBram Moolenaar
3514585fea7bSBram Moolenaar  delete('Xvim9lines')
3515585fea7bSBram Moolenaarenddef
3516585fea7bSBram Moolenaar
35178a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3518