18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
7e3d4685fSBram Moolenaarsource shared.vim
837294bd6SBram Moolenaarsource screendump.vim
98a7d6542SBram Moolenaar
105d72ce69SBram Moolenaardef Test_range_only()
115d72ce69SBram Moolenaar  new
125d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
135d72ce69SBram Moolenaar  :/Blah/
145d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
15c2af0affSBram Moolenaar  bwipe!
16c2af0affSBram Moolenaar
17c2af0affSBram Moolenaar  # without range commands use current line
18c2af0affSBram Moolenaar  new
19c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
20c2af0affSBram Moolenaar  :2
21c2af0affSBram Moolenaar  print
22c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
23c2af0affSBram Moolenaar  :3
24c2af0affSBram Moolenaar  list
25c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
26b8554304SBram Moolenaar
27b8554304SBram Moolenaar  # missing command does not print the line
28b8554304SBram Moolenaar  var lines =<< trim END
29b8554304SBram Moolenaar    vim9script
30b8554304SBram Moolenaar    :1|
31b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
32b8554304SBram Moolenaar    :|
33b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
34b8554304SBram Moolenaar  END
35b8554304SBram Moolenaar  CheckScriptSuccess(lines)
36b8554304SBram Moolenaar
37c2af0affSBram Moolenaar  bwipe!
38025cb1caSBram Moolenaar
39025cb1caSBram Moolenaar  # won't generate anything
40025cb1caSBram Moolenaar  if false
41025cb1caSBram Moolenaar    :123
42025cb1caSBram Moolenaar  endif
435d72ce69SBram Moolenaarenddef
445d72ce69SBram Moolenaar
45a6e67e4fSBram Moolenaarlet g:alist = [7]
46a6e67e4fSBram Moolenaarlet g:astring = 'text'
47f0b9f43cSBram Moolenaarlet g:anumber = 123
486e587dcbSBram Moolenaar
494c17ad94SBram Moolenaardef Test_delfunction()
50f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
514c17ad94SBram Moolenaar  CheckScriptSuccess([
524c17ad94SBram Moolenaar      'vim9script',
534c17ad94SBram Moolenaar      'func CheckMe()',
544c17ad94SBram Moolenaar      '  return 123',
554c17ad94SBram Moolenaar      'endfunc',
564c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
574c17ad94SBram Moolenaar      ])
584c17ad94SBram Moolenaar
59f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
604c17ad94SBram Moolenaar  CheckScriptFailure([
614c17ad94SBram Moolenaar      'vim9script',
624c17ad94SBram Moolenaar      'func DeleteMe1()',
634c17ad94SBram Moolenaar      'endfunc',
644c17ad94SBram Moolenaar      'delfunction DeleteMe1',
654c17ad94SBram Moolenaar      ], 'E1084:')
664c17ad94SBram Moolenaar  CheckScriptFailure([
674c17ad94SBram Moolenaar      'vim9script',
684c17ad94SBram Moolenaar      'func DeleteMe2()',
694c17ad94SBram Moolenaar      'endfunc',
704c17ad94SBram Moolenaar      'def DoThat()',
714c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
724c17ad94SBram Moolenaar      'enddef',
734c17ad94SBram Moolenaar      'DoThat()',
744c17ad94SBram Moolenaar      ], 'E1084:')
754c17ad94SBram Moolenaar  CheckScriptFailure([
764c17ad94SBram Moolenaar      'vim9script',
774c17ad94SBram Moolenaar      'def DeleteMe3()',
784c17ad94SBram Moolenaar      'enddef',
794c17ad94SBram Moolenaar      'delfunction DeleteMe3',
804c17ad94SBram Moolenaar      ], 'E1084:')
814c17ad94SBram Moolenaar  CheckScriptFailure([
824c17ad94SBram Moolenaar      'vim9script',
834c17ad94SBram Moolenaar      'def DeleteMe4()',
844c17ad94SBram Moolenaar      'enddef',
854c17ad94SBram Moolenaar      'def DoThat()',
864c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
874c17ad94SBram Moolenaar      'enddef',
884c17ad94SBram Moolenaar      'DoThat()',
894c17ad94SBram Moolenaar      ], 'E1084:')
90925e9fd6SBram Moolenaar
91925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
92cfcd011fSBram Moolenaar  var lines =<< trim END
93925e9fd6SBram Moolenaar      vim9script
94925e9fd6SBram Moolenaar      def g:Global(): string
95925e9fd6SBram Moolenaar        return "yes"
96925e9fd6SBram Moolenaar      enddef
97925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
98925e9fd6SBram Moolenaar      def! g:Global(): string
99925e9fd6SBram Moolenaar        return "no"
100925e9fd6SBram Moolenaar      enddef
101925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
102925e9fd6SBram Moolenaar      delfunc g:Global
103925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
104925e9fd6SBram Moolenaar  END
105925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
106925e9fd6SBram Moolenaar
107925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
108925e9fd6SBram Moolenaar  lines =<< trim END
109925e9fd6SBram Moolenaar      vim9script
110925e9fd6SBram Moolenaar      func g:Global()
111925e9fd6SBram Moolenaar        return "yes"
112925e9fd6SBram Moolenaar      endfunc
113925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
114925e9fd6SBram Moolenaar      def! g:Global(): string
115925e9fd6SBram Moolenaar        return "no"
116925e9fd6SBram Moolenaar      enddef
117925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
118925e9fd6SBram Moolenaar      delfunc g:Global
119925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
120925e9fd6SBram Moolenaar  END
121925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
122925e9fd6SBram Moolenaar
123925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
124925e9fd6SBram Moolenaar  lines =<< trim END
125925e9fd6SBram Moolenaar      vim9script
126925e9fd6SBram Moolenaar      def g:Global(): string
127925e9fd6SBram Moolenaar        return "yes"
128925e9fd6SBram Moolenaar      enddef
129925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
130925e9fd6SBram Moolenaar      func! g:Global()
131925e9fd6SBram Moolenaar        return "no"
132925e9fd6SBram Moolenaar      endfunc
133925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
134925e9fd6SBram Moolenaar      delfunc g:Global
135925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
136925e9fd6SBram Moolenaar  END
137925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1384c17ad94SBram Moolenaarenddef
1394c17ad94SBram Moolenaar
14008052228SBram Moolenaardef Test_wrong_type()
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
143cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
144cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
145599c89c8SBram Moolenaar
146cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
147cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
14842a480bfSBram Moolenaar
149cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
150cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
151cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
152cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
153cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
154cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
155cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
156cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
157cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
158cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
159cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
160a0a9f43aSBram Moolenaar
161cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
162cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
16308052228SBram Moolenaarenddef
1648a7d6542SBram Moolenaar
16510c65860SBram Moolenaardef Test_script_wrong_type()
16610c65860SBram Moolenaar  var lines =<< trim END
16710c65860SBram Moolenaar      vim9script
16810c65860SBram Moolenaar      var s:dict: dict<string>
16910c65860SBram Moolenaar      s:dict['a'] = ['x']
17010c65860SBram Moolenaar  END
17110c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
17210c65860SBram Moolenaarenddef
17310c65860SBram Moolenaar
17408052228SBram Moolenaardef Test_const()
175cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
176cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
177cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
17830fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
17930fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
180dbeecb2bSBram Moolenaar
181cfcd011fSBram Moolenaar  var lines =<< trim END
18230fd8204SBram Moolenaar    final list = [1, 2, 3]
183dbeecb2bSBram Moolenaar    list[0] = 4
1840b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
18530fd8204SBram Moolenaar    const other = [5, 6, 7]
1860b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
18771abe482SBram Moolenaar
188cfcd011fSBram Moolenaar    var varlist = [7, 8]
18930fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
19071abe482SBram Moolenaar    varlist[0] = 77
19171abe482SBram Moolenaar    # TODO: does not work yet
19271abe482SBram Moolenaar    # constlist[1][1] = 88
193cfcd011fSBram Moolenaar    var cl = constlist[1]
19471abe482SBram Moolenaar    cl[1] = 88
19571abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
19671abe482SBram Moolenaar
197e0de171eSBram Moolenaar    var vardict = {five: 5, six: 6}
198e0de171eSBram Moolenaar    const constdict = {one: 1, two: vardict, three: 3}
19971abe482SBram Moolenaar    vardict['five'] = 55
20071abe482SBram Moolenaar    # TODO: does not work yet
20171abe482SBram Moolenaar    # constdict['two']['six'] = 66
202cfcd011fSBram Moolenaar    var cd = constdict['two']
20371abe482SBram Moolenaar    cd['six'] = 66
204e0de171eSBram Moolenaar    constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
205dbeecb2bSBram Moolenaar  END
206dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
20708052228SBram Moolenaarenddef
2088a7d6542SBram Moolenaar
2090b4c66c6SBram Moolenaardef Test_const_bang()
210cfcd011fSBram Moolenaar  var lines =<< trim END
21130fd8204SBram Moolenaar      const var = 234
2120b4c66c6SBram Moolenaar      var = 99
2130b4c66c6SBram Moolenaar  END
2140b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
2150b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
2160b4c66c6SBram Moolenaar
2170b4c66c6SBram Moolenaar  lines =<< trim END
21830fd8204SBram Moolenaar      const ll = [2, 3, 4]
2190b4c66c6SBram Moolenaar      ll[0] = 99
2200b4c66c6SBram Moolenaar  END
2210b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2220b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2230b4c66c6SBram Moolenaar
2240b4c66c6SBram Moolenaar  lines =<< trim END
22530fd8204SBram Moolenaar      const ll = [2, 3, 4]
2260b4c66c6SBram Moolenaar      ll[3] = 99
2270b4c66c6SBram Moolenaar  END
2280b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2290b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2300b4c66c6SBram Moolenaar
2310b4c66c6SBram Moolenaar  lines =<< trim END
232e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2330b4c66c6SBram Moolenaar      dd["one"] = 99
2340b4c66c6SBram Moolenaar  END
2350b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2360b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2370b4c66c6SBram Moolenaar
2380b4c66c6SBram Moolenaar  lines =<< trim END
239e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2400b4c66c6SBram Moolenaar      dd["three"] = 99
2410b4c66c6SBram Moolenaar  END
2420b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2430b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2440b4c66c6SBram Moolenaarenddef
2450b4c66c6SBram Moolenaar
246df069eecSBram Moolenaardef Test_range_no_colon()
247d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
248d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
249d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
250d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
251df069eecSBram Moolenaarenddef
252df069eecSBram Moolenaar
253df069eecSBram Moolenaar
2548a7d6542SBram Moolenaardef Test_block()
255cfcd011fSBram Moolenaar  var outer = 1
2568a7d6542SBram Moolenaar  {
257cfcd011fSBram Moolenaar    var inner = 2
2588a7d6542SBram Moolenaar    assert_equal(1, outer)
2598a7d6542SBram Moolenaar    assert_equal(2, inner)
2608a7d6542SBram Moolenaar  }
2618a7d6542SBram Moolenaar  assert_equal(1, outer)
2623f1e9f00SBram Moolenaar
2633f1e9f00SBram Moolenaar  {|echo 'yes'|}
2648a7d6542SBram Moolenaarenddef
2658a7d6542SBram Moolenaar
26608052228SBram Moolenaardef Test_block_failure()
267cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
26808052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
26908052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
27008052228SBram Moolenaarenddef
2718a7d6542SBram Moolenaar
272fbbcd003SBram Moolenaardef Test_block_local_vars()
273fbbcd003SBram Moolenaar  var lines =<< trim END
274fbbcd003SBram Moolenaar      vim9script
275ed234f24SBram Moolenaar      v:testing = 1
276fbbcd003SBram Moolenaar      if true
277ed234f24SBram Moolenaar        var text = ['hello']
278ed234f24SBram Moolenaar        def SayHello(): list<string>
279fbbcd003SBram Moolenaar          return text
280fbbcd003SBram Moolenaar        enddef
281fbbcd003SBram Moolenaar        def SetText(v: string)
282ed234f24SBram Moolenaar          text = [v]
283fbbcd003SBram Moolenaar        enddef
284fbbcd003SBram Moolenaar      endif
285fbbcd003SBram Moolenaar
286fbbcd003SBram Moolenaar      if true
287ed234f24SBram Moolenaar        var text = ['again']
288ed234f24SBram Moolenaar        def SayAgain(): list<string>
289fbbcd003SBram Moolenaar          return text
290fbbcd003SBram Moolenaar        enddef
291fbbcd003SBram Moolenaar      endif
292ed234f24SBram Moolenaar
293ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
294ed234f24SBram Moolenaar      test_garbagecollect_now()
295ed234f24SBram Moolenaar
296fbbcd003SBram Moolenaar      defcompile
297fbbcd003SBram Moolenaar
298ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
299ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
300fbbcd003SBram Moolenaar
301fbbcd003SBram Moolenaar      SetText('foobar')
302ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
303ed234f24SBram Moolenaar
304ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
305ed234f24SBram Moolenaar      qall!
306fbbcd003SBram Moolenaar  END
307ed234f24SBram Moolenaar
308ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
309ed234f24SBram Moolenaar  # context gets garbage collected.
310ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
311ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
312ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
313ed234f24SBram Moolenaar
314ed234f24SBram Moolenaar  delete('Xscript')
315ed234f24SBram Moolenaar  delete('Xdidit')
316fbbcd003SBram Moolenaarenddef
317fbbcd003SBram Moolenaar
31839ca4127SBram Moolenaardef Test_block_local_vars_with_func()
31939ca4127SBram Moolenaar  var lines =<< trim END
32039ca4127SBram Moolenaar      vim9script
32139ca4127SBram Moolenaar      if true
32239ca4127SBram Moolenaar        var foo = 'foo'
32339ca4127SBram Moolenaar        if true
32439ca4127SBram Moolenaar          var bar = 'bar'
32539ca4127SBram Moolenaar          def Func(): list<string>
32639ca4127SBram Moolenaar            return [foo, bar]
32739ca4127SBram Moolenaar          enddef
32839ca4127SBram Moolenaar        endif
32939ca4127SBram Moolenaar      endif
33039ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
33139ca4127SBram Moolenaar      # "foo" and "bar"
33239ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
33339ca4127SBram Moolenaar  END
33439ca4127SBram Moolenaar  CheckScriptSuccess(lines)
33539ca4127SBram Moolenaarenddef
33639ca4127SBram Moolenaar
337*e4db17fbSBram Moolenaar" legacy func for command that's defined later
338*e4db17fbSBram Moolenaarfunc InvokeSomeCommand()
339*e4db17fbSBram Moolenaar  SomeCommand
340*e4db17fbSBram Moolenaarendfunc
341*e4db17fbSBram Moolenaar
342*e4db17fbSBram Moolenaardef Test_autocommand_block()
343*e4db17fbSBram Moolenaar  com SomeCommand {
344*e4db17fbSBram Moolenaar      g:someVar = 'some'
345*e4db17fbSBram Moolenaar    }
346*e4db17fbSBram Moolenaar  InvokeSomeCommand()
347*e4db17fbSBram Moolenaar  assert_equal('some', g:someVar)
348*e4db17fbSBram Moolenaar
349*e4db17fbSBram Moolenaar  delcommand SomeCommand
350*e4db17fbSBram Moolenaar  unlet g:someVar
351*e4db17fbSBram Moolenaarenddef
352*e4db17fbSBram Moolenaar
353*e4db17fbSBram Moolenaardef Test_command_block()
354*e4db17fbSBram Moolenaar  au BufNew *.xml {
355*e4db17fbSBram Moolenaar      g:otherVar = 'other'
356*e4db17fbSBram Moolenaar    }
357*e4db17fbSBram Moolenaar  split other.xml
358*e4db17fbSBram Moolenaar  assert_equal('other', g:otherVar)
359*e4db17fbSBram Moolenaar
360*e4db17fbSBram Moolenaar  bwipe!
361*e4db17fbSBram Moolenaar  au! BufNew *.xml
362*e4db17fbSBram Moolenaar  unlet g:otherVar
363*e4db17fbSBram Moolenaarenddef
364*e4db17fbSBram Moolenaar
365d032f34aSBram Moolenaarfunc g:NoSuchFunc()
366d032f34aSBram Moolenaar  echo 'none'
367d032f34aSBram Moolenaarendfunc
368d032f34aSBram Moolenaar
3699e1d9e34SBram Moolenaardef Test_try_catch_throw()
370cfcd011fSBram Moolenaar  var l = []
3717a092245SBram Moolenaar  try # comment
3728a7d6542SBram Moolenaar    add(l, '1')
3738a7d6542SBram Moolenaar    throw 'wrong'
3748a7d6542SBram Moolenaar    add(l, '2')
3757a092245SBram Moolenaar  catch # comment
3768a7d6542SBram Moolenaar    add(l, v:exception)
3777a092245SBram Moolenaar  finally # comment
3788a7d6542SBram Moolenaar    add(l, '3')
3797a092245SBram Moolenaar  endtry # comment
3808a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
38168d130c6SBram Moolenaar
382e859312eSBram Moolenaar  l = []
383e859312eSBram Moolenaar  try
384e859312eSBram Moolenaar    try
385e859312eSBram Moolenaar      add(l, '1')
386e859312eSBram Moolenaar      throw 'wrong'
387e859312eSBram Moolenaar      add(l, '2')
388e859312eSBram Moolenaar    catch /right/
389e859312eSBram Moolenaar      add(l, v:exception)
390e859312eSBram Moolenaar    endtry
391e859312eSBram Moolenaar  catch /wrong/
392e859312eSBram Moolenaar    add(l, 'caught')
393373863edSBram Moolenaar  fina
394e859312eSBram Moolenaar    add(l, 'finally')
395e859312eSBram Moolenaar  endtry
396e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
397e859312eSBram Moolenaar
398cfcd011fSBram Moolenaar  var n: number
39968d130c6SBram Moolenaar  try
40068d130c6SBram Moolenaar    n = l[3]
40168d130c6SBram Moolenaar  catch /E684:/
40268d130c6SBram Moolenaar    n = 99
40368d130c6SBram Moolenaar  endtry
40468d130c6SBram Moolenaar  assert_equal(99, n)
40568d130c6SBram Moolenaar
40669f7050cSBram Moolenaar  var done = 'no'
40769f7050cSBram Moolenaar  if 0
40869f7050cSBram Moolenaar    try | catch | endtry
40969f7050cSBram Moolenaar  else
41069f7050cSBram Moolenaar    done = 'yes'
41169f7050cSBram Moolenaar  endif
41269f7050cSBram Moolenaar  assert_equal('yes', done)
41369f7050cSBram Moolenaar
41469f7050cSBram Moolenaar  done = 'no'
41569f7050cSBram Moolenaar  if 1
41669f7050cSBram Moolenaar    done = 'yes'
41769f7050cSBram Moolenaar  else
41869f7050cSBram Moolenaar    try | catch | endtry
41969f7050cSBram Moolenaar    done = 'never'
42069f7050cSBram Moolenaar  endif
42169f7050cSBram Moolenaar  assert_equal('yes', done)
42269f7050cSBram Moolenaar
42369f7050cSBram Moolenaar  if 1
42469f7050cSBram Moolenaar  else
42569f7050cSBram Moolenaar    try | catch /pat/ | endtry
42669f7050cSBram Moolenaar    try | catch /pat/
42769f7050cSBram Moolenaar    endtry
42869f7050cSBram Moolenaar    try
42969f7050cSBram Moolenaar    catch /pat/ | endtry
43069f7050cSBram Moolenaar    try
43169f7050cSBram Moolenaar    catch /pat/
43269f7050cSBram Moolenaar    endtry
43369f7050cSBram Moolenaar  endif
43469f7050cSBram Moolenaar
43568d130c6SBram Moolenaar  try
436cc673e74SBram Moolenaar    # string slice returns a string, not a number
43768d130c6SBram Moolenaar    n = g:astring[3]
4385e654230SBram Moolenaar  catch /E1012:/
43968d130c6SBram Moolenaar    n = 77
44068d130c6SBram Moolenaar  endtry
44168d130c6SBram Moolenaar  assert_equal(77, n)
44268d130c6SBram Moolenaar
44368d130c6SBram Moolenaar  try
44468d130c6SBram Moolenaar    n = l[g:astring]
4455e654230SBram Moolenaar  catch /E1012:/
44656acb094SBram Moolenaar    n = 88
44768d130c6SBram Moolenaar  endtry
44856acb094SBram Moolenaar  assert_equal(88, n)
44968d130c6SBram Moolenaar
45068d130c6SBram Moolenaar  try
45168d130c6SBram Moolenaar    n = s:does_not_exist
45268d130c6SBram Moolenaar  catch /E121:/
453f0b9f43cSBram Moolenaar    n = 111
454f0b9f43cSBram Moolenaar  endtry
455f0b9f43cSBram Moolenaar  assert_equal(111, n)
456f0b9f43cSBram Moolenaar
457f0b9f43cSBram Moolenaar  try
458f0b9f43cSBram Moolenaar    n = g:does_not_exist
459f0b9f43cSBram Moolenaar  catch /E121:/
46068d130c6SBram Moolenaar    n = 121
46168d130c6SBram Moolenaar  endtry
46268d130c6SBram Moolenaar  assert_equal(121, n)
46368d130c6SBram Moolenaar
464e0de171eSBram Moolenaar  var d = {one: 1}
46568d130c6SBram Moolenaar  try
46668d130c6SBram Moolenaar    n = d[g:astring]
46768d130c6SBram Moolenaar  catch /E716:/
46868d130c6SBram Moolenaar    n = 222
46968d130c6SBram Moolenaar  endtry
47068d130c6SBram Moolenaar  assert_equal(222, n)
471f0b9f43cSBram Moolenaar
472f0b9f43cSBram Moolenaar  try
473f0b9f43cSBram Moolenaar    n = -g:astring
474f0b9f43cSBram Moolenaar  catch /E39:/
475f0b9f43cSBram Moolenaar    n = 233
476f0b9f43cSBram Moolenaar  endtry
477f0b9f43cSBram Moolenaar  assert_equal(233, n)
478f0b9f43cSBram Moolenaar
479f0b9f43cSBram Moolenaar  try
480f0b9f43cSBram Moolenaar    n = +g:astring
481f0b9f43cSBram Moolenaar  catch /E1030:/
482f0b9f43cSBram Moolenaar    n = 244
483f0b9f43cSBram Moolenaar  endtry
484f0b9f43cSBram Moolenaar  assert_equal(244, n)
485f0b9f43cSBram Moolenaar
486f0b9f43cSBram Moolenaar  try
487f0b9f43cSBram Moolenaar    n = +g:alist
488f0b9f43cSBram Moolenaar  catch /E745:/
489f0b9f43cSBram Moolenaar    n = 255
490f0b9f43cSBram Moolenaar  endtry
491f0b9f43cSBram Moolenaar  assert_equal(255, n)
492f0b9f43cSBram Moolenaar
493cfcd011fSBram Moolenaar  var nd: dict<any>
494f0b9f43cSBram Moolenaar  try
4952e5910bfSBram Moolenaar    nd = {[g:alist]: 1}
4962e5910bfSBram Moolenaar  catch /E1105:/
497f0b9f43cSBram Moolenaar    n = 266
498f0b9f43cSBram Moolenaar  endtry
499f0b9f43cSBram Moolenaar  assert_equal(266, n)
500f0b9f43cSBram Moolenaar
501f0b9f43cSBram Moolenaar  try
502f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
503f0b9f43cSBram Moolenaar  catch /E1093:/
504f0b9f43cSBram Moolenaar    n = 277
505f0b9f43cSBram Moolenaar  endtry
506f0b9f43cSBram Moolenaar  assert_equal(277, n)
507f0b9f43cSBram Moolenaar
508e859312eSBram Moolenaar  try
509e859312eSBram Moolenaar    &ts = g:astring
5105e654230SBram Moolenaar  catch /E1012:/
511e859312eSBram Moolenaar    n = 288
512e859312eSBram Moolenaar  endtry
513e859312eSBram Moolenaar  assert_equal(288, n)
514e859312eSBram Moolenaar
515e859312eSBram Moolenaar  try
516e859312eSBram Moolenaar    &backspace = 'asdf'
517e859312eSBram Moolenaar  catch /E474:/
518e859312eSBram Moolenaar    n = 299
519e859312eSBram Moolenaar  endtry
520e859312eSBram Moolenaar  assert_equal(299, n)
521e859312eSBram Moolenaar
522e859312eSBram Moolenaar  l = [1]
523e859312eSBram Moolenaar  try
524e859312eSBram Moolenaar    l[3] = 3
525e859312eSBram Moolenaar  catch /E684:/
526e859312eSBram Moolenaar    n = 300
527e859312eSBram Moolenaar  endtry
528e859312eSBram Moolenaar  assert_equal(300, n)
529e859312eSBram Moolenaar
530e859312eSBram Moolenaar  try
531e859312eSBram Moolenaar    unlet g:does_not_exist
532e859312eSBram Moolenaar  catch /E108:/
533e859312eSBram Moolenaar    n = 322
534e859312eSBram Moolenaar  endtry
535e859312eSBram Moolenaar  assert_equal(322, n)
536e859312eSBram Moolenaar
537e859312eSBram Moolenaar  try
5382bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
539e859312eSBram Moolenaar  catch /E721:/
540e859312eSBram Moolenaar    n = 333
541e859312eSBram Moolenaar  endtry
542e859312eSBram Moolenaar  assert_equal(333, n)
543e859312eSBram Moolenaar
544e859312eSBram Moolenaar  try
545e859312eSBram Moolenaar    l = DeletedFunc()
546e859312eSBram Moolenaar  catch /E933:/
547e859312eSBram Moolenaar    n = 344
548e859312eSBram Moolenaar  endtry
549e859312eSBram Moolenaar  assert_equal(344, n)
550d032f34aSBram Moolenaar
551d032f34aSBram Moolenaar  try
552a764e73dSYegappan Lakshmanan    echo range(1, 2, 0)
553a764e73dSYegappan Lakshmanan  catch /E726:/
554d032f34aSBram Moolenaar    n = 355
555d032f34aSBram Moolenaar  endtry
556d032f34aSBram Moolenaar  assert_equal(355, n)
557d032f34aSBram Moolenaar
558cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
559d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
560d032f34aSBram Moolenaar  try
561d032f34aSBram Moolenaar    echo P()
562d032f34aSBram Moolenaar  catch /E117:/
563d032f34aSBram Moolenaar    n = 366
564d032f34aSBram Moolenaar  endtry
565d032f34aSBram Moolenaar  assert_equal(366, n)
566d032f34aSBram Moolenaar
567d032f34aSBram Moolenaar  try
568d032f34aSBram Moolenaar    echo g:NoSuchFunc()
569d032f34aSBram Moolenaar  catch /E117:/
570d032f34aSBram Moolenaar    n = 377
571d032f34aSBram Moolenaar  endtry
572d032f34aSBram Moolenaar  assert_equal(377, n)
573d032f34aSBram Moolenaar
574d032f34aSBram Moolenaar  try
575d032f34aSBram Moolenaar    echo g:alist + 4
576d032f34aSBram Moolenaar  catch /E745:/
577d032f34aSBram Moolenaar    n = 388
578d032f34aSBram Moolenaar  endtry
579d032f34aSBram Moolenaar  assert_equal(388, n)
580d032f34aSBram Moolenaar
581d032f34aSBram Moolenaar  try
582d032f34aSBram Moolenaar    echo 4 + g:alist
583d032f34aSBram Moolenaar  catch /E745:/
584d032f34aSBram Moolenaar    n = 399
585d032f34aSBram Moolenaar  endtry
586d032f34aSBram Moolenaar  assert_equal(399, n)
587d032f34aSBram Moolenaar
588d032f34aSBram Moolenaar  try
589d032f34aSBram Moolenaar    echo g:alist.member
590d032f34aSBram Moolenaar  catch /E715:/
591d032f34aSBram Moolenaar    n = 400
592d032f34aSBram Moolenaar  endtry
593d032f34aSBram Moolenaar  assert_equal(400, n)
594d032f34aSBram Moolenaar
595d032f34aSBram Moolenaar  try
596d032f34aSBram Moolenaar    echo d.member
597d032f34aSBram Moolenaar  catch /E716:/
598d032f34aSBram Moolenaar    n = 411
599d032f34aSBram Moolenaar  endtry
600d032f34aSBram Moolenaar  assert_equal(411, n)
601d9d7789bSBram Moolenaar
602d9d7789bSBram Moolenaar  var counter = 0
603d9d7789bSBram Moolenaar  for i in range(4)
604d9d7789bSBram Moolenaar    try
605d9d7789bSBram Moolenaar      eval [][0]
606d9d7789bSBram Moolenaar    catch
607d9d7789bSBram Moolenaar    endtry
608d9d7789bSBram Moolenaar    counter += 1
609d9d7789bSBram Moolenaar  endfor
610d9d7789bSBram Moolenaar  assert_equal(4, counter)
6117e82c5f3SBram Moolenaar
6129fa5dabeSBram Moolenaar  # no requirement for spaces before |
6139fa5dabeSBram Moolenaar  try|echo 0|catch|endtry
6149fa5dabeSBram Moolenaar
6157e82c5f3SBram Moolenaar  # return in finally after empty catch
6167e82c5f3SBram Moolenaar  def ReturnInFinally(): number
6177e82c5f3SBram Moolenaar    try
6187e82c5f3SBram Moolenaar    finally
6197e82c5f3SBram Moolenaar      return 4
6207e82c5f3SBram Moolenaar    endtry
6217e82c5f3SBram Moolenaar    return 2
6227e82c5f3SBram Moolenaar  enddef
6237e82c5f3SBram Moolenaar  assert_equal(4, ReturnInFinally())
6248ac681a2SBram Moolenaar
6258ac681a2SBram Moolenaar  var lines =<< trim END
6268ac681a2SBram Moolenaar      vim9script
6278ac681a2SBram Moolenaar      try
6288ac681a2SBram Moolenaar        acos('0.5')
6298ac681a2SBram Moolenaar          ->setline(1)
6308ac681a2SBram Moolenaar      catch
6318ac681a2SBram Moolenaar        g:caught = v:exception
6328ac681a2SBram Moolenaar      endtry
6338ac681a2SBram Moolenaar  END
6348ac681a2SBram Moolenaar  CheckScriptSuccess(lines)
6354490ec4eSYegappan Lakshmanan  assert_match('E1219: Float or Number required for argument 1', g:caught)
6368ac681a2SBram Moolenaar  unlet g:caught
6374197828dSBram Moolenaar
6384197828dSBram Moolenaar  # missing catch and/or finally
6394197828dSBram Moolenaar  lines =<< trim END
6404197828dSBram Moolenaar      vim9script
6414197828dSBram Moolenaar      try
6424197828dSBram Moolenaar        echo 'something'
6434197828dSBram Moolenaar      endtry
6444197828dSBram Moolenaar  END
6454197828dSBram Moolenaar  CheckScriptFailure(lines, 'E1032:')
6468a7d6542SBram Moolenaarenddef
6478a7d6542SBram Moolenaar
6483f987b59SBram Moolenaardef Test_try_in_catch()
6493f987b59SBram Moolenaar  var lines =<< trim END
6503f987b59SBram Moolenaar      vim9script
6513f987b59SBram Moolenaar      var seq = []
6523f987b59SBram Moolenaar      def DoIt()
6533f987b59SBram Moolenaar        try
6543f987b59SBram Moolenaar          seq->add('throw 1')
6553f987b59SBram Moolenaar          eval [][0]
6563f987b59SBram Moolenaar          seq->add('notreached')
6573f987b59SBram Moolenaar        catch
6583f987b59SBram Moolenaar          seq->add('catch')
6593f987b59SBram Moolenaar          try
6603f987b59SBram Moolenaar            seq->add('throw 2')
6613f987b59SBram Moolenaar            eval [][0]
6623f987b59SBram Moolenaar            seq->add('notreached')
6633f987b59SBram Moolenaar          catch /nothing/
6643f987b59SBram Moolenaar            seq->add('notreached')
6653f987b59SBram Moolenaar          endtry
6663f987b59SBram Moolenaar          seq->add('done')
6673f987b59SBram Moolenaar        endtry
6683f987b59SBram Moolenaar      enddef
6693f987b59SBram Moolenaar      DoIt()
6703f987b59SBram Moolenaar      assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
6713f987b59SBram Moolenaar  END
6723f987b59SBram Moolenaarenddef
6733f987b59SBram Moolenaar
674d3d8feebSBram Moolenaardef Test_error_in_catch()
675d3d8feebSBram Moolenaar  var lines =<< trim END
676d3d8feebSBram Moolenaar      try
677d3d8feebSBram Moolenaar        eval [][0]
678d3d8feebSBram Moolenaar      catch /E684:/
679d3d8feebSBram Moolenaar        eval [][0]
680d3d8feebSBram Moolenaar      endtry
681d3d8feebSBram Moolenaar  END
682d3d8feebSBram Moolenaar  CheckDefExecFailure(lines, 'E684:', 4)
683d3d8feebSBram Moolenaarenddef
684d3d8feebSBram Moolenaar
6852e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to
6862e34c34bSBram Moolenaardef TryContinueFunc()
6872e34c34bSBram Moolenaar while g:Count < 2
6882e34c34bSBram Moolenaar   g:sequence ..= 't'
6892e34c34bSBram Moolenaar    try
6902e34c34bSBram Moolenaar      echoerr 'Test'
6912e34c34bSBram Moolenaar    catch
6922e34c34bSBram Moolenaar      g:Count += 1
6932e34c34bSBram Moolenaar      g:sequence ..= 'c'
6942e34c34bSBram Moolenaar      continue
6952e34c34bSBram Moolenaar    endtry
6962e34c34bSBram Moolenaar    g:sequence ..= 'e'
6972e34c34bSBram Moolenaar    g:Count += 1
6982e34c34bSBram Moolenaar  endwhile
6992e34c34bSBram Moolenaarenddef
7002e34c34bSBram Moolenaar
7012e34c34bSBram Moolenaardef Test_continue_in_try_in_while()
7022e34c34bSBram Moolenaar  g:Count = 0
7032e34c34bSBram Moolenaar  g:sequence = ''
7042e34c34bSBram Moolenaar  TryContinueFunc()
7052e34c34bSBram Moolenaar  assert_equal('tctc', g:sequence)
7062e34c34bSBram Moolenaar  unlet g:Count
7072e34c34bSBram Moolenaar  unlet g:sequence
7082e34c34bSBram Moolenaarenddef
7092e34c34bSBram Moolenaar
7109cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
7119cb577a6SBram Moolenaar  # return in try block returns normally
7129cb577a6SBram Moolenaar  def ReturnInTry(): string
7139cb577a6SBram Moolenaar    try
7149cb577a6SBram Moolenaar      return '"some message"'
7159cb577a6SBram Moolenaar    catch
7169cb577a6SBram Moolenaar    endtry
7179cb577a6SBram Moolenaar    return 'not reached'
7189cb577a6SBram Moolenaar  enddef
7199cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
7209cb577a6SBram Moolenaarenddef
7219cb577a6SBram Moolenaar
7221430ceebSBram Moolenaardef Test_cnext_works_in_catch()
7231430ceebSBram Moolenaar  var lines =<< trim END
7241430ceebSBram Moolenaar      vim9script
725c323527dSBram Moolenaar      au BufEnter * eval 1 + 2
7261430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
7271430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
7281430ceebSBram Moolenaar      var items = [
7291430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
7301430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
7311430ceebSBram Moolenaar        ]
7321430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
7331430ceebSBram Moolenaar      cwindow
7341430ceebSBram Moolenaar
7351430ceebSBram Moolenaar      def CnextOrCfirst()
7361430ceebSBram Moolenaar        # if cnext fails, cfirst is used
7371430ceebSBram Moolenaar        try
7381430ceebSBram Moolenaar          cnext
7391430ceebSBram Moolenaar        catch
7401430ceebSBram Moolenaar          cfirst
7411430ceebSBram Moolenaar        endtry
7421430ceebSBram Moolenaar      enddef
7431430ceebSBram Moolenaar
7441430ceebSBram Moolenaar      CnextOrCfirst()
7451430ceebSBram Moolenaar      CnextOrCfirst()
7461430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
7471430ceebSBram Moolenaar      qall
7481430ceebSBram Moolenaar  END
7491430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
7501430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
7511430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
7521430ceebSBram Moolenaar
7531430ceebSBram Moolenaar  delete('Xfile1')
7541430ceebSBram Moolenaar  delete('Xfile2')
7551430ceebSBram Moolenaar  delete('XCatchCnext')
7561430ceebSBram Moolenaar  delete('Xresult')
7571430ceebSBram Moolenaarenddef
7581430ceebSBram Moolenaar
7599e1d9e34SBram Moolenaardef Test_throw_skipped()
7609e1d9e34SBram Moolenaar  if 0
7619e1d9e34SBram Moolenaar    throw dontgethere
7629e1d9e34SBram Moolenaar  endif
7639e1d9e34SBram Moolenaarenddef
7649e1d9e34SBram Moolenaar
7658f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
7668f81b22eSBram Moolenaar  var lines =<< trim END
7678f81b22eSBram Moolenaar    vim9script
7688f81b22eSBram Moolenaar    def Func()
7698f81b22eSBram Moolenaar      throw 'error'
7708f81b22eSBram Moolenaar    enddef
7718f81b22eSBram Moolenaar    silent! Func()
7728f81b22eSBram Moolenaar  END
7738f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
7748f81b22eSBram Moolenaar  source XthrowSilenced
7758f81b22eSBram Moolenaar  delete('XthrowSilenced')
7768f81b22eSBram Moolenaarenddef
7778f81b22eSBram Moolenaar
778e859312eSBram Moolenaardef DeletedFunc(): list<any>
779e859312eSBram Moolenaar  return ['delete me']
780e859312eSBram Moolenaarenddef
781e859312eSBram Moolenaardefcompile
782e859312eSBram Moolenaardelfunc DeletedFunc
783e859312eSBram Moolenaar
784257cc5eeSBram Moolenaardef ThrowFromDef()
785a72cfb80SBram Moolenaar  throw "getout" # comment
786257cc5eeSBram Moolenaarenddef
787257cc5eeSBram Moolenaar
788257cc5eeSBram Moolenaarfunc CatchInFunc()
789257cc5eeSBram Moolenaar  try
790257cc5eeSBram Moolenaar    call ThrowFromDef()
791257cc5eeSBram Moolenaar  catch
792257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
793257cc5eeSBram Moolenaar  endtry
794257cc5eeSBram Moolenaarendfunc
795257cc5eeSBram Moolenaar
796257cc5eeSBram Moolenaardef CatchInDef()
797257cc5eeSBram Moolenaar  try
798257cc5eeSBram Moolenaar    ThrowFromDef()
799257cc5eeSBram Moolenaar  catch
800257cc5eeSBram Moolenaar    g:thrown_def = v:exception
801257cc5eeSBram Moolenaar  endtry
802257cc5eeSBram Moolenaarenddef
803257cc5eeSBram Moolenaar
804f575adffSBram Moolenaardef ReturnFinally(): string
805f575adffSBram Moolenaar  try
806f575adffSBram Moolenaar    return 'intry'
807373863edSBram Moolenaar  finall
808f575adffSBram Moolenaar    g:in_finally = 'finally'
809f575adffSBram Moolenaar  endtry
810f575adffSBram Moolenaar  return 'end'
811f575adffSBram Moolenaarenddef
812f575adffSBram Moolenaar
813257cc5eeSBram Moolenaardef Test_try_catch_nested()
814257cc5eeSBram Moolenaar  CatchInFunc()
815257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
816257cc5eeSBram Moolenaar
817257cc5eeSBram Moolenaar  CatchInDef()
818257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
819f575adffSBram Moolenaar
820f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
821f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
822d3d8feebSBram Moolenaar
823d3d8feebSBram Moolenaar  var l = []
824d3d8feebSBram Moolenaar  try
825d3d8feebSBram Moolenaar    l->add('1')
826d3d8feebSBram Moolenaar    throw 'bad'
827d3d8feebSBram Moolenaar    l->add('x')
828d3d8feebSBram Moolenaar  catch /bad/
829d3d8feebSBram Moolenaar    l->add('2')
830d3d8feebSBram Moolenaar    try
831d3d8feebSBram Moolenaar      l->add('3')
832d3d8feebSBram Moolenaar      throw 'one'
833d3d8feebSBram Moolenaar      l->add('x')
834d3d8feebSBram Moolenaar    catch /one/
835d3d8feebSBram Moolenaar      l->add('4')
836d3d8feebSBram Moolenaar      try
837d3d8feebSBram Moolenaar        l->add('5')
838d3d8feebSBram Moolenaar        throw 'more'
839d3d8feebSBram Moolenaar        l->add('x')
840d3d8feebSBram Moolenaar      catch /more/
841d3d8feebSBram Moolenaar        l->add('6')
842d3d8feebSBram Moolenaar      endtry
843d3d8feebSBram Moolenaar    endtry
844d3d8feebSBram Moolenaar  endtry
845d3d8feebSBram Moolenaar  assert_equal(['1', '2', '3', '4', '5', '6'], l)
846834193afSBram Moolenaar
847834193afSBram Moolenaar  l = []
848834193afSBram Moolenaar  try
849834193afSBram Moolenaar    try
850834193afSBram Moolenaar      l->add('1')
851834193afSBram Moolenaar      throw 'foo'
852834193afSBram Moolenaar      l->add('x')
853834193afSBram Moolenaar    catch
854834193afSBram Moolenaar      l->add('2')
855834193afSBram Moolenaar      throw 'bar'
856834193afSBram Moolenaar      l->add('x')
857834193afSBram Moolenaar    finally
858834193afSBram Moolenaar      l->add('3')
859834193afSBram Moolenaar    endtry
860834193afSBram Moolenaar    l->add('x')
861834193afSBram Moolenaar  catch /bar/
862834193afSBram Moolenaar    l->add('4')
863834193afSBram Moolenaar  endtry
864834193afSBram Moolenaar  assert_equal(['1', '2', '3', '4'], l)
865f575adffSBram Moolenaarenddef
866f575adffSBram Moolenaar
8679939f57bSBram Moolenaardef TryOne(): number
8689939f57bSBram Moolenaar  try
8699939f57bSBram Moolenaar    return 0
8709939f57bSBram Moolenaar  catch
8719939f57bSBram Moolenaar  endtry
8729939f57bSBram Moolenaar  return 0
8739939f57bSBram Moolenaarenddef
8749939f57bSBram Moolenaar
8759939f57bSBram Moolenaardef TryTwo(n: number): string
8769939f57bSBram Moolenaar  try
877cfcd011fSBram Moolenaar    var x = {}
8789939f57bSBram Moolenaar  catch
8799939f57bSBram Moolenaar  endtry
8809939f57bSBram Moolenaar  return 'text'
8819939f57bSBram Moolenaarenddef
8829939f57bSBram Moolenaar
8839939f57bSBram Moolenaardef Test_try_catch_twice()
8849939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
8859939f57bSBram Moolenaarenddef
8869939f57bSBram Moolenaar
887f575adffSBram Moolenaardef Test_try_catch_match()
888cfcd011fSBram Moolenaar  var seq = 'a'
889f575adffSBram Moolenaar  try
890f575adffSBram Moolenaar    throw 'something'
891f575adffSBram Moolenaar  catch /nothing/
892f575adffSBram Moolenaar    seq ..= 'x'
893f575adffSBram Moolenaar  catch /some/
894f575adffSBram Moolenaar    seq ..= 'b'
895f575adffSBram Moolenaar  catch /asdf/
896f575adffSBram Moolenaar    seq ..= 'x'
897e8c4abbbSBram Moolenaar  catch ?a\?sdf?
898e8c4abbbSBram Moolenaar    seq ..= 'y'
899f575adffSBram Moolenaar  finally
900f575adffSBram Moolenaar    seq ..= 'c'
901f575adffSBram Moolenaar  endtry
902f575adffSBram Moolenaar  assert_equal('abc', seq)
903257cc5eeSBram Moolenaarenddef
904257cc5eeSBram Moolenaar
905e8c4abbbSBram Moolenaardef Test_try_catch_fails()
906d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
907d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
908d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
909d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
910d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
911d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
912d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
913d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
91413106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
915d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
916585fea7bSBram Moolenaar
917e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
918d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
919e8c4abbbSBram Moolenaarenddef
920e8c4abbbSBram Moolenaar
9217c5b3c03SBram Moolenaardef Try_catch_skipped()
9227c5b3c03SBram Moolenaar  var l = []
9237c5b3c03SBram Moolenaar  try
9247c5b3c03SBram Moolenaar  finally
9257c5b3c03SBram Moolenaar  endtry
9267c5b3c03SBram Moolenaar
9277c5b3c03SBram Moolenaar  if 1
9287c5b3c03SBram Moolenaar  else
9297c5b3c03SBram Moolenaar    try
9307c5b3c03SBram Moolenaar    endtry
9317c5b3c03SBram Moolenaar  endif
9327c5b3c03SBram Moolenaarenddef
9337c5b3c03SBram Moolenaar
9347c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
9357c5b3c03SBram Moolenaardef Test_try_catch_skipped()
9367c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
9377c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
9387c5b3c03SBram Moolenaarenddef
9397c5b3c03SBram Moolenaar
9407c5b3c03SBram Moolenaar
9417c5b3c03SBram Moolenaar
942006ad48bSBram Moolenaardef Test_throw_vimscript()
943f5be8cdbSBram Moolenaar  # only checks line continuation
944cfcd011fSBram Moolenaar  var lines =<< trim END
945006ad48bSBram Moolenaar      vim9script
946006ad48bSBram Moolenaar      try
947006ad48bSBram Moolenaar        throw 'one'
948006ad48bSBram Moolenaar              .. 'two'
949006ad48bSBram Moolenaar      catch
950006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
951006ad48bSBram Moolenaar      endtry
952006ad48bSBram Moolenaar  END
953006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
9541e021e63SBram Moolenaar
9551e021e63SBram Moolenaar  lines =<< trim END
9561e021e63SBram Moolenaar    vim9script
957352134bbSBram Moolenaar    @r = ''
9581e021e63SBram Moolenaar    def Func()
9591e021e63SBram Moolenaar      throw @r
9601e021e63SBram Moolenaar    enddef
9611e021e63SBram Moolenaar    var result = ''
9621e021e63SBram Moolenaar    try
9631e021e63SBram Moolenaar      Func()
9641e021e63SBram Moolenaar    catch /E1129:/
9651e021e63SBram Moolenaar      result = 'caught'
9661e021e63SBram Moolenaar    endtry
9671e021e63SBram Moolenaar    assert_equal('caught', result)
9681e021e63SBram Moolenaar  END
9691e021e63SBram Moolenaar  CheckScriptSuccess(lines)
970006ad48bSBram Moolenaarenddef
971006ad48bSBram Moolenaar
972ed677f55SBram Moolenaardef Test_error_in_nested_function()
97303dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
974cfcd011fSBram Moolenaar  var lines =<< trim END
975ed677f55SBram Moolenaar      vim9script
976ed677f55SBram Moolenaar      def Func()
977ed677f55SBram Moolenaar        Error()
978ed677f55SBram Moolenaar        g:test_var = 1
979ed677f55SBram Moolenaar      enddef
980ed677f55SBram Moolenaar      func Error() abort
981ed677f55SBram Moolenaar        eval [][0]
982ed677f55SBram Moolenaar      endfunc
983ed677f55SBram Moolenaar      Func()
984ed677f55SBram Moolenaar  END
985ed677f55SBram Moolenaar  g:test_var = 0
986ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
987ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
988ed677f55SBram Moolenaarenddef
989ed677f55SBram Moolenaar
990227c58a4SBram Moolenaardef Test_abort_after_error()
991227c58a4SBram Moolenaar  var lines =<< trim END
992227c58a4SBram Moolenaar      vim9script
993227c58a4SBram Moolenaar      while true
994227c58a4SBram Moolenaar        echo notfound
995227c58a4SBram Moolenaar      endwhile
996227c58a4SBram Moolenaar      g:gotthere = true
997227c58a4SBram Moolenaar  END
998227c58a4SBram Moolenaar  g:gotthere = false
999227c58a4SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
1000227c58a4SBram Moolenaar  assert_false(g:gotthere)
1001227c58a4SBram Moolenaar  unlet g:gotthere
1002227c58a4SBram Moolenaarenddef
1003227c58a4SBram Moolenaar
100437c83711SBram Moolenaardef Test_cexpr_vimscript()
1005f5be8cdbSBram Moolenaar  # only checks line continuation
100637c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
1007cfcd011fSBram Moolenaar  var lines =<< trim END
100837c83711SBram Moolenaar      vim9script
100937c83711SBram Moolenaar      cexpr 'File'
101037c83711SBram Moolenaar                .. ' someFile' ..
101137c83711SBram Moolenaar                   ' line 19'
101237c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
101337c83711SBram Moolenaar  END
101437c83711SBram Moolenaar  CheckScriptSuccess(lines)
101537c83711SBram Moolenaar  set errorformat&
101637c83711SBram Moolenaarenddef
101737c83711SBram Moolenaar
1018c9edd6b5SBram Moolenaardef Test_statusline_syntax()
1019c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
1020cfcd011fSBram Moolenaar  var lines =<< trim END
1021c9edd6b5SBram Moolenaar      vim9script
1022c9edd6b5SBram Moolenaar      func g:Status()
1023c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
1024c9edd6b5SBram Moolenaar      endfunc
1025c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
1026c9edd6b5SBram Moolenaar      redrawstatus
1027c9edd6b5SBram Moolenaar      set laststatus statusline=
1028c9edd6b5SBram Moolenaar  END
1029c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1030c9edd6b5SBram Moolenaarenddef
1031c9edd6b5SBram Moolenaar
1032b209750bSBram Moolenaardef Test_list_vimscript()
1033b209750bSBram Moolenaar  # checks line continuation and comments
1034cfcd011fSBram Moolenaar  var lines =<< trim END
1035b209750bSBram Moolenaar      vim9script
1036cfcd011fSBram Moolenaar      var mylist = [
1037b209750bSBram Moolenaar            'one',
1038b209750bSBram Moolenaar            # comment
1039b209750bSBram Moolenaar            'two', # empty line follows
1040b209750bSBram Moolenaar
1041b209750bSBram Moolenaar            'three',
1042b209750bSBram Moolenaar            ]
1043b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1044b209750bSBram Moolenaar  END
1045b209750bSBram Moolenaar  CheckScriptSuccess(lines)
104666250c93SBram Moolenaar
104766250c93SBram Moolenaar  # check all lines from heredoc are kept
104866250c93SBram Moolenaar  lines =<< trim END
104966250c93SBram Moolenaar      # comment 1
105066250c93SBram Moolenaar      two
105166250c93SBram Moolenaar      # comment 3
105266250c93SBram Moolenaar
105366250c93SBram Moolenaar      five
105466250c93SBram Moolenaar      # comment 6
105566250c93SBram Moolenaar  END
105666250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
10574bce26bbSBram Moolenaar
10584bce26bbSBram Moolenaar  lines =<< trim END
10594bce26bbSBram Moolenaar    [{
10604bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
10614bce26bbSBram Moolenaar  END
10624bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1063b209750bSBram Moolenaarenddef
1064b209750bSBram Moolenaar
10652a1381c3SBram Moolenaarif has('channel')
106640ee466cSBram Moolenaar  let someJob = test_null_job()
106740ee466cSBram Moolenaar
106840ee466cSBram Moolenaar  def FuncWithError()
106940ee466cSBram Moolenaar    echomsg g:someJob
107040ee466cSBram Moolenaar  enddef
107140ee466cSBram Moolenaar
107240ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
107340ee466cSBram Moolenaar    try
107440ee466cSBram Moolenaar      call FuncWithError()
107540ee466cSBram Moolenaar    catch
107640ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
107740ee466cSBram Moolenaar    endtry
107840ee466cSBram Moolenaar  endfunc
10792a1381c3SBram Moolenaarendif
108040ee466cSBram Moolenaar
10818a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
10828a7d6542SBram Moolenaar  vim9script
1083cfcd011fSBram Moolenaar  var name: string = 'bob'
10848a7d6542SBram Moolenaar  def Concat(arg: string): string
10858a7d6542SBram Moolenaar    return name .. arg
10868a7d6542SBram Moolenaar  enddef
1087227a69deSBram Moolenaar  g:result = Concat('bie')
1088227a69deSBram Moolenaar  g:localname = name
10898a7d6542SBram Moolenaar
10908a7d6542SBram Moolenaar  export const CONST = 1234
1091cfcd011fSBram Moolenaar  export var exported = 9876
1092cfcd011fSBram Moolenaar  export var exp_name = 'John'
10938a7d6542SBram Moolenaar  export def Exported(): string
10948a7d6542SBram Moolenaar    return 'Exported'
10958a7d6542SBram Moolenaar  enddef
109624e93165SBram Moolenaar  export def ExportedValue(): number
109724e93165SBram Moolenaar    return exported
109824e93165SBram Moolenaar  enddef
109924e93165SBram Moolenaar  export def ExportedInc()
110024e93165SBram Moolenaar    exported += 5
110124e93165SBram Moolenaar  enddef
11020f2a5cc6SBram Moolenaar  export final theList = [1]
11038a7d6542SBram MoolenaarEND
11048a7d6542SBram Moolenaar
1105b3ca9824SBram Moolenaardef Undo_export_script_lines()
1106b3ca9824SBram Moolenaar  unlet g:result
1107b3ca9824SBram Moolenaar  unlet g:localname
1108b3ca9824SBram Moolenaarenddef
1109b3ca9824SBram Moolenaar
11105269bd2aSBram Moolenaardef Test_vim9_import_export()
1111cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
11128a7d6542SBram Moolenaar    vim9script
111324e93165SBram Moolenaar    import {exported, Exported, ExportedValue} from './Xexport.vim'
111424e93165SBram Moolenaar    g:exported1 = exported
11156e587dcbSBram Moolenaar    exported += 3
111624e93165SBram Moolenaar    g:exported2 = exported
111724e93165SBram Moolenaar    g:exported3 = ExportedValue()
111824e93165SBram Moolenaar
111924e93165SBram Moolenaar    import ExportedInc from './Xexport.vim'
112024e93165SBram Moolenaar    ExportedInc()
112124e93165SBram Moolenaar    g:exported_i1 = exported
112224e93165SBram Moolenaar    g:exported_i2 = ExportedValue()
112324e93165SBram Moolenaar
112424e93165SBram Moolenaar    exported = 11
112524e93165SBram Moolenaar    g:exported_s1 = exported
112624e93165SBram Moolenaar    g:exported_s2 = ExportedValue()
112724e93165SBram Moolenaar
11288a7d6542SBram Moolenaar    g:imported_func = Exported()
11296e587dcbSBram Moolenaar
113040f4f7a4SBram Moolenaar    def GetExported(): string
1131e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
113240f4f7a4SBram Moolenaar      return local_dict.ref()
113340f4f7a4SBram Moolenaar    enddef
113440f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
113540f4f7a4SBram Moolenaar
11364db572eeSBram Moolenaar    var dir = './'
11374db572eeSBram Moolenaar    var ext = ".vim"
11384db572eeSBram Moolenaar    import {exp_name} from dir .. 'Xexport' .. ext
11396e587dcbSBram Moolenaar    g:imported_name = exp_name
11406e587dcbSBram Moolenaar    exp_name ..= ' Doe'
11416e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
114224e93165SBram Moolenaar    g:exported_later = exported
11430f2a5cc6SBram Moolenaar
11440f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
11450f2a5cc6SBram Moolenaar    theList->add(2)
11460f2a5cc6SBram Moolenaar    assert_equal([1, 2], theList)
11478a7d6542SBram Moolenaar  END
11488a7d6542SBram Moolenaar
11498a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
11508a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
11518a7d6542SBram Moolenaar
11528a7d6542SBram Moolenaar  source Ximport.vim
11538a7d6542SBram Moolenaar
11548a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
11558a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
115624e93165SBram Moolenaar  assert_equal(9876, g:exported1)
115724e93165SBram Moolenaar  assert_equal(9879, g:exported2)
115824e93165SBram Moolenaar  assert_equal(9879, g:exported3)
115924e93165SBram Moolenaar
116024e93165SBram Moolenaar  assert_equal(9884, g:exported_i1)
116124e93165SBram Moolenaar  assert_equal(9884, g:exported_i2)
116224e93165SBram Moolenaar
116324e93165SBram Moolenaar  assert_equal(11, g:exported_s1)
116424e93165SBram Moolenaar  assert_equal(11, g:exported_s2)
116524e93165SBram Moolenaar  assert_equal(11, g:exported_later)
116624e93165SBram Moolenaar
11678a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
116840f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
11696e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
11706e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
11718a7d6542SBram Moolenaar  assert_false(exists('g:name'))
11728a7d6542SBram Moolenaar
1173b3ca9824SBram Moolenaar  Undo_export_script_lines()
117424e93165SBram Moolenaar  unlet g:exported1
117524e93165SBram Moolenaar  unlet g:exported2
117624e93165SBram Moolenaar  unlet g:exported3
117724e93165SBram Moolenaar  unlet g:exported_i1
117824e93165SBram Moolenaar  unlet g:exported_i2
117924e93165SBram Moolenaar  unlet g:exported_later
11808a7d6542SBram Moolenaar  unlet g:imported_func
11816e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
11828a7d6542SBram Moolenaar  delete('Ximport.vim')
1183f2d5c240SBram Moolenaar
11841c991144SBram Moolenaar  # similar, with line breaks
1185cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
11861c991144SBram Moolenaar    vim9script
11871c991144SBram Moolenaar    import {
11881c991144SBram Moolenaar        exported,
11891c991144SBram Moolenaar        Exported,
11901c991144SBram Moolenaar        }
11911c991144SBram Moolenaar        from
11921c991144SBram Moolenaar        './Xexport.vim'
119324e93165SBram Moolenaar    g:exported = exported
119424e93165SBram Moolenaar    exported += 7
119524e93165SBram Moolenaar    g:exported_added = exported
11961c991144SBram Moolenaar    g:imported_func = Exported()
11971c991144SBram Moolenaar  END
11981c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
11991c991144SBram Moolenaar  source Ximport_lbr.vim
12001c991144SBram Moolenaar
120124e93165SBram Moolenaar  assert_equal(11, g:exported)
120224e93165SBram Moolenaar  assert_equal(18, g:exported_added)
12031c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
12041c991144SBram Moolenaar
12051c991144SBram Moolenaar  # exported script not sourced again
12061c991144SBram Moolenaar  assert_false(exists('g:result'))
120724e93165SBram Moolenaar  unlet g:exported
120824e93165SBram Moolenaar  unlet g:exported_added
12091c991144SBram Moolenaar  unlet g:imported_func
12101c991144SBram Moolenaar  delete('Ximport_lbr.vim')
12111c991144SBram Moolenaar
1212cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1213f2d5c240SBram Moolenaar    vim9script
1214f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1215f2d5c240SBram Moolenaar    def UseExport()
121624e93165SBram Moolenaar      g:exported_def = Export.exported
1217f2d5c240SBram Moolenaar    enddef
121824e93165SBram Moolenaar    g:exported_script = Export.exported
1219cb4e80faSBram Moolenaar    assert_equal(1, exists('Export.exported'))
1220cb4e80faSBram Moolenaar    assert_equal(0, exists('Export.notexported'))
1221f2d5c240SBram Moolenaar    UseExport()
1222f2d5c240SBram Moolenaar  END
1223f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1224f2d5c240SBram Moolenaar  source Ximport.vim
122524e93165SBram Moolenaar
122624e93165SBram Moolenaar  assert_equal(18, g:exported_def)
122724e93165SBram Moolenaar  assert_equal(18, g:exported_script)
122824e93165SBram Moolenaar  unlet g:exported_def
122924e93165SBram Moolenaar  unlet g:exported_script
1230f2d5c240SBram Moolenaar
1231cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1232599c89c8SBram Moolenaar    vim9script
1233599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1234599c89c8SBram Moolenaar    def Func()
1235cfcd011fSBram Moolenaar      var dummy = 1
1236cfcd011fSBram Moolenaar      var imported = Export + dummy
1237599c89c8SBram Moolenaar    enddef
1238822ba247SBram Moolenaar    defcompile
1239599c89c8SBram Moolenaar  END
1240599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
124144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1242599c89c8SBram Moolenaar
1243cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1244599c89c8SBram Moolenaar    vim9script
1245599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1246599c89c8SBram Moolenaar    def Func()
1247cfcd011fSBram Moolenaar      var imported = Export . exported
1248599c89c8SBram Moolenaar    enddef
1249822ba247SBram Moolenaar    defcompile
1250599c89c8SBram Moolenaar  END
1251599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
125244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1253599c89c8SBram Moolenaar
1254921ba529SBram Moolenaar  var import_func_duplicated =<< trim END
1255921ba529SBram Moolenaar    vim9script
1256921ba529SBram Moolenaar    import ExportedInc from './Xexport.vim'
1257921ba529SBram Moolenaar    import ExportedInc from './Xexport.vim'
1258921ba529SBram Moolenaar
1259921ba529SBram Moolenaar    ExportedInc()
1260921ba529SBram Moolenaar  END
1261921ba529SBram Moolenaar  writefile(import_func_duplicated, 'Ximport.vim')
1262921ba529SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
1263921ba529SBram Moolenaar
1264a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1265a6294955SBram Moolenaar    vim9script
1266a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1267a6294955SBram Moolenaar    var some = 'other'
1268a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1269a6294955SBram Moolenaar    defcompile
1270a6294955SBram Moolenaar  END
1271a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1272a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1273a6294955SBram Moolenaar
1274cb4e80faSBram Moolenaar  var import_star_as_lines_script_no_dot =<< trim END
1275cb4e80faSBram Moolenaar    vim9script
1276cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1277cb4e80faSBram Moolenaar    g:imported_script = Export exported
1278cb4e80faSBram Moolenaar  END
1279cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
1280cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1029:')
1281cb4e80faSBram Moolenaar
1282cb4e80faSBram Moolenaar  var import_star_as_lines_script_space_after_dot =<< trim END
1283cb4e80faSBram Moolenaar    vim9script
1284cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1285cb4e80faSBram Moolenaar    g:imported_script = Export. exported
1286cb4e80faSBram Moolenaar  END
1287cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1288cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1289cb4e80faSBram Moolenaar
1290cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1291599c89c8SBram Moolenaar    vim9script
1292599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1293599c89c8SBram Moolenaar    def Func()
1294cfcd011fSBram Moolenaar      var imported = Export.
1295599c89c8SBram Moolenaar    enddef
1296822ba247SBram Moolenaar    defcompile
1297599c89c8SBram Moolenaar  END
1298599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
129944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1300599c89c8SBram Moolenaar
1301cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
13021c991144SBram Moolenaar    vim9script
13031c991144SBram Moolenaar    import *
13041c991144SBram Moolenaar        as Export
13051c991144SBram Moolenaar        from
13061c991144SBram Moolenaar        './Xexport.vim'
13071c991144SBram Moolenaar    def UseExport()
130824e93165SBram Moolenaar      g:exported = Export.exported
13091c991144SBram Moolenaar    enddef
13101c991144SBram Moolenaar    UseExport()
13111c991144SBram Moolenaar  END
13121c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
13131c991144SBram Moolenaar  source Ximport.vim
131424e93165SBram Moolenaar  assert_equal(18, g:exported)
131524e93165SBram Moolenaar  unlet g:exported
13161c991144SBram Moolenaar
1317cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1318f2d5c240SBram Moolenaar    vim9script
1319f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1320f2d5c240SBram Moolenaar  END
1321f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
132244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1323f2d5c240SBram Moolenaar
1324f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1325cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1326fa29c8abSBram Moolenaar    vim9script
1327fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1328fa29c8abSBram Moolenaar  END
1329fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
133044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1331fa29c8abSBram Moolenaar
1332f5be8cdbSBram Moolenaar  # try to import something that is already defined
1333cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
13345269bd2aSBram Moolenaar    vim9script
1335cfcd011fSBram Moolenaar    var exported = 'something'
13365269bd2aSBram Moolenaar    import exported from './Xexport.vim'
13375269bd2aSBram Moolenaar  END
13385269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1339057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13405269bd2aSBram Moolenaar
1341f5be8cdbSBram Moolenaar  # try to import something that is already defined
13425269bd2aSBram Moolenaar  import_already_defined =<< trim END
13435269bd2aSBram Moolenaar    vim9script
1344cfcd011fSBram Moolenaar    var exported = 'something'
13455269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
13465269bd2aSBram Moolenaar  END
13475269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1348057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13495269bd2aSBram Moolenaar
1350f5be8cdbSBram Moolenaar  # try to import something that is already defined
13515269bd2aSBram Moolenaar  import_already_defined =<< trim END
13525269bd2aSBram Moolenaar    vim9script
1353cfcd011fSBram Moolenaar    var exported = 'something'
13545269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
13555269bd2aSBram Moolenaar  END
13565269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1357057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13585269bd2aSBram Moolenaar
1359918a4249SBram Moolenaar  # try changing an imported const
1360918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1361918a4249SBram Moolenaar    vim9script
1362918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1363918a4249SBram Moolenaar    def Assign()
1364918a4249SBram Moolenaar      CONST = 987
1365918a4249SBram Moolenaar    enddef
1366918a4249SBram Moolenaar    defcompile
1367918a4249SBram Moolenaar  END
1368918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1369918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1370918a4249SBram Moolenaar
13710f2a5cc6SBram Moolenaar  # try changing an imported final
13720f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
13730f2a5cc6SBram Moolenaar    vim9script
13740f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
13750f2a5cc6SBram Moolenaar    def Assign()
13760f2a5cc6SBram Moolenaar      theList = [2]
13770f2a5cc6SBram Moolenaar    enddef
13780f2a5cc6SBram Moolenaar    defcompile
13790f2a5cc6SBram Moolenaar  END
13800f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
13810f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
13820f2a5cc6SBram Moolenaar
1383f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1384cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1385fa29c8abSBram Moolenaar    vim9script
1386fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1387fa29c8abSBram Moolenaar  END
1388fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
138944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1390fa29c8abSBram Moolenaar
1391cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1392fa29c8abSBram Moolenaar    vim9script
1393fa29c8abSBram Moolenaar    import name './Xexport.vim'
1394fa29c8abSBram Moolenaar  END
1395fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
139644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1397fa29c8abSBram Moolenaar
1398cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1399fa29c8abSBram Moolenaar    vim9script
1400fa29c8abSBram Moolenaar    import name from Xexport.vim
1401fa29c8abSBram Moolenaar  END
1402fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
14034db572eeSBram Moolenaar  assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim')
1404fa29c8abSBram Moolenaar
1405cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1406fa29c8abSBram Moolenaar    vim9script
1407fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1408fa29c8abSBram Moolenaar  END
1409fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
141044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1411fa29c8abSBram Moolenaar
1412cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1413fa29c8abSBram Moolenaar    vim9script
1414fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1415fa29c8abSBram Moolenaar  END
14165269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
141744d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1418fa29c8abSBram Moolenaar
141960579350SBram Moolenaar  var import_redefining_lines =<< trim END
142060579350SBram Moolenaar    vim9script
142160579350SBram Moolenaar    import exported from './Xexport.vim'
142260579350SBram Moolenaar    var exported = 5
142360579350SBram Moolenaar  END
142460579350SBram Moolenaar  writefile(import_redefining_lines, 'Ximport.vim')
142560579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3)
142660579350SBram Moolenaar
142760579350SBram Moolenaar  var import_assign_wrong_type_lines =<< trim END
142860579350SBram Moolenaar    vim9script
142960579350SBram Moolenaar    import exported from './Xexport.vim'
143060579350SBram Moolenaar    exported = 'xxx'
143160579350SBram Moolenaar  END
143260579350SBram Moolenaar  writefile(import_assign_wrong_type_lines, 'Ximport.vim')
143360579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3)
143460579350SBram Moolenaar
143560579350SBram Moolenaar  var import_assign_const_lines =<< trim END
143660579350SBram Moolenaar    vim9script
143760579350SBram Moolenaar    import CONST from './Xexport.vim'
143860579350SBram Moolenaar    CONST = 4321
143960579350SBram Moolenaar  END
144060579350SBram Moolenaar  writefile(import_assign_const_lines, 'Ximport.vim')
144160579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E741: Value is locked: CONST', '', 3)
144260579350SBram Moolenaar
1443f2d5c240SBram Moolenaar  delete('Ximport.vim')
14445269bd2aSBram Moolenaar  delete('Ximport3.vim')
14458a7d6542SBram Moolenaar  delete('Xexport.vim')
14468a7d6542SBram Moolenaar
1447f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
14483e191694SBram Moolenaar  # Flags added or removed are also applied to the restored value.
14493e191694SBram Moolenaar  set cpo=abcd
1450cfcd011fSBram Moolenaar  var lines =<< trim END
1451750802b5SBram Moolenaar    vim9script
1452750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
14533e191694SBram Moolenaar    set cpo+=f
14543e191694SBram Moolenaar    set cpo-=c
14553e191694SBram Moolenaar    g:cpo_after_vim9script = &cpo
1456750802b5SBram Moolenaar  END
1457750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1458750802b5SBram Moolenaar  source Xvim9_script
14593e191694SBram Moolenaar  assert_equal('fabd', &cpo)
1460750802b5SBram Moolenaar  set cpo&vim
1461750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
14623e191694SBram Moolenaar  var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
14633e191694SBram Moolenaar  assert_equal(newcpo, g:cpo_after_vim9script)
14643e191694SBram Moolenaar
1465750802b5SBram Moolenaar  delete('Xvim9_script')
1466750802b5SBram Moolenaarenddef
1467750802b5SBram Moolenaar
14680a84284eSBram Moolenaardef Test_import_as()
14690a84284eSBram Moolenaar  var export_lines =<< trim END
14700a84284eSBram Moolenaar    vim9script
14710a84284eSBram Moolenaar    export var one = 1
14720a84284eSBram Moolenaar    export var yes = 'yes'
1473c967d57aSBram Moolenaar    export var slist: list<string>
14740a84284eSBram Moolenaar  END
14750a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
14760a84284eSBram Moolenaar
14770a84284eSBram Moolenaar  var import_lines =<< trim END
14780a84284eSBram Moolenaar    vim9script
14796c7cc347SBram Moolenaar    var one = 'notused'
14806c7cc347SBram Moolenaar    var yes = 777
14810a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
14820a84284eSBram Moolenaar    assert_equal(1, thatOne)
14830a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
14840a84284eSBram Moolenaar    assert_equal('yes', yesYes)
14850a84284eSBram Moolenaar  END
14860a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
14870a84284eSBram Moolenaar
14880a84284eSBram Moolenaar  import_lines =<< trim END
14890a84284eSBram Moolenaar    vim9script
14900a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
14910a84284eSBram Moolenaar    assert_equal(1, thatOne)
14920a84284eSBram Moolenaar    assert_equal('yes', yesYes)
14930a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
14940a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
14950a84284eSBram Moolenaar  END
14960a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
14970a84284eSBram Moolenaar
1498c967d57aSBram Moolenaar  import_lines =<< trim END
1499c967d57aSBram Moolenaar    vim9script
1500c967d57aSBram Moolenaar    import {slist as impSlist} from './XexportAs'
1501c967d57aSBram Moolenaar    impSlist->add(123)
1502c967d57aSBram Moolenaar  END
1503c967d57aSBram Moolenaar  CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number')
1504c967d57aSBram Moolenaar
15050a84284eSBram Moolenaar  delete('XexportAs')
15060a84284eSBram Moolenaarenddef
15070a84284eSBram Moolenaar
1508803af686SBram Moolenaarfunc g:Trigger()
1509803af686SBram Moolenaar  source Ximport.vim
1510803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1511803af686SBram Moolenaarendfunc
1512803af686SBram Moolenaar
1513803af686SBram Moolenaardef Test_import_export_expr_map()
1514803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1515cfcd011fSBram Moolenaar  var export_lines =<< trim END
1516803af686SBram Moolenaar    vim9script
1517803af686SBram Moolenaar    export def That(): string
1518803af686SBram Moolenaar      return 'yes'
1519803af686SBram Moolenaar    enddef
1520803af686SBram Moolenaar  END
1521803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1522803af686SBram Moolenaar
1523cfcd011fSBram Moolenaar  var import_lines =<< trim END
1524803af686SBram Moolenaar    vim9script
1525803af686SBram Moolenaar    import That from './Xexport_that.vim'
1526803af686SBram Moolenaar    assert_equal('yes', That())
1527803af686SBram Moolenaar  END
1528803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1529803af686SBram Moolenaar
1530803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1531803af686SBram Moolenaar  feedkeys('trigger', "xt")
1532803af686SBram Moolenaar
1533730b2483SBram Moolenaar  delete('Xexport_that.vim')
1534803af686SBram Moolenaar  delete('Ximport.vim')
1535803af686SBram Moolenaar  nunmap trigger
1536803af686SBram Moolenaarenddef
1537803af686SBram Moolenaar
15388e1986e3SBram Moolenaardef Test_import_in_filetype()
15398e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
15408e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1541cfcd011fSBram Moolenaar  var export_lines =<< trim END
15428e1986e3SBram Moolenaar    vim9script
1543cfcd011fSBram Moolenaar    export var That = 'yes'
15448e1986e3SBram Moolenaar  END
1545730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
15468e1986e3SBram Moolenaar
1547cfcd011fSBram Moolenaar  var import_lines =<< trim END
15488e1986e3SBram Moolenaar    vim9script
1549730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
15508e1986e3SBram Moolenaar    assert_equal('yes', That)
15518e1986e3SBram Moolenaar    g:did_load_mytpe = 1
15528e1986e3SBram Moolenaar  END
15538e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
15548e1986e3SBram Moolenaar
1555cfcd011fSBram Moolenaar  var save_rtp = &rtp
15568e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
15578e1986e3SBram Moolenaar
15588e1986e3SBram Moolenaar  filetype plugin on
15598e1986e3SBram Moolenaar  copen
15608e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
15618e1986e3SBram Moolenaar
15628e1986e3SBram Moolenaar  quit!
1563730b2483SBram Moolenaar  delete('Xexport_ft.vim')
15648e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
15658e1986e3SBram Moolenaar  &rtp = save_rtp
15668e1986e3SBram Moolenaarenddef
15678e1986e3SBram Moolenaar
1568efa94447SBram Moolenaardef Test_use_import_in_mapping()
1569cfcd011fSBram Moolenaar  var lines =<< trim END
1570efa94447SBram Moolenaar      vim9script
1571efa94447SBram Moolenaar      export def Funcx()
1572efa94447SBram Moolenaar        g:result = 42
1573efa94447SBram Moolenaar      enddef
1574efa94447SBram Moolenaar  END
1575efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1576efa94447SBram Moolenaar  lines =<< trim END
1577efa94447SBram Moolenaar      vim9script
1578efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1579b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1580efa94447SBram Moolenaar  END
1581efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1582efa94447SBram Moolenaar
1583efa94447SBram Moolenaar  source Xmapscript.vim
1584b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1585efa94447SBram Moolenaar  assert_equal(42, g:result)
1586efa94447SBram Moolenaar
1587efa94447SBram Moolenaar  unlet g:result
1588efa94447SBram Moolenaar  delete('XsomeExport.vim')
1589efa94447SBram Moolenaar  delete('Xmapscript.vim')
1590b3ca9824SBram Moolenaar  nunmap <F3>
1591efa94447SBram Moolenaarenddef
1592efa94447SBram Moolenaar
1593d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1594d3f8a9eeSBram Moolenaar  var lines =<< trim END
1595d3f8a9eeSBram Moolenaar    if has(g:feature)
1596d3f8a9eeSBram Moolenaar      " legacy script
1597d3f8a9eeSBram Moolenaar      let g:legacy = 1
1598d3f8a9eeSBram Moolenaar      finish
1599d3f8a9eeSBram Moolenaar    endif
1600d3f8a9eeSBram Moolenaar    vim9script
1601d3f8a9eeSBram Moolenaar    g:legacy = 0
1602d3f8a9eeSBram Moolenaar  END
1603d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1604d3f8a9eeSBram Moolenaar  g:legacy = -1
1605d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1606d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1607d3f8a9eeSBram Moolenaar
1608d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1609d3f8a9eeSBram Moolenaar  g:legacy = -1
1610d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1611d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1612d3f8a9eeSBram Moolenaarenddef
1613d3f8a9eeSBram Moolenaar
1614750802b5SBram Moolenaardef Test_vim9script_fails()
16158a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
16168a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1617cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
16189721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1619cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1620750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1621750802b5SBram Moolenaar
1622cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1623c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1624c785b9a7SBram Moolenaar
1625e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1626e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
16278a7d6542SBram Moolenaarenddef
16288a7d6542SBram Moolenaar
1629f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1630101f4810SBram Moolenaar  CheckRunVimInTerminal
1631101f4810SBram Moolenaar
16329bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1633c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
16349bb3eb3eSBram Moolenaarendfunc
16359bb3eb3eSBram Moolenaar
1636c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1637cfcd011fSBram Moolenaar  var export =<< trim END
1638101f4810SBram Moolenaar    vim9script
1639101f4810SBram Moolenaar    export def Foo(): number
1640101f4810SBram Moolenaar        return 0
1641101f4810SBram Moolenaar    enddef
1642101f4810SBram Moolenaar  END
1643730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1644101f4810SBram Moolenaar
1645e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
16469bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
16472949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1648101f4810SBram Moolenaar
1649730b2483SBram Moolenaar  delete('XexportCmd.vim')
16509bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
16519bb3eb3eSBram Moolenaarenddef
1652101f4810SBram Moolenaar
16532b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
16542b32700dSBram Moolenaar  var lines =<< trim END
1655a6294955SBram Moolenaar    vim9script
1656a6294955SBram Moolenaar    export var exported = 'thexport'
165760dc8274SBram Moolenaar
165860dc8274SBram Moolenaar    export def TheFunc(x = 0)
165960dc8274SBram Moolenaar    enddef
1660a6294955SBram Moolenaar  END
1661a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1662a6294955SBram Moolenaar  lines =<< trim END
16632b32700dSBram Moolenaar    vim9script noclear
16642b32700dSBram Moolenaar    g:loadCount += 1
16652b32700dSBram Moolenaar    var s:reloaded = 'init'
1666a6294955SBram Moolenaar    import exported from './XExportReload'
16672b32700dSBram Moolenaar
16682b32700dSBram Moolenaar    def Again(): string
16692b32700dSBram Moolenaar      return 'again'
16702b32700dSBram Moolenaar    enddef
16712b32700dSBram Moolenaar
167260dc8274SBram Moolenaar    import TheFunc from './XExportReload'
167360dc8274SBram Moolenaar    TheFunc()
167460dc8274SBram Moolenaar
16752b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
16762b32700dSBram Moolenaar    var s:loaded = true
16772b32700dSBram Moolenaar
16782b32700dSBram Moolenaar    var s:notReloaded = 'yes'
16792b32700dSBram Moolenaar    s:reloaded = 'first'
16802b32700dSBram Moolenaar    def g:Values(): list<string>
1681a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
16822b32700dSBram Moolenaar    enddef
16832b32700dSBram Moolenaar
16842b32700dSBram Moolenaar    def Once(): string
16852b32700dSBram Moolenaar      return 'once'
16862b32700dSBram Moolenaar    enddef
16872b32700dSBram Moolenaar  END
16882b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
16892b32700dSBram Moolenaar  g:loadCount = 0
16902b32700dSBram Moolenaar  source XReloaded
16912b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1692a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
16932b32700dSBram Moolenaar  source XReloaded
16942b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1695a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
16962b32700dSBram Moolenaar  source XReloaded
16972b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1698a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
16992b32700dSBram Moolenaar
170048e11c10SBram Moolenaar  delete('XReloaded')
1701a6294955SBram Moolenaar  delete('XExportReload')
17022b32700dSBram Moolenaar  delfunc g:Values
17032b32700dSBram Moolenaar  unlet g:loadCount
1704577dc93dSBram Moolenaar
1705577dc93dSBram Moolenaar  lines =<< trim END
1706577dc93dSBram Moolenaar      vim9script
1707577dc93dSBram Moolenaar      def Inner()
1708577dc93dSBram Moolenaar      enddef
1709577dc93dSBram Moolenaar  END
1710577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1711577dc93dSBram Moolenaar  source XreloadScript.vim
1712577dc93dSBram Moolenaar
1713577dc93dSBram Moolenaar  lines =<< trim END
1714577dc93dSBram Moolenaar      vim9script
1715577dc93dSBram Moolenaar      def Outer()
1716577dc93dSBram Moolenaar        def Inner()
1717577dc93dSBram Moolenaar        enddef
1718577dc93dSBram Moolenaar      enddef
1719577dc93dSBram Moolenaar      defcompile
1720577dc93dSBram Moolenaar  END
1721577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1722577dc93dSBram Moolenaar  source XreloadScript.vim
1723577dc93dSBram Moolenaar
1724577dc93dSBram Moolenaar  delete('XreloadScript.vim')
17252b32700dSBram Moolenaarenddef
17262b32700dSBram Moolenaar
17274c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1728cfcd011fSBram Moolenaar  var lines =<< trim END
17298a7d6542SBram Moolenaar    vim9script
17308a7d6542SBram Moolenaar    const var = ''
1731cfcd011fSBram Moolenaar    var valone = 1234
17328a7d6542SBram Moolenaar    def MyFunc(arg: string)
17338a7d6542SBram Moolenaar       valone = 5678
17348a7d6542SBram Moolenaar    enddef
17358a7d6542SBram Moolenaar  END
1736cfcd011fSBram Moolenaar  var morelines =<< trim END
1737cfcd011fSBram Moolenaar    var valtwo = 222
17388a7d6542SBram Moolenaar    export def GetValtwo(): number
17398a7d6542SBram Moolenaar      return valtwo
17408a7d6542SBram Moolenaar    enddef
17418a7d6542SBram Moolenaar  END
174203afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
17438a7d6542SBram Moolenaar  source Xreload.vim
17448a7d6542SBram Moolenaar  source Xreload.vim
17458a7d6542SBram Moolenaar  source Xreload.vim
17468a7d6542SBram Moolenaar
1747f5be8cdbSBram Moolenaar  # cannot declare a var twice
17488a7d6542SBram Moolenaar  lines =<< trim END
17498a7d6542SBram Moolenaar    vim9script
1750cfcd011fSBram Moolenaar    var valone = 1234
1751cfcd011fSBram Moolenaar    var valone = 5678
17528a7d6542SBram Moolenaar  END
17538a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
175444d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
17558a7d6542SBram Moolenaar
17568a7d6542SBram Moolenaar  delete('Xreload.vim')
17578a7d6542SBram Moolenaar  delete('Ximport.vim')
17588a7d6542SBram Moolenaarenddef
17598a7d6542SBram Moolenaar
176007a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
176107a65d26SBram Moolenaar" compiled function using that variable must fail.
176207a65d26SBram Moolenaardef Test_script_reload_change_type()
176307a65d26SBram Moolenaar  var lines =<< trim END
176407a65d26SBram Moolenaar    vim9script noclear
176507a65d26SBram Moolenaar    var str = 'string'
176607a65d26SBram Moolenaar    def g:GetStr(): string
176707a65d26SBram Moolenaar      return str .. 'xxx'
176807a65d26SBram Moolenaar    enddef
176907a65d26SBram Moolenaar  END
177007a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
177107a65d26SBram Moolenaar  source Xreload.vim
177207a65d26SBram Moolenaar  echo g:GetStr()
177307a65d26SBram Moolenaar
177407a65d26SBram Moolenaar  lines =<< trim END
177507a65d26SBram Moolenaar    vim9script noclear
177607a65d26SBram Moolenaar    var str = 1234
177707a65d26SBram Moolenaar  END
177807a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
177907a65d26SBram Moolenaar  source Xreload.vim
178007a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
178107a65d26SBram Moolenaar
178207a65d26SBram Moolenaar  delfunc g:GetStr
178307a65d26SBram Moolenaar  delete('Xreload.vim')
178407a65d26SBram Moolenaarenddef
178507a65d26SBram Moolenaar
1786c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled
1787c970e422SBram Moolenaarcommand CallFunc echo 'nop'
1788c970e422SBram Moolenaar
1789c970e422SBram Moolenaardef Test_script_reload_from_function()
1790c970e422SBram Moolenaar  var lines =<< trim END
1791c970e422SBram Moolenaar      vim9script
1792c970e422SBram Moolenaar
1793c970e422SBram Moolenaar      if exists('g:loaded')
1794c970e422SBram Moolenaar        finish
1795c970e422SBram Moolenaar      endif
1796c970e422SBram Moolenaar      g:loaded = 1
1797c970e422SBram Moolenaar      delcommand CallFunc
1798c970e422SBram Moolenaar      command CallFunc Func()
1799c970e422SBram Moolenaar      def Func()
1800a4c81beaSBram Moolenaar        so XreloadFunc.vim
1801c970e422SBram Moolenaar        g:didTheFunc = 1
1802c970e422SBram Moolenaar      enddef
1803c970e422SBram Moolenaar  END
1804c970e422SBram Moolenaar  writefile(lines, 'XreloadFunc.vim')
1805c970e422SBram Moolenaar  source XreloadFunc.vim
1806c970e422SBram Moolenaar  CallFunc
1807c970e422SBram Moolenaar  assert_equal(1, g:didTheFunc)
1808c970e422SBram Moolenaar
1809c970e422SBram Moolenaar  delete('XreloadFunc.vim')
1810c970e422SBram Moolenaar  delcommand CallFunc
1811c970e422SBram Moolenaar  unlet g:loaded
1812c970e422SBram Moolenaar  unlet g:didTheFunc
1813c970e422SBram Moolenaarenddef
1814c970e422SBram Moolenaar
18156c3843caSBram Moolenaardef Test_script_var_shadows_function()
18166c3843caSBram Moolenaar  var lines =<< trim END
18176c3843caSBram Moolenaar      vim9script
18186c3843caSBram Moolenaar      def Func(): number
18196c3843caSBram Moolenaar        return 123
18206c3843caSBram Moolenaar      enddef
18216c3843caSBram Moolenaar      var Func = 1
18226c3843caSBram Moolenaar  END
18236c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
18246c3843caSBram Moolenaarenddef
18256c3843caSBram Moolenaar
1826c323527dSBram Moolenaardef Test_script_var_shadows_command()
1827c323527dSBram Moolenaar  var lines =<< trim END
1828c323527dSBram Moolenaar      var undo = 1
1829c323527dSBram Moolenaar      undo = 2
1830c323527dSBram Moolenaar      assert_equal(2, undo)
1831c323527dSBram Moolenaar  END
1832c323527dSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1833c323527dSBram Moolenaar
1834c323527dSBram Moolenaar  lines =<< trim END
1835c323527dSBram Moolenaar      var undo = 1
1836c323527dSBram Moolenaar      undo
1837c323527dSBram Moolenaar  END
1838c323527dSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1207:', 2)
1839c323527dSBram Moolenaarenddef
1840c323527dSBram Moolenaar
184195006e3dSBram Moolenaardef s:RetSome(): string
184295006e3dSBram Moolenaar  return 'some'
184395006e3dSBram Moolenaarenddef
184495006e3dSBram Moolenaar
1845fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1846fe465a01SBram Moolenaar" script-local name.
1847fe465a01SBram Moolenaardef Test_vim9script_funcref()
1848cfcd011fSBram Moolenaar  var sortlines =<< trim END
1849fe465a01SBram Moolenaar      vim9script
1850fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1851bed36b93SBram Moolenaar        return i2 - i1
1852fe465a01SBram Moolenaar      enddef
1853fe465a01SBram Moolenaar
1854fe465a01SBram Moolenaar      export def FastSort(): list<number>
1855fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1856fe465a01SBram Moolenaar      enddef
1857529fb5a5SBram Moolenaar
1858529fb5a5SBram Moolenaar      export def GetString(arg: string): string
1859529fb5a5SBram Moolenaar        return arg
1860529fb5a5SBram Moolenaar      enddef
1861fe465a01SBram Moolenaar  END
1862fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1863fe465a01SBram Moolenaar
1864cfcd011fSBram Moolenaar  var lines =<< trim END
1865fe465a01SBram Moolenaar    vim9script
1866fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1867fe465a01SBram Moolenaar    def Test()
1868fe465a01SBram Moolenaar      g:result = FastSort()
1869fe465a01SBram Moolenaar    enddef
1870fe465a01SBram Moolenaar    Test()
1871529fb5a5SBram Moolenaar
1872529fb5a5SBram Moolenaar    # using a function imported with "as"
1873529fb5a5SBram Moolenaar    import * as anAlias from './Xsort.vim'
1874529fb5a5SBram Moolenaar    assert_equal('yes', anAlias.GetString('yes'))
1875529fb5a5SBram Moolenaar
1876529fb5a5SBram Moolenaar    # using the function from a compiled function
1877529fb5a5SBram Moolenaar    def TestMore(): string
1878ca51cc0aSBram Moolenaar      var s = s:anAlias.GetString('foo')
1879ca51cc0aSBram Moolenaar      return s .. anAlias.GetString('bar')
1880529fb5a5SBram Moolenaar    enddef
1881ca51cc0aSBram Moolenaar    assert_equal('foobar', TestMore())
1882529fb5a5SBram Moolenaar
1883529fb5a5SBram Moolenaar    # error when using a function that isn't exported
1884529fb5a5SBram Moolenaar    assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1885fe465a01SBram Moolenaar  END
1886fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1887fe465a01SBram Moolenaar
1888fe465a01SBram Moolenaar  source Xscript.vim
1889fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1890fe465a01SBram Moolenaar
1891fe465a01SBram Moolenaar  unlet g:result
1892fe465a01SBram Moolenaar  delete('Xsort.vim')
1893fe465a01SBram Moolenaar  delete('Xscript.vim')
189495006e3dSBram Moolenaar
1895cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
189695006e3dSBram Moolenaar  assert_equal('some', Funcref())
1897fe465a01SBram Moolenaarenddef
1898fe465a01SBram Moolenaar
1899601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1900601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1901601e76acSBram Moolenaar" function reference.
1902c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1903cfcd011fSBram Moolenaar  var filterLines =<< trim END
1904c620c055SBram Moolenaar    vim9script
1905c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1906c620c055SBram Moolenaar      return idx % 2 == 1
1907c620c055SBram Moolenaar    enddef
1908c620c055SBram Moolenaar    export def FastFilter(): list<number>
1909c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1910c620c055SBram Moolenaar    enddef
1911601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1912601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1913601e76acSBram Moolenaar    enddef
1914c620c055SBram Moolenaar  END
1915c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1916c620c055SBram Moolenaar
1917cfcd011fSBram Moolenaar  var lines =<< trim END
1918c620c055SBram Moolenaar    vim9script
1919601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1920c620c055SBram Moolenaar    def Test()
1921cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1922c620c055SBram Moolenaar    enddef
1923c620c055SBram Moolenaar    Test()
1924601e76acSBram Moolenaar    def TestDirect()
1925cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1926601e76acSBram Moolenaar    enddef
1927601e76acSBram Moolenaar    TestDirect()
1928c620c055SBram Moolenaar  END
1929601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1930c620c055SBram Moolenaar  delete('Xfilter.vim')
1931c620c055SBram Moolenaarenddef
1932c620c055SBram Moolenaar
19334c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1934cfcd011fSBram Moolenaar  var first_lines =<< trim END
19354c17ad94SBram Moolenaar    vim9script
19364c17ad94SBram Moolenaar    def FuncYes(): string
19374c17ad94SBram Moolenaar      return 'yes'
19384c17ad94SBram Moolenaar    enddef
19394c17ad94SBram Moolenaar  END
1940cfcd011fSBram Moolenaar  var withno_lines =<< trim END
19414c17ad94SBram Moolenaar    def FuncNo(): string
19424c17ad94SBram Moolenaar      return 'no'
19434c17ad94SBram Moolenaar    enddef
19444c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
19454c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
19464c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
194703afdcf1SBram Moolenaar    enddef
194803afdcf1SBram Moolenaar  END
1949cfcd011fSBram Moolenaar  var nono_lines =<< trim END
195003afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
195103afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
195244d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
19534c17ad94SBram Moolenaar    enddef
19544c17ad94SBram Moolenaar  END
19554c17ad94SBram Moolenaar
19564c17ad94SBram Moolenaar  # FuncNo() is defined
195703afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
19584c17ad94SBram Moolenaar  source Xreloaded.vim
19594c17ad94SBram Moolenaar  g:DoCheck(true)
19604c17ad94SBram Moolenaar
19614c17ad94SBram Moolenaar  # FuncNo() is not redefined
196203afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
19634c17ad94SBram Moolenaar  source Xreloaded.vim
19645082471fSBram Moolenaar  g:DoCheck(false)
19654c17ad94SBram Moolenaar
19664c17ad94SBram Moolenaar  # FuncNo() is back
196703afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
19684c17ad94SBram Moolenaar  source Xreloaded.vim
19695082471fSBram Moolenaar  g:DoCheck(false)
19704c17ad94SBram Moolenaar
19714c17ad94SBram Moolenaar  delete('Xreloaded.vim')
19724c17ad94SBram Moolenaarenddef
19734c17ad94SBram Moolenaar
197489483d40SBram Moolenaardef Test_vim9script_reload_delvar()
197589483d40SBram Moolenaar  # write the script with a script-local variable
1976cfcd011fSBram Moolenaar  var lines =<< trim END
197789483d40SBram Moolenaar    vim9script
1978cfcd011fSBram Moolenaar    var name = 'string'
197989483d40SBram Moolenaar  END
198089483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
198189483d40SBram Moolenaar  source XreloadVar.vim
198289483d40SBram Moolenaar
198389483d40SBram Moolenaar  # now write the script using the same variable locally - works
198489483d40SBram Moolenaar  lines =<< trim END
198589483d40SBram Moolenaar    vim9script
198689483d40SBram Moolenaar    def Func()
1987cfcd011fSBram Moolenaar      var name = 'string'
198889483d40SBram Moolenaar    enddef
198989483d40SBram Moolenaar  END
199089483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
199189483d40SBram Moolenaar  source XreloadVar.vim
199289483d40SBram Moolenaar
199389483d40SBram Moolenaar  delete('XreloadVar.vim')
199489483d40SBram Moolenaarenddef
199589483d40SBram Moolenaar
19968a7d6542SBram Moolenaardef Test_import_absolute()
1997cfcd011fSBram Moolenaar  var import_lines = [
1998e6085c53SBram Moolenaar        'vim9script',
1999e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
2000e6085c53SBram Moolenaar        'def UseExported()',
2001e6085c53SBram Moolenaar        '  g:imported_abs = exported',
2002e6085c53SBram Moolenaar        '  exported = 8888',
2003e6085c53SBram Moolenaar        '  g:imported_after = exported',
2004e6085c53SBram Moolenaar        'enddef',
2005e6085c53SBram Moolenaar        'UseExported()',
2006e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
2007e6085c53SBram Moolenaar        ]
20088a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
20098a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
20108a7d6542SBram Moolenaar
20118a7d6542SBram Moolenaar  source Ximport_abs.vim
20128a7d6542SBram Moolenaar
20138a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
20144e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
2015fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
2016fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
2017fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2018fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
2019fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
2020fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
2021fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
2022fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
2023fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2024fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
2025e6085c53SBram Moolenaar        g:import_disassembled)
2026b3ca9824SBram Moolenaar
2027b3ca9824SBram Moolenaar  Undo_export_script_lines()
20288a7d6542SBram Moolenaar  unlet g:imported_abs
20294e12a5dfSBram Moolenaar  unlet g:import_disassembled
20308a7d6542SBram Moolenaar
20318a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
20328a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
20338a7d6542SBram Moolenaarenddef
20348a7d6542SBram Moolenaar
20358a7d6542SBram Moolenaardef Test_import_rtp()
2036cfcd011fSBram Moolenaar  var import_lines = [
2037e6085c53SBram Moolenaar        'vim9script',
2038e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
2039e6085c53SBram Moolenaar        'g:imported_rtp = exported',
2040e6085c53SBram Moolenaar        ]
20418a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
2042b885a7c7SBram Moolenaar  mkdir('import', 'p')
2043b885a7c7SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
20448a7d6542SBram Moolenaar
2045cfcd011fSBram Moolenaar  var save_rtp = &rtp
20468a7d6542SBram Moolenaar  &rtp = getcwd()
20478a7d6542SBram Moolenaar  source Ximport_rtp.vim
20488a7d6542SBram Moolenaar  &rtp = save_rtp
20498a7d6542SBram Moolenaar
20508a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
20518a7d6542SBram Moolenaar
2052b3ca9824SBram Moolenaar  Undo_export_script_lines()
2053b3ca9824SBram Moolenaar  unlet g:imported_rtp
20548a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
2055b885a7c7SBram Moolenaar  delete('import', 'rf')
20568a7d6542SBram Moolenaarenddef
20578a7d6542SBram Moolenaar
205825e0f586SBram Moolenaardef Test_import_compile_error()
2059cfcd011fSBram Moolenaar  var export_lines = [
206025e0f586SBram Moolenaar        'vim9script',
206125e0f586SBram Moolenaar        'export def ExpFunc(): string',
206225e0f586SBram Moolenaar        '  return notDefined',
206325e0f586SBram Moolenaar        'enddef',
206425e0f586SBram Moolenaar        ]
206525e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
206625e0f586SBram Moolenaar
2067cfcd011fSBram Moolenaar  var import_lines = [
206825e0f586SBram Moolenaar        'vim9script',
206925e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
207025e0f586SBram Moolenaar        'def ImpFunc()',
207125e0f586SBram Moolenaar        '  echo ExpFunc()',
207225e0f586SBram Moolenaar        'enddef',
207325e0f586SBram Moolenaar        'defcompile',
207425e0f586SBram Moolenaar        ]
207525e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
207625e0f586SBram Moolenaar
207725e0f586SBram Moolenaar  try
207825e0f586SBram Moolenaar    source Ximport.vim
207925e0f586SBram Moolenaar  catch /E1001/
2080f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
20817707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
208225e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
208325e0f586SBram Moolenaar  endtry
208425e0f586SBram Moolenaar
208525e0f586SBram Moolenaar  delete('Xexported.vim')
208625e0f586SBram Moolenaar  delete('Ximport.vim')
208725e0f586SBram Moolenaarenddef
208825e0f586SBram Moolenaar
2089c4ce36d4SBram Moolenaardef Test_func_redefine_error()
2090cfcd011fSBram Moolenaar  var lines = [
2091c4ce36d4SBram Moolenaar        'vim9script',
2092c4ce36d4SBram Moolenaar        'def Func()',
2093c4ce36d4SBram Moolenaar        '  eval [][0]',
2094c4ce36d4SBram Moolenaar        'enddef',
2095c4ce36d4SBram Moolenaar        'Func()',
2096c4ce36d4SBram Moolenaar        ]
2097c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
2098c4ce36d4SBram Moolenaar
2099c4ce36d4SBram Moolenaar  for count in range(3)
2100c4ce36d4SBram Moolenaar    try
2101c4ce36d4SBram Moolenaar      source Xtestscript.vim
2102c4ce36d4SBram Moolenaar    catch /E684/
2103c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
2104c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
2105c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
2106c4ce36d4SBram Moolenaar    endtry
2107c4ce36d4SBram Moolenaar  endfor
2108c4ce36d4SBram Moolenaar
2109c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
2110c4ce36d4SBram Moolenaarenddef
2111c4ce36d4SBram Moolenaar
2112eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
2113cfcd011fSBram Moolenaar  var export_lines =<< trim END
2114eef2102eSBram Moolenaar      vim9script
2115eef2102eSBram Moolenaar      export def Func()
2116eef2102eSBram Moolenaar        echo 'imported'
2117eef2102eSBram Moolenaar      enddef
2118eef2102eSBram Moolenaar  END
2119eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
2120eef2102eSBram Moolenaar
2121cfcd011fSBram Moolenaar  var lines =<< trim END
2122eef2102eSBram Moolenaar    vim9script
2123eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2124eef2102eSBram Moolenaar    def Func()
2125eef2102eSBram Moolenaar      echo 'local to function'
2126eef2102eSBram Moolenaar    enddef
2127eef2102eSBram Moolenaar  END
2128eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2129eef2102eSBram Moolenaar
2130eef2102eSBram Moolenaar  lines =<< trim END
2131eef2102eSBram Moolenaar    vim9script
2132eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2133eef2102eSBram Moolenaar    def Outer()
2134eef2102eSBram Moolenaar      def Func()
2135eef2102eSBram Moolenaar        echo 'local to function'
2136eef2102eSBram Moolenaar      enddef
2137eef2102eSBram Moolenaar    enddef
2138eef2102eSBram Moolenaar    defcompile
2139eef2102eSBram Moolenaar  END
2140eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2141eef2102eSBram Moolenaar
2142eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
2143eef2102eSBram Moolenaarenddef
2144eef2102eSBram Moolenaar
2145b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
2146cfcd011fSBram Moolenaar  var lines =<< trim END
2147b9a2cac3SBram Moolenaar    vim9script
2148b9a2cac3SBram Moolenaar    def Func()
2149b9a2cac3SBram Moolenaar      echo 'one'
2150b9a2cac3SBram Moolenaar    enddef
2151b9a2cac3SBram Moolenaar    def Func()
2152b9a2cac3SBram Moolenaar      echo 'two'
2153b9a2cac3SBram Moolenaar    enddef
2154b9a2cac3SBram Moolenaar  END
2155b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2156fa211f3cSBram Moolenaar
2157fa211f3cSBram Moolenaar  lines =<< trim END
2158fa211f3cSBram Moolenaar    vim9script
2159fa211f3cSBram Moolenaar    def Foo(): string
2160fa211f3cSBram Moolenaar      return 'foo'
2161fa211f3cSBram Moolenaar      enddef
2162fa211f3cSBram Moolenaar    def Func()
2163cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
2164fa211f3cSBram Moolenaar    enddef
2165fa211f3cSBram Moolenaar    defcompile
2166fa211f3cSBram Moolenaar  END
2167fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2168b9a2cac3SBram Moolenaarenddef
2169b9a2cac3SBram Moolenaar
21708a7d6542SBram Moolenaardef Test_fixed_size_list()
2171f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
2172cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
21738a7d6542SBram Moolenaar  l->remove(0)
21748a7d6542SBram Moolenaar  l->add(5)
21758a7d6542SBram Moolenaar  l->insert(99, 1)
21760f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
21778a7d6542SBram Moolenaarenddef
21788a7d6542SBram Moolenaar
2179ae616494SBram Moolenaardef Test_no_insert_xit()
2180d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2181d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2182d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2183d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2184d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2185ae616494SBram Moolenaar
2186ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2187ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2188ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2189ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2190f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2191f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
21926508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
21936508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
2194f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2195f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2196f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2197ae616494SBram Moolenaarenddef
2198ae616494SBram Moolenaar
2199158906cfSBram Moolenaardef IfElse(what: number): string
2200cfcd011fSBram Moolenaar  var res = ''
2201158906cfSBram Moolenaar  if what == 1
2202158906cfSBram Moolenaar    res = "one"
2203158906cfSBram Moolenaar  elseif what == 2
2204158906cfSBram Moolenaar    res = "two"
2205a259d8d3SBram Moolenaar  else
2206158906cfSBram Moolenaar    res = "three"
2207a259d8d3SBram Moolenaar  endif
2208158906cfSBram Moolenaar  return res
2209a259d8d3SBram Moolenaarenddef
2210a259d8d3SBram Moolenaar
2211158906cfSBram Moolenaardef Test_if_elseif_else()
2212158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2213158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2214158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
22150f18b6d1SBram Moolenaarenddef
22160f18b6d1SBram Moolenaar
2217e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2218d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2219d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2220d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2221ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
2222d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
22236628b7ebSBram Moolenaar
22246628b7ebSBram Moolenaar  var lines =<< trim END
22256628b7ebSBram Moolenaar      var s = ''
22266628b7ebSBram Moolenaar      if s = ''
22276628b7ebSBram Moolenaar      endif
22286628b7ebSBram Moolenaar  END
22296628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
22306628b7ebSBram Moolenaar
22316628b7ebSBram Moolenaar  lines =<< trim END
22326628b7ebSBram Moolenaar      var s = ''
22336628b7ebSBram Moolenaar      if s == ''
22346628b7ebSBram Moolenaar      elseif s = ''
22356628b7ebSBram Moolenaar      endif
22366628b7ebSBram Moolenaar  END
22376628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2238e8c4abbbSBram Moolenaarenddef
2239e8c4abbbSBram Moolenaar
22406d69bf60SBram Moolenaarlet g:bool_true = v:true
22416d69bf60SBram Moolenaarlet g:bool_false = v:false
22426d69bf60SBram Moolenaar
22436d69bf60SBram Moolenaardef Test_if_const_expr()
2244cfcd011fSBram Moolenaar  var res = false
22456d69bf60SBram Moolenaar  if true ? true : false
22466d69bf60SBram Moolenaar    res = true
22476d69bf60SBram Moolenaar  endif
22486d69bf60SBram Moolenaar  assert_equal(true, res)
22496d69bf60SBram Moolenaar
2250585fea7bSBram Moolenaar  g:glob = 2
2251585fea7bSBram Moolenaar  if false
22526797966dSBram Moolenaar    execute('g:glob = 3')
2253585fea7bSBram Moolenaar  endif
2254585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2255585fea7bSBram Moolenaar  if true
22566797966dSBram Moolenaar    execute('g:glob = 3')
2257585fea7bSBram Moolenaar  endif
2258585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2259585fea7bSBram Moolenaar
22606d69bf60SBram Moolenaar  res = false
22616d69bf60SBram Moolenaar  if g:bool_true ? true : false
22626d69bf60SBram Moolenaar    res = true
22636d69bf60SBram Moolenaar  endif
22646d69bf60SBram Moolenaar  assert_equal(true, res)
22656d69bf60SBram Moolenaar
22666d69bf60SBram Moolenaar  res = false
22676d69bf60SBram Moolenaar  if true ? g:bool_true : false
22686d69bf60SBram Moolenaar    res = true
22696d69bf60SBram Moolenaar  endif
22706d69bf60SBram Moolenaar  assert_equal(true, res)
22716d69bf60SBram Moolenaar
22726d69bf60SBram Moolenaar  res = false
22736d69bf60SBram Moolenaar  if true ? true : g:bool_false
22746d69bf60SBram Moolenaar    res = true
22756d69bf60SBram Moolenaar  endif
22766d69bf60SBram Moolenaar  assert_equal(true, res)
22776d69bf60SBram Moolenaar
22786d69bf60SBram Moolenaar  res = false
22796d69bf60SBram Moolenaar  if true ? false : true
22806d69bf60SBram Moolenaar    res = true
22816d69bf60SBram Moolenaar  endif
22826d69bf60SBram Moolenaar  assert_equal(false, res)
22836d69bf60SBram Moolenaar
22846d69bf60SBram Moolenaar  res = false
22856d69bf60SBram Moolenaar  if false ? false : true
22866d69bf60SBram Moolenaar    res = true
22876d69bf60SBram Moolenaar  endif
22886d69bf60SBram Moolenaar  assert_equal(true, res)
22896d69bf60SBram Moolenaar
22906d69bf60SBram Moolenaar  res = false
22916d69bf60SBram Moolenaar  if false ? true : false
22926d69bf60SBram Moolenaar    res = true
22936d69bf60SBram Moolenaar  endif
22946d69bf60SBram Moolenaar  assert_equal(false, res)
22956d69bf60SBram Moolenaar
22966d69bf60SBram Moolenaar  res = false
2297e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2298e8c4abbbSBram Moolenaar    res = true
2299e8c4abbbSBram Moolenaar  endif
2300e8c4abbbSBram Moolenaar  assert_equal(false, res)
2301e8c4abbbSBram Moolenaar
2302e8c4abbbSBram Moolenaar  res = false
23036d69bf60SBram Moolenaar  if true && true
23046d69bf60SBram Moolenaar    res = true
23056d69bf60SBram Moolenaar  endif
23066d69bf60SBram Moolenaar  assert_equal(true, res)
23076d69bf60SBram Moolenaar
23086d69bf60SBram Moolenaar  res = false
23096d69bf60SBram Moolenaar  if true && false
23106d69bf60SBram Moolenaar    res = true
23116d69bf60SBram Moolenaar  endif
23126d69bf60SBram Moolenaar  assert_equal(false, res)
23136d69bf60SBram Moolenaar
23146d69bf60SBram Moolenaar  res = false
23156d69bf60SBram Moolenaar  if g:bool_true && false
23166d69bf60SBram Moolenaar    res = true
23176d69bf60SBram Moolenaar  endif
23186d69bf60SBram Moolenaar  assert_equal(false, res)
23196d69bf60SBram Moolenaar
23206d69bf60SBram Moolenaar  res = false
23216d69bf60SBram Moolenaar  if true && g:bool_false
23226d69bf60SBram Moolenaar    res = true
23236d69bf60SBram Moolenaar  endif
23246d69bf60SBram Moolenaar  assert_equal(false, res)
23256d69bf60SBram Moolenaar
23266d69bf60SBram Moolenaar  res = false
23276d69bf60SBram Moolenaar  if false && false
23286d69bf60SBram Moolenaar    res = true
23296d69bf60SBram Moolenaar  endif
23306d69bf60SBram Moolenaar  assert_equal(false, res)
23316d69bf60SBram Moolenaar
23326d69bf60SBram Moolenaar  res = false
23336d69bf60SBram Moolenaar  if true || false
23346d69bf60SBram Moolenaar    res = true
23356d69bf60SBram Moolenaar  endif
23366d69bf60SBram Moolenaar  assert_equal(true, res)
23376d69bf60SBram Moolenaar
23386d69bf60SBram Moolenaar  res = false
23396d69bf60SBram Moolenaar  if g:bool_true || false
23406d69bf60SBram Moolenaar    res = true
23416d69bf60SBram Moolenaar  endif
23426d69bf60SBram Moolenaar  assert_equal(true, res)
23436d69bf60SBram Moolenaar
23446d69bf60SBram Moolenaar  res = false
23456d69bf60SBram Moolenaar  if true || g:bool_false
23466d69bf60SBram Moolenaar    res = true
23476d69bf60SBram Moolenaar  endif
23486d69bf60SBram Moolenaar  assert_equal(true, res)
23496d69bf60SBram Moolenaar
23506d69bf60SBram Moolenaar  res = false
23516d69bf60SBram Moolenaar  if false || false
23526d69bf60SBram Moolenaar    res = true
23536d69bf60SBram Moolenaar  endif
23546d69bf60SBram Moolenaar  assert_equal(false, res)
23553988f64fSBram Moolenaar
23563988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
2357c323527dSBram Moolenaar  if false | eval 1 + 2 | endif
23583988f64fSBram Moolenaar  if false | eval burp + 234 | endif
23593988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
23603988f64fSBram Moolenaar  if false
23613988f64fSBram Moolenaar    burp
23623988f64fSBram Moolenaar  endif
236380c34ca3SBram Moolenaarenddef
23646d69bf60SBram Moolenaar
236580c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2366d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2367d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2368d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2369d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
23706d69bf60SBram Moolenaarenddef
23716d69bf60SBram Moolenaar
237272abcf42SBram Moolenaardef RunNested(i: number): number
2373cfcd011fSBram Moolenaar  var x: number = 0
237472abcf42SBram Moolenaar  if i % 2
237572abcf42SBram Moolenaar    if 1
2376f5be8cdbSBram Moolenaar      # comment
237772abcf42SBram Moolenaar    else
2378f5be8cdbSBram Moolenaar      # comment
237972abcf42SBram Moolenaar    endif
238072abcf42SBram Moolenaar    x += 1
238172abcf42SBram Moolenaar  else
238272abcf42SBram Moolenaar    x += 1000
238372abcf42SBram Moolenaar  endif
238472abcf42SBram Moolenaar  return x
238572abcf42SBram Moolenaarenddef
238672abcf42SBram Moolenaar
238772abcf42SBram Moolenaardef Test_nested_if()
238872abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
238972abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
239072abcf42SBram Moolenaarenddef
239172abcf42SBram Moolenaar
2392ad39c094SBram Moolenaardef Test_execute_cmd()
2393e4984290SBram Moolenaar  # missing argument is ignored
2394e4984290SBram Moolenaar  execute
2395e4984290SBram Moolenaar  execute # comment
2396e4984290SBram Moolenaar
2397ad39c094SBram Moolenaar  new
2398ad39c094SBram Moolenaar  setline(1, 'default')
2399d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2400ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2401a72cfb80SBram Moolenaar
2402d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2403a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2404a72cfb80SBram Moolenaar
2405cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2406cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2407a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2408ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2409a72cfb80SBram Moolenaar
2410d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2411ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2412a72cfb80SBram Moolenaar
2413cfcd011fSBram Moolenaar  var cmd_first = 'call '
2414cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2415ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2416ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2417ad39c094SBram Moolenaar  bwipe!
2418585fea7bSBram Moolenaar
2419cfcd011fSBram Moolenaar  var n = true
24202d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
24212d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
24222d6b20d6SBram Moolenaar
2423e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2424e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2425e5abf7afSBram Moolenaar
2426d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2427d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2428d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2429ad39c094SBram Moolenaarenddef
2430ad39c094SBram Moolenaar
243147e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2432f5be8cdbSBram Moolenaar  # only checks line continuation
2433cfcd011fSBram Moolenaar  var lines =<< trim END
243447e880d6SBram Moolenaar      vim9script
243547e880d6SBram Moolenaar      execute 'g:someVar'
243647e880d6SBram Moolenaar                .. ' = ' ..
243747e880d6SBram Moolenaar                   '28'
243847e880d6SBram Moolenaar      assert_equal(28, g:someVar)
243947e880d6SBram Moolenaar      unlet g:someVar
244047e880d6SBram Moolenaar  END
244147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
244247e880d6SBram Moolenaarenddef
244347e880d6SBram Moolenaar
2444ad39c094SBram Moolenaardef Test_echo_cmd()
2445a72cfb80SBram Moolenaar  echo 'some' # comment
2446585fea7bSBram Moolenaar  echon 'thing'
2447ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2448ad39c094SBram Moolenaar
2449a72cfb80SBram Moolenaar  echo "some" # comment
2450a72cfb80SBram Moolenaar  echon "thing"
2451a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2452a72cfb80SBram Moolenaar
2453cfcd011fSBram Moolenaar  var str1 = 'some'
2454cfcd011fSBram Moolenaar  var str2 = 'more'
2455ad39c094SBram Moolenaar  echo str1 str2
2456ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2457a72cfb80SBram Moolenaar
2458d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2459ad39c094SBram Moolenaarenddef
2460ad39c094SBram Moolenaar
2461f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2462f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2463f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2464f93c7feaSBram Moolenaar  echo 'clear'
2465df069eecSBram Moolenaar  :1messages
2466f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2467f93c7feaSBram Moolenaar
2468d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2469f93c7feaSBram Moolenaarenddef
2470f93c7feaSBram Moolenaar
247147e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2472f5be8cdbSBram Moolenaar  # only checks line continuation
2473cfcd011fSBram Moolenaar  var lines =<< trim END
247447e880d6SBram Moolenaar      vim9script
247547e880d6SBram Moolenaar      echomsg 'here'
247647e880d6SBram Moolenaar                .. ' is ' ..
247747e880d6SBram Moolenaar                   'a message'
247847e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
247947e880d6SBram Moolenaar  END
248047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
248147e880d6SBram Moolenaarenddef
248247e880d6SBram Moolenaar
2483f93c7feaSBram Moolenaardef Test_echoerr_cmd()
248440ee466cSBram Moolenaar  try
248540ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
248640ee466cSBram Moolenaar  catch
248740ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
248840ee466cSBram Moolenaar  endtry
2489f93c7feaSBram Moolenaarenddef
2490f93c7feaSBram Moolenaar
249147e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2492f5be8cdbSBram Moolenaar  # only checks line continuation
2493cfcd011fSBram Moolenaar  var lines =<< trim END
249447e880d6SBram Moolenaar      vim9script
249547e880d6SBram Moolenaar      try
249647e880d6SBram Moolenaar        echoerr 'this'
249747e880d6SBram Moolenaar                .. ' is ' ..
249847e880d6SBram Moolenaar                   'wrong'
249947e880d6SBram Moolenaar      catch
250047e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
250147e880d6SBram Moolenaar      endtry
250247e880d6SBram Moolenaar  END
250347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
250447e880d6SBram Moolenaarenddef
250547e880d6SBram Moolenaar
250641fe0617SBram Moolenaardef Test_for_outside_of_function()
2507cfcd011fSBram Moolenaar  var lines =<< trim END
250841fe0617SBram Moolenaar    vim9script
250941fe0617SBram Moolenaar    new
251041fe0617SBram Moolenaar    for var in range(0, 3)
251141fe0617SBram Moolenaar      append(line('$'), var)
251241fe0617SBram Moolenaar    endfor
251341fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
251441fe0617SBram Moolenaar    bwipe!
2515522eefd9SBram Moolenaar
2516522eefd9SBram Moolenaar    var result = ''
2517522eefd9SBram Moolenaar    for i in [1, 2, 3]
2518522eefd9SBram Moolenaar      var loop = ' loop ' .. i
2519522eefd9SBram Moolenaar      result ..= loop
2520522eefd9SBram Moolenaar    endfor
2521522eefd9SBram Moolenaar    assert_equal(' loop 1 loop 2 loop 3', result)
252241fe0617SBram Moolenaar  END
252341fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
252441fe0617SBram Moolenaar  source Xvim9for.vim
252541fe0617SBram Moolenaar  delete('Xvim9for.vim')
252641fe0617SBram Moolenaarenddef
25278a7d6542SBram Moolenaar
2528e8c4abbbSBram Moolenaardef Test_for_loop()
2529f2253963SBram Moolenaar  var lines =<< trim END
2530cfcd011fSBram Moolenaar      var result = ''
2531e8c4abbbSBram Moolenaar      for cnt in range(7)
2532e8c4abbbSBram Moolenaar        if cnt == 4
2533e8c4abbbSBram Moolenaar          break
2534e8c4abbbSBram Moolenaar        endif
2535e8c4abbbSBram Moolenaar        if cnt == 2
2536e8c4abbbSBram Moolenaar          continue
2537e8c4abbbSBram Moolenaar        endif
2538e8c4abbbSBram Moolenaar        result ..= cnt .. '_'
2539e8c4abbbSBram Moolenaar      endfor
2540e8c4abbbSBram Moolenaar      assert_equal('0_1_3_', result)
25410ad3e894SBram Moolenaar
2542cfcd011fSBram Moolenaar      var concat = ''
25430ad3e894SBram Moolenaar      for str in eval('["one", "two"]')
25440ad3e894SBram Moolenaar        concat ..= str
25450ad3e894SBram Moolenaar      endfor
25460ad3e894SBram Moolenaar      assert_equal('onetwo', concat)
254738bd8de5SBram Moolenaar
254838bd8de5SBram Moolenaar      var total = 0
254938bd8de5SBram Moolenaar      for nr in
255038bd8de5SBram Moolenaar          [1, 2, 3]
255138bd8de5SBram Moolenaar        total += nr
255238bd8de5SBram Moolenaar      endfor
255338bd8de5SBram Moolenaar      assert_equal(6, total)
255438bd8de5SBram Moolenaar
255538bd8de5SBram Moolenaar      total = 0
255638bd8de5SBram Moolenaar      for nr
255738bd8de5SBram Moolenaar        in [1, 2, 3]
255838bd8de5SBram Moolenaar        total += nr
255938bd8de5SBram Moolenaar      endfor
256038bd8de5SBram Moolenaar      assert_equal(6, total)
256138bd8de5SBram Moolenaar
256238bd8de5SBram Moolenaar      total = 0
256338bd8de5SBram Moolenaar      for nr
256438bd8de5SBram Moolenaar        in
256538bd8de5SBram Moolenaar        [1, 2, 3]
256638bd8de5SBram Moolenaar        total += nr
256738bd8de5SBram Moolenaar      endfor
256838bd8de5SBram Moolenaar      assert_equal(6, total)
2569036d0714SBram Moolenaar
2570a3589a0dSBram Moolenaar      # with type
2571a3589a0dSBram Moolenaar      total = 0
2572a3589a0dSBram Moolenaar      for n: number in [1, 2, 3]
2573a3589a0dSBram Moolenaar        total += n
2574a3589a0dSBram Moolenaar      endfor
2575a3589a0dSBram Moolenaar      assert_equal(6, total)
2576a3589a0dSBram Moolenaar
2577fe090eb5SBram Moolenaar      var chars = ''
2578fe090eb5SBram Moolenaar      for s: string in 'foobar'
2579fe090eb5SBram Moolenaar        chars ..= s
2580fe090eb5SBram Moolenaar      endfor
2581fe090eb5SBram Moolenaar      assert_equal('foobar', chars)
2582fe090eb5SBram Moolenaar
25835ede5b23SBram Moolenaar      chars = ''
25845ede5b23SBram Moolenaar      for x: string in {a: 'a', b: 'b'}->values()
25855ede5b23SBram Moolenaar        chars ..= x
25865ede5b23SBram Moolenaar      endfor
25875ede5b23SBram Moolenaar      assert_equal('ab', chars)
25885ede5b23SBram Moolenaar
2589a3589a0dSBram Moolenaar      # unpack with type
2590f2253963SBram Moolenaar      var res = ''
2591a3589a0dSBram Moolenaar      for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2592a3589a0dSBram Moolenaar        res ..= n .. s
2593a3589a0dSBram Moolenaar      endfor
2594a3589a0dSBram Moolenaar      assert_equal('1a2b', res)
2595a3589a0dSBram Moolenaar
2596444d8783SBram Moolenaar      # unpack with one var
2597444d8783SBram Moolenaar      var reslist = []
2598444d8783SBram Moolenaar      for [x] in [['aaa'], ['bbb']]
2599444d8783SBram Moolenaar        reslist->add(x)
2600444d8783SBram Moolenaar      endfor
2601444d8783SBram Moolenaar      assert_equal(['aaa', 'bbb'], reslist)
2602444d8783SBram Moolenaar
2603a3589a0dSBram Moolenaar      # loop over string
2604a3589a0dSBram Moolenaar      res = ''
260574e54fcbSBram Moolenaar      for c in 'aéc̀d'
260674e54fcbSBram Moolenaar        res ..= c .. '-'
260774e54fcbSBram Moolenaar      endfor
260874e54fcbSBram Moolenaar      assert_equal('a-é-c̀-d-', res)
260974e54fcbSBram Moolenaar
261074e54fcbSBram Moolenaar      res = ''
261174e54fcbSBram Moolenaar      for c in ''
261274e54fcbSBram Moolenaar        res ..= c .. '-'
261374e54fcbSBram Moolenaar      endfor
261474e54fcbSBram Moolenaar      assert_equal('', res)
261574e54fcbSBram Moolenaar
261674e54fcbSBram Moolenaar      res = ''
261774e54fcbSBram Moolenaar      for c in test_null_string()
261874e54fcbSBram Moolenaar        res ..= c .. '-'
261974e54fcbSBram Moolenaar      endfor
262074e54fcbSBram Moolenaar      assert_equal('', res)
2621f2253963SBram Moolenaar
2622f2253963SBram Moolenaar      var foo: list<dict<any>> = [
2623f2253963SBram Moolenaar              {a: 'Cat'}
2624f2253963SBram Moolenaar            ]
2625f2253963SBram Moolenaar      for dd in foo
2626f2253963SBram Moolenaar        dd.counter = 12
2627f2253963SBram Moolenaar      endfor
2628f2253963SBram Moolenaar      assert_equal([{a: 'Cat', counter: 12}], foo)
2629ad2d4969SBram Moolenaar
2630ad2d4969SBram Moolenaar      reslist = []
2631ad2d4969SBram Moolenaar      for _ in range(3)
2632ad2d4969SBram Moolenaar        reslist->add('x')
2633ad2d4969SBram Moolenaar      endfor
2634ad2d4969SBram Moolenaar      assert_equal(['x', 'x', 'x'], reslist)
2635f2253963SBram Moolenaar  END
2636f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2637e8c4abbbSBram Moolenaarenddef
2638e8c4abbbSBram Moolenaar
26392eb6fc3bSBram Moolenaardef Test_for_loop_with_closure()
26402eb6fc3bSBram Moolenaar  var lines =<< trim END
26412eb6fc3bSBram Moolenaar      var flist: list<func>
26422eb6fc3bSBram Moolenaar      for i in range(5)
26432eb6fc3bSBram Moolenaar        var inloop = i
26442eb6fc3bSBram Moolenaar        flist[i] = () => inloop
26452eb6fc3bSBram Moolenaar      endfor
26462eb6fc3bSBram Moolenaar      for i in range(5)
26472eb6fc3bSBram Moolenaar        assert_equal(4, flist[i]())
26482eb6fc3bSBram Moolenaar      endfor
26492eb6fc3bSBram Moolenaar  END
26502eb6fc3bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
26512eb6fc3bSBram Moolenaar
26522eb6fc3bSBram Moolenaar  lines =<< trim END
26532eb6fc3bSBram Moolenaar      var flist: list<func>
26542eb6fc3bSBram Moolenaar      for i in range(5)
26552eb6fc3bSBram Moolenaar        var inloop = i
26562eb6fc3bSBram Moolenaar        flist[i] = () => {
26572eb6fc3bSBram Moolenaar              return inloop
26582eb6fc3bSBram Moolenaar            }
26592eb6fc3bSBram Moolenaar      endfor
26602eb6fc3bSBram Moolenaar      for i in range(5)
26612eb6fc3bSBram Moolenaar        assert_equal(4, flist[i]())
26622eb6fc3bSBram Moolenaar      endfor
26632eb6fc3bSBram Moolenaar  END
26642eb6fc3bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
26652eb6fc3bSBram Moolenaarenddef
26662eb6fc3bSBram Moolenaar
2667e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2668442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:')
2669442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:')
2670442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:')
2671442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2672442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2673442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:')
2674d4ab807dSBram Moolenaar  CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2675822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
26762d870f8dSBram Moolenaar  delfunc! g:Func
2677675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2678675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2679675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
268074e54fcbSBram Moolenaar
268174e54fcbSBram Moolenaar  # wrong type detected at compile time
268274e54fcbSBram Moolenaar  CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
268374e54fcbSBram Moolenaar
268474e54fcbSBram Moolenaar  # wrong type detected at runtime
268574e54fcbSBram Moolenaar  g:adict = {a: 1}
268674e54fcbSBram Moolenaar  CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
268774e54fcbSBram Moolenaar  unlet g:adict
2688f6a8d420SBram Moolenaar
2689f6a8d420SBram Moolenaar  var lines =<< trim END
2690f6a8d420SBram Moolenaar      var d: list<dict<any>> = [{a: 0}]
2691f6a8d420SBram Moolenaar      for e in d
2692f6a8d420SBram Moolenaar        e = {a: 0, b: ''}
2693f6a8d420SBram Moolenaar      endfor
2694f6a8d420SBram Moolenaar  END
2695f6a8d420SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3)
2696fe090eb5SBram Moolenaar
2697fe090eb5SBram Moolenaar  lines =<< trim END
2698fe090eb5SBram Moolenaar      for nr: number in ['foo']
2699fe090eb5SBram Moolenaar      endfor
2700fe090eb5SBram Moolenaar  END
2701fe090eb5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2702404557e6SBram Moolenaar
2703404557e6SBram Moolenaar  lines =<< trim END
2704404557e6SBram Moolenaar      for n : number in [1, 2]
2705404557e6SBram Moolenaar        echo n
2706404557e6SBram Moolenaar      endfor
2707404557e6SBram Moolenaar  END
2708404557e6SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1059:', 1)
2709efc5db52SBram Moolenaar
2710efc5db52SBram Moolenaar  lines =<< trim END
2711efc5db52SBram Moolenaar      var d: dict<number> = {a: 1, b: 2}
2712efc5db52SBram Moolenaar      for [k: job, v: job] in d->items()
2713efc5db52SBram Moolenaar        echo k v
2714efc5db52SBram Moolenaar      endfor
2715efc5db52SBram Moolenaar  END
2716efc5db52SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2)
2717e8c4abbbSBram Moolenaarenddef
2718e8c4abbbSBram Moolenaar
2719ea87069dSBram Moolenaardef Test_for_loop_script_var()
2720ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2721ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2722ea87069dSBram Moolenaar
2723ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2724ea87069dSBram Moolenaar  var lines =<< trim END
2725ea87069dSBram Moolenaar    vim9script
2726ea87069dSBram Moolenaar    var total = 0
2727ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2728ea87069dSBram Moolenaar      total += s:var
2729ea87069dSBram Moolenaar    endfor
2730ea87069dSBram Moolenaar    assert_equal(6, total)
2731ea87069dSBram Moolenaar
2732ea87069dSBram Moolenaar    total = 0
2733ea87069dSBram Moolenaar    for var in [1, 2, 3]
2734ea87069dSBram Moolenaar      total += var
2735ea87069dSBram Moolenaar    endfor
2736ea87069dSBram Moolenaar    assert_equal(6, total)
2737ea87069dSBram Moolenaar  END
2738ea87069dSBram Moolenaarenddef
2739ea87069dSBram Moolenaar
2740792f786aSBram Moolenaardef Test_for_loop_unpack()
27414b8a0651SBram Moolenaar  var lines =<< trim END
2742792f786aSBram Moolenaar      var result = []
2743792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2744792f786aSBram Moolenaar        result->add(v1)
2745792f786aSBram Moolenaar        result->add(v2)
2746792f786aSBram Moolenaar      endfor
2747792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2748792f786aSBram Moolenaar
2749792f786aSBram Moolenaar      result = []
2750792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2751792f786aSBram Moolenaar        result->add(v1)
2752792f786aSBram Moolenaar        result->add(v2)
2753792f786aSBram Moolenaar        result->add(v3)
2754792f786aSBram Moolenaar      endfor
2755792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2756792f786aSBram Moolenaar
27574b8a0651SBram Moolenaar      result = []
27584b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
27594b8a0651SBram Moolenaar        result->add(&ts)
27604b8a0651SBram Moolenaar        result->add(&sw)
27614b8a0651SBram Moolenaar      endfor
27624b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
27634b8a0651SBram Moolenaar
27644b8a0651SBram Moolenaar      var slist: list<string>
27654b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
27664b8a0651SBram Moolenaar        slist->add($LOOPVAR)
27674b8a0651SBram Moolenaar        slist->add(@r)
27684b8a0651SBram Moolenaar        slist->add(v:errmsg)
27694b8a0651SBram Moolenaar      endfor
27704b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
27714b8a0651SBram Moolenaar
27724b8a0651SBram Moolenaar      slist = []
27734b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
27744b8a0651SBram Moolenaar        slist->add(g:globalvar)
27754b8a0651SBram Moolenaar        slist->add(b:bufvar)
27764b8a0651SBram Moolenaar        slist->add(w:winvar)
27774b8a0651SBram Moolenaar        slist->add(t:tabvar)
27784b8a0651SBram Moolenaar      endfor
27794b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2780f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
2781b777da9bSBram Moolenaar
2782b777da9bSBram Moolenaar      var res = []
2783b777da9bSBram Moolenaar      for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2784b777da9bSBram Moolenaar        res->add(n)
2785b777da9bSBram Moolenaar      endfor
2786b777da9bSBram Moolenaar      assert_equal([2, 5], res)
27874b8a0651SBram Moolenaar  END
27884b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
27894b8a0651SBram Moolenaar
27904b8a0651SBram Moolenaar  lines =<< trim END
2791792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2792792f786aSBram Moolenaar        echo v1 v2
2793792f786aSBram Moolenaar      endfor
2794792f786aSBram Moolenaar  END
2795792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2796792f786aSBram Moolenaar
2797792f786aSBram Moolenaar  lines =<< trim END
2798792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2799792f786aSBram Moolenaar        echo v1 v2
2800792f786aSBram Moolenaar      endfor
2801792f786aSBram Moolenaar  END
2802792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2803792f786aSBram Moolenaar
2804792f786aSBram Moolenaar  lines =<< trim END
2805792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2806792f786aSBram Moolenaar        echo v1
2807792f786aSBram Moolenaar      endfor
2808792f786aSBram Moolenaar  END
2809792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2810792f786aSBram Moolenaarenddef
2811792f786aSBram Moolenaar
2812c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2813f2253963SBram Moolenaar  var lines =<< trim END
2814c150c09eSBram Moolenaar      var looped = 0
2815c150c09eSBram Moolenaar      var cleanup = 0
2816c150c09eSBram Moolenaar      for i in range(3)
2817c150c09eSBram Moolenaar        looped += 1
2818c150c09eSBram Moolenaar        try
2819c150c09eSBram Moolenaar          eval [][0]
2820c150c09eSBram Moolenaar        catch
2821c150c09eSBram Moolenaar          continue
2822c150c09eSBram Moolenaar        finally
2823c150c09eSBram Moolenaar          cleanup += 1
2824c150c09eSBram Moolenaar        endtry
2825c150c09eSBram Moolenaar      endfor
2826c150c09eSBram Moolenaar      assert_equal(3, looped)
2827c150c09eSBram Moolenaar      assert_equal(3, cleanup)
2828f2253963SBram Moolenaar  END
2829f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2830c150c09eSBram Moolenaarenddef
2831c150c09eSBram Moolenaar
2832d0df1aacSBram Moolenaardef Test_while_loop()
2833cfcd011fSBram Moolenaar  var result = ''
2834cfcd011fSBram Moolenaar  var cnt = 0
2835d0df1aacSBram Moolenaar  while cnt < 555
2836d0df1aacSBram Moolenaar    if cnt == 3
2837d0df1aacSBram Moolenaar      break
2838d0df1aacSBram Moolenaar    endif
2839d0df1aacSBram Moolenaar    cnt += 1
2840d0df1aacSBram Moolenaar    if cnt == 2
2841d0df1aacSBram Moolenaar      continue
2842d0df1aacSBram Moolenaar    endif
2843d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2844d0df1aacSBram Moolenaar  endwhile
2845d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2846dee37dc7SBram Moolenaar
2847dee37dc7SBram Moolenaar  var s = ''
28480123cc1eSBram Moolenaar  while s == 'x' # {comment}
2849dee37dc7SBram Moolenaar  endwhile
2850d0df1aacSBram Moolenaarenddef
2851d0df1aacSBram Moolenaar
2852e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2853675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2854675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2855675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2856675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2857675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2858675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2859675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
28606628b7ebSBram Moolenaar
28616628b7ebSBram Moolenaar  var lines =<< trim END
28626628b7ebSBram Moolenaar      var s = ''
28636628b7ebSBram Moolenaar      while s = ''
28646628b7ebSBram Moolenaar      endwhile
28656628b7ebSBram Moolenaar  END
28666628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2867bd5da371SBram Moolenaarenddef
2868bd5da371SBram Moolenaar
28699645e2d9SBram Moolenaardef Test_interrupt_loop()
2870cfcd011fSBram Moolenaar  var caught = false
2871cfcd011fSBram Moolenaar  var x = 0
287297acfc78SBram Moolenaar  try
28739645e2d9SBram Moolenaar    while 1
28749645e2d9SBram Moolenaar      x += 1
28759645e2d9SBram Moolenaar      if x == 100
28769645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
28779645e2d9SBram Moolenaar      endif
28789645e2d9SBram Moolenaar    endwhile
287997acfc78SBram Moolenaar  catch
288097acfc78SBram Moolenaar    caught = true
288197acfc78SBram Moolenaar    assert_equal(100, x)
288297acfc78SBram Moolenaar  endtry
288397acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
288425859dd7SBram Moolenaar  # consume the CTRL-C
288525859dd7SBram Moolenaar  getchar(0)
28869645e2d9SBram Moolenaarenddef
288720431c9dSBram Moolenaar
28884fdae999SBram Moolenaardef Test_automatic_line_continuation()
2889cfcd011fSBram Moolenaar  var mylist = [
28904fdae999SBram Moolenaar      'one',
28914fdae999SBram Moolenaar      'two',
28924fdae999SBram Moolenaar      'three',
2893f5be8cdbSBram Moolenaar      ] # comment
28944fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
28954fdae999SBram Moolenaar
2896cfcd011fSBram Moolenaar  var mydict = {
2897e0de171eSBram Moolenaar      ['one']: 1,
2898e0de171eSBram Moolenaar      ['two']: 2,
2899e0de171eSBram Moolenaar      ['three']:
29004fdae999SBram Moolenaar          3,
2901f5be8cdbSBram Moolenaar      } # comment
2902e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2903e0de171eSBram Moolenaar  mydict = {
29042c330432SBram Moolenaar      one: 1,  # comment
29052c330432SBram Moolenaar      two:     # comment
29062c330432SBram Moolenaar           2,  # comment
29072c330432SBram Moolenaar      three: 3 # comment
29082c330432SBram Moolenaar      }
2909e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2910e0de171eSBram Moolenaar  mydict = {
29112c330432SBram Moolenaar      one: 1,
29124fdae999SBram Moolenaar      two:
29134fdae999SBram Moolenaar           2,
29142c330432SBram Moolenaar      three: 3
29154fdae999SBram Moolenaar      }
2916e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2917e6085c53SBram Moolenaar
2918e6085c53SBram Moolenaar  assert_equal(
2919e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2920e6085c53SBram Moolenaar        split('one two three')
2921e6085c53SBram Moolenaar        )
29224fdae999SBram Moolenaarenddef
29234fdae999SBram Moolenaar
29247a092245SBram Moolenaardef Test_vim9_comment()
29257a092245SBram Moolenaar  CheckScriptSuccess([
29267a092245SBram Moolenaar      'vim9script',
29277a092245SBram Moolenaar      '# something',
292893f82cbeSBram Moolenaar      '#something',
292993f82cbeSBram Moolenaar      '#{something',
29307a092245SBram Moolenaar      ])
293193f82cbeSBram Moolenaar
293293f82cbeSBram Moolenaar  split Xfile
293393f82cbeSBram Moolenaar  CheckScriptSuccess([
293493f82cbeSBram Moolenaar      'vim9script',
293593f82cbeSBram Moolenaar      'edit #something',
293693f82cbeSBram Moolenaar      ])
293793f82cbeSBram Moolenaar  CheckScriptSuccess([
293893f82cbeSBram Moolenaar      'vim9script',
293993f82cbeSBram Moolenaar      'edit #{something',
294093f82cbeSBram Moolenaar      ])
294193f82cbeSBram Moolenaar  close
294293f82cbeSBram Moolenaar
29437a092245SBram Moolenaar  CheckScriptFailure([
29447a092245SBram Moolenaar      'vim9script',
29457a092245SBram Moolenaar      ':# something',
29467a092245SBram Moolenaar      ], 'E488:')
29477a092245SBram Moolenaar  CheckScriptFailure([
29487a092245SBram Moolenaar      '# something',
29497a092245SBram Moolenaar      ], 'E488:')
29507a092245SBram Moolenaar  CheckScriptFailure([
29517a092245SBram Moolenaar      ':# something',
29527a092245SBram Moolenaar      ], 'E488:')
29537a092245SBram Moolenaar
29544a8d9f2eSBram Moolenaar  { # block start
29554a8d9f2eSBram Moolenaar  } # block end
29564a8d9f2eSBram Moolenaar  CheckDefFailure([
29574a8d9f2eSBram Moolenaar      '{# comment',
29584a8d9f2eSBram Moolenaar      ], 'E488:')
29594a8d9f2eSBram Moolenaar  CheckDefFailure([
29604a8d9f2eSBram Moolenaar      '{',
29614a8d9f2eSBram Moolenaar      '}# comment',
29624a8d9f2eSBram Moolenaar      ], 'E488:')
29634a8d9f2eSBram Moolenaar
29644a8d9f2eSBram Moolenaar  echo "yes" # comment
29654a8d9f2eSBram Moolenaar  CheckDefFailure([
29664a8d9f2eSBram Moolenaar      'echo "yes"# comment',
29674a8d9f2eSBram Moolenaar      ], 'E488:')
29687a092245SBram Moolenaar  CheckScriptSuccess([
29697a092245SBram Moolenaar      'vim9script',
29707a092245SBram Moolenaar      'echo "yes" # something',
29717a092245SBram Moolenaar      ])
29727a092245SBram Moolenaar  CheckScriptFailure([
29737a092245SBram Moolenaar      'vim9script',
29747a092245SBram Moolenaar      'echo "yes"# something',
29757a092245SBram Moolenaar      ], 'E121:')
29767a092245SBram Moolenaar  CheckScriptFailure([
29777a092245SBram Moolenaar      'vim9script',
29787a092245SBram Moolenaar      'echo# something',
2979f8103f27SBram Moolenaar      ], 'E1144:')
29807a092245SBram Moolenaar  CheckScriptFailure([
29817a092245SBram Moolenaar      'echo "yes" # something',
29827a092245SBram Moolenaar      ], 'E121:')
29837a092245SBram Moolenaar
29844a8d9f2eSBram Moolenaar  exe "echo" # comment
29854a8d9f2eSBram Moolenaar  CheckDefFailure([
29864a8d9f2eSBram Moolenaar      'exe "echo"# comment',
29874a8d9f2eSBram Moolenaar      ], 'E488:')
29884a8d9f2eSBram Moolenaar  CheckScriptSuccess([
29894a8d9f2eSBram Moolenaar      'vim9script',
29904a8d9f2eSBram Moolenaar      'exe "echo" # something',
29914a8d9f2eSBram Moolenaar      ])
29924a8d9f2eSBram Moolenaar  CheckScriptFailure([
29934a8d9f2eSBram Moolenaar      'vim9script',
29944a8d9f2eSBram Moolenaar      'exe "echo"# something',
29954a8d9f2eSBram Moolenaar      ], 'E121:')
29964a8d9f2eSBram Moolenaar  CheckScriptFailure([
29974a8d9f2eSBram Moolenaar      'vim9script',
29984a8d9f2eSBram Moolenaar      'exe# something',
2999f8103f27SBram Moolenaar      ], 'E1144:')
30004a8d9f2eSBram Moolenaar  CheckScriptFailure([
30014a8d9f2eSBram Moolenaar      'exe "echo" # something',
30024a8d9f2eSBram Moolenaar      ], 'E121:')
30034a8d9f2eSBram Moolenaar
30047a092245SBram Moolenaar  CheckDefFailure([
30057a092245SBram Moolenaar      'try# comment',
30067a092245SBram Moolenaar      '  echo "yes"',
30077a092245SBram Moolenaar      'catch',
30087a092245SBram Moolenaar      'endtry',
3009f8103f27SBram Moolenaar      ], 'E1144:')
30102c5ed4e3SBram Moolenaar  CheckScriptFailure([
30112c5ed4e3SBram Moolenaar      'vim9script',
30122c5ed4e3SBram Moolenaar      'try# comment',
30132c5ed4e3SBram Moolenaar      'echo "yes"',
3014f8103f27SBram Moolenaar      ], 'E1144:')
30157a092245SBram Moolenaar  CheckDefFailure([
30167a092245SBram Moolenaar      'try',
3017a72cfb80SBram Moolenaar      '  throw#comment',
3018a72cfb80SBram Moolenaar      'catch',
3019a72cfb80SBram Moolenaar      'endtry',
3020f8103f27SBram Moolenaar      ], 'E1144:')
3021a72cfb80SBram Moolenaar  CheckDefFailure([
3022a72cfb80SBram Moolenaar      'try',
3023a72cfb80SBram Moolenaar      '  throw "yes"#comment',
3024a72cfb80SBram Moolenaar      'catch',
3025a72cfb80SBram Moolenaar      'endtry',
3026a72cfb80SBram Moolenaar      ], 'E488:')
3027a72cfb80SBram Moolenaar  CheckDefFailure([
3028a72cfb80SBram Moolenaar      'try',
30297a092245SBram Moolenaar      '  echo "yes"',
30307a092245SBram Moolenaar      'catch# comment',
30317a092245SBram Moolenaar      'endtry',
3032f8103f27SBram Moolenaar      ], 'E1144:')
30332c5ed4e3SBram Moolenaar  CheckScriptFailure([
30342c5ed4e3SBram Moolenaar      'vim9script',
30352c5ed4e3SBram Moolenaar      'try',
30362c5ed4e3SBram Moolenaar      '  echo "yes"',
30372c5ed4e3SBram Moolenaar      'catch# comment',
30382c5ed4e3SBram Moolenaar      'endtry',
3039f8103f27SBram Moolenaar      ], 'E1144:')
30402c5ed4e3SBram Moolenaar  CheckDefFailure([
30412c5ed4e3SBram Moolenaar      'try',
30422c5ed4e3SBram Moolenaar      '  echo "yes"',
30432c5ed4e3SBram Moolenaar      'catch /pat/# comment',
30442c5ed4e3SBram Moolenaar      'endtry',
30452c5ed4e3SBram Moolenaar      ], 'E488:')
30467a092245SBram Moolenaar  CheckDefFailure([
30477a092245SBram Moolenaar      'try',
30487a092245SBram Moolenaar      'echo "yes"',
30497a092245SBram Moolenaar      'catch',
30507a092245SBram Moolenaar      'endtry# comment',
3051f8103f27SBram Moolenaar      ], 'E1144:')
30522c5ed4e3SBram Moolenaar  CheckScriptFailure([
30532c5ed4e3SBram Moolenaar      'vim9script',
30542c5ed4e3SBram Moolenaar      'try',
30552c5ed4e3SBram Moolenaar      '  echo "yes"',
30562c5ed4e3SBram Moolenaar      'catch',
30572c5ed4e3SBram Moolenaar      'endtry# comment',
3058f8103f27SBram Moolenaar      ], 'E1144:')
30592c5ed4e3SBram Moolenaar
30602c5ed4e3SBram Moolenaar  CheckScriptSuccess([
30612c5ed4e3SBram Moolenaar      'vim9script',
30622c5ed4e3SBram Moolenaar      'hi # comment',
30632c5ed4e3SBram Moolenaar      ])
30642c5ed4e3SBram Moolenaar  CheckScriptFailure([
30652c5ed4e3SBram Moolenaar      'vim9script',
30662c5ed4e3SBram Moolenaar      'hi# comment',
3067f8103f27SBram Moolenaar      ], 'E1144:')
30681966c248SBram Moolenaar  CheckScriptSuccess([
30691966c248SBram Moolenaar      'vim9script',
30701966c248SBram Moolenaar      'hi Search # comment',
30711966c248SBram Moolenaar      ])
30721966c248SBram Moolenaar  CheckScriptFailure([
30731966c248SBram Moolenaar      'vim9script',
30741966c248SBram Moolenaar      'hi Search# comment',
30751966c248SBram Moolenaar      ], 'E416:')
30761966c248SBram Moolenaar  CheckScriptSuccess([
30771966c248SBram Moolenaar      'vim9script',
30781966c248SBram Moolenaar      'hi link This Search # comment',
30791966c248SBram Moolenaar      ])
30801966c248SBram Moolenaar  CheckScriptFailure([
30811966c248SBram Moolenaar      'vim9script',
30821966c248SBram Moolenaar      'hi link This That# comment',
30831966c248SBram Moolenaar      ], 'E413:')
30841966c248SBram Moolenaar  CheckScriptSuccess([
30851966c248SBram Moolenaar      'vim9script',
30861966c248SBram Moolenaar      'hi clear This # comment',
30871966c248SBram Moolenaar      'hi clear # comment',
30881966c248SBram Moolenaar      ])
3089f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
3090f5be8cdbSBram Moolenaar  # hi clear This# comment',
30911966c248SBram Moolenaar  CheckScriptFailure([
30921966c248SBram Moolenaar      'vim9script',
30931966c248SBram Moolenaar      'hi clear# comment',
30941966c248SBram Moolenaar      ], 'E416:')
30951966c248SBram Moolenaar
30961966c248SBram Moolenaar  CheckScriptSuccess([
30971966c248SBram Moolenaar      'vim9script',
30981966c248SBram Moolenaar      'hi Group term=bold',
30991966c248SBram Moolenaar      'match Group /todo/ # comment',
31001966c248SBram Moolenaar      ])
31011966c248SBram Moolenaar  CheckScriptFailure([
31021966c248SBram Moolenaar      'vim9script',
31031966c248SBram Moolenaar      'hi Group term=bold',
31041966c248SBram Moolenaar      'match Group /todo/# comment',
31051966c248SBram Moolenaar      ], 'E488:')
31061966c248SBram Moolenaar  CheckScriptSuccess([
31071966c248SBram Moolenaar      'vim9script',
31081966c248SBram Moolenaar      'match # comment',
31091966c248SBram Moolenaar      ])
31101966c248SBram Moolenaar  CheckScriptFailure([
31111966c248SBram Moolenaar      'vim9script',
31121966c248SBram Moolenaar      'match# comment',
3113f8103f27SBram Moolenaar      ], 'E1144:')
31141966c248SBram Moolenaar  CheckScriptSuccess([
31151966c248SBram Moolenaar      'vim9script',
31161966c248SBram Moolenaar      'match none # comment',
31171966c248SBram Moolenaar      ])
31181966c248SBram Moolenaar  CheckScriptFailure([
31191966c248SBram Moolenaar      'vim9script',
31201966c248SBram Moolenaar      'match none# comment',
31211966c248SBram Moolenaar      ], 'E475:')
31221966c248SBram Moolenaar
31231966c248SBram Moolenaar  CheckScriptSuccess([
31241966c248SBram Moolenaar      'vim9script',
31251966c248SBram Moolenaar      'menutrans clear # comment',
31261966c248SBram Moolenaar      ])
31271966c248SBram Moolenaar  CheckScriptFailure([
31281966c248SBram Moolenaar      'vim9script',
31291966c248SBram Moolenaar      'menutrans clear# comment text',
31301966c248SBram Moolenaar      ], 'E474:')
31311966c248SBram Moolenaar
31321966c248SBram Moolenaar  CheckScriptSuccess([
31331966c248SBram Moolenaar      'vim9script',
31341966c248SBram Moolenaar      'syntax clear # comment',
31351966c248SBram Moolenaar      ])
31361966c248SBram Moolenaar  CheckScriptFailure([
31371966c248SBram Moolenaar      'vim9script',
31381966c248SBram Moolenaar      'syntax clear# comment text',
31391966c248SBram Moolenaar      ], 'E28:')
31401966c248SBram Moolenaar  CheckScriptSuccess([
31411966c248SBram Moolenaar      'vim9script',
31421966c248SBram Moolenaar      'syntax keyword Word some',
31431966c248SBram Moolenaar      'syntax clear Word # comment',
31441966c248SBram Moolenaar      ])
31451966c248SBram Moolenaar  CheckScriptFailure([
31461966c248SBram Moolenaar      'vim9script',
31471966c248SBram Moolenaar      'syntax keyword Word some',
31481966c248SBram Moolenaar      'syntax clear Word# comment text',
31491966c248SBram Moolenaar      ], 'E28:')
31501966c248SBram Moolenaar
31511966c248SBram Moolenaar  CheckScriptSuccess([
31521966c248SBram Moolenaar      'vim9script',
31531966c248SBram Moolenaar      'syntax list # comment',
31541966c248SBram Moolenaar      ])
31551966c248SBram Moolenaar  CheckScriptFailure([
31561966c248SBram Moolenaar      'vim9script',
31571966c248SBram Moolenaar      'syntax list# comment text',
31581966c248SBram Moolenaar      ], 'E28:')
31591966c248SBram Moolenaar
31601966c248SBram Moolenaar  CheckScriptSuccess([
31611966c248SBram Moolenaar      'vim9script',
31621966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
31631966c248SBram Moolenaar      ])
31641966c248SBram Moolenaar  CheckScriptFailure([
31651966c248SBram Moolenaar      'vim9script',
31661966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
31671966c248SBram Moolenaar      ], 'E475:')
31681966c248SBram Moolenaar
31691966c248SBram Moolenaar  CheckScriptSuccess([
31701966c248SBram Moolenaar      'vim9script',
31711966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
31721966c248SBram Moolenaar      ])
31731966c248SBram Moolenaar  CheckScriptFailure([
31741966c248SBram Moolenaar      'vim9script',
31751966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
31761966c248SBram Moolenaar      ], 'E789:')
31771966c248SBram Moolenaar
31781966c248SBram Moolenaar  CheckScriptSuccess([
31791966c248SBram Moolenaar      'vim9script',
31801966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
31811966c248SBram Moolenaar      ])
31821966c248SBram Moolenaar  CheckScriptFailure([
31831966c248SBram Moolenaar      'vim9script',
31841966c248SBram Moolenaar      'syntax match Word /pat/# comment',
31851966c248SBram Moolenaar      ], 'E402:')
31861966c248SBram Moolenaar
31871966c248SBram Moolenaar  CheckScriptSuccess([
31881966c248SBram Moolenaar      'vim9script',
31891966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
31901966c248SBram Moolenaar      ])
31911966c248SBram Moolenaar  CheckScriptFailure([
31921966c248SBram Moolenaar      'vim9script',
31931966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
31941966c248SBram Moolenaar      ], 'E475:')
31951966c248SBram Moolenaar  CheckScriptFailure([
31961966c248SBram Moolenaar      'vim9script',
31971966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
31981966c248SBram Moolenaar      ], 'E406:')
31991966c248SBram Moolenaar  CheckScriptFailure([
32001966c248SBram Moolenaar      'vim9script',
32011966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
32021966c248SBram Moolenaar      ], 'E475:')
32031966c248SBram Moolenaar
32041966c248SBram Moolenaar  CheckScriptSuccess([
32051966c248SBram Moolenaar      'vim9script',
32061966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
32071966c248SBram Moolenaar      ])
32081966c248SBram Moolenaar  CheckScriptFailure([
32091966c248SBram Moolenaar      'vim9script',
32101966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
3211d032f34aSBram Moolenaar      ], 'E402:')
32121966c248SBram Moolenaar
32131966c248SBram Moolenaar  CheckScriptSuccess([
32141966c248SBram Moolenaar      'vim9script',
32151966c248SBram Moolenaar      'syntax sync # comment',
32161966c248SBram Moolenaar      ])
32171966c248SBram Moolenaar  CheckScriptFailure([
32181966c248SBram Moolenaar      'vim9script',
32191966c248SBram Moolenaar      'syntax sync# comment',
32201966c248SBram Moolenaar      ], 'E404:')
32211966c248SBram Moolenaar  CheckScriptSuccess([
32221966c248SBram Moolenaar      'vim9script',
32231966c248SBram Moolenaar      'syntax sync ccomment # comment',
32241966c248SBram Moolenaar      ])
32251966c248SBram Moolenaar  CheckScriptFailure([
32261966c248SBram Moolenaar      'vim9script',
32271966c248SBram Moolenaar      'syntax sync ccomment# comment',
32281966c248SBram Moolenaar      ], 'E404:')
32291966c248SBram Moolenaar
32301966c248SBram Moolenaar  CheckScriptSuccess([
32311966c248SBram Moolenaar      'vim9script',
32321966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
32331966c248SBram Moolenaar      ])
32341966c248SBram Moolenaar  CheckScriptFailure([
32351966c248SBram Moolenaar      'vim9script',
32361966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
32371966c248SBram Moolenaar      ], 'E475:')
3238a72cfb80SBram Moolenaar
3239a72cfb80SBram Moolenaar  CheckScriptSuccess([
3240a72cfb80SBram Moolenaar      'vim9script',
3241a72cfb80SBram Moolenaar      'command Echo echo # comment',
3242a72cfb80SBram Moolenaar      'command Echo # comment',
32432d870f8dSBram Moolenaar      'delcommand Echo',
3244a72cfb80SBram Moolenaar      ])
3245a72cfb80SBram Moolenaar  CheckScriptFailure([
3246a72cfb80SBram Moolenaar      'vim9script',
3247a72cfb80SBram Moolenaar      'command Echo echo# comment',
3248a72cfb80SBram Moolenaar      'Echo',
3249f8103f27SBram Moolenaar      ], 'E1144:')
32502d870f8dSBram Moolenaar  delcommand Echo
325170249ee8SBram Moolenaar
325270249ee8SBram Moolenaar  var curdir = getcwd()
325370249ee8SBram Moolenaar  CheckScriptSuccess([
325470249ee8SBram Moolenaar      'command Echo cd " comment',
325570249ee8SBram Moolenaar      'Echo',
325670249ee8SBram Moolenaar      'delcommand Echo',
325770249ee8SBram Moolenaar      ])
325870249ee8SBram Moolenaar  CheckScriptSuccess([
3259090728adSBram Moolenaar      'vim9script',
326070249ee8SBram Moolenaar      'command Echo cd # comment',
326170249ee8SBram Moolenaar      'Echo',
326270249ee8SBram Moolenaar      'delcommand Echo',
326370249ee8SBram Moolenaar      ])
326470249ee8SBram Moolenaar  CheckScriptFailure([
326570249ee8SBram Moolenaar      'vim9script',
326670249ee8SBram Moolenaar      'command Echo cd " comment',
326770249ee8SBram Moolenaar      'Echo',
326870249ee8SBram Moolenaar      ], 'E344:')
326970249ee8SBram Moolenaar  delcommand Echo
327070249ee8SBram Moolenaar  chdir(curdir)
327170249ee8SBram Moolenaar
3272a72cfb80SBram Moolenaar  CheckScriptFailure([
3273a72cfb80SBram Moolenaar      'vim9script',
3274a72cfb80SBram Moolenaar      'command Echo# comment',
3275a72cfb80SBram Moolenaar      ], 'E182:')
3276a72cfb80SBram Moolenaar  CheckScriptFailure([
3277a72cfb80SBram Moolenaar      'vim9script',
3278a72cfb80SBram Moolenaar      'command Echo echo',
3279a72cfb80SBram Moolenaar      'command Echo# comment',
3280a72cfb80SBram Moolenaar      ], 'E182:')
32812d870f8dSBram Moolenaar  delcommand Echo
3282a72cfb80SBram Moolenaar
3283a72cfb80SBram Moolenaar  CheckScriptSuccess([
3284a72cfb80SBram Moolenaar      'vim9script',
3285a72cfb80SBram Moolenaar      'function # comment',
3286a72cfb80SBram Moolenaar      ])
3287a72cfb80SBram Moolenaar  CheckScriptFailure([
3288a72cfb80SBram Moolenaar      'vim9script',
32899898107fSBram Moolenaar      'function " comment',
32909898107fSBram Moolenaar      ], 'E129:')
32919898107fSBram Moolenaar  CheckScriptFailure([
32929898107fSBram Moolenaar      'vim9script',
3293a72cfb80SBram Moolenaar      'function# comment',
3294f8103f27SBram Moolenaar      ], 'E1144:')
3295a72cfb80SBram Moolenaar  CheckScriptSuccess([
3296a72cfb80SBram Moolenaar      'vim9script',
3297a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
3298a72cfb80SBram Moolenaar      ])
3299a72cfb80SBram Moolenaar  CheckScriptFailure([
3300a72cfb80SBram Moolenaar      'vim9script',
3301a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
3302a72cfb80SBram Moolenaar      ], 'E488:')
3303a72cfb80SBram Moolenaar
3304a72cfb80SBram Moolenaar  CheckScriptSuccess([
3305a72cfb80SBram Moolenaar      'vim9script',
33064c17ad94SBram Moolenaar      'func g:DeleteMeA()',
3307a72cfb80SBram Moolenaar      'endfunc',
33084c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
3309a72cfb80SBram Moolenaar      ])
3310a72cfb80SBram Moolenaar  CheckScriptFailure([
3311a72cfb80SBram Moolenaar      'vim9script',
33124c17ad94SBram Moolenaar      'func g:DeleteMeB()',
3313a72cfb80SBram Moolenaar      'endfunc',
33144c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
3315a72cfb80SBram Moolenaar      ], 'E488:')
3316a72cfb80SBram Moolenaar
3317a72cfb80SBram Moolenaar  CheckScriptSuccess([
3318a72cfb80SBram Moolenaar      'vim9script',
3319a72cfb80SBram Moolenaar      'call execute("ls") # comment',
3320a72cfb80SBram Moolenaar      ])
3321a72cfb80SBram Moolenaar  CheckScriptFailure([
3322a72cfb80SBram Moolenaar      'vim9script',
3323a72cfb80SBram Moolenaar      'call execute("ls")# comment',
3324a72cfb80SBram Moolenaar      ], 'E488:')
3325e7e4838fSBram Moolenaar
3326e7e4838fSBram Moolenaar  CheckScriptFailure([
3327e7e4838fSBram Moolenaar      'def Test() " comment',
3328e7e4838fSBram Moolenaar      'enddef',
3329e7e4838fSBram Moolenaar      ], 'E488:')
3330e7e4838fSBram Moolenaar  CheckScriptFailure([
3331e7e4838fSBram Moolenaar      'vim9script',
3332e7e4838fSBram Moolenaar      'def Test() " comment',
3333e7e4838fSBram Moolenaar      'enddef',
3334e7e4838fSBram Moolenaar      ], 'E488:')
3335e7e4838fSBram Moolenaar
3336e7e4838fSBram Moolenaar  CheckScriptSuccess([
3337e7e4838fSBram Moolenaar      'func Test() " comment',
3338e7e4838fSBram Moolenaar      'endfunc',
33392d870f8dSBram Moolenaar      'delfunc Test',
3340e7e4838fSBram Moolenaar      ])
33419898107fSBram Moolenaar  CheckScriptSuccess([
3342e7e4838fSBram Moolenaar      'vim9script',
3343e7e4838fSBram Moolenaar      'func Test() " comment',
3344e7e4838fSBram Moolenaar      'endfunc',
33459898107fSBram Moolenaar      ])
3346e7e4838fSBram Moolenaar
3347e7e4838fSBram Moolenaar  CheckScriptSuccess([
3348e7e4838fSBram Moolenaar      'def Test() # comment',
3349e7e4838fSBram Moolenaar      'enddef',
3350e7e4838fSBram Moolenaar      ])
3351e7e4838fSBram Moolenaar  CheckScriptFailure([
3352e7e4838fSBram Moolenaar      'func Test() # comment',
3353e7e4838fSBram Moolenaar      'endfunc',
3354e7e4838fSBram Moolenaar      ], 'E488:')
33550f37e356SBram Moolenaar
33560f37e356SBram Moolenaar  var lines =<< trim END
33570f37e356SBram Moolenaar      vim9script
33580f37e356SBram Moolenaar      syn region Text
33590f37e356SBram Moolenaar      \ start='foo'
33600f37e356SBram Moolenaar      #\ comment
33610f37e356SBram Moolenaar      \ end='bar'
33625072b47aSBram Moolenaar      syn region Text start='foo'
33635072b47aSBram Moolenaar      #\ comment
33645072b47aSBram Moolenaar      \ end='bar'
33650f37e356SBram Moolenaar  END
33660f37e356SBram Moolenaar  CheckScriptSuccess(lines)
33670f37e356SBram Moolenaar
33680f37e356SBram Moolenaar  lines =<< trim END
33690f37e356SBram Moolenaar      vim9script
33700f37e356SBram Moolenaar      syn region Text
33710f37e356SBram Moolenaar      \ start='foo'
33720f37e356SBram Moolenaar      "\ comment
33730f37e356SBram Moolenaar      \ end='bar'
33740f37e356SBram Moolenaar  END
33750f37e356SBram Moolenaar  CheckScriptFailure(lines, 'E399:')
33762c5ed4e3SBram Moolenaarenddef
33772c5ed4e3SBram Moolenaar
33782c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
33792c5ed4e3SBram Moolenaar  CheckCanRunGui
33802c5ed4e3SBram Moolenaar
33812c5ed4e3SBram Moolenaar  CheckScriptFailure([
33822c5ed4e3SBram Moolenaar      'vim9script',
33832c5ed4e3SBram Moolenaar      'gui#comment'
3384f8103f27SBram Moolenaar      ], 'E1144:')
33852c5ed4e3SBram Moolenaar  CheckScriptFailure([
33862c5ed4e3SBram Moolenaar      'vim9script',
33872c5ed4e3SBram Moolenaar      'gui -f#comment'
33882c5ed4e3SBram Moolenaar      ], 'E499:')
33897a092245SBram Moolenaarenddef
33907a092245SBram Moolenaar
3391a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
33926797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
33936797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3394a26b9700SBram Moolenaar
3395a26b9700SBram Moolenaar  edit test.vim
3396a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3397a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3398a26b9700SBram Moolenaar
3399a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3400a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3401a26b9700SBram Moolenaar
3402a26b9700SBram Moolenaar  g:entered = 0
3403a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3404a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3405a26b9700SBram Moolenaar
3406a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3407a26b9700SBram Moolenaar
3408a26b9700SBram Moolenaar  au! TabEnter
3409a26b9700SBram Moolenaar  unlet g:entered
3410d72c1bf0SBram Moolenaar
3411d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3412d72c1bf0SBram Moolenaar      'vim9script',
34136797966dSBram Moolenaar      'g:var = 123',
3414e55b1c09SBram Moolenaar      'b:var = 456',
3415e55b1c09SBram Moolenaar      'w:var = 777',
3416e55b1c09SBram Moolenaar      't:var = 888',
3417d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3418d72c1bf0SBram Moolenaar      ])
3419d72c1bf0SBram Moolenaar
3420d72c1bf0SBram Moolenaar  CheckScriptFailure([
3421d72c1bf0SBram Moolenaar      'vim9script',
3422cfcd011fSBram Moolenaar      'let var = 123',
3423cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3424cfcd011fSBram Moolenaar
3425cfcd011fSBram Moolenaar  CheckScriptFailure([
3426cfcd011fSBram Moolenaar      'vim9script',
3427cfcd011fSBram Moolenaar      'var g:var = 123',
3428e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3429e55b1c09SBram Moolenaar
3430e55b1c09SBram Moolenaar  CheckScriptFailure([
3431e55b1c09SBram Moolenaar      'vim9script',
3432cfcd011fSBram Moolenaar      'var b:var = 123',
3433e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3434e55b1c09SBram Moolenaar
3435e55b1c09SBram Moolenaar  CheckScriptFailure([
3436e55b1c09SBram Moolenaar      'vim9script',
3437cfcd011fSBram Moolenaar      'var w:var = 123',
3438e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3439e55b1c09SBram Moolenaar
3440e55b1c09SBram Moolenaar  CheckScriptFailure([
3441e55b1c09SBram Moolenaar      'vim9script',
3442cfcd011fSBram Moolenaar      'var t:var = 123',
3443e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3444e55b1c09SBram Moolenaar
3445e55b1c09SBram Moolenaar  CheckScriptFailure([
3446e55b1c09SBram Moolenaar      'vim9script',
3447cfcd011fSBram Moolenaar      'var v:version = 123',
3448e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3449e55b1c09SBram Moolenaar
3450e55b1c09SBram Moolenaar  CheckScriptFailure([
3451e55b1c09SBram Moolenaar      'vim9script',
3452cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3453e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
34546797966dSBram Moolenaar
34556797966dSBram Moolenaar  CheckScriptFailure([
34566797966dSBram Moolenaar      'vim9script',
34576797966dSBram Moolenaar      'g:var = 123',
345832e35117SBram Moolenaar      'unlet g:var# comment1',
3459d72c1bf0SBram Moolenaar      ], 'E108:')
3460d72c1bf0SBram Moolenaar
3461d72c1bf0SBram Moolenaar  CheckScriptFailure([
3462d72c1bf0SBram Moolenaar      'let g:var = 123',
3463d72c1bf0SBram Moolenaar      'unlet g:var # something',
3464d72c1bf0SBram Moolenaar      ], 'E488:')
3465faac4104SBram Moolenaar
3466faac4104SBram Moolenaar  CheckScriptSuccess([
3467faac4104SBram Moolenaar      'vim9script',
346832e35117SBram Moolenaar      'if 1 # comment2',
3469faac4104SBram Moolenaar      '  echo "yes"',
3470faac4104SBram Moolenaar      'elseif 2 #comment',
3471faac4104SBram Moolenaar      '  echo "no"',
3472faac4104SBram Moolenaar      'endif',
3473faac4104SBram Moolenaar      ])
3474faac4104SBram Moolenaar
3475faac4104SBram Moolenaar  CheckScriptFailure([
3476faac4104SBram Moolenaar      'vim9script',
347732e35117SBram Moolenaar      'if 1# comment3',
3478faac4104SBram Moolenaar      '  echo "yes"',
3479faac4104SBram Moolenaar      'endif',
3480fae55a9cSBram Moolenaar      ], 'E488:')
3481faac4104SBram Moolenaar
3482faac4104SBram Moolenaar  CheckScriptFailure([
3483faac4104SBram Moolenaar      'vim9script',
348432e35117SBram Moolenaar      'if 0 # comment4',
3485faac4104SBram Moolenaar      '  echo "yes"',
3486faac4104SBram Moolenaar      'elseif 2#comment',
3487faac4104SBram Moolenaar      '  echo "no"',
3488faac4104SBram Moolenaar      'endif',
3489fae55a9cSBram Moolenaar      ], 'E488:')
3490faac4104SBram Moolenaar
3491faac4104SBram Moolenaar  CheckScriptSuccess([
3492faac4104SBram Moolenaar      'vim9script',
3493cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3494faac4104SBram Moolenaar      ])
3495faac4104SBram Moolenaar
3496faac4104SBram Moolenaar  CheckScriptFailure([
3497faac4104SBram Moolenaar      'vim9script',
3498cfcd011fSBram Moolenaar      'var v = 1# comment6',
3499fae55a9cSBram Moolenaar      ], 'E488:')
3500faac4104SBram Moolenaar
3501faac4104SBram Moolenaar  CheckScriptSuccess([
3502faac4104SBram Moolenaar      'vim9script',
3503faac4104SBram Moolenaar      'new'
3504d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3505df069eecSBram Moolenaar      ':$',
3506faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3507faac4104SBram Moolenaar      'bwipe!',
3508faac4104SBram Moolenaar      ])
3509faac4104SBram Moolenaar
3510f5be8cdbSBram Moolenaar  CheckScriptFailure([
3511f5be8cdbSBram Moolenaar      'vim9script',
3512f5be8cdbSBram Moolenaar      'new'
3513d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3514f5be8cdbSBram Moolenaar      ':$',
3515f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3516f5be8cdbSBram Moolenaar      'bwipe!',
3517f5be8cdbSBram Moolenaar      ], 'E488:')
3518f5be8cdbSBram Moolenaar
3519f5be8cdbSBram Moolenaar  CheckScriptFailure([
3520f5be8cdbSBram Moolenaar      'vim9script',
3521f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3522f5be8cdbSBram Moolenaar      ], 'E477:')
3523a26b9700SBram Moolenaarenddef
3524a26b9700SBram Moolenaar
35257e5bd91dSBram Moolenaardef Test_finish()
3526cfcd011fSBram Moolenaar  var lines =<< trim END
35277e5bd91dSBram Moolenaar    vim9script
35286797966dSBram Moolenaar    g:res = 'one'
35297e5bd91dSBram Moolenaar    if v:false | finish | endif
35306797966dSBram Moolenaar    g:res = 'two'
35317e5bd91dSBram Moolenaar    finish
35326797966dSBram Moolenaar    g:res = 'three'
35337e5bd91dSBram Moolenaar  END
35347e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
35357e5bd91dSBram Moolenaar  source Xfinished
35367e5bd91dSBram Moolenaar  assert_equal('two', g:res)
35377e5bd91dSBram Moolenaar
35387e5bd91dSBram Moolenaar  unlet g:res
35397e5bd91dSBram Moolenaar  delete('Xfinished')
35407e5bd91dSBram Moolenaarenddef
35417e5bd91dSBram Moolenaar
3542a5d0077eSBram Moolenaardef Test_forward_declaration()
3543cfcd011fSBram Moolenaar  var lines =<< trim END
3544a5d0077eSBram Moolenaar    vim9script
3545a5d0077eSBram Moolenaar    def GetValue(): string
3546a5d0077eSBram Moolenaar      return theVal
3547a5d0077eSBram Moolenaar    enddef
3548cfcd011fSBram Moolenaar    var theVal = 'something'
3549822ba247SBram Moolenaar    g:initVal = GetValue()
3550a5d0077eSBram Moolenaar    theVal = 'else'
3551a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3552a5d0077eSBram Moolenaar  END
3553a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3554a5d0077eSBram Moolenaar  source Xforward
3555a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3556a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3557a5d0077eSBram Moolenaar
3558a5d0077eSBram Moolenaar  unlet g:initVal
3559a5d0077eSBram Moolenaar  unlet g:laterVal
3560a5d0077eSBram Moolenaar  delete('Xforward')
3561a5d0077eSBram Moolenaarenddef
3562a5d0077eSBram Moolenaar
35639721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3564a6294955SBram Moolenaar  var vim9_lines =<< trim END
3565a6294955SBram Moolenaar    vim9script
3566a6294955SBram Moolenaar    var local = 'local'
3567a6294955SBram Moolenaar    g:global = 'global'
3568a6294955SBram Moolenaar    export var exported = 'exported'
3569a6294955SBram Moolenaar    export def GetText(): string
3570a6294955SBram Moolenaar       return 'text'
3571a6294955SBram Moolenaar    enddef
3572a6294955SBram Moolenaar  END
3573a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3574a6294955SBram Moolenaar
3575cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
35769721fb4eSBram Moolenaar    source Xvim9_script.vim
35779721fb4eSBram Moolenaar
35789721fb4eSBram Moolenaar    call assert_false(exists('local'))
35799721fb4eSBram Moolenaar    call assert_false(exists('exported'))
35809721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
35819721fb4eSBram Moolenaar    call assert_equal('global', global)
35829721fb4eSBram Moolenaar    call assert_equal('global', g:global)
35839721fb4eSBram Moolenaar
35849721fb4eSBram Moolenaar    " imported variable becomes script-local
35859721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
35869721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
35879721fb4eSBram Moolenaar    call assert_false(exists('exported'))
35889721fb4eSBram Moolenaar
35899721fb4eSBram Moolenaar    " imported function becomes script-local
35909721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
35919721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
35929721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
35939721fb4eSBram Moolenaar  END
35949721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
35959721fb4eSBram Moolenaar
35969721fb4eSBram Moolenaar  source Xlegacy_script.vim
35979721fb4eSBram Moolenaar  assert_equal('global', g:global)
3598f5be8cdbSBram Moolenaar  unlet g:global
35999721fb4eSBram Moolenaar
36009721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
36019721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
36029721fb4eSBram Moolenaarenddef
3603a5d0077eSBram Moolenaar
3604e535db86SBram Moolenaardef Test_declare_script_in_func()
3605e535db86SBram Moolenaar  var lines =<< trim END
3606e535db86SBram Moolenaar      vim9script
3607e535db86SBram Moolenaar      func Declare()
3608e535db86SBram Moolenaar        let s:local = 123
3609e535db86SBram Moolenaar      endfunc
3610e535db86SBram Moolenaar      Declare()
3611e535db86SBram Moolenaar      assert_equal(123, local)
3612e535db86SBram Moolenaar
3613e535db86SBram Moolenaar      var error: string
3614e535db86SBram Moolenaar      try
3615e535db86SBram Moolenaar        local = 'asdf'
3616e535db86SBram Moolenaar      catch
3617e535db86SBram Moolenaar        error = v:exception
3618e535db86SBram Moolenaar      endtry
3619e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3620e535db86SBram Moolenaar
3621e535db86SBram Moolenaar      lockvar local
3622e535db86SBram Moolenaar      try
3623e535db86SBram Moolenaar        local = 999
3624e535db86SBram Moolenaar      catch
3625e535db86SBram Moolenaar        error = v:exception
3626e535db86SBram Moolenaar      endtry
3627e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3628e535db86SBram Moolenaar  END
3629e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3630e535db86SBram Moolenaarenddef
3631e535db86SBram Moolenaar
3632e535db86SBram Moolenaar
36337d699701SBram Moolenaarfunc Test_vim9script_not_global()
36347d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
36357d699701SBram Moolenaar  let vim9lines =<< trim END
36367d699701SBram Moolenaar    vim9script
3637cfcd011fSBram Moolenaar    var name = 'local'
36387d699701SBram Moolenaar    func TheFunc()
36397d699701SBram Moolenaar      echo 'local'
36407d699701SBram Moolenaar    endfunc
36417d699701SBram Moolenaar    def DefFunc()
36427d699701SBram Moolenaar      echo 'local'
36437d699701SBram Moolenaar    enddef
36447d699701SBram Moolenaar  END
36457d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
36467d699701SBram Moolenaar  source Xvim9script.vim
36477d699701SBram Moolenaar  try
36487d699701SBram Moolenaar    echo g:var
36497d699701SBram Moolenaar    assert_report('did not fail')
36507d699701SBram Moolenaar  catch /E121:/
36517d699701SBram Moolenaar    " caught
36527d699701SBram Moolenaar  endtry
36537d699701SBram Moolenaar  try
36547d699701SBram Moolenaar    call TheFunc()
36557d699701SBram Moolenaar    assert_report('did not fail')
36567d699701SBram Moolenaar  catch /E117:/
36577d699701SBram Moolenaar    " caught
36587d699701SBram Moolenaar  endtry
36597d699701SBram Moolenaar  try
36607d699701SBram Moolenaar    call DefFunc()
36617d699701SBram Moolenaar    assert_report('did not fail')
36627d699701SBram Moolenaar  catch /E117:/
36637d699701SBram Moolenaar    " caught
36647d699701SBram Moolenaar  endtry
36657d699701SBram Moolenaar
366625859dd7SBram Moolenaar  call delete('Xvim9script.vim')
36677d699701SBram Moolenaarendfunc
36687d699701SBram Moolenaar
3669eeb27bfeSBram Moolenaardef Test_vim9_copen()
3670eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3671eeb27bfeSBram Moolenaar  copen
3672eeb27bfeSBram Moolenaar  quit
3673eeb27bfeSBram Moolenaarenddef
3674eeb27bfeSBram Moolenaar
367503290b84SBram Moolenaar" test using an auto-loaded function and variable
36762d6b20d6SBram Moolenaardef Test_vim9_autoload()
3677cfcd011fSBram Moolenaar  var lines =<< trim END
36782d6b20d6SBram Moolenaar     vim9script
367903290b84SBram Moolenaar     def some#gettest(): string
368003290b84SBram Moolenaar       return 'test'
368103290b84SBram Moolenaar     enddef
368203290b84SBram Moolenaar     g:some#name = 'name'
3683227c58a4SBram Moolenaar     g:some#dict = {key: 'value'}
3684e3ffcd99SBram Moolenaar
3685e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3686e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3687e3ffcd99SBram Moolenaar     enddef
368803290b84SBram Moolenaar  END
368903290b84SBram Moolenaar
369003290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
369103290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
369203290b84SBram Moolenaar  var save_rtp = &rtp
369303290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
369403290b84SBram Moolenaar
369503290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
369603290b84SBram Moolenaar  assert_equal('name', g:some#name)
3697227c58a4SBram Moolenaar  assert_equal('value', g:some#dict.key)
369803290b84SBram Moolenaar  g:some#other = 'other'
369903290b84SBram Moolenaar  assert_equal('other', g:some#other)
370003290b84SBram Moolenaar
3701e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3702e3ffcd99SBram Moolenaar
370317f700acSBram Moolenaar  # upper case script name works
370417f700acSBram Moolenaar  lines =<< trim END
370517f700acSBram Moolenaar     vim9script
370617f700acSBram Moolenaar     def Other#getOther(): string
370717f700acSBram Moolenaar       return 'other'
370817f700acSBram Moolenaar     enddef
370917f700acSBram Moolenaar  END
371017f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
371117f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
371217f700acSBram Moolenaar
371303290b84SBram Moolenaar  delete('Xdir', 'rf')
371403290b84SBram Moolenaar  &rtp = save_rtp
371503290b84SBram Moolenaarenddef
371603290b84SBram Moolenaar
371703290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
371803290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
371903290b84SBram Moolenaar  var lines =<< trim END
372003290b84SBram Moolenaar     vim9script
37212d6b20d6SBram Moolenaar     def foo#test()
37222d6b20d6SBram Moolenaar         echomsg getreg('"')
37232d6b20d6SBram Moolenaar     enddef
37242d6b20d6SBram Moolenaar  END
37252d6b20d6SBram Moolenaar
37262d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
37272d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3728cfcd011fSBram Moolenaar  var save_rtp = &rtp
37292d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
37302d6b20d6SBram Moolenaar  augroup test
37312d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
37322d6b20d6SBram Moolenaar  augroup END
37332d6b20d6SBram Moolenaar
37342d6b20d6SBram Moolenaar  normal Y
37352d6b20d6SBram Moolenaar
37362d6b20d6SBram Moolenaar  augroup test
37372d6b20d6SBram Moolenaar    autocmd!
37382d6b20d6SBram Moolenaar  augroup END
37392d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
37402d6b20d6SBram Moolenaar  &rtp = save_rtp
37412d6b20d6SBram Moolenaarenddef
37422d6b20d6SBram Moolenaar
374377e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
374477e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3745cfcd011fSBram Moolenaar  var lines =<< trim END
374677e5dcc3SBram Moolenaar      vim9script
374777e5dcc3SBram Moolenaar      def crash#func()
374877e5dcc3SBram Moolenaar          try
374977e5dcc3SBram Moolenaar              for x in List()
375077e5dcc3SBram Moolenaar              endfor
375177e5dcc3SBram Moolenaar          catch
375277e5dcc3SBram Moolenaar          endtry
375377e5dcc3SBram Moolenaar          g:ok = true
375477e5dcc3SBram Moolenaar      enddef
375577e5dcc3SBram Moolenaar      fu List()
375677e5dcc3SBram Moolenaar          invalid
375777e5dcc3SBram Moolenaar      endfu
375877e5dcc3SBram Moolenaar      try
375948e11c10SBram Moolenaar          alsoinvalid
376077e5dcc3SBram Moolenaar      catch /wontmatch/
376177e5dcc3SBram Moolenaar      endtry
376277e5dcc3SBram Moolenaar  END
376377e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
376477e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
376577e5dcc3SBram Moolenaar
376677e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
376777e5dcc3SBram Moolenaar  lines =<< trim END
376877e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
376977e5dcc3SBram Moolenaar    call crash#func()
377077e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
37719c4f5520SBram Moolenaar    qall!
377277e5dcc3SBram Moolenaar  END
377377e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
377477e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
377577e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
377677e5dcc3SBram Moolenaar
377777e5dcc3SBram Moolenaar  delete('Xdidit')
377877e5dcc3SBram Moolenaar  delete('Xscript')
377977e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
378003290b84SBram Moolenaar
378103290b84SBram Moolenaar  lines =<< trim END
378203290b84SBram Moolenaar    vim9script
378303290b84SBram Moolenaar    var foo#bar = 'asdf'
378403290b84SBram Moolenaar  END
378503290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
378677e5dcc3SBram Moolenaarenddef
378777e5dcc3SBram Moolenaar
378881e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
378981e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
379081e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3791cfcd011fSBram Moolenaar  var lines =<< trim END
379281e17fbeSBram Moolenaar    let s:counter = 1
379381e17fbeSBram Moolenaar    def s:Func()
379481e17fbeSBram Moolenaar      au! CursorHold
379581e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
379681e17fbeSBram Moolenaar    enddef
379781e17fbeSBram Moolenaar    call s:Func()
379881e17fbeSBram Moolenaar    doau CursorHold
379981e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
380081e17fbeSBram Moolenaar    au! CursorHold
380181e17fbeSBram Moolenaar  END
380281e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
380381e17fbeSBram Moolenaarenddef
380481e17fbeSBram Moolenaar
3805b5841b99SBram Moolenaardef Test_error_in_autoload_script()
3806b5841b99SBram Moolenaar  var save_rtp = &rtp
3807b5841b99SBram Moolenaar  var dir = getcwd() .. '/Xruntime'
3808b5841b99SBram Moolenaar  &rtp = dir
3809b5841b99SBram Moolenaar  mkdir(dir .. '/autoload', 'p')
3810b5841b99SBram Moolenaar
3811b5841b99SBram Moolenaar  var lines =<< trim END
3812b5841b99SBram Moolenaar      vim9script noclear
3813b5841b99SBram Moolenaar      def script#autoloaded()
3814b5841b99SBram Moolenaar      enddef
3815b5841b99SBram Moolenaar      def Broken()
3816b5841b99SBram Moolenaar        var x: any = ''
3817b5841b99SBram Moolenaar        eval x != 0
3818b5841b99SBram Moolenaar      enddef
3819b5841b99SBram Moolenaar      Broken()
3820b5841b99SBram Moolenaar  END
3821b5841b99SBram Moolenaar  writefile(lines, dir .. '/autoload/script.vim')
3822b5841b99SBram Moolenaar
3823b5841b99SBram Moolenaar  lines =<< trim END
3824b5841b99SBram Moolenaar      vim9script
3825b5841b99SBram Moolenaar      def CallAutoloaded()
3826b5841b99SBram Moolenaar        script#autoloaded()
3827b5841b99SBram Moolenaar      enddef
3828b5841b99SBram Moolenaar
3829b5841b99SBram Moolenaar      function Legacy()
3830b5841b99SBram Moolenaar        try
3831b5841b99SBram Moolenaar          call s:CallAutoloaded()
3832b5841b99SBram Moolenaar        catch
3833b5841b99SBram Moolenaar          call assert_match('E1030: Using a String as a Number', v:exception)
3834b5841b99SBram Moolenaar        endtry
3835b5841b99SBram Moolenaar      endfunction
3836b5841b99SBram Moolenaar
3837b5841b99SBram Moolenaar      Legacy()
3838b5841b99SBram Moolenaar  END
3839b5841b99SBram Moolenaar  CheckScriptSuccess(lines)
3840b5841b99SBram Moolenaar
3841b5841b99SBram Moolenaar  &rtp = save_rtp
3842b5841b99SBram Moolenaar  delete(dir, 'rf')
3843b5841b99SBram Moolenaarenddef
3844b5841b99SBram Moolenaar
38453896a105SBram Moolenaardef Test_cmdline_win()
38463896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
38473896a105SBram Moolenaar  # the command line window.
38483896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3849cfcd011fSBram Moolenaar  var export_lines =<< trim END
38503896a105SBram Moolenaar    vim9script
3851cfcd011fSBram Moolenaar    export var That = 'yes'
38523896a105SBram Moolenaar  END
38533896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3854cfcd011fSBram Moolenaar  var import_lines =<< trim END
38553896a105SBram Moolenaar    vim9script
38563896a105SBram Moolenaar    import That from './Xexport.vim'
38573896a105SBram Moolenaar  END
38583896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3859cfcd011fSBram Moolenaar  var save_rtp = &rtp
38603896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
38613896a105SBram Moolenaar  syntax on
38623896a105SBram Moolenaar  augroup CmdWin
38633896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
38643896a105SBram Moolenaar  augroup END
38653896a105SBram Moolenaar  # this will open and also close the cmdline window
38663896a105SBram Moolenaar  feedkeys('q:', 'xt')
38673896a105SBram Moolenaar  assert_equal('yes', g:got_there)
38683896a105SBram Moolenaar
38693896a105SBram Moolenaar  augroup CmdWin
38703896a105SBram Moolenaar    au!
38713896a105SBram Moolenaar  augroup END
38723896a105SBram Moolenaar  &rtp = save_rtp
38733896a105SBram Moolenaar  delete('rtp', 'rf')
38743896a105SBram Moolenaarenddef
38753896a105SBram Moolenaar
3876e3d4685fSBram Moolenaardef Test_invalid_sid()
3877e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
387825859dd7SBram Moolenaar
38799c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3880d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3881e3d4685fSBram Moolenaar  endif
3882e3d4685fSBram Moolenaar  delete('Xdidit')
3883e3d4685fSBram Moolenaarenddef
3884e3d4685fSBram Moolenaar
38859ec7026fSBram Moolenaardef Test_restoring_cpo()
38869ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
38879ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
38889ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
38899ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
38909ec7026fSBram Moolenaar  endif
38919ec7026fSBram Moolenaar  delete('Xsourced')
38929ec7026fSBram Moolenaar  delete('Xclose')
3893090728adSBram Moolenaar  delete('Xdone')
38940123cc1eSBram Moolenaar
38950123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
38960123cc1eSBram Moolenaar  set cpo=aABceFsMny>
38970123cc1eSBram Moolenaar  edit XanotherScript
38980123cc1eSBram Moolenaar  so %
38990123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
39000123cc1eSBram Moolenaar  :1del
39010123cc1eSBram Moolenaar  w
39020123cc1eSBram Moolenaar  so %
39030123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
39040123cc1eSBram Moolenaar
39050123cc1eSBram Moolenaar  delete('XanotherScript')
39060123cc1eSBram Moolenaar  set cpo&vim
39079ec7026fSBram Moolenaarenddef
39089ec7026fSBram Moolenaar
3909ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3910ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
391137294bd6SBram Moolenaar  CheckScreendump
3912ffb7dcdbSBram Moolenaar  CheckFeature timers
391337294bd6SBram Moolenaar
3914ffb7dcdbSBram Moolenaar  let lines =<< trim END
391537294bd6SBram Moolenaar    vim9script
391637294bd6SBram Moolenaar    def script#func()
391737294bd6SBram Moolenaar    enddef
391837294bd6SBram Moolenaar  END
3919ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3920ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
392137294bd6SBram Moolenaar
3922ffb7dcdbSBram Moolenaar  let lines =<< trim END
392337294bd6SBram Moolenaar      vim9script
392437294bd6SBram Moolenaar      set cpo+=M
392537294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
3926767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
392737294bd6SBram Moolenaar      setline(1, 'some text')
392837294bd6SBram Moolenaar  END
3929ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3930ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3931ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3932ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
393337294bd6SBram Moolenaar
3934ffb7dcdbSBram Moolenaar  " clean up
3935ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3936ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3937ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3938ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3939ffb7dcdbSBram Moolenaarendfunc
394037294bd6SBram Moolenaar
39419ec7026fSBram Moolenaar
3942f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3943cfcd011fSBram Moolenaar  var lines =<< trim END
3944cfcd011fSBram Moolenaar    var name: any
3945cfcd011fSBram Moolenaar    assert_equal(0, name)
3946f0afd9e1SBram Moolenaar  END
3947f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3948f0afd9e1SBram Moolenaarenddef
3949f0afd9e1SBram Moolenaar
39507e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
395158dbef33SBram Moolenaar  CheckRunVimInTerminal
395258dbef33SBram Moolenaar
39537e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
39547e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
39557e9210eaSBram Moolenaarendfunc
39567e9210eaSBram Moolenaar
39577e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
39589c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3959cfcd011fSBram Moolenaar  var lines =<< trim END
39609c4f5520SBram Moolenaar    func CheckAndQuit()
39619c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
39629c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
39639c4f5520SBram Moolenaar    endfunc
39649c4f5520SBram Moolenaar  END
39659c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
39669c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3967e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
39689c4f5520SBram Moolenaar  # define Afunc() on the command line
39699c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
39709c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
39712949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
39729c4f5520SBram Moolenaar
39739c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
39749c4f5520SBram Moolenaar  delete('XcallFunc')
39759c4f5520SBram Moolenaar  delete('Xdidcmd')
39769c4f5520SBram Moolenaarenddef
39779c4f5520SBram Moolenaar
3978fcdc5d83SBram Moolenaardef Test_script_var_scope()
3979fcdc5d83SBram Moolenaar  var lines =<< trim END
3980fcdc5d83SBram Moolenaar      vim9script
3981fcdc5d83SBram Moolenaar      if true
3982fcdc5d83SBram Moolenaar        if true
3983fcdc5d83SBram Moolenaar          var one = 'one'
3984fcdc5d83SBram Moolenaar          echo one
3985fcdc5d83SBram Moolenaar        endif
3986fcdc5d83SBram Moolenaar        echo one
3987fcdc5d83SBram Moolenaar      endif
3988fcdc5d83SBram Moolenaar  END
3989fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3990fcdc5d83SBram Moolenaar
3991fcdc5d83SBram Moolenaar  lines =<< trim END
3992fcdc5d83SBram Moolenaar      vim9script
3993fcdc5d83SBram Moolenaar      if true
3994fcdc5d83SBram Moolenaar        if false
3995fcdc5d83SBram Moolenaar          var one = 'one'
3996fcdc5d83SBram Moolenaar          echo one
3997fcdc5d83SBram Moolenaar        else
3998fcdc5d83SBram Moolenaar          var one = 'one'
3999fcdc5d83SBram Moolenaar          echo one
4000fcdc5d83SBram Moolenaar        endif
4001fcdc5d83SBram Moolenaar        echo one
4002fcdc5d83SBram Moolenaar      endif
4003fcdc5d83SBram Moolenaar  END
4004fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
4005fcdc5d83SBram Moolenaar
4006fcdc5d83SBram Moolenaar  lines =<< trim END
4007fcdc5d83SBram Moolenaar      vim9script
4008fcdc5d83SBram Moolenaar      while true
4009fcdc5d83SBram Moolenaar        var one = 'one'
4010fcdc5d83SBram Moolenaar        echo one
4011fcdc5d83SBram Moolenaar        break
4012fcdc5d83SBram Moolenaar      endwhile
4013fcdc5d83SBram Moolenaar      echo one
4014fcdc5d83SBram Moolenaar  END
4015fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
4016fcdc5d83SBram Moolenaar
4017fcdc5d83SBram Moolenaar  lines =<< trim END
4018fcdc5d83SBram Moolenaar      vim9script
4019fcdc5d83SBram Moolenaar      for i in range(1)
4020fcdc5d83SBram Moolenaar        var one = 'one'
4021fcdc5d83SBram Moolenaar        echo one
4022fcdc5d83SBram Moolenaar      endfor
4023fcdc5d83SBram Moolenaar      echo one
4024fcdc5d83SBram Moolenaar  END
4025fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
40269becdf2bSBram Moolenaar
40279becdf2bSBram Moolenaar  lines =<< trim END
40289becdf2bSBram Moolenaar      vim9script
40299becdf2bSBram Moolenaar      {
40309becdf2bSBram Moolenaar        var one = 'one'
40319becdf2bSBram Moolenaar        assert_equal('one', one)
40329becdf2bSBram Moolenaar      }
40339becdf2bSBram Moolenaar      assert_false(exists('one'))
40349becdf2bSBram Moolenaar      assert_false(exists('s:one'))
40359becdf2bSBram Moolenaar  END
40369becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
40379becdf2bSBram Moolenaar
40389becdf2bSBram Moolenaar  lines =<< trim END
40399becdf2bSBram Moolenaar      vim9script
40409becdf2bSBram Moolenaar      {
40419becdf2bSBram Moolenaar        var one = 'one'
40429becdf2bSBram Moolenaar        echo one
40439becdf2bSBram Moolenaar      }
40449becdf2bSBram Moolenaar      echo one
40459becdf2bSBram Moolenaar  END
40469becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
4047fcdc5d83SBram Moolenaarenddef
4048fcdc5d83SBram Moolenaar
4049352134bbSBram Moolenaardef Test_catch_exception_in_callback()
4050352134bbSBram Moolenaar  var lines =<< trim END
4051352134bbSBram Moolenaar    vim9script
40522a38908bSBram Moolenaar    def Callback(...l: list<any>)
4053352134bbSBram Moolenaar      try
4054352134bbSBram Moolenaar        var x: string
4055352134bbSBram Moolenaar        var y: string
4056352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
4057352134bbSBram Moolenaar        [x, y] = ['']
4058352134bbSBram Moolenaar      catch
4059352134bbSBram Moolenaar        g:caught = 'yes'
4060352134bbSBram Moolenaar      endtry
4061352134bbSBram Moolenaar    enddef
4062e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
4063352134bbSBram Moolenaar    feedkeys("\r", 'xt')
4064352134bbSBram Moolenaar  END
4065352134bbSBram Moolenaar  CheckScriptSuccess(lines)
4066352134bbSBram Moolenaar
4067352134bbSBram Moolenaar  unlet g:caught
4068352134bbSBram Moolenaarenddef
4069352134bbSBram Moolenaar
4070631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
4071631e8f93SBram Moolenaar  if !has('unix') || !has('job')
4072631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
4073631e8f93SBram Moolenaar  endif
4074631e8f93SBram Moolenaar  var lines =<< trim END
4075631e8f93SBram Moolenaar      vim9script
4076631e8f93SBram Moolenaar      var source: list<number>
40772a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
4078631e8f93SBram Moolenaar          eval [][0]
4079631e8f93SBram Moolenaar      enddef
40802a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
4081631e8f93SBram Moolenaar          sleep 1m
4082631e8f93SBram Moolenaar          source += l
4083631e8f93SBram Moolenaar      enddef
4084e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
40856f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
40866f17a3f0SBram Moolenaar        sleep 10m
40876f17a3f0SBram Moolenaar      endwhile
4088206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
4089fe95b94fSBram Moolenaar      sleep 200m
4090631e8f93SBram Moolenaar  END
4091631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
4092631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
4093631e8f93SBram Moolenaar  delete('Xdef')
4094631e8f93SBram Moolenaarenddef
4095631e8f93SBram Moolenaar
40964324d87aSBram Moolenaardef InvokeNormal()
40974324d87aSBram Moolenaar  exe "norm! :m+1\r"
40984324d87aSBram Moolenaarenddef
40994324d87aSBram Moolenaar
41004324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
41014324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
41024324d87aSBram Moolenaar  new
41034324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
41044324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
41054324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
41064324d87aSBram Moolenaar  xunmap <F3>
4107b5b9480eSBram Moolenaarenddef
4108b5b9480eSBram Moolenaar
4109b5b9480eSBram Moolenaardef Test_white_space_after_command()
4110b5b9480eSBram Moolenaar  var lines =<< trim END
4111b5b9480eSBram Moolenaar    exit_cb: Func})
4112b5b9480eSBram Moolenaar  END
4113b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
4114f8103f27SBram Moolenaar
4115f8103f27SBram Moolenaar  lines =<< trim END
4116f8103f27SBram Moolenaar    e#
4117f8103f27SBram Moolenaar  END
4118f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
41194324d87aSBram Moolenaarenddef
41204324d87aSBram Moolenaar
41214aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
41224aab88d9SBram Moolenaar  var lines =<< trim END
41234aab88d9SBram Moolenaar      vim9script
41244aab88d9SBram Moolenaar      if exists('g:guard')
41254aab88d9SBram Moolenaar        finish
41264aab88d9SBram Moolenaar      endif
41274aab88d9SBram Moolenaar      g:guard = 1
41284aab88d9SBram Moolenaar      var name = 'thename'
41294aab88d9SBram Moolenaar      def g:GetName(): string
41304aab88d9SBram Moolenaar        return name
41314aab88d9SBram Moolenaar      enddef
41324aab88d9SBram Moolenaar      def g:SetName(arg: string)
41334aab88d9SBram Moolenaar        name = arg
41344aab88d9SBram Moolenaar      enddef
41354aab88d9SBram Moolenaar  END
41364aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
41374aab88d9SBram Moolenaar  so XscriptTwice.vim
41384aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
41394aab88d9SBram Moolenaar  g:SetName('newname')
41404aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
41414aab88d9SBram Moolenaar  so XscriptTwice.vim
41424aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
41434aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
41444aab88d9SBram Moolenaar
41454aab88d9SBram Moolenaar  delfunc g:GetName
41464aab88d9SBram Moolenaar  delfunc g:SetName
41474aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
41484aab88d9SBram Moolenaar  unlet g:guard
41494aab88d9SBram Moolenaarenddef
41504aab88d9SBram Moolenaar
41514aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
41524aab88d9SBram Moolenaar  var exportlines =<< trim END
41534aab88d9SBram Moolenaar      vim9script
41544aab88d9SBram Moolenaar      if exists('g:guard')
41554aab88d9SBram Moolenaar        finish
41564aab88d9SBram Moolenaar      endif
41574aab88d9SBram Moolenaar      g:guard = 1
41584aab88d9SBram Moolenaar      export var name = 'someName'
41594aab88d9SBram Moolenaar  END
41604aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
41614aab88d9SBram Moolenaar
41624aab88d9SBram Moolenaar  var lines =<< trim END
41634aab88d9SBram Moolenaar      vim9script
41644aab88d9SBram Moolenaar      import name from './XexportScript.vim'
41654aab88d9SBram Moolenaar      def g:GetName(): string
41664aab88d9SBram Moolenaar        return name
41674aab88d9SBram Moolenaar      enddef
41684aab88d9SBram Moolenaar  END
41694aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
41704aab88d9SBram Moolenaar  so XscriptImport.vim
41714aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
41724aab88d9SBram Moolenaar
41734aab88d9SBram Moolenaar  so XexportScript.vim
41744aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
41754aab88d9SBram Moolenaar
41764aab88d9SBram Moolenaar  delfunc g:GetName
41774aab88d9SBram Moolenaar  delete('XexportScript.vim')
41784aab88d9SBram Moolenaar  delete('XscriptImport.vim')
41794aab88d9SBram Moolenaar  unlet g:guard
41804aab88d9SBram Moolenaarenddef
41814aab88d9SBram Moolenaar
418210b9421fSBram Moolenaardef Test_unsupported_commands()
418310b9421fSBram Moolenaar  var lines =<< trim END
418410b9421fSBram Moolenaar      ka
418510b9421fSBram Moolenaar  END
41867d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
41877d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
418810b9421fSBram Moolenaar
418910b9421fSBram Moolenaar  lines =<< trim END
4190ada1d870SBram Moolenaar      :1ka
4191ada1d870SBram Moolenaar  END
41927d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
41937d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
4194ada1d870SBram Moolenaar
4195ada1d870SBram Moolenaar  lines =<< trim END
419610b9421fSBram Moolenaar    t
419710b9421fSBram Moolenaar  END
419810b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
419910b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
420010b9421fSBram Moolenaar
420110b9421fSBram Moolenaar  lines =<< trim END
420210b9421fSBram Moolenaar    x
420310b9421fSBram Moolenaar  END
420410b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
420510b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
420610b9421fSBram Moolenaar
420710b9421fSBram Moolenaar  lines =<< trim END
420810b9421fSBram Moolenaar    xit
420910b9421fSBram Moolenaar  END
421010b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
421110b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
421210b9421fSBram Moolenaarenddef
421310b9421fSBram Moolenaar
4214c70fe460SBram Moolenaardef Test_mapping_line_number()
4215c70fe460SBram Moolenaar  var lines =<< trim END
4216c70fe460SBram Moolenaar      vim9script
4217c70fe460SBram Moolenaar      def g:FuncA()
4218c70fe460SBram Moolenaar          # Some comment
4219c70fe460SBram Moolenaar          FuncB(0)
4220c70fe460SBram Moolenaar      enddef
4221c70fe460SBram Moolenaar          # Some comment
4222c70fe460SBram Moolenaar      def FuncB(
4223c70fe460SBram Moolenaar          # Some comment
4224c70fe460SBram Moolenaar          n: number
4225c70fe460SBram Moolenaar      )
4226c70fe460SBram Moolenaar          exe 'nno '
4227c70fe460SBram Moolenaar              # Some comment
4228c70fe460SBram Moolenaar              .. '<F3> a'
4229c70fe460SBram Moolenaar              .. 'b'
4230c70fe460SBram Moolenaar              .. 'c'
4231c70fe460SBram Moolenaar      enddef
4232c70fe460SBram Moolenaar  END
4233c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
4234c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
4235c70fe460SBram Moolenaar  assert_match('No mapping found', res)
4236c70fe460SBram Moolenaar
4237c70fe460SBram Moolenaar  g:FuncA()
4238c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
4239c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4240c70fe460SBram Moolenaar
4241c70fe460SBram Moolenaar  nunmap <F3>
4242c70fe460SBram Moolenaar  delfunc g:FuncA
4243c70fe460SBram Moolenaarenddef
4244c70fe460SBram Moolenaar
4245deb108baSBram Moolenaardef Test_option_set()
4246deb108baSBram Moolenaar  # legacy script allows for white space
4247deb108baSBram Moolenaar  var lines =<< trim END
4248deb108baSBram Moolenaar      set foldlevel  =11
4249deb108baSBram Moolenaar      call assert_equal(11, &foldlevel)
4250deb108baSBram Moolenaar  END
4251deb108baSBram Moolenaar  CheckScriptSuccess(lines)
4252deb108baSBram Moolenaar
4253deb108baSBram Moolenaar  set foldlevel
4254deb108baSBram Moolenaar  set foldlevel=12
4255deb108baSBram Moolenaar  assert_equal(12, &foldlevel)
4256deb108baSBram Moolenaar  set foldlevel+=2
4257deb108baSBram Moolenaar  assert_equal(14, &foldlevel)
4258deb108baSBram Moolenaar  set foldlevel-=3
4259deb108baSBram Moolenaar  assert_equal(11, &foldlevel)
4260deb108baSBram Moolenaar
4261deb108baSBram Moolenaar  lines =<< trim END
4262deb108baSBram Moolenaar      set foldlevel =1
4263deb108baSBram Moolenaar  END
4264deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
4265deb108baSBram Moolenaar
4266deb108baSBram Moolenaar  lines =<< trim END
4267deb108baSBram Moolenaar      set foldlevel +=1
4268deb108baSBram Moolenaar  END
4269deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
4270deb108baSBram Moolenaar
4271deb108baSBram Moolenaar  lines =<< trim END
4272deb108baSBram Moolenaar      set foldlevel ^=1
4273deb108baSBram Moolenaar  END
4274deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
4275deb108baSBram Moolenaar
4276deb108baSBram Moolenaar  lines =<< trim END
4277deb108baSBram Moolenaar      set foldlevel -=1
4278deb108baSBram Moolenaar  END
4279deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
4280deb108baSBram Moolenaar
4281deb108baSBram Moolenaar  set foldlevel&
4282deb108baSBram Moolenaarenddef
4283deb108baSBram Moolenaar
4284208f0b48SBram Moolenaardef Test_option_modifier()
42851594f313SBram Moolenaar  # legacy script allows for white space
4286208f0b48SBram Moolenaar  var lines =<< trim END
4287208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
4288208f0b48SBram Moolenaar      call assert_equal(1, &hlsearch)
4289208f0b48SBram Moolenaar  END
4290208f0b48SBram Moolenaar  CheckScriptSuccess(lines)
4291208f0b48SBram Moolenaar
42921594f313SBram Moolenaar  set hlsearch
42931594f313SBram Moolenaar  set hlsearch!
42941594f313SBram Moolenaar  assert_equal(false, &hlsearch)
42951594f313SBram Moolenaar
42961594f313SBram Moolenaar  set hlsearch
4297208f0b48SBram Moolenaar  set hlsearch&
42981594f313SBram Moolenaar  assert_equal(false, &hlsearch)
4299208f0b48SBram Moolenaar
4300208f0b48SBram Moolenaar  lines =<< trim END
43011594f313SBram Moolenaar      set hlsearch &
4302208f0b48SBram Moolenaar  END
43031594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
43041594f313SBram Moolenaar
43051594f313SBram Moolenaar  lines =<< trim END
43061594f313SBram Moolenaar      set hlsearch   !
43071594f313SBram Moolenaar  END
43081594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
43091594f313SBram Moolenaar
43101594f313SBram Moolenaar  set hlsearch&
4311208f0b48SBram Moolenaarenddef
4312208f0b48SBram Moolenaar
4313c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail
4314c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number()
4315c03fe66aSBram Moolenaar  var lines =<< trim END
4316c03fe66aSBram Moolenaar      echoerr 'some'
4317c03fe66aSBram Moolenaar         .. ' error'
4318c03fe66aSBram Moolenaar         .. ' continued'
4319c03fe66aSBram Moolenaar  END
4320c03fe66aSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
4321c03fe66aSBram Moolenaarenddef
4322c03fe66aSBram Moolenaar
4323648594eaSBram Moolenaardef ProfiledWithLambda()
4324d9162550SBram Moolenaar  var n = 3
4325d9162550SBram Moolenaar  echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4326d9162550SBram Moolenaarenddef
4327d9162550SBram Moolenaar
4328648594eaSBram Moolenaardef ProfiledNested()
4329648594eaSBram Moolenaar  var x = 0
4330648594eaSBram Moolenaar  def Nested(): any
4331648594eaSBram Moolenaar      return x
4332648594eaSBram Moolenaar  enddef
4333648594eaSBram Moolenaar  Nested()
4334648594eaSBram Moolenaarenddef
4335648594eaSBram Moolenaar
4336ffcfddc7SBram Moolenaardef ProfiledNestedProfiled()
4337ffcfddc7SBram Moolenaar  var x = 0
4338ffcfddc7SBram Moolenaar  def Nested(): any
4339ffcfddc7SBram Moolenaar      return x
4340ffcfddc7SBram Moolenaar  enddef
4341ffcfddc7SBram Moolenaar  Nested()
4342ffcfddc7SBram Moolenaarenddef
4343ffcfddc7SBram Moolenaar
4344d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists.
4345d9162550SBram Moolenaar" This only tests that it works, not the profiling output.
4346d9162550SBram Moolenaardef Test_xx_profile_with_lambda()
43474ece152aSBram Moolenaar  CheckFeature profile
43484ece152aSBram Moolenaar
4349d9162550SBram Moolenaar  profile start Xprofile.log
4350648594eaSBram Moolenaar  profile func ProfiledWithLambda
4351648594eaSBram Moolenaar  ProfiledWithLambda()
4352ffcfddc7SBram Moolenaar
4353648594eaSBram Moolenaar  profile func ProfiledNested
4354648594eaSBram Moolenaar  ProfiledNested()
4355ffcfddc7SBram Moolenaar
4356ffcfddc7SBram Moolenaar  # Also profile the nested function.  Use a different function, although the
4357ffcfddc7SBram Moolenaar  # contents is the same, to make sure it was not already compiled.
4358ffcfddc7SBram Moolenaar  profile func *
4359ffcfddc7SBram Moolenaar  ProfiledNestedProfiled()
4360ffcfddc7SBram Moolenaar
4361ffcfddc7SBram Moolenaar  profdel func *
4362ffcfddc7SBram Moolenaar  profile pause
4363d9162550SBram Moolenaarenddef
4364d9162550SBram Moolenaar
4365585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
4366585fea7bSBram Moolenaardef Test_substitute_cmd()
4367585fea7bSBram Moolenaar  new
4368585fea7bSBram Moolenaar  setline(1, 'something')
4369585fea7bSBram Moolenaar  :substitute(some(other(
4370585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
4371585fea7bSBram Moolenaar  bwipe!
4372585fea7bSBram Moolenaar
4373f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
4374cfcd011fSBram Moolenaar  var lines =<< trim END
4375585fea7bSBram Moolenaar    vim9script
4376585fea7bSBram Moolenaar    new
4377585fea7bSBram Moolenaar    setline(1, 'something')
4378585fea7bSBram Moolenaar    :substitute(some(other(
4379585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
4380585fea7bSBram Moolenaar    bwipe!
4381585fea7bSBram Moolenaar  END
4382585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
4383585fea7bSBram Moolenaar  source Xvim9lines
4384585fea7bSBram Moolenaar
4385585fea7bSBram Moolenaar  delete('Xvim9lines')
4386585fea7bSBram Moolenaarenddef
4387585fea7bSBram Moolenaar
43888a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
4389