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
19123e2e115SBram 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
19923e2e115SBram 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
472cd6b4f30SBram Moolenaar  catch /E1012:/
473f0b9f43cSBram Moolenaar    n = 233
474f0b9f43cSBram Moolenaar  endtry
475f0b9f43cSBram Moolenaar  assert_equal(233, n)
476f0b9f43cSBram Moolenaar
477f0b9f43cSBram Moolenaar  try
478f0b9f43cSBram Moolenaar    n = +g:astring
479cd6b4f30SBram Moolenaar  catch /E1012:/
480f0b9f43cSBram Moolenaar    n = 244
481f0b9f43cSBram Moolenaar  endtry
482f0b9f43cSBram Moolenaar  assert_equal(244, n)
483f0b9f43cSBram Moolenaar
484f0b9f43cSBram Moolenaar  try
485f0b9f43cSBram Moolenaar    n = +g:alist
486cd6b4f30SBram Moolenaar  catch /E1012:/
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:')
64484934998Srbtnn
64584934998Srbtnn  # skipping try-finally-endtry when try-finally-endtry is used in another block
64684934998Srbtnn  lines =<< trim END
64784934998Srbtnn      if v:true
64884934998Srbtnn        try
64984934998Srbtnn        finally
65084934998Srbtnn        endtry
65184934998Srbtnn      else
65284934998Srbtnn        try
65384934998Srbtnn        finally
65484934998Srbtnn        endtry
65584934998Srbtnn      endif
65684934998Srbtnn  END
65784934998Srbtnn  CheckDefAndScriptSuccess(lines)
6588a7d6542SBram Moolenaarenddef
6598a7d6542SBram Moolenaar
6603f987b59SBram Moolenaardef Test_try_in_catch()
6613f987b59SBram Moolenaar  var lines =<< trim END
6623f987b59SBram Moolenaar      vim9script
6633f987b59SBram Moolenaar      var seq = []
6643f987b59SBram Moolenaar      def DoIt()
6653f987b59SBram Moolenaar        try
6663f987b59SBram Moolenaar          seq->add('throw 1')
6673f987b59SBram Moolenaar          eval [][0]
6683f987b59SBram Moolenaar          seq->add('notreached')
6693f987b59SBram Moolenaar        catch
6703f987b59SBram Moolenaar          seq->add('catch')
6713f987b59SBram Moolenaar          try
6723f987b59SBram Moolenaar            seq->add('throw 2')
6733f987b59SBram Moolenaar            eval [][0]
6743f987b59SBram Moolenaar            seq->add('notreached')
6753f987b59SBram Moolenaar          catch /nothing/
6763f987b59SBram Moolenaar            seq->add('notreached')
6773f987b59SBram Moolenaar          endtry
6783f987b59SBram Moolenaar          seq->add('done')
6793f987b59SBram Moolenaar        endtry
6803f987b59SBram Moolenaar      enddef
6813f987b59SBram Moolenaar      DoIt()
6823f987b59SBram Moolenaar      assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
6833f987b59SBram Moolenaar  END
6843f987b59SBram Moolenaarenddef
6853f987b59SBram Moolenaar
686d3d8feebSBram Moolenaardef Test_error_in_catch()
687d3d8feebSBram Moolenaar  var lines =<< trim END
688d3d8feebSBram Moolenaar      try
689d3d8feebSBram Moolenaar        eval [][0]
690d3d8feebSBram Moolenaar      catch /E684:/
691d3d8feebSBram Moolenaar        eval [][0]
692d3d8feebSBram Moolenaar      endtry
693d3d8feebSBram Moolenaar  END
694d3d8feebSBram Moolenaar  CheckDefExecFailure(lines, 'E684:', 4)
695d3d8feebSBram Moolenaarenddef
696d3d8feebSBram Moolenaar
6972e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to
6982e34c34bSBram Moolenaardef TryContinueFunc()
6992e34c34bSBram Moolenaar while g:Count < 2
7002e34c34bSBram Moolenaar   g:sequence ..= 't'
7012e34c34bSBram Moolenaar    try
7022e34c34bSBram Moolenaar      echoerr 'Test'
7032e34c34bSBram Moolenaar    catch
7042e34c34bSBram Moolenaar      g:Count += 1
7052e34c34bSBram Moolenaar      g:sequence ..= 'c'
7062e34c34bSBram Moolenaar      continue
7072e34c34bSBram Moolenaar    endtry
7082e34c34bSBram Moolenaar    g:sequence ..= 'e'
7092e34c34bSBram Moolenaar    g:Count += 1
7102e34c34bSBram Moolenaar  endwhile
7112e34c34bSBram Moolenaarenddef
7122e34c34bSBram Moolenaar
7132e34c34bSBram Moolenaardef Test_continue_in_try_in_while()
7142e34c34bSBram Moolenaar  g:Count = 0
7152e34c34bSBram Moolenaar  g:sequence = ''
7162e34c34bSBram Moolenaar  TryContinueFunc()
7172e34c34bSBram Moolenaar  assert_equal('tctc', g:sequence)
7182e34c34bSBram Moolenaar  unlet g:Count
7192e34c34bSBram Moolenaar  unlet g:sequence
7202e34c34bSBram Moolenaarenddef
7212e34c34bSBram Moolenaar
7229cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
7239cb577a6SBram Moolenaar  # return in try block returns normally
7249cb577a6SBram Moolenaar  def ReturnInTry(): string
7259cb577a6SBram Moolenaar    try
7269cb577a6SBram Moolenaar      return '"some message"'
7279cb577a6SBram Moolenaar    catch
7289cb577a6SBram Moolenaar    endtry
7299cb577a6SBram Moolenaar    return 'not reached'
7309cb577a6SBram Moolenaar  enddef
7319cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
7329cb577a6SBram Moolenaarenddef
7339cb577a6SBram Moolenaar
7341430ceebSBram Moolenaardef Test_cnext_works_in_catch()
7351430ceebSBram Moolenaar  var lines =<< trim END
7361430ceebSBram Moolenaar      vim9script
737c323527dSBram Moolenaar      au BufEnter * eval 1 + 2
7381430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
7391430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
7401430ceebSBram Moolenaar      var items = [
7411430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
7421430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
7431430ceebSBram Moolenaar        ]
7441430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
7451430ceebSBram Moolenaar      cwindow
7461430ceebSBram Moolenaar
7471430ceebSBram Moolenaar      def CnextOrCfirst()
7481430ceebSBram Moolenaar        # if cnext fails, cfirst is used
7491430ceebSBram Moolenaar        try
7501430ceebSBram Moolenaar          cnext
7511430ceebSBram Moolenaar        catch
7521430ceebSBram Moolenaar          cfirst
7531430ceebSBram Moolenaar        endtry
7541430ceebSBram Moolenaar      enddef
7551430ceebSBram Moolenaar
7561430ceebSBram Moolenaar      CnextOrCfirst()
7571430ceebSBram Moolenaar      CnextOrCfirst()
7581430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
7591430ceebSBram Moolenaar      qall
7601430ceebSBram Moolenaar  END
7611430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
7621430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
7631430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
7641430ceebSBram Moolenaar
7651430ceebSBram Moolenaar  delete('Xfile1')
7661430ceebSBram Moolenaar  delete('Xfile2')
7671430ceebSBram Moolenaar  delete('XCatchCnext')
7681430ceebSBram Moolenaar  delete('Xresult')
7691430ceebSBram Moolenaarenddef
7701430ceebSBram Moolenaar
7719e1d9e34SBram Moolenaardef Test_throw_skipped()
7729e1d9e34SBram Moolenaar  if 0
7739e1d9e34SBram Moolenaar    throw dontgethere
7749e1d9e34SBram Moolenaar  endif
7759e1d9e34SBram Moolenaarenddef
7769e1d9e34SBram Moolenaar
7778f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
7788f81b22eSBram Moolenaar  var lines =<< trim END
7798f81b22eSBram Moolenaar    vim9script
7808f81b22eSBram Moolenaar    def Func()
7818f81b22eSBram Moolenaar      throw 'error'
7828f81b22eSBram Moolenaar    enddef
7838f81b22eSBram Moolenaar    silent! Func()
7848f81b22eSBram Moolenaar  END
7858f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
7868f81b22eSBram Moolenaar  source XthrowSilenced
7878f81b22eSBram Moolenaar  delete('XthrowSilenced')
7888f81b22eSBram Moolenaarenddef
7898f81b22eSBram Moolenaar
790e859312eSBram Moolenaardef DeletedFunc(): list<any>
791e859312eSBram Moolenaar  return ['delete me']
792e859312eSBram Moolenaarenddef
793e859312eSBram Moolenaardefcompile
794e859312eSBram Moolenaardelfunc DeletedFunc
795e859312eSBram Moolenaar
796257cc5eeSBram Moolenaardef ThrowFromDef()
797a72cfb80SBram Moolenaar  throw "getout" # comment
798257cc5eeSBram Moolenaarenddef
799257cc5eeSBram Moolenaar
800257cc5eeSBram Moolenaarfunc CatchInFunc()
801257cc5eeSBram Moolenaar  try
802257cc5eeSBram Moolenaar    call ThrowFromDef()
803257cc5eeSBram Moolenaar  catch
804257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
805257cc5eeSBram Moolenaar  endtry
806257cc5eeSBram Moolenaarendfunc
807257cc5eeSBram Moolenaar
808257cc5eeSBram Moolenaardef CatchInDef()
809257cc5eeSBram Moolenaar  try
810257cc5eeSBram Moolenaar    ThrowFromDef()
811257cc5eeSBram Moolenaar  catch
812257cc5eeSBram Moolenaar    g:thrown_def = v:exception
813257cc5eeSBram Moolenaar  endtry
814257cc5eeSBram Moolenaarenddef
815257cc5eeSBram Moolenaar
816f575adffSBram Moolenaardef ReturnFinally(): string
817f575adffSBram Moolenaar  try
818f575adffSBram Moolenaar    return 'intry'
819373863edSBram Moolenaar  finall
820f575adffSBram Moolenaar    g:in_finally = 'finally'
821f575adffSBram Moolenaar  endtry
822f575adffSBram Moolenaar  return 'end'
823f575adffSBram Moolenaarenddef
824f575adffSBram Moolenaar
825257cc5eeSBram Moolenaardef Test_try_catch_nested()
826257cc5eeSBram Moolenaar  CatchInFunc()
827257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
828257cc5eeSBram Moolenaar
829257cc5eeSBram Moolenaar  CatchInDef()
830257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
831f575adffSBram Moolenaar
832f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
833f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
834d3d8feebSBram Moolenaar
835d3d8feebSBram Moolenaar  var l = []
836d3d8feebSBram Moolenaar  try
837d3d8feebSBram Moolenaar    l->add('1')
838d3d8feebSBram Moolenaar    throw 'bad'
839d3d8feebSBram Moolenaar    l->add('x')
840d3d8feebSBram Moolenaar  catch /bad/
841d3d8feebSBram Moolenaar    l->add('2')
842d3d8feebSBram Moolenaar    try
843d3d8feebSBram Moolenaar      l->add('3')
844d3d8feebSBram Moolenaar      throw 'one'
845d3d8feebSBram Moolenaar      l->add('x')
846d3d8feebSBram Moolenaar    catch /one/
847d3d8feebSBram Moolenaar      l->add('4')
848d3d8feebSBram Moolenaar      try
849d3d8feebSBram Moolenaar        l->add('5')
850d3d8feebSBram Moolenaar        throw 'more'
851d3d8feebSBram Moolenaar        l->add('x')
852d3d8feebSBram Moolenaar      catch /more/
853d3d8feebSBram Moolenaar        l->add('6')
854d3d8feebSBram Moolenaar      endtry
855d3d8feebSBram Moolenaar    endtry
856d3d8feebSBram Moolenaar  endtry
857d3d8feebSBram Moolenaar  assert_equal(['1', '2', '3', '4', '5', '6'], l)
858834193afSBram Moolenaar
859834193afSBram Moolenaar  l = []
860834193afSBram Moolenaar  try
861834193afSBram Moolenaar    try
862834193afSBram Moolenaar      l->add('1')
863834193afSBram Moolenaar      throw 'foo'
864834193afSBram Moolenaar      l->add('x')
865834193afSBram Moolenaar    catch
866834193afSBram Moolenaar      l->add('2')
867834193afSBram Moolenaar      throw 'bar'
868834193afSBram Moolenaar      l->add('x')
869834193afSBram Moolenaar    finally
870834193afSBram Moolenaar      l->add('3')
871834193afSBram Moolenaar    endtry
872834193afSBram Moolenaar    l->add('x')
873834193afSBram Moolenaar  catch /bar/
874834193afSBram Moolenaar    l->add('4')
875834193afSBram Moolenaar  endtry
876834193afSBram Moolenaar  assert_equal(['1', '2', '3', '4'], l)
877f575adffSBram Moolenaarenddef
878f575adffSBram Moolenaar
8799939f57bSBram Moolenaardef TryOne(): number
8809939f57bSBram Moolenaar  try
8819939f57bSBram Moolenaar    return 0
8829939f57bSBram Moolenaar  catch
8839939f57bSBram Moolenaar  endtry
8849939f57bSBram Moolenaar  return 0
8859939f57bSBram Moolenaarenddef
8869939f57bSBram Moolenaar
8879939f57bSBram Moolenaardef TryTwo(n: number): string
8889939f57bSBram Moolenaar  try
889cfcd011fSBram Moolenaar    var x = {}
8909939f57bSBram Moolenaar  catch
8919939f57bSBram Moolenaar  endtry
8929939f57bSBram Moolenaar  return 'text'
8939939f57bSBram Moolenaarenddef
8949939f57bSBram Moolenaar
8959939f57bSBram Moolenaardef Test_try_catch_twice()
8969939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
8979939f57bSBram Moolenaarenddef
8989939f57bSBram Moolenaar
899f575adffSBram Moolenaardef Test_try_catch_match()
900cfcd011fSBram Moolenaar  var seq = 'a'
901f575adffSBram Moolenaar  try
902f575adffSBram Moolenaar    throw 'something'
903f575adffSBram Moolenaar  catch /nothing/
904f575adffSBram Moolenaar    seq ..= 'x'
905f575adffSBram Moolenaar  catch /some/
906f575adffSBram Moolenaar    seq ..= 'b'
907f575adffSBram Moolenaar  catch /asdf/
908f575adffSBram Moolenaar    seq ..= 'x'
909e8c4abbbSBram Moolenaar  catch ?a\?sdf?
910e8c4abbbSBram Moolenaar    seq ..= 'y'
911f575adffSBram Moolenaar  finally
912f575adffSBram Moolenaar    seq ..= 'c'
913f575adffSBram Moolenaar  endtry
914f575adffSBram Moolenaar  assert_equal('abc', seq)
915257cc5eeSBram Moolenaarenddef
916257cc5eeSBram Moolenaar
917e8c4abbbSBram Moolenaardef Test_try_catch_fails()
918d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
919d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
920d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
921d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
922d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
923d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
924d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
925d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
92613106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
927d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
928585fea7bSBram Moolenaar
929e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
930d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
931e8c4abbbSBram Moolenaarenddef
932e8c4abbbSBram Moolenaar
9337c5b3c03SBram Moolenaardef Try_catch_skipped()
9347c5b3c03SBram Moolenaar  var l = []
9357c5b3c03SBram Moolenaar  try
9367c5b3c03SBram Moolenaar  finally
9377c5b3c03SBram Moolenaar  endtry
9387c5b3c03SBram Moolenaar
9397c5b3c03SBram Moolenaar  if 1
9407c5b3c03SBram Moolenaar  else
9417c5b3c03SBram Moolenaar    try
9427c5b3c03SBram Moolenaar    endtry
9437c5b3c03SBram Moolenaar  endif
9447c5b3c03SBram Moolenaarenddef
9457c5b3c03SBram Moolenaar
9467c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
9477c5b3c03SBram Moolenaardef Test_try_catch_skipped()
9487c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
9497c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
9507c5b3c03SBram Moolenaarenddef
9517c5b3c03SBram Moolenaar
9527c5b3c03SBram Moolenaar
9537c5b3c03SBram Moolenaar
954006ad48bSBram Moolenaardef Test_throw_vimscript()
955f5be8cdbSBram Moolenaar  # only checks line continuation
956cfcd011fSBram Moolenaar  var lines =<< trim END
957006ad48bSBram Moolenaar      vim9script
958006ad48bSBram Moolenaar      try
959006ad48bSBram Moolenaar        throw 'one'
960006ad48bSBram Moolenaar              .. 'two'
961006ad48bSBram Moolenaar      catch
962006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
963006ad48bSBram Moolenaar      endtry
964006ad48bSBram Moolenaar  END
965006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
9661e021e63SBram Moolenaar
9671e021e63SBram Moolenaar  lines =<< trim END
9681e021e63SBram Moolenaar    vim9script
969352134bbSBram Moolenaar    @r = ''
9701e021e63SBram Moolenaar    def Func()
9711e021e63SBram Moolenaar      throw @r
9721e021e63SBram Moolenaar    enddef
9731e021e63SBram Moolenaar    var result = ''
9741e021e63SBram Moolenaar    try
9751e021e63SBram Moolenaar      Func()
9761e021e63SBram Moolenaar    catch /E1129:/
9771e021e63SBram Moolenaar      result = 'caught'
9781e021e63SBram Moolenaar    endtry
9791e021e63SBram Moolenaar    assert_equal('caught', result)
9801e021e63SBram Moolenaar  END
9811e021e63SBram Moolenaar  CheckScriptSuccess(lines)
982006ad48bSBram Moolenaarenddef
983006ad48bSBram Moolenaar
984ed677f55SBram Moolenaardef Test_error_in_nested_function()
98503dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
986cfcd011fSBram Moolenaar  var lines =<< trim END
987ed677f55SBram Moolenaar      vim9script
988ed677f55SBram Moolenaar      def Func()
989ed677f55SBram Moolenaar        Error()
990ed677f55SBram Moolenaar        g:test_var = 1
991ed677f55SBram Moolenaar      enddef
992ed677f55SBram Moolenaar      func Error() abort
993ed677f55SBram Moolenaar        eval [][0]
994ed677f55SBram Moolenaar      endfunc
995ed677f55SBram Moolenaar      Func()
996ed677f55SBram Moolenaar  END
997ed677f55SBram Moolenaar  g:test_var = 0
998ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
999ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
1000ed677f55SBram Moolenaarenddef
1001ed677f55SBram Moolenaar
1002227c58a4SBram Moolenaardef Test_abort_after_error()
1003227c58a4SBram Moolenaar  var lines =<< trim END
1004227c58a4SBram Moolenaar      vim9script
1005227c58a4SBram Moolenaar      while true
1006227c58a4SBram Moolenaar        echo notfound
1007227c58a4SBram Moolenaar      endwhile
1008227c58a4SBram Moolenaar      g:gotthere = true
1009227c58a4SBram Moolenaar  END
1010227c58a4SBram Moolenaar  g:gotthere = false
1011227c58a4SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
1012227c58a4SBram Moolenaar  assert_false(g:gotthere)
1013227c58a4SBram Moolenaar  unlet g:gotthere
1014227c58a4SBram Moolenaarenddef
1015227c58a4SBram Moolenaar
101637c83711SBram Moolenaardef Test_cexpr_vimscript()
1017f5be8cdbSBram Moolenaar  # only checks line continuation
101837c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
1019cfcd011fSBram Moolenaar  var lines =<< trim END
102037c83711SBram Moolenaar      vim9script
102137c83711SBram Moolenaar      cexpr 'File'
102237c83711SBram Moolenaar                .. ' someFile' ..
102337c83711SBram Moolenaar                   ' line 19'
102437c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
102537c83711SBram Moolenaar  END
102637c83711SBram Moolenaar  CheckScriptSuccess(lines)
102737c83711SBram Moolenaar  set errorformat&
102837c83711SBram Moolenaarenddef
102937c83711SBram Moolenaar
1030c9edd6b5SBram Moolenaardef Test_statusline_syntax()
1031c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
1032cfcd011fSBram Moolenaar  var lines =<< trim END
1033c9edd6b5SBram Moolenaar      vim9script
1034c9edd6b5SBram Moolenaar      func g:Status()
1035c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
1036c9edd6b5SBram Moolenaar      endfunc
1037c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
1038c9edd6b5SBram Moolenaar      redrawstatus
1039c9edd6b5SBram Moolenaar      set laststatus statusline=
1040c9edd6b5SBram Moolenaar  END
1041c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1042c9edd6b5SBram Moolenaarenddef
1043c9edd6b5SBram Moolenaar
1044b209750bSBram Moolenaardef Test_list_vimscript()
1045b209750bSBram Moolenaar  # checks line continuation and comments
1046cfcd011fSBram Moolenaar  var lines =<< trim END
1047b209750bSBram Moolenaar      vim9script
1048cfcd011fSBram Moolenaar      var mylist = [
1049b209750bSBram Moolenaar            'one',
1050b209750bSBram Moolenaar            # comment
1051b209750bSBram Moolenaar            'two', # empty line follows
1052b209750bSBram Moolenaar
1053b209750bSBram Moolenaar            'three',
1054b209750bSBram Moolenaar            ]
1055b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1056b209750bSBram Moolenaar  END
1057b209750bSBram Moolenaar  CheckScriptSuccess(lines)
105866250c93SBram Moolenaar
105966250c93SBram Moolenaar  # check all lines from heredoc are kept
106066250c93SBram Moolenaar  lines =<< trim END
106166250c93SBram Moolenaar      # comment 1
106266250c93SBram Moolenaar      two
106366250c93SBram Moolenaar      # comment 3
106466250c93SBram Moolenaar
106566250c93SBram Moolenaar      five
106666250c93SBram Moolenaar      # comment 6
106766250c93SBram Moolenaar  END
106866250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
10694bce26bbSBram Moolenaar
10704bce26bbSBram Moolenaar  lines =<< trim END
10714bce26bbSBram Moolenaar    [{
10724bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
10734bce26bbSBram Moolenaar  END
10744bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1075b209750bSBram Moolenaarenddef
1076b209750bSBram Moolenaar
10772a1381c3SBram Moolenaarif has('channel')
107840ee466cSBram Moolenaar  let someJob = test_null_job()
107940ee466cSBram Moolenaar
108040ee466cSBram Moolenaar  def FuncWithError()
108140ee466cSBram Moolenaar    echomsg g:someJob
108240ee466cSBram Moolenaar  enddef
108340ee466cSBram Moolenaar
108440ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
108540ee466cSBram Moolenaar    try
108640ee466cSBram Moolenaar      call FuncWithError()
108740ee466cSBram Moolenaar    catch
108840ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
108940ee466cSBram Moolenaar    endtry
109040ee466cSBram Moolenaar  endfunc
10912a1381c3SBram Moolenaarendif
109240ee466cSBram Moolenaar
10938a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
10948a7d6542SBram Moolenaar  vim9script
1095cfcd011fSBram Moolenaar  var name: string = 'bob'
10968a7d6542SBram Moolenaar  def Concat(arg: string): string
10978a7d6542SBram Moolenaar    return name .. arg
10988a7d6542SBram Moolenaar  enddef
1099227a69deSBram Moolenaar  g:result = Concat('bie')
1100227a69deSBram Moolenaar  g:localname = name
11018a7d6542SBram Moolenaar
11028a7d6542SBram Moolenaar  export const CONST = 1234
1103cfcd011fSBram Moolenaar  export var exported = 9876
1104cfcd011fSBram Moolenaar  export var exp_name = 'John'
11058a7d6542SBram Moolenaar  export def Exported(): string
11068a7d6542SBram Moolenaar    return 'Exported'
11078a7d6542SBram Moolenaar  enddef
110824e93165SBram Moolenaar  export def ExportedValue(): number
110924e93165SBram Moolenaar    return exported
111024e93165SBram Moolenaar  enddef
111124e93165SBram Moolenaar  export def ExportedInc()
111224e93165SBram Moolenaar    exported += 5
111324e93165SBram Moolenaar  enddef
11140f2a5cc6SBram Moolenaar  export final theList = [1]
11158a7d6542SBram MoolenaarEND
11168a7d6542SBram Moolenaar
1117b3ca9824SBram Moolenaardef Undo_export_script_lines()
1118b3ca9824SBram Moolenaar  unlet g:result
1119b3ca9824SBram Moolenaar  unlet g:localname
1120b3ca9824SBram Moolenaarenddef
1121b3ca9824SBram Moolenaar
11225269bd2aSBram Moolenaardef Test_vim9_import_export()
1123cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
11248a7d6542SBram Moolenaar    vim9script
112524e93165SBram Moolenaar    import {exported, Exported, ExportedValue} from './Xexport.vim'
112624e93165SBram Moolenaar    g:exported1 = exported
11276e587dcbSBram Moolenaar    exported += 3
112824e93165SBram Moolenaar    g:exported2 = exported
112924e93165SBram Moolenaar    g:exported3 = ExportedValue()
113024e93165SBram Moolenaar
113124e93165SBram Moolenaar    import ExportedInc from './Xexport.vim'
113224e93165SBram Moolenaar    ExportedInc()
113324e93165SBram Moolenaar    g:exported_i1 = exported
113424e93165SBram Moolenaar    g:exported_i2 = ExportedValue()
113524e93165SBram Moolenaar
113624e93165SBram Moolenaar    exported = 11
113724e93165SBram Moolenaar    g:exported_s1 = exported
113824e93165SBram Moolenaar    g:exported_s2 = ExportedValue()
113924e93165SBram Moolenaar
11408a7d6542SBram Moolenaar    g:imported_func = Exported()
11416e587dcbSBram Moolenaar
114240f4f7a4SBram Moolenaar    def GetExported(): string
1143e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
114440f4f7a4SBram Moolenaar      return local_dict.ref()
114540f4f7a4SBram Moolenaar    enddef
114640f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
114740f4f7a4SBram Moolenaar
11484db572eeSBram Moolenaar    var dir = './'
11494db572eeSBram Moolenaar    var ext = ".vim"
11504db572eeSBram Moolenaar    import {exp_name} from dir .. 'Xexport' .. ext
11516e587dcbSBram Moolenaar    g:imported_name = exp_name
11526e587dcbSBram Moolenaar    exp_name ..= ' Doe'
11536e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
115424e93165SBram Moolenaar    g:exported_later = exported
11550f2a5cc6SBram Moolenaar
11560f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
11570f2a5cc6SBram Moolenaar    theList->add(2)
11580f2a5cc6SBram Moolenaar    assert_equal([1, 2], theList)
11598a7d6542SBram Moolenaar  END
11608a7d6542SBram Moolenaar
11618a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
11628a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
11638a7d6542SBram Moolenaar
11648a7d6542SBram Moolenaar  source Ximport.vim
11658a7d6542SBram Moolenaar
11668a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
11678a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
116824e93165SBram Moolenaar  assert_equal(9876, g:exported1)
116924e93165SBram Moolenaar  assert_equal(9879, g:exported2)
117024e93165SBram Moolenaar  assert_equal(9879, g:exported3)
117124e93165SBram Moolenaar
117224e93165SBram Moolenaar  assert_equal(9884, g:exported_i1)
117324e93165SBram Moolenaar  assert_equal(9884, g:exported_i2)
117424e93165SBram Moolenaar
117524e93165SBram Moolenaar  assert_equal(11, g:exported_s1)
117624e93165SBram Moolenaar  assert_equal(11, g:exported_s2)
117724e93165SBram Moolenaar  assert_equal(11, g:exported_later)
117824e93165SBram Moolenaar
11798a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
118040f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
11816e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
11826e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
11838a7d6542SBram Moolenaar  assert_false(exists('g:name'))
11848a7d6542SBram Moolenaar
1185b3ca9824SBram Moolenaar  Undo_export_script_lines()
118624e93165SBram Moolenaar  unlet g:exported1
118724e93165SBram Moolenaar  unlet g:exported2
118824e93165SBram Moolenaar  unlet g:exported3
118924e93165SBram Moolenaar  unlet g:exported_i1
119024e93165SBram Moolenaar  unlet g:exported_i2
119124e93165SBram Moolenaar  unlet g:exported_later
11928a7d6542SBram Moolenaar  unlet g:imported_func
11936e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
11948a7d6542SBram Moolenaar  delete('Ximport.vim')
1195f2d5c240SBram Moolenaar
11961c991144SBram Moolenaar  # similar, with line breaks
1197cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
11981c991144SBram Moolenaar    vim9script
11991c991144SBram Moolenaar    import {
12001c991144SBram Moolenaar        exported,
12011c991144SBram Moolenaar        Exported,
12021c991144SBram Moolenaar        }
12031c991144SBram Moolenaar        from
12041c991144SBram Moolenaar        './Xexport.vim'
120524e93165SBram Moolenaar    g:exported = exported
120624e93165SBram Moolenaar    exported += 7
120724e93165SBram Moolenaar    g:exported_added = exported
12081c991144SBram Moolenaar    g:imported_func = Exported()
12091c991144SBram Moolenaar  END
12101c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
12111c991144SBram Moolenaar  source Ximport_lbr.vim
12121c991144SBram Moolenaar
121324e93165SBram Moolenaar  assert_equal(11, g:exported)
121424e93165SBram Moolenaar  assert_equal(18, g:exported_added)
12151c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
12161c991144SBram Moolenaar
12171c991144SBram Moolenaar  # exported script not sourced again
12181c991144SBram Moolenaar  assert_false(exists('g:result'))
121924e93165SBram Moolenaar  unlet g:exported
122024e93165SBram Moolenaar  unlet g:exported_added
12211c991144SBram Moolenaar  unlet g:imported_func
12221c991144SBram Moolenaar  delete('Ximport_lbr.vim')
12231c991144SBram Moolenaar
1224cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1225f2d5c240SBram Moolenaar    vim9script
1226f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1227f2d5c240SBram Moolenaar    def UseExport()
122824e93165SBram Moolenaar      g:exported_def = Export.exported
1229f2d5c240SBram Moolenaar    enddef
123024e93165SBram Moolenaar    g:exported_script = Export.exported
1231cb4e80faSBram Moolenaar    assert_equal(1, exists('Export.exported'))
1232cb4e80faSBram Moolenaar    assert_equal(0, exists('Export.notexported'))
1233f2d5c240SBram Moolenaar    UseExport()
1234f2d5c240SBram Moolenaar  END
1235f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1236f2d5c240SBram Moolenaar  source Ximport.vim
123724e93165SBram Moolenaar
123824e93165SBram Moolenaar  assert_equal(18, g:exported_def)
123924e93165SBram Moolenaar  assert_equal(18, g:exported_script)
124024e93165SBram Moolenaar  unlet g:exported_def
124124e93165SBram Moolenaar  unlet g:exported_script
1242f2d5c240SBram Moolenaar
1243cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1244599c89c8SBram Moolenaar    vim9script
1245599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1246599c89c8SBram Moolenaar    def Func()
1247cfcd011fSBram Moolenaar      var dummy = 1
1248cfcd011fSBram Moolenaar      var imported = Export + dummy
1249599c89c8SBram Moolenaar    enddef
1250822ba247SBram Moolenaar    defcompile
1251599c89c8SBram Moolenaar  END
1252599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
125344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1254599c89c8SBram Moolenaar
1255cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1256599c89c8SBram Moolenaar    vim9script
1257599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1258599c89c8SBram Moolenaar    def Func()
1259cfcd011fSBram Moolenaar      var imported = Export . exported
1260599c89c8SBram Moolenaar    enddef
1261822ba247SBram Moolenaar    defcompile
1262599c89c8SBram Moolenaar  END
1263599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
126444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1265599c89c8SBram Moolenaar
1266921ba529SBram Moolenaar  var import_func_duplicated =<< trim END
1267921ba529SBram Moolenaar    vim9script
1268921ba529SBram Moolenaar    import ExportedInc from './Xexport.vim'
1269921ba529SBram Moolenaar    import ExportedInc from './Xexport.vim'
1270921ba529SBram Moolenaar
1271921ba529SBram Moolenaar    ExportedInc()
1272921ba529SBram Moolenaar  END
1273921ba529SBram Moolenaar  writefile(import_func_duplicated, 'Ximport.vim')
1274921ba529SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
1275921ba529SBram Moolenaar
1276a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1277a6294955SBram Moolenaar    vim9script
1278a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1279a6294955SBram Moolenaar    var some = 'other'
1280a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1281a6294955SBram Moolenaar    defcompile
1282a6294955SBram Moolenaar  END
1283a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1284a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1285a6294955SBram Moolenaar
1286cb4e80faSBram Moolenaar  var import_star_as_lines_script_no_dot =<< trim END
1287cb4e80faSBram Moolenaar    vim9script
1288cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1289cb4e80faSBram Moolenaar    g:imported_script = Export exported
1290cb4e80faSBram Moolenaar  END
1291cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
1292cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1029:')
1293cb4e80faSBram Moolenaar
1294cb4e80faSBram Moolenaar  var import_star_as_lines_script_space_after_dot =<< trim END
1295cb4e80faSBram Moolenaar    vim9script
1296cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1297cb4e80faSBram Moolenaar    g:imported_script = Export. exported
1298cb4e80faSBram Moolenaar  END
1299cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1300cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1301cb4e80faSBram Moolenaar
1302cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1303599c89c8SBram Moolenaar    vim9script
1304599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1305599c89c8SBram Moolenaar    def Func()
1306cfcd011fSBram Moolenaar      var imported = Export.
1307599c89c8SBram Moolenaar    enddef
1308822ba247SBram Moolenaar    defcompile
1309599c89c8SBram Moolenaar  END
1310599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
131144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1312599c89c8SBram Moolenaar
1313cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
13141c991144SBram Moolenaar    vim9script
13151c991144SBram Moolenaar    import *
13161c991144SBram Moolenaar        as Export
13171c991144SBram Moolenaar        from
13181c991144SBram Moolenaar        './Xexport.vim'
13191c991144SBram Moolenaar    def UseExport()
132024e93165SBram Moolenaar      g:exported = Export.exported
13211c991144SBram Moolenaar    enddef
13221c991144SBram Moolenaar    UseExport()
13231c991144SBram Moolenaar  END
13241c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
13251c991144SBram Moolenaar  source Ximport.vim
132624e93165SBram Moolenaar  assert_equal(18, g:exported)
132724e93165SBram Moolenaar  unlet g:exported
13281c991144SBram Moolenaar
1329cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1330f2d5c240SBram Moolenaar    vim9script
1331f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1332f2d5c240SBram Moolenaar  END
1333f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
133444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1335f2d5c240SBram Moolenaar
1336f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1337cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1338fa29c8abSBram Moolenaar    vim9script
1339fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1340fa29c8abSBram Moolenaar  END
1341fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
134244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1343fa29c8abSBram Moolenaar
1344f5be8cdbSBram Moolenaar  # try to import something that is already defined
1345cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
13465269bd2aSBram Moolenaar    vim9script
1347cfcd011fSBram Moolenaar    var exported = 'something'
13485269bd2aSBram Moolenaar    import exported from './Xexport.vim'
13495269bd2aSBram Moolenaar  END
13505269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1351057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13525269bd2aSBram Moolenaar
1353f5be8cdbSBram Moolenaar  # try to import something that is already defined
13545269bd2aSBram Moolenaar  import_already_defined =<< trim END
13555269bd2aSBram Moolenaar    vim9script
1356cfcd011fSBram Moolenaar    var exported = 'something'
13575269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
13585269bd2aSBram Moolenaar  END
13595269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1360057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13615269bd2aSBram Moolenaar
1362f5be8cdbSBram Moolenaar  # try to import something that is already defined
13635269bd2aSBram Moolenaar  import_already_defined =<< trim END
13645269bd2aSBram Moolenaar    vim9script
1365cfcd011fSBram Moolenaar    var exported = 'something'
13665269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
13675269bd2aSBram Moolenaar  END
13685269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1369057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13705269bd2aSBram Moolenaar
1371918a4249SBram Moolenaar  # try changing an imported const
1372918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1373918a4249SBram Moolenaar    vim9script
1374918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1375918a4249SBram Moolenaar    def Assign()
1376918a4249SBram Moolenaar      CONST = 987
1377918a4249SBram Moolenaar    enddef
1378918a4249SBram Moolenaar    defcompile
1379918a4249SBram Moolenaar  END
1380918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1381918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1382918a4249SBram Moolenaar
13830f2a5cc6SBram Moolenaar  # try changing an imported final
13840f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
13850f2a5cc6SBram Moolenaar    vim9script
13860f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
13870f2a5cc6SBram Moolenaar    def Assign()
13880f2a5cc6SBram Moolenaar      theList = [2]
13890f2a5cc6SBram Moolenaar    enddef
13900f2a5cc6SBram Moolenaar    defcompile
13910f2a5cc6SBram Moolenaar  END
13920f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
13930f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
13940f2a5cc6SBram Moolenaar
1395f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1396cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1397fa29c8abSBram Moolenaar    vim9script
1398fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1399fa29c8abSBram Moolenaar  END
1400fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
140144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1402fa29c8abSBram Moolenaar
1403cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1404fa29c8abSBram Moolenaar    vim9script
1405fa29c8abSBram Moolenaar    import name './Xexport.vim'
1406fa29c8abSBram Moolenaar  END
1407fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
140844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1409fa29c8abSBram Moolenaar
1410cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1411fa29c8abSBram Moolenaar    vim9script
1412fa29c8abSBram Moolenaar    import name from Xexport.vim
1413fa29c8abSBram Moolenaar  END
1414fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
14154db572eeSBram Moolenaar  assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim')
1416fa29c8abSBram Moolenaar
1417cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1418fa29c8abSBram Moolenaar    vim9script
1419fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1420fa29c8abSBram Moolenaar  END
1421fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
142244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1423fa29c8abSBram Moolenaar
1424cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1425fa29c8abSBram Moolenaar    vim9script
1426fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1427fa29c8abSBram Moolenaar  END
14285269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
142944d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1430fa29c8abSBram Moolenaar
143160579350SBram Moolenaar  var import_redefining_lines =<< trim END
143260579350SBram Moolenaar    vim9script
143360579350SBram Moolenaar    import exported from './Xexport.vim'
143460579350SBram Moolenaar    var exported = 5
143560579350SBram Moolenaar  END
143660579350SBram Moolenaar  writefile(import_redefining_lines, 'Ximport.vim')
143760579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3)
143860579350SBram Moolenaar
143960579350SBram Moolenaar  var import_assign_wrong_type_lines =<< trim END
144060579350SBram Moolenaar    vim9script
144160579350SBram Moolenaar    import exported from './Xexport.vim'
144260579350SBram Moolenaar    exported = 'xxx'
144360579350SBram Moolenaar  END
144460579350SBram Moolenaar  writefile(import_assign_wrong_type_lines, 'Ximport.vim')
144560579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3)
144660579350SBram Moolenaar
144760579350SBram Moolenaar  var import_assign_const_lines =<< trim END
144860579350SBram Moolenaar    vim9script
144960579350SBram Moolenaar    import CONST from './Xexport.vim'
145060579350SBram Moolenaar    CONST = 4321
145160579350SBram Moolenaar  END
145260579350SBram Moolenaar  writefile(import_assign_const_lines, 'Ximport.vim')
145360579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E741: Value is locked: CONST', '', 3)
145460579350SBram Moolenaar
1455f2d5c240SBram Moolenaar  delete('Ximport.vim')
14565269bd2aSBram Moolenaar  delete('Ximport3.vim')
14578a7d6542SBram Moolenaar  delete('Xexport.vim')
14588a7d6542SBram Moolenaar
1459f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
14603e191694SBram Moolenaar  # Flags added or removed are also applied to the restored value.
14613e191694SBram Moolenaar  set cpo=abcd
1462cfcd011fSBram Moolenaar  var lines =<< trim END
1463750802b5SBram Moolenaar    vim9script
1464750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
14653e191694SBram Moolenaar    set cpo+=f
14663e191694SBram Moolenaar    set cpo-=c
14673e191694SBram Moolenaar    g:cpo_after_vim9script = &cpo
1468750802b5SBram Moolenaar  END
1469750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1470750802b5SBram Moolenaar  source Xvim9_script
14713e191694SBram Moolenaar  assert_equal('fabd', &cpo)
1472750802b5SBram Moolenaar  set cpo&vim
1473750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
14743e191694SBram Moolenaar  var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
14753e191694SBram Moolenaar  assert_equal(newcpo, g:cpo_after_vim9script)
14763e191694SBram Moolenaar
1477750802b5SBram Moolenaar  delete('Xvim9_script')
1478750802b5SBram Moolenaarenddef
1479750802b5SBram Moolenaar
14806853c38bSBram Moolenaardef Test_import_star_fails()
14816853c38bSBram Moolenaar  writefile([], 'Xfoo.vim')
14826853c38bSBram Moolenaar  var lines =<< trim END
1483*af2d5d2cSBram Moolenaar      import * as foo from './Xfoo.vim'
14846853c38bSBram Moolenaar      foo = 'bar'
14856853c38bSBram Moolenaar  END
14866853c38bSBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1094:', 'E1236: Cannot use foo itself')
14876853c38bSBram Moolenaar  lines =<< trim END
14886853c38bSBram Moolenaar      vim9script
1489*af2d5d2cSBram Moolenaar      import * as foo from './Xfoo.vim'
14906853c38bSBram Moolenaar      var that = foo
14916853c38bSBram Moolenaar  END
14926853c38bSBram Moolenaar  CheckScriptFailure(lines, 'E1029: Expected ''.''')
1493*af2d5d2cSBram Moolenaar  delete('Xfoo.vim')
14946853c38bSBram Moolenaarenddef
14956853c38bSBram Moolenaar
14960a84284eSBram Moolenaardef Test_import_as()
14970a84284eSBram Moolenaar  var export_lines =<< trim END
14980a84284eSBram Moolenaar    vim9script
14990a84284eSBram Moolenaar    export var one = 1
15000a84284eSBram Moolenaar    export var yes = 'yes'
1501c967d57aSBram Moolenaar    export var slist: list<string>
15020a84284eSBram Moolenaar  END
15030a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
15040a84284eSBram Moolenaar
15050a84284eSBram Moolenaar  var import_lines =<< trim END
15060a84284eSBram Moolenaar    vim9script
15076c7cc347SBram Moolenaar    var one = 'notused'
15086c7cc347SBram Moolenaar    var yes = 777
15090a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
15100a84284eSBram Moolenaar    assert_equal(1, thatOne)
15110a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
15120a84284eSBram Moolenaar    assert_equal('yes', yesYes)
15130a84284eSBram Moolenaar  END
15140a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
15150a84284eSBram Moolenaar
15160a84284eSBram Moolenaar  import_lines =<< trim END
15170a84284eSBram Moolenaar    vim9script
15180a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
15190a84284eSBram Moolenaar    assert_equal(1, thatOne)
15200a84284eSBram Moolenaar    assert_equal('yes', yesYes)
15210a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
15220a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
15230a84284eSBram Moolenaar  END
15240a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
15250a84284eSBram Moolenaar
1526c967d57aSBram Moolenaar  import_lines =<< trim END
1527c967d57aSBram Moolenaar    vim9script
1528c967d57aSBram Moolenaar    import {slist as impSlist} from './XexportAs'
1529c967d57aSBram Moolenaar    impSlist->add(123)
1530c967d57aSBram Moolenaar  END
1531c967d57aSBram Moolenaar  CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number')
1532c967d57aSBram Moolenaar
15330a84284eSBram Moolenaar  delete('XexportAs')
15340a84284eSBram Moolenaarenddef
15350a84284eSBram Moolenaar
1536803af686SBram Moolenaarfunc g:Trigger()
1537803af686SBram Moolenaar  source Ximport.vim
1538803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1539803af686SBram Moolenaarendfunc
1540803af686SBram Moolenaar
1541803af686SBram Moolenaardef Test_import_export_expr_map()
1542803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1543cfcd011fSBram Moolenaar  var export_lines =<< trim END
1544803af686SBram Moolenaar    vim9script
1545803af686SBram Moolenaar    export def That(): string
1546803af686SBram Moolenaar      return 'yes'
1547803af686SBram Moolenaar    enddef
1548803af686SBram Moolenaar  END
1549803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1550803af686SBram Moolenaar
1551cfcd011fSBram Moolenaar  var import_lines =<< trim END
1552803af686SBram Moolenaar    vim9script
1553803af686SBram Moolenaar    import That from './Xexport_that.vim'
1554803af686SBram Moolenaar    assert_equal('yes', That())
1555803af686SBram Moolenaar  END
1556803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1557803af686SBram Moolenaar
1558803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1559803af686SBram Moolenaar  feedkeys('trigger', "xt")
1560803af686SBram Moolenaar
1561730b2483SBram Moolenaar  delete('Xexport_that.vim')
1562803af686SBram Moolenaar  delete('Ximport.vim')
1563803af686SBram Moolenaar  nunmap trigger
1564803af686SBram Moolenaarenddef
1565803af686SBram Moolenaar
15668e1986e3SBram Moolenaardef Test_import_in_filetype()
15678e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
15688e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1569cfcd011fSBram Moolenaar  var export_lines =<< trim END
15708e1986e3SBram Moolenaar    vim9script
1571cfcd011fSBram Moolenaar    export var That = 'yes'
15728e1986e3SBram Moolenaar  END
1573730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
15748e1986e3SBram Moolenaar
1575cfcd011fSBram Moolenaar  var import_lines =<< trim END
15768e1986e3SBram Moolenaar    vim9script
1577730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
15788e1986e3SBram Moolenaar    assert_equal('yes', That)
15798e1986e3SBram Moolenaar    g:did_load_mytpe = 1
15808e1986e3SBram Moolenaar  END
15818e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
15828e1986e3SBram Moolenaar
1583cfcd011fSBram Moolenaar  var save_rtp = &rtp
15848e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
15858e1986e3SBram Moolenaar
15868e1986e3SBram Moolenaar  filetype plugin on
15878e1986e3SBram Moolenaar  copen
15888e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
15898e1986e3SBram Moolenaar
15908e1986e3SBram Moolenaar  quit!
1591730b2483SBram Moolenaar  delete('Xexport_ft.vim')
15928e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
15938e1986e3SBram Moolenaar  &rtp = save_rtp
15948e1986e3SBram Moolenaarenddef
15958e1986e3SBram Moolenaar
1596efa94447SBram Moolenaardef Test_use_import_in_mapping()
1597cfcd011fSBram Moolenaar  var lines =<< trim END
1598efa94447SBram Moolenaar      vim9script
1599efa94447SBram Moolenaar      export def Funcx()
1600efa94447SBram Moolenaar        g:result = 42
1601efa94447SBram Moolenaar      enddef
1602efa94447SBram Moolenaar  END
1603efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1604efa94447SBram Moolenaar  lines =<< trim END
1605efa94447SBram Moolenaar      vim9script
1606efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1607b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1608efa94447SBram Moolenaar  END
1609efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1610efa94447SBram Moolenaar
1611efa94447SBram Moolenaar  source Xmapscript.vim
1612b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1613efa94447SBram Moolenaar  assert_equal(42, g:result)
1614efa94447SBram Moolenaar
1615efa94447SBram Moolenaar  unlet g:result
1616efa94447SBram Moolenaar  delete('XsomeExport.vim')
1617efa94447SBram Moolenaar  delete('Xmapscript.vim')
1618b3ca9824SBram Moolenaar  nunmap <F3>
1619efa94447SBram Moolenaarenddef
1620efa94447SBram Moolenaar
1621d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1622d3f8a9eeSBram Moolenaar  var lines =<< trim END
1623d3f8a9eeSBram Moolenaar    if has(g:feature)
1624d3f8a9eeSBram Moolenaar      " legacy script
1625d3f8a9eeSBram Moolenaar      let g:legacy = 1
1626d3f8a9eeSBram Moolenaar      finish
1627d3f8a9eeSBram Moolenaar    endif
1628d3f8a9eeSBram Moolenaar    vim9script
1629d3f8a9eeSBram Moolenaar    g:legacy = 0
1630d3f8a9eeSBram Moolenaar  END
1631d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1632d3f8a9eeSBram Moolenaar  g:legacy = -1
1633d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1634d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1635d3f8a9eeSBram Moolenaar
1636d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1637d3f8a9eeSBram Moolenaar  g:legacy = -1
1638d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1639d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1640d3f8a9eeSBram Moolenaarenddef
1641d3f8a9eeSBram Moolenaar
1642750802b5SBram Moolenaardef Test_vim9script_fails()
16438a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
16448a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1645cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
16469721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1647cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1648750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1649750802b5SBram Moolenaar
1650cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1651c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1652c785b9a7SBram Moolenaar
1653e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1654e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
16558a7d6542SBram Moolenaarenddef
16568a7d6542SBram Moolenaar
1657f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1658101f4810SBram Moolenaar  CheckRunVimInTerminal
1659101f4810SBram Moolenaar
16609bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1661c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
16629bb3eb3eSBram Moolenaarendfunc
16639bb3eb3eSBram Moolenaar
1664c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1665cfcd011fSBram Moolenaar  var export =<< trim END
1666101f4810SBram Moolenaar    vim9script
1667101f4810SBram Moolenaar    export def Foo(): number
1668101f4810SBram Moolenaar        return 0
1669101f4810SBram Moolenaar    enddef
1670101f4810SBram Moolenaar  END
1671730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1672101f4810SBram Moolenaar
1673e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
16749bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
16752949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1676101f4810SBram Moolenaar
1677730b2483SBram Moolenaar  delete('XexportCmd.vim')
16789bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
16799bb3eb3eSBram Moolenaarenddef
1680101f4810SBram Moolenaar
16812b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
16822b32700dSBram Moolenaar  var lines =<< trim END
1683a6294955SBram Moolenaar    vim9script
1684a6294955SBram Moolenaar    export var exported = 'thexport'
168560dc8274SBram Moolenaar
168660dc8274SBram Moolenaar    export def TheFunc(x = 0)
168760dc8274SBram Moolenaar    enddef
1688a6294955SBram Moolenaar  END
1689a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1690a6294955SBram Moolenaar  lines =<< trim END
16912b32700dSBram Moolenaar    vim9script noclear
16922b32700dSBram Moolenaar    g:loadCount += 1
16932b32700dSBram Moolenaar    var s:reloaded = 'init'
1694a6294955SBram Moolenaar    import exported from './XExportReload'
16952b32700dSBram Moolenaar
16962b32700dSBram Moolenaar    def Again(): string
16972b32700dSBram Moolenaar      return 'again'
16982b32700dSBram Moolenaar    enddef
16992b32700dSBram Moolenaar
170060dc8274SBram Moolenaar    import TheFunc from './XExportReload'
170160dc8274SBram Moolenaar    TheFunc()
170260dc8274SBram Moolenaar
17032b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
17042b32700dSBram Moolenaar    var s:loaded = true
17052b32700dSBram Moolenaar
17062b32700dSBram Moolenaar    var s:notReloaded = 'yes'
17072b32700dSBram Moolenaar    s:reloaded = 'first'
17082b32700dSBram Moolenaar    def g:Values(): list<string>
1709a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
17102b32700dSBram Moolenaar    enddef
17112b32700dSBram Moolenaar
17122b32700dSBram Moolenaar    def Once(): string
17132b32700dSBram Moolenaar      return 'once'
17142b32700dSBram Moolenaar    enddef
17152b32700dSBram Moolenaar  END
17162b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
17172b32700dSBram Moolenaar  g:loadCount = 0
17182b32700dSBram Moolenaar  source XReloaded
17192b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1720a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
17212b32700dSBram Moolenaar  source XReloaded
17222b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1723a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
17242b32700dSBram Moolenaar  source XReloaded
17252b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1726a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
17272b32700dSBram Moolenaar
172848e11c10SBram Moolenaar  delete('XReloaded')
1729a6294955SBram Moolenaar  delete('XExportReload')
17302b32700dSBram Moolenaar  delfunc g:Values
17312b32700dSBram Moolenaar  unlet g:loadCount
1732577dc93dSBram Moolenaar
1733577dc93dSBram Moolenaar  lines =<< trim END
1734577dc93dSBram Moolenaar      vim9script
1735577dc93dSBram Moolenaar      def Inner()
1736577dc93dSBram Moolenaar      enddef
1737577dc93dSBram Moolenaar  END
1738577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1739577dc93dSBram Moolenaar  source XreloadScript.vim
1740577dc93dSBram Moolenaar
1741577dc93dSBram Moolenaar  lines =<< trim END
1742577dc93dSBram Moolenaar      vim9script
1743577dc93dSBram Moolenaar      def Outer()
1744577dc93dSBram Moolenaar        def Inner()
1745577dc93dSBram Moolenaar        enddef
1746577dc93dSBram Moolenaar      enddef
1747577dc93dSBram Moolenaar      defcompile
1748577dc93dSBram Moolenaar  END
1749577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1750577dc93dSBram Moolenaar  source XreloadScript.vim
1751577dc93dSBram Moolenaar
1752577dc93dSBram Moolenaar  delete('XreloadScript.vim')
17532b32700dSBram Moolenaarenddef
17542b32700dSBram Moolenaar
17554c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1756cfcd011fSBram Moolenaar  var lines =<< trim END
17578a7d6542SBram Moolenaar    vim9script
17588a7d6542SBram Moolenaar    const var = ''
1759cfcd011fSBram Moolenaar    var valone = 1234
17608a7d6542SBram Moolenaar    def MyFunc(arg: string)
17618a7d6542SBram Moolenaar       valone = 5678
17628a7d6542SBram Moolenaar    enddef
17638a7d6542SBram Moolenaar  END
1764cfcd011fSBram Moolenaar  var morelines =<< trim END
1765cfcd011fSBram Moolenaar    var valtwo = 222
17668a7d6542SBram Moolenaar    export def GetValtwo(): number
17678a7d6542SBram Moolenaar      return valtwo
17688a7d6542SBram Moolenaar    enddef
17698a7d6542SBram Moolenaar  END
177003afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
17718a7d6542SBram Moolenaar  source Xreload.vim
17728a7d6542SBram Moolenaar  source Xreload.vim
17738a7d6542SBram Moolenaar  source Xreload.vim
17748a7d6542SBram Moolenaar
1775f5be8cdbSBram Moolenaar  # cannot declare a var twice
17768a7d6542SBram Moolenaar  lines =<< trim END
17778a7d6542SBram Moolenaar    vim9script
1778cfcd011fSBram Moolenaar    var valone = 1234
1779cfcd011fSBram Moolenaar    var valone = 5678
17808a7d6542SBram Moolenaar  END
17818a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
178244d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
17838a7d6542SBram Moolenaar
17848a7d6542SBram Moolenaar  delete('Xreload.vim')
17858a7d6542SBram Moolenaar  delete('Ximport.vim')
17868a7d6542SBram Moolenaarenddef
17878a7d6542SBram Moolenaar
178807a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
178907a65d26SBram Moolenaar" compiled function using that variable must fail.
179007a65d26SBram Moolenaardef Test_script_reload_change_type()
179107a65d26SBram Moolenaar  var lines =<< trim END
179207a65d26SBram Moolenaar    vim9script noclear
179307a65d26SBram Moolenaar    var str = 'string'
179407a65d26SBram Moolenaar    def g:GetStr(): string
179507a65d26SBram Moolenaar      return str .. 'xxx'
179607a65d26SBram Moolenaar    enddef
179707a65d26SBram Moolenaar  END
179807a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
179907a65d26SBram Moolenaar  source Xreload.vim
180007a65d26SBram Moolenaar  echo g:GetStr()
180107a65d26SBram Moolenaar
180207a65d26SBram Moolenaar  lines =<< trim END
180307a65d26SBram Moolenaar    vim9script noclear
180407a65d26SBram Moolenaar    var str = 1234
180507a65d26SBram Moolenaar  END
180607a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
180707a65d26SBram Moolenaar  source Xreload.vim
180807a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
180907a65d26SBram Moolenaar
181007a65d26SBram Moolenaar  delfunc g:GetStr
181107a65d26SBram Moolenaar  delete('Xreload.vim')
181207a65d26SBram Moolenaarenddef
181307a65d26SBram Moolenaar
1814c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled
1815c970e422SBram Moolenaarcommand CallFunc echo 'nop'
1816c970e422SBram Moolenaar
1817c970e422SBram Moolenaardef Test_script_reload_from_function()
1818c970e422SBram Moolenaar  var lines =<< trim END
1819c970e422SBram Moolenaar      vim9script
1820c970e422SBram Moolenaar
1821c970e422SBram Moolenaar      if exists('g:loaded')
1822c970e422SBram Moolenaar        finish
1823c970e422SBram Moolenaar      endif
1824c970e422SBram Moolenaar      g:loaded = 1
1825c970e422SBram Moolenaar      delcommand CallFunc
1826c970e422SBram Moolenaar      command CallFunc Func()
1827c970e422SBram Moolenaar      def Func()
1828a4c81beaSBram Moolenaar        so XreloadFunc.vim
1829c970e422SBram Moolenaar        g:didTheFunc = 1
1830c970e422SBram Moolenaar      enddef
1831c970e422SBram Moolenaar  END
1832c970e422SBram Moolenaar  writefile(lines, 'XreloadFunc.vim')
1833c970e422SBram Moolenaar  source XreloadFunc.vim
1834c970e422SBram Moolenaar  CallFunc
1835c970e422SBram Moolenaar  assert_equal(1, g:didTheFunc)
1836c970e422SBram Moolenaar
1837c970e422SBram Moolenaar  delete('XreloadFunc.vim')
1838c970e422SBram Moolenaar  delcommand CallFunc
1839c970e422SBram Moolenaar  unlet g:loaded
1840c970e422SBram Moolenaar  unlet g:didTheFunc
1841c970e422SBram Moolenaarenddef
1842c970e422SBram Moolenaar
18436c3843caSBram Moolenaardef Test_script_var_shadows_function()
18446c3843caSBram Moolenaar  var lines =<< trim END
18456c3843caSBram Moolenaar      vim9script
18466c3843caSBram Moolenaar      def Func(): number
18476c3843caSBram Moolenaar        return 123
18486c3843caSBram Moolenaar      enddef
18496c3843caSBram Moolenaar      var Func = 1
18506c3843caSBram Moolenaar  END
18516c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
18526c3843caSBram Moolenaarenddef
18536c3843caSBram Moolenaar
1854c323527dSBram Moolenaardef Test_script_var_shadows_command()
1855c323527dSBram Moolenaar  var lines =<< trim END
1856c323527dSBram Moolenaar      var undo = 1
1857c323527dSBram Moolenaar      undo = 2
1858c323527dSBram Moolenaar      assert_equal(2, undo)
1859c323527dSBram Moolenaar  END
1860c323527dSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1861c323527dSBram Moolenaar
1862c323527dSBram Moolenaar  lines =<< trim END
1863c323527dSBram Moolenaar      var undo = 1
1864c323527dSBram Moolenaar      undo
1865c323527dSBram Moolenaar  END
1866c323527dSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1207:', 2)
1867c323527dSBram Moolenaarenddef
1868c323527dSBram Moolenaar
186995006e3dSBram Moolenaardef s:RetSome(): string
187095006e3dSBram Moolenaar  return 'some'
187195006e3dSBram Moolenaarenddef
187295006e3dSBram Moolenaar
1873fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1874fe465a01SBram Moolenaar" script-local name.
1875fe465a01SBram Moolenaardef Test_vim9script_funcref()
1876cfcd011fSBram Moolenaar  var sortlines =<< trim END
1877fe465a01SBram Moolenaar      vim9script
1878fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1879bed36b93SBram Moolenaar        return i2 - i1
1880fe465a01SBram Moolenaar      enddef
1881fe465a01SBram Moolenaar
1882fe465a01SBram Moolenaar      export def FastSort(): list<number>
1883fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1884fe465a01SBram Moolenaar      enddef
1885529fb5a5SBram Moolenaar
1886529fb5a5SBram Moolenaar      export def GetString(arg: string): string
1887529fb5a5SBram Moolenaar        return arg
1888529fb5a5SBram Moolenaar      enddef
1889fe465a01SBram Moolenaar  END
1890fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1891fe465a01SBram Moolenaar
1892cfcd011fSBram Moolenaar  var lines =<< trim END
1893fe465a01SBram Moolenaar    vim9script
1894fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1895fe465a01SBram Moolenaar    def Test()
1896fe465a01SBram Moolenaar      g:result = FastSort()
1897fe465a01SBram Moolenaar    enddef
1898fe465a01SBram Moolenaar    Test()
1899529fb5a5SBram Moolenaar
1900529fb5a5SBram Moolenaar    # using a function imported with "as"
1901529fb5a5SBram Moolenaar    import * as anAlias from './Xsort.vim'
1902529fb5a5SBram Moolenaar    assert_equal('yes', anAlias.GetString('yes'))
1903529fb5a5SBram Moolenaar
1904529fb5a5SBram Moolenaar    # using the function from a compiled function
1905529fb5a5SBram Moolenaar    def TestMore(): string
1906ca51cc0aSBram Moolenaar      var s = s:anAlias.GetString('foo')
1907ca51cc0aSBram Moolenaar      return s .. anAlias.GetString('bar')
1908529fb5a5SBram Moolenaar    enddef
1909ca51cc0aSBram Moolenaar    assert_equal('foobar', TestMore())
1910529fb5a5SBram Moolenaar
1911529fb5a5SBram Moolenaar    # error when using a function that isn't exported
1912529fb5a5SBram Moolenaar    assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1913fe465a01SBram Moolenaar  END
1914fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1915fe465a01SBram Moolenaar
1916fe465a01SBram Moolenaar  source Xscript.vim
1917fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1918fe465a01SBram Moolenaar
1919fe465a01SBram Moolenaar  unlet g:result
1920fe465a01SBram Moolenaar  delete('Xsort.vim')
1921fe465a01SBram Moolenaar  delete('Xscript.vim')
192295006e3dSBram Moolenaar
1923cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
192495006e3dSBram Moolenaar  assert_equal('some', Funcref())
1925fe465a01SBram Moolenaarenddef
1926fe465a01SBram Moolenaar
1927601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1928601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1929601e76acSBram Moolenaar" function reference.
1930c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1931cfcd011fSBram Moolenaar  var filterLines =<< trim END
1932c620c055SBram Moolenaar    vim9script
1933c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1934c620c055SBram Moolenaar      return idx % 2 == 1
1935c620c055SBram Moolenaar    enddef
1936c620c055SBram Moolenaar    export def FastFilter(): list<number>
1937c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1938c620c055SBram Moolenaar    enddef
1939601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1940601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1941601e76acSBram Moolenaar    enddef
1942c620c055SBram Moolenaar  END
1943c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1944c620c055SBram Moolenaar
1945cfcd011fSBram Moolenaar  var lines =<< trim END
1946c620c055SBram Moolenaar    vim9script
1947601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1948c620c055SBram Moolenaar    def Test()
1949cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1950c620c055SBram Moolenaar    enddef
1951c620c055SBram Moolenaar    Test()
1952601e76acSBram Moolenaar    def TestDirect()
1953cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1954601e76acSBram Moolenaar    enddef
1955601e76acSBram Moolenaar    TestDirect()
1956c620c055SBram Moolenaar  END
1957601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1958c620c055SBram Moolenaar  delete('Xfilter.vim')
1959c620c055SBram Moolenaarenddef
1960c620c055SBram Moolenaar
19614c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1962cfcd011fSBram Moolenaar  var first_lines =<< trim END
19634c17ad94SBram Moolenaar    vim9script
19644c17ad94SBram Moolenaar    def FuncYes(): string
19654c17ad94SBram Moolenaar      return 'yes'
19664c17ad94SBram Moolenaar    enddef
19674c17ad94SBram Moolenaar  END
1968cfcd011fSBram Moolenaar  var withno_lines =<< trim END
19694c17ad94SBram Moolenaar    def FuncNo(): string
19704c17ad94SBram Moolenaar      return 'no'
19714c17ad94SBram Moolenaar    enddef
19724c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
19734c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
19744c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
197503afdcf1SBram Moolenaar    enddef
197603afdcf1SBram Moolenaar  END
1977cfcd011fSBram Moolenaar  var nono_lines =<< trim END
197803afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
197903afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
198044d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
19814c17ad94SBram Moolenaar    enddef
19824c17ad94SBram Moolenaar  END
19834c17ad94SBram Moolenaar
19844c17ad94SBram Moolenaar  # FuncNo() is defined
198503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
19864c17ad94SBram Moolenaar  source Xreloaded.vim
19874c17ad94SBram Moolenaar  g:DoCheck(true)
19884c17ad94SBram Moolenaar
19894c17ad94SBram Moolenaar  # FuncNo() is not redefined
199003afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
19914c17ad94SBram Moolenaar  source Xreloaded.vim
19925082471fSBram Moolenaar  g:DoCheck(false)
19934c17ad94SBram Moolenaar
19944c17ad94SBram Moolenaar  # FuncNo() is back
199503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
19964c17ad94SBram Moolenaar  source Xreloaded.vim
19975082471fSBram Moolenaar  g:DoCheck(false)
19984c17ad94SBram Moolenaar
19994c17ad94SBram Moolenaar  delete('Xreloaded.vim')
20004c17ad94SBram Moolenaarenddef
20014c17ad94SBram Moolenaar
200289483d40SBram Moolenaardef Test_vim9script_reload_delvar()
200389483d40SBram Moolenaar  # write the script with a script-local variable
2004cfcd011fSBram Moolenaar  var lines =<< trim END
200589483d40SBram Moolenaar    vim9script
2006cfcd011fSBram Moolenaar    var name = 'string'
200789483d40SBram Moolenaar  END
200889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
200989483d40SBram Moolenaar  source XreloadVar.vim
201089483d40SBram Moolenaar
201189483d40SBram Moolenaar  # now write the script using the same variable locally - works
201289483d40SBram Moolenaar  lines =<< trim END
201389483d40SBram Moolenaar    vim9script
201489483d40SBram Moolenaar    def Func()
2015cfcd011fSBram Moolenaar      var name = 'string'
201689483d40SBram Moolenaar    enddef
201789483d40SBram Moolenaar  END
201889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
201989483d40SBram Moolenaar  source XreloadVar.vim
202089483d40SBram Moolenaar
202189483d40SBram Moolenaar  delete('XreloadVar.vim')
202289483d40SBram Moolenaarenddef
202389483d40SBram Moolenaar
20248a7d6542SBram Moolenaardef Test_import_absolute()
2025cfcd011fSBram Moolenaar  var import_lines = [
2026e6085c53SBram Moolenaar        'vim9script',
2027e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
2028e6085c53SBram Moolenaar        'def UseExported()',
2029e6085c53SBram Moolenaar        '  g:imported_abs = exported',
2030e6085c53SBram Moolenaar        '  exported = 8888',
2031e6085c53SBram Moolenaar        '  g:imported_after = exported',
2032e6085c53SBram Moolenaar        'enddef',
2033e6085c53SBram Moolenaar        'UseExported()',
2034e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
2035e6085c53SBram Moolenaar        ]
20368a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
20378a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
20388a7d6542SBram Moolenaar
20398a7d6542SBram Moolenaar  source Ximport_abs.vim
20408a7d6542SBram Moolenaar
20418a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
20424e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
2043fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
2044fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
2045fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2046fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
2047fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
2048fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
2049fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
2050fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
2051fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2052fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
2053e6085c53SBram Moolenaar        g:import_disassembled)
2054b3ca9824SBram Moolenaar
2055b3ca9824SBram Moolenaar  Undo_export_script_lines()
20568a7d6542SBram Moolenaar  unlet g:imported_abs
20574e12a5dfSBram Moolenaar  unlet g:import_disassembled
20588a7d6542SBram Moolenaar
20598a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
20608a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
20618a7d6542SBram Moolenaarenddef
20628a7d6542SBram Moolenaar
20638a7d6542SBram Moolenaardef Test_import_rtp()
2064cfcd011fSBram Moolenaar  var import_lines = [
2065e6085c53SBram Moolenaar        'vim9script',
2066e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
2067e6085c53SBram Moolenaar        'g:imported_rtp = exported',
2068e6085c53SBram Moolenaar        ]
20698a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
2070b885a7c7SBram Moolenaar  mkdir('import', 'p')
2071b885a7c7SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
20728a7d6542SBram Moolenaar
2073cfcd011fSBram Moolenaar  var save_rtp = &rtp
20748a7d6542SBram Moolenaar  &rtp = getcwd()
20758a7d6542SBram Moolenaar  source Ximport_rtp.vim
20768a7d6542SBram Moolenaar  &rtp = save_rtp
20778a7d6542SBram Moolenaar
20788a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
20798a7d6542SBram Moolenaar
2080b3ca9824SBram Moolenaar  Undo_export_script_lines()
2081b3ca9824SBram Moolenaar  unlet g:imported_rtp
20828a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
2083b885a7c7SBram Moolenaar  delete('import', 'rf')
20848a7d6542SBram Moolenaarenddef
20858a7d6542SBram Moolenaar
208625e0f586SBram Moolenaardef Test_import_compile_error()
2087cfcd011fSBram Moolenaar  var export_lines = [
208825e0f586SBram Moolenaar        'vim9script',
208925e0f586SBram Moolenaar        'export def ExpFunc(): string',
209025e0f586SBram Moolenaar        '  return notDefined',
209125e0f586SBram Moolenaar        'enddef',
209225e0f586SBram Moolenaar        ]
209325e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
209425e0f586SBram Moolenaar
2095cfcd011fSBram Moolenaar  var import_lines = [
209625e0f586SBram Moolenaar        'vim9script',
209725e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
209825e0f586SBram Moolenaar        'def ImpFunc()',
209925e0f586SBram Moolenaar        '  echo ExpFunc()',
210025e0f586SBram Moolenaar        'enddef',
210125e0f586SBram Moolenaar        'defcompile',
210225e0f586SBram Moolenaar        ]
210325e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
210425e0f586SBram Moolenaar
210525e0f586SBram Moolenaar  try
210625e0f586SBram Moolenaar    source Ximport.vim
210725e0f586SBram Moolenaar  catch /E1001/
2108f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
21097707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
211025e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
211125e0f586SBram Moolenaar  endtry
211225e0f586SBram Moolenaar
211325e0f586SBram Moolenaar  delete('Xexported.vim')
211425e0f586SBram Moolenaar  delete('Ximport.vim')
211525e0f586SBram Moolenaarenddef
211625e0f586SBram Moolenaar
2117c4ce36d4SBram Moolenaardef Test_func_redefine_error()
2118cfcd011fSBram Moolenaar  var lines = [
2119c4ce36d4SBram Moolenaar        'vim9script',
2120c4ce36d4SBram Moolenaar        'def Func()',
2121c4ce36d4SBram Moolenaar        '  eval [][0]',
2122c4ce36d4SBram Moolenaar        'enddef',
2123c4ce36d4SBram Moolenaar        'Func()',
2124c4ce36d4SBram Moolenaar        ]
2125c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
2126c4ce36d4SBram Moolenaar
2127c4ce36d4SBram Moolenaar  for count in range(3)
2128c4ce36d4SBram Moolenaar    try
2129c4ce36d4SBram Moolenaar      source Xtestscript.vim
2130c4ce36d4SBram Moolenaar    catch /E684/
2131c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
2132c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
2133c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
2134c4ce36d4SBram Moolenaar    endtry
2135c4ce36d4SBram Moolenaar  endfor
2136c4ce36d4SBram Moolenaar
2137c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
2138c4ce36d4SBram Moolenaarenddef
2139c4ce36d4SBram Moolenaar
2140eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
2141cfcd011fSBram Moolenaar  var export_lines =<< trim END
2142eef2102eSBram Moolenaar      vim9script
2143eef2102eSBram Moolenaar      export def Func()
2144eef2102eSBram Moolenaar        echo 'imported'
2145eef2102eSBram Moolenaar      enddef
2146eef2102eSBram Moolenaar  END
2147eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
2148eef2102eSBram Moolenaar
2149cfcd011fSBram Moolenaar  var lines =<< trim END
2150eef2102eSBram Moolenaar    vim9script
2151eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2152eef2102eSBram Moolenaar    def Func()
2153eef2102eSBram Moolenaar      echo 'local to function'
2154eef2102eSBram Moolenaar    enddef
2155eef2102eSBram Moolenaar  END
2156eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2157eef2102eSBram Moolenaar
2158eef2102eSBram Moolenaar  lines =<< trim END
2159eef2102eSBram Moolenaar    vim9script
2160eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2161eef2102eSBram Moolenaar    def Outer()
2162eef2102eSBram Moolenaar      def Func()
2163eef2102eSBram Moolenaar        echo 'local to function'
2164eef2102eSBram Moolenaar      enddef
2165eef2102eSBram Moolenaar    enddef
2166eef2102eSBram Moolenaar    defcompile
2167eef2102eSBram Moolenaar  END
2168eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2169eef2102eSBram Moolenaar
2170eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
2171eef2102eSBram Moolenaarenddef
2172eef2102eSBram Moolenaar
2173b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
2174cfcd011fSBram Moolenaar  var lines =<< trim END
2175b9a2cac3SBram Moolenaar    vim9script
2176b9a2cac3SBram Moolenaar    def Func()
2177b9a2cac3SBram Moolenaar      echo 'one'
2178b9a2cac3SBram Moolenaar    enddef
2179b9a2cac3SBram Moolenaar    def Func()
2180b9a2cac3SBram Moolenaar      echo 'two'
2181b9a2cac3SBram Moolenaar    enddef
2182b9a2cac3SBram Moolenaar  END
2183b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2184fa211f3cSBram Moolenaar
2185fa211f3cSBram Moolenaar  lines =<< trim END
2186fa211f3cSBram Moolenaar    vim9script
2187fa211f3cSBram Moolenaar    def Foo(): string
2188fa211f3cSBram Moolenaar      return 'foo'
2189fa211f3cSBram Moolenaar      enddef
2190fa211f3cSBram Moolenaar    def Func()
2191cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
2192fa211f3cSBram Moolenaar    enddef
2193fa211f3cSBram Moolenaar    defcompile
2194fa211f3cSBram Moolenaar  END
2195fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2196b9a2cac3SBram Moolenaarenddef
2197b9a2cac3SBram Moolenaar
21988a7d6542SBram Moolenaardef Test_fixed_size_list()
2199f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
2200cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
22018a7d6542SBram Moolenaar  l->remove(0)
22028a7d6542SBram Moolenaar  l->add(5)
22038a7d6542SBram Moolenaar  l->insert(99, 1)
22040f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
22058a7d6542SBram Moolenaarenddef
22068a7d6542SBram Moolenaar
2207ae616494SBram Moolenaardef Test_no_insert_xit()
2208d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2209d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2210d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2211d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2212d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2213ae616494SBram Moolenaar
2214ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2215ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2216ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2217ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2218f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2219f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
22206508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
22216508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
2222f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2223f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2224f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2225ae616494SBram Moolenaarenddef
2226ae616494SBram Moolenaar
2227158906cfSBram Moolenaardef IfElse(what: number): string
2228cfcd011fSBram Moolenaar  var res = ''
2229158906cfSBram Moolenaar  if what == 1
2230158906cfSBram Moolenaar    res = "one"
2231158906cfSBram Moolenaar  elseif what == 2
2232158906cfSBram Moolenaar    res = "two"
2233a259d8d3SBram Moolenaar  else
2234158906cfSBram Moolenaar    res = "three"
2235a259d8d3SBram Moolenaar  endif
2236158906cfSBram Moolenaar  return res
2237a259d8d3SBram Moolenaarenddef
2238a259d8d3SBram Moolenaar
2239158906cfSBram Moolenaardef Test_if_elseif_else()
2240158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2241158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2242158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
22430f18b6d1SBram Moolenaarenddef
22440f18b6d1SBram Moolenaar
2245e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2246d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2247d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2248d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2249ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
2250d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
22516628b7ebSBram Moolenaar
22526628b7ebSBram Moolenaar  var lines =<< trim END
22536628b7ebSBram Moolenaar      var s = ''
22546628b7ebSBram Moolenaar      if s = ''
22556628b7ebSBram Moolenaar      endif
22566628b7ebSBram Moolenaar  END
22576628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
22586628b7ebSBram Moolenaar
22596628b7ebSBram Moolenaar  lines =<< trim END
22606628b7ebSBram Moolenaar      var s = ''
22616628b7ebSBram Moolenaar      if s == ''
22626628b7ebSBram Moolenaar      elseif s = ''
22636628b7ebSBram Moolenaar      endif
22646628b7ebSBram Moolenaar  END
22656628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2266e8c4abbbSBram Moolenaarenddef
2267e8c4abbbSBram Moolenaar
22686d69bf60SBram Moolenaarlet g:bool_true = v:true
22696d69bf60SBram Moolenaarlet g:bool_false = v:false
22706d69bf60SBram Moolenaar
22716d69bf60SBram Moolenaardef Test_if_const_expr()
2272cfcd011fSBram Moolenaar  var res = false
22736d69bf60SBram Moolenaar  if true ? true : false
22746d69bf60SBram Moolenaar    res = true
22756d69bf60SBram Moolenaar  endif
22766d69bf60SBram Moolenaar  assert_equal(true, res)
22776d69bf60SBram Moolenaar
2278585fea7bSBram Moolenaar  g:glob = 2
2279585fea7bSBram Moolenaar  if false
22806797966dSBram Moolenaar    execute('g:glob = 3')
2281585fea7bSBram Moolenaar  endif
2282585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2283585fea7bSBram Moolenaar  if true
22846797966dSBram Moolenaar    execute('g:glob = 3')
2285585fea7bSBram Moolenaar  endif
2286585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2287585fea7bSBram Moolenaar
22886d69bf60SBram Moolenaar  res = false
22896d69bf60SBram Moolenaar  if g:bool_true ? true : false
22906d69bf60SBram Moolenaar    res = true
22916d69bf60SBram Moolenaar  endif
22926d69bf60SBram Moolenaar  assert_equal(true, res)
22936d69bf60SBram Moolenaar
22946d69bf60SBram Moolenaar  res = false
22956d69bf60SBram Moolenaar  if true ? g:bool_true : false
22966d69bf60SBram Moolenaar    res = true
22976d69bf60SBram Moolenaar  endif
22986d69bf60SBram Moolenaar  assert_equal(true, res)
22996d69bf60SBram Moolenaar
23006d69bf60SBram Moolenaar  res = false
23016d69bf60SBram Moolenaar  if true ? true : g:bool_false
23026d69bf60SBram Moolenaar    res = true
23036d69bf60SBram Moolenaar  endif
23046d69bf60SBram Moolenaar  assert_equal(true, res)
23056d69bf60SBram Moolenaar
23066d69bf60SBram Moolenaar  res = false
23076d69bf60SBram Moolenaar  if true ? false : true
23086d69bf60SBram Moolenaar    res = true
23096d69bf60SBram Moolenaar  endif
23106d69bf60SBram Moolenaar  assert_equal(false, res)
23116d69bf60SBram Moolenaar
23126d69bf60SBram Moolenaar  res = false
23136d69bf60SBram Moolenaar  if false ? false : true
23146d69bf60SBram Moolenaar    res = true
23156d69bf60SBram Moolenaar  endif
23166d69bf60SBram Moolenaar  assert_equal(true, res)
23176d69bf60SBram Moolenaar
23186d69bf60SBram Moolenaar  res = false
23196d69bf60SBram Moolenaar  if false ? true : false
23206d69bf60SBram Moolenaar    res = true
23216d69bf60SBram Moolenaar  endif
23226d69bf60SBram Moolenaar  assert_equal(false, res)
23236d69bf60SBram Moolenaar
23246d69bf60SBram Moolenaar  res = false
2325e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2326e8c4abbbSBram Moolenaar    res = true
2327e8c4abbbSBram Moolenaar  endif
2328e8c4abbbSBram Moolenaar  assert_equal(false, res)
2329e8c4abbbSBram Moolenaar
2330e8c4abbbSBram Moolenaar  res = false
23316d69bf60SBram Moolenaar  if true && true
23326d69bf60SBram Moolenaar    res = true
23336d69bf60SBram Moolenaar  endif
23346d69bf60SBram Moolenaar  assert_equal(true, res)
23356d69bf60SBram Moolenaar
23366d69bf60SBram Moolenaar  res = false
23376d69bf60SBram Moolenaar  if true && false
23386d69bf60SBram Moolenaar    res = true
23396d69bf60SBram Moolenaar  endif
23406d69bf60SBram Moolenaar  assert_equal(false, res)
23416d69bf60SBram Moolenaar
23426d69bf60SBram Moolenaar  res = false
23436d69bf60SBram Moolenaar  if g:bool_true && false
23446d69bf60SBram Moolenaar    res = true
23456d69bf60SBram Moolenaar  endif
23466d69bf60SBram Moolenaar  assert_equal(false, res)
23476d69bf60SBram Moolenaar
23486d69bf60SBram Moolenaar  res = false
23496d69bf60SBram Moolenaar  if true && g:bool_false
23506d69bf60SBram Moolenaar    res = true
23516d69bf60SBram Moolenaar  endif
23526d69bf60SBram Moolenaar  assert_equal(false, res)
23536d69bf60SBram Moolenaar
23546d69bf60SBram Moolenaar  res = false
23556d69bf60SBram Moolenaar  if false && false
23566d69bf60SBram Moolenaar    res = true
23576d69bf60SBram Moolenaar  endif
23586d69bf60SBram Moolenaar  assert_equal(false, res)
23596d69bf60SBram Moolenaar
23606d69bf60SBram Moolenaar  res = false
23616d69bf60SBram Moolenaar  if true || false
23626d69bf60SBram Moolenaar    res = true
23636d69bf60SBram Moolenaar  endif
23646d69bf60SBram Moolenaar  assert_equal(true, res)
23656d69bf60SBram Moolenaar
23666d69bf60SBram Moolenaar  res = false
23676d69bf60SBram Moolenaar  if g:bool_true || false
23686d69bf60SBram Moolenaar    res = true
23696d69bf60SBram Moolenaar  endif
23706d69bf60SBram Moolenaar  assert_equal(true, res)
23716d69bf60SBram Moolenaar
23726d69bf60SBram Moolenaar  res = false
23736d69bf60SBram Moolenaar  if true || g:bool_false
23746d69bf60SBram Moolenaar    res = true
23756d69bf60SBram Moolenaar  endif
23766d69bf60SBram Moolenaar  assert_equal(true, res)
23776d69bf60SBram Moolenaar
23786d69bf60SBram Moolenaar  res = false
23796d69bf60SBram Moolenaar  if false || false
23806d69bf60SBram Moolenaar    res = true
23816d69bf60SBram Moolenaar  endif
23826d69bf60SBram Moolenaar  assert_equal(false, res)
23833988f64fSBram Moolenaar
23843988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
2385c323527dSBram Moolenaar  if false | eval 1 + 2 | endif
23863988f64fSBram Moolenaar  if false | eval burp + 234 | endif
23873988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
23883988f64fSBram Moolenaar  if false
23893988f64fSBram Moolenaar    burp
23903988f64fSBram Moolenaar  endif
2391e525bddaSBram Moolenaar
2392e525bddaSBram Moolenaar  # expression with line breaks skipped
2393e525bddaSBram Moolenaar  if false
2394e525bddaSBram Moolenaar      ('aaa'
2395e525bddaSBram Moolenaar      .. 'bbb'
2396e525bddaSBram Moolenaar      .. 'ccc'
2397e525bddaSBram Moolenaar      )->setline(1)
2398e525bddaSBram Moolenaar  endif
239980c34ca3SBram Moolenaarenddef
24006d69bf60SBram Moolenaar
240180c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2402d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2403d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2404d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2405d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
24066d69bf60SBram Moolenaarenddef
24076d69bf60SBram Moolenaar
240872abcf42SBram Moolenaardef RunNested(i: number): number
2409cfcd011fSBram Moolenaar  var x: number = 0
241072abcf42SBram Moolenaar  if i % 2
241172abcf42SBram Moolenaar    if 1
2412f5be8cdbSBram Moolenaar      # comment
241372abcf42SBram Moolenaar    else
2414f5be8cdbSBram Moolenaar      # comment
241572abcf42SBram Moolenaar    endif
241672abcf42SBram Moolenaar    x += 1
241772abcf42SBram Moolenaar  else
241872abcf42SBram Moolenaar    x += 1000
241972abcf42SBram Moolenaar  endif
242072abcf42SBram Moolenaar  return x
242172abcf42SBram Moolenaarenddef
242272abcf42SBram Moolenaar
242372abcf42SBram Moolenaardef Test_nested_if()
242472abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
242572abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
242672abcf42SBram Moolenaarenddef
242772abcf42SBram Moolenaar
2428ad39c094SBram Moolenaardef Test_execute_cmd()
2429e4984290SBram Moolenaar  # missing argument is ignored
2430e4984290SBram Moolenaar  execute
2431e4984290SBram Moolenaar  execute # comment
2432e4984290SBram Moolenaar
2433ad39c094SBram Moolenaar  new
2434ad39c094SBram Moolenaar  setline(1, 'default')
2435d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2436ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2437a72cfb80SBram Moolenaar
2438d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2439a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2440a72cfb80SBram Moolenaar
2441cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2442cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2443a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2444ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2445a72cfb80SBram Moolenaar
2446d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2447ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2448a72cfb80SBram Moolenaar
2449cfcd011fSBram Moolenaar  var cmd_first = 'call '
2450cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2451ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2452ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2453ad39c094SBram Moolenaar  bwipe!
2454585fea7bSBram Moolenaar
2455cfcd011fSBram Moolenaar  var n = true
24562d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
24572d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
24582d6b20d6SBram Moolenaar
2459e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2460e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2461e5abf7afSBram Moolenaar
2462d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2463d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2464d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2465ad39c094SBram Moolenaarenddef
2466ad39c094SBram Moolenaar
246747e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2468f5be8cdbSBram Moolenaar  # only checks line continuation
2469cfcd011fSBram Moolenaar  var lines =<< trim END
247047e880d6SBram Moolenaar      vim9script
247147e880d6SBram Moolenaar      execute 'g:someVar'
247247e880d6SBram Moolenaar                .. ' = ' ..
247347e880d6SBram Moolenaar                   '28'
247447e880d6SBram Moolenaar      assert_equal(28, g:someVar)
247547e880d6SBram Moolenaar      unlet g:someVar
247647e880d6SBram Moolenaar  END
247747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
247847e880d6SBram Moolenaarenddef
247947e880d6SBram Moolenaar
2480ad39c094SBram Moolenaardef Test_echo_cmd()
2481a72cfb80SBram Moolenaar  echo 'some' # comment
2482585fea7bSBram Moolenaar  echon 'thing'
2483ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2484ad39c094SBram Moolenaar
2485a72cfb80SBram Moolenaar  echo "some" # comment
2486a72cfb80SBram Moolenaar  echon "thing"
2487a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2488a72cfb80SBram Moolenaar
2489cfcd011fSBram Moolenaar  var str1 = 'some'
2490cfcd011fSBram Moolenaar  var str2 = 'more'
2491ad39c094SBram Moolenaar  echo str1 str2
2492ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2493a72cfb80SBram Moolenaar
2494d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2495ad39c094SBram Moolenaarenddef
2496ad39c094SBram Moolenaar
2497f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2498f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2499f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2500f93c7feaSBram Moolenaar  echo 'clear'
2501df069eecSBram Moolenaar  :1messages
2502f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2503f93c7feaSBram Moolenaar
2504d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2505f93c7feaSBram Moolenaarenddef
2506f93c7feaSBram Moolenaar
250747e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2508f5be8cdbSBram Moolenaar  # only checks line continuation
2509cfcd011fSBram Moolenaar  var lines =<< trim END
251047e880d6SBram Moolenaar      vim9script
251147e880d6SBram Moolenaar      echomsg 'here'
251247e880d6SBram Moolenaar                .. ' is ' ..
251347e880d6SBram Moolenaar                   'a message'
251447e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
251547e880d6SBram Moolenaar  END
251647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
251747e880d6SBram Moolenaarenddef
251847e880d6SBram Moolenaar
2519f93c7feaSBram Moolenaardef Test_echoerr_cmd()
25207de62623SBram Moolenaar  var local = 'local'
252140ee466cSBram Moolenaar  try
25227de62623SBram Moolenaar    echoerr 'something' local 'wrong' # comment
252340ee466cSBram Moolenaar  catch
25247de62623SBram Moolenaar    assert_match('something local wrong', v:exception)
252540ee466cSBram Moolenaar  endtry
2526f93c7feaSBram Moolenaarenddef
2527f93c7feaSBram Moolenaar
252847e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2529f5be8cdbSBram Moolenaar  # only checks line continuation
2530cfcd011fSBram Moolenaar  var lines =<< trim END
253147e880d6SBram Moolenaar      vim9script
253247e880d6SBram Moolenaar      try
253347e880d6SBram Moolenaar        echoerr 'this'
253447e880d6SBram Moolenaar                .. ' is ' ..
253547e880d6SBram Moolenaar                   'wrong'
253647e880d6SBram Moolenaar      catch
253747e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
253847e880d6SBram Moolenaar      endtry
253947e880d6SBram Moolenaar  END
254047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
254147e880d6SBram Moolenaarenddef
254247e880d6SBram Moolenaar
25437de62623SBram Moolenaardef Test_echoconsole_cmd()
25447de62623SBram Moolenaar  var local = 'local'
25457de62623SBram Moolenaar  echoconsole 'something' local # comment
25467de62623SBram Moolenaar  # output goes anywhere
25477de62623SBram Moolenaarenddef
25487de62623SBram Moolenaar
254941fe0617SBram Moolenaardef Test_for_outside_of_function()
2550cfcd011fSBram Moolenaar  var lines =<< trim END
255141fe0617SBram Moolenaar    vim9script
255241fe0617SBram Moolenaar    new
255341fe0617SBram Moolenaar    for var in range(0, 3)
255441fe0617SBram Moolenaar      append(line('$'), var)
255541fe0617SBram Moolenaar    endfor
255641fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
255741fe0617SBram Moolenaar    bwipe!
2558522eefd9SBram Moolenaar
2559522eefd9SBram Moolenaar    var result = ''
2560522eefd9SBram Moolenaar    for i in [1, 2, 3]
2561522eefd9SBram Moolenaar      var loop = ' loop ' .. i
2562522eefd9SBram Moolenaar      result ..= loop
2563522eefd9SBram Moolenaar    endfor
2564522eefd9SBram Moolenaar    assert_equal(' loop 1 loop 2 loop 3', result)
256541fe0617SBram Moolenaar  END
256641fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
256741fe0617SBram Moolenaar  source Xvim9for.vim
256841fe0617SBram Moolenaar  delete('Xvim9for.vim')
256941fe0617SBram Moolenaarenddef
25708a7d6542SBram Moolenaar
2571bebf0695Srbtnndef Test_for_skipped_block()
2572bebf0695Srbtnn  # test skipped blocks at outside of function
2573bebf0695Srbtnn  var lines =<< trim END
2574bebf0695Srbtnn    var result = []
2575bebf0695Srbtnn    if true
2576bebf0695Srbtnn      for n in [1, 2]
2577bebf0695Srbtnn        result += [n]
2578bebf0695Srbtnn      endfor
2579bebf0695Srbtnn    else
2580bebf0695Srbtnn      for n in [3, 4]
2581bebf0695Srbtnn        result += [n]
2582bebf0695Srbtnn      endfor
2583bebf0695Srbtnn    endif
2584bebf0695Srbtnn    assert_equal([1, 2], result)
2585bebf0695Srbtnn
2586bebf0695Srbtnn    result = []
2587bebf0695Srbtnn    if false
2588bebf0695Srbtnn      for n in [1, 2]
2589bebf0695Srbtnn        result += [n]
2590bebf0695Srbtnn      endfor
2591bebf0695Srbtnn    else
2592bebf0695Srbtnn      for n in [3, 4]
2593bebf0695Srbtnn        result += [n]
2594bebf0695Srbtnn      endfor
2595bebf0695Srbtnn    endif
2596bebf0695Srbtnn    assert_equal([3, 4], result)
2597bebf0695Srbtnn  END
2598bebf0695Srbtnn  CheckDefAndScriptSuccess(lines)
2599bebf0695Srbtnn
2600bebf0695Srbtnn  # test skipped blocks at inside of function
2601bebf0695Srbtnn  lines =<< trim END
2602bebf0695Srbtnn    def DefTrue()
2603bebf0695Srbtnn      var result = []
2604bebf0695Srbtnn      if true
2605bebf0695Srbtnn        for n in [1, 2]
2606bebf0695Srbtnn          result += [n]
2607bebf0695Srbtnn        endfor
2608bebf0695Srbtnn      else
2609bebf0695Srbtnn        for n in [3, 4]
2610bebf0695Srbtnn          result += [n]
2611bebf0695Srbtnn        endfor
2612bebf0695Srbtnn      endif
2613bebf0695Srbtnn      assert_equal([1, 2], result)
2614bebf0695Srbtnn    enddef
2615bebf0695Srbtnn    DefTrue()
2616bebf0695Srbtnn
2617bebf0695Srbtnn    def DefFalse()
2618bebf0695Srbtnn      var result = []
2619bebf0695Srbtnn      if false
2620bebf0695Srbtnn        for n in [1, 2]
2621bebf0695Srbtnn          result += [n]
2622bebf0695Srbtnn        endfor
2623bebf0695Srbtnn      else
2624bebf0695Srbtnn        for n in [3, 4]
2625bebf0695Srbtnn          result += [n]
2626bebf0695Srbtnn        endfor
2627bebf0695Srbtnn      endif
2628bebf0695Srbtnn      assert_equal([3, 4], result)
2629bebf0695Srbtnn    enddef
2630bebf0695Srbtnn    DefFalse()
2631bebf0695Srbtnn  END
2632bebf0695Srbtnn  CheckDefAndScriptSuccess(lines)
2633bebf0695Srbtnnenddef
2634bebf0695Srbtnn
2635e8c4abbbSBram Moolenaardef Test_for_loop()
2636f2253963SBram Moolenaar  var lines =<< trim END
2637cfcd011fSBram Moolenaar      var result = ''
2638e8c4abbbSBram Moolenaar      for cnt in range(7)
2639e8c4abbbSBram Moolenaar        if cnt == 4
2640e8c4abbbSBram Moolenaar          break
2641e8c4abbbSBram Moolenaar        endif
2642e8c4abbbSBram Moolenaar        if cnt == 2
2643e8c4abbbSBram Moolenaar          continue
2644e8c4abbbSBram Moolenaar        endif
2645e8c4abbbSBram Moolenaar        result ..= cnt .. '_'
2646e8c4abbbSBram Moolenaar      endfor
2647e8c4abbbSBram Moolenaar      assert_equal('0_1_3_', result)
26480ad3e894SBram Moolenaar
2649cfcd011fSBram Moolenaar      var concat = ''
26500ad3e894SBram Moolenaar      for str in eval('["one", "two"]')
26510ad3e894SBram Moolenaar        concat ..= str
26520ad3e894SBram Moolenaar      endfor
26530ad3e894SBram Moolenaar      assert_equal('onetwo', concat)
265438bd8de5SBram Moolenaar
265538bd8de5SBram Moolenaar      var total = 0
265638bd8de5SBram Moolenaar      for nr in
265738bd8de5SBram Moolenaar          [1, 2, 3]
265838bd8de5SBram Moolenaar        total += nr
265938bd8de5SBram Moolenaar      endfor
266038bd8de5SBram Moolenaar      assert_equal(6, total)
266138bd8de5SBram Moolenaar
266238bd8de5SBram Moolenaar      total = 0
266338bd8de5SBram Moolenaar      for nr
266438bd8de5SBram Moolenaar        in [1, 2, 3]
266538bd8de5SBram Moolenaar        total += nr
266638bd8de5SBram Moolenaar      endfor
266738bd8de5SBram Moolenaar      assert_equal(6, total)
266838bd8de5SBram Moolenaar
266938bd8de5SBram Moolenaar      total = 0
267038bd8de5SBram Moolenaar      for nr
267138bd8de5SBram Moolenaar        in
267238bd8de5SBram Moolenaar        [1, 2, 3]
267338bd8de5SBram Moolenaar        total += nr
267438bd8de5SBram Moolenaar      endfor
267538bd8de5SBram Moolenaar      assert_equal(6, total)
2676036d0714SBram Moolenaar
2677a3589a0dSBram Moolenaar      # with type
2678a3589a0dSBram Moolenaar      total = 0
2679a3589a0dSBram Moolenaar      for n: number in [1, 2, 3]
2680a3589a0dSBram Moolenaar        total += n
2681a3589a0dSBram Moolenaar      endfor
2682a3589a0dSBram Moolenaar      assert_equal(6, total)
2683a3589a0dSBram Moolenaar
2684fe090eb5SBram Moolenaar      var chars = ''
2685fe090eb5SBram Moolenaar      for s: string in 'foobar'
2686fe090eb5SBram Moolenaar        chars ..= s
2687fe090eb5SBram Moolenaar      endfor
2688fe090eb5SBram Moolenaar      assert_equal('foobar', chars)
2689fe090eb5SBram Moolenaar
26905ede5b23SBram Moolenaar      chars = ''
26915ede5b23SBram Moolenaar      for x: string in {a: 'a', b: 'b'}->values()
26925ede5b23SBram Moolenaar        chars ..= x
26935ede5b23SBram Moolenaar      endfor
26945ede5b23SBram Moolenaar      assert_equal('ab', chars)
26955ede5b23SBram Moolenaar
2696a3589a0dSBram Moolenaar      # unpack with type
2697f2253963SBram Moolenaar      var res = ''
2698a3589a0dSBram Moolenaar      for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2699a3589a0dSBram Moolenaar        res ..= n .. s
2700a3589a0dSBram Moolenaar      endfor
2701a3589a0dSBram Moolenaar      assert_equal('1a2b', res)
2702a3589a0dSBram Moolenaar
2703444d8783SBram Moolenaar      # unpack with one var
2704444d8783SBram Moolenaar      var reslist = []
2705444d8783SBram Moolenaar      for [x] in [['aaa'], ['bbb']]
2706444d8783SBram Moolenaar        reslist->add(x)
2707444d8783SBram Moolenaar      endfor
2708444d8783SBram Moolenaar      assert_equal(['aaa', 'bbb'], reslist)
2709444d8783SBram Moolenaar
2710a3589a0dSBram Moolenaar      # loop over string
2711a3589a0dSBram Moolenaar      res = ''
271274e54fcbSBram Moolenaar      for c in 'aéc̀d'
271374e54fcbSBram Moolenaar        res ..= c .. '-'
271474e54fcbSBram Moolenaar      endfor
271574e54fcbSBram Moolenaar      assert_equal('a-é-c̀-d-', res)
271674e54fcbSBram Moolenaar
271774e54fcbSBram Moolenaar      res = ''
271874e54fcbSBram Moolenaar      for c in ''
271974e54fcbSBram Moolenaar        res ..= c .. '-'
272074e54fcbSBram Moolenaar      endfor
272174e54fcbSBram Moolenaar      assert_equal('', res)
272274e54fcbSBram Moolenaar
272374e54fcbSBram Moolenaar      res = ''
272474e54fcbSBram Moolenaar      for c in test_null_string()
272574e54fcbSBram Moolenaar        res ..= c .. '-'
272674e54fcbSBram Moolenaar      endfor
272774e54fcbSBram Moolenaar      assert_equal('', res)
2728f2253963SBram Moolenaar
2729f2253963SBram Moolenaar      var foo: list<dict<any>> = [
2730f2253963SBram Moolenaar              {a: 'Cat'}
2731f2253963SBram Moolenaar            ]
2732f2253963SBram Moolenaar      for dd in foo
2733f2253963SBram Moolenaar        dd.counter = 12
2734f2253963SBram Moolenaar      endfor
2735f2253963SBram Moolenaar      assert_equal([{a: 'Cat', counter: 12}], foo)
2736ad2d4969SBram Moolenaar
2737ad2d4969SBram Moolenaar      reslist = []
2738ad2d4969SBram Moolenaar      for _ in range(3)
2739ad2d4969SBram Moolenaar        reslist->add('x')
2740ad2d4969SBram Moolenaar      endfor
2741ad2d4969SBram Moolenaar      assert_equal(['x', 'x', 'x'], reslist)
2742f2253963SBram Moolenaar  END
2743f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2744e8c4abbbSBram Moolenaarenddef
2745e8c4abbbSBram Moolenaar
27462eb6fc3bSBram Moolenaardef Test_for_loop_with_closure()
27472eb6fc3bSBram Moolenaar  var lines =<< trim END
27482eb6fc3bSBram Moolenaar      var flist: list<func>
27492eb6fc3bSBram Moolenaar      for i in range(5)
27502eb6fc3bSBram Moolenaar        var inloop = i
27512eb6fc3bSBram Moolenaar        flist[i] = () => inloop
27522eb6fc3bSBram Moolenaar      endfor
27532eb6fc3bSBram Moolenaar      for i in range(5)
27542eb6fc3bSBram Moolenaar        assert_equal(4, flist[i]())
27552eb6fc3bSBram Moolenaar      endfor
27562eb6fc3bSBram Moolenaar  END
27572eb6fc3bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
27582eb6fc3bSBram Moolenaar
27592eb6fc3bSBram Moolenaar  lines =<< trim END
27602eb6fc3bSBram Moolenaar      var flist: list<func>
27612eb6fc3bSBram Moolenaar      for i in range(5)
27622eb6fc3bSBram Moolenaar        var inloop = i
27632eb6fc3bSBram Moolenaar        flist[i] = () => {
27642eb6fc3bSBram Moolenaar              return inloop
27652eb6fc3bSBram Moolenaar            }
27662eb6fc3bSBram Moolenaar      endfor
27672eb6fc3bSBram Moolenaar      for i in range(5)
27682eb6fc3bSBram Moolenaar        assert_equal(4, flist[i]())
27692eb6fc3bSBram Moolenaar      endfor
27702eb6fc3bSBram Moolenaar  END
27712eb6fc3bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
27722eb6fc3bSBram Moolenaarenddef
27732eb6fc3bSBram Moolenaar
2774e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2775442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:')
2776442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:')
2777442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:')
2778442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2779442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2780442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:')
2781d4ab807dSBram Moolenaar  CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2782822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
27832d870f8dSBram Moolenaar  delfunc! g:Func
2784675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2785675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2786675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
278774e54fcbSBram Moolenaar
278874e54fcbSBram Moolenaar  # wrong type detected at compile time
278974e54fcbSBram Moolenaar  CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
279074e54fcbSBram Moolenaar
279174e54fcbSBram Moolenaar  # wrong type detected at runtime
279274e54fcbSBram Moolenaar  g:adict = {a: 1}
279374e54fcbSBram Moolenaar  CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
279474e54fcbSBram Moolenaar  unlet g:adict
2795f6a8d420SBram Moolenaar
2796f6a8d420SBram Moolenaar  var lines =<< trim END
2797f6a8d420SBram Moolenaar      var d: list<dict<any>> = [{a: 0}]
2798f6a8d420SBram Moolenaar      for e in d
2799f6a8d420SBram Moolenaar        e = {a: 0, b: ''}
2800f6a8d420SBram Moolenaar      endfor
2801f6a8d420SBram Moolenaar  END
2802f6a8d420SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3)
2803fe090eb5SBram Moolenaar
2804fe090eb5SBram Moolenaar  lines =<< trim END
2805fe090eb5SBram Moolenaar      for nr: number in ['foo']
2806fe090eb5SBram Moolenaar      endfor
2807fe090eb5SBram Moolenaar  END
2808fe090eb5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2809404557e6SBram Moolenaar
2810404557e6SBram Moolenaar  lines =<< trim END
2811404557e6SBram Moolenaar      for n : number in [1, 2]
2812404557e6SBram Moolenaar        echo n
2813404557e6SBram Moolenaar      endfor
2814404557e6SBram Moolenaar  END
2815404557e6SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1059:', 1)
2816efc5db52SBram Moolenaar
2817efc5db52SBram Moolenaar  lines =<< trim END
2818efc5db52SBram Moolenaar      var d: dict<number> = {a: 1, b: 2}
2819efc5db52SBram Moolenaar      for [k: job, v: job] in d->items()
2820efc5db52SBram Moolenaar        echo k v
2821efc5db52SBram Moolenaar      endfor
2822efc5db52SBram Moolenaar  END
2823efc5db52SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2)
2824e8c4abbbSBram Moolenaarenddef
2825e8c4abbbSBram Moolenaar
2826ea87069dSBram Moolenaardef Test_for_loop_script_var()
2827ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2828ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2829ea87069dSBram Moolenaar
2830ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2831ea87069dSBram Moolenaar  var lines =<< trim END
2832ea87069dSBram Moolenaar    vim9script
2833ea87069dSBram Moolenaar    var total = 0
2834ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2835ea87069dSBram Moolenaar      total += s:var
2836ea87069dSBram Moolenaar    endfor
2837ea87069dSBram Moolenaar    assert_equal(6, total)
2838ea87069dSBram Moolenaar
2839ea87069dSBram Moolenaar    total = 0
2840ea87069dSBram Moolenaar    for var in [1, 2, 3]
2841ea87069dSBram Moolenaar      total += var
2842ea87069dSBram Moolenaar    endfor
2843ea87069dSBram Moolenaar    assert_equal(6, total)
2844ea87069dSBram Moolenaar  END
2845ea87069dSBram Moolenaarenddef
2846ea87069dSBram Moolenaar
2847792f786aSBram Moolenaardef Test_for_loop_unpack()
28484b8a0651SBram Moolenaar  var lines =<< trim END
2849792f786aSBram Moolenaar      var result = []
2850792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2851792f786aSBram Moolenaar        result->add(v1)
2852792f786aSBram Moolenaar        result->add(v2)
2853792f786aSBram Moolenaar      endfor
2854792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2855792f786aSBram Moolenaar
2856792f786aSBram Moolenaar      result = []
2857792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2858792f786aSBram Moolenaar        result->add(v1)
2859792f786aSBram Moolenaar        result->add(v2)
2860792f786aSBram Moolenaar        result->add(v3)
2861792f786aSBram Moolenaar      endfor
2862792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2863792f786aSBram Moolenaar
28644b8a0651SBram Moolenaar      result = []
28654b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
28664b8a0651SBram Moolenaar        result->add(&ts)
28674b8a0651SBram Moolenaar        result->add(&sw)
28684b8a0651SBram Moolenaar      endfor
28694b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
28704b8a0651SBram Moolenaar
28714b8a0651SBram Moolenaar      var slist: list<string>
28724b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
28734b8a0651SBram Moolenaar        slist->add($LOOPVAR)
28744b8a0651SBram Moolenaar        slist->add(@r)
28754b8a0651SBram Moolenaar        slist->add(v:errmsg)
28764b8a0651SBram Moolenaar      endfor
28774b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
28784b8a0651SBram Moolenaar
28794b8a0651SBram Moolenaar      slist = []
28804b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
28814b8a0651SBram Moolenaar        slist->add(g:globalvar)
28824b8a0651SBram Moolenaar        slist->add(b:bufvar)
28834b8a0651SBram Moolenaar        slist->add(w:winvar)
28844b8a0651SBram Moolenaar        slist->add(t:tabvar)
28854b8a0651SBram Moolenaar      endfor
28864b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2887f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
2888b777da9bSBram Moolenaar
2889b777da9bSBram Moolenaar      var res = []
2890b777da9bSBram Moolenaar      for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2891b777da9bSBram Moolenaar        res->add(n)
2892b777da9bSBram Moolenaar      endfor
2893b777da9bSBram Moolenaar      assert_equal([2, 5], res)
28944b8a0651SBram Moolenaar  END
28954b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
28964b8a0651SBram Moolenaar
28974b8a0651SBram Moolenaar  lines =<< trim END
2898792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2899792f786aSBram Moolenaar        echo v1 v2
2900792f786aSBram Moolenaar      endfor
2901792f786aSBram Moolenaar  END
2902792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2903792f786aSBram Moolenaar
2904792f786aSBram Moolenaar  lines =<< trim END
2905792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2906792f786aSBram Moolenaar        echo v1 v2
2907792f786aSBram Moolenaar      endfor
2908792f786aSBram Moolenaar  END
2909792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2910792f786aSBram Moolenaar
2911792f786aSBram Moolenaar  lines =<< trim END
2912792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2913792f786aSBram Moolenaar        echo v1
2914792f786aSBram Moolenaar      endfor
2915792f786aSBram Moolenaar  END
2916792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2917792f786aSBram Moolenaarenddef
2918792f786aSBram Moolenaar
2919c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2920f2253963SBram Moolenaar  var lines =<< trim END
2921c150c09eSBram Moolenaar      var looped = 0
2922c150c09eSBram Moolenaar      var cleanup = 0
2923c150c09eSBram Moolenaar      for i in range(3)
2924c150c09eSBram Moolenaar        looped += 1
2925c150c09eSBram Moolenaar        try
2926c150c09eSBram Moolenaar          eval [][0]
2927c150c09eSBram Moolenaar        catch
2928c150c09eSBram Moolenaar          continue
2929c150c09eSBram Moolenaar        finally
2930c150c09eSBram Moolenaar          cleanup += 1
2931c150c09eSBram Moolenaar        endtry
2932c150c09eSBram Moolenaar      endfor
2933c150c09eSBram Moolenaar      assert_equal(3, looped)
2934c150c09eSBram Moolenaar      assert_equal(3, cleanup)
2935f2253963SBram Moolenaar  END
2936f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2937c150c09eSBram Moolenaarenddef
2938c150c09eSBram Moolenaar
2939d895b1d9Srbtnndef Test_while_skipped_block()
2940d895b1d9Srbtnn  # test skipped blocks at outside of function
2941d895b1d9Srbtnn  var lines =<< trim END
2942d895b1d9Srbtnn    var result = []
2943d895b1d9Srbtnn    var n = 0
2944d895b1d9Srbtnn    if true
2945d895b1d9Srbtnn      n = 1
2946d895b1d9Srbtnn      while n < 3
2947d895b1d9Srbtnn        result += [n]
2948d895b1d9Srbtnn        n += 1
2949d895b1d9Srbtnn      endwhile
2950d895b1d9Srbtnn    else
2951d895b1d9Srbtnn      n = 3
2952d895b1d9Srbtnn      while n < 5
2953d895b1d9Srbtnn        result += [n]
2954d895b1d9Srbtnn        n += 1
2955d895b1d9Srbtnn      endwhile
2956d895b1d9Srbtnn    endif
2957d895b1d9Srbtnn    assert_equal([1, 2], result)
2958d895b1d9Srbtnn
2959d895b1d9Srbtnn    result = []
2960d895b1d9Srbtnn    if false
2961d895b1d9Srbtnn      n = 1
2962d895b1d9Srbtnn      while n < 3
2963d895b1d9Srbtnn        result += [n]
2964d895b1d9Srbtnn        n += 1
2965d895b1d9Srbtnn      endwhile
2966d895b1d9Srbtnn    else
2967d895b1d9Srbtnn      n = 3
2968d895b1d9Srbtnn      while n < 5
2969d895b1d9Srbtnn        result += [n]
2970d895b1d9Srbtnn        n += 1
2971d895b1d9Srbtnn      endwhile
2972d895b1d9Srbtnn    endif
2973d895b1d9Srbtnn    assert_equal([3, 4], result)
2974d895b1d9Srbtnn  END
2975d895b1d9Srbtnn  CheckDefAndScriptSuccess(lines)
2976d895b1d9Srbtnn
2977d895b1d9Srbtnn  # test skipped blocks at inside of function
2978d895b1d9Srbtnn  lines =<< trim END
2979d895b1d9Srbtnn    def DefTrue()
2980d895b1d9Srbtnn      var result = []
2981d895b1d9Srbtnn      var n = 0
2982d895b1d9Srbtnn      if true
2983d895b1d9Srbtnn        n = 1
2984d895b1d9Srbtnn        while n < 3
2985d895b1d9Srbtnn          result += [n]
2986d895b1d9Srbtnn          n += 1
2987d895b1d9Srbtnn        endwhile
2988d895b1d9Srbtnn      else
2989d895b1d9Srbtnn        n = 3
2990d895b1d9Srbtnn        while n < 5
2991d895b1d9Srbtnn          result += [n]
2992d895b1d9Srbtnn          n += 1
2993d895b1d9Srbtnn        endwhile
2994d895b1d9Srbtnn      endif
2995d895b1d9Srbtnn      assert_equal([1, 2], result)
2996d895b1d9Srbtnn    enddef
2997d895b1d9Srbtnn    DefTrue()
2998d895b1d9Srbtnn
2999d895b1d9Srbtnn    def DefFalse()
3000d895b1d9Srbtnn      var result = []
3001d895b1d9Srbtnn      var n = 0
3002d895b1d9Srbtnn      if false
3003d895b1d9Srbtnn        n = 1
3004d895b1d9Srbtnn        while n < 3
3005d895b1d9Srbtnn          result += [n]
3006d895b1d9Srbtnn          n += 1
3007d895b1d9Srbtnn        endwhile
3008d895b1d9Srbtnn      else
3009d895b1d9Srbtnn        n = 3
3010d895b1d9Srbtnn        while n < 5
3011d895b1d9Srbtnn          result += [n]
3012d895b1d9Srbtnn          n += 1
3013d895b1d9Srbtnn        endwhile
3014d895b1d9Srbtnn      endif
3015d895b1d9Srbtnn      assert_equal([3, 4], result)
3016d895b1d9Srbtnn    enddef
3017d895b1d9Srbtnn    DefFalse()
3018d895b1d9Srbtnn  END
3019d895b1d9Srbtnn  CheckDefAndScriptSuccess(lines)
3020d895b1d9Srbtnnenddef
3021d895b1d9Srbtnn
3022d0df1aacSBram Moolenaardef Test_while_loop()
3023cfcd011fSBram Moolenaar  var result = ''
3024cfcd011fSBram Moolenaar  var cnt = 0
3025d0df1aacSBram Moolenaar  while cnt < 555
3026d0df1aacSBram Moolenaar    if cnt == 3
3027d0df1aacSBram Moolenaar      break
3028d0df1aacSBram Moolenaar    endif
3029d0df1aacSBram Moolenaar    cnt += 1
3030d0df1aacSBram Moolenaar    if cnt == 2
3031d0df1aacSBram Moolenaar      continue
3032d0df1aacSBram Moolenaar    endif
3033d0df1aacSBram Moolenaar    result ..= cnt .. '_'
3034d0df1aacSBram Moolenaar  endwhile
3035d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
3036dee37dc7SBram Moolenaar
3037dee37dc7SBram Moolenaar  var s = ''
30380123cc1eSBram Moolenaar  while s == 'x' # {comment}
3039dee37dc7SBram Moolenaar  endwhile
3040d0df1aacSBram Moolenaarenddef
3041d0df1aacSBram Moolenaar
3042e8c4abbbSBram Moolenaardef Test_while_loop_fails()
3043675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
3044675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
3045675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
3046675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
3047675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
3048675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
3049675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
30506628b7ebSBram Moolenaar
30516628b7ebSBram Moolenaar  var lines =<< trim END
30526628b7ebSBram Moolenaar      var s = ''
30536628b7ebSBram Moolenaar      while s = ''
30546628b7ebSBram Moolenaar      endwhile
30556628b7ebSBram Moolenaar  END
30566628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
3057bd5da371SBram Moolenaarenddef
3058bd5da371SBram Moolenaar
30599645e2d9SBram Moolenaardef Test_interrupt_loop()
3060cfcd011fSBram Moolenaar  var caught = false
3061cfcd011fSBram Moolenaar  var x = 0
306297acfc78SBram Moolenaar  try
30639645e2d9SBram Moolenaar    while 1
30649645e2d9SBram Moolenaar      x += 1
30659645e2d9SBram Moolenaar      if x == 100
30669645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
30679645e2d9SBram Moolenaar      endif
30689645e2d9SBram Moolenaar    endwhile
306997acfc78SBram Moolenaar  catch
307097acfc78SBram Moolenaar    caught = true
307197acfc78SBram Moolenaar    assert_equal(100, x)
307297acfc78SBram Moolenaar  endtry
307397acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
307425859dd7SBram Moolenaar  # consume the CTRL-C
307525859dd7SBram Moolenaar  getchar(0)
30769645e2d9SBram Moolenaarenddef
307720431c9dSBram Moolenaar
30784fdae999SBram Moolenaardef Test_automatic_line_continuation()
3079cfcd011fSBram Moolenaar  var mylist = [
30804fdae999SBram Moolenaar      'one',
30814fdae999SBram Moolenaar      'two',
30824fdae999SBram Moolenaar      'three',
3083f5be8cdbSBram Moolenaar      ] # comment
30844fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
30854fdae999SBram Moolenaar
3086cfcd011fSBram Moolenaar  var mydict = {
3087e0de171eSBram Moolenaar      ['one']: 1,
3088e0de171eSBram Moolenaar      ['two']: 2,
3089e0de171eSBram Moolenaar      ['three']:
30904fdae999SBram Moolenaar          3,
3091f5be8cdbSBram Moolenaar      } # comment
3092e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
3093e0de171eSBram Moolenaar  mydict = {
30942c330432SBram Moolenaar      one: 1,  # comment
30952c330432SBram Moolenaar      two:     # comment
30962c330432SBram Moolenaar           2,  # comment
30972c330432SBram Moolenaar      three: 3 # comment
30982c330432SBram Moolenaar      }
3099e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
3100e0de171eSBram Moolenaar  mydict = {
31012c330432SBram Moolenaar      one: 1,
31024fdae999SBram Moolenaar      two:
31034fdae999SBram Moolenaar           2,
31042c330432SBram Moolenaar      three: 3
31054fdae999SBram Moolenaar      }
3106e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
3107e6085c53SBram Moolenaar
3108e6085c53SBram Moolenaar  assert_equal(
3109e6085c53SBram Moolenaar        ['one', 'two', 'three'],
3110e6085c53SBram Moolenaar        split('one two three')
3111e6085c53SBram Moolenaar        )
31124fdae999SBram Moolenaarenddef
31134fdae999SBram Moolenaar
31147a092245SBram Moolenaardef Test_vim9_comment()
31157a092245SBram Moolenaar  CheckScriptSuccess([
31167a092245SBram Moolenaar      'vim9script',
31177a092245SBram Moolenaar      '# something',
311893f82cbeSBram Moolenaar      '#something',
311993f82cbeSBram Moolenaar      '#{something',
31207a092245SBram Moolenaar      ])
312193f82cbeSBram Moolenaar
312293f82cbeSBram Moolenaar  split Xfile
312393f82cbeSBram Moolenaar  CheckScriptSuccess([
312493f82cbeSBram Moolenaar      'vim9script',
312593f82cbeSBram Moolenaar      'edit #something',
312693f82cbeSBram Moolenaar      ])
312793f82cbeSBram Moolenaar  CheckScriptSuccess([
312893f82cbeSBram Moolenaar      'vim9script',
312993f82cbeSBram Moolenaar      'edit #{something',
313093f82cbeSBram Moolenaar      ])
313193f82cbeSBram Moolenaar  close
313293f82cbeSBram Moolenaar
31337a092245SBram Moolenaar  CheckScriptFailure([
31347a092245SBram Moolenaar      'vim9script',
31357a092245SBram Moolenaar      ':# something',
31367a092245SBram Moolenaar      ], 'E488:')
31377a092245SBram Moolenaar  CheckScriptFailure([
31387a092245SBram Moolenaar      '# something',
31397a092245SBram Moolenaar      ], 'E488:')
31407a092245SBram Moolenaar  CheckScriptFailure([
31417a092245SBram Moolenaar      ':# something',
31427a092245SBram Moolenaar      ], 'E488:')
31437a092245SBram Moolenaar
31444a8d9f2eSBram Moolenaar  { # block start
31454a8d9f2eSBram Moolenaar  } # block end
31464a8d9f2eSBram Moolenaar  CheckDefFailure([
31474a8d9f2eSBram Moolenaar      '{# comment',
31484a8d9f2eSBram Moolenaar      ], 'E488:')
31494a8d9f2eSBram Moolenaar  CheckDefFailure([
31504a8d9f2eSBram Moolenaar      '{',
31514a8d9f2eSBram Moolenaar      '}# comment',
31524a8d9f2eSBram Moolenaar      ], 'E488:')
31534a8d9f2eSBram Moolenaar
31544a8d9f2eSBram Moolenaar  echo "yes" # comment
31554a8d9f2eSBram Moolenaar  CheckDefFailure([
31564a8d9f2eSBram Moolenaar      'echo "yes"# comment',
31574a8d9f2eSBram Moolenaar      ], 'E488:')
31587a092245SBram Moolenaar  CheckScriptSuccess([
31597a092245SBram Moolenaar      'vim9script',
31607a092245SBram Moolenaar      'echo "yes" # something',
31617a092245SBram Moolenaar      ])
31627a092245SBram Moolenaar  CheckScriptFailure([
31637a092245SBram Moolenaar      'vim9script',
31647a092245SBram Moolenaar      'echo "yes"# something',
31657a092245SBram Moolenaar      ], 'E121:')
31667a092245SBram Moolenaar  CheckScriptFailure([
31677a092245SBram Moolenaar      'vim9script',
31687a092245SBram Moolenaar      'echo# something',
3169f8103f27SBram Moolenaar      ], 'E1144:')
31707a092245SBram Moolenaar  CheckScriptFailure([
31717a092245SBram Moolenaar      'echo "yes" # something',
31727a092245SBram Moolenaar      ], 'E121:')
31737a092245SBram Moolenaar
31744a8d9f2eSBram Moolenaar  exe "echo" # comment
31754a8d9f2eSBram Moolenaar  CheckDefFailure([
31764a8d9f2eSBram Moolenaar      'exe "echo"# comment',
31774a8d9f2eSBram Moolenaar      ], 'E488:')
31784a8d9f2eSBram Moolenaar  CheckScriptSuccess([
31794a8d9f2eSBram Moolenaar      'vim9script',
31804a8d9f2eSBram Moolenaar      'exe "echo" # something',
31814a8d9f2eSBram Moolenaar      ])
31824a8d9f2eSBram Moolenaar  CheckScriptFailure([
31834a8d9f2eSBram Moolenaar      'vim9script',
31844a8d9f2eSBram Moolenaar      'exe "echo"# something',
31854a8d9f2eSBram Moolenaar      ], 'E121:')
31864a8d9f2eSBram Moolenaar  CheckScriptFailure([
31874a8d9f2eSBram Moolenaar      'vim9script',
31884a8d9f2eSBram Moolenaar      'exe# something',
3189f8103f27SBram Moolenaar      ], 'E1144:')
31904a8d9f2eSBram Moolenaar  CheckScriptFailure([
31914a8d9f2eSBram Moolenaar      'exe "echo" # something',
31924a8d9f2eSBram Moolenaar      ], 'E121:')
31934a8d9f2eSBram Moolenaar
31947a092245SBram Moolenaar  CheckDefFailure([
31957a092245SBram Moolenaar      'try# comment',
31967a092245SBram Moolenaar      '  echo "yes"',
31977a092245SBram Moolenaar      'catch',
31987a092245SBram Moolenaar      'endtry',
3199f8103f27SBram Moolenaar      ], 'E1144:')
32002c5ed4e3SBram Moolenaar  CheckScriptFailure([
32012c5ed4e3SBram Moolenaar      'vim9script',
32022c5ed4e3SBram Moolenaar      'try# comment',
32032c5ed4e3SBram Moolenaar      'echo "yes"',
3204f8103f27SBram Moolenaar      ], 'E1144:')
32057a092245SBram Moolenaar  CheckDefFailure([
32067a092245SBram Moolenaar      'try',
3207a72cfb80SBram Moolenaar      '  throw#comment',
3208a72cfb80SBram Moolenaar      'catch',
3209a72cfb80SBram Moolenaar      'endtry',
3210f8103f27SBram Moolenaar      ], 'E1144:')
3211a72cfb80SBram Moolenaar  CheckDefFailure([
3212a72cfb80SBram Moolenaar      'try',
3213a72cfb80SBram Moolenaar      '  throw "yes"#comment',
3214a72cfb80SBram Moolenaar      'catch',
3215a72cfb80SBram Moolenaar      'endtry',
3216a72cfb80SBram Moolenaar      ], 'E488:')
3217a72cfb80SBram Moolenaar  CheckDefFailure([
3218a72cfb80SBram Moolenaar      'try',
32197a092245SBram Moolenaar      '  echo "yes"',
32207a092245SBram Moolenaar      'catch# comment',
32217a092245SBram Moolenaar      'endtry',
3222f8103f27SBram Moolenaar      ], 'E1144:')
32232c5ed4e3SBram Moolenaar  CheckScriptFailure([
32242c5ed4e3SBram Moolenaar      'vim9script',
32252c5ed4e3SBram Moolenaar      'try',
32262c5ed4e3SBram Moolenaar      '  echo "yes"',
32272c5ed4e3SBram Moolenaar      'catch# comment',
32282c5ed4e3SBram Moolenaar      'endtry',
3229f8103f27SBram Moolenaar      ], 'E1144:')
32302c5ed4e3SBram Moolenaar  CheckDefFailure([
32312c5ed4e3SBram Moolenaar      'try',
32322c5ed4e3SBram Moolenaar      '  echo "yes"',
32332c5ed4e3SBram Moolenaar      'catch /pat/# comment',
32342c5ed4e3SBram Moolenaar      'endtry',
32352c5ed4e3SBram Moolenaar      ], 'E488:')
32367a092245SBram Moolenaar  CheckDefFailure([
32377a092245SBram Moolenaar      'try',
32387a092245SBram Moolenaar      'echo "yes"',
32397a092245SBram Moolenaar      'catch',
32407a092245SBram Moolenaar      'endtry# comment',
3241f8103f27SBram Moolenaar      ], 'E1144:')
32422c5ed4e3SBram Moolenaar  CheckScriptFailure([
32432c5ed4e3SBram Moolenaar      'vim9script',
32442c5ed4e3SBram Moolenaar      'try',
32452c5ed4e3SBram Moolenaar      '  echo "yes"',
32462c5ed4e3SBram Moolenaar      'catch',
32472c5ed4e3SBram Moolenaar      'endtry# comment',
3248f8103f27SBram Moolenaar      ], 'E1144:')
32492c5ed4e3SBram Moolenaar
32502c5ed4e3SBram Moolenaar  CheckScriptSuccess([
32512c5ed4e3SBram Moolenaar      'vim9script',
32522c5ed4e3SBram Moolenaar      'hi # comment',
32532c5ed4e3SBram Moolenaar      ])
32542c5ed4e3SBram Moolenaar  CheckScriptFailure([
32552c5ed4e3SBram Moolenaar      'vim9script',
32562c5ed4e3SBram Moolenaar      'hi# comment',
3257f8103f27SBram Moolenaar      ], 'E1144:')
32581966c248SBram Moolenaar  CheckScriptSuccess([
32591966c248SBram Moolenaar      'vim9script',
32601966c248SBram Moolenaar      'hi Search # comment',
32611966c248SBram Moolenaar      ])
32621966c248SBram Moolenaar  CheckScriptFailure([
32631966c248SBram Moolenaar      'vim9script',
32641966c248SBram Moolenaar      'hi Search# comment',
32651966c248SBram Moolenaar      ], 'E416:')
32661966c248SBram Moolenaar  CheckScriptSuccess([
32671966c248SBram Moolenaar      'vim9script',
32681966c248SBram Moolenaar      'hi link This Search # comment',
32691966c248SBram Moolenaar      ])
32701966c248SBram Moolenaar  CheckScriptFailure([
32711966c248SBram Moolenaar      'vim9script',
32721966c248SBram Moolenaar      'hi link This That# comment',
32731966c248SBram Moolenaar      ], 'E413:')
32741966c248SBram Moolenaar  CheckScriptSuccess([
32751966c248SBram Moolenaar      'vim9script',
32761966c248SBram Moolenaar      'hi clear This # comment',
32771966c248SBram Moolenaar      'hi clear # comment',
32781966c248SBram Moolenaar      ])
3279f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
3280f5be8cdbSBram Moolenaar  # hi clear This# comment',
32811966c248SBram Moolenaar  CheckScriptFailure([
32821966c248SBram Moolenaar      'vim9script',
32831966c248SBram Moolenaar      'hi clear# comment',
32841966c248SBram Moolenaar      ], 'E416:')
32851966c248SBram Moolenaar
32861966c248SBram Moolenaar  CheckScriptSuccess([
32871966c248SBram Moolenaar      'vim9script',
32881966c248SBram Moolenaar      'hi Group term=bold',
32891966c248SBram Moolenaar      'match Group /todo/ # comment',
32901966c248SBram Moolenaar      ])
32911966c248SBram Moolenaar  CheckScriptFailure([
32921966c248SBram Moolenaar      'vim9script',
32931966c248SBram Moolenaar      'hi Group term=bold',
32941966c248SBram Moolenaar      'match Group /todo/# comment',
32951966c248SBram Moolenaar      ], 'E488:')
32961966c248SBram Moolenaar  CheckScriptSuccess([
32971966c248SBram Moolenaar      'vim9script',
32981966c248SBram Moolenaar      'match # comment',
32991966c248SBram Moolenaar      ])
33001966c248SBram Moolenaar  CheckScriptFailure([
33011966c248SBram Moolenaar      'vim9script',
33021966c248SBram Moolenaar      'match# comment',
3303f8103f27SBram Moolenaar      ], 'E1144:')
33041966c248SBram Moolenaar  CheckScriptSuccess([
33051966c248SBram Moolenaar      'vim9script',
33061966c248SBram Moolenaar      'match none # comment',
33071966c248SBram Moolenaar      ])
33081966c248SBram Moolenaar  CheckScriptFailure([
33091966c248SBram Moolenaar      'vim9script',
33101966c248SBram Moolenaar      'match none# comment',
33111966c248SBram Moolenaar      ], 'E475:')
33121966c248SBram Moolenaar
33131966c248SBram Moolenaar  CheckScriptSuccess([
33141966c248SBram Moolenaar      'vim9script',
33151966c248SBram Moolenaar      'menutrans clear # comment',
33161966c248SBram Moolenaar      ])
33171966c248SBram Moolenaar  CheckScriptFailure([
33181966c248SBram Moolenaar      'vim9script',
33191966c248SBram Moolenaar      'menutrans clear# comment text',
33201966c248SBram Moolenaar      ], 'E474:')
33211966c248SBram Moolenaar
33221966c248SBram Moolenaar  CheckScriptSuccess([
33231966c248SBram Moolenaar      'vim9script',
33241966c248SBram Moolenaar      'syntax clear # comment',
33251966c248SBram Moolenaar      ])
33261966c248SBram Moolenaar  CheckScriptFailure([
33271966c248SBram Moolenaar      'vim9script',
33281966c248SBram Moolenaar      'syntax clear# comment text',
33291966c248SBram Moolenaar      ], 'E28:')
33301966c248SBram Moolenaar  CheckScriptSuccess([
33311966c248SBram Moolenaar      'vim9script',
33321966c248SBram Moolenaar      'syntax keyword Word some',
33331966c248SBram Moolenaar      'syntax clear Word # comment',
33341966c248SBram Moolenaar      ])
33351966c248SBram Moolenaar  CheckScriptFailure([
33361966c248SBram Moolenaar      'vim9script',
33371966c248SBram Moolenaar      'syntax keyword Word some',
33381966c248SBram Moolenaar      'syntax clear Word# comment text',
33391966c248SBram Moolenaar      ], 'E28:')
33401966c248SBram Moolenaar
33411966c248SBram Moolenaar  CheckScriptSuccess([
33421966c248SBram Moolenaar      'vim9script',
33431966c248SBram Moolenaar      'syntax list # comment',
33441966c248SBram Moolenaar      ])
33451966c248SBram Moolenaar  CheckScriptFailure([
33461966c248SBram Moolenaar      'vim9script',
33471966c248SBram Moolenaar      'syntax list# comment text',
33481966c248SBram Moolenaar      ], 'E28:')
33491966c248SBram Moolenaar
33501966c248SBram Moolenaar  CheckScriptSuccess([
33511966c248SBram Moolenaar      'vim9script',
33521966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
33531966c248SBram Moolenaar      ])
33541966c248SBram Moolenaar  CheckScriptFailure([
33551966c248SBram Moolenaar      'vim9script',
33561966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
33571966c248SBram Moolenaar      ], 'E475:')
33581966c248SBram Moolenaar
33591966c248SBram Moolenaar  CheckScriptSuccess([
33601966c248SBram Moolenaar      'vim9script',
33611966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
33621966c248SBram Moolenaar      ])
33631966c248SBram Moolenaar  CheckScriptFailure([
33641966c248SBram Moolenaar      'vim9script',
33651966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
33661966c248SBram Moolenaar      ], 'E789:')
33671966c248SBram Moolenaar
33681966c248SBram Moolenaar  CheckScriptSuccess([
33691966c248SBram Moolenaar      'vim9script',
33701966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
33711966c248SBram Moolenaar      ])
33721966c248SBram Moolenaar  CheckScriptFailure([
33731966c248SBram Moolenaar      'vim9script',
33741966c248SBram Moolenaar      'syntax match Word /pat/# comment',
33751966c248SBram Moolenaar      ], 'E402:')
33761966c248SBram Moolenaar
33771966c248SBram Moolenaar  CheckScriptSuccess([
33781966c248SBram Moolenaar      'vim9script',
33791966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
33801966c248SBram Moolenaar      ])
33811966c248SBram Moolenaar  CheckScriptFailure([
33821966c248SBram Moolenaar      'vim9script',
33831966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
33841966c248SBram Moolenaar      ], 'E475:')
33851966c248SBram Moolenaar  CheckScriptFailure([
33861966c248SBram Moolenaar      'vim9script',
33871966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
33881966c248SBram Moolenaar      ], 'E406:')
33891966c248SBram Moolenaar  CheckScriptFailure([
33901966c248SBram Moolenaar      'vim9script',
33911966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
33921966c248SBram Moolenaar      ], 'E475:')
33931966c248SBram Moolenaar
33941966c248SBram Moolenaar  CheckScriptSuccess([
33951966c248SBram Moolenaar      'vim9script',
33961966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
33971966c248SBram Moolenaar      ])
33981966c248SBram Moolenaar  CheckScriptFailure([
33991966c248SBram Moolenaar      'vim9script',
34001966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
3401d032f34aSBram Moolenaar      ], 'E402:')
34021966c248SBram Moolenaar
34031966c248SBram Moolenaar  CheckScriptSuccess([
34041966c248SBram Moolenaar      'vim9script',
34051966c248SBram Moolenaar      'syntax sync # comment',
34061966c248SBram Moolenaar      ])
34071966c248SBram Moolenaar  CheckScriptFailure([
34081966c248SBram Moolenaar      'vim9script',
34091966c248SBram Moolenaar      'syntax sync# comment',
34101966c248SBram Moolenaar      ], 'E404:')
34111966c248SBram Moolenaar  CheckScriptSuccess([
34121966c248SBram Moolenaar      'vim9script',
34131966c248SBram Moolenaar      'syntax sync ccomment # comment',
34141966c248SBram Moolenaar      ])
34151966c248SBram Moolenaar  CheckScriptFailure([
34161966c248SBram Moolenaar      'vim9script',
34171966c248SBram Moolenaar      'syntax sync ccomment# comment',
34181966c248SBram Moolenaar      ], 'E404:')
34191966c248SBram Moolenaar
34201966c248SBram Moolenaar  CheckScriptSuccess([
34211966c248SBram Moolenaar      'vim9script',
34221966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
34231966c248SBram Moolenaar      ])
34241966c248SBram Moolenaar  CheckScriptFailure([
34251966c248SBram Moolenaar      'vim9script',
34261966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
34271966c248SBram Moolenaar      ], 'E475:')
3428a72cfb80SBram Moolenaar
3429a72cfb80SBram Moolenaar  CheckScriptSuccess([
3430a72cfb80SBram Moolenaar      'vim9script',
3431a72cfb80SBram Moolenaar      'command Echo echo # comment',
3432a72cfb80SBram Moolenaar      'command Echo # comment',
34332d870f8dSBram Moolenaar      'delcommand Echo',
3434a72cfb80SBram Moolenaar      ])
3435a72cfb80SBram Moolenaar  CheckScriptFailure([
3436a72cfb80SBram Moolenaar      'vim9script',
3437a72cfb80SBram Moolenaar      'command Echo echo# comment',
3438a72cfb80SBram Moolenaar      'Echo',
3439f8103f27SBram Moolenaar      ], 'E1144:')
34402d870f8dSBram Moolenaar  delcommand Echo
344170249ee8SBram Moolenaar
344270249ee8SBram Moolenaar  var curdir = getcwd()
344370249ee8SBram Moolenaar  CheckScriptSuccess([
344470249ee8SBram Moolenaar      'command Echo cd " comment',
344570249ee8SBram Moolenaar      'Echo',
344670249ee8SBram Moolenaar      'delcommand Echo',
344770249ee8SBram Moolenaar      ])
344870249ee8SBram Moolenaar  CheckScriptSuccess([
3449090728adSBram Moolenaar      'vim9script',
345070249ee8SBram Moolenaar      'command Echo cd # comment',
345170249ee8SBram Moolenaar      'Echo',
345270249ee8SBram Moolenaar      'delcommand Echo',
345370249ee8SBram Moolenaar      ])
345470249ee8SBram Moolenaar  CheckScriptFailure([
345570249ee8SBram Moolenaar      'vim9script',
345670249ee8SBram Moolenaar      'command Echo cd " comment',
345770249ee8SBram Moolenaar      'Echo',
345870249ee8SBram Moolenaar      ], 'E344:')
345970249ee8SBram Moolenaar  delcommand Echo
346070249ee8SBram Moolenaar  chdir(curdir)
346170249ee8SBram Moolenaar
3462a72cfb80SBram Moolenaar  CheckScriptFailure([
3463a72cfb80SBram Moolenaar      'vim9script',
3464a72cfb80SBram Moolenaar      'command Echo# comment',
3465a72cfb80SBram Moolenaar      ], 'E182:')
3466a72cfb80SBram Moolenaar  CheckScriptFailure([
3467a72cfb80SBram Moolenaar      'vim9script',
3468a72cfb80SBram Moolenaar      'command Echo echo',
3469a72cfb80SBram Moolenaar      'command Echo# comment',
3470a72cfb80SBram Moolenaar      ], 'E182:')
34712d870f8dSBram Moolenaar  delcommand Echo
3472a72cfb80SBram Moolenaar
3473a72cfb80SBram Moolenaar  CheckScriptSuccess([
3474a72cfb80SBram Moolenaar      'vim9script',
3475a72cfb80SBram Moolenaar      'function # comment',
3476a72cfb80SBram Moolenaar      ])
3477a72cfb80SBram Moolenaar  CheckScriptFailure([
3478a72cfb80SBram Moolenaar      'vim9script',
34799898107fSBram Moolenaar      'function " comment',
34809898107fSBram Moolenaar      ], 'E129:')
34819898107fSBram Moolenaar  CheckScriptFailure([
34829898107fSBram Moolenaar      'vim9script',
3483a72cfb80SBram Moolenaar      'function# comment',
3484f8103f27SBram Moolenaar      ], 'E1144:')
3485a72cfb80SBram Moolenaar  CheckScriptSuccess([
3486a72cfb80SBram Moolenaar      'vim9script',
3487a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
3488a72cfb80SBram Moolenaar      ])
3489a72cfb80SBram Moolenaar  CheckScriptFailure([
3490a72cfb80SBram Moolenaar      'vim9script',
3491a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
3492a72cfb80SBram Moolenaar      ], 'E488:')
3493a72cfb80SBram Moolenaar
3494a72cfb80SBram Moolenaar  CheckScriptSuccess([
3495a72cfb80SBram Moolenaar      'vim9script',
34964c17ad94SBram Moolenaar      'func g:DeleteMeA()',
3497a72cfb80SBram Moolenaar      'endfunc',
34984c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
3499a72cfb80SBram Moolenaar      ])
3500a72cfb80SBram Moolenaar  CheckScriptFailure([
3501a72cfb80SBram Moolenaar      'vim9script',
35024c17ad94SBram Moolenaar      'func g:DeleteMeB()',
3503a72cfb80SBram Moolenaar      'endfunc',
35044c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
3505a72cfb80SBram Moolenaar      ], 'E488:')
3506a72cfb80SBram Moolenaar
3507a72cfb80SBram Moolenaar  CheckScriptSuccess([
3508a72cfb80SBram Moolenaar      'vim9script',
3509a72cfb80SBram Moolenaar      'call execute("ls") # comment',
3510a72cfb80SBram Moolenaar      ])
3511a72cfb80SBram Moolenaar  CheckScriptFailure([
3512a72cfb80SBram Moolenaar      'vim9script',
3513a72cfb80SBram Moolenaar      'call execute("ls")# comment',
3514a72cfb80SBram Moolenaar      ], 'E488:')
3515e7e4838fSBram Moolenaar
3516e7e4838fSBram Moolenaar  CheckScriptFailure([
3517e7e4838fSBram Moolenaar      'def Test() " comment',
3518e7e4838fSBram Moolenaar      'enddef',
3519e7e4838fSBram Moolenaar      ], 'E488:')
3520e7e4838fSBram Moolenaar  CheckScriptFailure([
3521e7e4838fSBram Moolenaar      'vim9script',
3522e7e4838fSBram Moolenaar      'def Test() " comment',
3523e7e4838fSBram Moolenaar      'enddef',
3524e7e4838fSBram Moolenaar      ], 'E488:')
3525e7e4838fSBram Moolenaar
3526e7e4838fSBram Moolenaar  CheckScriptSuccess([
3527e7e4838fSBram Moolenaar      'func Test() " comment',
3528e7e4838fSBram Moolenaar      'endfunc',
35292d870f8dSBram Moolenaar      'delfunc Test',
3530e7e4838fSBram Moolenaar      ])
35319898107fSBram Moolenaar  CheckScriptSuccess([
3532e7e4838fSBram Moolenaar      'vim9script',
3533e7e4838fSBram Moolenaar      'func Test() " comment',
3534e7e4838fSBram Moolenaar      'endfunc',
35359898107fSBram Moolenaar      ])
3536e7e4838fSBram Moolenaar
3537e7e4838fSBram Moolenaar  CheckScriptSuccess([
3538e7e4838fSBram Moolenaar      'def Test() # comment',
3539e7e4838fSBram Moolenaar      'enddef',
3540e7e4838fSBram Moolenaar      ])
3541e7e4838fSBram Moolenaar  CheckScriptFailure([
3542e7e4838fSBram Moolenaar      'func Test() # comment',
3543e7e4838fSBram Moolenaar      'endfunc',
3544e7e4838fSBram Moolenaar      ], 'E488:')
35450f37e356SBram Moolenaar
35460f37e356SBram Moolenaar  var lines =<< trim END
35470f37e356SBram Moolenaar      vim9script
35480f37e356SBram Moolenaar      syn region Text
35490f37e356SBram Moolenaar      \ start='foo'
35500f37e356SBram Moolenaar      #\ comment
35510f37e356SBram Moolenaar      \ end='bar'
35525072b47aSBram Moolenaar      syn region Text start='foo'
35535072b47aSBram Moolenaar      #\ comment
35545072b47aSBram Moolenaar      \ end='bar'
35550f37e356SBram Moolenaar  END
35560f37e356SBram Moolenaar  CheckScriptSuccess(lines)
35570f37e356SBram Moolenaar
35580f37e356SBram Moolenaar  lines =<< trim END
35590f37e356SBram Moolenaar      vim9script
35600f37e356SBram Moolenaar      syn region Text
35610f37e356SBram Moolenaar      \ start='foo'
35620f37e356SBram Moolenaar      "\ comment
35630f37e356SBram Moolenaar      \ end='bar'
35640f37e356SBram Moolenaar  END
35650f37e356SBram Moolenaar  CheckScriptFailure(lines, 'E399:')
35662c5ed4e3SBram Moolenaarenddef
35672c5ed4e3SBram Moolenaar
35682c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
35692c5ed4e3SBram Moolenaar  CheckCanRunGui
35702c5ed4e3SBram Moolenaar
35712c5ed4e3SBram Moolenaar  CheckScriptFailure([
35722c5ed4e3SBram Moolenaar      'vim9script',
35732c5ed4e3SBram Moolenaar      'gui#comment'
3574f8103f27SBram Moolenaar      ], 'E1144:')
35752c5ed4e3SBram Moolenaar  CheckScriptFailure([
35762c5ed4e3SBram Moolenaar      'vim9script',
35772c5ed4e3SBram Moolenaar      'gui -f#comment'
3578b8bd2e6eSBram Moolenaar      ], 'E194:')
35797a092245SBram Moolenaarenddef
35807a092245SBram Moolenaar
3581a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
35826797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
35836797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3584a26b9700SBram Moolenaar
3585a26b9700SBram Moolenaar  edit test.vim
3586a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3587a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3588a26b9700SBram Moolenaar
3589a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3590a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3591a26b9700SBram Moolenaar
3592a26b9700SBram Moolenaar  g:entered = 0
3593a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3594a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3595a26b9700SBram Moolenaar
3596a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3597a26b9700SBram Moolenaar
3598a26b9700SBram Moolenaar  au! TabEnter
3599a26b9700SBram Moolenaar  unlet g:entered
3600d72c1bf0SBram Moolenaar
3601d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3602d72c1bf0SBram Moolenaar      'vim9script',
36036797966dSBram Moolenaar      'g:var = 123',
3604e55b1c09SBram Moolenaar      'b:var = 456',
3605e55b1c09SBram Moolenaar      'w:var = 777',
3606e55b1c09SBram Moolenaar      't:var = 888',
3607d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3608d72c1bf0SBram Moolenaar      ])
3609d72c1bf0SBram Moolenaar
3610d72c1bf0SBram Moolenaar  CheckScriptFailure([
3611d72c1bf0SBram Moolenaar      'vim9script',
3612cfcd011fSBram Moolenaar      'let var = 123',
3613cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3614cfcd011fSBram Moolenaar
3615cfcd011fSBram Moolenaar  CheckScriptFailure([
3616cfcd011fSBram Moolenaar      'vim9script',
3617cfcd011fSBram Moolenaar      'var g:var = 123',
3618e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3619e55b1c09SBram Moolenaar
3620e55b1c09SBram Moolenaar  CheckScriptFailure([
3621e55b1c09SBram Moolenaar      'vim9script',
3622cfcd011fSBram Moolenaar      'var b:var = 123',
3623e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3624e55b1c09SBram Moolenaar
3625e55b1c09SBram Moolenaar  CheckScriptFailure([
3626e55b1c09SBram Moolenaar      'vim9script',
3627cfcd011fSBram Moolenaar      'var w:var = 123',
3628e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3629e55b1c09SBram Moolenaar
3630e55b1c09SBram Moolenaar  CheckScriptFailure([
3631e55b1c09SBram Moolenaar      'vim9script',
3632cfcd011fSBram Moolenaar      'var t:var = 123',
3633e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3634e55b1c09SBram Moolenaar
3635e55b1c09SBram Moolenaar  CheckScriptFailure([
3636e55b1c09SBram Moolenaar      'vim9script',
3637cfcd011fSBram Moolenaar      'var v:version = 123',
3638e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3639e55b1c09SBram Moolenaar
3640e55b1c09SBram Moolenaar  CheckScriptFailure([
3641e55b1c09SBram Moolenaar      'vim9script',
3642cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3643e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
36446797966dSBram Moolenaar
36456797966dSBram Moolenaar  CheckScriptFailure([
36466797966dSBram Moolenaar      'vim9script',
36476797966dSBram Moolenaar      'g:var = 123',
364832e35117SBram Moolenaar      'unlet g:var# comment1',
3649d72c1bf0SBram Moolenaar      ], 'E108:')
3650d72c1bf0SBram Moolenaar
3651d72c1bf0SBram Moolenaar  CheckScriptFailure([
3652d72c1bf0SBram Moolenaar      'let g:var = 123',
3653d72c1bf0SBram Moolenaar      'unlet g:var # something',
3654d72c1bf0SBram Moolenaar      ], 'E488:')
3655faac4104SBram Moolenaar
3656faac4104SBram Moolenaar  CheckScriptSuccess([
3657faac4104SBram Moolenaar      'vim9script',
365832e35117SBram Moolenaar      'if 1 # comment2',
3659faac4104SBram Moolenaar      '  echo "yes"',
3660faac4104SBram Moolenaar      'elseif 2 #comment',
3661faac4104SBram Moolenaar      '  echo "no"',
3662faac4104SBram Moolenaar      'endif',
3663faac4104SBram Moolenaar      ])
3664faac4104SBram Moolenaar
3665faac4104SBram Moolenaar  CheckScriptFailure([
3666faac4104SBram Moolenaar      'vim9script',
366732e35117SBram Moolenaar      'if 1# comment3',
3668faac4104SBram Moolenaar      '  echo "yes"',
3669faac4104SBram Moolenaar      'endif',
3670fae55a9cSBram Moolenaar      ], 'E488:')
3671faac4104SBram Moolenaar
3672faac4104SBram Moolenaar  CheckScriptFailure([
3673faac4104SBram Moolenaar      'vim9script',
367432e35117SBram Moolenaar      'if 0 # comment4',
3675faac4104SBram Moolenaar      '  echo "yes"',
3676faac4104SBram Moolenaar      'elseif 2#comment',
3677faac4104SBram Moolenaar      '  echo "no"',
3678faac4104SBram Moolenaar      'endif',
3679fae55a9cSBram Moolenaar      ], 'E488:')
3680faac4104SBram Moolenaar
3681faac4104SBram Moolenaar  CheckScriptSuccess([
3682faac4104SBram Moolenaar      'vim9script',
3683cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3684faac4104SBram Moolenaar      ])
3685faac4104SBram Moolenaar
3686faac4104SBram Moolenaar  CheckScriptFailure([
3687faac4104SBram Moolenaar      'vim9script',
3688cfcd011fSBram Moolenaar      'var v = 1# comment6',
3689fae55a9cSBram Moolenaar      ], 'E488:')
3690faac4104SBram Moolenaar
3691faac4104SBram Moolenaar  CheckScriptSuccess([
3692faac4104SBram Moolenaar      'vim9script',
3693faac4104SBram Moolenaar      'new'
3694d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3695df069eecSBram Moolenaar      ':$',
3696faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3697faac4104SBram Moolenaar      'bwipe!',
3698faac4104SBram Moolenaar      ])
3699faac4104SBram Moolenaar
3700f5be8cdbSBram Moolenaar  CheckScriptFailure([
3701f5be8cdbSBram Moolenaar      'vim9script',
3702f5be8cdbSBram Moolenaar      'new'
3703d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3704f5be8cdbSBram Moolenaar      ':$',
3705f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3706f5be8cdbSBram Moolenaar      'bwipe!',
3707f5be8cdbSBram Moolenaar      ], 'E488:')
3708f5be8cdbSBram Moolenaar
3709f5be8cdbSBram Moolenaar  CheckScriptFailure([
3710f5be8cdbSBram Moolenaar      'vim9script',
3711f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3712f5be8cdbSBram Moolenaar      ], 'E477:')
3713a26b9700SBram Moolenaarenddef
3714a26b9700SBram Moolenaar
37157e5bd91dSBram Moolenaardef Test_finish()
3716cfcd011fSBram Moolenaar  var lines =<< trim END
37177e5bd91dSBram Moolenaar    vim9script
37186797966dSBram Moolenaar    g:res = 'one'
37197e5bd91dSBram Moolenaar    if v:false | finish | endif
37206797966dSBram Moolenaar    g:res = 'two'
37217e5bd91dSBram Moolenaar    finish
37226797966dSBram Moolenaar    g:res = 'three'
37237e5bd91dSBram Moolenaar  END
37247e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
37257e5bd91dSBram Moolenaar  source Xfinished
37267e5bd91dSBram Moolenaar  assert_equal('two', g:res)
37277e5bd91dSBram Moolenaar
37287e5bd91dSBram Moolenaar  unlet g:res
37297e5bd91dSBram Moolenaar  delete('Xfinished')
37307e5bd91dSBram Moolenaarenddef
37317e5bd91dSBram Moolenaar
3732a5d0077eSBram Moolenaardef Test_forward_declaration()
3733cfcd011fSBram Moolenaar  var lines =<< trim END
3734a5d0077eSBram Moolenaar    vim9script
3735a5d0077eSBram Moolenaar    def GetValue(): string
3736a5d0077eSBram Moolenaar      return theVal
3737a5d0077eSBram Moolenaar    enddef
3738cfcd011fSBram Moolenaar    var theVal = 'something'
3739822ba247SBram Moolenaar    g:initVal = GetValue()
3740a5d0077eSBram Moolenaar    theVal = 'else'
3741a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3742a5d0077eSBram Moolenaar  END
3743a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3744a5d0077eSBram Moolenaar  source Xforward
3745a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3746a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3747a5d0077eSBram Moolenaar
3748a5d0077eSBram Moolenaar  unlet g:initVal
3749a5d0077eSBram Moolenaar  unlet g:laterVal
3750a5d0077eSBram Moolenaar  delete('Xforward')
3751a5d0077eSBram Moolenaarenddef
3752a5d0077eSBram Moolenaar
37539721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3754a6294955SBram Moolenaar  var vim9_lines =<< trim END
3755a6294955SBram Moolenaar    vim9script
3756a6294955SBram Moolenaar    var local = 'local'
3757a6294955SBram Moolenaar    g:global = 'global'
3758a6294955SBram Moolenaar    export var exported = 'exported'
3759a6294955SBram Moolenaar    export def GetText(): string
3760a6294955SBram Moolenaar       return 'text'
3761a6294955SBram Moolenaar    enddef
3762a6294955SBram Moolenaar  END
3763a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3764a6294955SBram Moolenaar
3765cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
37669721fb4eSBram Moolenaar    source Xvim9_script.vim
37679721fb4eSBram Moolenaar
37689721fb4eSBram Moolenaar    call assert_false(exists('local'))
37699721fb4eSBram Moolenaar    call assert_false(exists('exported'))
37709721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
37719721fb4eSBram Moolenaar    call assert_equal('global', global)
37729721fb4eSBram Moolenaar    call assert_equal('global', g:global)
37739721fb4eSBram Moolenaar
37749721fb4eSBram Moolenaar    " imported variable becomes script-local
37759721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
37769721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
37779721fb4eSBram Moolenaar    call assert_false(exists('exported'))
37789721fb4eSBram Moolenaar
37799721fb4eSBram Moolenaar    " imported function becomes script-local
37809721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
37819721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
37829721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
37839721fb4eSBram Moolenaar  END
37849721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
37859721fb4eSBram Moolenaar
37869721fb4eSBram Moolenaar  source Xlegacy_script.vim
37879721fb4eSBram Moolenaar  assert_equal('global', g:global)
3788f5be8cdbSBram Moolenaar  unlet g:global
37899721fb4eSBram Moolenaar
37909721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
37919721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
37929721fb4eSBram Moolenaarenddef
3793a5d0077eSBram Moolenaar
3794e535db86SBram Moolenaardef Test_declare_script_in_func()
3795e535db86SBram Moolenaar  var lines =<< trim END
3796e535db86SBram Moolenaar      vim9script
3797e535db86SBram Moolenaar      func Declare()
3798e535db86SBram Moolenaar        let s:local = 123
3799e535db86SBram Moolenaar      endfunc
3800e535db86SBram Moolenaar      Declare()
3801e535db86SBram Moolenaar      assert_equal(123, local)
3802e535db86SBram Moolenaar
3803e535db86SBram Moolenaar      var error: string
3804e535db86SBram Moolenaar      try
3805e535db86SBram Moolenaar        local = 'asdf'
3806e535db86SBram Moolenaar      catch
3807e535db86SBram Moolenaar        error = v:exception
3808e535db86SBram Moolenaar      endtry
3809e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3810e535db86SBram Moolenaar
3811e535db86SBram Moolenaar      lockvar local
3812e535db86SBram Moolenaar      try
3813e535db86SBram Moolenaar        local = 999
3814e535db86SBram Moolenaar      catch
3815e535db86SBram Moolenaar        error = v:exception
3816e535db86SBram Moolenaar      endtry
3817e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3818e535db86SBram Moolenaar  END
3819e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3820e535db86SBram Moolenaarenddef
3821e535db86SBram Moolenaar
3822e535db86SBram Moolenaar
38237d699701SBram Moolenaarfunc Test_vim9script_not_global()
38247d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
38257d699701SBram Moolenaar  let vim9lines =<< trim END
38267d699701SBram Moolenaar    vim9script
3827cfcd011fSBram Moolenaar    var name = 'local'
38287d699701SBram Moolenaar    func TheFunc()
38297d699701SBram Moolenaar      echo 'local'
38307d699701SBram Moolenaar    endfunc
38317d699701SBram Moolenaar    def DefFunc()
38327d699701SBram Moolenaar      echo 'local'
38337d699701SBram Moolenaar    enddef
38347d699701SBram Moolenaar  END
38357d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
38367d699701SBram Moolenaar  source Xvim9script.vim
38377d699701SBram Moolenaar  try
38387d699701SBram Moolenaar    echo g:var
38397d699701SBram Moolenaar    assert_report('did not fail')
38407d699701SBram Moolenaar  catch /E121:/
38417d699701SBram Moolenaar    " caught
38427d699701SBram Moolenaar  endtry
38437d699701SBram Moolenaar  try
38447d699701SBram Moolenaar    call TheFunc()
38457d699701SBram Moolenaar    assert_report('did not fail')
38467d699701SBram Moolenaar  catch /E117:/
38477d699701SBram Moolenaar    " caught
38487d699701SBram Moolenaar  endtry
38497d699701SBram Moolenaar  try
38507d699701SBram Moolenaar    call DefFunc()
38517d699701SBram Moolenaar    assert_report('did not fail')
38527d699701SBram Moolenaar  catch /E117:/
38537d699701SBram Moolenaar    " caught
38547d699701SBram Moolenaar  endtry
38557d699701SBram Moolenaar
385625859dd7SBram Moolenaar  call delete('Xvim9script.vim')
38577d699701SBram Moolenaarendfunc
38587d699701SBram Moolenaar
3859eeb27bfeSBram Moolenaardef Test_vim9_copen()
3860eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3861eeb27bfeSBram Moolenaar  copen
3862eeb27bfeSBram Moolenaar  quit
3863eeb27bfeSBram Moolenaarenddef
3864eeb27bfeSBram Moolenaar
386503290b84SBram Moolenaar" test using an auto-loaded function and variable
38662d6b20d6SBram Moolenaardef Test_vim9_autoload()
3867cfcd011fSBram Moolenaar  var lines =<< trim END
38682d6b20d6SBram Moolenaar     vim9script
386903290b84SBram Moolenaar     def some#gettest(): string
387003290b84SBram Moolenaar       return 'test'
387103290b84SBram Moolenaar     enddef
387203290b84SBram Moolenaar     g:some#name = 'name'
3873227c58a4SBram Moolenaar     g:some#dict = {key: 'value'}
3874e3ffcd99SBram Moolenaar
3875e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3876e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3877e3ffcd99SBram Moolenaar     enddef
387803290b84SBram Moolenaar  END
387903290b84SBram Moolenaar
388003290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
388103290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
388203290b84SBram Moolenaar  var save_rtp = &rtp
388303290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
388403290b84SBram Moolenaar
388503290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
388603290b84SBram Moolenaar  assert_equal('name', g:some#name)
3887227c58a4SBram Moolenaar  assert_equal('value', g:some#dict.key)
388803290b84SBram Moolenaar  g:some#other = 'other'
388903290b84SBram Moolenaar  assert_equal('other', g:some#other)
389003290b84SBram Moolenaar
3891e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3892e3ffcd99SBram Moolenaar
389317f700acSBram Moolenaar  # upper case script name works
389417f700acSBram Moolenaar  lines =<< trim END
389517f700acSBram Moolenaar     vim9script
389617f700acSBram Moolenaar     def Other#getOther(): string
389717f700acSBram Moolenaar       return 'other'
389817f700acSBram Moolenaar     enddef
389917f700acSBram Moolenaar  END
390017f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
390117f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
390217f700acSBram Moolenaar
390303290b84SBram Moolenaar  delete('Xdir', 'rf')
390403290b84SBram Moolenaar  &rtp = save_rtp
390503290b84SBram Moolenaarenddef
390603290b84SBram Moolenaar
390703290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
390803290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
390903290b84SBram Moolenaar  var lines =<< trim END
391003290b84SBram Moolenaar     vim9script
39112d6b20d6SBram Moolenaar     def foo#test()
39122d6b20d6SBram Moolenaar         echomsg getreg('"')
39132d6b20d6SBram Moolenaar     enddef
39142d6b20d6SBram Moolenaar  END
39152d6b20d6SBram Moolenaar
39162d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
39172d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3918cfcd011fSBram Moolenaar  var save_rtp = &rtp
39192d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
39202d6b20d6SBram Moolenaar  augroup test
39212d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
39222d6b20d6SBram Moolenaar  augroup END
39232d6b20d6SBram Moolenaar
39242d6b20d6SBram Moolenaar  normal Y
39252d6b20d6SBram Moolenaar
39262d6b20d6SBram Moolenaar  augroup test
39272d6b20d6SBram Moolenaar    autocmd!
39282d6b20d6SBram Moolenaar  augroup END
39292d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
39302d6b20d6SBram Moolenaar  &rtp = save_rtp
39312d6b20d6SBram Moolenaarenddef
39322d6b20d6SBram Moolenaar
393377e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
393477e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3935cfcd011fSBram Moolenaar  var lines =<< trim END
393677e5dcc3SBram Moolenaar      vim9script
393777e5dcc3SBram Moolenaar      def crash#func()
393877e5dcc3SBram Moolenaar          try
393977e5dcc3SBram Moolenaar              for x in List()
394077e5dcc3SBram Moolenaar              endfor
394177e5dcc3SBram Moolenaar          catch
394277e5dcc3SBram Moolenaar          endtry
394377e5dcc3SBram Moolenaar          g:ok = true
394477e5dcc3SBram Moolenaar      enddef
394577e5dcc3SBram Moolenaar      fu List()
394677e5dcc3SBram Moolenaar          invalid
394777e5dcc3SBram Moolenaar      endfu
394877e5dcc3SBram Moolenaar      try
394948e11c10SBram Moolenaar          alsoinvalid
395077e5dcc3SBram Moolenaar      catch /wontmatch/
395177e5dcc3SBram Moolenaar      endtry
395277e5dcc3SBram Moolenaar  END
395377e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
395477e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
395577e5dcc3SBram Moolenaar
395677e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
395777e5dcc3SBram Moolenaar  lines =<< trim END
395877e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
395977e5dcc3SBram Moolenaar    call crash#func()
396077e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
39619c4f5520SBram Moolenaar    qall!
396277e5dcc3SBram Moolenaar  END
396377e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
396477e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
396577e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
396677e5dcc3SBram Moolenaar
396777e5dcc3SBram Moolenaar  delete('Xdidit')
396877e5dcc3SBram Moolenaar  delete('Xscript')
396977e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
397003290b84SBram Moolenaar
397103290b84SBram Moolenaar  lines =<< trim END
397203290b84SBram Moolenaar    vim9script
397303290b84SBram Moolenaar    var foo#bar = 'asdf'
397403290b84SBram Moolenaar  END
397503290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
397677e5dcc3SBram Moolenaarenddef
397777e5dcc3SBram Moolenaar
397881e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
397981e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
398081e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3981cfcd011fSBram Moolenaar  var lines =<< trim END
398281e17fbeSBram Moolenaar    let s:counter = 1
398381e17fbeSBram Moolenaar    def s:Func()
398481e17fbeSBram Moolenaar      au! CursorHold
398581e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
398681e17fbeSBram Moolenaar    enddef
398781e17fbeSBram Moolenaar    call s:Func()
398881e17fbeSBram Moolenaar    doau CursorHold
398981e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
399081e17fbeSBram Moolenaar    au! CursorHold
399181e17fbeSBram Moolenaar  END
399281e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
399381e17fbeSBram Moolenaarenddef
399481e17fbeSBram Moolenaar
3995b5841b99SBram Moolenaardef Test_error_in_autoload_script()
3996b5841b99SBram Moolenaar  var save_rtp = &rtp
3997b5841b99SBram Moolenaar  var dir = getcwd() .. '/Xruntime'
3998b5841b99SBram Moolenaar  &rtp = dir
3999b5841b99SBram Moolenaar  mkdir(dir .. '/autoload', 'p')
4000b5841b99SBram Moolenaar
4001b5841b99SBram Moolenaar  var lines =<< trim END
4002b5841b99SBram Moolenaar      vim9script noclear
4003b5841b99SBram Moolenaar      def script#autoloaded()
4004b5841b99SBram Moolenaar      enddef
4005b5841b99SBram Moolenaar      def Broken()
4006b5841b99SBram Moolenaar        var x: any = ''
4007b5841b99SBram Moolenaar        eval x != 0
4008b5841b99SBram Moolenaar      enddef
4009b5841b99SBram Moolenaar      Broken()
4010b5841b99SBram Moolenaar  END
4011b5841b99SBram Moolenaar  writefile(lines, dir .. '/autoload/script.vim')
4012b5841b99SBram Moolenaar
4013b5841b99SBram Moolenaar  lines =<< trim END
4014b5841b99SBram Moolenaar      vim9script
4015b5841b99SBram Moolenaar      def CallAutoloaded()
4016b5841b99SBram Moolenaar        script#autoloaded()
4017b5841b99SBram Moolenaar      enddef
4018b5841b99SBram Moolenaar
4019b5841b99SBram Moolenaar      function Legacy()
4020b5841b99SBram Moolenaar        try
4021b5841b99SBram Moolenaar          call s:CallAutoloaded()
4022b5841b99SBram Moolenaar        catch
4023b5841b99SBram Moolenaar          call assert_match('E1030: Using a String as a Number', v:exception)
4024b5841b99SBram Moolenaar        endtry
4025b5841b99SBram Moolenaar      endfunction
4026b5841b99SBram Moolenaar
4027b5841b99SBram Moolenaar      Legacy()
4028b5841b99SBram Moolenaar  END
4029b5841b99SBram Moolenaar  CheckScriptSuccess(lines)
4030b5841b99SBram Moolenaar
4031b5841b99SBram Moolenaar  &rtp = save_rtp
4032b5841b99SBram Moolenaar  delete(dir, 'rf')
4033b5841b99SBram Moolenaarenddef
4034b5841b99SBram Moolenaar
40353896a105SBram Moolenaardef Test_cmdline_win()
40363896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
40373896a105SBram Moolenaar  # the command line window.
40383896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
4039cfcd011fSBram Moolenaar  var export_lines =<< trim END
40403896a105SBram Moolenaar    vim9script
4041cfcd011fSBram Moolenaar    export var That = 'yes'
40423896a105SBram Moolenaar  END
40433896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
4044cfcd011fSBram Moolenaar  var import_lines =<< trim END
40453896a105SBram Moolenaar    vim9script
40463896a105SBram Moolenaar    import That from './Xexport.vim'
40473896a105SBram Moolenaar  END
40483896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
4049cfcd011fSBram Moolenaar  var save_rtp = &rtp
40503896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
40513896a105SBram Moolenaar  syntax on
40523896a105SBram Moolenaar  augroup CmdWin
40533896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
40543896a105SBram Moolenaar  augroup END
40553896a105SBram Moolenaar  # this will open and also close the cmdline window
40563896a105SBram Moolenaar  feedkeys('q:', 'xt')
40573896a105SBram Moolenaar  assert_equal('yes', g:got_there)
40583896a105SBram Moolenaar
40593896a105SBram Moolenaar  augroup CmdWin
40603896a105SBram Moolenaar    au!
40613896a105SBram Moolenaar  augroup END
40623896a105SBram Moolenaar  &rtp = save_rtp
40633896a105SBram Moolenaar  delete('rtp', 'rf')
40643896a105SBram Moolenaarenddef
40653896a105SBram Moolenaar
4066e3d4685fSBram Moolenaardef Test_invalid_sid()
4067e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
406825859dd7SBram Moolenaar
40699c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
4070d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
4071e3d4685fSBram Moolenaar  endif
4072e3d4685fSBram Moolenaar  delete('Xdidit')
4073e3d4685fSBram Moolenaarenddef
4074e3d4685fSBram Moolenaar
40759ec7026fSBram Moolenaardef Test_restoring_cpo()
40769ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
40779ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
40789ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
40799ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
40809ec7026fSBram Moolenaar  endif
40819ec7026fSBram Moolenaar  delete('Xsourced')
40829ec7026fSBram Moolenaar  delete('Xclose')
4083090728adSBram Moolenaar  delete('Xdone')
40840123cc1eSBram Moolenaar
40850123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
40860123cc1eSBram Moolenaar  set cpo=aABceFsMny>
40870123cc1eSBram Moolenaar  edit XanotherScript
40880123cc1eSBram Moolenaar  so %
40890123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
40900123cc1eSBram Moolenaar  :1del
40910123cc1eSBram Moolenaar  w
40920123cc1eSBram Moolenaar  so %
40930123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
40940123cc1eSBram Moolenaar
40950123cc1eSBram Moolenaar  delete('XanotherScript')
40960123cc1eSBram Moolenaar  set cpo&vim
40979ec7026fSBram Moolenaarenddef
40989ec7026fSBram Moolenaar
4099ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
4100ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
410137294bd6SBram Moolenaar  CheckScreendump
4102ffb7dcdbSBram Moolenaar  CheckFeature timers
410337294bd6SBram Moolenaar
4104ffb7dcdbSBram Moolenaar  let lines =<< trim END
410537294bd6SBram Moolenaar    vim9script
410637294bd6SBram Moolenaar    def script#func()
410737294bd6SBram Moolenaar    enddef
410837294bd6SBram Moolenaar  END
4109ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
4110ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
411137294bd6SBram Moolenaar
4112ffb7dcdbSBram Moolenaar  let lines =<< trim END
411337294bd6SBram Moolenaar      vim9script
411437294bd6SBram Moolenaar      set cpo+=M
411537294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
4116767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
411737294bd6SBram Moolenaar      setline(1, 'some text')
411837294bd6SBram Moolenaar  END
4119ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
4120ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
4121ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
4122ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
412337294bd6SBram Moolenaar
4124ffb7dcdbSBram Moolenaar  " clean up
4125ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
4126ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
4127ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
4128ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
4129ffb7dcdbSBram Moolenaarendfunc
413037294bd6SBram Moolenaar
41319ec7026fSBram Moolenaar
4132f0afd9e1SBram Moolenaardef Test_unset_any_variable()
4133cfcd011fSBram Moolenaar  var lines =<< trim END
4134cfcd011fSBram Moolenaar    var name: any
4135cfcd011fSBram Moolenaar    assert_equal(0, name)
4136f0afd9e1SBram Moolenaar  END
4137f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
4138f0afd9e1SBram Moolenaarenddef
4139f0afd9e1SBram Moolenaar
41407e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
414158dbef33SBram Moolenaar  CheckRunVimInTerminal
414258dbef33SBram Moolenaar
41437e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
41447e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
41457e9210eaSBram Moolenaarendfunc
41467e9210eaSBram Moolenaar
41477e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
41489c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
4149cfcd011fSBram Moolenaar  var lines =<< trim END
41509c4f5520SBram Moolenaar    func CheckAndQuit()
41519c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
41529c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
41539c4f5520SBram Moolenaar    endfunc
41549c4f5520SBram Moolenaar  END
41559c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
41569c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
4157e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
41589c4f5520SBram Moolenaar  # define Afunc() on the command line
41599c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
41609c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
41612949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
41629c4f5520SBram Moolenaar
41639c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
41649c4f5520SBram Moolenaar  delete('XcallFunc')
41659c4f5520SBram Moolenaar  delete('Xdidcmd')
41669c4f5520SBram Moolenaarenddef
41679c4f5520SBram Moolenaar
4168fcdc5d83SBram Moolenaardef Test_script_var_scope()
4169fcdc5d83SBram Moolenaar  var lines =<< trim END
4170fcdc5d83SBram Moolenaar      vim9script
4171fcdc5d83SBram Moolenaar      if true
4172fcdc5d83SBram Moolenaar        if true
4173fcdc5d83SBram Moolenaar          var one = 'one'
4174fcdc5d83SBram Moolenaar          echo one
4175fcdc5d83SBram Moolenaar        endif
4176fcdc5d83SBram Moolenaar        echo one
4177fcdc5d83SBram Moolenaar      endif
4178fcdc5d83SBram Moolenaar  END
4179fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
4180fcdc5d83SBram Moolenaar
4181fcdc5d83SBram Moolenaar  lines =<< trim END
4182fcdc5d83SBram Moolenaar      vim9script
4183fcdc5d83SBram Moolenaar      if true
4184fcdc5d83SBram Moolenaar        if false
4185fcdc5d83SBram Moolenaar          var one = 'one'
4186fcdc5d83SBram Moolenaar          echo one
4187fcdc5d83SBram Moolenaar        else
4188fcdc5d83SBram Moolenaar          var one = 'one'
4189fcdc5d83SBram Moolenaar          echo one
4190fcdc5d83SBram Moolenaar        endif
4191fcdc5d83SBram Moolenaar        echo one
4192fcdc5d83SBram Moolenaar      endif
4193fcdc5d83SBram Moolenaar  END
4194fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
4195fcdc5d83SBram Moolenaar
4196fcdc5d83SBram Moolenaar  lines =<< trim END
4197fcdc5d83SBram Moolenaar      vim9script
4198fcdc5d83SBram Moolenaar      while true
4199fcdc5d83SBram Moolenaar        var one = 'one'
4200fcdc5d83SBram Moolenaar        echo one
4201fcdc5d83SBram Moolenaar        break
4202fcdc5d83SBram Moolenaar      endwhile
4203fcdc5d83SBram Moolenaar      echo one
4204fcdc5d83SBram Moolenaar  END
4205fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
4206fcdc5d83SBram Moolenaar
4207fcdc5d83SBram Moolenaar  lines =<< trim END
4208fcdc5d83SBram Moolenaar      vim9script
4209fcdc5d83SBram Moolenaar      for i in range(1)
4210fcdc5d83SBram Moolenaar        var one = 'one'
4211fcdc5d83SBram Moolenaar        echo one
4212fcdc5d83SBram Moolenaar      endfor
4213fcdc5d83SBram Moolenaar      echo one
4214fcdc5d83SBram Moolenaar  END
4215fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
42169becdf2bSBram Moolenaar
42179becdf2bSBram Moolenaar  lines =<< trim END
42189becdf2bSBram Moolenaar      vim9script
42199becdf2bSBram Moolenaar      {
42209becdf2bSBram Moolenaar        var one = 'one'
42219becdf2bSBram Moolenaar        assert_equal('one', one)
42229becdf2bSBram Moolenaar      }
42239becdf2bSBram Moolenaar      assert_false(exists('one'))
42249becdf2bSBram Moolenaar      assert_false(exists('s:one'))
42259becdf2bSBram Moolenaar  END
42269becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
42279becdf2bSBram Moolenaar
42289becdf2bSBram Moolenaar  lines =<< trim END
42299becdf2bSBram Moolenaar      vim9script
42309becdf2bSBram Moolenaar      {
42319becdf2bSBram Moolenaar        var one = 'one'
42329becdf2bSBram Moolenaar        echo one
42339becdf2bSBram Moolenaar      }
42349becdf2bSBram Moolenaar      echo one
42359becdf2bSBram Moolenaar  END
42369becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
4237fcdc5d83SBram Moolenaarenddef
4238fcdc5d83SBram Moolenaar
4239352134bbSBram Moolenaardef Test_catch_exception_in_callback()
4240352134bbSBram Moolenaar  var lines =<< trim END
4241352134bbSBram Moolenaar    vim9script
42422a38908bSBram Moolenaar    def Callback(...l: list<any>)
4243352134bbSBram Moolenaar      try
4244352134bbSBram Moolenaar        var x: string
4245352134bbSBram Moolenaar        var y: string
4246352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
4247352134bbSBram Moolenaar        [x, y] = ['']
4248352134bbSBram Moolenaar      catch
4249352134bbSBram Moolenaar        g:caught = 'yes'
4250352134bbSBram Moolenaar      endtry
4251352134bbSBram Moolenaar    enddef
4252e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
4253352134bbSBram Moolenaar    feedkeys("\r", 'xt')
4254352134bbSBram Moolenaar  END
4255352134bbSBram Moolenaar  CheckScriptSuccess(lines)
4256352134bbSBram Moolenaar
4257352134bbSBram Moolenaar  unlet g:caught
4258352134bbSBram Moolenaarenddef
4259352134bbSBram Moolenaar
4260631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
4261631e8f93SBram Moolenaar  if !has('unix') || !has('job')
4262631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
4263631e8f93SBram Moolenaar  endif
4264631e8f93SBram Moolenaar  var lines =<< trim END
4265631e8f93SBram Moolenaar      vim9script
4266631e8f93SBram Moolenaar      var source: list<number>
42672a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
4268631e8f93SBram Moolenaar          eval [][0]
4269631e8f93SBram Moolenaar      enddef
42702a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
4271631e8f93SBram Moolenaar          sleep 1m
4272631e8f93SBram Moolenaar          source += l
4273631e8f93SBram Moolenaar      enddef
4274e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
42756f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
42766f17a3f0SBram Moolenaar        sleep 10m
42776f17a3f0SBram Moolenaar      endwhile
4278206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
4279fe95b94fSBram Moolenaar      sleep 200m
4280631e8f93SBram Moolenaar  END
4281631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
4282631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
4283631e8f93SBram Moolenaar  delete('Xdef')
4284631e8f93SBram Moolenaarenddef
4285631e8f93SBram Moolenaar
42864324d87aSBram Moolenaardef InvokeNormal()
42874324d87aSBram Moolenaar  exe "norm! :m+1\r"
42884324d87aSBram Moolenaarenddef
42894324d87aSBram Moolenaar
42904324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
42914324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
42924324d87aSBram Moolenaar  new
42934324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
42944324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
42954324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
42964324d87aSBram Moolenaar  xunmap <F3>
4297b5b9480eSBram Moolenaarenddef
4298b5b9480eSBram Moolenaar
4299b5b9480eSBram Moolenaardef Test_white_space_after_command()
4300b5b9480eSBram Moolenaar  var lines =<< trim END
4301b5b9480eSBram Moolenaar    exit_cb: Func})
4302b5b9480eSBram Moolenaar  END
4303b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
4304f8103f27SBram Moolenaar
4305f8103f27SBram Moolenaar  lines =<< trim END
4306f8103f27SBram Moolenaar    e#
4307f8103f27SBram Moolenaar  END
4308f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
43094324d87aSBram Moolenaarenddef
43104324d87aSBram Moolenaar
43114aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
43124aab88d9SBram Moolenaar  var lines =<< trim END
43134aab88d9SBram Moolenaar      vim9script
43144aab88d9SBram Moolenaar      if exists('g:guard')
43154aab88d9SBram Moolenaar        finish
43164aab88d9SBram Moolenaar      endif
43174aab88d9SBram Moolenaar      g:guard = 1
43184aab88d9SBram Moolenaar      var name = 'thename'
43194aab88d9SBram Moolenaar      def g:GetName(): string
43204aab88d9SBram Moolenaar        return name
43214aab88d9SBram Moolenaar      enddef
43224aab88d9SBram Moolenaar      def g:SetName(arg: string)
43234aab88d9SBram Moolenaar        name = arg
43244aab88d9SBram Moolenaar      enddef
43254aab88d9SBram Moolenaar  END
43264aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
43274aab88d9SBram Moolenaar  so XscriptTwice.vim
43284aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
43294aab88d9SBram Moolenaar  g:SetName('newname')
43304aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
43314aab88d9SBram Moolenaar  so XscriptTwice.vim
43324aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
43334aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
43344aab88d9SBram Moolenaar
43354aab88d9SBram Moolenaar  delfunc g:GetName
43364aab88d9SBram Moolenaar  delfunc g:SetName
43374aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
43384aab88d9SBram Moolenaar  unlet g:guard
43394aab88d9SBram Moolenaarenddef
43404aab88d9SBram Moolenaar
43414aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
43424aab88d9SBram Moolenaar  var exportlines =<< trim END
43434aab88d9SBram Moolenaar      vim9script
43444aab88d9SBram Moolenaar      if exists('g:guard')
43454aab88d9SBram Moolenaar        finish
43464aab88d9SBram Moolenaar      endif
43474aab88d9SBram Moolenaar      g:guard = 1
43484aab88d9SBram Moolenaar      export var name = 'someName'
43494aab88d9SBram Moolenaar  END
43504aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
43514aab88d9SBram Moolenaar
43524aab88d9SBram Moolenaar  var lines =<< trim END
43534aab88d9SBram Moolenaar      vim9script
43544aab88d9SBram Moolenaar      import name from './XexportScript.vim'
43554aab88d9SBram Moolenaar      def g:GetName(): string
43564aab88d9SBram Moolenaar        return name
43574aab88d9SBram Moolenaar      enddef
43584aab88d9SBram Moolenaar  END
43594aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
43604aab88d9SBram Moolenaar  so XscriptImport.vim
43614aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
43624aab88d9SBram Moolenaar
43634aab88d9SBram Moolenaar  so XexportScript.vim
43644aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
43654aab88d9SBram Moolenaar
43664aab88d9SBram Moolenaar  delfunc g:GetName
43674aab88d9SBram Moolenaar  delete('XexportScript.vim')
43684aab88d9SBram Moolenaar  delete('XscriptImport.vim')
43694aab88d9SBram Moolenaar  unlet g:guard
43704aab88d9SBram Moolenaarenddef
43714aab88d9SBram Moolenaar
437210b9421fSBram Moolenaardef Test_unsupported_commands()
437310b9421fSBram Moolenaar  var lines =<< trim END
437410b9421fSBram Moolenaar      ka
437510b9421fSBram Moolenaar  END
43767d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
43777d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
437810b9421fSBram Moolenaar
437910b9421fSBram Moolenaar  lines =<< trim END
4380ada1d870SBram Moolenaar      :1ka
4381ada1d870SBram Moolenaar  END
43827d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
43837d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
4384ada1d870SBram Moolenaar
4385ada1d870SBram Moolenaar  lines =<< trim END
438610b9421fSBram Moolenaar    t
438710b9421fSBram Moolenaar  END
438810b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
438910b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
439010b9421fSBram Moolenaar
439110b9421fSBram Moolenaar  lines =<< trim END
439210b9421fSBram Moolenaar    x
439310b9421fSBram Moolenaar  END
439410b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
439510b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
439610b9421fSBram Moolenaar
439710b9421fSBram Moolenaar  lines =<< trim END
439810b9421fSBram Moolenaar    xit
439910b9421fSBram Moolenaar  END
440010b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
440110b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
440210b9421fSBram Moolenaarenddef
440310b9421fSBram Moolenaar
4404c70fe460SBram Moolenaardef Test_mapping_line_number()
4405c70fe460SBram Moolenaar  var lines =<< trim END
4406c70fe460SBram Moolenaar      vim9script
4407c70fe460SBram Moolenaar      def g:FuncA()
4408c70fe460SBram Moolenaar          # Some comment
4409c70fe460SBram Moolenaar          FuncB(0)
4410c70fe460SBram Moolenaar      enddef
4411c70fe460SBram Moolenaar          # Some comment
4412c70fe460SBram Moolenaar      def FuncB(
4413c70fe460SBram Moolenaar          # Some comment
4414c70fe460SBram Moolenaar          n: number
4415c70fe460SBram Moolenaar      )
4416c70fe460SBram Moolenaar          exe 'nno '
4417c70fe460SBram Moolenaar              # Some comment
4418c70fe460SBram Moolenaar              .. '<F3> a'
4419c70fe460SBram Moolenaar              .. 'b'
4420c70fe460SBram Moolenaar              .. 'c'
4421c70fe460SBram Moolenaar      enddef
4422c70fe460SBram Moolenaar  END
4423c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
4424c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
4425c70fe460SBram Moolenaar  assert_match('No mapping found', res)
4426c70fe460SBram Moolenaar
4427c70fe460SBram Moolenaar  g:FuncA()
4428c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
4429c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4430c70fe460SBram Moolenaar
4431c70fe460SBram Moolenaar  nunmap <F3>
4432c70fe460SBram Moolenaar  delfunc g:FuncA
4433c70fe460SBram Moolenaarenddef
4434c70fe460SBram Moolenaar
4435deb108baSBram Moolenaardef Test_option_set()
4436deb108baSBram Moolenaar  # legacy script allows for white space
4437deb108baSBram Moolenaar  var lines =<< trim END
4438deb108baSBram Moolenaar      set foldlevel  =11
4439deb108baSBram Moolenaar      call assert_equal(11, &foldlevel)
4440deb108baSBram Moolenaar  END
4441deb108baSBram Moolenaar  CheckScriptSuccess(lines)
4442deb108baSBram Moolenaar
4443deb108baSBram Moolenaar  set foldlevel
4444deb108baSBram Moolenaar  set foldlevel=12
4445deb108baSBram Moolenaar  assert_equal(12, &foldlevel)
4446deb108baSBram Moolenaar  set foldlevel+=2
4447deb108baSBram Moolenaar  assert_equal(14, &foldlevel)
4448deb108baSBram Moolenaar  set foldlevel-=3
4449deb108baSBram Moolenaar  assert_equal(11, &foldlevel)
4450deb108baSBram Moolenaar
4451deb108baSBram Moolenaar  lines =<< trim END
4452deb108baSBram Moolenaar      set foldlevel =1
4453deb108baSBram Moolenaar  END
4454deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
4455deb108baSBram Moolenaar
4456deb108baSBram Moolenaar  lines =<< trim END
4457deb108baSBram Moolenaar      set foldlevel +=1
4458deb108baSBram Moolenaar  END
4459deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
4460deb108baSBram Moolenaar
4461deb108baSBram Moolenaar  lines =<< trim END
4462deb108baSBram Moolenaar      set foldlevel ^=1
4463deb108baSBram Moolenaar  END
4464deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
4465deb108baSBram Moolenaar
4466deb108baSBram Moolenaar  lines =<< trim END
4467deb108baSBram Moolenaar      set foldlevel -=1
4468deb108baSBram Moolenaar  END
4469deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
4470deb108baSBram Moolenaar
4471deb108baSBram Moolenaar  set foldlevel&
4472deb108baSBram Moolenaarenddef
4473deb108baSBram Moolenaar
4474208f0b48SBram Moolenaardef Test_option_modifier()
44751594f313SBram Moolenaar  # legacy script allows for white space
4476208f0b48SBram Moolenaar  var lines =<< trim END
4477208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
4478208f0b48SBram Moolenaar      call assert_equal(1, &hlsearch)
4479208f0b48SBram Moolenaar  END
4480208f0b48SBram Moolenaar  CheckScriptSuccess(lines)
4481208f0b48SBram Moolenaar
44821594f313SBram Moolenaar  set hlsearch
44831594f313SBram Moolenaar  set hlsearch!
44841594f313SBram Moolenaar  assert_equal(false, &hlsearch)
44851594f313SBram Moolenaar
44861594f313SBram Moolenaar  set hlsearch
4487208f0b48SBram Moolenaar  set hlsearch&
44881594f313SBram Moolenaar  assert_equal(false, &hlsearch)
4489208f0b48SBram Moolenaar
4490208f0b48SBram Moolenaar  lines =<< trim END
44911594f313SBram Moolenaar      set hlsearch &
4492208f0b48SBram Moolenaar  END
44931594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
44941594f313SBram Moolenaar
44951594f313SBram Moolenaar  lines =<< trim END
44961594f313SBram Moolenaar      set hlsearch   !
44971594f313SBram Moolenaar  END
44981594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
44991594f313SBram Moolenaar
45001594f313SBram Moolenaar  set hlsearch&
4501208f0b48SBram Moolenaarenddef
4502208f0b48SBram Moolenaar
4503c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail
4504c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number()
4505c03fe66aSBram Moolenaar  var lines =<< trim END
4506c03fe66aSBram Moolenaar      echoerr 'some'
4507c03fe66aSBram Moolenaar         .. ' error'
4508c03fe66aSBram Moolenaar         .. ' continued'
4509c03fe66aSBram Moolenaar  END
4510c03fe66aSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
4511c03fe66aSBram Moolenaarenddef
4512c03fe66aSBram Moolenaar
4513648594eaSBram Moolenaardef ProfiledWithLambda()
4514d9162550SBram Moolenaar  var n = 3
4515d9162550SBram Moolenaar  echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4516d9162550SBram Moolenaarenddef
4517d9162550SBram Moolenaar
4518648594eaSBram Moolenaardef ProfiledNested()
4519648594eaSBram Moolenaar  var x = 0
4520648594eaSBram Moolenaar  def Nested(): any
4521648594eaSBram Moolenaar      return x
4522648594eaSBram Moolenaar  enddef
4523648594eaSBram Moolenaar  Nested()
4524648594eaSBram Moolenaarenddef
4525648594eaSBram Moolenaar
4526ffcfddc7SBram Moolenaardef ProfiledNestedProfiled()
4527ffcfddc7SBram Moolenaar  var x = 0
4528ffcfddc7SBram Moolenaar  def Nested(): any
4529ffcfddc7SBram Moolenaar      return x
4530ffcfddc7SBram Moolenaar  enddef
4531ffcfddc7SBram Moolenaar  Nested()
4532ffcfddc7SBram Moolenaarenddef
4533ffcfddc7SBram Moolenaar
4534d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists.
4535d9162550SBram Moolenaar" This only tests that it works, not the profiling output.
4536d9162550SBram Moolenaardef Test_xx_profile_with_lambda()
45374ece152aSBram Moolenaar  CheckFeature profile
45384ece152aSBram Moolenaar
4539d9162550SBram Moolenaar  profile start Xprofile.log
4540648594eaSBram Moolenaar  profile func ProfiledWithLambda
4541648594eaSBram Moolenaar  ProfiledWithLambda()
4542ffcfddc7SBram Moolenaar
4543648594eaSBram Moolenaar  profile func ProfiledNested
4544648594eaSBram Moolenaar  ProfiledNested()
4545ffcfddc7SBram Moolenaar
4546ffcfddc7SBram Moolenaar  # Also profile the nested function.  Use a different function, although the
4547ffcfddc7SBram Moolenaar  # contents is the same, to make sure it was not already compiled.
4548ffcfddc7SBram Moolenaar  profile func *
4549ffcfddc7SBram Moolenaar  ProfiledNestedProfiled()
4550ffcfddc7SBram Moolenaar
4551ffcfddc7SBram Moolenaar  profdel func *
4552ffcfddc7SBram Moolenaar  profile pause
4553d9162550SBram Moolenaarenddef
4554d9162550SBram Moolenaar
4555585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
4556585fea7bSBram Moolenaardef Test_substitute_cmd()
4557585fea7bSBram Moolenaar  new
4558585fea7bSBram Moolenaar  setline(1, 'something')
4559585fea7bSBram Moolenaar  :substitute(some(other(
4560585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
4561585fea7bSBram Moolenaar  bwipe!
4562585fea7bSBram Moolenaar
4563f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
4564cfcd011fSBram Moolenaar  var lines =<< trim END
4565585fea7bSBram Moolenaar    vim9script
4566585fea7bSBram Moolenaar    new
4567585fea7bSBram Moolenaar    setline(1, 'something')
4568585fea7bSBram Moolenaar    :substitute(some(other(
4569585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
4570585fea7bSBram Moolenaar    bwipe!
4571585fea7bSBram Moolenaar  END
4572585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
4573585fea7bSBram Moolenaar  source Xvim9lines
4574585fea7bSBram Moolenaar
4575585fea7bSBram Moolenaar  delete('Xvim9lines')
4576585fea7bSBram Moolenaarenddef
4577585fea7bSBram Moolenaar
45788a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
4579