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
191*23e2e115SBram Moolenaar    constlist[1][1] = 88
192cfcd011fSBram Moolenaar    var cl = constlist[1]
19371abe482SBram Moolenaar    cl[1] = 88
19471abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
19571abe482SBram Moolenaar
196e0de171eSBram Moolenaar    var vardict = {five: 5, six: 6}
197e0de171eSBram Moolenaar    const constdict = {one: 1, two: vardict, three: 3}
19871abe482SBram Moolenaar    vardict['five'] = 55
199*23e2e115SBram Moolenaar    constdict['two']['six'] = 66
200cfcd011fSBram Moolenaar    var cd = constdict['two']
20171abe482SBram Moolenaar    cd['six'] = 66
202e0de171eSBram Moolenaar    constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
203dbeecb2bSBram Moolenaar  END
204dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
20508052228SBram Moolenaarenddef
2068a7d6542SBram Moolenaar
2070b4c66c6SBram Moolenaardef Test_const_bang()
208cfcd011fSBram Moolenaar  var lines =<< trim END
20930fd8204SBram Moolenaar      const var = 234
2100b4c66c6SBram Moolenaar      var = 99
2110b4c66c6SBram Moolenaar  END
2120b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
2130b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
2140b4c66c6SBram Moolenaar
2150b4c66c6SBram Moolenaar  lines =<< trim END
21630fd8204SBram Moolenaar      const ll = [2, 3, 4]
2170b4c66c6SBram Moolenaar      ll[0] = 99
2180b4c66c6SBram Moolenaar  END
2190b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2200b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2210b4c66c6SBram Moolenaar
2220b4c66c6SBram Moolenaar  lines =<< trim END
22330fd8204SBram Moolenaar      const ll = [2, 3, 4]
2240b4c66c6SBram Moolenaar      ll[3] = 99
2250b4c66c6SBram Moolenaar  END
2260b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2270b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2280b4c66c6SBram Moolenaar
2290b4c66c6SBram Moolenaar  lines =<< trim END
230e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2310b4c66c6SBram Moolenaar      dd["one"] = 99
2320b4c66c6SBram Moolenaar  END
2330b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2340b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2350b4c66c6SBram Moolenaar
2360b4c66c6SBram Moolenaar  lines =<< trim END
237e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2380b4c66c6SBram Moolenaar      dd["three"] = 99
2390b4c66c6SBram Moolenaar  END
2400b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2410b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2420b4c66c6SBram Moolenaarenddef
2430b4c66c6SBram Moolenaar
244df069eecSBram Moolenaardef Test_range_no_colon()
245d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
246d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
247d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
248d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
249df069eecSBram Moolenaarenddef
250df069eecSBram Moolenaar
251df069eecSBram Moolenaar
2528a7d6542SBram Moolenaardef Test_block()
253cfcd011fSBram Moolenaar  var outer = 1
2548a7d6542SBram Moolenaar  {
255cfcd011fSBram Moolenaar    var inner = 2
2568a7d6542SBram Moolenaar    assert_equal(1, outer)
2578a7d6542SBram Moolenaar    assert_equal(2, inner)
2588a7d6542SBram Moolenaar  }
2598a7d6542SBram Moolenaar  assert_equal(1, outer)
2603f1e9f00SBram Moolenaar
2613f1e9f00SBram Moolenaar  {|echo 'yes'|}
2628a7d6542SBram Moolenaarenddef
2638a7d6542SBram Moolenaar
26408052228SBram Moolenaardef Test_block_failure()
265cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
26608052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
26708052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
26808052228SBram Moolenaarenddef
2698a7d6542SBram Moolenaar
270fbbcd003SBram Moolenaardef Test_block_local_vars()
271fbbcd003SBram Moolenaar  var lines =<< trim END
272fbbcd003SBram Moolenaar      vim9script
273ed234f24SBram Moolenaar      v:testing = 1
274fbbcd003SBram Moolenaar      if true
275ed234f24SBram Moolenaar        var text = ['hello']
276ed234f24SBram Moolenaar        def SayHello(): list<string>
277fbbcd003SBram Moolenaar          return text
278fbbcd003SBram Moolenaar        enddef
279fbbcd003SBram Moolenaar        def SetText(v: string)
280ed234f24SBram Moolenaar          text = [v]
281fbbcd003SBram Moolenaar        enddef
282fbbcd003SBram Moolenaar      endif
283fbbcd003SBram Moolenaar
284fbbcd003SBram Moolenaar      if true
285ed234f24SBram Moolenaar        var text = ['again']
286ed234f24SBram Moolenaar        def SayAgain(): list<string>
287fbbcd003SBram Moolenaar          return text
288fbbcd003SBram Moolenaar        enddef
289fbbcd003SBram Moolenaar      endif
290ed234f24SBram Moolenaar
291ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
292ed234f24SBram Moolenaar      test_garbagecollect_now()
293ed234f24SBram Moolenaar
294fbbcd003SBram Moolenaar      defcompile
295fbbcd003SBram Moolenaar
296ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
297ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
298fbbcd003SBram Moolenaar
299fbbcd003SBram Moolenaar      SetText('foobar')
300ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
301ed234f24SBram Moolenaar
302ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
303ed234f24SBram Moolenaar      qall!
304fbbcd003SBram Moolenaar  END
305ed234f24SBram Moolenaar
306ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
307ed234f24SBram Moolenaar  # context gets garbage collected.
308ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
309ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
310ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
311ed234f24SBram Moolenaar
312ed234f24SBram Moolenaar  delete('Xscript')
313ed234f24SBram Moolenaar  delete('Xdidit')
314fbbcd003SBram Moolenaarenddef
315fbbcd003SBram Moolenaar
31639ca4127SBram Moolenaardef Test_block_local_vars_with_func()
31739ca4127SBram Moolenaar  var lines =<< trim END
31839ca4127SBram Moolenaar      vim9script
31939ca4127SBram Moolenaar      if true
32039ca4127SBram Moolenaar        var foo = 'foo'
32139ca4127SBram Moolenaar        if true
32239ca4127SBram Moolenaar          var bar = 'bar'
32339ca4127SBram Moolenaar          def Func(): list<string>
32439ca4127SBram Moolenaar            return [foo, bar]
32539ca4127SBram Moolenaar          enddef
32639ca4127SBram Moolenaar        endif
32739ca4127SBram Moolenaar      endif
32839ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
32939ca4127SBram Moolenaar      # "foo" and "bar"
33039ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
33139ca4127SBram Moolenaar  END
33239ca4127SBram Moolenaar  CheckScriptSuccess(lines)
33339ca4127SBram Moolenaarenddef
33439ca4127SBram Moolenaar
335e4db17fbSBram Moolenaar" legacy func for command that's defined later
336e4db17fbSBram Moolenaarfunc InvokeSomeCommand()
337e4db17fbSBram Moolenaar  SomeCommand
338e4db17fbSBram Moolenaarendfunc
339e4db17fbSBram Moolenaar
340e4db17fbSBram Moolenaardef Test_autocommand_block()
341e4db17fbSBram Moolenaar  com SomeCommand {
342e4db17fbSBram Moolenaar      g:someVar = 'some'
343e4db17fbSBram Moolenaar    }
344e4db17fbSBram Moolenaar  InvokeSomeCommand()
345e4db17fbSBram Moolenaar  assert_equal('some', g:someVar)
346e4db17fbSBram Moolenaar
347e4db17fbSBram Moolenaar  delcommand SomeCommand
348e4db17fbSBram Moolenaar  unlet g:someVar
349e4db17fbSBram Moolenaarenddef
350e4db17fbSBram Moolenaar
351e4db17fbSBram Moolenaardef Test_command_block()
352e4db17fbSBram Moolenaar  au BufNew *.xml {
353e4db17fbSBram Moolenaar      g:otherVar = 'other'
354e4db17fbSBram Moolenaar    }
355e4db17fbSBram Moolenaar  split other.xml
356e4db17fbSBram Moolenaar  assert_equal('other', g:otherVar)
357e4db17fbSBram Moolenaar
358e4db17fbSBram Moolenaar  bwipe!
359e4db17fbSBram Moolenaar  au! BufNew *.xml
360e4db17fbSBram Moolenaar  unlet g:otherVar
361e4db17fbSBram Moolenaarenddef
362e4db17fbSBram Moolenaar
363d032f34aSBram Moolenaarfunc g:NoSuchFunc()
364d032f34aSBram Moolenaar  echo 'none'
365d032f34aSBram Moolenaarendfunc
366d032f34aSBram Moolenaar
3679e1d9e34SBram Moolenaardef Test_try_catch_throw()
368cfcd011fSBram Moolenaar  var l = []
3697a092245SBram Moolenaar  try # comment
3708a7d6542SBram Moolenaar    add(l, '1')
3718a7d6542SBram Moolenaar    throw 'wrong'
3728a7d6542SBram Moolenaar    add(l, '2')
3737a092245SBram Moolenaar  catch # comment
3748a7d6542SBram Moolenaar    add(l, v:exception)
3757a092245SBram Moolenaar  finally # comment
3768a7d6542SBram Moolenaar    add(l, '3')
3777a092245SBram Moolenaar  endtry # comment
3788a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
37968d130c6SBram Moolenaar
380e859312eSBram Moolenaar  l = []
381e859312eSBram Moolenaar  try
382e859312eSBram Moolenaar    try
383e859312eSBram Moolenaar      add(l, '1')
384e859312eSBram Moolenaar      throw 'wrong'
385e859312eSBram Moolenaar      add(l, '2')
386e859312eSBram Moolenaar    catch /right/
387e859312eSBram Moolenaar      add(l, v:exception)
388e859312eSBram Moolenaar    endtry
389e859312eSBram Moolenaar  catch /wrong/
390e859312eSBram Moolenaar    add(l, 'caught')
391373863edSBram Moolenaar  fina
392e859312eSBram Moolenaar    add(l, 'finally')
393e859312eSBram Moolenaar  endtry
394e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
395e859312eSBram Moolenaar
396cfcd011fSBram Moolenaar  var n: number
39768d130c6SBram Moolenaar  try
39868d130c6SBram Moolenaar    n = l[3]
39968d130c6SBram Moolenaar  catch /E684:/
40068d130c6SBram Moolenaar    n = 99
40168d130c6SBram Moolenaar  endtry
40268d130c6SBram Moolenaar  assert_equal(99, n)
40368d130c6SBram Moolenaar
40469f7050cSBram Moolenaar  var done = 'no'
40569f7050cSBram Moolenaar  if 0
40669f7050cSBram Moolenaar    try | catch | endtry
40769f7050cSBram Moolenaar  else
40869f7050cSBram Moolenaar    done = 'yes'
40969f7050cSBram Moolenaar  endif
41069f7050cSBram Moolenaar  assert_equal('yes', done)
41169f7050cSBram Moolenaar
41269f7050cSBram Moolenaar  done = 'no'
41369f7050cSBram Moolenaar  if 1
41469f7050cSBram Moolenaar    done = 'yes'
41569f7050cSBram Moolenaar  else
41669f7050cSBram Moolenaar    try | catch | endtry
41769f7050cSBram Moolenaar    done = 'never'
41869f7050cSBram Moolenaar  endif
41969f7050cSBram Moolenaar  assert_equal('yes', done)
42069f7050cSBram Moolenaar
42169f7050cSBram Moolenaar  if 1
42269f7050cSBram Moolenaar  else
42369f7050cSBram Moolenaar    try | catch /pat/ | endtry
42469f7050cSBram Moolenaar    try | catch /pat/
42569f7050cSBram Moolenaar    endtry
42669f7050cSBram Moolenaar    try
42769f7050cSBram Moolenaar    catch /pat/ | endtry
42869f7050cSBram Moolenaar    try
42969f7050cSBram Moolenaar    catch /pat/
43069f7050cSBram Moolenaar    endtry
43169f7050cSBram Moolenaar  endif
43269f7050cSBram Moolenaar
43368d130c6SBram Moolenaar  try
434cc673e74SBram Moolenaar    # string slice returns a string, not a number
43568d130c6SBram Moolenaar    n = g:astring[3]
4365e654230SBram Moolenaar  catch /E1012:/
43768d130c6SBram Moolenaar    n = 77
43868d130c6SBram Moolenaar  endtry
43968d130c6SBram Moolenaar  assert_equal(77, n)
44068d130c6SBram Moolenaar
44168d130c6SBram Moolenaar  try
44268d130c6SBram Moolenaar    n = l[g:astring]
4435e654230SBram Moolenaar  catch /E1012:/
44456acb094SBram Moolenaar    n = 88
44568d130c6SBram Moolenaar  endtry
44656acb094SBram Moolenaar  assert_equal(88, n)
44768d130c6SBram Moolenaar
44868d130c6SBram Moolenaar  try
44968d130c6SBram Moolenaar    n = s:does_not_exist
45068d130c6SBram Moolenaar  catch /E121:/
451f0b9f43cSBram Moolenaar    n = 111
452f0b9f43cSBram Moolenaar  endtry
453f0b9f43cSBram Moolenaar  assert_equal(111, n)
454f0b9f43cSBram Moolenaar
455f0b9f43cSBram Moolenaar  try
456f0b9f43cSBram Moolenaar    n = g:does_not_exist
457f0b9f43cSBram Moolenaar  catch /E121:/
45868d130c6SBram Moolenaar    n = 121
45968d130c6SBram Moolenaar  endtry
46068d130c6SBram Moolenaar  assert_equal(121, n)
46168d130c6SBram Moolenaar
462e0de171eSBram Moolenaar  var d = {one: 1}
46368d130c6SBram Moolenaar  try
46468d130c6SBram Moolenaar    n = d[g:astring]
46568d130c6SBram Moolenaar  catch /E716:/
46668d130c6SBram Moolenaar    n = 222
46768d130c6SBram Moolenaar  endtry
46868d130c6SBram Moolenaar  assert_equal(222, n)
469f0b9f43cSBram Moolenaar
470f0b9f43cSBram Moolenaar  try
471f0b9f43cSBram Moolenaar    n = -g:astring
472f0b9f43cSBram Moolenaar  catch /E39:/
473f0b9f43cSBram Moolenaar    n = 233
474f0b9f43cSBram Moolenaar  endtry
475f0b9f43cSBram Moolenaar  assert_equal(233, n)
476f0b9f43cSBram Moolenaar
477f0b9f43cSBram Moolenaar  try
478f0b9f43cSBram Moolenaar    n = +g:astring
479f0b9f43cSBram Moolenaar  catch /E1030:/
480f0b9f43cSBram Moolenaar    n = 244
481f0b9f43cSBram Moolenaar  endtry
482f0b9f43cSBram Moolenaar  assert_equal(244, n)
483f0b9f43cSBram Moolenaar
484f0b9f43cSBram Moolenaar  try
485f0b9f43cSBram Moolenaar    n = +g:alist
486f0b9f43cSBram Moolenaar  catch /E745:/
487f0b9f43cSBram Moolenaar    n = 255
488f0b9f43cSBram Moolenaar  endtry
489f0b9f43cSBram Moolenaar  assert_equal(255, n)
490f0b9f43cSBram Moolenaar
491cfcd011fSBram Moolenaar  var nd: dict<any>
492f0b9f43cSBram Moolenaar  try
4932e5910bfSBram Moolenaar    nd = {[g:alist]: 1}
4942e5910bfSBram Moolenaar  catch /E1105:/
495f0b9f43cSBram Moolenaar    n = 266
496f0b9f43cSBram Moolenaar  endtry
497f0b9f43cSBram Moolenaar  assert_equal(266, n)
498f0b9f43cSBram Moolenaar
499f0b9f43cSBram Moolenaar  try
500f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
501f0b9f43cSBram Moolenaar  catch /E1093:/
502f0b9f43cSBram Moolenaar    n = 277
503f0b9f43cSBram Moolenaar  endtry
504f0b9f43cSBram Moolenaar  assert_equal(277, n)
505f0b9f43cSBram Moolenaar
506e859312eSBram Moolenaar  try
507e859312eSBram Moolenaar    &ts = g:astring
5085e654230SBram Moolenaar  catch /E1012:/
509e859312eSBram Moolenaar    n = 288
510e859312eSBram Moolenaar  endtry
511e859312eSBram Moolenaar  assert_equal(288, n)
512e859312eSBram Moolenaar
513e859312eSBram Moolenaar  try
514e859312eSBram Moolenaar    &backspace = 'asdf'
515e859312eSBram Moolenaar  catch /E474:/
516e859312eSBram Moolenaar    n = 299
517e859312eSBram Moolenaar  endtry
518e859312eSBram Moolenaar  assert_equal(299, n)
519e859312eSBram Moolenaar
520e859312eSBram Moolenaar  l = [1]
521e859312eSBram Moolenaar  try
522e859312eSBram Moolenaar    l[3] = 3
523e859312eSBram Moolenaar  catch /E684:/
524e859312eSBram Moolenaar    n = 300
525e859312eSBram Moolenaar  endtry
526e859312eSBram Moolenaar  assert_equal(300, n)
527e859312eSBram Moolenaar
528e859312eSBram Moolenaar  try
529e859312eSBram Moolenaar    unlet g:does_not_exist
530e859312eSBram Moolenaar  catch /E108:/
531e859312eSBram Moolenaar    n = 322
532e859312eSBram Moolenaar  endtry
533e859312eSBram Moolenaar  assert_equal(322, n)
534e859312eSBram Moolenaar
535e859312eSBram Moolenaar  try
5362bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
537e859312eSBram Moolenaar  catch /E721:/
538e859312eSBram Moolenaar    n = 333
539e859312eSBram Moolenaar  endtry
540e859312eSBram Moolenaar  assert_equal(333, n)
541e859312eSBram Moolenaar
542e859312eSBram Moolenaar  try
543e859312eSBram Moolenaar    l = DeletedFunc()
544e859312eSBram Moolenaar  catch /E933:/
545e859312eSBram Moolenaar    n = 344
546e859312eSBram Moolenaar  endtry
547e859312eSBram Moolenaar  assert_equal(344, n)
548d032f34aSBram Moolenaar
549d032f34aSBram Moolenaar  try
550a764e73dSYegappan Lakshmanan    echo range(1, 2, 0)
551a764e73dSYegappan Lakshmanan  catch /E726:/
552d032f34aSBram Moolenaar    n = 355
553d032f34aSBram Moolenaar  endtry
554d032f34aSBram Moolenaar  assert_equal(355, n)
555d032f34aSBram Moolenaar
556cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
557d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
558d032f34aSBram Moolenaar  try
559d032f34aSBram Moolenaar    echo P()
560d032f34aSBram Moolenaar  catch /E117:/
561d032f34aSBram Moolenaar    n = 366
562d032f34aSBram Moolenaar  endtry
563d032f34aSBram Moolenaar  assert_equal(366, n)
564d032f34aSBram Moolenaar
565d032f34aSBram Moolenaar  try
566d032f34aSBram Moolenaar    echo g:NoSuchFunc()
567d032f34aSBram Moolenaar  catch /E117:/
568d032f34aSBram Moolenaar    n = 377
569d032f34aSBram Moolenaar  endtry
570d032f34aSBram Moolenaar  assert_equal(377, n)
571d032f34aSBram Moolenaar
572d032f34aSBram Moolenaar  try
573d032f34aSBram Moolenaar    echo g:alist + 4
574d032f34aSBram Moolenaar  catch /E745:/
575d032f34aSBram Moolenaar    n = 388
576d032f34aSBram Moolenaar  endtry
577d032f34aSBram Moolenaar  assert_equal(388, n)
578d032f34aSBram Moolenaar
579d032f34aSBram Moolenaar  try
580d032f34aSBram Moolenaar    echo 4 + g:alist
581d032f34aSBram Moolenaar  catch /E745:/
582d032f34aSBram Moolenaar    n = 399
583d032f34aSBram Moolenaar  endtry
584d032f34aSBram Moolenaar  assert_equal(399, n)
585d032f34aSBram Moolenaar
586d032f34aSBram Moolenaar  try
587d032f34aSBram Moolenaar    echo g:alist.member
588d032f34aSBram Moolenaar  catch /E715:/
589d032f34aSBram Moolenaar    n = 400
590d032f34aSBram Moolenaar  endtry
591d032f34aSBram Moolenaar  assert_equal(400, n)
592d032f34aSBram Moolenaar
593d032f34aSBram Moolenaar  try
594d032f34aSBram Moolenaar    echo d.member
595d032f34aSBram Moolenaar  catch /E716:/
596d032f34aSBram Moolenaar    n = 411
597d032f34aSBram Moolenaar  endtry
598d032f34aSBram Moolenaar  assert_equal(411, n)
599d9d7789bSBram Moolenaar
600d9d7789bSBram Moolenaar  var counter = 0
601d9d7789bSBram Moolenaar  for i in range(4)
602d9d7789bSBram Moolenaar    try
603d9d7789bSBram Moolenaar      eval [][0]
604d9d7789bSBram Moolenaar    catch
605d9d7789bSBram Moolenaar    endtry
606d9d7789bSBram Moolenaar    counter += 1
607d9d7789bSBram Moolenaar  endfor
608d9d7789bSBram Moolenaar  assert_equal(4, counter)
6097e82c5f3SBram Moolenaar
6109fa5dabeSBram Moolenaar  # no requirement for spaces before |
6119fa5dabeSBram Moolenaar  try|echo 0|catch|endtry
6129fa5dabeSBram Moolenaar
6137e82c5f3SBram Moolenaar  # return in finally after empty catch
6147e82c5f3SBram Moolenaar  def ReturnInFinally(): number
6157e82c5f3SBram Moolenaar    try
6167e82c5f3SBram Moolenaar    finally
6177e82c5f3SBram Moolenaar      return 4
6187e82c5f3SBram Moolenaar    endtry
6197e82c5f3SBram Moolenaar    return 2
6207e82c5f3SBram Moolenaar  enddef
6217e82c5f3SBram Moolenaar  assert_equal(4, ReturnInFinally())
6228ac681a2SBram Moolenaar
6238ac681a2SBram Moolenaar  var lines =<< trim END
6248ac681a2SBram Moolenaar      vim9script
6258ac681a2SBram Moolenaar      try
6268ac681a2SBram Moolenaar        acos('0.5')
6278ac681a2SBram Moolenaar          ->setline(1)
6288ac681a2SBram Moolenaar      catch
6298ac681a2SBram Moolenaar        g:caught = v:exception
6308ac681a2SBram Moolenaar      endtry
6318ac681a2SBram Moolenaar  END
6328ac681a2SBram Moolenaar  CheckScriptSuccess(lines)
6334490ec4eSYegappan Lakshmanan  assert_match('E1219: Float or Number required for argument 1', g:caught)
6348ac681a2SBram Moolenaar  unlet g:caught
6354197828dSBram Moolenaar
6364197828dSBram Moolenaar  # missing catch and/or finally
6374197828dSBram Moolenaar  lines =<< trim END
6384197828dSBram Moolenaar      vim9script
6394197828dSBram Moolenaar      try
6404197828dSBram Moolenaar        echo 'something'
6414197828dSBram Moolenaar      endtry
6424197828dSBram Moolenaar  END
6434197828dSBram Moolenaar  CheckScriptFailure(lines, 'E1032:')
6448a7d6542SBram Moolenaarenddef
6458a7d6542SBram Moolenaar
6463f987b59SBram Moolenaardef Test_try_in_catch()
6473f987b59SBram Moolenaar  var lines =<< trim END
6483f987b59SBram Moolenaar      vim9script
6493f987b59SBram Moolenaar      var seq = []
6503f987b59SBram Moolenaar      def DoIt()
6513f987b59SBram Moolenaar        try
6523f987b59SBram Moolenaar          seq->add('throw 1')
6533f987b59SBram Moolenaar          eval [][0]
6543f987b59SBram Moolenaar          seq->add('notreached')
6553f987b59SBram Moolenaar        catch
6563f987b59SBram Moolenaar          seq->add('catch')
6573f987b59SBram Moolenaar          try
6583f987b59SBram Moolenaar            seq->add('throw 2')
6593f987b59SBram Moolenaar            eval [][0]
6603f987b59SBram Moolenaar            seq->add('notreached')
6613f987b59SBram Moolenaar          catch /nothing/
6623f987b59SBram Moolenaar            seq->add('notreached')
6633f987b59SBram Moolenaar          endtry
6643f987b59SBram Moolenaar          seq->add('done')
6653f987b59SBram Moolenaar        endtry
6663f987b59SBram Moolenaar      enddef
6673f987b59SBram Moolenaar      DoIt()
6683f987b59SBram Moolenaar      assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
6693f987b59SBram Moolenaar  END
6703f987b59SBram Moolenaarenddef
6713f987b59SBram Moolenaar
672d3d8feebSBram Moolenaardef Test_error_in_catch()
673d3d8feebSBram Moolenaar  var lines =<< trim END
674d3d8feebSBram Moolenaar      try
675d3d8feebSBram Moolenaar        eval [][0]
676d3d8feebSBram Moolenaar      catch /E684:/
677d3d8feebSBram Moolenaar        eval [][0]
678d3d8feebSBram Moolenaar      endtry
679d3d8feebSBram Moolenaar  END
680d3d8feebSBram Moolenaar  CheckDefExecFailure(lines, 'E684:', 4)
681d3d8feebSBram Moolenaarenddef
682d3d8feebSBram Moolenaar
6832e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to
6842e34c34bSBram Moolenaardef TryContinueFunc()
6852e34c34bSBram Moolenaar while g:Count < 2
6862e34c34bSBram Moolenaar   g:sequence ..= 't'
6872e34c34bSBram Moolenaar    try
6882e34c34bSBram Moolenaar      echoerr 'Test'
6892e34c34bSBram Moolenaar    catch
6902e34c34bSBram Moolenaar      g:Count += 1
6912e34c34bSBram Moolenaar      g:sequence ..= 'c'
6922e34c34bSBram Moolenaar      continue
6932e34c34bSBram Moolenaar    endtry
6942e34c34bSBram Moolenaar    g:sequence ..= 'e'
6952e34c34bSBram Moolenaar    g:Count += 1
6962e34c34bSBram Moolenaar  endwhile
6972e34c34bSBram Moolenaarenddef
6982e34c34bSBram Moolenaar
6992e34c34bSBram Moolenaardef Test_continue_in_try_in_while()
7002e34c34bSBram Moolenaar  g:Count = 0
7012e34c34bSBram Moolenaar  g:sequence = ''
7022e34c34bSBram Moolenaar  TryContinueFunc()
7032e34c34bSBram Moolenaar  assert_equal('tctc', g:sequence)
7042e34c34bSBram Moolenaar  unlet g:Count
7052e34c34bSBram Moolenaar  unlet g:sequence
7062e34c34bSBram Moolenaarenddef
7072e34c34bSBram Moolenaar
7089cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
7099cb577a6SBram Moolenaar  # return in try block returns normally
7109cb577a6SBram Moolenaar  def ReturnInTry(): string
7119cb577a6SBram Moolenaar    try
7129cb577a6SBram Moolenaar      return '"some message"'
7139cb577a6SBram Moolenaar    catch
7149cb577a6SBram Moolenaar    endtry
7159cb577a6SBram Moolenaar    return 'not reached'
7169cb577a6SBram Moolenaar  enddef
7179cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
7189cb577a6SBram Moolenaarenddef
7199cb577a6SBram Moolenaar
7201430ceebSBram Moolenaardef Test_cnext_works_in_catch()
7211430ceebSBram Moolenaar  var lines =<< trim END
7221430ceebSBram Moolenaar      vim9script
723c323527dSBram Moolenaar      au BufEnter * eval 1 + 2
7241430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
7251430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
7261430ceebSBram Moolenaar      var items = [
7271430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
7281430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
7291430ceebSBram Moolenaar        ]
7301430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
7311430ceebSBram Moolenaar      cwindow
7321430ceebSBram Moolenaar
7331430ceebSBram Moolenaar      def CnextOrCfirst()
7341430ceebSBram Moolenaar        # if cnext fails, cfirst is used
7351430ceebSBram Moolenaar        try
7361430ceebSBram Moolenaar          cnext
7371430ceebSBram Moolenaar        catch
7381430ceebSBram Moolenaar          cfirst
7391430ceebSBram Moolenaar        endtry
7401430ceebSBram Moolenaar      enddef
7411430ceebSBram Moolenaar
7421430ceebSBram Moolenaar      CnextOrCfirst()
7431430ceebSBram Moolenaar      CnextOrCfirst()
7441430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
7451430ceebSBram Moolenaar      qall
7461430ceebSBram Moolenaar  END
7471430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
7481430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
7491430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
7501430ceebSBram Moolenaar
7511430ceebSBram Moolenaar  delete('Xfile1')
7521430ceebSBram Moolenaar  delete('Xfile2')
7531430ceebSBram Moolenaar  delete('XCatchCnext')
7541430ceebSBram Moolenaar  delete('Xresult')
7551430ceebSBram Moolenaarenddef
7561430ceebSBram Moolenaar
7579e1d9e34SBram Moolenaardef Test_throw_skipped()
7589e1d9e34SBram Moolenaar  if 0
7599e1d9e34SBram Moolenaar    throw dontgethere
7609e1d9e34SBram Moolenaar  endif
7619e1d9e34SBram Moolenaarenddef
7629e1d9e34SBram Moolenaar
7638f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
7648f81b22eSBram Moolenaar  var lines =<< trim END
7658f81b22eSBram Moolenaar    vim9script
7668f81b22eSBram Moolenaar    def Func()
7678f81b22eSBram Moolenaar      throw 'error'
7688f81b22eSBram Moolenaar    enddef
7698f81b22eSBram Moolenaar    silent! Func()
7708f81b22eSBram Moolenaar  END
7718f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
7728f81b22eSBram Moolenaar  source XthrowSilenced
7738f81b22eSBram Moolenaar  delete('XthrowSilenced')
7748f81b22eSBram Moolenaarenddef
7758f81b22eSBram Moolenaar
776e859312eSBram Moolenaardef DeletedFunc(): list<any>
777e859312eSBram Moolenaar  return ['delete me']
778e859312eSBram Moolenaarenddef
779e859312eSBram Moolenaardefcompile
780e859312eSBram Moolenaardelfunc DeletedFunc
781e859312eSBram Moolenaar
782257cc5eeSBram Moolenaardef ThrowFromDef()
783a72cfb80SBram Moolenaar  throw "getout" # comment
784257cc5eeSBram Moolenaarenddef
785257cc5eeSBram Moolenaar
786257cc5eeSBram Moolenaarfunc CatchInFunc()
787257cc5eeSBram Moolenaar  try
788257cc5eeSBram Moolenaar    call ThrowFromDef()
789257cc5eeSBram Moolenaar  catch
790257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
791257cc5eeSBram Moolenaar  endtry
792257cc5eeSBram Moolenaarendfunc
793257cc5eeSBram Moolenaar
794257cc5eeSBram Moolenaardef CatchInDef()
795257cc5eeSBram Moolenaar  try
796257cc5eeSBram Moolenaar    ThrowFromDef()
797257cc5eeSBram Moolenaar  catch
798257cc5eeSBram Moolenaar    g:thrown_def = v:exception
799257cc5eeSBram Moolenaar  endtry
800257cc5eeSBram Moolenaarenddef
801257cc5eeSBram Moolenaar
802f575adffSBram Moolenaardef ReturnFinally(): string
803f575adffSBram Moolenaar  try
804f575adffSBram Moolenaar    return 'intry'
805373863edSBram Moolenaar  finall
806f575adffSBram Moolenaar    g:in_finally = 'finally'
807f575adffSBram Moolenaar  endtry
808f575adffSBram Moolenaar  return 'end'
809f575adffSBram Moolenaarenddef
810f575adffSBram Moolenaar
811257cc5eeSBram Moolenaardef Test_try_catch_nested()
812257cc5eeSBram Moolenaar  CatchInFunc()
813257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
814257cc5eeSBram Moolenaar
815257cc5eeSBram Moolenaar  CatchInDef()
816257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
817f575adffSBram Moolenaar
818f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
819f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
820d3d8feebSBram Moolenaar
821d3d8feebSBram Moolenaar  var l = []
822d3d8feebSBram Moolenaar  try
823d3d8feebSBram Moolenaar    l->add('1')
824d3d8feebSBram Moolenaar    throw 'bad'
825d3d8feebSBram Moolenaar    l->add('x')
826d3d8feebSBram Moolenaar  catch /bad/
827d3d8feebSBram Moolenaar    l->add('2')
828d3d8feebSBram Moolenaar    try
829d3d8feebSBram Moolenaar      l->add('3')
830d3d8feebSBram Moolenaar      throw 'one'
831d3d8feebSBram Moolenaar      l->add('x')
832d3d8feebSBram Moolenaar    catch /one/
833d3d8feebSBram Moolenaar      l->add('4')
834d3d8feebSBram Moolenaar      try
835d3d8feebSBram Moolenaar        l->add('5')
836d3d8feebSBram Moolenaar        throw 'more'
837d3d8feebSBram Moolenaar        l->add('x')
838d3d8feebSBram Moolenaar      catch /more/
839d3d8feebSBram Moolenaar        l->add('6')
840d3d8feebSBram Moolenaar      endtry
841d3d8feebSBram Moolenaar    endtry
842d3d8feebSBram Moolenaar  endtry
843d3d8feebSBram Moolenaar  assert_equal(['1', '2', '3', '4', '5', '6'], l)
844834193afSBram Moolenaar
845834193afSBram Moolenaar  l = []
846834193afSBram Moolenaar  try
847834193afSBram Moolenaar    try
848834193afSBram Moolenaar      l->add('1')
849834193afSBram Moolenaar      throw 'foo'
850834193afSBram Moolenaar      l->add('x')
851834193afSBram Moolenaar    catch
852834193afSBram Moolenaar      l->add('2')
853834193afSBram Moolenaar      throw 'bar'
854834193afSBram Moolenaar      l->add('x')
855834193afSBram Moolenaar    finally
856834193afSBram Moolenaar      l->add('3')
857834193afSBram Moolenaar    endtry
858834193afSBram Moolenaar    l->add('x')
859834193afSBram Moolenaar  catch /bar/
860834193afSBram Moolenaar    l->add('4')
861834193afSBram Moolenaar  endtry
862834193afSBram Moolenaar  assert_equal(['1', '2', '3', '4'], l)
863f575adffSBram Moolenaarenddef
864f575adffSBram Moolenaar
8659939f57bSBram Moolenaardef TryOne(): number
8669939f57bSBram Moolenaar  try
8679939f57bSBram Moolenaar    return 0
8689939f57bSBram Moolenaar  catch
8699939f57bSBram Moolenaar  endtry
8709939f57bSBram Moolenaar  return 0
8719939f57bSBram Moolenaarenddef
8729939f57bSBram Moolenaar
8739939f57bSBram Moolenaardef TryTwo(n: number): string
8749939f57bSBram Moolenaar  try
875cfcd011fSBram Moolenaar    var x = {}
8769939f57bSBram Moolenaar  catch
8779939f57bSBram Moolenaar  endtry
8789939f57bSBram Moolenaar  return 'text'
8799939f57bSBram Moolenaarenddef
8809939f57bSBram Moolenaar
8819939f57bSBram Moolenaardef Test_try_catch_twice()
8829939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
8839939f57bSBram Moolenaarenddef
8849939f57bSBram Moolenaar
885f575adffSBram Moolenaardef Test_try_catch_match()
886cfcd011fSBram Moolenaar  var seq = 'a'
887f575adffSBram Moolenaar  try
888f575adffSBram Moolenaar    throw 'something'
889f575adffSBram Moolenaar  catch /nothing/
890f575adffSBram Moolenaar    seq ..= 'x'
891f575adffSBram Moolenaar  catch /some/
892f575adffSBram Moolenaar    seq ..= 'b'
893f575adffSBram Moolenaar  catch /asdf/
894f575adffSBram Moolenaar    seq ..= 'x'
895e8c4abbbSBram Moolenaar  catch ?a\?sdf?
896e8c4abbbSBram Moolenaar    seq ..= 'y'
897f575adffSBram Moolenaar  finally
898f575adffSBram Moolenaar    seq ..= 'c'
899f575adffSBram Moolenaar  endtry
900f575adffSBram Moolenaar  assert_equal('abc', seq)
901257cc5eeSBram Moolenaarenddef
902257cc5eeSBram Moolenaar
903e8c4abbbSBram Moolenaardef Test_try_catch_fails()
904d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
905d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
906d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
907d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
908d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
909d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
910d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
911d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
91213106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
913d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
914585fea7bSBram Moolenaar
915e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
916d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
917e8c4abbbSBram Moolenaarenddef
918e8c4abbbSBram Moolenaar
9197c5b3c03SBram Moolenaardef Try_catch_skipped()
9207c5b3c03SBram Moolenaar  var l = []
9217c5b3c03SBram Moolenaar  try
9227c5b3c03SBram Moolenaar  finally
9237c5b3c03SBram Moolenaar  endtry
9247c5b3c03SBram Moolenaar
9257c5b3c03SBram Moolenaar  if 1
9267c5b3c03SBram Moolenaar  else
9277c5b3c03SBram Moolenaar    try
9287c5b3c03SBram Moolenaar    endtry
9297c5b3c03SBram Moolenaar  endif
9307c5b3c03SBram Moolenaarenddef
9317c5b3c03SBram Moolenaar
9327c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
9337c5b3c03SBram Moolenaardef Test_try_catch_skipped()
9347c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
9357c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
9367c5b3c03SBram Moolenaarenddef
9377c5b3c03SBram Moolenaar
9387c5b3c03SBram Moolenaar
9397c5b3c03SBram Moolenaar
940006ad48bSBram Moolenaardef Test_throw_vimscript()
941f5be8cdbSBram Moolenaar  # only checks line continuation
942cfcd011fSBram Moolenaar  var lines =<< trim END
943006ad48bSBram Moolenaar      vim9script
944006ad48bSBram Moolenaar      try
945006ad48bSBram Moolenaar        throw 'one'
946006ad48bSBram Moolenaar              .. 'two'
947006ad48bSBram Moolenaar      catch
948006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
949006ad48bSBram Moolenaar      endtry
950006ad48bSBram Moolenaar  END
951006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
9521e021e63SBram Moolenaar
9531e021e63SBram Moolenaar  lines =<< trim END
9541e021e63SBram Moolenaar    vim9script
955352134bbSBram Moolenaar    @r = ''
9561e021e63SBram Moolenaar    def Func()
9571e021e63SBram Moolenaar      throw @r
9581e021e63SBram Moolenaar    enddef
9591e021e63SBram Moolenaar    var result = ''
9601e021e63SBram Moolenaar    try
9611e021e63SBram Moolenaar      Func()
9621e021e63SBram Moolenaar    catch /E1129:/
9631e021e63SBram Moolenaar      result = 'caught'
9641e021e63SBram Moolenaar    endtry
9651e021e63SBram Moolenaar    assert_equal('caught', result)
9661e021e63SBram Moolenaar  END
9671e021e63SBram Moolenaar  CheckScriptSuccess(lines)
968006ad48bSBram Moolenaarenddef
969006ad48bSBram Moolenaar
970ed677f55SBram Moolenaardef Test_error_in_nested_function()
97103dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
972cfcd011fSBram Moolenaar  var lines =<< trim END
973ed677f55SBram Moolenaar      vim9script
974ed677f55SBram Moolenaar      def Func()
975ed677f55SBram Moolenaar        Error()
976ed677f55SBram Moolenaar        g:test_var = 1
977ed677f55SBram Moolenaar      enddef
978ed677f55SBram Moolenaar      func Error() abort
979ed677f55SBram Moolenaar        eval [][0]
980ed677f55SBram Moolenaar      endfunc
981ed677f55SBram Moolenaar      Func()
982ed677f55SBram Moolenaar  END
983ed677f55SBram Moolenaar  g:test_var = 0
984ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
985ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
986ed677f55SBram Moolenaarenddef
987ed677f55SBram Moolenaar
988227c58a4SBram Moolenaardef Test_abort_after_error()
989227c58a4SBram Moolenaar  var lines =<< trim END
990227c58a4SBram Moolenaar      vim9script
991227c58a4SBram Moolenaar      while true
992227c58a4SBram Moolenaar        echo notfound
993227c58a4SBram Moolenaar      endwhile
994227c58a4SBram Moolenaar      g:gotthere = true
995227c58a4SBram Moolenaar  END
996227c58a4SBram Moolenaar  g:gotthere = false
997227c58a4SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
998227c58a4SBram Moolenaar  assert_false(g:gotthere)
999227c58a4SBram Moolenaar  unlet g:gotthere
1000227c58a4SBram Moolenaarenddef
1001227c58a4SBram Moolenaar
100237c83711SBram Moolenaardef Test_cexpr_vimscript()
1003f5be8cdbSBram Moolenaar  # only checks line continuation
100437c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
1005cfcd011fSBram Moolenaar  var lines =<< trim END
100637c83711SBram Moolenaar      vim9script
100737c83711SBram Moolenaar      cexpr 'File'
100837c83711SBram Moolenaar                .. ' someFile' ..
100937c83711SBram Moolenaar                   ' line 19'
101037c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
101137c83711SBram Moolenaar  END
101237c83711SBram Moolenaar  CheckScriptSuccess(lines)
101337c83711SBram Moolenaar  set errorformat&
101437c83711SBram Moolenaarenddef
101537c83711SBram Moolenaar
1016c9edd6b5SBram Moolenaardef Test_statusline_syntax()
1017c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
1018cfcd011fSBram Moolenaar  var lines =<< trim END
1019c9edd6b5SBram Moolenaar      vim9script
1020c9edd6b5SBram Moolenaar      func g:Status()
1021c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
1022c9edd6b5SBram Moolenaar      endfunc
1023c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
1024c9edd6b5SBram Moolenaar      redrawstatus
1025c9edd6b5SBram Moolenaar      set laststatus statusline=
1026c9edd6b5SBram Moolenaar  END
1027c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1028c9edd6b5SBram Moolenaarenddef
1029c9edd6b5SBram Moolenaar
1030b209750bSBram Moolenaardef Test_list_vimscript()
1031b209750bSBram Moolenaar  # checks line continuation and comments
1032cfcd011fSBram Moolenaar  var lines =<< trim END
1033b209750bSBram Moolenaar      vim9script
1034cfcd011fSBram Moolenaar      var mylist = [
1035b209750bSBram Moolenaar            'one',
1036b209750bSBram Moolenaar            # comment
1037b209750bSBram Moolenaar            'two', # empty line follows
1038b209750bSBram Moolenaar
1039b209750bSBram Moolenaar            'three',
1040b209750bSBram Moolenaar            ]
1041b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1042b209750bSBram Moolenaar  END
1043b209750bSBram Moolenaar  CheckScriptSuccess(lines)
104466250c93SBram Moolenaar
104566250c93SBram Moolenaar  # check all lines from heredoc are kept
104666250c93SBram Moolenaar  lines =<< trim END
104766250c93SBram Moolenaar      # comment 1
104866250c93SBram Moolenaar      two
104966250c93SBram Moolenaar      # comment 3
105066250c93SBram Moolenaar
105166250c93SBram Moolenaar      five
105266250c93SBram Moolenaar      # comment 6
105366250c93SBram Moolenaar  END
105466250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
10554bce26bbSBram Moolenaar
10564bce26bbSBram Moolenaar  lines =<< trim END
10574bce26bbSBram Moolenaar    [{
10584bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
10594bce26bbSBram Moolenaar  END
10604bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1061b209750bSBram Moolenaarenddef
1062b209750bSBram Moolenaar
10632a1381c3SBram Moolenaarif has('channel')
106440ee466cSBram Moolenaar  let someJob = test_null_job()
106540ee466cSBram Moolenaar
106640ee466cSBram Moolenaar  def FuncWithError()
106740ee466cSBram Moolenaar    echomsg g:someJob
106840ee466cSBram Moolenaar  enddef
106940ee466cSBram Moolenaar
107040ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
107140ee466cSBram Moolenaar    try
107240ee466cSBram Moolenaar      call FuncWithError()
107340ee466cSBram Moolenaar    catch
107440ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
107540ee466cSBram Moolenaar    endtry
107640ee466cSBram Moolenaar  endfunc
10772a1381c3SBram Moolenaarendif
107840ee466cSBram Moolenaar
10798a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
10808a7d6542SBram Moolenaar  vim9script
1081cfcd011fSBram Moolenaar  var name: string = 'bob'
10828a7d6542SBram Moolenaar  def Concat(arg: string): string
10838a7d6542SBram Moolenaar    return name .. arg
10848a7d6542SBram Moolenaar  enddef
1085227a69deSBram Moolenaar  g:result = Concat('bie')
1086227a69deSBram Moolenaar  g:localname = name
10878a7d6542SBram Moolenaar
10888a7d6542SBram Moolenaar  export const CONST = 1234
1089cfcd011fSBram Moolenaar  export var exported = 9876
1090cfcd011fSBram Moolenaar  export var exp_name = 'John'
10918a7d6542SBram Moolenaar  export def Exported(): string
10928a7d6542SBram Moolenaar    return 'Exported'
10938a7d6542SBram Moolenaar  enddef
109424e93165SBram Moolenaar  export def ExportedValue(): number
109524e93165SBram Moolenaar    return exported
109624e93165SBram Moolenaar  enddef
109724e93165SBram Moolenaar  export def ExportedInc()
109824e93165SBram Moolenaar    exported += 5
109924e93165SBram Moolenaar  enddef
11000f2a5cc6SBram Moolenaar  export final theList = [1]
11018a7d6542SBram MoolenaarEND
11028a7d6542SBram Moolenaar
1103b3ca9824SBram Moolenaardef Undo_export_script_lines()
1104b3ca9824SBram Moolenaar  unlet g:result
1105b3ca9824SBram Moolenaar  unlet g:localname
1106b3ca9824SBram Moolenaarenddef
1107b3ca9824SBram Moolenaar
11085269bd2aSBram Moolenaardef Test_vim9_import_export()
1109cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
11108a7d6542SBram Moolenaar    vim9script
111124e93165SBram Moolenaar    import {exported, Exported, ExportedValue} from './Xexport.vim'
111224e93165SBram Moolenaar    g:exported1 = exported
11136e587dcbSBram Moolenaar    exported += 3
111424e93165SBram Moolenaar    g:exported2 = exported
111524e93165SBram Moolenaar    g:exported3 = ExportedValue()
111624e93165SBram Moolenaar
111724e93165SBram Moolenaar    import ExportedInc from './Xexport.vim'
111824e93165SBram Moolenaar    ExportedInc()
111924e93165SBram Moolenaar    g:exported_i1 = exported
112024e93165SBram Moolenaar    g:exported_i2 = ExportedValue()
112124e93165SBram Moolenaar
112224e93165SBram Moolenaar    exported = 11
112324e93165SBram Moolenaar    g:exported_s1 = exported
112424e93165SBram Moolenaar    g:exported_s2 = ExportedValue()
112524e93165SBram Moolenaar
11268a7d6542SBram Moolenaar    g:imported_func = Exported()
11276e587dcbSBram Moolenaar
112840f4f7a4SBram Moolenaar    def GetExported(): string
1129e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
113040f4f7a4SBram Moolenaar      return local_dict.ref()
113140f4f7a4SBram Moolenaar    enddef
113240f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
113340f4f7a4SBram Moolenaar
11344db572eeSBram Moolenaar    var dir = './'
11354db572eeSBram Moolenaar    var ext = ".vim"
11364db572eeSBram Moolenaar    import {exp_name} from dir .. 'Xexport' .. ext
11376e587dcbSBram Moolenaar    g:imported_name = exp_name
11386e587dcbSBram Moolenaar    exp_name ..= ' Doe'
11396e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
114024e93165SBram Moolenaar    g:exported_later = exported
11410f2a5cc6SBram Moolenaar
11420f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
11430f2a5cc6SBram Moolenaar    theList->add(2)
11440f2a5cc6SBram Moolenaar    assert_equal([1, 2], theList)
11458a7d6542SBram Moolenaar  END
11468a7d6542SBram Moolenaar
11478a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
11488a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
11498a7d6542SBram Moolenaar
11508a7d6542SBram Moolenaar  source Ximport.vim
11518a7d6542SBram Moolenaar
11528a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
11538a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
115424e93165SBram Moolenaar  assert_equal(9876, g:exported1)
115524e93165SBram Moolenaar  assert_equal(9879, g:exported2)
115624e93165SBram Moolenaar  assert_equal(9879, g:exported3)
115724e93165SBram Moolenaar
115824e93165SBram Moolenaar  assert_equal(9884, g:exported_i1)
115924e93165SBram Moolenaar  assert_equal(9884, g:exported_i2)
116024e93165SBram Moolenaar
116124e93165SBram Moolenaar  assert_equal(11, g:exported_s1)
116224e93165SBram Moolenaar  assert_equal(11, g:exported_s2)
116324e93165SBram Moolenaar  assert_equal(11, g:exported_later)
116424e93165SBram Moolenaar
11658a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
116640f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
11676e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
11686e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
11698a7d6542SBram Moolenaar  assert_false(exists('g:name'))
11708a7d6542SBram Moolenaar
1171b3ca9824SBram Moolenaar  Undo_export_script_lines()
117224e93165SBram Moolenaar  unlet g:exported1
117324e93165SBram Moolenaar  unlet g:exported2
117424e93165SBram Moolenaar  unlet g:exported3
117524e93165SBram Moolenaar  unlet g:exported_i1
117624e93165SBram Moolenaar  unlet g:exported_i2
117724e93165SBram Moolenaar  unlet g:exported_later
11788a7d6542SBram Moolenaar  unlet g:imported_func
11796e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
11808a7d6542SBram Moolenaar  delete('Ximport.vim')
1181f2d5c240SBram Moolenaar
11821c991144SBram Moolenaar  # similar, with line breaks
1183cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
11841c991144SBram Moolenaar    vim9script
11851c991144SBram Moolenaar    import {
11861c991144SBram Moolenaar        exported,
11871c991144SBram Moolenaar        Exported,
11881c991144SBram Moolenaar        }
11891c991144SBram Moolenaar        from
11901c991144SBram Moolenaar        './Xexport.vim'
119124e93165SBram Moolenaar    g:exported = exported
119224e93165SBram Moolenaar    exported += 7
119324e93165SBram Moolenaar    g:exported_added = exported
11941c991144SBram Moolenaar    g:imported_func = Exported()
11951c991144SBram Moolenaar  END
11961c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
11971c991144SBram Moolenaar  source Ximport_lbr.vim
11981c991144SBram Moolenaar
119924e93165SBram Moolenaar  assert_equal(11, g:exported)
120024e93165SBram Moolenaar  assert_equal(18, g:exported_added)
12011c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
12021c991144SBram Moolenaar
12031c991144SBram Moolenaar  # exported script not sourced again
12041c991144SBram Moolenaar  assert_false(exists('g:result'))
120524e93165SBram Moolenaar  unlet g:exported
120624e93165SBram Moolenaar  unlet g:exported_added
12071c991144SBram Moolenaar  unlet g:imported_func
12081c991144SBram Moolenaar  delete('Ximport_lbr.vim')
12091c991144SBram Moolenaar
1210cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1211f2d5c240SBram Moolenaar    vim9script
1212f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1213f2d5c240SBram Moolenaar    def UseExport()
121424e93165SBram Moolenaar      g:exported_def = Export.exported
1215f2d5c240SBram Moolenaar    enddef
121624e93165SBram Moolenaar    g:exported_script = Export.exported
1217cb4e80faSBram Moolenaar    assert_equal(1, exists('Export.exported'))
1218cb4e80faSBram Moolenaar    assert_equal(0, exists('Export.notexported'))
1219f2d5c240SBram Moolenaar    UseExport()
1220f2d5c240SBram Moolenaar  END
1221f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1222f2d5c240SBram Moolenaar  source Ximport.vim
122324e93165SBram Moolenaar
122424e93165SBram Moolenaar  assert_equal(18, g:exported_def)
122524e93165SBram Moolenaar  assert_equal(18, g:exported_script)
122624e93165SBram Moolenaar  unlet g:exported_def
122724e93165SBram Moolenaar  unlet g:exported_script
1228f2d5c240SBram Moolenaar
1229cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1230599c89c8SBram Moolenaar    vim9script
1231599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1232599c89c8SBram Moolenaar    def Func()
1233cfcd011fSBram Moolenaar      var dummy = 1
1234cfcd011fSBram Moolenaar      var imported = Export + dummy
1235599c89c8SBram Moolenaar    enddef
1236822ba247SBram Moolenaar    defcompile
1237599c89c8SBram Moolenaar  END
1238599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
123944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1240599c89c8SBram Moolenaar
1241cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1242599c89c8SBram Moolenaar    vim9script
1243599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1244599c89c8SBram Moolenaar    def Func()
1245cfcd011fSBram Moolenaar      var imported = Export . exported
1246599c89c8SBram Moolenaar    enddef
1247822ba247SBram Moolenaar    defcompile
1248599c89c8SBram Moolenaar  END
1249599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
125044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1251599c89c8SBram Moolenaar
1252921ba529SBram Moolenaar  var import_func_duplicated =<< trim END
1253921ba529SBram Moolenaar    vim9script
1254921ba529SBram Moolenaar    import ExportedInc from './Xexport.vim'
1255921ba529SBram Moolenaar    import ExportedInc from './Xexport.vim'
1256921ba529SBram Moolenaar
1257921ba529SBram Moolenaar    ExportedInc()
1258921ba529SBram Moolenaar  END
1259921ba529SBram Moolenaar  writefile(import_func_duplicated, 'Ximport.vim')
1260921ba529SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
1261921ba529SBram Moolenaar
1262a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1263a6294955SBram Moolenaar    vim9script
1264a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1265a6294955SBram Moolenaar    var some = 'other'
1266a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1267a6294955SBram Moolenaar    defcompile
1268a6294955SBram Moolenaar  END
1269a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1270a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1271a6294955SBram Moolenaar
1272cb4e80faSBram Moolenaar  var import_star_as_lines_script_no_dot =<< trim END
1273cb4e80faSBram Moolenaar    vim9script
1274cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1275cb4e80faSBram Moolenaar    g:imported_script = Export exported
1276cb4e80faSBram Moolenaar  END
1277cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
1278cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1029:')
1279cb4e80faSBram Moolenaar
1280cb4e80faSBram Moolenaar  var import_star_as_lines_script_space_after_dot =<< trim END
1281cb4e80faSBram Moolenaar    vim9script
1282cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1283cb4e80faSBram Moolenaar    g:imported_script = Export. exported
1284cb4e80faSBram Moolenaar  END
1285cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1286cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1287cb4e80faSBram Moolenaar
1288cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1289599c89c8SBram Moolenaar    vim9script
1290599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1291599c89c8SBram Moolenaar    def Func()
1292cfcd011fSBram Moolenaar      var imported = Export.
1293599c89c8SBram Moolenaar    enddef
1294822ba247SBram Moolenaar    defcompile
1295599c89c8SBram Moolenaar  END
1296599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
129744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1298599c89c8SBram Moolenaar
1299cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
13001c991144SBram Moolenaar    vim9script
13011c991144SBram Moolenaar    import *
13021c991144SBram Moolenaar        as Export
13031c991144SBram Moolenaar        from
13041c991144SBram Moolenaar        './Xexport.vim'
13051c991144SBram Moolenaar    def UseExport()
130624e93165SBram Moolenaar      g:exported = Export.exported
13071c991144SBram Moolenaar    enddef
13081c991144SBram Moolenaar    UseExport()
13091c991144SBram Moolenaar  END
13101c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
13111c991144SBram Moolenaar  source Ximport.vim
131224e93165SBram Moolenaar  assert_equal(18, g:exported)
131324e93165SBram Moolenaar  unlet g:exported
13141c991144SBram Moolenaar
1315cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1316f2d5c240SBram Moolenaar    vim9script
1317f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1318f2d5c240SBram Moolenaar  END
1319f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
132044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1321f2d5c240SBram Moolenaar
1322f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1323cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1324fa29c8abSBram Moolenaar    vim9script
1325fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1326fa29c8abSBram Moolenaar  END
1327fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
132844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1329fa29c8abSBram Moolenaar
1330f5be8cdbSBram Moolenaar  # try to import something that is already defined
1331cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
13325269bd2aSBram Moolenaar    vim9script
1333cfcd011fSBram Moolenaar    var exported = 'something'
13345269bd2aSBram Moolenaar    import exported from './Xexport.vim'
13355269bd2aSBram Moolenaar  END
13365269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1337057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13385269bd2aSBram Moolenaar
1339f5be8cdbSBram Moolenaar  # try to import something that is already defined
13405269bd2aSBram Moolenaar  import_already_defined =<< trim END
13415269bd2aSBram Moolenaar    vim9script
1342cfcd011fSBram Moolenaar    var exported = 'something'
13435269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
13445269bd2aSBram Moolenaar  END
13455269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1346057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13475269bd2aSBram Moolenaar
1348f5be8cdbSBram Moolenaar  # try to import something that is already defined
13495269bd2aSBram Moolenaar  import_already_defined =<< trim END
13505269bd2aSBram Moolenaar    vim9script
1351cfcd011fSBram Moolenaar    var exported = 'something'
13525269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
13535269bd2aSBram Moolenaar  END
13545269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1355057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13565269bd2aSBram Moolenaar
1357918a4249SBram Moolenaar  # try changing an imported const
1358918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1359918a4249SBram Moolenaar    vim9script
1360918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1361918a4249SBram Moolenaar    def Assign()
1362918a4249SBram Moolenaar      CONST = 987
1363918a4249SBram Moolenaar    enddef
1364918a4249SBram Moolenaar    defcompile
1365918a4249SBram Moolenaar  END
1366918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1367918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1368918a4249SBram Moolenaar
13690f2a5cc6SBram Moolenaar  # try changing an imported final
13700f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
13710f2a5cc6SBram Moolenaar    vim9script
13720f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
13730f2a5cc6SBram Moolenaar    def Assign()
13740f2a5cc6SBram Moolenaar      theList = [2]
13750f2a5cc6SBram Moolenaar    enddef
13760f2a5cc6SBram Moolenaar    defcompile
13770f2a5cc6SBram Moolenaar  END
13780f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
13790f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
13800f2a5cc6SBram Moolenaar
1381f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1382cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1383fa29c8abSBram Moolenaar    vim9script
1384fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1385fa29c8abSBram Moolenaar  END
1386fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
138744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1388fa29c8abSBram Moolenaar
1389cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1390fa29c8abSBram Moolenaar    vim9script
1391fa29c8abSBram Moolenaar    import name './Xexport.vim'
1392fa29c8abSBram Moolenaar  END
1393fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
139444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1395fa29c8abSBram Moolenaar
1396cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1397fa29c8abSBram Moolenaar    vim9script
1398fa29c8abSBram Moolenaar    import name from Xexport.vim
1399fa29c8abSBram Moolenaar  END
1400fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
14014db572eeSBram Moolenaar  assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim')
1402fa29c8abSBram Moolenaar
1403cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1404fa29c8abSBram Moolenaar    vim9script
1405fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1406fa29c8abSBram Moolenaar  END
1407fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
140844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1409fa29c8abSBram Moolenaar
1410cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1411fa29c8abSBram Moolenaar    vim9script
1412fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1413fa29c8abSBram Moolenaar  END
14145269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
141544d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1416fa29c8abSBram Moolenaar
141760579350SBram Moolenaar  var import_redefining_lines =<< trim END
141860579350SBram Moolenaar    vim9script
141960579350SBram Moolenaar    import exported from './Xexport.vim'
142060579350SBram Moolenaar    var exported = 5
142160579350SBram Moolenaar  END
142260579350SBram Moolenaar  writefile(import_redefining_lines, 'Ximport.vim')
142360579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3)
142460579350SBram Moolenaar
142560579350SBram Moolenaar  var import_assign_wrong_type_lines =<< trim END
142660579350SBram Moolenaar    vim9script
142760579350SBram Moolenaar    import exported from './Xexport.vim'
142860579350SBram Moolenaar    exported = 'xxx'
142960579350SBram Moolenaar  END
143060579350SBram Moolenaar  writefile(import_assign_wrong_type_lines, 'Ximport.vim')
143160579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3)
143260579350SBram Moolenaar
143360579350SBram Moolenaar  var import_assign_const_lines =<< trim END
143460579350SBram Moolenaar    vim9script
143560579350SBram Moolenaar    import CONST from './Xexport.vim'
143660579350SBram Moolenaar    CONST = 4321
143760579350SBram Moolenaar  END
143860579350SBram Moolenaar  writefile(import_assign_const_lines, 'Ximport.vim')
143960579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E741: Value is locked: CONST', '', 3)
144060579350SBram Moolenaar
1441f2d5c240SBram Moolenaar  delete('Ximport.vim')
14425269bd2aSBram Moolenaar  delete('Ximport3.vim')
14438a7d6542SBram Moolenaar  delete('Xexport.vim')
14448a7d6542SBram Moolenaar
1445f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
14463e191694SBram Moolenaar  # Flags added or removed are also applied to the restored value.
14473e191694SBram Moolenaar  set cpo=abcd
1448cfcd011fSBram Moolenaar  var lines =<< trim END
1449750802b5SBram Moolenaar    vim9script
1450750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
14513e191694SBram Moolenaar    set cpo+=f
14523e191694SBram Moolenaar    set cpo-=c
14533e191694SBram Moolenaar    g:cpo_after_vim9script = &cpo
1454750802b5SBram Moolenaar  END
1455750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1456750802b5SBram Moolenaar  source Xvim9_script
14573e191694SBram Moolenaar  assert_equal('fabd', &cpo)
1458750802b5SBram Moolenaar  set cpo&vim
1459750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
14603e191694SBram Moolenaar  var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
14613e191694SBram Moolenaar  assert_equal(newcpo, g:cpo_after_vim9script)
14623e191694SBram Moolenaar
1463750802b5SBram Moolenaar  delete('Xvim9_script')
1464750802b5SBram Moolenaarenddef
1465750802b5SBram Moolenaar
14660a84284eSBram Moolenaardef Test_import_as()
14670a84284eSBram Moolenaar  var export_lines =<< trim END
14680a84284eSBram Moolenaar    vim9script
14690a84284eSBram Moolenaar    export var one = 1
14700a84284eSBram Moolenaar    export var yes = 'yes'
1471c967d57aSBram Moolenaar    export var slist: list<string>
14720a84284eSBram Moolenaar  END
14730a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
14740a84284eSBram Moolenaar
14750a84284eSBram Moolenaar  var import_lines =<< trim END
14760a84284eSBram Moolenaar    vim9script
14776c7cc347SBram Moolenaar    var one = 'notused'
14786c7cc347SBram Moolenaar    var yes = 777
14790a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
14800a84284eSBram Moolenaar    assert_equal(1, thatOne)
14810a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
14820a84284eSBram Moolenaar    assert_equal('yes', yesYes)
14830a84284eSBram Moolenaar  END
14840a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
14850a84284eSBram Moolenaar
14860a84284eSBram Moolenaar  import_lines =<< trim END
14870a84284eSBram Moolenaar    vim9script
14880a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
14890a84284eSBram Moolenaar    assert_equal(1, thatOne)
14900a84284eSBram Moolenaar    assert_equal('yes', yesYes)
14910a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
14920a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
14930a84284eSBram Moolenaar  END
14940a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
14950a84284eSBram Moolenaar
1496c967d57aSBram Moolenaar  import_lines =<< trim END
1497c967d57aSBram Moolenaar    vim9script
1498c967d57aSBram Moolenaar    import {slist as impSlist} from './XexportAs'
1499c967d57aSBram Moolenaar    impSlist->add(123)
1500c967d57aSBram Moolenaar  END
1501c967d57aSBram Moolenaar  CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number')
1502c967d57aSBram Moolenaar
15030a84284eSBram Moolenaar  delete('XexportAs')
15040a84284eSBram Moolenaarenddef
15050a84284eSBram Moolenaar
1506803af686SBram Moolenaarfunc g:Trigger()
1507803af686SBram Moolenaar  source Ximport.vim
1508803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1509803af686SBram Moolenaarendfunc
1510803af686SBram Moolenaar
1511803af686SBram Moolenaardef Test_import_export_expr_map()
1512803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1513cfcd011fSBram Moolenaar  var export_lines =<< trim END
1514803af686SBram Moolenaar    vim9script
1515803af686SBram Moolenaar    export def That(): string
1516803af686SBram Moolenaar      return 'yes'
1517803af686SBram Moolenaar    enddef
1518803af686SBram Moolenaar  END
1519803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1520803af686SBram Moolenaar
1521cfcd011fSBram Moolenaar  var import_lines =<< trim END
1522803af686SBram Moolenaar    vim9script
1523803af686SBram Moolenaar    import That from './Xexport_that.vim'
1524803af686SBram Moolenaar    assert_equal('yes', That())
1525803af686SBram Moolenaar  END
1526803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1527803af686SBram Moolenaar
1528803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1529803af686SBram Moolenaar  feedkeys('trigger', "xt")
1530803af686SBram Moolenaar
1531730b2483SBram Moolenaar  delete('Xexport_that.vim')
1532803af686SBram Moolenaar  delete('Ximport.vim')
1533803af686SBram Moolenaar  nunmap trigger
1534803af686SBram Moolenaarenddef
1535803af686SBram Moolenaar
15368e1986e3SBram Moolenaardef Test_import_in_filetype()
15378e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
15388e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1539cfcd011fSBram Moolenaar  var export_lines =<< trim END
15408e1986e3SBram Moolenaar    vim9script
1541cfcd011fSBram Moolenaar    export var That = 'yes'
15428e1986e3SBram Moolenaar  END
1543730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
15448e1986e3SBram Moolenaar
1545cfcd011fSBram Moolenaar  var import_lines =<< trim END
15468e1986e3SBram Moolenaar    vim9script
1547730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
15488e1986e3SBram Moolenaar    assert_equal('yes', That)
15498e1986e3SBram Moolenaar    g:did_load_mytpe = 1
15508e1986e3SBram Moolenaar  END
15518e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
15528e1986e3SBram Moolenaar
1553cfcd011fSBram Moolenaar  var save_rtp = &rtp
15548e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
15558e1986e3SBram Moolenaar
15568e1986e3SBram Moolenaar  filetype plugin on
15578e1986e3SBram Moolenaar  copen
15588e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
15598e1986e3SBram Moolenaar
15608e1986e3SBram Moolenaar  quit!
1561730b2483SBram Moolenaar  delete('Xexport_ft.vim')
15628e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
15638e1986e3SBram Moolenaar  &rtp = save_rtp
15648e1986e3SBram Moolenaarenddef
15658e1986e3SBram Moolenaar
1566efa94447SBram Moolenaardef Test_use_import_in_mapping()
1567cfcd011fSBram Moolenaar  var lines =<< trim END
1568efa94447SBram Moolenaar      vim9script
1569efa94447SBram Moolenaar      export def Funcx()
1570efa94447SBram Moolenaar        g:result = 42
1571efa94447SBram Moolenaar      enddef
1572efa94447SBram Moolenaar  END
1573efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1574efa94447SBram Moolenaar  lines =<< trim END
1575efa94447SBram Moolenaar      vim9script
1576efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1577b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1578efa94447SBram Moolenaar  END
1579efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1580efa94447SBram Moolenaar
1581efa94447SBram Moolenaar  source Xmapscript.vim
1582b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1583efa94447SBram Moolenaar  assert_equal(42, g:result)
1584efa94447SBram Moolenaar
1585efa94447SBram Moolenaar  unlet g:result
1586efa94447SBram Moolenaar  delete('XsomeExport.vim')
1587efa94447SBram Moolenaar  delete('Xmapscript.vim')
1588b3ca9824SBram Moolenaar  nunmap <F3>
1589efa94447SBram Moolenaarenddef
1590efa94447SBram Moolenaar
1591d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1592d3f8a9eeSBram Moolenaar  var lines =<< trim END
1593d3f8a9eeSBram Moolenaar    if has(g:feature)
1594d3f8a9eeSBram Moolenaar      " legacy script
1595d3f8a9eeSBram Moolenaar      let g:legacy = 1
1596d3f8a9eeSBram Moolenaar      finish
1597d3f8a9eeSBram Moolenaar    endif
1598d3f8a9eeSBram Moolenaar    vim9script
1599d3f8a9eeSBram Moolenaar    g:legacy = 0
1600d3f8a9eeSBram Moolenaar  END
1601d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1602d3f8a9eeSBram Moolenaar  g:legacy = -1
1603d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1604d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1605d3f8a9eeSBram Moolenaar
1606d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1607d3f8a9eeSBram Moolenaar  g:legacy = -1
1608d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1609d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1610d3f8a9eeSBram Moolenaarenddef
1611d3f8a9eeSBram Moolenaar
1612750802b5SBram Moolenaardef Test_vim9script_fails()
16138a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
16148a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1615cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
16169721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1617cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1618750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1619750802b5SBram Moolenaar
1620cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1621c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1622c785b9a7SBram Moolenaar
1623e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1624e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
16258a7d6542SBram Moolenaarenddef
16268a7d6542SBram Moolenaar
1627f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1628101f4810SBram Moolenaar  CheckRunVimInTerminal
1629101f4810SBram Moolenaar
16309bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1631c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
16329bb3eb3eSBram Moolenaarendfunc
16339bb3eb3eSBram Moolenaar
1634c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1635cfcd011fSBram Moolenaar  var export =<< trim END
1636101f4810SBram Moolenaar    vim9script
1637101f4810SBram Moolenaar    export def Foo(): number
1638101f4810SBram Moolenaar        return 0
1639101f4810SBram Moolenaar    enddef
1640101f4810SBram Moolenaar  END
1641730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1642101f4810SBram Moolenaar
1643e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
16449bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
16452949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1646101f4810SBram Moolenaar
1647730b2483SBram Moolenaar  delete('XexportCmd.vim')
16489bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
16499bb3eb3eSBram Moolenaarenddef
1650101f4810SBram Moolenaar
16512b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
16522b32700dSBram Moolenaar  var lines =<< trim END
1653a6294955SBram Moolenaar    vim9script
1654a6294955SBram Moolenaar    export var exported = 'thexport'
165560dc8274SBram Moolenaar
165660dc8274SBram Moolenaar    export def TheFunc(x = 0)
165760dc8274SBram Moolenaar    enddef
1658a6294955SBram Moolenaar  END
1659a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1660a6294955SBram Moolenaar  lines =<< trim END
16612b32700dSBram Moolenaar    vim9script noclear
16622b32700dSBram Moolenaar    g:loadCount += 1
16632b32700dSBram Moolenaar    var s:reloaded = 'init'
1664a6294955SBram Moolenaar    import exported from './XExportReload'
16652b32700dSBram Moolenaar
16662b32700dSBram Moolenaar    def Again(): string
16672b32700dSBram Moolenaar      return 'again'
16682b32700dSBram Moolenaar    enddef
16692b32700dSBram Moolenaar
167060dc8274SBram Moolenaar    import TheFunc from './XExportReload'
167160dc8274SBram Moolenaar    TheFunc()
167260dc8274SBram Moolenaar
16732b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
16742b32700dSBram Moolenaar    var s:loaded = true
16752b32700dSBram Moolenaar
16762b32700dSBram Moolenaar    var s:notReloaded = 'yes'
16772b32700dSBram Moolenaar    s:reloaded = 'first'
16782b32700dSBram Moolenaar    def g:Values(): list<string>
1679a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
16802b32700dSBram Moolenaar    enddef
16812b32700dSBram Moolenaar
16822b32700dSBram Moolenaar    def Once(): string
16832b32700dSBram Moolenaar      return 'once'
16842b32700dSBram Moolenaar    enddef
16852b32700dSBram Moolenaar  END
16862b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
16872b32700dSBram Moolenaar  g:loadCount = 0
16882b32700dSBram Moolenaar  source XReloaded
16892b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1690a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
16912b32700dSBram Moolenaar  source XReloaded
16922b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1693a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
16942b32700dSBram Moolenaar  source XReloaded
16952b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1696a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
16972b32700dSBram Moolenaar
169848e11c10SBram Moolenaar  delete('XReloaded')
1699a6294955SBram Moolenaar  delete('XExportReload')
17002b32700dSBram Moolenaar  delfunc g:Values
17012b32700dSBram Moolenaar  unlet g:loadCount
1702577dc93dSBram Moolenaar
1703577dc93dSBram Moolenaar  lines =<< trim END
1704577dc93dSBram Moolenaar      vim9script
1705577dc93dSBram Moolenaar      def Inner()
1706577dc93dSBram Moolenaar      enddef
1707577dc93dSBram Moolenaar  END
1708577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1709577dc93dSBram Moolenaar  source XreloadScript.vim
1710577dc93dSBram Moolenaar
1711577dc93dSBram Moolenaar  lines =<< trim END
1712577dc93dSBram Moolenaar      vim9script
1713577dc93dSBram Moolenaar      def Outer()
1714577dc93dSBram Moolenaar        def Inner()
1715577dc93dSBram Moolenaar        enddef
1716577dc93dSBram Moolenaar      enddef
1717577dc93dSBram Moolenaar      defcompile
1718577dc93dSBram Moolenaar  END
1719577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1720577dc93dSBram Moolenaar  source XreloadScript.vim
1721577dc93dSBram Moolenaar
1722577dc93dSBram Moolenaar  delete('XreloadScript.vim')
17232b32700dSBram Moolenaarenddef
17242b32700dSBram Moolenaar
17254c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1726cfcd011fSBram Moolenaar  var lines =<< trim END
17278a7d6542SBram Moolenaar    vim9script
17288a7d6542SBram Moolenaar    const var = ''
1729cfcd011fSBram Moolenaar    var valone = 1234
17308a7d6542SBram Moolenaar    def MyFunc(arg: string)
17318a7d6542SBram Moolenaar       valone = 5678
17328a7d6542SBram Moolenaar    enddef
17338a7d6542SBram Moolenaar  END
1734cfcd011fSBram Moolenaar  var morelines =<< trim END
1735cfcd011fSBram Moolenaar    var valtwo = 222
17368a7d6542SBram Moolenaar    export def GetValtwo(): number
17378a7d6542SBram Moolenaar      return valtwo
17388a7d6542SBram Moolenaar    enddef
17398a7d6542SBram Moolenaar  END
174003afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
17418a7d6542SBram Moolenaar  source Xreload.vim
17428a7d6542SBram Moolenaar  source Xreload.vim
17438a7d6542SBram Moolenaar  source Xreload.vim
17448a7d6542SBram Moolenaar
1745f5be8cdbSBram Moolenaar  # cannot declare a var twice
17468a7d6542SBram Moolenaar  lines =<< trim END
17478a7d6542SBram Moolenaar    vim9script
1748cfcd011fSBram Moolenaar    var valone = 1234
1749cfcd011fSBram Moolenaar    var valone = 5678
17508a7d6542SBram Moolenaar  END
17518a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
175244d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
17538a7d6542SBram Moolenaar
17548a7d6542SBram Moolenaar  delete('Xreload.vim')
17558a7d6542SBram Moolenaar  delete('Ximport.vim')
17568a7d6542SBram Moolenaarenddef
17578a7d6542SBram Moolenaar
175807a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
175907a65d26SBram Moolenaar" compiled function using that variable must fail.
176007a65d26SBram Moolenaardef Test_script_reload_change_type()
176107a65d26SBram Moolenaar  var lines =<< trim END
176207a65d26SBram Moolenaar    vim9script noclear
176307a65d26SBram Moolenaar    var str = 'string'
176407a65d26SBram Moolenaar    def g:GetStr(): string
176507a65d26SBram Moolenaar      return str .. 'xxx'
176607a65d26SBram Moolenaar    enddef
176707a65d26SBram Moolenaar  END
176807a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
176907a65d26SBram Moolenaar  source Xreload.vim
177007a65d26SBram Moolenaar  echo g:GetStr()
177107a65d26SBram Moolenaar
177207a65d26SBram Moolenaar  lines =<< trim END
177307a65d26SBram Moolenaar    vim9script noclear
177407a65d26SBram Moolenaar    var str = 1234
177507a65d26SBram Moolenaar  END
177607a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
177707a65d26SBram Moolenaar  source Xreload.vim
177807a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
177907a65d26SBram Moolenaar
178007a65d26SBram Moolenaar  delfunc g:GetStr
178107a65d26SBram Moolenaar  delete('Xreload.vim')
178207a65d26SBram Moolenaarenddef
178307a65d26SBram Moolenaar
1784c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled
1785c970e422SBram Moolenaarcommand CallFunc echo 'nop'
1786c970e422SBram Moolenaar
1787c970e422SBram Moolenaardef Test_script_reload_from_function()
1788c970e422SBram Moolenaar  var lines =<< trim END
1789c970e422SBram Moolenaar      vim9script
1790c970e422SBram Moolenaar
1791c970e422SBram Moolenaar      if exists('g:loaded')
1792c970e422SBram Moolenaar        finish
1793c970e422SBram Moolenaar      endif
1794c970e422SBram Moolenaar      g:loaded = 1
1795c970e422SBram Moolenaar      delcommand CallFunc
1796c970e422SBram Moolenaar      command CallFunc Func()
1797c970e422SBram Moolenaar      def Func()
1798a4c81beaSBram Moolenaar        so XreloadFunc.vim
1799c970e422SBram Moolenaar        g:didTheFunc = 1
1800c970e422SBram Moolenaar      enddef
1801c970e422SBram Moolenaar  END
1802c970e422SBram Moolenaar  writefile(lines, 'XreloadFunc.vim')
1803c970e422SBram Moolenaar  source XreloadFunc.vim
1804c970e422SBram Moolenaar  CallFunc
1805c970e422SBram Moolenaar  assert_equal(1, g:didTheFunc)
1806c970e422SBram Moolenaar
1807c970e422SBram Moolenaar  delete('XreloadFunc.vim')
1808c970e422SBram Moolenaar  delcommand CallFunc
1809c970e422SBram Moolenaar  unlet g:loaded
1810c970e422SBram Moolenaar  unlet g:didTheFunc
1811c970e422SBram Moolenaarenddef
1812c970e422SBram Moolenaar
18136c3843caSBram Moolenaardef Test_script_var_shadows_function()
18146c3843caSBram Moolenaar  var lines =<< trim END
18156c3843caSBram Moolenaar      vim9script
18166c3843caSBram Moolenaar      def Func(): number
18176c3843caSBram Moolenaar        return 123
18186c3843caSBram Moolenaar      enddef
18196c3843caSBram Moolenaar      var Func = 1
18206c3843caSBram Moolenaar  END
18216c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
18226c3843caSBram Moolenaarenddef
18236c3843caSBram Moolenaar
1824c323527dSBram Moolenaardef Test_script_var_shadows_command()
1825c323527dSBram Moolenaar  var lines =<< trim END
1826c323527dSBram Moolenaar      var undo = 1
1827c323527dSBram Moolenaar      undo = 2
1828c323527dSBram Moolenaar      assert_equal(2, undo)
1829c323527dSBram Moolenaar  END
1830c323527dSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1831c323527dSBram Moolenaar
1832c323527dSBram Moolenaar  lines =<< trim END
1833c323527dSBram Moolenaar      var undo = 1
1834c323527dSBram Moolenaar      undo
1835c323527dSBram Moolenaar  END
1836c323527dSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1207:', 2)
1837c323527dSBram Moolenaarenddef
1838c323527dSBram Moolenaar
183995006e3dSBram Moolenaardef s:RetSome(): string
184095006e3dSBram Moolenaar  return 'some'
184195006e3dSBram Moolenaarenddef
184295006e3dSBram Moolenaar
1843fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1844fe465a01SBram Moolenaar" script-local name.
1845fe465a01SBram Moolenaardef Test_vim9script_funcref()
1846cfcd011fSBram Moolenaar  var sortlines =<< trim END
1847fe465a01SBram Moolenaar      vim9script
1848fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1849bed36b93SBram Moolenaar        return i2 - i1
1850fe465a01SBram Moolenaar      enddef
1851fe465a01SBram Moolenaar
1852fe465a01SBram Moolenaar      export def FastSort(): list<number>
1853fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1854fe465a01SBram Moolenaar      enddef
1855529fb5a5SBram Moolenaar
1856529fb5a5SBram Moolenaar      export def GetString(arg: string): string
1857529fb5a5SBram Moolenaar        return arg
1858529fb5a5SBram Moolenaar      enddef
1859fe465a01SBram Moolenaar  END
1860fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1861fe465a01SBram Moolenaar
1862cfcd011fSBram Moolenaar  var lines =<< trim END
1863fe465a01SBram Moolenaar    vim9script
1864fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1865fe465a01SBram Moolenaar    def Test()
1866fe465a01SBram Moolenaar      g:result = FastSort()
1867fe465a01SBram Moolenaar    enddef
1868fe465a01SBram Moolenaar    Test()
1869529fb5a5SBram Moolenaar
1870529fb5a5SBram Moolenaar    # using a function imported with "as"
1871529fb5a5SBram Moolenaar    import * as anAlias from './Xsort.vim'
1872529fb5a5SBram Moolenaar    assert_equal('yes', anAlias.GetString('yes'))
1873529fb5a5SBram Moolenaar
1874529fb5a5SBram Moolenaar    # using the function from a compiled function
1875529fb5a5SBram Moolenaar    def TestMore(): string
1876ca51cc0aSBram Moolenaar      var s = s:anAlias.GetString('foo')
1877ca51cc0aSBram Moolenaar      return s .. anAlias.GetString('bar')
1878529fb5a5SBram Moolenaar    enddef
1879ca51cc0aSBram Moolenaar    assert_equal('foobar', TestMore())
1880529fb5a5SBram Moolenaar
1881529fb5a5SBram Moolenaar    # error when using a function that isn't exported
1882529fb5a5SBram Moolenaar    assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1883fe465a01SBram Moolenaar  END
1884fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1885fe465a01SBram Moolenaar
1886fe465a01SBram Moolenaar  source Xscript.vim
1887fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1888fe465a01SBram Moolenaar
1889fe465a01SBram Moolenaar  unlet g:result
1890fe465a01SBram Moolenaar  delete('Xsort.vim')
1891fe465a01SBram Moolenaar  delete('Xscript.vim')
189295006e3dSBram Moolenaar
1893cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
189495006e3dSBram Moolenaar  assert_equal('some', Funcref())
1895fe465a01SBram Moolenaarenddef
1896fe465a01SBram Moolenaar
1897601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1898601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1899601e76acSBram Moolenaar" function reference.
1900c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1901cfcd011fSBram Moolenaar  var filterLines =<< trim END
1902c620c055SBram Moolenaar    vim9script
1903c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1904c620c055SBram Moolenaar      return idx % 2 == 1
1905c620c055SBram Moolenaar    enddef
1906c620c055SBram Moolenaar    export def FastFilter(): list<number>
1907c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1908c620c055SBram Moolenaar    enddef
1909601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1910601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1911601e76acSBram Moolenaar    enddef
1912c620c055SBram Moolenaar  END
1913c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1914c620c055SBram Moolenaar
1915cfcd011fSBram Moolenaar  var lines =<< trim END
1916c620c055SBram Moolenaar    vim9script
1917601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1918c620c055SBram Moolenaar    def Test()
1919cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1920c620c055SBram Moolenaar    enddef
1921c620c055SBram Moolenaar    Test()
1922601e76acSBram Moolenaar    def TestDirect()
1923cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1924601e76acSBram Moolenaar    enddef
1925601e76acSBram Moolenaar    TestDirect()
1926c620c055SBram Moolenaar  END
1927601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1928c620c055SBram Moolenaar  delete('Xfilter.vim')
1929c620c055SBram Moolenaarenddef
1930c620c055SBram Moolenaar
19314c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1932cfcd011fSBram Moolenaar  var first_lines =<< trim END
19334c17ad94SBram Moolenaar    vim9script
19344c17ad94SBram Moolenaar    def FuncYes(): string
19354c17ad94SBram Moolenaar      return 'yes'
19364c17ad94SBram Moolenaar    enddef
19374c17ad94SBram Moolenaar  END
1938cfcd011fSBram Moolenaar  var withno_lines =<< trim END
19394c17ad94SBram Moolenaar    def FuncNo(): string
19404c17ad94SBram Moolenaar      return 'no'
19414c17ad94SBram Moolenaar    enddef
19424c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
19434c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
19444c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
194503afdcf1SBram Moolenaar    enddef
194603afdcf1SBram Moolenaar  END
1947cfcd011fSBram Moolenaar  var nono_lines =<< trim END
194803afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
194903afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
195044d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
19514c17ad94SBram Moolenaar    enddef
19524c17ad94SBram Moolenaar  END
19534c17ad94SBram Moolenaar
19544c17ad94SBram Moolenaar  # FuncNo() is defined
195503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
19564c17ad94SBram Moolenaar  source Xreloaded.vim
19574c17ad94SBram Moolenaar  g:DoCheck(true)
19584c17ad94SBram Moolenaar
19594c17ad94SBram Moolenaar  # FuncNo() is not redefined
196003afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
19614c17ad94SBram Moolenaar  source Xreloaded.vim
19625082471fSBram Moolenaar  g:DoCheck(false)
19634c17ad94SBram Moolenaar
19644c17ad94SBram Moolenaar  # FuncNo() is back
196503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
19664c17ad94SBram Moolenaar  source Xreloaded.vim
19675082471fSBram Moolenaar  g:DoCheck(false)
19684c17ad94SBram Moolenaar
19694c17ad94SBram Moolenaar  delete('Xreloaded.vim')
19704c17ad94SBram Moolenaarenddef
19714c17ad94SBram Moolenaar
197289483d40SBram Moolenaardef Test_vim9script_reload_delvar()
197389483d40SBram Moolenaar  # write the script with a script-local variable
1974cfcd011fSBram Moolenaar  var lines =<< trim END
197589483d40SBram Moolenaar    vim9script
1976cfcd011fSBram Moolenaar    var name = 'string'
197789483d40SBram Moolenaar  END
197889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
197989483d40SBram Moolenaar  source XreloadVar.vim
198089483d40SBram Moolenaar
198189483d40SBram Moolenaar  # now write the script using the same variable locally - works
198289483d40SBram Moolenaar  lines =<< trim END
198389483d40SBram Moolenaar    vim9script
198489483d40SBram Moolenaar    def Func()
1985cfcd011fSBram Moolenaar      var name = 'string'
198689483d40SBram Moolenaar    enddef
198789483d40SBram Moolenaar  END
198889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
198989483d40SBram Moolenaar  source XreloadVar.vim
199089483d40SBram Moolenaar
199189483d40SBram Moolenaar  delete('XreloadVar.vim')
199289483d40SBram Moolenaarenddef
199389483d40SBram Moolenaar
19948a7d6542SBram Moolenaardef Test_import_absolute()
1995cfcd011fSBram Moolenaar  var import_lines = [
1996e6085c53SBram Moolenaar        'vim9script',
1997e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1998e6085c53SBram Moolenaar        'def UseExported()',
1999e6085c53SBram Moolenaar        '  g:imported_abs = exported',
2000e6085c53SBram Moolenaar        '  exported = 8888',
2001e6085c53SBram Moolenaar        '  g:imported_after = exported',
2002e6085c53SBram Moolenaar        'enddef',
2003e6085c53SBram Moolenaar        'UseExported()',
2004e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
2005e6085c53SBram Moolenaar        ]
20068a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
20078a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
20088a7d6542SBram Moolenaar
20098a7d6542SBram Moolenaar  source Ximport_abs.vim
20108a7d6542SBram Moolenaar
20118a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
20124e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
2013fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
2014fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
2015fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2016fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
2017fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
2018fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
2019fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
2020fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
2021fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2022fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
2023e6085c53SBram Moolenaar        g:import_disassembled)
2024b3ca9824SBram Moolenaar
2025b3ca9824SBram Moolenaar  Undo_export_script_lines()
20268a7d6542SBram Moolenaar  unlet g:imported_abs
20274e12a5dfSBram Moolenaar  unlet g:import_disassembled
20288a7d6542SBram Moolenaar
20298a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
20308a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
20318a7d6542SBram Moolenaarenddef
20328a7d6542SBram Moolenaar
20338a7d6542SBram Moolenaardef Test_import_rtp()
2034cfcd011fSBram Moolenaar  var import_lines = [
2035e6085c53SBram Moolenaar        'vim9script',
2036e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
2037e6085c53SBram Moolenaar        'g:imported_rtp = exported',
2038e6085c53SBram Moolenaar        ]
20398a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
2040b885a7c7SBram Moolenaar  mkdir('import', 'p')
2041b885a7c7SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
20428a7d6542SBram Moolenaar
2043cfcd011fSBram Moolenaar  var save_rtp = &rtp
20448a7d6542SBram Moolenaar  &rtp = getcwd()
20458a7d6542SBram Moolenaar  source Ximport_rtp.vim
20468a7d6542SBram Moolenaar  &rtp = save_rtp
20478a7d6542SBram Moolenaar
20488a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
20498a7d6542SBram Moolenaar
2050b3ca9824SBram Moolenaar  Undo_export_script_lines()
2051b3ca9824SBram Moolenaar  unlet g:imported_rtp
20528a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
2053b885a7c7SBram Moolenaar  delete('import', 'rf')
20548a7d6542SBram Moolenaarenddef
20558a7d6542SBram Moolenaar
205625e0f586SBram Moolenaardef Test_import_compile_error()
2057cfcd011fSBram Moolenaar  var export_lines = [
205825e0f586SBram Moolenaar        'vim9script',
205925e0f586SBram Moolenaar        'export def ExpFunc(): string',
206025e0f586SBram Moolenaar        '  return notDefined',
206125e0f586SBram Moolenaar        'enddef',
206225e0f586SBram Moolenaar        ]
206325e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
206425e0f586SBram Moolenaar
2065cfcd011fSBram Moolenaar  var import_lines = [
206625e0f586SBram Moolenaar        'vim9script',
206725e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
206825e0f586SBram Moolenaar        'def ImpFunc()',
206925e0f586SBram Moolenaar        '  echo ExpFunc()',
207025e0f586SBram Moolenaar        'enddef',
207125e0f586SBram Moolenaar        'defcompile',
207225e0f586SBram Moolenaar        ]
207325e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
207425e0f586SBram Moolenaar
207525e0f586SBram Moolenaar  try
207625e0f586SBram Moolenaar    source Ximport.vim
207725e0f586SBram Moolenaar  catch /E1001/
2078f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
20797707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
208025e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
208125e0f586SBram Moolenaar  endtry
208225e0f586SBram Moolenaar
208325e0f586SBram Moolenaar  delete('Xexported.vim')
208425e0f586SBram Moolenaar  delete('Ximport.vim')
208525e0f586SBram Moolenaarenddef
208625e0f586SBram Moolenaar
2087c4ce36d4SBram Moolenaardef Test_func_redefine_error()
2088cfcd011fSBram Moolenaar  var lines = [
2089c4ce36d4SBram Moolenaar        'vim9script',
2090c4ce36d4SBram Moolenaar        'def Func()',
2091c4ce36d4SBram Moolenaar        '  eval [][0]',
2092c4ce36d4SBram Moolenaar        'enddef',
2093c4ce36d4SBram Moolenaar        'Func()',
2094c4ce36d4SBram Moolenaar        ]
2095c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
2096c4ce36d4SBram Moolenaar
2097c4ce36d4SBram Moolenaar  for count in range(3)
2098c4ce36d4SBram Moolenaar    try
2099c4ce36d4SBram Moolenaar      source Xtestscript.vim
2100c4ce36d4SBram Moolenaar    catch /E684/
2101c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
2102c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
2103c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
2104c4ce36d4SBram Moolenaar    endtry
2105c4ce36d4SBram Moolenaar  endfor
2106c4ce36d4SBram Moolenaar
2107c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
2108c4ce36d4SBram Moolenaarenddef
2109c4ce36d4SBram Moolenaar
2110eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
2111cfcd011fSBram Moolenaar  var export_lines =<< trim END
2112eef2102eSBram Moolenaar      vim9script
2113eef2102eSBram Moolenaar      export def Func()
2114eef2102eSBram Moolenaar        echo 'imported'
2115eef2102eSBram Moolenaar      enddef
2116eef2102eSBram Moolenaar  END
2117eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
2118eef2102eSBram Moolenaar
2119cfcd011fSBram Moolenaar  var lines =<< trim END
2120eef2102eSBram Moolenaar    vim9script
2121eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2122eef2102eSBram Moolenaar    def Func()
2123eef2102eSBram Moolenaar      echo 'local to function'
2124eef2102eSBram Moolenaar    enddef
2125eef2102eSBram Moolenaar  END
2126eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2127eef2102eSBram Moolenaar
2128eef2102eSBram Moolenaar  lines =<< trim END
2129eef2102eSBram Moolenaar    vim9script
2130eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2131eef2102eSBram Moolenaar    def Outer()
2132eef2102eSBram Moolenaar      def Func()
2133eef2102eSBram Moolenaar        echo 'local to function'
2134eef2102eSBram Moolenaar      enddef
2135eef2102eSBram Moolenaar    enddef
2136eef2102eSBram Moolenaar    defcompile
2137eef2102eSBram Moolenaar  END
2138eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2139eef2102eSBram Moolenaar
2140eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
2141eef2102eSBram Moolenaarenddef
2142eef2102eSBram Moolenaar
2143b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
2144cfcd011fSBram Moolenaar  var lines =<< trim END
2145b9a2cac3SBram Moolenaar    vim9script
2146b9a2cac3SBram Moolenaar    def Func()
2147b9a2cac3SBram Moolenaar      echo 'one'
2148b9a2cac3SBram Moolenaar    enddef
2149b9a2cac3SBram Moolenaar    def Func()
2150b9a2cac3SBram Moolenaar      echo 'two'
2151b9a2cac3SBram Moolenaar    enddef
2152b9a2cac3SBram Moolenaar  END
2153b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2154fa211f3cSBram Moolenaar
2155fa211f3cSBram Moolenaar  lines =<< trim END
2156fa211f3cSBram Moolenaar    vim9script
2157fa211f3cSBram Moolenaar    def Foo(): string
2158fa211f3cSBram Moolenaar      return 'foo'
2159fa211f3cSBram Moolenaar      enddef
2160fa211f3cSBram Moolenaar    def Func()
2161cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
2162fa211f3cSBram Moolenaar    enddef
2163fa211f3cSBram Moolenaar    defcompile
2164fa211f3cSBram Moolenaar  END
2165fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2166b9a2cac3SBram Moolenaarenddef
2167b9a2cac3SBram Moolenaar
21688a7d6542SBram Moolenaardef Test_fixed_size_list()
2169f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
2170cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
21718a7d6542SBram Moolenaar  l->remove(0)
21728a7d6542SBram Moolenaar  l->add(5)
21738a7d6542SBram Moolenaar  l->insert(99, 1)
21740f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
21758a7d6542SBram Moolenaarenddef
21768a7d6542SBram Moolenaar
2177ae616494SBram Moolenaardef Test_no_insert_xit()
2178d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2179d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2180d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2181d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2182d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2183ae616494SBram Moolenaar
2184ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2185ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2186ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2187ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2188f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2189f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
21906508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
21916508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
2192f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2193f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2194f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2195ae616494SBram Moolenaarenddef
2196ae616494SBram Moolenaar
2197158906cfSBram Moolenaardef IfElse(what: number): string
2198cfcd011fSBram Moolenaar  var res = ''
2199158906cfSBram Moolenaar  if what == 1
2200158906cfSBram Moolenaar    res = "one"
2201158906cfSBram Moolenaar  elseif what == 2
2202158906cfSBram Moolenaar    res = "two"
2203a259d8d3SBram Moolenaar  else
2204158906cfSBram Moolenaar    res = "three"
2205a259d8d3SBram Moolenaar  endif
2206158906cfSBram Moolenaar  return res
2207a259d8d3SBram Moolenaarenddef
2208a259d8d3SBram Moolenaar
2209158906cfSBram Moolenaardef Test_if_elseif_else()
2210158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2211158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2212158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
22130f18b6d1SBram Moolenaarenddef
22140f18b6d1SBram Moolenaar
2215e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2216d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2217d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2218d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2219ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
2220d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
22216628b7ebSBram Moolenaar
22226628b7ebSBram Moolenaar  var lines =<< trim END
22236628b7ebSBram Moolenaar      var s = ''
22246628b7ebSBram Moolenaar      if s = ''
22256628b7ebSBram Moolenaar      endif
22266628b7ebSBram Moolenaar  END
22276628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
22286628b7ebSBram Moolenaar
22296628b7ebSBram Moolenaar  lines =<< trim END
22306628b7ebSBram Moolenaar      var s = ''
22316628b7ebSBram Moolenaar      if s == ''
22326628b7ebSBram Moolenaar      elseif s = ''
22336628b7ebSBram Moolenaar      endif
22346628b7ebSBram Moolenaar  END
22356628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2236e8c4abbbSBram Moolenaarenddef
2237e8c4abbbSBram Moolenaar
22386d69bf60SBram Moolenaarlet g:bool_true = v:true
22396d69bf60SBram Moolenaarlet g:bool_false = v:false
22406d69bf60SBram Moolenaar
22416d69bf60SBram Moolenaardef Test_if_const_expr()
2242cfcd011fSBram Moolenaar  var res = false
22436d69bf60SBram Moolenaar  if true ? true : false
22446d69bf60SBram Moolenaar    res = true
22456d69bf60SBram Moolenaar  endif
22466d69bf60SBram Moolenaar  assert_equal(true, res)
22476d69bf60SBram Moolenaar
2248585fea7bSBram Moolenaar  g:glob = 2
2249585fea7bSBram Moolenaar  if false
22506797966dSBram Moolenaar    execute('g:glob = 3')
2251585fea7bSBram Moolenaar  endif
2252585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2253585fea7bSBram Moolenaar  if true
22546797966dSBram Moolenaar    execute('g:glob = 3')
2255585fea7bSBram Moolenaar  endif
2256585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2257585fea7bSBram Moolenaar
22586d69bf60SBram Moolenaar  res = false
22596d69bf60SBram Moolenaar  if g:bool_true ? true : false
22606d69bf60SBram Moolenaar    res = true
22616d69bf60SBram Moolenaar  endif
22626d69bf60SBram Moolenaar  assert_equal(true, res)
22636d69bf60SBram Moolenaar
22646d69bf60SBram Moolenaar  res = false
22656d69bf60SBram Moolenaar  if true ? g:bool_true : false
22666d69bf60SBram Moolenaar    res = true
22676d69bf60SBram Moolenaar  endif
22686d69bf60SBram Moolenaar  assert_equal(true, res)
22696d69bf60SBram Moolenaar
22706d69bf60SBram Moolenaar  res = false
22716d69bf60SBram Moolenaar  if true ? true : g:bool_false
22726d69bf60SBram Moolenaar    res = true
22736d69bf60SBram Moolenaar  endif
22746d69bf60SBram Moolenaar  assert_equal(true, res)
22756d69bf60SBram Moolenaar
22766d69bf60SBram Moolenaar  res = false
22776d69bf60SBram Moolenaar  if true ? false : true
22786d69bf60SBram Moolenaar    res = true
22796d69bf60SBram Moolenaar  endif
22806d69bf60SBram Moolenaar  assert_equal(false, res)
22816d69bf60SBram Moolenaar
22826d69bf60SBram Moolenaar  res = false
22836d69bf60SBram Moolenaar  if false ? false : true
22846d69bf60SBram Moolenaar    res = true
22856d69bf60SBram Moolenaar  endif
22866d69bf60SBram Moolenaar  assert_equal(true, res)
22876d69bf60SBram Moolenaar
22886d69bf60SBram Moolenaar  res = false
22896d69bf60SBram Moolenaar  if false ? true : false
22906d69bf60SBram Moolenaar    res = true
22916d69bf60SBram Moolenaar  endif
22926d69bf60SBram Moolenaar  assert_equal(false, res)
22936d69bf60SBram Moolenaar
22946d69bf60SBram Moolenaar  res = false
2295e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2296e8c4abbbSBram Moolenaar    res = true
2297e8c4abbbSBram Moolenaar  endif
2298e8c4abbbSBram Moolenaar  assert_equal(false, res)
2299e8c4abbbSBram Moolenaar
2300e8c4abbbSBram Moolenaar  res = false
23016d69bf60SBram Moolenaar  if true && true
23026d69bf60SBram Moolenaar    res = true
23036d69bf60SBram Moolenaar  endif
23046d69bf60SBram Moolenaar  assert_equal(true, res)
23056d69bf60SBram Moolenaar
23066d69bf60SBram Moolenaar  res = false
23076d69bf60SBram Moolenaar  if true && false
23086d69bf60SBram Moolenaar    res = true
23096d69bf60SBram Moolenaar  endif
23106d69bf60SBram Moolenaar  assert_equal(false, res)
23116d69bf60SBram Moolenaar
23126d69bf60SBram Moolenaar  res = false
23136d69bf60SBram Moolenaar  if g:bool_true && false
23146d69bf60SBram Moolenaar    res = true
23156d69bf60SBram Moolenaar  endif
23166d69bf60SBram Moolenaar  assert_equal(false, res)
23176d69bf60SBram Moolenaar
23186d69bf60SBram Moolenaar  res = false
23196d69bf60SBram Moolenaar  if true && g:bool_false
23206d69bf60SBram Moolenaar    res = true
23216d69bf60SBram Moolenaar  endif
23226d69bf60SBram Moolenaar  assert_equal(false, res)
23236d69bf60SBram Moolenaar
23246d69bf60SBram Moolenaar  res = false
23256d69bf60SBram Moolenaar  if false && false
23266d69bf60SBram Moolenaar    res = true
23276d69bf60SBram Moolenaar  endif
23286d69bf60SBram Moolenaar  assert_equal(false, res)
23296d69bf60SBram Moolenaar
23306d69bf60SBram Moolenaar  res = false
23316d69bf60SBram Moolenaar  if true || false
23326d69bf60SBram Moolenaar    res = true
23336d69bf60SBram Moolenaar  endif
23346d69bf60SBram Moolenaar  assert_equal(true, res)
23356d69bf60SBram Moolenaar
23366d69bf60SBram Moolenaar  res = false
23376d69bf60SBram Moolenaar  if g:bool_true || false
23386d69bf60SBram Moolenaar    res = true
23396d69bf60SBram Moolenaar  endif
23406d69bf60SBram Moolenaar  assert_equal(true, res)
23416d69bf60SBram Moolenaar
23426d69bf60SBram Moolenaar  res = false
23436d69bf60SBram Moolenaar  if true || g:bool_false
23446d69bf60SBram Moolenaar    res = true
23456d69bf60SBram Moolenaar  endif
23466d69bf60SBram Moolenaar  assert_equal(true, res)
23476d69bf60SBram Moolenaar
23486d69bf60SBram Moolenaar  res = false
23496d69bf60SBram Moolenaar  if false || false
23506d69bf60SBram Moolenaar    res = true
23516d69bf60SBram Moolenaar  endif
23526d69bf60SBram Moolenaar  assert_equal(false, res)
23533988f64fSBram Moolenaar
23543988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
2355c323527dSBram Moolenaar  if false | eval 1 + 2 | endif
23563988f64fSBram Moolenaar  if false | eval burp + 234 | endif
23573988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
23583988f64fSBram Moolenaar  if false
23593988f64fSBram Moolenaar    burp
23603988f64fSBram Moolenaar  endif
236180c34ca3SBram Moolenaarenddef
23626d69bf60SBram Moolenaar
236380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2364d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2365d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2366d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2367d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
23686d69bf60SBram Moolenaarenddef
23696d69bf60SBram Moolenaar
237072abcf42SBram Moolenaardef RunNested(i: number): number
2371cfcd011fSBram Moolenaar  var x: number = 0
237272abcf42SBram Moolenaar  if i % 2
237372abcf42SBram Moolenaar    if 1
2374f5be8cdbSBram Moolenaar      # comment
237572abcf42SBram Moolenaar    else
2376f5be8cdbSBram Moolenaar      # comment
237772abcf42SBram Moolenaar    endif
237872abcf42SBram Moolenaar    x += 1
237972abcf42SBram Moolenaar  else
238072abcf42SBram Moolenaar    x += 1000
238172abcf42SBram Moolenaar  endif
238272abcf42SBram Moolenaar  return x
238372abcf42SBram Moolenaarenddef
238472abcf42SBram Moolenaar
238572abcf42SBram Moolenaardef Test_nested_if()
238672abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
238772abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
238872abcf42SBram Moolenaarenddef
238972abcf42SBram Moolenaar
2390ad39c094SBram Moolenaardef Test_execute_cmd()
2391e4984290SBram Moolenaar  # missing argument is ignored
2392e4984290SBram Moolenaar  execute
2393e4984290SBram Moolenaar  execute # comment
2394e4984290SBram Moolenaar
2395ad39c094SBram Moolenaar  new
2396ad39c094SBram Moolenaar  setline(1, 'default')
2397d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2398ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2399a72cfb80SBram Moolenaar
2400d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2401a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2402a72cfb80SBram Moolenaar
2403cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2404cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2405a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2406ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2407a72cfb80SBram Moolenaar
2408d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2409ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2410a72cfb80SBram Moolenaar
2411cfcd011fSBram Moolenaar  var cmd_first = 'call '
2412cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2413ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2414ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2415ad39c094SBram Moolenaar  bwipe!
2416585fea7bSBram Moolenaar
2417cfcd011fSBram Moolenaar  var n = true
24182d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
24192d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
24202d6b20d6SBram Moolenaar
2421e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2422e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2423e5abf7afSBram Moolenaar
2424d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2425d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2426d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2427ad39c094SBram Moolenaarenddef
2428ad39c094SBram Moolenaar
242947e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2430f5be8cdbSBram Moolenaar  # only checks line continuation
2431cfcd011fSBram Moolenaar  var lines =<< trim END
243247e880d6SBram Moolenaar      vim9script
243347e880d6SBram Moolenaar      execute 'g:someVar'
243447e880d6SBram Moolenaar                .. ' = ' ..
243547e880d6SBram Moolenaar                   '28'
243647e880d6SBram Moolenaar      assert_equal(28, g:someVar)
243747e880d6SBram Moolenaar      unlet g:someVar
243847e880d6SBram Moolenaar  END
243947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
244047e880d6SBram Moolenaarenddef
244147e880d6SBram Moolenaar
2442ad39c094SBram Moolenaardef Test_echo_cmd()
2443a72cfb80SBram Moolenaar  echo 'some' # comment
2444585fea7bSBram Moolenaar  echon 'thing'
2445ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2446ad39c094SBram Moolenaar
2447a72cfb80SBram Moolenaar  echo "some" # comment
2448a72cfb80SBram Moolenaar  echon "thing"
2449a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2450a72cfb80SBram Moolenaar
2451cfcd011fSBram Moolenaar  var str1 = 'some'
2452cfcd011fSBram Moolenaar  var str2 = 'more'
2453ad39c094SBram Moolenaar  echo str1 str2
2454ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2455a72cfb80SBram Moolenaar
2456d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2457ad39c094SBram Moolenaarenddef
2458ad39c094SBram Moolenaar
2459f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2460f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2461f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2462f93c7feaSBram Moolenaar  echo 'clear'
2463df069eecSBram Moolenaar  :1messages
2464f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2465f93c7feaSBram Moolenaar
2466d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2467f93c7feaSBram Moolenaarenddef
2468f93c7feaSBram Moolenaar
246947e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2470f5be8cdbSBram Moolenaar  # only checks line continuation
2471cfcd011fSBram Moolenaar  var lines =<< trim END
247247e880d6SBram Moolenaar      vim9script
247347e880d6SBram Moolenaar      echomsg 'here'
247447e880d6SBram Moolenaar                .. ' is ' ..
247547e880d6SBram Moolenaar                   'a message'
247647e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
247747e880d6SBram Moolenaar  END
247847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
247947e880d6SBram Moolenaarenddef
248047e880d6SBram Moolenaar
2481f93c7feaSBram Moolenaardef Test_echoerr_cmd()
248240ee466cSBram Moolenaar  try
248340ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
248440ee466cSBram Moolenaar  catch
248540ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
248640ee466cSBram Moolenaar  endtry
2487f93c7feaSBram Moolenaarenddef
2488f93c7feaSBram Moolenaar
248947e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2490f5be8cdbSBram Moolenaar  # only checks line continuation
2491cfcd011fSBram Moolenaar  var lines =<< trim END
249247e880d6SBram Moolenaar      vim9script
249347e880d6SBram Moolenaar      try
249447e880d6SBram Moolenaar        echoerr 'this'
249547e880d6SBram Moolenaar                .. ' is ' ..
249647e880d6SBram Moolenaar                   'wrong'
249747e880d6SBram Moolenaar      catch
249847e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
249947e880d6SBram Moolenaar      endtry
250047e880d6SBram Moolenaar  END
250147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
250247e880d6SBram Moolenaarenddef
250347e880d6SBram Moolenaar
250441fe0617SBram Moolenaardef Test_for_outside_of_function()
2505cfcd011fSBram Moolenaar  var lines =<< trim END
250641fe0617SBram Moolenaar    vim9script
250741fe0617SBram Moolenaar    new
250841fe0617SBram Moolenaar    for var in range(0, 3)
250941fe0617SBram Moolenaar      append(line('$'), var)
251041fe0617SBram Moolenaar    endfor
251141fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
251241fe0617SBram Moolenaar    bwipe!
2513522eefd9SBram Moolenaar
2514522eefd9SBram Moolenaar    var result = ''
2515522eefd9SBram Moolenaar    for i in [1, 2, 3]
2516522eefd9SBram Moolenaar      var loop = ' loop ' .. i
2517522eefd9SBram Moolenaar      result ..= loop
2518522eefd9SBram Moolenaar    endfor
2519522eefd9SBram Moolenaar    assert_equal(' loop 1 loop 2 loop 3', result)
252041fe0617SBram Moolenaar  END
252141fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
252241fe0617SBram Moolenaar  source Xvim9for.vim
252341fe0617SBram Moolenaar  delete('Xvim9for.vim')
252441fe0617SBram Moolenaarenddef
25258a7d6542SBram Moolenaar
2526e8c4abbbSBram Moolenaardef Test_for_loop()
2527f2253963SBram Moolenaar  var lines =<< trim END
2528cfcd011fSBram Moolenaar      var result = ''
2529e8c4abbbSBram Moolenaar      for cnt in range(7)
2530e8c4abbbSBram Moolenaar        if cnt == 4
2531e8c4abbbSBram Moolenaar          break
2532e8c4abbbSBram Moolenaar        endif
2533e8c4abbbSBram Moolenaar        if cnt == 2
2534e8c4abbbSBram Moolenaar          continue
2535e8c4abbbSBram Moolenaar        endif
2536e8c4abbbSBram Moolenaar        result ..= cnt .. '_'
2537e8c4abbbSBram Moolenaar      endfor
2538e8c4abbbSBram Moolenaar      assert_equal('0_1_3_', result)
25390ad3e894SBram Moolenaar
2540cfcd011fSBram Moolenaar      var concat = ''
25410ad3e894SBram Moolenaar      for str in eval('["one", "two"]')
25420ad3e894SBram Moolenaar        concat ..= str
25430ad3e894SBram Moolenaar      endfor
25440ad3e894SBram Moolenaar      assert_equal('onetwo', concat)
254538bd8de5SBram Moolenaar
254638bd8de5SBram Moolenaar      var total = 0
254738bd8de5SBram Moolenaar      for nr in
254838bd8de5SBram Moolenaar          [1, 2, 3]
254938bd8de5SBram Moolenaar        total += nr
255038bd8de5SBram Moolenaar      endfor
255138bd8de5SBram Moolenaar      assert_equal(6, total)
255238bd8de5SBram Moolenaar
255338bd8de5SBram Moolenaar      total = 0
255438bd8de5SBram Moolenaar      for nr
255538bd8de5SBram Moolenaar        in [1, 2, 3]
255638bd8de5SBram Moolenaar        total += nr
255738bd8de5SBram Moolenaar      endfor
255838bd8de5SBram Moolenaar      assert_equal(6, total)
255938bd8de5SBram Moolenaar
256038bd8de5SBram Moolenaar      total = 0
256138bd8de5SBram Moolenaar      for nr
256238bd8de5SBram Moolenaar        in
256338bd8de5SBram Moolenaar        [1, 2, 3]
256438bd8de5SBram Moolenaar        total += nr
256538bd8de5SBram Moolenaar      endfor
256638bd8de5SBram Moolenaar      assert_equal(6, total)
2567036d0714SBram Moolenaar
2568a3589a0dSBram Moolenaar      # with type
2569a3589a0dSBram Moolenaar      total = 0
2570a3589a0dSBram Moolenaar      for n: number in [1, 2, 3]
2571a3589a0dSBram Moolenaar        total += n
2572a3589a0dSBram Moolenaar      endfor
2573a3589a0dSBram Moolenaar      assert_equal(6, total)
2574a3589a0dSBram Moolenaar
2575fe090eb5SBram Moolenaar      var chars = ''
2576fe090eb5SBram Moolenaar      for s: string in 'foobar'
2577fe090eb5SBram Moolenaar        chars ..= s
2578fe090eb5SBram Moolenaar      endfor
2579fe090eb5SBram Moolenaar      assert_equal('foobar', chars)
2580fe090eb5SBram Moolenaar
25815ede5b23SBram Moolenaar      chars = ''
25825ede5b23SBram Moolenaar      for x: string in {a: 'a', b: 'b'}->values()
25835ede5b23SBram Moolenaar        chars ..= x
25845ede5b23SBram Moolenaar      endfor
25855ede5b23SBram Moolenaar      assert_equal('ab', chars)
25865ede5b23SBram Moolenaar
2587a3589a0dSBram Moolenaar      # unpack with type
2588f2253963SBram Moolenaar      var res = ''
2589a3589a0dSBram Moolenaar      for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2590a3589a0dSBram Moolenaar        res ..= n .. s
2591a3589a0dSBram Moolenaar      endfor
2592a3589a0dSBram Moolenaar      assert_equal('1a2b', res)
2593a3589a0dSBram Moolenaar
2594444d8783SBram Moolenaar      # unpack with one var
2595444d8783SBram Moolenaar      var reslist = []
2596444d8783SBram Moolenaar      for [x] in [['aaa'], ['bbb']]
2597444d8783SBram Moolenaar        reslist->add(x)
2598444d8783SBram Moolenaar      endfor
2599444d8783SBram Moolenaar      assert_equal(['aaa', 'bbb'], reslist)
2600444d8783SBram Moolenaar
2601a3589a0dSBram Moolenaar      # loop over string
2602a3589a0dSBram Moolenaar      res = ''
260374e54fcbSBram Moolenaar      for c in 'aéc̀d'
260474e54fcbSBram Moolenaar        res ..= c .. '-'
260574e54fcbSBram Moolenaar      endfor
260674e54fcbSBram Moolenaar      assert_equal('a-é-c̀-d-', res)
260774e54fcbSBram Moolenaar
260874e54fcbSBram Moolenaar      res = ''
260974e54fcbSBram Moolenaar      for c in ''
261074e54fcbSBram Moolenaar        res ..= c .. '-'
261174e54fcbSBram Moolenaar      endfor
261274e54fcbSBram Moolenaar      assert_equal('', res)
261374e54fcbSBram Moolenaar
261474e54fcbSBram Moolenaar      res = ''
261574e54fcbSBram Moolenaar      for c in test_null_string()
261674e54fcbSBram Moolenaar        res ..= c .. '-'
261774e54fcbSBram Moolenaar      endfor
261874e54fcbSBram Moolenaar      assert_equal('', res)
2619f2253963SBram Moolenaar
2620f2253963SBram Moolenaar      var foo: list<dict<any>> = [
2621f2253963SBram Moolenaar              {a: 'Cat'}
2622f2253963SBram Moolenaar            ]
2623f2253963SBram Moolenaar      for dd in foo
2624f2253963SBram Moolenaar        dd.counter = 12
2625f2253963SBram Moolenaar      endfor
2626f2253963SBram Moolenaar      assert_equal([{a: 'Cat', counter: 12}], foo)
2627ad2d4969SBram Moolenaar
2628ad2d4969SBram Moolenaar      reslist = []
2629ad2d4969SBram Moolenaar      for _ in range(3)
2630ad2d4969SBram Moolenaar        reslist->add('x')
2631ad2d4969SBram Moolenaar      endfor
2632ad2d4969SBram Moolenaar      assert_equal(['x', 'x', 'x'], reslist)
2633f2253963SBram Moolenaar  END
2634f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2635e8c4abbbSBram Moolenaarenddef
2636e8c4abbbSBram Moolenaar
26372eb6fc3bSBram Moolenaardef Test_for_loop_with_closure()
26382eb6fc3bSBram Moolenaar  var lines =<< trim END
26392eb6fc3bSBram Moolenaar      var flist: list<func>
26402eb6fc3bSBram Moolenaar      for i in range(5)
26412eb6fc3bSBram Moolenaar        var inloop = i
26422eb6fc3bSBram Moolenaar        flist[i] = () => inloop
26432eb6fc3bSBram Moolenaar      endfor
26442eb6fc3bSBram Moolenaar      for i in range(5)
26452eb6fc3bSBram Moolenaar        assert_equal(4, flist[i]())
26462eb6fc3bSBram Moolenaar      endfor
26472eb6fc3bSBram Moolenaar  END
26482eb6fc3bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
26492eb6fc3bSBram Moolenaar
26502eb6fc3bSBram Moolenaar  lines =<< trim END
26512eb6fc3bSBram Moolenaar      var flist: list<func>
26522eb6fc3bSBram Moolenaar      for i in range(5)
26532eb6fc3bSBram Moolenaar        var inloop = i
26542eb6fc3bSBram Moolenaar        flist[i] = () => {
26552eb6fc3bSBram Moolenaar              return inloop
26562eb6fc3bSBram Moolenaar            }
26572eb6fc3bSBram Moolenaar      endfor
26582eb6fc3bSBram Moolenaar      for i in range(5)
26592eb6fc3bSBram Moolenaar        assert_equal(4, flist[i]())
26602eb6fc3bSBram Moolenaar      endfor
26612eb6fc3bSBram Moolenaar  END
26622eb6fc3bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
26632eb6fc3bSBram Moolenaarenddef
26642eb6fc3bSBram Moolenaar
2665e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2666442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:')
2667442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:')
2668442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:')
2669442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2670442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2671442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:')
2672d4ab807dSBram Moolenaar  CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2673822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
26742d870f8dSBram Moolenaar  delfunc! g:Func
2675675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2676675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2677675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
267874e54fcbSBram Moolenaar
267974e54fcbSBram Moolenaar  # wrong type detected at compile time
268074e54fcbSBram Moolenaar  CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
268174e54fcbSBram Moolenaar
268274e54fcbSBram Moolenaar  # wrong type detected at runtime
268374e54fcbSBram Moolenaar  g:adict = {a: 1}
268474e54fcbSBram Moolenaar  CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
268574e54fcbSBram Moolenaar  unlet g:adict
2686f6a8d420SBram Moolenaar
2687f6a8d420SBram Moolenaar  var lines =<< trim END
2688f6a8d420SBram Moolenaar      var d: list<dict<any>> = [{a: 0}]
2689f6a8d420SBram Moolenaar      for e in d
2690f6a8d420SBram Moolenaar        e = {a: 0, b: ''}
2691f6a8d420SBram Moolenaar      endfor
2692f6a8d420SBram Moolenaar  END
2693f6a8d420SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3)
2694fe090eb5SBram Moolenaar
2695fe090eb5SBram Moolenaar  lines =<< trim END
2696fe090eb5SBram Moolenaar      for nr: number in ['foo']
2697fe090eb5SBram Moolenaar      endfor
2698fe090eb5SBram Moolenaar  END
2699fe090eb5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2700404557e6SBram Moolenaar
2701404557e6SBram Moolenaar  lines =<< trim END
2702404557e6SBram Moolenaar      for n : number in [1, 2]
2703404557e6SBram Moolenaar        echo n
2704404557e6SBram Moolenaar      endfor
2705404557e6SBram Moolenaar  END
2706404557e6SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1059:', 1)
2707efc5db52SBram Moolenaar
2708efc5db52SBram Moolenaar  lines =<< trim END
2709efc5db52SBram Moolenaar      var d: dict<number> = {a: 1, b: 2}
2710efc5db52SBram Moolenaar      for [k: job, v: job] in d->items()
2711efc5db52SBram Moolenaar        echo k v
2712efc5db52SBram Moolenaar      endfor
2713efc5db52SBram Moolenaar  END
2714efc5db52SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2)
2715e8c4abbbSBram Moolenaarenddef
2716e8c4abbbSBram Moolenaar
2717ea87069dSBram Moolenaardef Test_for_loop_script_var()
2718ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2719ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2720ea87069dSBram Moolenaar
2721ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2722ea87069dSBram Moolenaar  var lines =<< trim END
2723ea87069dSBram Moolenaar    vim9script
2724ea87069dSBram Moolenaar    var total = 0
2725ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2726ea87069dSBram Moolenaar      total += s:var
2727ea87069dSBram Moolenaar    endfor
2728ea87069dSBram Moolenaar    assert_equal(6, total)
2729ea87069dSBram Moolenaar
2730ea87069dSBram Moolenaar    total = 0
2731ea87069dSBram Moolenaar    for var in [1, 2, 3]
2732ea87069dSBram Moolenaar      total += var
2733ea87069dSBram Moolenaar    endfor
2734ea87069dSBram Moolenaar    assert_equal(6, total)
2735ea87069dSBram Moolenaar  END
2736ea87069dSBram Moolenaarenddef
2737ea87069dSBram Moolenaar
2738792f786aSBram Moolenaardef Test_for_loop_unpack()
27394b8a0651SBram Moolenaar  var lines =<< trim END
2740792f786aSBram Moolenaar      var result = []
2741792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2742792f786aSBram Moolenaar        result->add(v1)
2743792f786aSBram Moolenaar        result->add(v2)
2744792f786aSBram Moolenaar      endfor
2745792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2746792f786aSBram Moolenaar
2747792f786aSBram Moolenaar      result = []
2748792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2749792f786aSBram Moolenaar        result->add(v1)
2750792f786aSBram Moolenaar        result->add(v2)
2751792f786aSBram Moolenaar        result->add(v3)
2752792f786aSBram Moolenaar      endfor
2753792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2754792f786aSBram Moolenaar
27554b8a0651SBram Moolenaar      result = []
27564b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
27574b8a0651SBram Moolenaar        result->add(&ts)
27584b8a0651SBram Moolenaar        result->add(&sw)
27594b8a0651SBram Moolenaar      endfor
27604b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
27614b8a0651SBram Moolenaar
27624b8a0651SBram Moolenaar      var slist: list<string>
27634b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
27644b8a0651SBram Moolenaar        slist->add($LOOPVAR)
27654b8a0651SBram Moolenaar        slist->add(@r)
27664b8a0651SBram Moolenaar        slist->add(v:errmsg)
27674b8a0651SBram Moolenaar      endfor
27684b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
27694b8a0651SBram Moolenaar
27704b8a0651SBram Moolenaar      slist = []
27714b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
27724b8a0651SBram Moolenaar        slist->add(g:globalvar)
27734b8a0651SBram Moolenaar        slist->add(b:bufvar)
27744b8a0651SBram Moolenaar        slist->add(w:winvar)
27754b8a0651SBram Moolenaar        slist->add(t:tabvar)
27764b8a0651SBram Moolenaar      endfor
27774b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2778f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
2779b777da9bSBram Moolenaar
2780b777da9bSBram Moolenaar      var res = []
2781b777da9bSBram Moolenaar      for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2782b777da9bSBram Moolenaar        res->add(n)
2783b777da9bSBram Moolenaar      endfor
2784b777da9bSBram Moolenaar      assert_equal([2, 5], res)
27854b8a0651SBram Moolenaar  END
27864b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
27874b8a0651SBram Moolenaar
27884b8a0651SBram Moolenaar  lines =<< trim END
2789792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2790792f786aSBram Moolenaar        echo v1 v2
2791792f786aSBram Moolenaar      endfor
2792792f786aSBram Moolenaar  END
2793792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2794792f786aSBram Moolenaar
2795792f786aSBram Moolenaar  lines =<< trim END
2796792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2797792f786aSBram Moolenaar        echo v1 v2
2798792f786aSBram Moolenaar      endfor
2799792f786aSBram Moolenaar  END
2800792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2801792f786aSBram Moolenaar
2802792f786aSBram Moolenaar  lines =<< trim END
2803792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2804792f786aSBram Moolenaar        echo v1
2805792f786aSBram Moolenaar      endfor
2806792f786aSBram Moolenaar  END
2807792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2808792f786aSBram Moolenaarenddef
2809792f786aSBram Moolenaar
2810c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2811f2253963SBram Moolenaar  var lines =<< trim END
2812c150c09eSBram Moolenaar      var looped = 0
2813c150c09eSBram Moolenaar      var cleanup = 0
2814c150c09eSBram Moolenaar      for i in range(3)
2815c150c09eSBram Moolenaar        looped += 1
2816c150c09eSBram Moolenaar        try
2817c150c09eSBram Moolenaar          eval [][0]
2818c150c09eSBram Moolenaar        catch
2819c150c09eSBram Moolenaar          continue
2820c150c09eSBram Moolenaar        finally
2821c150c09eSBram Moolenaar          cleanup += 1
2822c150c09eSBram Moolenaar        endtry
2823c150c09eSBram Moolenaar      endfor
2824c150c09eSBram Moolenaar      assert_equal(3, looped)
2825c150c09eSBram Moolenaar      assert_equal(3, cleanup)
2826f2253963SBram Moolenaar  END
2827f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2828c150c09eSBram Moolenaarenddef
2829c150c09eSBram Moolenaar
2830d0df1aacSBram Moolenaardef Test_while_loop()
2831cfcd011fSBram Moolenaar  var result = ''
2832cfcd011fSBram Moolenaar  var cnt = 0
2833d0df1aacSBram Moolenaar  while cnt < 555
2834d0df1aacSBram Moolenaar    if cnt == 3
2835d0df1aacSBram Moolenaar      break
2836d0df1aacSBram Moolenaar    endif
2837d0df1aacSBram Moolenaar    cnt += 1
2838d0df1aacSBram Moolenaar    if cnt == 2
2839d0df1aacSBram Moolenaar      continue
2840d0df1aacSBram Moolenaar    endif
2841d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2842d0df1aacSBram Moolenaar  endwhile
2843d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2844dee37dc7SBram Moolenaar
2845dee37dc7SBram Moolenaar  var s = ''
28460123cc1eSBram Moolenaar  while s == 'x' # {comment}
2847dee37dc7SBram Moolenaar  endwhile
2848d0df1aacSBram Moolenaarenddef
2849d0df1aacSBram Moolenaar
2850e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2851675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2852675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2853675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2854675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2855675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2856675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2857675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
28586628b7ebSBram Moolenaar
28596628b7ebSBram Moolenaar  var lines =<< trim END
28606628b7ebSBram Moolenaar      var s = ''
28616628b7ebSBram Moolenaar      while s = ''
28626628b7ebSBram Moolenaar      endwhile
28636628b7ebSBram Moolenaar  END
28646628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2865bd5da371SBram Moolenaarenddef
2866bd5da371SBram Moolenaar
28679645e2d9SBram Moolenaardef Test_interrupt_loop()
2868cfcd011fSBram Moolenaar  var caught = false
2869cfcd011fSBram Moolenaar  var x = 0
287097acfc78SBram Moolenaar  try
28719645e2d9SBram Moolenaar    while 1
28729645e2d9SBram Moolenaar      x += 1
28739645e2d9SBram Moolenaar      if x == 100
28749645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
28759645e2d9SBram Moolenaar      endif
28769645e2d9SBram Moolenaar    endwhile
287797acfc78SBram Moolenaar  catch
287897acfc78SBram Moolenaar    caught = true
287997acfc78SBram Moolenaar    assert_equal(100, x)
288097acfc78SBram Moolenaar  endtry
288197acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
288225859dd7SBram Moolenaar  # consume the CTRL-C
288325859dd7SBram Moolenaar  getchar(0)
28849645e2d9SBram Moolenaarenddef
288520431c9dSBram Moolenaar
28864fdae999SBram Moolenaardef Test_automatic_line_continuation()
2887cfcd011fSBram Moolenaar  var mylist = [
28884fdae999SBram Moolenaar      'one',
28894fdae999SBram Moolenaar      'two',
28904fdae999SBram Moolenaar      'three',
2891f5be8cdbSBram Moolenaar      ] # comment
28924fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
28934fdae999SBram Moolenaar
2894cfcd011fSBram Moolenaar  var mydict = {
2895e0de171eSBram Moolenaar      ['one']: 1,
2896e0de171eSBram Moolenaar      ['two']: 2,
2897e0de171eSBram Moolenaar      ['three']:
28984fdae999SBram Moolenaar          3,
2899f5be8cdbSBram Moolenaar      } # comment
2900e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2901e0de171eSBram Moolenaar  mydict = {
29022c330432SBram Moolenaar      one: 1,  # comment
29032c330432SBram Moolenaar      two:     # comment
29042c330432SBram Moolenaar           2,  # comment
29052c330432SBram Moolenaar      three: 3 # comment
29062c330432SBram Moolenaar      }
2907e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2908e0de171eSBram Moolenaar  mydict = {
29092c330432SBram Moolenaar      one: 1,
29104fdae999SBram Moolenaar      two:
29114fdae999SBram Moolenaar           2,
29122c330432SBram Moolenaar      three: 3
29134fdae999SBram Moolenaar      }
2914e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2915e6085c53SBram Moolenaar
2916e6085c53SBram Moolenaar  assert_equal(
2917e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2918e6085c53SBram Moolenaar        split('one two three')
2919e6085c53SBram Moolenaar        )
29204fdae999SBram Moolenaarenddef
29214fdae999SBram Moolenaar
29227a092245SBram Moolenaardef Test_vim9_comment()
29237a092245SBram Moolenaar  CheckScriptSuccess([
29247a092245SBram Moolenaar      'vim9script',
29257a092245SBram Moolenaar      '# something',
292693f82cbeSBram Moolenaar      '#something',
292793f82cbeSBram Moolenaar      '#{something',
29287a092245SBram Moolenaar      ])
292993f82cbeSBram Moolenaar
293093f82cbeSBram Moolenaar  split Xfile
293193f82cbeSBram Moolenaar  CheckScriptSuccess([
293293f82cbeSBram Moolenaar      'vim9script',
293393f82cbeSBram Moolenaar      'edit #something',
293493f82cbeSBram Moolenaar      ])
293593f82cbeSBram Moolenaar  CheckScriptSuccess([
293693f82cbeSBram Moolenaar      'vim9script',
293793f82cbeSBram Moolenaar      'edit #{something',
293893f82cbeSBram Moolenaar      ])
293993f82cbeSBram Moolenaar  close
294093f82cbeSBram Moolenaar
29417a092245SBram Moolenaar  CheckScriptFailure([
29427a092245SBram Moolenaar      'vim9script',
29437a092245SBram Moolenaar      ':# something',
29447a092245SBram Moolenaar      ], 'E488:')
29457a092245SBram Moolenaar  CheckScriptFailure([
29467a092245SBram Moolenaar      '# something',
29477a092245SBram Moolenaar      ], 'E488:')
29487a092245SBram Moolenaar  CheckScriptFailure([
29497a092245SBram Moolenaar      ':# something',
29507a092245SBram Moolenaar      ], 'E488:')
29517a092245SBram Moolenaar
29524a8d9f2eSBram Moolenaar  { # block start
29534a8d9f2eSBram Moolenaar  } # block end
29544a8d9f2eSBram Moolenaar  CheckDefFailure([
29554a8d9f2eSBram Moolenaar      '{# comment',
29564a8d9f2eSBram Moolenaar      ], 'E488:')
29574a8d9f2eSBram Moolenaar  CheckDefFailure([
29584a8d9f2eSBram Moolenaar      '{',
29594a8d9f2eSBram Moolenaar      '}# comment',
29604a8d9f2eSBram Moolenaar      ], 'E488:')
29614a8d9f2eSBram Moolenaar
29624a8d9f2eSBram Moolenaar  echo "yes" # comment
29634a8d9f2eSBram Moolenaar  CheckDefFailure([
29644a8d9f2eSBram Moolenaar      'echo "yes"# comment',
29654a8d9f2eSBram Moolenaar      ], 'E488:')
29667a092245SBram Moolenaar  CheckScriptSuccess([
29677a092245SBram Moolenaar      'vim9script',
29687a092245SBram Moolenaar      'echo "yes" # something',
29697a092245SBram Moolenaar      ])
29707a092245SBram Moolenaar  CheckScriptFailure([
29717a092245SBram Moolenaar      'vim9script',
29727a092245SBram Moolenaar      'echo "yes"# something',
29737a092245SBram Moolenaar      ], 'E121:')
29747a092245SBram Moolenaar  CheckScriptFailure([
29757a092245SBram Moolenaar      'vim9script',
29767a092245SBram Moolenaar      'echo# something',
2977f8103f27SBram Moolenaar      ], 'E1144:')
29787a092245SBram Moolenaar  CheckScriptFailure([
29797a092245SBram Moolenaar      'echo "yes" # something',
29807a092245SBram Moolenaar      ], 'E121:')
29817a092245SBram Moolenaar
29824a8d9f2eSBram Moolenaar  exe "echo" # comment
29834a8d9f2eSBram Moolenaar  CheckDefFailure([
29844a8d9f2eSBram Moolenaar      'exe "echo"# comment',
29854a8d9f2eSBram Moolenaar      ], 'E488:')
29864a8d9f2eSBram Moolenaar  CheckScriptSuccess([
29874a8d9f2eSBram Moolenaar      'vim9script',
29884a8d9f2eSBram Moolenaar      'exe "echo" # something',
29894a8d9f2eSBram Moolenaar      ])
29904a8d9f2eSBram Moolenaar  CheckScriptFailure([
29914a8d9f2eSBram Moolenaar      'vim9script',
29924a8d9f2eSBram Moolenaar      'exe "echo"# something',
29934a8d9f2eSBram Moolenaar      ], 'E121:')
29944a8d9f2eSBram Moolenaar  CheckScriptFailure([
29954a8d9f2eSBram Moolenaar      'vim9script',
29964a8d9f2eSBram Moolenaar      'exe# something',
2997f8103f27SBram Moolenaar      ], 'E1144:')
29984a8d9f2eSBram Moolenaar  CheckScriptFailure([
29994a8d9f2eSBram Moolenaar      'exe "echo" # something',
30004a8d9f2eSBram Moolenaar      ], 'E121:')
30014a8d9f2eSBram Moolenaar
30027a092245SBram Moolenaar  CheckDefFailure([
30037a092245SBram Moolenaar      'try# comment',
30047a092245SBram Moolenaar      '  echo "yes"',
30057a092245SBram Moolenaar      'catch',
30067a092245SBram Moolenaar      'endtry',
3007f8103f27SBram Moolenaar      ], 'E1144:')
30082c5ed4e3SBram Moolenaar  CheckScriptFailure([
30092c5ed4e3SBram Moolenaar      'vim9script',
30102c5ed4e3SBram Moolenaar      'try# comment',
30112c5ed4e3SBram Moolenaar      'echo "yes"',
3012f8103f27SBram Moolenaar      ], 'E1144:')
30137a092245SBram Moolenaar  CheckDefFailure([
30147a092245SBram Moolenaar      'try',
3015a72cfb80SBram Moolenaar      '  throw#comment',
3016a72cfb80SBram Moolenaar      'catch',
3017a72cfb80SBram Moolenaar      'endtry',
3018f8103f27SBram Moolenaar      ], 'E1144:')
3019a72cfb80SBram Moolenaar  CheckDefFailure([
3020a72cfb80SBram Moolenaar      'try',
3021a72cfb80SBram Moolenaar      '  throw "yes"#comment',
3022a72cfb80SBram Moolenaar      'catch',
3023a72cfb80SBram Moolenaar      'endtry',
3024a72cfb80SBram Moolenaar      ], 'E488:')
3025a72cfb80SBram Moolenaar  CheckDefFailure([
3026a72cfb80SBram Moolenaar      'try',
30277a092245SBram Moolenaar      '  echo "yes"',
30287a092245SBram Moolenaar      'catch# comment',
30297a092245SBram Moolenaar      'endtry',
3030f8103f27SBram Moolenaar      ], 'E1144:')
30312c5ed4e3SBram Moolenaar  CheckScriptFailure([
30322c5ed4e3SBram Moolenaar      'vim9script',
30332c5ed4e3SBram Moolenaar      'try',
30342c5ed4e3SBram Moolenaar      '  echo "yes"',
30352c5ed4e3SBram Moolenaar      'catch# comment',
30362c5ed4e3SBram Moolenaar      'endtry',
3037f8103f27SBram Moolenaar      ], 'E1144:')
30382c5ed4e3SBram Moolenaar  CheckDefFailure([
30392c5ed4e3SBram Moolenaar      'try',
30402c5ed4e3SBram Moolenaar      '  echo "yes"',
30412c5ed4e3SBram Moolenaar      'catch /pat/# comment',
30422c5ed4e3SBram Moolenaar      'endtry',
30432c5ed4e3SBram Moolenaar      ], 'E488:')
30447a092245SBram Moolenaar  CheckDefFailure([
30457a092245SBram Moolenaar      'try',
30467a092245SBram Moolenaar      'echo "yes"',
30477a092245SBram Moolenaar      'catch',
30487a092245SBram Moolenaar      'endtry# comment',
3049f8103f27SBram Moolenaar      ], 'E1144:')
30502c5ed4e3SBram Moolenaar  CheckScriptFailure([
30512c5ed4e3SBram Moolenaar      'vim9script',
30522c5ed4e3SBram Moolenaar      'try',
30532c5ed4e3SBram Moolenaar      '  echo "yes"',
30542c5ed4e3SBram Moolenaar      'catch',
30552c5ed4e3SBram Moolenaar      'endtry# comment',
3056f8103f27SBram Moolenaar      ], 'E1144:')
30572c5ed4e3SBram Moolenaar
30582c5ed4e3SBram Moolenaar  CheckScriptSuccess([
30592c5ed4e3SBram Moolenaar      'vim9script',
30602c5ed4e3SBram Moolenaar      'hi # comment',
30612c5ed4e3SBram Moolenaar      ])
30622c5ed4e3SBram Moolenaar  CheckScriptFailure([
30632c5ed4e3SBram Moolenaar      'vim9script',
30642c5ed4e3SBram Moolenaar      'hi# comment',
3065f8103f27SBram Moolenaar      ], 'E1144:')
30661966c248SBram Moolenaar  CheckScriptSuccess([
30671966c248SBram Moolenaar      'vim9script',
30681966c248SBram Moolenaar      'hi Search # comment',
30691966c248SBram Moolenaar      ])
30701966c248SBram Moolenaar  CheckScriptFailure([
30711966c248SBram Moolenaar      'vim9script',
30721966c248SBram Moolenaar      'hi Search# comment',
30731966c248SBram Moolenaar      ], 'E416:')
30741966c248SBram Moolenaar  CheckScriptSuccess([
30751966c248SBram Moolenaar      'vim9script',
30761966c248SBram Moolenaar      'hi link This Search # comment',
30771966c248SBram Moolenaar      ])
30781966c248SBram Moolenaar  CheckScriptFailure([
30791966c248SBram Moolenaar      'vim9script',
30801966c248SBram Moolenaar      'hi link This That# comment',
30811966c248SBram Moolenaar      ], 'E413:')
30821966c248SBram Moolenaar  CheckScriptSuccess([
30831966c248SBram Moolenaar      'vim9script',
30841966c248SBram Moolenaar      'hi clear This # comment',
30851966c248SBram Moolenaar      'hi clear # comment',
30861966c248SBram Moolenaar      ])
3087f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
3088f5be8cdbSBram Moolenaar  # hi clear This# comment',
30891966c248SBram Moolenaar  CheckScriptFailure([
30901966c248SBram Moolenaar      'vim9script',
30911966c248SBram Moolenaar      'hi clear# comment',
30921966c248SBram Moolenaar      ], 'E416:')
30931966c248SBram Moolenaar
30941966c248SBram Moolenaar  CheckScriptSuccess([
30951966c248SBram Moolenaar      'vim9script',
30961966c248SBram Moolenaar      'hi Group term=bold',
30971966c248SBram Moolenaar      'match Group /todo/ # comment',
30981966c248SBram Moolenaar      ])
30991966c248SBram Moolenaar  CheckScriptFailure([
31001966c248SBram Moolenaar      'vim9script',
31011966c248SBram Moolenaar      'hi Group term=bold',
31021966c248SBram Moolenaar      'match Group /todo/# comment',
31031966c248SBram Moolenaar      ], 'E488:')
31041966c248SBram Moolenaar  CheckScriptSuccess([
31051966c248SBram Moolenaar      'vim9script',
31061966c248SBram Moolenaar      'match # comment',
31071966c248SBram Moolenaar      ])
31081966c248SBram Moolenaar  CheckScriptFailure([
31091966c248SBram Moolenaar      'vim9script',
31101966c248SBram Moolenaar      'match# comment',
3111f8103f27SBram Moolenaar      ], 'E1144:')
31121966c248SBram Moolenaar  CheckScriptSuccess([
31131966c248SBram Moolenaar      'vim9script',
31141966c248SBram Moolenaar      'match none # comment',
31151966c248SBram Moolenaar      ])
31161966c248SBram Moolenaar  CheckScriptFailure([
31171966c248SBram Moolenaar      'vim9script',
31181966c248SBram Moolenaar      'match none# comment',
31191966c248SBram Moolenaar      ], 'E475:')
31201966c248SBram Moolenaar
31211966c248SBram Moolenaar  CheckScriptSuccess([
31221966c248SBram Moolenaar      'vim9script',
31231966c248SBram Moolenaar      'menutrans clear # comment',
31241966c248SBram Moolenaar      ])
31251966c248SBram Moolenaar  CheckScriptFailure([
31261966c248SBram Moolenaar      'vim9script',
31271966c248SBram Moolenaar      'menutrans clear# comment text',
31281966c248SBram Moolenaar      ], 'E474:')
31291966c248SBram Moolenaar
31301966c248SBram Moolenaar  CheckScriptSuccess([
31311966c248SBram Moolenaar      'vim9script',
31321966c248SBram Moolenaar      'syntax clear # comment',
31331966c248SBram Moolenaar      ])
31341966c248SBram Moolenaar  CheckScriptFailure([
31351966c248SBram Moolenaar      'vim9script',
31361966c248SBram Moolenaar      'syntax clear# comment text',
31371966c248SBram Moolenaar      ], 'E28:')
31381966c248SBram Moolenaar  CheckScriptSuccess([
31391966c248SBram Moolenaar      'vim9script',
31401966c248SBram Moolenaar      'syntax keyword Word some',
31411966c248SBram Moolenaar      'syntax clear Word # comment',
31421966c248SBram Moolenaar      ])
31431966c248SBram Moolenaar  CheckScriptFailure([
31441966c248SBram Moolenaar      'vim9script',
31451966c248SBram Moolenaar      'syntax keyword Word some',
31461966c248SBram Moolenaar      'syntax clear Word# comment text',
31471966c248SBram Moolenaar      ], 'E28:')
31481966c248SBram Moolenaar
31491966c248SBram Moolenaar  CheckScriptSuccess([
31501966c248SBram Moolenaar      'vim9script',
31511966c248SBram Moolenaar      'syntax list # comment',
31521966c248SBram Moolenaar      ])
31531966c248SBram Moolenaar  CheckScriptFailure([
31541966c248SBram Moolenaar      'vim9script',
31551966c248SBram Moolenaar      'syntax list# comment text',
31561966c248SBram Moolenaar      ], 'E28:')
31571966c248SBram Moolenaar
31581966c248SBram Moolenaar  CheckScriptSuccess([
31591966c248SBram Moolenaar      'vim9script',
31601966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
31611966c248SBram Moolenaar      ])
31621966c248SBram Moolenaar  CheckScriptFailure([
31631966c248SBram Moolenaar      'vim9script',
31641966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
31651966c248SBram Moolenaar      ], 'E475:')
31661966c248SBram Moolenaar
31671966c248SBram Moolenaar  CheckScriptSuccess([
31681966c248SBram Moolenaar      'vim9script',
31691966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
31701966c248SBram Moolenaar      ])
31711966c248SBram Moolenaar  CheckScriptFailure([
31721966c248SBram Moolenaar      'vim9script',
31731966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
31741966c248SBram Moolenaar      ], 'E789:')
31751966c248SBram Moolenaar
31761966c248SBram Moolenaar  CheckScriptSuccess([
31771966c248SBram Moolenaar      'vim9script',
31781966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
31791966c248SBram Moolenaar      ])
31801966c248SBram Moolenaar  CheckScriptFailure([
31811966c248SBram Moolenaar      'vim9script',
31821966c248SBram Moolenaar      'syntax match Word /pat/# comment',
31831966c248SBram Moolenaar      ], 'E402:')
31841966c248SBram Moolenaar
31851966c248SBram Moolenaar  CheckScriptSuccess([
31861966c248SBram Moolenaar      'vim9script',
31871966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
31881966c248SBram Moolenaar      ])
31891966c248SBram Moolenaar  CheckScriptFailure([
31901966c248SBram Moolenaar      'vim9script',
31911966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
31921966c248SBram Moolenaar      ], 'E475:')
31931966c248SBram Moolenaar  CheckScriptFailure([
31941966c248SBram Moolenaar      'vim9script',
31951966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
31961966c248SBram Moolenaar      ], 'E406:')
31971966c248SBram Moolenaar  CheckScriptFailure([
31981966c248SBram Moolenaar      'vim9script',
31991966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
32001966c248SBram Moolenaar      ], 'E475:')
32011966c248SBram Moolenaar
32021966c248SBram Moolenaar  CheckScriptSuccess([
32031966c248SBram Moolenaar      'vim9script',
32041966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
32051966c248SBram Moolenaar      ])
32061966c248SBram Moolenaar  CheckScriptFailure([
32071966c248SBram Moolenaar      'vim9script',
32081966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
3209d032f34aSBram Moolenaar      ], 'E402:')
32101966c248SBram Moolenaar
32111966c248SBram Moolenaar  CheckScriptSuccess([
32121966c248SBram Moolenaar      'vim9script',
32131966c248SBram Moolenaar      'syntax sync # comment',
32141966c248SBram Moolenaar      ])
32151966c248SBram Moolenaar  CheckScriptFailure([
32161966c248SBram Moolenaar      'vim9script',
32171966c248SBram Moolenaar      'syntax sync# comment',
32181966c248SBram Moolenaar      ], 'E404:')
32191966c248SBram Moolenaar  CheckScriptSuccess([
32201966c248SBram Moolenaar      'vim9script',
32211966c248SBram Moolenaar      'syntax sync ccomment # comment',
32221966c248SBram Moolenaar      ])
32231966c248SBram Moolenaar  CheckScriptFailure([
32241966c248SBram Moolenaar      'vim9script',
32251966c248SBram Moolenaar      'syntax sync ccomment# comment',
32261966c248SBram Moolenaar      ], 'E404:')
32271966c248SBram Moolenaar
32281966c248SBram Moolenaar  CheckScriptSuccess([
32291966c248SBram Moolenaar      'vim9script',
32301966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
32311966c248SBram Moolenaar      ])
32321966c248SBram Moolenaar  CheckScriptFailure([
32331966c248SBram Moolenaar      'vim9script',
32341966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
32351966c248SBram Moolenaar      ], 'E475:')
3236a72cfb80SBram Moolenaar
3237a72cfb80SBram Moolenaar  CheckScriptSuccess([
3238a72cfb80SBram Moolenaar      'vim9script',
3239a72cfb80SBram Moolenaar      'command Echo echo # comment',
3240a72cfb80SBram Moolenaar      'command Echo # comment',
32412d870f8dSBram Moolenaar      'delcommand Echo',
3242a72cfb80SBram Moolenaar      ])
3243a72cfb80SBram Moolenaar  CheckScriptFailure([
3244a72cfb80SBram Moolenaar      'vim9script',
3245a72cfb80SBram Moolenaar      'command Echo echo# comment',
3246a72cfb80SBram Moolenaar      'Echo',
3247f8103f27SBram Moolenaar      ], 'E1144:')
32482d870f8dSBram Moolenaar  delcommand Echo
324970249ee8SBram Moolenaar
325070249ee8SBram Moolenaar  var curdir = getcwd()
325170249ee8SBram Moolenaar  CheckScriptSuccess([
325270249ee8SBram Moolenaar      'command Echo cd " comment',
325370249ee8SBram Moolenaar      'Echo',
325470249ee8SBram Moolenaar      'delcommand Echo',
325570249ee8SBram Moolenaar      ])
325670249ee8SBram Moolenaar  CheckScriptSuccess([
3257090728adSBram Moolenaar      'vim9script',
325870249ee8SBram Moolenaar      'command Echo cd # comment',
325970249ee8SBram Moolenaar      'Echo',
326070249ee8SBram Moolenaar      'delcommand Echo',
326170249ee8SBram Moolenaar      ])
326270249ee8SBram Moolenaar  CheckScriptFailure([
326370249ee8SBram Moolenaar      'vim9script',
326470249ee8SBram Moolenaar      'command Echo cd " comment',
326570249ee8SBram Moolenaar      'Echo',
326670249ee8SBram Moolenaar      ], 'E344:')
326770249ee8SBram Moolenaar  delcommand Echo
326870249ee8SBram Moolenaar  chdir(curdir)
326970249ee8SBram Moolenaar
3270a72cfb80SBram Moolenaar  CheckScriptFailure([
3271a72cfb80SBram Moolenaar      'vim9script',
3272a72cfb80SBram Moolenaar      'command Echo# comment',
3273a72cfb80SBram Moolenaar      ], 'E182:')
3274a72cfb80SBram Moolenaar  CheckScriptFailure([
3275a72cfb80SBram Moolenaar      'vim9script',
3276a72cfb80SBram Moolenaar      'command Echo echo',
3277a72cfb80SBram Moolenaar      'command Echo# comment',
3278a72cfb80SBram Moolenaar      ], 'E182:')
32792d870f8dSBram Moolenaar  delcommand Echo
3280a72cfb80SBram Moolenaar
3281a72cfb80SBram Moolenaar  CheckScriptSuccess([
3282a72cfb80SBram Moolenaar      'vim9script',
3283a72cfb80SBram Moolenaar      'function # comment',
3284a72cfb80SBram Moolenaar      ])
3285a72cfb80SBram Moolenaar  CheckScriptFailure([
3286a72cfb80SBram Moolenaar      'vim9script',
32879898107fSBram Moolenaar      'function " comment',
32889898107fSBram Moolenaar      ], 'E129:')
32899898107fSBram Moolenaar  CheckScriptFailure([
32909898107fSBram Moolenaar      'vim9script',
3291a72cfb80SBram Moolenaar      'function# comment',
3292f8103f27SBram Moolenaar      ], 'E1144:')
3293a72cfb80SBram Moolenaar  CheckScriptSuccess([
3294a72cfb80SBram Moolenaar      'vim9script',
3295a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
3296a72cfb80SBram Moolenaar      ])
3297a72cfb80SBram Moolenaar  CheckScriptFailure([
3298a72cfb80SBram Moolenaar      'vim9script',
3299a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
3300a72cfb80SBram Moolenaar      ], 'E488:')
3301a72cfb80SBram Moolenaar
3302a72cfb80SBram Moolenaar  CheckScriptSuccess([
3303a72cfb80SBram Moolenaar      'vim9script',
33044c17ad94SBram Moolenaar      'func g:DeleteMeA()',
3305a72cfb80SBram Moolenaar      'endfunc',
33064c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
3307a72cfb80SBram Moolenaar      ])
3308a72cfb80SBram Moolenaar  CheckScriptFailure([
3309a72cfb80SBram Moolenaar      'vim9script',
33104c17ad94SBram Moolenaar      'func g:DeleteMeB()',
3311a72cfb80SBram Moolenaar      'endfunc',
33124c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
3313a72cfb80SBram Moolenaar      ], 'E488:')
3314a72cfb80SBram Moolenaar
3315a72cfb80SBram Moolenaar  CheckScriptSuccess([
3316a72cfb80SBram Moolenaar      'vim9script',
3317a72cfb80SBram Moolenaar      'call execute("ls") # comment',
3318a72cfb80SBram Moolenaar      ])
3319a72cfb80SBram Moolenaar  CheckScriptFailure([
3320a72cfb80SBram Moolenaar      'vim9script',
3321a72cfb80SBram Moolenaar      'call execute("ls")# comment',
3322a72cfb80SBram Moolenaar      ], 'E488:')
3323e7e4838fSBram Moolenaar
3324e7e4838fSBram Moolenaar  CheckScriptFailure([
3325e7e4838fSBram Moolenaar      'def Test() " comment',
3326e7e4838fSBram Moolenaar      'enddef',
3327e7e4838fSBram Moolenaar      ], 'E488:')
3328e7e4838fSBram Moolenaar  CheckScriptFailure([
3329e7e4838fSBram Moolenaar      'vim9script',
3330e7e4838fSBram Moolenaar      'def Test() " comment',
3331e7e4838fSBram Moolenaar      'enddef',
3332e7e4838fSBram Moolenaar      ], 'E488:')
3333e7e4838fSBram Moolenaar
3334e7e4838fSBram Moolenaar  CheckScriptSuccess([
3335e7e4838fSBram Moolenaar      'func Test() " comment',
3336e7e4838fSBram Moolenaar      'endfunc',
33372d870f8dSBram Moolenaar      'delfunc Test',
3338e7e4838fSBram Moolenaar      ])
33399898107fSBram Moolenaar  CheckScriptSuccess([
3340e7e4838fSBram Moolenaar      'vim9script',
3341e7e4838fSBram Moolenaar      'func Test() " comment',
3342e7e4838fSBram Moolenaar      'endfunc',
33439898107fSBram Moolenaar      ])
3344e7e4838fSBram Moolenaar
3345e7e4838fSBram Moolenaar  CheckScriptSuccess([
3346e7e4838fSBram Moolenaar      'def Test() # comment',
3347e7e4838fSBram Moolenaar      'enddef',
3348e7e4838fSBram Moolenaar      ])
3349e7e4838fSBram Moolenaar  CheckScriptFailure([
3350e7e4838fSBram Moolenaar      'func Test() # comment',
3351e7e4838fSBram Moolenaar      'endfunc',
3352e7e4838fSBram Moolenaar      ], 'E488:')
33530f37e356SBram Moolenaar
33540f37e356SBram Moolenaar  var lines =<< trim END
33550f37e356SBram Moolenaar      vim9script
33560f37e356SBram Moolenaar      syn region Text
33570f37e356SBram Moolenaar      \ start='foo'
33580f37e356SBram Moolenaar      #\ comment
33590f37e356SBram Moolenaar      \ end='bar'
33605072b47aSBram Moolenaar      syn region Text start='foo'
33615072b47aSBram Moolenaar      #\ comment
33625072b47aSBram Moolenaar      \ end='bar'
33630f37e356SBram Moolenaar  END
33640f37e356SBram Moolenaar  CheckScriptSuccess(lines)
33650f37e356SBram Moolenaar
33660f37e356SBram Moolenaar  lines =<< trim END
33670f37e356SBram Moolenaar      vim9script
33680f37e356SBram Moolenaar      syn region Text
33690f37e356SBram Moolenaar      \ start='foo'
33700f37e356SBram Moolenaar      "\ comment
33710f37e356SBram Moolenaar      \ end='bar'
33720f37e356SBram Moolenaar  END
33730f37e356SBram Moolenaar  CheckScriptFailure(lines, 'E399:')
33742c5ed4e3SBram Moolenaarenddef
33752c5ed4e3SBram Moolenaar
33762c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
33772c5ed4e3SBram Moolenaar  CheckCanRunGui
33782c5ed4e3SBram Moolenaar
33792c5ed4e3SBram Moolenaar  CheckScriptFailure([
33802c5ed4e3SBram Moolenaar      'vim9script',
33812c5ed4e3SBram Moolenaar      'gui#comment'
3382f8103f27SBram Moolenaar      ], 'E1144:')
33832c5ed4e3SBram Moolenaar  CheckScriptFailure([
33842c5ed4e3SBram Moolenaar      'vim9script',
33852c5ed4e3SBram Moolenaar      'gui -f#comment'
33862c5ed4e3SBram Moolenaar      ], 'E499:')
33877a092245SBram Moolenaarenddef
33887a092245SBram Moolenaar
3389a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
33906797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
33916797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3392a26b9700SBram Moolenaar
3393a26b9700SBram Moolenaar  edit test.vim
3394a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3395a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3396a26b9700SBram Moolenaar
3397a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3398a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3399a26b9700SBram Moolenaar
3400a26b9700SBram Moolenaar  g:entered = 0
3401a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3402a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3403a26b9700SBram Moolenaar
3404a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3405a26b9700SBram Moolenaar
3406a26b9700SBram Moolenaar  au! TabEnter
3407a26b9700SBram Moolenaar  unlet g:entered
3408d72c1bf0SBram Moolenaar
3409d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3410d72c1bf0SBram Moolenaar      'vim9script',
34116797966dSBram Moolenaar      'g:var = 123',
3412e55b1c09SBram Moolenaar      'b:var = 456',
3413e55b1c09SBram Moolenaar      'w:var = 777',
3414e55b1c09SBram Moolenaar      't:var = 888',
3415d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3416d72c1bf0SBram Moolenaar      ])
3417d72c1bf0SBram Moolenaar
3418d72c1bf0SBram Moolenaar  CheckScriptFailure([
3419d72c1bf0SBram Moolenaar      'vim9script',
3420cfcd011fSBram Moolenaar      'let var = 123',
3421cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3422cfcd011fSBram Moolenaar
3423cfcd011fSBram Moolenaar  CheckScriptFailure([
3424cfcd011fSBram Moolenaar      'vim9script',
3425cfcd011fSBram Moolenaar      'var g:var = 123',
3426e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3427e55b1c09SBram Moolenaar
3428e55b1c09SBram Moolenaar  CheckScriptFailure([
3429e55b1c09SBram Moolenaar      'vim9script',
3430cfcd011fSBram Moolenaar      'var b:var = 123',
3431e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3432e55b1c09SBram Moolenaar
3433e55b1c09SBram Moolenaar  CheckScriptFailure([
3434e55b1c09SBram Moolenaar      'vim9script',
3435cfcd011fSBram Moolenaar      'var w:var = 123',
3436e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3437e55b1c09SBram Moolenaar
3438e55b1c09SBram Moolenaar  CheckScriptFailure([
3439e55b1c09SBram Moolenaar      'vim9script',
3440cfcd011fSBram Moolenaar      'var t:var = 123',
3441e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3442e55b1c09SBram Moolenaar
3443e55b1c09SBram Moolenaar  CheckScriptFailure([
3444e55b1c09SBram Moolenaar      'vim9script',
3445cfcd011fSBram Moolenaar      'var v:version = 123',
3446e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3447e55b1c09SBram Moolenaar
3448e55b1c09SBram Moolenaar  CheckScriptFailure([
3449e55b1c09SBram Moolenaar      'vim9script',
3450cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3451e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
34526797966dSBram Moolenaar
34536797966dSBram Moolenaar  CheckScriptFailure([
34546797966dSBram Moolenaar      'vim9script',
34556797966dSBram Moolenaar      'g:var = 123',
345632e35117SBram Moolenaar      'unlet g:var# comment1',
3457d72c1bf0SBram Moolenaar      ], 'E108:')
3458d72c1bf0SBram Moolenaar
3459d72c1bf0SBram Moolenaar  CheckScriptFailure([
3460d72c1bf0SBram Moolenaar      'let g:var = 123',
3461d72c1bf0SBram Moolenaar      'unlet g:var # something',
3462d72c1bf0SBram Moolenaar      ], 'E488:')
3463faac4104SBram Moolenaar
3464faac4104SBram Moolenaar  CheckScriptSuccess([
3465faac4104SBram Moolenaar      'vim9script',
346632e35117SBram Moolenaar      'if 1 # comment2',
3467faac4104SBram Moolenaar      '  echo "yes"',
3468faac4104SBram Moolenaar      'elseif 2 #comment',
3469faac4104SBram Moolenaar      '  echo "no"',
3470faac4104SBram Moolenaar      'endif',
3471faac4104SBram Moolenaar      ])
3472faac4104SBram Moolenaar
3473faac4104SBram Moolenaar  CheckScriptFailure([
3474faac4104SBram Moolenaar      'vim9script',
347532e35117SBram Moolenaar      'if 1# comment3',
3476faac4104SBram Moolenaar      '  echo "yes"',
3477faac4104SBram Moolenaar      'endif',
3478fae55a9cSBram Moolenaar      ], 'E488:')
3479faac4104SBram Moolenaar
3480faac4104SBram Moolenaar  CheckScriptFailure([
3481faac4104SBram Moolenaar      'vim9script',
348232e35117SBram Moolenaar      'if 0 # comment4',
3483faac4104SBram Moolenaar      '  echo "yes"',
3484faac4104SBram Moolenaar      'elseif 2#comment',
3485faac4104SBram Moolenaar      '  echo "no"',
3486faac4104SBram Moolenaar      'endif',
3487fae55a9cSBram Moolenaar      ], 'E488:')
3488faac4104SBram Moolenaar
3489faac4104SBram Moolenaar  CheckScriptSuccess([
3490faac4104SBram Moolenaar      'vim9script',
3491cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3492faac4104SBram Moolenaar      ])
3493faac4104SBram Moolenaar
3494faac4104SBram Moolenaar  CheckScriptFailure([
3495faac4104SBram Moolenaar      'vim9script',
3496cfcd011fSBram Moolenaar      'var v = 1# comment6',
3497fae55a9cSBram Moolenaar      ], 'E488:')
3498faac4104SBram Moolenaar
3499faac4104SBram Moolenaar  CheckScriptSuccess([
3500faac4104SBram Moolenaar      'vim9script',
3501faac4104SBram Moolenaar      'new'
3502d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3503df069eecSBram Moolenaar      ':$',
3504faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3505faac4104SBram Moolenaar      'bwipe!',
3506faac4104SBram Moolenaar      ])
3507faac4104SBram Moolenaar
3508f5be8cdbSBram Moolenaar  CheckScriptFailure([
3509f5be8cdbSBram Moolenaar      'vim9script',
3510f5be8cdbSBram Moolenaar      'new'
3511d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3512f5be8cdbSBram Moolenaar      ':$',
3513f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3514f5be8cdbSBram Moolenaar      'bwipe!',
3515f5be8cdbSBram Moolenaar      ], 'E488:')
3516f5be8cdbSBram Moolenaar
3517f5be8cdbSBram Moolenaar  CheckScriptFailure([
3518f5be8cdbSBram Moolenaar      'vim9script',
3519f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3520f5be8cdbSBram Moolenaar      ], 'E477:')
3521a26b9700SBram Moolenaarenddef
3522a26b9700SBram Moolenaar
35237e5bd91dSBram Moolenaardef Test_finish()
3524cfcd011fSBram Moolenaar  var lines =<< trim END
35257e5bd91dSBram Moolenaar    vim9script
35266797966dSBram Moolenaar    g:res = 'one'
35277e5bd91dSBram Moolenaar    if v:false | finish | endif
35286797966dSBram Moolenaar    g:res = 'two'
35297e5bd91dSBram Moolenaar    finish
35306797966dSBram Moolenaar    g:res = 'three'
35317e5bd91dSBram Moolenaar  END
35327e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
35337e5bd91dSBram Moolenaar  source Xfinished
35347e5bd91dSBram Moolenaar  assert_equal('two', g:res)
35357e5bd91dSBram Moolenaar
35367e5bd91dSBram Moolenaar  unlet g:res
35377e5bd91dSBram Moolenaar  delete('Xfinished')
35387e5bd91dSBram Moolenaarenddef
35397e5bd91dSBram Moolenaar
3540a5d0077eSBram Moolenaardef Test_forward_declaration()
3541cfcd011fSBram Moolenaar  var lines =<< trim END
3542a5d0077eSBram Moolenaar    vim9script
3543a5d0077eSBram Moolenaar    def GetValue(): string
3544a5d0077eSBram Moolenaar      return theVal
3545a5d0077eSBram Moolenaar    enddef
3546cfcd011fSBram Moolenaar    var theVal = 'something'
3547822ba247SBram Moolenaar    g:initVal = GetValue()
3548a5d0077eSBram Moolenaar    theVal = 'else'
3549a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3550a5d0077eSBram Moolenaar  END
3551a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3552a5d0077eSBram Moolenaar  source Xforward
3553a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3554a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3555a5d0077eSBram Moolenaar
3556a5d0077eSBram Moolenaar  unlet g:initVal
3557a5d0077eSBram Moolenaar  unlet g:laterVal
3558a5d0077eSBram Moolenaar  delete('Xforward')
3559a5d0077eSBram Moolenaarenddef
3560a5d0077eSBram Moolenaar
35619721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3562a6294955SBram Moolenaar  var vim9_lines =<< trim END
3563a6294955SBram Moolenaar    vim9script
3564a6294955SBram Moolenaar    var local = 'local'
3565a6294955SBram Moolenaar    g:global = 'global'
3566a6294955SBram Moolenaar    export var exported = 'exported'
3567a6294955SBram Moolenaar    export def GetText(): string
3568a6294955SBram Moolenaar       return 'text'
3569a6294955SBram Moolenaar    enddef
3570a6294955SBram Moolenaar  END
3571a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3572a6294955SBram Moolenaar
3573cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
35749721fb4eSBram Moolenaar    source Xvim9_script.vim
35759721fb4eSBram Moolenaar
35769721fb4eSBram Moolenaar    call assert_false(exists('local'))
35779721fb4eSBram Moolenaar    call assert_false(exists('exported'))
35789721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
35799721fb4eSBram Moolenaar    call assert_equal('global', global)
35809721fb4eSBram Moolenaar    call assert_equal('global', g:global)
35819721fb4eSBram Moolenaar
35829721fb4eSBram Moolenaar    " imported variable becomes script-local
35839721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
35849721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
35859721fb4eSBram Moolenaar    call assert_false(exists('exported'))
35869721fb4eSBram Moolenaar
35879721fb4eSBram Moolenaar    " imported function becomes script-local
35889721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
35899721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
35909721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
35919721fb4eSBram Moolenaar  END
35929721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
35939721fb4eSBram Moolenaar
35949721fb4eSBram Moolenaar  source Xlegacy_script.vim
35959721fb4eSBram Moolenaar  assert_equal('global', g:global)
3596f5be8cdbSBram Moolenaar  unlet g:global
35979721fb4eSBram Moolenaar
35989721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
35999721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
36009721fb4eSBram Moolenaarenddef
3601a5d0077eSBram Moolenaar
3602e535db86SBram Moolenaardef Test_declare_script_in_func()
3603e535db86SBram Moolenaar  var lines =<< trim END
3604e535db86SBram Moolenaar      vim9script
3605e535db86SBram Moolenaar      func Declare()
3606e535db86SBram Moolenaar        let s:local = 123
3607e535db86SBram Moolenaar      endfunc
3608e535db86SBram Moolenaar      Declare()
3609e535db86SBram Moolenaar      assert_equal(123, local)
3610e535db86SBram Moolenaar
3611e535db86SBram Moolenaar      var error: string
3612e535db86SBram Moolenaar      try
3613e535db86SBram Moolenaar        local = 'asdf'
3614e535db86SBram Moolenaar      catch
3615e535db86SBram Moolenaar        error = v:exception
3616e535db86SBram Moolenaar      endtry
3617e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3618e535db86SBram Moolenaar
3619e535db86SBram Moolenaar      lockvar local
3620e535db86SBram Moolenaar      try
3621e535db86SBram Moolenaar        local = 999
3622e535db86SBram Moolenaar      catch
3623e535db86SBram Moolenaar        error = v:exception
3624e535db86SBram Moolenaar      endtry
3625e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3626e535db86SBram Moolenaar  END
3627e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3628e535db86SBram Moolenaarenddef
3629e535db86SBram Moolenaar
3630e535db86SBram Moolenaar
36317d699701SBram Moolenaarfunc Test_vim9script_not_global()
36327d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
36337d699701SBram Moolenaar  let vim9lines =<< trim END
36347d699701SBram Moolenaar    vim9script
3635cfcd011fSBram Moolenaar    var name = 'local'
36367d699701SBram Moolenaar    func TheFunc()
36377d699701SBram Moolenaar      echo 'local'
36387d699701SBram Moolenaar    endfunc
36397d699701SBram Moolenaar    def DefFunc()
36407d699701SBram Moolenaar      echo 'local'
36417d699701SBram Moolenaar    enddef
36427d699701SBram Moolenaar  END
36437d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
36447d699701SBram Moolenaar  source Xvim9script.vim
36457d699701SBram Moolenaar  try
36467d699701SBram Moolenaar    echo g:var
36477d699701SBram Moolenaar    assert_report('did not fail')
36487d699701SBram Moolenaar  catch /E121:/
36497d699701SBram Moolenaar    " caught
36507d699701SBram Moolenaar  endtry
36517d699701SBram Moolenaar  try
36527d699701SBram Moolenaar    call TheFunc()
36537d699701SBram Moolenaar    assert_report('did not fail')
36547d699701SBram Moolenaar  catch /E117:/
36557d699701SBram Moolenaar    " caught
36567d699701SBram Moolenaar  endtry
36577d699701SBram Moolenaar  try
36587d699701SBram Moolenaar    call DefFunc()
36597d699701SBram Moolenaar    assert_report('did not fail')
36607d699701SBram Moolenaar  catch /E117:/
36617d699701SBram Moolenaar    " caught
36627d699701SBram Moolenaar  endtry
36637d699701SBram Moolenaar
366425859dd7SBram Moolenaar  call delete('Xvim9script.vim')
36657d699701SBram Moolenaarendfunc
36667d699701SBram Moolenaar
3667eeb27bfeSBram Moolenaardef Test_vim9_copen()
3668eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3669eeb27bfeSBram Moolenaar  copen
3670eeb27bfeSBram Moolenaar  quit
3671eeb27bfeSBram Moolenaarenddef
3672eeb27bfeSBram Moolenaar
367303290b84SBram Moolenaar" test using an auto-loaded function and variable
36742d6b20d6SBram Moolenaardef Test_vim9_autoload()
3675cfcd011fSBram Moolenaar  var lines =<< trim END
36762d6b20d6SBram Moolenaar     vim9script
367703290b84SBram Moolenaar     def some#gettest(): string
367803290b84SBram Moolenaar       return 'test'
367903290b84SBram Moolenaar     enddef
368003290b84SBram Moolenaar     g:some#name = 'name'
3681227c58a4SBram Moolenaar     g:some#dict = {key: 'value'}
3682e3ffcd99SBram Moolenaar
3683e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3684e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3685e3ffcd99SBram Moolenaar     enddef
368603290b84SBram Moolenaar  END
368703290b84SBram Moolenaar
368803290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
368903290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
369003290b84SBram Moolenaar  var save_rtp = &rtp
369103290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
369203290b84SBram Moolenaar
369303290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
369403290b84SBram Moolenaar  assert_equal('name', g:some#name)
3695227c58a4SBram Moolenaar  assert_equal('value', g:some#dict.key)
369603290b84SBram Moolenaar  g:some#other = 'other'
369703290b84SBram Moolenaar  assert_equal('other', g:some#other)
369803290b84SBram Moolenaar
3699e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3700e3ffcd99SBram Moolenaar
370117f700acSBram Moolenaar  # upper case script name works
370217f700acSBram Moolenaar  lines =<< trim END
370317f700acSBram Moolenaar     vim9script
370417f700acSBram Moolenaar     def Other#getOther(): string
370517f700acSBram Moolenaar       return 'other'
370617f700acSBram Moolenaar     enddef
370717f700acSBram Moolenaar  END
370817f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
370917f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
371017f700acSBram Moolenaar
371103290b84SBram Moolenaar  delete('Xdir', 'rf')
371203290b84SBram Moolenaar  &rtp = save_rtp
371303290b84SBram Moolenaarenddef
371403290b84SBram Moolenaar
371503290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
371603290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
371703290b84SBram Moolenaar  var lines =<< trim END
371803290b84SBram Moolenaar     vim9script
37192d6b20d6SBram Moolenaar     def foo#test()
37202d6b20d6SBram Moolenaar         echomsg getreg('"')
37212d6b20d6SBram Moolenaar     enddef
37222d6b20d6SBram Moolenaar  END
37232d6b20d6SBram Moolenaar
37242d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
37252d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3726cfcd011fSBram Moolenaar  var save_rtp = &rtp
37272d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
37282d6b20d6SBram Moolenaar  augroup test
37292d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
37302d6b20d6SBram Moolenaar  augroup END
37312d6b20d6SBram Moolenaar
37322d6b20d6SBram Moolenaar  normal Y
37332d6b20d6SBram Moolenaar
37342d6b20d6SBram Moolenaar  augroup test
37352d6b20d6SBram Moolenaar    autocmd!
37362d6b20d6SBram Moolenaar  augroup END
37372d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
37382d6b20d6SBram Moolenaar  &rtp = save_rtp
37392d6b20d6SBram Moolenaarenddef
37402d6b20d6SBram Moolenaar
374177e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
374277e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3743cfcd011fSBram Moolenaar  var lines =<< trim END
374477e5dcc3SBram Moolenaar      vim9script
374577e5dcc3SBram Moolenaar      def crash#func()
374677e5dcc3SBram Moolenaar          try
374777e5dcc3SBram Moolenaar              for x in List()
374877e5dcc3SBram Moolenaar              endfor
374977e5dcc3SBram Moolenaar          catch
375077e5dcc3SBram Moolenaar          endtry
375177e5dcc3SBram Moolenaar          g:ok = true
375277e5dcc3SBram Moolenaar      enddef
375377e5dcc3SBram Moolenaar      fu List()
375477e5dcc3SBram Moolenaar          invalid
375577e5dcc3SBram Moolenaar      endfu
375677e5dcc3SBram Moolenaar      try
375748e11c10SBram Moolenaar          alsoinvalid
375877e5dcc3SBram Moolenaar      catch /wontmatch/
375977e5dcc3SBram Moolenaar      endtry
376077e5dcc3SBram Moolenaar  END
376177e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
376277e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
376377e5dcc3SBram Moolenaar
376477e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
376577e5dcc3SBram Moolenaar  lines =<< trim END
376677e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
376777e5dcc3SBram Moolenaar    call crash#func()
376877e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
37699c4f5520SBram Moolenaar    qall!
377077e5dcc3SBram Moolenaar  END
377177e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
377277e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
377377e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
377477e5dcc3SBram Moolenaar
377577e5dcc3SBram Moolenaar  delete('Xdidit')
377677e5dcc3SBram Moolenaar  delete('Xscript')
377777e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
377803290b84SBram Moolenaar
377903290b84SBram Moolenaar  lines =<< trim END
378003290b84SBram Moolenaar    vim9script
378103290b84SBram Moolenaar    var foo#bar = 'asdf'
378203290b84SBram Moolenaar  END
378303290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
378477e5dcc3SBram Moolenaarenddef
378577e5dcc3SBram Moolenaar
378681e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
378781e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
378881e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3789cfcd011fSBram Moolenaar  var lines =<< trim END
379081e17fbeSBram Moolenaar    let s:counter = 1
379181e17fbeSBram Moolenaar    def s:Func()
379281e17fbeSBram Moolenaar      au! CursorHold
379381e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
379481e17fbeSBram Moolenaar    enddef
379581e17fbeSBram Moolenaar    call s:Func()
379681e17fbeSBram Moolenaar    doau CursorHold
379781e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
379881e17fbeSBram Moolenaar    au! CursorHold
379981e17fbeSBram Moolenaar  END
380081e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
380181e17fbeSBram Moolenaarenddef
380281e17fbeSBram Moolenaar
3803b5841b99SBram Moolenaardef Test_error_in_autoload_script()
3804b5841b99SBram Moolenaar  var save_rtp = &rtp
3805b5841b99SBram Moolenaar  var dir = getcwd() .. '/Xruntime'
3806b5841b99SBram Moolenaar  &rtp = dir
3807b5841b99SBram Moolenaar  mkdir(dir .. '/autoload', 'p')
3808b5841b99SBram Moolenaar
3809b5841b99SBram Moolenaar  var lines =<< trim END
3810b5841b99SBram Moolenaar      vim9script noclear
3811b5841b99SBram Moolenaar      def script#autoloaded()
3812b5841b99SBram Moolenaar      enddef
3813b5841b99SBram Moolenaar      def Broken()
3814b5841b99SBram Moolenaar        var x: any = ''
3815b5841b99SBram Moolenaar        eval x != 0
3816b5841b99SBram Moolenaar      enddef
3817b5841b99SBram Moolenaar      Broken()
3818b5841b99SBram Moolenaar  END
3819b5841b99SBram Moolenaar  writefile(lines, dir .. '/autoload/script.vim')
3820b5841b99SBram Moolenaar
3821b5841b99SBram Moolenaar  lines =<< trim END
3822b5841b99SBram Moolenaar      vim9script
3823b5841b99SBram Moolenaar      def CallAutoloaded()
3824b5841b99SBram Moolenaar        script#autoloaded()
3825b5841b99SBram Moolenaar      enddef
3826b5841b99SBram Moolenaar
3827b5841b99SBram Moolenaar      function Legacy()
3828b5841b99SBram Moolenaar        try
3829b5841b99SBram Moolenaar          call s:CallAutoloaded()
3830b5841b99SBram Moolenaar        catch
3831b5841b99SBram Moolenaar          call assert_match('E1030: Using a String as a Number', v:exception)
3832b5841b99SBram Moolenaar        endtry
3833b5841b99SBram Moolenaar      endfunction
3834b5841b99SBram Moolenaar
3835b5841b99SBram Moolenaar      Legacy()
3836b5841b99SBram Moolenaar  END
3837b5841b99SBram Moolenaar  CheckScriptSuccess(lines)
3838b5841b99SBram Moolenaar
3839b5841b99SBram Moolenaar  &rtp = save_rtp
3840b5841b99SBram Moolenaar  delete(dir, 'rf')
3841b5841b99SBram Moolenaarenddef
3842b5841b99SBram Moolenaar
38433896a105SBram Moolenaardef Test_cmdline_win()
38443896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
38453896a105SBram Moolenaar  # the command line window.
38463896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3847cfcd011fSBram Moolenaar  var export_lines =<< trim END
38483896a105SBram Moolenaar    vim9script
3849cfcd011fSBram Moolenaar    export var That = 'yes'
38503896a105SBram Moolenaar  END
38513896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3852cfcd011fSBram Moolenaar  var import_lines =<< trim END
38533896a105SBram Moolenaar    vim9script
38543896a105SBram Moolenaar    import That from './Xexport.vim'
38553896a105SBram Moolenaar  END
38563896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3857cfcd011fSBram Moolenaar  var save_rtp = &rtp
38583896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
38593896a105SBram Moolenaar  syntax on
38603896a105SBram Moolenaar  augroup CmdWin
38613896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
38623896a105SBram Moolenaar  augroup END
38633896a105SBram Moolenaar  # this will open and also close the cmdline window
38643896a105SBram Moolenaar  feedkeys('q:', 'xt')
38653896a105SBram Moolenaar  assert_equal('yes', g:got_there)
38663896a105SBram Moolenaar
38673896a105SBram Moolenaar  augroup CmdWin
38683896a105SBram Moolenaar    au!
38693896a105SBram Moolenaar  augroup END
38703896a105SBram Moolenaar  &rtp = save_rtp
38713896a105SBram Moolenaar  delete('rtp', 'rf')
38723896a105SBram Moolenaarenddef
38733896a105SBram Moolenaar
3874e3d4685fSBram Moolenaardef Test_invalid_sid()
3875e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
387625859dd7SBram Moolenaar
38779c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3878d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3879e3d4685fSBram Moolenaar  endif
3880e3d4685fSBram Moolenaar  delete('Xdidit')
3881e3d4685fSBram Moolenaarenddef
3882e3d4685fSBram Moolenaar
38839ec7026fSBram Moolenaardef Test_restoring_cpo()
38849ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
38859ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
38869ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
38879ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
38889ec7026fSBram Moolenaar  endif
38899ec7026fSBram Moolenaar  delete('Xsourced')
38909ec7026fSBram Moolenaar  delete('Xclose')
3891090728adSBram Moolenaar  delete('Xdone')
38920123cc1eSBram Moolenaar
38930123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
38940123cc1eSBram Moolenaar  set cpo=aABceFsMny>
38950123cc1eSBram Moolenaar  edit XanotherScript
38960123cc1eSBram Moolenaar  so %
38970123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
38980123cc1eSBram Moolenaar  :1del
38990123cc1eSBram Moolenaar  w
39000123cc1eSBram Moolenaar  so %
39010123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
39020123cc1eSBram Moolenaar
39030123cc1eSBram Moolenaar  delete('XanotherScript')
39040123cc1eSBram Moolenaar  set cpo&vim
39059ec7026fSBram Moolenaarenddef
39069ec7026fSBram Moolenaar
3907ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3908ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
390937294bd6SBram Moolenaar  CheckScreendump
3910ffb7dcdbSBram Moolenaar  CheckFeature timers
391137294bd6SBram Moolenaar
3912ffb7dcdbSBram Moolenaar  let lines =<< trim END
391337294bd6SBram Moolenaar    vim9script
391437294bd6SBram Moolenaar    def script#func()
391537294bd6SBram Moolenaar    enddef
391637294bd6SBram Moolenaar  END
3917ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3918ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
391937294bd6SBram Moolenaar
3920ffb7dcdbSBram Moolenaar  let lines =<< trim END
392137294bd6SBram Moolenaar      vim9script
392237294bd6SBram Moolenaar      set cpo+=M
392337294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
3924767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
392537294bd6SBram Moolenaar      setline(1, 'some text')
392637294bd6SBram Moolenaar  END
3927ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3928ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3929ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3930ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
393137294bd6SBram Moolenaar
3932ffb7dcdbSBram Moolenaar  " clean up
3933ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3934ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3935ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3936ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3937ffb7dcdbSBram Moolenaarendfunc
393837294bd6SBram Moolenaar
39399ec7026fSBram Moolenaar
3940f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3941cfcd011fSBram Moolenaar  var lines =<< trim END
3942cfcd011fSBram Moolenaar    var name: any
3943cfcd011fSBram Moolenaar    assert_equal(0, name)
3944f0afd9e1SBram Moolenaar  END
3945f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3946f0afd9e1SBram Moolenaarenddef
3947f0afd9e1SBram Moolenaar
39487e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
394958dbef33SBram Moolenaar  CheckRunVimInTerminal
395058dbef33SBram Moolenaar
39517e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
39527e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
39537e9210eaSBram Moolenaarendfunc
39547e9210eaSBram Moolenaar
39557e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
39569c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3957cfcd011fSBram Moolenaar  var lines =<< trim END
39589c4f5520SBram Moolenaar    func CheckAndQuit()
39599c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
39609c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
39619c4f5520SBram Moolenaar    endfunc
39629c4f5520SBram Moolenaar  END
39639c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
39649c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3965e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
39669c4f5520SBram Moolenaar  # define Afunc() on the command line
39679c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
39689c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
39692949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
39709c4f5520SBram Moolenaar
39719c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
39729c4f5520SBram Moolenaar  delete('XcallFunc')
39739c4f5520SBram Moolenaar  delete('Xdidcmd')
39749c4f5520SBram Moolenaarenddef
39759c4f5520SBram Moolenaar
3976fcdc5d83SBram Moolenaardef Test_script_var_scope()
3977fcdc5d83SBram Moolenaar  var lines =<< trim END
3978fcdc5d83SBram Moolenaar      vim9script
3979fcdc5d83SBram Moolenaar      if true
3980fcdc5d83SBram Moolenaar        if true
3981fcdc5d83SBram Moolenaar          var one = 'one'
3982fcdc5d83SBram Moolenaar          echo one
3983fcdc5d83SBram Moolenaar        endif
3984fcdc5d83SBram Moolenaar        echo one
3985fcdc5d83SBram Moolenaar      endif
3986fcdc5d83SBram Moolenaar  END
3987fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3988fcdc5d83SBram Moolenaar
3989fcdc5d83SBram Moolenaar  lines =<< trim END
3990fcdc5d83SBram Moolenaar      vim9script
3991fcdc5d83SBram Moolenaar      if true
3992fcdc5d83SBram Moolenaar        if false
3993fcdc5d83SBram Moolenaar          var one = 'one'
3994fcdc5d83SBram Moolenaar          echo one
3995fcdc5d83SBram Moolenaar        else
3996fcdc5d83SBram Moolenaar          var one = 'one'
3997fcdc5d83SBram Moolenaar          echo one
3998fcdc5d83SBram Moolenaar        endif
3999fcdc5d83SBram Moolenaar        echo one
4000fcdc5d83SBram Moolenaar      endif
4001fcdc5d83SBram Moolenaar  END
4002fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
4003fcdc5d83SBram Moolenaar
4004fcdc5d83SBram Moolenaar  lines =<< trim END
4005fcdc5d83SBram Moolenaar      vim9script
4006fcdc5d83SBram Moolenaar      while true
4007fcdc5d83SBram Moolenaar        var one = 'one'
4008fcdc5d83SBram Moolenaar        echo one
4009fcdc5d83SBram Moolenaar        break
4010fcdc5d83SBram Moolenaar      endwhile
4011fcdc5d83SBram Moolenaar      echo one
4012fcdc5d83SBram Moolenaar  END
4013fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
4014fcdc5d83SBram Moolenaar
4015fcdc5d83SBram Moolenaar  lines =<< trim END
4016fcdc5d83SBram Moolenaar      vim9script
4017fcdc5d83SBram Moolenaar      for i in range(1)
4018fcdc5d83SBram Moolenaar        var one = 'one'
4019fcdc5d83SBram Moolenaar        echo one
4020fcdc5d83SBram Moolenaar      endfor
4021fcdc5d83SBram Moolenaar      echo one
4022fcdc5d83SBram Moolenaar  END
4023fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
40249becdf2bSBram Moolenaar
40259becdf2bSBram Moolenaar  lines =<< trim END
40269becdf2bSBram Moolenaar      vim9script
40279becdf2bSBram Moolenaar      {
40289becdf2bSBram Moolenaar        var one = 'one'
40299becdf2bSBram Moolenaar        assert_equal('one', one)
40309becdf2bSBram Moolenaar      }
40319becdf2bSBram Moolenaar      assert_false(exists('one'))
40329becdf2bSBram Moolenaar      assert_false(exists('s:one'))
40339becdf2bSBram Moolenaar  END
40349becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
40359becdf2bSBram Moolenaar
40369becdf2bSBram Moolenaar  lines =<< trim END
40379becdf2bSBram Moolenaar      vim9script
40389becdf2bSBram Moolenaar      {
40399becdf2bSBram Moolenaar        var one = 'one'
40409becdf2bSBram Moolenaar        echo one
40419becdf2bSBram Moolenaar      }
40429becdf2bSBram Moolenaar      echo one
40439becdf2bSBram Moolenaar  END
40449becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
4045fcdc5d83SBram Moolenaarenddef
4046fcdc5d83SBram Moolenaar
4047352134bbSBram Moolenaardef Test_catch_exception_in_callback()
4048352134bbSBram Moolenaar  var lines =<< trim END
4049352134bbSBram Moolenaar    vim9script
40502a38908bSBram Moolenaar    def Callback(...l: list<any>)
4051352134bbSBram Moolenaar      try
4052352134bbSBram Moolenaar        var x: string
4053352134bbSBram Moolenaar        var y: string
4054352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
4055352134bbSBram Moolenaar        [x, y] = ['']
4056352134bbSBram Moolenaar      catch
4057352134bbSBram Moolenaar        g:caught = 'yes'
4058352134bbSBram Moolenaar      endtry
4059352134bbSBram Moolenaar    enddef
4060e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
4061352134bbSBram Moolenaar    feedkeys("\r", 'xt')
4062352134bbSBram Moolenaar  END
4063352134bbSBram Moolenaar  CheckScriptSuccess(lines)
4064352134bbSBram Moolenaar
4065352134bbSBram Moolenaar  unlet g:caught
4066352134bbSBram Moolenaarenddef
4067352134bbSBram Moolenaar
4068631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
4069631e8f93SBram Moolenaar  if !has('unix') || !has('job')
4070631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
4071631e8f93SBram Moolenaar  endif
4072631e8f93SBram Moolenaar  var lines =<< trim END
4073631e8f93SBram Moolenaar      vim9script
4074631e8f93SBram Moolenaar      var source: list<number>
40752a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
4076631e8f93SBram Moolenaar          eval [][0]
4077631e8f93SBram Moolenaar      enddef
40782a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
4079631e8f93SBram Moolenaar          sleep 1m
4080631e8f93SBram Moolenaar          source += l
4081631e8f93SBram Moolenaar      enddef
4082e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
40836f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
40846f17a3f0SBram Moolenaar        sleep 10m
40856f17a3f0SBram Moolenaar      endwhile
4086206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
4087fe95b94fSBram Moolenaar      sleep 200m
4088631e8f93SBram Moolenaar  END
4089631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
4090631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
4091631e8f93SBram Moolenaar  delete('Xdef')
4092631e8f93SBram Moolenaarenddef
4093631e8f93SBram Moolenaar
40944324d87aSBram Moolenaardef InvokeNormal()
40954324d87aSBram Moolenaar  exe "norm! :m+1\r"
40964324d87aSBram Moolenaarenddef
40974324d87aSBram Moolenaar
40984324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
40994324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
41004324d87aSBram Moolenaar  new
41014324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
41024324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
41034324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
41044324d87aSBram Moolenaar  xunmap <F3>
4105b5b9480eSBram Moolenaarenddef
4106b5b9480eSBram Moolenaar
4107b5b9480eSBram Moolenaardef Test_white_space_after_command()
4108b5b9480eSBram Moolenaar  var lines =<< trim END
4109b5b9480eSBram Moolenaar    exit_cb: Func})
4110b5b9480eSBram Moolenaar  END
4111b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
4112f8103f27SBram Moolenaar
4113f8103f27SBram Moolenaar  lines =<< trim END
4114f8103f27SBram Moolenaar    e#
4115f8103f27SBram Moolenaar  END
4116f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
41174324d87aSBram Moolenaarenddef
41184324d87aSBram Moolenaar
41194aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
41204aab88d9SBram Moolenaar  var lines =<< trim END
41214aab88d9SBram Moolenaar      vim9script
41224aab88d9SBram Moolenaar      if exists('g:guard')
41234aab88d9SBram Moolenaar        finish
41244aab88d9SBram Moolenaar      endif
41254aab88d9SBram Moolenaar      g:guard = 1
41264aab88d9SBram Moolenaar      var name = 'thename'
41274aab88d9SBram Moolenaar      def g:GetName(): string
41284aab88d9SBram Moolenaar        return name
41294aab88d9SBram Moolenaar      enddef
41304aab88d9SBram Moolenaar      def g:SetName(arg: string)
41314aab88d9SBram Moolenaar        name = arg
41324aab88d9SBram Moolenaar      enddef
41334aab88d9SBram Moolenaar  END
41344aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
41354aab88d9SBram Moolenaar  so XscriptTwice.vim
41364aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
41374aab88d9SBram Moolenaar  g:SetName('newname')
41384aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
41394aab88d9SBram Moolenaar  so XscriptTwice.vim
41404aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
41414aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
41424aab88d9SBram Moolenaar
41434aab88d9SBram Moolenaar  delfunc g:GetName
41444aab88d9SBram Moolenaar  delfunc g:SetName
41454aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
41464aab88d9SBram Moolenaar  unlet g:guard
41474aab88d9SBram Moolenaarenddef
41484aab88d9SBram Moolenaar
41494aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
41504aab88d9SBram Moolenaar  var exportlines =<< trim END
41514aab88d9SBram Moolenaar      vim9script
41524aab88d9SBram Moolenaar      if exists('g:guard')
41534aab88d9SBram Moolenaar        finish
41544aab88d9SBram Moolenaar      endif
41554aab88d9SBram Moolenaar      g:guard = 1
41564aab88d9SBram Moolenaar      export var name = 'someName'
41574aab88d9SBram Moolenaar  END
41584aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
41594aab88d9SBram Moolenaar
41604aab88d9SBram Moolenaar  var lines =<< trim END
41614aab88d9SBram Moolenaar      vim9script
41624aab88d9SBram Moolenaar      import name from './XexportScript.vim'
41634aab88d9SBram Moolenaar      def g:GetName(): string
41644aab88d9SBram Moolenaar        return name
41654aab88d9SBram Moolenaar      enddef
41664aab88d9SBram Moolenaar  END
41674aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
41684aab88d9SBram Moolenaar  so XscriptImport.vim
41694aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
41704aab88d9SBram Moolenaar
41714aab88d9SBram Moolenaar  so XexportScript.vim
41724aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
41734aab88d9SBram Moolenaar
41744aab88d9SBram Moolenaar  delfunc g:GetName
41754aab88d9SBram Moolenaar  delete('XexportScript.vim')
41764aab88d9SBram Moolenaar  delete('XscriptImport.vim')
41774aab88d9SBram Moolenaar  unlet g:guard
41784aab88d9SBram Moolenaarenddef
41794aab88d9SBram Moolenaar
418010b9421fSBram Moolenaardef Test_unsupported_commands()
418110b9421fSBram Moolenaar  var lines =<< trim END
418210b9421fSBram Moolenaar      ka
418310b9421fSBram Moolenaar  END
41847d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
41857d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
418610b9421fSBram Moolenaar
418710b9421fSBram Moolenaar  lines =<< trim END
4188ada1d870SBram Moolenaar      :1ka
4189ada1d870SBram Moolenaar  END
41907d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
41917d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
4192ada1d870SBram Moolenaar
4193ada1d870SBram Moolenaar  lines =<< trim END
419410b9421fSBram Moolenaar    t
419510b9421fSBram Moolenaar  END
419610b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
419710b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
419810b9421fSBram Moolenaar
419910b9421fSBram Moolenaar  lines =<< trim END
420010b9421fSBram Moolenaar    x
420110b9421fSBram Moolenaar  END
420210b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
420310b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
420410b9421fSBram Moolenaar
420510b9421fSBram Moolenaar  lines =<< trim END
420610b9421fSBram Moolenaar    xit
420710b9421fSBram Moolenaar  END
420810b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
420910b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
421010b9421fSBram Moolenaarenddef
421110b9421fSBram Moolenaar
4212c70fe460SBram Moolenaardef Test_mapping_line_number()
4213c70fe460SBram Moolenaar  var lines =<< trim END
4214c70fe460SBram Moolenaar      vim9script
4215c70fe460SBram Moolenaar      def g:FuncA()
4216c70fe460SBram Moolenaar          # Some comment
4217c70fe460SBram Moolenaar          FuncB(0)
4218c70fe460SBram Moolenaar      enddef
4219c70fe460SBram Moolenaar          # Some comment
4220c70fe460SBram Moolenaar      def FuncB(
4221c70fe460SBram Moolenaar          # Some comment
4222c70fe460SBram Moolenaar          n: number
4223c70fe460SBram Moolenaar      )
4224c70fe460SBram Moolenaar          exe 'nno '
4225c70fe460SBram Moolenaar              # Some comment
4226c70fe460SBram Moolenaar              .. '<F3> a'
4227c70fe460SBram Moolenaar              .. 'b'
4228c70fe460SBram Moolenaar              .. 'c'
4229c70fe460SBram Moolenaar      enddef
4230c70fe460SBram Moolenaar  END
4231c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
4232c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
4233c70fe460SBram Moolenaar  assert_match('No mapping found', res)
4234c70fe460SBram Moolenaar
4235c70fe460SBram Moolenaar  g:FuncA()
4236c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
4237c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4238c70fe460SBram Moolenaar
4239c70fe460SBram Moolenaar  nunmap <F3>
4240c70fe460SBram Moolenaar  delfunc g:FuncA
4241c70fe460SBram Moolenaarenddef
4242c70fe460SBram Moolenaar
4243deb108baSBram Moolenaardef Test_option_set()
4244deb108baSBram Moolenaar  # legacy script allows for white space
4245deb108baSBram Moolenaar  var lines =<< trim END
4246deb108baSBram Moolenaar      set foldlevel  =11
4247deb108baSBram Moolenaar      call assert_equal(11, &foldlevel)
4248deb108baSBram Moolenaar  END
4249deb108baSBram Moolenaar  CheckScriptSuccess(lines)
4250deb108baSBram Moolenaar
4251deb108baSBram Moolenaar  set foldlevel
4252deb108baSBram Moolenaar  set foldlevel=12
4253deb108baSBram Moolenaar  assert_equal(12, &foldlevel)
4254deb108baSBram Moolenaar  set foldlevel+=2
4255deb108baSBram Moolenaar  assert_equal(14, &foldlevel)
4256deb108baSBram Moolenaar  set foldlevel-=3
4257deb108baSBram Moolenaar  assert_equal(11, &foldlevel)
4258deb108baSBram Moolenaar
4259deb108baSBram Moolenaar  lines =<< trim END
4260deb108baSBram Moolenaar      set foldlevel =1
4261deb108baSBram Moolenaar  END
4262deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
4263deb108baSBram Moolenaar
4264deb108baSBram Moolenaar  lines =<< trim END
4265deb108baSBram Moolenaar      set foldlevel +=1
4266deb108baSBram Moolenaar  END
4267deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
4268deb108baSBram Moolenaar
4269deb108baSBram Moolenaar  lines =<< trim END
4270deb108baSBram Moolenaar      set foldlevel ^=1
4271deb108baSBram Moolenaar  END
4272deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
4273deb108baSBram Moolenaar
4274deb108baSBram Moolenaar  lines =<< trim END
4275deb108baSBram Moolenaar      set foldlevel -=1
4276deb108baSBram Moolenaar  END
4277deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
4278deb108baSBram Moolenaar
4279deb108baSBram Moolenaar  set foldlevel&
4280deb108baSBram Moolenaarenddef
4281deb108baSBram Moolenaar
4282208f0b48SBram Moolenaardef Test_option_modifier()
42831594f313SBram Moolenaar  # legacy script allows for white space
4284208f0b48SBram Moolenaar  var lines =<< trim END
4285208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
4286208f0b48SBram Moolenaar      call assert_equal(1, &hlsearch)
4287208f0b48SBram Moolenaar  END
4288208f0b48SBram Moolenaar  CheckScriptSuccess(lines)
4289208f0b48SBram Moolenaar
42901594f313SBram Moolenaar  set hlsearch
42911594f313SBram Moolenaar  set hlsearch!
42921594f313SBram Moolenaar  assert_equal(false, &hlsearch)
42931594f313SBram Moolenaar
42941594f313SBram Moolenaar  set hlsearch
4295208f0b48SBram Moolenaar  set hlsearch&
42961594f313SBram Moolenaar  assert_equal(false, &hlsearch)
4297208f0b48SBram Moolenaar
4298208f0b48SBram Moolenaar  lines =<< trim END
42991594f313SBram Moolenaar      set hlsearch &
4300208f0b48SBram Moolenaar  END
43011594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
43021594f313SBram Moolenaar
43031594f313SBram Moolenaar  lines =<< trim END
43041594f313SBram Moolenaar      set hlsearch   !
43051594f313SBram Moolenaar  END
43061594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
43071594f313SBram Moolenaar
43081594f313SBram Moolenaar  set hlsearch&
4309208f0b48SBram Moolenaarenddef
4310208f0b48SBram Moolenaar
4311c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail
4312c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number()
4313c03fe66aSBram Moolenaar  var lines =<< trim END
4314c03fe66aSBram Moolenaar      echoerr 'some'
4315c03fe66aSBram Moolenaar         .. ' error'
4316c03fe66aSBram Moolenaar         .. ' continued'
4317c03fe66aSBram Moolenaar  END
4318c03fe66aSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
4319c03fe66aSBram Moolenaarenddef
4320c03fe66aSBram Moolenaar
4321648594eaSBram Moolenaardef ProfiledWithLambda()
4322d9162550SBram Moolenaar  var n = 3
4323d9162550SBram Moolenaar  echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4324d9162550SBram Moolenaarenddef
4325d9162550SBram Moolenaar
4326648594eaSBram Moolenaardef ProfiledNested()
4327648594eaSBram Moolenaar  var x = 0
4328648594eaSBram Moolenaar  def Nested(): any
4329648594eaSBram Moolenaar      return x
4330648594eaSBram Moolenaar  enddef
4331648594eaSBram Moolenaar  Nested()
4332648594eaSBram Moolenaarenddef
4333648594eaSBram Moolenaar
4334ffcfddc7SBram Moolenaardef ProfiledNestedProfiled()
4335ffcfddc7SBram Moolenaar  var x = 0
4336ffcfddc7SBram Moolenaar  def Nested(): any
4337ffcfddc7SBram Moolenaar      return x
4338ffcfddc7SBram Moolenaar  enddef
4339ffcfddc7SBram Moolenaar  Nested()
4340ffcfddc7SBram Moolenaarenddef
4341ffcfddc7SBram Moolenaar
4342d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists.
4343d9162550SBram Moolenaar" This only tests that it works, not the profiling output.
4344d9162550SBram Moolenaardef Test_xx_profile_with_lambda()
43454ece152aSBram Moolenaar  CheckFeature profile
43464ece152aSBram Moolenaar
4347d9162550SBram Moolenaar  profile start Xprofile.log
4348648594eaSBram Moolenaar  profile func ProfiledWithLambda
4349648594eaSBram Moolenaar  ProfiledWithLambda()
4350ffcfddc7SBram Moolenaar
4351648594eaSBram Moolenaar  profile func ProfiledNested
4352648594eaSBram Moolenaar  ProfiledNested()
4353ffcfddc7SBram Moolenaar
4354ffcfddc7SBram Moolenaar  # Also profile the nested function.  Use a different function, although the
4355ffcfddc7SBram Moolenaar  # contents is the same, to make sure it was not already compiled.
4356ffcfddc7SBram Moolenaar  profile func *
4357ffcfddc7SBram Moolenaar  ProfiledNestedProfiled()
4358ffcfddc7SBram Moolenaar
4359ffcfddc7SBram Moolenaar  profdel func *
4360ffcfddc7SBram Moolenaar  profile pause
4361d9162550SBram Moolenaarenddef
4362d9162550SBram Moolenaar
4363585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
4364585fea7bSBram Moolenaardef Test_substitute_cmd()
4365585fea7bSBram Moolenaar  new
4366585fea7bSBram Moolenaar  setline(1, 'something')
4367585fea7bSBram Moolenaar  :substitute(some(other(
4368585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
4369585fea7bSBram Moolenaar  bwipe!
4370585fea7bSBram Moolenaar
4371f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
4372cfcd011fSBram Moolenaar  var lines =<< trim END
4373585fea7bSBram Moolenaar    vim9script
4374585fea7bSBram Moolenaar    new
4375585fea7bSBram Moolenaar    setline(1, 'something')
4376585fea7bSBram Moolenaar    :substitute(some(other(
4377585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
4378585fea7bSBram Moolenaar    bwipe!
4379585fea7bSBram Moolenaar  END
4380585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
4381585fea7bSBram Moolenaar  source Xvim9lines
4382585fea7bSBram Moolenaar
4383585fea7bSBram Moolenaar  delete('Xvim9lines')
4384585fea7bSBram Moolenaarenddef
4385585fea7bSBram Moolenaar
43868a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
4387