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
14805fe07d2eSBram Moolenaardef Test_import_funcref()
14815fe07d2eSBram Moolenaar  var lines =<< trim END
14825fe07d2eSBram Moolenaar      vim9script
14835fe07d2eSBram Moolenaar      export def F(): number
14845fe07d2eSBram Moolenaar        return 42
14855fe07d2eSBram Moolenaar      enddef
14865fe07d2eSBram Moolenaar      export const G = F
14875fe07d2eSBram Moolenaar  END
14885fe07d2eSBram Moolenaar  writefile(lines, 'Xlib.vim')
14895fe07d2eSBram Moolenaar
14905fe07d2eSBram Moolenaar  lines =<< trim END
14915fe07d2eSBram Moolenaar      vim9script
14925fe07d2eSBram Moolenaar      import {G} from './Xlib.vim'
14935fe07d2eSBram Moolenaar      const Foo = G()
14945fe07d2eSBram Moolenaar      assert_equal(42, Foo)
14955fe07d2eSBram Moolenaar
14965fe07d2eSBram Moolenaar      def DoTest()
14975fe07d2eSBram Moolenaar        const Goo = G()
1498*06ca48a4SBram Moolenaar        assert_equal(42, Goo)
14995fe07d2eSBram Moolenaar      enddef
15005fe07d2eSBram Moolenaar      DoTest()
15015fe07d2eSBram Moolenaar  END
15025fe07d2eSBram Moolenaar  CheckScriptSuccess(lines)
15035fe07d2eSBram Moolenaar
15045fe07d2eSBram Moolenaar  delete('Xlib.vim')
15055fe07d2eSBram Moolenaarenddef
15065fe07d2eSBram Moolenaar
15076853c38bSBram Moolenaardef Test_import_star_fails()
15086853c38bSBram Moolenaar  writefile([], 'Xfoo.vim')
15096853c38bSBram Moolenaar  var lines =<< trim END
1510af2d5d2cSBram Moolenaar      import * as foo from './Xfoo.vim'
15116853c38bSBram Moolenaar      foo = 'bar'
15126853c38bSBram Moolenaar  END
15136853c38bSBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1094:', 'E1236: Cannot use foo itself')
15146853c38bSBram Moolenaar  lines =<< trim END
15156853c38bSBram Moolenaar      vim9script
1516af2d5d2cSBram Moolenaar      import * as foo from './Xfoo.vim'
15176853c38bSBram Moolenaar      var that = foo
15186853c38bSBram Moolenaar  END
15196853c38bSBram Moolenaar  CheckScriptFailure(lines, 'E1029: Expected ''.''')
1520a9e3d560SBram Moolenaar
1521a9e3d560SBram Moolenaar  lines =<< trim END
1522a9e3d560SBram Moolenaar      vim9script
1523a9e3d560SBram Moolenaar      import * as 9foo from './Xfoo.vim'
1524a9e3d560SBram Moolenaar  END
1525a9e3d560SBram Moolenaar  CheckScriptFailure(lines, 'E1047:')
1526a9e3d560SBram Moolenaar  lines =<< trim END
1527a9e3d560SBram Moolenaar      vim9script
1528a9e3d560SBram Moolenaar      import * as the#foo from './Xfoo.vim'
1529a9e3d560SBram Moolenaar  END
1530a9e3d560SBram Moolenaar  CheckScriptFailure(lines, 'E1047:')
1531a9e3d560SBram Moolenaar  lines =<< trim END
1532a9e3d560SBram Moolenaar      vim9script
1533a9e3d560SBram Moolenaar      import * as g:foo from './Xfoo.vim'
1534a9e3d560SBram Moolenaar  END
1535a9e3d560SBram Moolenaar  CheckScriptFailure(lines, 'E1047:')
1536a9e3d560SBram Moolenaar
1537af2d5d2cSBram Moolenaar  delete('Xfoo.vim')
15386853c38bSBram Moolenaarenddef
15396853c38bSBram Moolenaar
15400a84284eSBram Moolenaardef Test_import_as()
15410a84284eSBram Moolenaar  var export_lines =<< trim END
15420a84284eSBram Moolenaar    vim9script
15430a84284eSBram Moolenaar    export var one = 1
15440a84284eSBram Moolenaar    export var yes = 'yes'
1545c967d57aSBram Moolenaar    export var slist: list<string>
15460a84284eSBram Moolenaar  END
15470a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
15480a84284eSBram Moolenaar
15490a84284eSBram Moolenaar  var import_lines =<< trim END
15500a84284eSBram Moolenaar    vim9script
15516c7cc347SBram Moolenaar    var one = 'notused'
15526c7cc347SBram Moolenaar    var yes = 777
15530a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
15540a84284eSBram Moolenaar    assert_equal(1, thatOne)
15550a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
15560a84284eSBram Moolenaar    assert_equal('yes', yesYes)
15570a84284eSBram Moolenaar  END
15580a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
15590a84284eSBram Moolenaar
15600a84284eSBram Moolenaar  import_lines =<< trim END
15610a84284eSBram Moolenaar    vim9script
15620a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
15630a84284eSBram Moolenaar    assert_equal(1, thatOne)
15640a84284eSBram Moolenaar    assert_equal('yes', yesYes)
15650a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
15660a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
15670a84284eSBram Moolenaar  END
15680a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
15690a84284eSBram Moolenaar
1570c967d57aSBram Moolenaar  import_lines =<< trim END
1571c967d57aSBram Moolenaar    vim9script
1572c967d57aSBram Moolenaar    import {slist as impSlist} from './XexportAs'
1573c967d57aSBram Moolenaar    impSlist->add(123)
1574c967d57aSBram Moolenaar  END
1575c967d57aSBram Moolenaar  CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number')
1576c967d57aSBram Moolenaar
15770a84284eSBram Moolenaar  delete('XexportAs')
15780a84284eSBram Moolenaarenddef
15790a84284eSBram Moolenaar
1580803af686SBram Moolenaarfunc g:Trigger()
1581803af686SBram Moolenaar  source Ximport.vim
1582803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1583803af686SBram Moolenaarendfunc
1584803af686SBram Moolenaar
1585803af686SBram Moolenaardef Test_import_export_expr_map()
1586803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1587cfcd011fSBram Moolenaar  var export_lines =<< trim END
1588803af686SBram Moolenaar    vim9script
1589803af686SBram Moolenaar    export def That(): string
1590803af686SBram Moolenaar      return 'yes'
1591803af686SBram Moolenaar    enddef
1592803af686SBram Moolenaar  END
1593803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1594803af686SBram Moolenaar
1595cfcd011fSBram Moolenaar  var import_lines =<< trim END
1596803af686SBram Moolenaar    vim9script
1597803af686SBram Moolenaar    import That from './Xexport_that.vim'
1598803af686SBram Moolenaar    assert_equal('yes', That())
1599803af686SBram Moolenaar  END
1600803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1601803af686SBram Moolenaar
1602803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1603803af686SBram Moolenaar  feedkeys('trigger', "xt")
1604803af686SBram Moolenaar
1605730b2483SBram Moolenaar  delete('Xexport_that.vim')
1606803af686SBram Moolenaar  delete('Ximport.vim')
1607803af686SBram Moolenaar  nunmap trigger
1608803af686SBram Moolenaarenddef
1609803af686SBram Moolenaar
16108e1986e3SBram Moolenaardef Test_import_in_filetype()
16118e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
16128e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1613cfcd011fSBram Moolenaar  var export_lines =<< trim END
16148e1986e3SBram Moolenaar    vim9script
1615cfcd011fSBram Moolenaar    export var That = 'yes'
16168e1986e3SBram Moolenaar  END
1617730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
16188e1986e3SBram Moolenaar
1619cfcd011fSBram Moolenaar  var import_lines =<< trim END
16208e1986e3SBram Moolenaar    vim9script
1621730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
16228e1986e3SBram Moolenaar    assert_equal('yes', That)
16238e1986e3SBram Moolenaar    g:did_load_mytpe = 1
16248e1986e3SBram Moolenaar  END
16258e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
16268e1986e3SBram Moolenaar
1627cfcd011fSBram Moolenaar  var save_rtp = &rtp
16288e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
16298e1986e3SBram Moolenaar
16308e1986e3SBram Moolenaar  filetype plugin on
16318e1986e3SBram Moolenaar  copen
16328e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
16338e1986e3SBram Moolenaar
16348e1986e3SBram Moolenaar  quit!
1635730b2483SBram Moolenaar  delete('Xexport_ft.vim')
16368e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
16378e1986e3SBram Moolenaar  &rtp = save_rtp
16388e1986e3SBram Moolenaarenddef
16398e1986e3SBram Moolenaar
1640efa94447SBram Moolenaardef Test_use_import_in_mapping()
1641cfcd011fSBram Moolenaar  var lines =<< trim END
1642efa94447SBram Moolenaar      vim9script
1643efa94447SBram Moolenaar      export def Funcx()
1644efa94447SBram Moolenaar        g:result = 42
1645efa94447SBram Moolenaar      enddef
1646efa94447SBram Moolenaar  END
1647efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1648efa94447SBram Moolenaar  lines =<< trim END
1649efa94447SBram Moolenaar      vim9script
1650efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1651b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1652efa94447SBram Moolenaar  END
1653efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1654efa94447SBram Moolenaar
1655efa94447SBram Moolenaar  source Xmapscript.vim
1656b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1657efa94447SBram Moolenaar  assert_equal(42, g:result)
1658efa94447SBram Moolenaar
1659efa94447SBram Moolenaar  unlet g:result
1660efa94447SBram Moolenaar  delete('XsomeExport.vim')
1661efa94447SBram Moolenaar  delete('Xmapscript.vim')
1662b3ca9824SBram Moolenaar  nunmap <F3>
1663efa94447SBram Moolenaarenddef
1664efa94447SBram Moolenaar
1665d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1666d3f8a9eeSBram Moolenaar  var lines =<< trim END
1667d3f8a9eeSBram Moolenaar    if has(g:feature)
1668d3f8a9eeSBram Moolenaar      " legacy script
1669d3f8a9eeSBram Moolenaar      let g:legacy = 1
1670d3f8a9eeSBram Moolenaar      finish
1671d3f8a9eeSBram Moolenaar    endif
1672d3f8a9eeSBram Moolenaar    vim9script
1673d3f8a9eeSBram Moolenaar    g:legacy = 0
1674d3f8a9eeSBram Moolenaar  END
1675d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1676d3f8a9eeSBram Moolenaar  g:legacy = -1
1677d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1678d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1679d3f8a9eeSBram Moolenaar
1680d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1681d3f8a9eeSBram Moolenaar  g:legacy = -1
1682d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1683d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1684d3f8a9eeSBram Moolenaarenddef
1685d3f8a9eeSBram Moolenaar
1686750802b5SBram Moolenaardef Test_vim9script_fails()
16878a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
16888a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1689cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
16909721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1691cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1692750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1693750802b5SBram Moolenaar
1694cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1695c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1696c785b9a7SBram Moolenaar
1697e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1698e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
16998a7d6542SBram Moolenaarenddef
17008a7d6542SBram Moolenaar
1701f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1702101f4810SBram Moolenaar  CheckRunVimInTerminal
1703101f4810SBram Moolenaar
17049bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1705c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
17069bb3eb3eSBram Moolenaarendfunc
17079bb3eb3eSBram Moolenaar
1708c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1709cfcd011fSBram Moolenaar  var export =<< trim END
1710101f4810SBram Moolenaar    vim9script
1711101f4810SBram Moolenaar    export def Foo(): number
1712101f4810SBram Moolenaar        return 0
1713101f4810SBram Moolenaar    enddef
1714101f4810SBram Moolenaar  END
1715730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1716101f4810SBram Moolenaar
1717e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
17189bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
17192949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1720101f4810SBram Moolenaar
1721730b2483SBram Moolenaar  delete('XexportCmd.vim')
17229bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
17239bb3eb3eSBram Moolenaarenddef
1724101f4810SBram Moolenaar
17252b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
17262b32700dSBram Moolenaar  var lines =<< trim END
1727a6294955SBram Moolenaar    vim9script
1728a6294955SBram Moolenaar    export var exported = 'thexport'
172960dc8274SBram Moolenaar
173060dc8274SBram Moolenaar    export def TheFunc(x = 0)
173160dc8274SBram Moolenaar    enddef
1732a6294955SBram Moolenaar  END
1733a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1734a6294955SBram Moolenaar  lines =<< trim END
17352b32700dSBram Moolenaar    vim9script noclear
17362b32700dSBram Moolenaar    g:loadCount += 1
17372b32700dSBram Moolenaar    var s:reloaded = 'init'
1738a6294955SBram Moolenaar    import exported from './XExportReload'
17392b32700dSBram Moolenaar
17402b32700dSBram Moolenaar    def Again(): string
17412b32700dSBram Moolenaar      return 'again'
17422b32700dSBram Moolenaar    enddef
17432b32700dSBram Moolenaar
174460dc8274SBram Moolenaar    import TheFunc from './XExportReload'
174560dc8274SBram Moolenaar    TheFunc()
174660dc8274SBram Moolenaar
17472b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
17482b32700dSBram Moolenaar    var s:loaded = true
17492b32700dSBram Moolenaar
17502b32700dSBram Moolenaar    var s:notReloaded = 'yes'
17512b32700dSBram Moolenaar    s:reloaded = 'first'
17522b32700dSBram Moolenaar    def g:Values(): list<string>
1753a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
17542b32700dSBram Moolenaar    enddef
17552b32700dSBram Moolenaar
17562b32700dSBram Moolenaar    def Once(): string
17572b32700dSBram Moolenaar      return 'once'
17582b32700dSBram Moolenaar    enddef
17592b32700dSBram Moolenaar  END
17602b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
17612b32700dSBram Moolenaar  g:loadCount = 0
17622b32700dSBram Moolenaar  source XReloaded
17632b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1764a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
17652b32700dSBram Moolenaar  source XReloaded
17662b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1767a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
17682b32700dSBram Moolenaar  source XReloaded
17692b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1770a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
17712b32700dSBram Moolenaar
177248e11c10SBram Moolenaar  delete('XReloaded')
1773a6294955SBram Moolenaar  delete('XExportReload')
17742b32700dSBram Moolenaar  delfunc g:Values
17752b32700dSBram Moolenaar  unlet g:loadCount
1776577dc93dSBram Moolenaar
1777577dc93dSBram Moolenaar  lines =<< trim END
1778577dc93dSBram Moolenaar      vim9script
1779577dc93dSBram Moolenaar      def Inner()
1780577dc93dSBram Moolenaar      enddef
1781577dc93dSBram Moolenaar  END
1782577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1783577dc93dSBram Moolenaar  source XreloadScript.vim
1784577dc93dSBram Moolenaar
1785577dc93dSBram Moolenaar  lines =<< trim END
1786577dc93dSBram Moolenaar      vim9script
1787577dc93dSBram Moolenaar      def Outer()
1788577dc93dSBram Moolenaar        def Inner()
1789577dc93dSBram Moolenaar        enddef
1790577dc93dSBram Moolenaar      enddef
1791577dc93dSBram Moolenaar      defcompile
1792577dc93dSBram Moolenaar  END
1793577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1794577dc93dSBram Moolenaar  source XreloadScript.vim
1795577dc93dSBram Moolenaar
1796577dc93dSBram Moolenaar  delete('XreloadScript.vim')
17972b32700dSBram Moolenaarenddef
17982b32700dSBram Moolenaar
17994c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1800cfcd011fSBram Moolenaar  var lines =<< trim END
18018a7d6542SBram Moolenaar    vim9script
18028a7d6542SBram Moolenaar    const var = ''
1803cfcd011fSBram Moolenaar    var valone = 1234
18048a7d6542SBram Moolenaar    def MyFunc(arg: string)
18058a7d6542SBram Moolenaar       valone = 5678
18068a7d6542SBram Moolenaar    enddef
18078a7d6542SBram Moolenaar  END
1808cfcd011fSBram Moolenaar  var morelines =<< trim END
1809cfcd011fSBram Moolenaar    var valtwo = 222
18108a7d6542SBram Moolenaar    export def GetValtwo(): number
18118a7d6542SBram Moolenaar      return valtwo
18128a7d6542SBram Moolenaar    enddef
18138a7d6542SBram Moolenaar  END
181403afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
18158a7d6542SBram Moolenaar  source Xreload.vim
18168a7d6542SBram Moolenaar  source Xreload.vim
18178a7d6542SBram Moolenaar  source Xreload.vim
18188a7d6542SBram Moolenaar
1819f5be8cdbSBram Moolenaar  # cannot declare a var twice
18208a7d6542SBram Moolenaar  lines =<< trim END
18218a7d6542SBram Moolenaar    vim9script
1822cfcd011fSBram Moolenaar    var valone = 1234
1823cfcd011fSBram Moolenaar    var valone = 5678
18248a7d6542SBram Moolenaar  END
18258a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
182644d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
18278a7d6542SBram Moolenaar
18288a7d6542SBram Moolenaar  delete('Xreload.vim')
18298a7d6542SBram Moolenaar  delete('Ximport.vim')
18308a7d6542SBram Moolenaarenddef
18318a7d6542SBram Moolenaar
183207a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
183307a65d26SBram Moolenaar" compiled function using that variable must fail.
183407a65d26SBram Moolenaardef Test_script_reload_change_type()
183507a65d26SBram Moolenaar  var lines =<< trim END
183607a65d26SBram Moolenaar    vim9script noclear
183707a65d26SBram Moolenaar    var str = 'string'
183807a65d26SBram Moolenaar    def g:GetStr(): string
183907a65d26SBram Moolenaar      return str .. 'xxx'
184007a65d26SBram Moolenaar    enddef
184107a65d26SBram Moolenaar  END
184207a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
184307a65d26SBram Moolenaar  source Xreload.vim
184407a65d26SBram Moolenaar  echo g:GetStr()
184507a65d26SBram Moolenaar
184607a65d26SBram Moolenaar  lines =<< trim END
184707a65d26SBram Moolenaar    vim9script noclear
184807a65d26SBram Moolenaar    var str = 1234
184907a65d26SBram Moolenaar  END
185007a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
185107a65d26SBram Moolenaar  source Xreload.vim
185207a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
185307a65d26SBram Moolenaar
185407a65d26SBram Moolenaar  delfunc g:GetStr
185507a65d26SBram Moolenaar  delete('Xreload.vim')
185607a65d26SBram Moolenaarenddef
185707a65d26SBram Moolenaar
1858c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled
1859c970e422SBram Moolenaarcommand CallFunc echo 'nop'
1860c970e422SBram Moolenaar
1861c970e422SBram Moolenaardef Test_script_reload_from_function()
1862c970e422SBram Moolenaar  var lines =<< trim END
1863c970e422SBram Moolenaar      vim9script
1864c970e422SBram Moolenaar
1865c970e422SBram Moolenaar      if exists('g:loaded')
1866c970e422SBram Moolenaar        finish
1867c970e422SBram Moolenaar      endif
1868c970e422SBram Moolenaar      g:loaded = 1
1869c970e422SBram Moolenaar      delcommand CallFunc
1870c970e422SBram Moolenaar      command CallFunc Func()
1871c970e422SBram Moolenaar      def Func()
1872a4c81beaSBram Moolenaar        so XreloadFunc.vim
1873c970e422SBram Moolenaar        g:didTheFunc = 1
1874c970e422SBram Moolenaar      enddef
1875c970e422SBram Moolenaar  END
1876c970e422SBram Moolenaar  writefile(lines, 'XreloadFunc.vim')
1877c970e422SBram Moolenaar  source XreloadFunc.vim
1878c970e422SBram Moolenaar  CallFunc
1879c970e422SBram Moolenaar  assert_equal(1, g:didTheFunc)
1880c970e422SBram Moolenaar
1881c970e422SBram Moolenaar  delete('XreloadFunc.vim')
1882c970e422SBram Moolenaar  delcommand CallFunc
1883c970e422SBram Moolenaar  unlet g:loaded
1884c970e422SBram Moolenaar  unlet g:didTheFunc
1885c970e422SBram Moolenaarenddef
1886c970e422SBram Moolenaar
18876c3843caSBram Moolenaardef Test_script_var_shadows_function()
18886c3843caSBram Moolenaar  var lines =<< trim END
18896c3843caSBram Moolenaar      vim9script
18906c3843caSBram Moolenaar      def Func(): number
18916c3843caSBram Moolenaar        return 123
18926c3843caSBram Moolenaar      enddef
18936c3843caSBram Moolenaar      var Func = 1
18946c3843caSBram Moolenaar  END
18956c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
18966c3843caSBram Moolenaarenddef
18976c3843caSBram Moolenaar
1898c323527dSBram Moolenaardef Test_script_var_shadows_command()
1899c323527dSBram Moolenaar  var lines =<< trim END
1900c323527dSBram Moolenaar      var undo = 1
1901c323527dSBram Moolenaar      undo = 2
1902c323527dSBram Moolenaar      assert_equal(2, undo)
1903c323527dSBram Moolenaar  END
1904c323527dSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1905c323527dSBram Moolenaar
1906c323527dSBram Moolenaar  lines =<< trim END
1907c323527dSBram Moolenaar      var undo = 1
1908c323527dSBram Moolenaar      undo
1909c323527dSBram Moolenaar  END
1910c323527dSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1207:', 2)
1911c323527dSBram Moolenaarenddef
1912c323527dSBram Moolenaar
191395006e3dSBram Moolenaardef s:RetSome(): string
191495006e3dSBram Moolenaar  return 'some'
191595006e3dSBram Moolenaarenddef
191695006e3dSBram Moolenaar
1917fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1918fe465a01SBram Moolenaar" script-local name.
1919fe465a01SBram Moolenaardef Test_vim9script_funcref()
1920cfcd011fSBram Moolenaar  var sortlines =<< trim END
1921fe465a01SBram Moolenaar      vim9script
1922fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1923bed36b93SBram Moolenaar        return i2 - i1
1924fe465a01SBram Moolenaar      enddef
1925fe465a01SBram Moolenaar
1926fe465a01SBram Moolenaar      export def FastSort(): list<number>
1927fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1928fe465a01SBram Moolenaar      enddef
1929529fb5a5SBram Moolenaar
1930529fb5a5SBram Moolenaar      export def GetString(arg: string): string
1931529fb5a5SBram Moolenaar        return arg
1932529fb5a5SBram Moolenaar      enddef
1933fe465a01SBram Moolenaar  END
1934fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1935fe465a01SBram Moolenaar
1936cfcd011fSBram Moolenaar  var lines =<< trim END
1937fe465a01SBram Moolenaar    vim9script
1938fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1939fe465a01SBram Moolenaar    def Test()
1940fe465a01SBram Moolenaar      g:result = FastSort()
1941fe465a01SBram Moolenaar    enddef
1942fe465a01SBram Moolenaar    Test()
1943529fb5a5SBram Moolenaar
1944529fb5a5SBram Moolenaar    # using a function imported with "as"
1945529fb5a5SBram Moolenaar    import * as anAlias from './Xsort.vim'
1946529fb5a5SBram Moolenaar    assert_equal('yes', anAlias.GetString('yes'))
1947529fb5a5SBram Moolenaar
1948529fb5a5SBram Moolenaar    # using the function from a compiled function
1949529fb5a5SBram Moolenaar    def TestMore(): string
1950ca51cc0aSBram Moolenaar      var s = s:anAlias.GetString('foo')
1951ca51cc0aSBram Moolenaar      return s .. anAlias.GetString('bar')
1952529fb5a5SBram Moolenaar    enddef
1953ca51cc0aSBram Moolenaar    assert_equal('foobar', TestMore())
1954529fb5a5SBram Moolenaar
1955529fb5a5SBram Moolenaar    # error when using a function that isn't exported
1956529fb5a5SBram Moolenaar    assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1957fe465a01SBram Moolenaar  END
1958fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1959fe465a01SBram Moolenaar
1960fe465a01SBram Moolenaar  source Xscript.vim
1961fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1962fe465a01SBram Moolenaar
1963fe465a01SBram Moolenaar  unlet g:result
1964fe465a01SBram Moolenaar  delete('Xsort.vim')
1965fe465a01SBram Moolenaar  delete('Xscript.vim')
196695006e3dSBram Moolenaar
1967cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
196895006e3dSBram Moolenaar  assert_equal('some', Funcref())
1969fe465a01SBram Moolenaarenddef
1970fe465a01SBram Moolenaar
1971601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1972601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1973601e76acSBram Moolenaar" function reference.
1974c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1975cfcd011fSBram Moolenaar  var filterLines =<< trim END
1976c620c055SBram Moolenaar    vim9script
1977c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1978c620c055SBram Moolenaar      return idx % 2 == 1
1979c620c055SBram Moolenaar    enddef
1980c620c055SBram Moolenaar    export def FastFilter(): list<number>
1981c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1982c620c055SBram Moolenaar    enddef
1983601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1984601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1985601e76acSBram Moolenaar    enddef
1986c620c055SBram Moolenaar  END
1987c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1988c620c055SBram Moolenaar
1989cfcd011fSBram Moolenaar  var lines =<< trim END
1990c620c055SBram Moolenaar    vim9script
1991601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1992c620c055SBram Moolenaar    def Test()
1993cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1994c620c055SBram Moolenaar    enddef
1995c620c055SBram Moolenaar    Test()
1996601e76acSBram Moolenaar    def TestDirect()
1997cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1998601e76acSBram Moolenaar    enddef
1999601e76acSBram Moolenaar    TestDirect()
2000c620c055SBram Moolenaar  END
2001601e76acSBram Moolenaar  CheckScriptSuccess(lines)
2002c620c055SBram Moolenaar  delete('Xfilter.vim')
2003c620c055SBram Moolenaarenddef
2004c620c055SBram Moolenaar
20054c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
2006cfcd011fSBram Moolenaar  var first_lines =<< trim END
20074c17ad94SBram Moolenaar    vim9script
20084c17ad94SBram Moolenaar    def FuncYes(): string
20094c17ad94SBram Moolenaar      return 'yes'
20104c17ad94SBram Moolenaar    enddef
20114c17ad94SBram Moolenaar  END
2012cfcd011fSBram Moolenaar  var withno_lines =<< trim END
20134c17ad94SBram Moolenaar    def FuncNo(): string
20144c17ad94SBram Moolenaar      return 'no'
20154c17ad94SBram Moolenaar    enddef
20164c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
20174c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
20184c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
201903afdcf1SBram Moolenaar    enddef
202003afdcf1SBram Moolenaar  END
2021cfcd011fSBram Moolenaar  var nono_lines =<< trim END
202203afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
202303afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
202444d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
20254c17ad94SBram Moolenaar    enddef
20264c17ad94SBram Moolenaar  END
20274c17ad94SBram Moolenaar
20284c17ad94SBram Moolenaar  # FuncNo() is defined
202903afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
20304c17ad94SBram Moolenaar  source Xreloaded.vim
20314c17ad94SBram Moolenaar  g:DoCheck(true)
20324c17ad94SBram Moolenaar
20334c17ad94SBram Moolenaar  # FuncNo() is not redefined
203403afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
20354c17ad94SBram Moolenaar  source Xreloaded.vim
20365082471fSBram Moolenaar  g:DoCheck(false)
20374c17ad94SBram Moolenaar
20384c17ad94SBram Moolenaar  # FuncNo() is back
203903afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
20404c17ad94SBram Moolenaar  source Xreloaded.vim
20415082471fSBram Moolenaar  g:DoCheck(false)
20424c17ad94SBram Moolenaar
20434c17ad94SBram Moolenaar  delete('Xreloaded.vim')
20444c17ad94SBram Moolenaarenddef
20454c17ad94SBram Moolenaar
204689483d40SBram Moolenaardef Test_vim9script_reload_delvar()
204789483d40SBram Moolenaar  # write the script with a script-local variable
2048cfcd011fSBram Moolenaar  var lines =<< trim END
204989483d40SBram Moolenaar    vim9script
2050cfcd011fSBram Moolenaar    var name = 'string'
205189483d40SBram Moolenaar  END
205289483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
205389483d40SBram Moolenaar  source XreloadVar.vim
205489483d40SBram Moolenaar
205589483d40SBram Moolenaar  # now write the script using the same variable locally - works
205689483d40SBram Moolenaar  lines =<< trim END
205789483d40SBram Moolenaar    vim9script
205889483d40SBram Moolenaar    def Func()
2059cfcd011fSBram Moolenaar      var name = 'string'
206089483d40SBram Moolenaar    enddef
206189483d40SBram Moolenaar  END
206289483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
206389483d40SBram Moolenaar  source XreloadVar.vim
206489483d40SBram Moolenaar
206589483d40SBram Moolenaar  delete('XreloadVar.vim')
206689483d40SBram Moolenaarenddef
206789483d40SBram Moolenaar
20688a7d6542SBram Moolenaardef Test_import_absolute()
2069cfcd011fSBram Moolenaar  var import_lines = [
2070e6085c53SBram Moolenaar        'vim9script',
2071e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
2072e6085c53SBram Moolenaar        'def UseExported()',
2073e6085c53SBram Moolenaar        '  g:imported_abs = exported',
2074e6085c53SBram Moolenaar        '  exported = 8888',
2075e6085c53SBram Moolenaar        '  g:imported_after = exported',
2076e6085c53SBram Moolenaar        'enddef',
2077e6085c53SBram Moolenaar        'UseExported()',
2078e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
2079e6085c53SBram Moolenaar        ]
20808a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
20818a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
20828a7d6542SBram Moolenaar
20838a7d6542SBram Moolenaar  source Ximport_abs.vim
20848a7d6542SBram Moolenaar
20858a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
20864e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
2087fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
2088fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
2089fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2090fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
2091fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
2092fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
2093fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
2094fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
2095fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2096fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
2097e6085c53SBram Moolenaar        g:import_disassembled)
2098b3ca9824SBram Moolenaar
2099b3ca9824SBram Moolenaar  Undo_export_script_lines()
21008a7d6542SBram Moolenaar  unlet g:imported_abs
21014e12a5dfSBram Moolenaar  unlet g:import_disassembled
21028a7d6542SBram Moolenaar
21038a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
21048a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
21058a7d6542SBram Moolenaarenddef
21068a7d6542SBram Moolenaar
21078a7d6542SBram Moolenaardef Test_import_rtp()
2108cfcd011fSBram Moolenaar  var import_lines = [
2109e6085c53SBram Moolenaar        'vim9script',
2110e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
2111e6085c53SBram Moolenaar        'g:imported_rtp = exported',
2112e6085c53SBram Moolenaar        ]
21138a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
2114b885a7c7SBram Moolenaar  mkdir('import', 'p')
2115b885a7c7SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
21168a7d6542SBram Moolenaar
2117cfcd011fSBram Moolenaar  var save_rtp = &rtp
21188a7d6542SBram Moolenaar  &rtp = getcwd()
21198a7d6542SBram Moolenaar  source Ximport_rtp.vim
21208a7d6542SBram Moolenaar  &rtp = save_rtp
21218a7d6542SBram Moolenaar
21228a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
21238a7d6542SBram Moolenaar
2124b3ca9824SBram Moolenaar  Undo_export_script_lines()
2125b3ca9824SBram Moolenaar  unlet g:imported_rtp
21268a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
2127b885a7c7SBram Moolenaar  delete('import', 'rf')
21288a7d6542SBram Moolenaarenddef
21298a7d6542SBram Moolenaar
213025e0f586SBram Moolenaardef Test_import_compile_error()
2131cfcd011fSBram Moolenaar  var export_lines = [
213225e0f586SBram Moolenaar        'vim9script',
213325e0f586SBram Moolenaar        'export def ExpFunc(): string',
213425e0f586SBram Moolenaar        '  return notDefined',
213525e0f586SBram Moolenaar        'enddef',
213625e0f586SBram Moolenaar        ]
213725e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
213825e0f586SBram Moolenaar
2139cfcd011fSBram Moolenaar  var import_lines = [
214025e0f586SBram Moolenaar        'vim9script',
214125e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
214225e0f586SBram Moolenaar        'def ImpFunc()',
214325e0f586SBram Moolenaar        '  echo ExpFunc()',
214425e0f586SBram Moolenaar        'enddef',
214525e0f586SBram Moolenaar        'defcompile',
214625e0f586SBram Moolenaar        ]
214725e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
214825e0f586SBram Moolenaar
214925e0f586SBram Moolenaar  try
215025e0f586SBram Moolenaar    source Ximport.vim
215125e0f586SBram Moolenaar  catch /E1001/
2152f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
21537707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
215425e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
215525e0f586SBram Moolenaar  endtry
215625e0f586SBram Moolenaar
215725e0f586SBram Moolenaar  delete('Xexported.vim')
215825e0f586SBram Moolenaar  delete('Ximport.vim')
215925e0f586SBram Moolenaarenddef
216025e0f586SBram Moolenaar
2161c4ce36d4SBram Moolenaardef Test_func_redefine_error()
2162cfcd011fSBram Moolenaar  var lines = [
2163c4ce36d4SBram Moolenaar        'vim9script',
2164c4ce36d4SBram Moolenaar        'def Func()',
2165c4ce36d4SBram Moolenaar        '  eval [][0]',
2166c4ce36d4SBram Moolenaar        'enddef',
2167c4ce36d4SBram Moolenaar        'Func()',
2168c4ce36d4SBram Moolenaar        ]
2169c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
2170c4ce36d4SBram Moolenaar
2171c4ce36d4SBram Moolenaar  for count in range(3)
2172c4ce36d4SBram Moolenaar    try
2173c4ce36d4SBram Moolenaar      source Xtestscript.vim
2174c4ce36d4SBram Moolenaar    catch /E684/
2175c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
2176c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
2177c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
2178c4ce36d4SBram Moolenaar    endtry
2179c4ce36d4SBram Moolenaar  endfor
2180c4ce36d4SBram Moolenaar
2181c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
2182c4ce36d4SBram Moolenaarenddef
2183c4ce36d4SBram Moolenaar
2184eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
2185cfcd011fSBram Moolenaar  var export_lines =<< trim END
2186eef2102eSBram Moolenaar      vim9script
2187eef2102eSBram Moolenaar      export def Func()
2188eef2102eSBram Moolenaar        echo 'imported'
2189eef2102eSBram Moolenaar      enddef
2190eef2102eSBram Moolenaar  END
2191eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
2192eef2102eSBram Moolenaar
2193cfcd011fSBram Moolenaar  var lines =<< trim END
2194eef2102eSBram Moolenaar    vim9script
2195eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2196eef2102eSBram Moolenaar    def Func()
2197eef2102eSBram Moolenaar      echo 'local to function'
2198eef2102eSBram Moolenaar    enddef
2199eef2102eSBram Moolenaar  END
2200eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2201eef2102eSBram Moolenaar
2202eef2102eSBram Moolenaar  lines =<< trim END
2203eef2102eSBram Moolenaar    vim9script
2204eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2205eef2102eSBram Moolenaar    def Outer()
2206eef2102eSBram Moolenaar      def Func()
2207eef2102eSBram Moolenaar        echo 'local to function'
2208eef2102eSBram Moolenaar      enddef
2209eef2102eSBram Moolenaar    enddef
2210eef2102eSBram Moolenaar    defcompile
2211eef2102eSBram Moolenaar  END
2212eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2213eef2102eSBram Moolenaar
2214eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
2215eef2102eSBram Moolenaarenddef
2216eef2102eSBram Moolenaar
2217b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
2218cfcd011fSBram Moolenaar  var lines =<< trim END
2219b9a2cac3SBram Moolenaar    vim9script
2220b9a2cac3SBram Moolenaar    def Func()
2221b9a2cac3SBram Moolenaar      echo 'one'
2222b9a2cac3SBram Moolenaar    enddef
2223b9a2cac3SBram Moolenaar    def Func()
2224b9a2cac3SBram Moolenaar      echo 'two'
2225b9a2cac3SBram Moolenaar    enddef
2226b9a2cac3SBram Moolenaar  END
2227b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2228fa211f3cSBram Moolenaar
2229fa211f3cSBram Moolenaar  lines =<< trim END
2230fa211f3cSBram Moolenaar    vim9script
2231fa211f3cSBram Moolenaar    def Foo(): string
2232fa211f3cSBram Moolenaar      return 'foo'
2233fa211f3cSBram Moolenaar      enddef
2234fa211f3cSBram Moolenaar    def Func()
2235cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
2236fa211f3cSBram Moolenaar    enddef
2237fa211f3cSBram Moolenaar    defcompile
2238fa211f3cSBram Moolenaar  END
2239fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2240b9a2cac3SBram Moolenaarenddef
2241b9a2cac3SBram Moolenaar
22428a7d6542SBram Moolenaardef Test_fixed_size_list()
2243f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
2244cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
22458a7d6542SBram Moolenaar  l->remove(0)
22468a7d6542SBram Moolenaar  l->add(5)
22478a7d6542SBram Moolenaar  l->insert(99, 1)
22480f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
22498a7d6542SBram Moolenaarenddef
22508a7d6542SBram Moolenaar
2251ae616494SBram Moolenaardef Test_no_insert_xit()
2252d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2253d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2254d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2255d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2256d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2257ae616494SBram Moolenaar
2258ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2259ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2260ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2261ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2262f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2263f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
22646508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
22656508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
2266f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2267f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2268f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2269ae616494SBram Moolenaarenddef
2270ae616494SBram Moolenaar
2271158906cfSBram Moolenaardef IfElse(what: number): string
2272cfcd011fSBram Moolenaar  var res = ''
2273158906cfSBram Moolenaar  if what == 1
2274158906cfSBram Moolenaar    res = "one"
2275158906cfSBram Moolenaar  elseif what == 2
2276158906cfSBram Moolenaar    res = "two"
2277a259d8d3SBram Moolenaar  else
2278158906cfSBram Moolenaar    res = "three"
2279a259d8d3SBram Moolenaar  endif
2280158906cfSBram Moolenaar  return res
2281a259d8d3SBram Moolenaarenddef
2282a259d8d3SBram Moolenaar
2283158906cfSBram Moolenaardef Test_if_elseif_else()
2284158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2285158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2286158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
22870f18b6d1SBram Moolenaarenddef
22880f18b6d1SBram Moolenaar
2289e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2290d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2291d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2292d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2293ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
2294d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
22956628b7ebSBram Moolenaar
22966628b7ebSBram Moolenaar  var lines =<< trim END
22976628b7ebSBram Moolenaar      var s = ''
22986628b7ebSBram Moolenaar      if s = ''
22996628b7ebSBram Moolenaar      endif
23006628b7ebSBram Moolenaar  END
23016628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
23026628b7ebSBram Moolenaar
23036628b7ebSBram Moolenaar  lines =<< trim END
23046628b7ebSBram Moolenaar      var s = ''
23056628b7ebSBram Moolenaar      if s == ''
23066628b7ebSBram Moolenaar      elseif s = ''
23076628b7ebSBram Moolenaar      endif
23086628b7ebSBram Moolenaar  END
23096628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2310e8c4abbbSBram Moolenaarenddef
2311e8c4abbbSBram Moolenaar
23126d69bf60SBram Moolenaarlet g:bool_true = v:true
23136d69bf60SBram Moolenaarlet g:bool_false = v:false
23146d69bf60SBram Moolenaar
23156d69bf60SBram Moolenaardef Test_if_const_expr()
2316cfcd011fSBram Moolenaar  var res = false
23176d69bf60SBram Moolenaar  if true ? true : false
23186d69bf60SBram Moolenaar    res = true
23196d69bf60SBram Moolenaar  endif
23206d69bf60SBram Moolenaar  assert_equal(true, res)
23216d69bf60SBram Moolenaar
2322585fea7bSBram Moolenaar  g:glob = 2
2323585fea7bSBram Moolenaar  if false
23246797966dSBram Moolenaar    execute('g:glob = 3')
2325585fea7bSBram Moolenaar  endif
2326585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2327585fea7bSBram Moolenaar  if true
23286797966dSBram Moolenaar    execute('g:glob = 3')
2329585fea7bSBram Moolenaar  endif
2330585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2331585fea7bSBram Moolenaar
23326d69bf60SBram Moolenaar  res = false
23336d69bf60SBram Moolenaar  if g:bool_true ? true : false
23346d69bf60SBram Moolenaar    res = true
23356d69bf60SBram Moolenaar  endif
23366d69bf60SBram Moolenaar  assert_equal(true, res)
23376d69bf60SBram Moolenaar
23386d69bf60SBram Moolenaar  res = false
23396d69bf60SBram Moolenaar  if true ? g:bool_true : false
23406d69bf60SBram Moolenaar    res = true
23416d69bf60SBram Moolenaar  endif
23426d69bf60SBram Moolenaar  assert_equal(true, res)
23436d69bf60SBram Moolenaar
23446d69bf60SBram Moolenaar  res = false
23456d69bf60SBram Moolenaar  if true ? true : g:bool_false
23466d69bf60SBram Moolenaar    res = true
23476d69bf60SBram Moolenaar  endif
23486d69bf60SBram Moolenaar  assert_equal(true, res)
23496d69bf60SBram Moolenaar
23506d69bf60SBram Moolenaar  res = false
23516d69bf60SBram Moolenaar  if true ? false : true
23526d69bf60SBram Moolenaar    res = true
23536d69bf60SBram Moolenaar  endif
23546d69bf60SBram Moolenaar  assert_equal(false, res)
23556d69bf60SBram Moolenaar
23566d69bf60SBram Moolenaar  res = false
23576d69bf60SBram Moolenaar  if false ? false : true
23586d69bf60SBram Moolenaar    res = true
23596d69bf60SBram Moolenaar  endif
23606d69bf60SBram Moolenaar  assert_equal(true, res)
23616d69bf60SBram Moolenaar
23626d69bf60SBram Moolenaar  res = false
23636d69bf60SBram Moolenaar  if false ? true : false
23646d69bf60SBram Moolenaar    res = true
23656d69bf60SBram Moolenaar  endif
23666d69bf60SBram Moolenaar  assert_equal(false, res)
23676d69bf60SBram Moolenaar
23686d69bf60SBram Moolenaar  res = false
2369e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2370e8c4abbbSBram Moolenaar    res = true
2371e8c4abbbSBram Moolenaar  endif
2372e8c4abbbSBram Moolenaar  assert_equal(false, res)
2373e8c4abbbSBram Moolenaar
2374e8c4abbbSBram Moolenaar  res = false
23756d69bf60SBram Moolenaar  if true && true
23766d69bf60SBram Moolenaar    res = true
23776d69bf60SBram Moolenaar  endif
23786d69bf60SBram Moolenaar  assert_equal(true, res)
23796d69bf60SBram Moolenaar
23806d69bf60SBram Moolenaar  res = false
23816d69bf60SBram Moolenaar  if true && false
23826d69bf60SBram Moolenaar    res = true
23836d69bf60SBram Moolenaar  endif
23846d69bf60SBram Moolenaar  assert_equal(false, res)
23856d69bf60SBram Moolenaar
23866d69bf60SBram Moolenaar  res = false
23876d69bf60SBram Moolenaar  if g:bool_true && false
23886d69bf60SBram Moolenaar    res = true
23896d69bf60SBram Moolenaar  endif
23906d69bf60SBram Moolenaar  assert_equal(false, res)
23916d69bf60SBram Moolenaar
23926d69bf60SBram Moolenaar  res = false
23936d69bf60SBram Moolenaar  if true && g:bool_false
23946d69bf60SBram Moolenaar    res = true
23956d69bf60SBram Moolenaar  endif
23966d69bf60SBram Moolenaar  assert_equal(false, res)
23976d69bf60SBram Moolenaar
23986d69bf60SBram Moolenaar  res = false
23996d69bf60SBram Moolenaar  if false && false
24006d69bf60SBram Moolenaar    res = true
24016d69bf60SBram Moolenaar  endif
24026d69bf60SBram Moolenaar  assert_equal(false, res)
24036d69bf60SBram Moolenaar
24046d69bf60SBram Moolenaar  res = false
24056d69bf60SBram Moolenaar  if true || false
24066d69bf60SBram Moolenaar    res = true
24076d69bf60SBram Moolenaar  endif
24086d69bf60SBram Moolenaar  assert_equal(true, res)
24096d69bf60SBram Moolenaar
24106d69bf60SBram Moolenaar  res = false
24116d69bf60SBram Moolenaar  if g:bool_true || false
24126d69bf60SBram Moolenaar    res = true
24136d69bf60SBram Moolenaar  endif
24146d69bf60SBram Moolenaar  assert_equal(true, res)
24156d69bf60SBram Moolenaar
24166d69bf60SBram Moolenaar  res = false
24176d69bf60SBram Moolenaar  if true || g:bool_false
24186d69bf60SBram Moolenaar    res = true
24196d69bf60SBram Moolenaar  endif
24206d69bf60SBram Moolenaar  assert_equal(true, res)
24216d69bf60SBram Moolenaar
24226d69bf60SBram Moolenaar  res = false
24236d69bf60SBram Moolenaar  if false || false
24246d69bf60SBram Moolenaar    res = true
24256d69bf60SBram Moolenaar  endif
24266d69bf60SBram Moolenaar  assert_equal(false, res)
24273988f64fSBram Moolenaar
24283988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
2429c323527dSBram Moolenaar  if false | eval 1 + 2 | endif
24303988f64fSBram Moolenaar  if false | eval burp + 234 | endif
24313988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
24323988f64fSBram Moolenaar  if false
24333988f64fSBram Moolenaar    burp
24343988f64fSBram Moolenaar  endif
2435e525bddaSBram Moolenaar
2436e525bddaSBram Moolenaar  # expression with line breaks skipped
2437e525bddaSBram Moolenaar  if false
2438e525bddaSBram Moolenaar      ('aaa'
2439e525bddaSBram Moolenaar      .. 'bbb'
2440e525bddaSBram Moolenaar      .. 'ccc'
2441e525bddaSBram Moolenaar      )->setline(1)
2442e525bddaSBram Moolenaar  endif
244380c34ca3SBram Moolenaarenddef
24446d69bf60SBram Moolenaar
244580c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2446d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2447d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2448d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2449d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
24506d69bf60SBram Moolenaarenddef
24516d69bf60SBram Moolenaar
245272abcf42SBram Moolenaardef RunNested(i: number): number
2453cfcd011fSBram Moolenaar  var x: number = 0
245472abcf42SBram Moolenaar  if i % 2
245572abcf42SBram Moolenaar    if 1
2456f5be8cdbSBram Moolenaar      # comment
245772abcf42SBram Moolenaar    else
2458f5be8cdbSBram Moolenaar      # comment
245972abcf42SBram Moolenaar    endif
246072abcf42SBram Moolenaar    x += 1
246172abcf42SBram Moolenaar  else
246272abcf42SBram Moolenaar    x += 1000
246372abcf42SBram Moolenaar  endif
246472abcf42SBram Moolenaar  return x
246572abcf42SBram Moolenaarenddef
246672abcf42SBram Moolenaar
246772abcf42SBram Moolenaardef Test_nested_if()
246872abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
246972abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
247072abcf42SBram Moolenaarenddef
247172abcf42SBram Moolenaar
2472ad39c094SBram Moolenaardef Test_execute_cmd()
2473e4984290SBram Moolenaar  # missing argument is ignored
2474e4984290SBram Moolenaar  execute
2475e4984290SBram Moolenaar  execute # comment
2476e4984290SBram Moolenaar
2477ad39c094SBram Moolenaar  new
2478ad39c094SBram Moolenaar  setline(1, 'default')
2479d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2480ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2481a72cfb80SBram Moolenaar
2482d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2483a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2484a72cfb80SBram Moolenaar
2485cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2486cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2487a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2488ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2489a72cfb80SBram Moolenaar
2490d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2491ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2492a72cfb80SBram Moolenaar
2493cfcd011fSBram Moolenaar  var cmd_first = 'call '
2494cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2495ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2496ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2497ad39c094SBram Moolenaar  bwipe!
2498585fea7bSBram Moolenaar
2499cfcd011fSBram Moolenaar  var n = true
25002d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
25012d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
25022d6b20d6SBram Moolenaar
2503e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2504e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2505e5abf7afSBram Moolenaar
2506d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2507d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2508d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2509ad39c094SBram Moolenaarenddef
2510ad39c094SBram Moolenaar
251147e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2512f5be8cdbSBram Moolenaar  # only checks line continuation
2513cfcd011fSBram Moolenaar  var lines =<< trim END
251447e880d6SBram Moolenaar      vim9script
251547e880d6SBram Moolenaar      execute 'g:someVar'
251647e880d6SBram Moolenaar                .. ' = ' ..
251747e880d6SBram Moolenaar                   '28'
251847e880d6SBram Moolenaar      assert_equal(28, g:someVar)
251947e880d6SBram Moolenaar      unlet g:someVar
252047e880d6SBram Moolenaar  END
252147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
252247e880d6SBram Moolenaarenddef
252347e880d6SBram Moolenaar
2524ad39c094SBram Moolenaardef Test_echo_cmd()
2525a72cfb80SBram Moolenaar  echo 'some' # comment
2526585fea7bSBram Moolenaar  echon 'thing'
2527ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2528ad39c094SBram Moolenaar
2529a72cfb80SBram Moolenaar  echo "some" # comment
2530a72cfb80SBram Moolenaar  echon "thing"
2531a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2532a72cfb80SBram Moolenaar
2533cfcd011fSBram Moolenaar  var str1 = 'some'
2534cfcd011fSBram Moolenaar  var str2 = 'more'
2535ad39c094SBram Moolenaar  echo str1 str2
2536ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2537a72cfb80SBram Moolenaar
2538d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2539ad39c094SBram Moolenaarenddef
2540ad39c094SBram Moolenaar
2541f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2542f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2543f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2544f93c7feaSBram Moolenaar  echo 'clear'
2545df069eecSBram Moolenaar  :1messages
2546f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2547f93c7feaSBram Moolenaar
2548d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2549f93c7feaSBram Moolenaarenddef
2550f93c7feaSBram Moolenaar
255147e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2552f5be8cdbSBram Moolenaar  # only checks line continuation
2553cfcd011fSBram Moolenaar  var lines =<< trim END
255447e880d6SBram Moolenaar      vim9script
255547e880d6SBram Moolenaar      echomsg 'here'
255647e880d6SBram Moolenaar                .. ' is ' ..
255747e880d6SBram Moolenaar                   'a message'
255847e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
255947e880d6SBram Moolenaar  END
256047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
256147e880d6SBram Moolenaarenddef
256247e880d6SBram Moolenaar
2563f93c7feaSBram Moolenaardef Test_echoerr_cmd()
25647de62623SBram Moolenaar  var local = 'local'
256540ee466cSBram Moolenaar  try
25667de62623SBram Moolenaar    echoerr 'something' local 'wrong' # comment
256740ee466cSBram Moolenaar  catch
25687de62623SBram Moolenaar    assert_match('something local wrong', v:exception)
256940ee466cSBram Moolenaar  endtry
2570f93c7feaSBram Moolenaarenddef
2571f93c7feaSBram Moolenaar
257247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2573f5be8cdbSBram Moolenaar  # only checks line continuation
2574cfcd011fSBram Moolenaar  var lines =<< trim END
257547e880d6SBram Moolenaar      vim9script
257647e880d6SBram Moolenaar      try
257747e880d6SBram Moolenaar        echoerr 'this'
257847e880d6SBram Moolenaar                .. ' is ' ..
257947e880d6SBram Moolenaar                   'wrong'
258047e880d6SBram Moolenaar      catch
258147e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
258247e880d6SBram Moolenaar      endtry
258347e880d6SBram Moolenaar  END
258447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
258547e880d6SBram Moolenaarenddef
258647e880d6SBram Moolenaar
25877de62623SBram Moolenaardef Test_echoconsole_cmd()
25887de62623SBram Moolenaar  var local = 'local'
25897de62623SBram Moolenaar  echoconsole 'something' local # comment
25907de62623SBram Moolenaar  # output goes anywhere
25917de62623SBram Moolenaarenddef
25927de62623SBram Moolenaar
259341fe0617SBram Moolenaardef Test_for_outside_of_function()
2594cfcd011fSBram Moolenaar  var lines =<< trim END
259541fe0617SBram Moolenaar    vim9script
259641fe0617SBram Moolenaar    new
259741fe0617SBram Moolenaar    for var in range(0, 3)
259841fe0617SBram Moolenaar      append(line('$'), var)
259941fe0617SBram Moolenaar    endfor
260041fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
260141fe0617SBram Moolenaar    bwipe!
2602522eefd9SBram Moolenaar
2603522eefd9SBram Moolenaar    var result = ''
2604522eefd9SBram Moolenaar    for i in [1, 2, 3]
2605522eefd9SBram Moolenaar      var loop = ' loop ' .. i
2606522eefd9SBram Moolenaar      result ..= loop
2607522eefd9SBram Moolenaar    endfor
2608522eefd9SBram Moolenaar    assert_equal(' loop 1 loop 2 loop 3', result)
260941fe0617SBram Moolenaar  END
261041fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
261141fe0617SBram Moolenaar  source Xvim9for.vim
261241fe0617SBram Moolenaar  delete('Xvim9for.vim')
261341fe0617SBram Moolenaarenddef
26148a7d6542SBram Moolenaar
2615bebf0695Srbtnndef Test_for_skipped_block()
2616bebf0695Srbtnn  # test skipped blocks at outside of function
2617bebf0695Srbtnn  var lines =<< trim END
2618bebf0695Srbtnn    var result = []
2619bebf0695Srbtnn    if true
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([1, 2], result)
2629bebf0695Srbtnn
2630bebf0695Srbtnn    result = []
2631bebf0695Srbtnn    if false
2632bebf0695Srbtnn      for n in [1, 2]
2633bebf0695Srbtnn        result += [n]
2634bebf0695Srbtnn      endfor
2635bebf0695Srbtnn    else
2636bebf0695Srbtnn      for n in [3, 4]
2637bebf0695Srbtnn        result += [n]
2638bebf0695Srbtnn      endfor
2639bebf0695Srbtnn    endif
2640bebf0695Srbtnn    assert_equal([3, 4], result)
2641bebf0695Srbtnn  END
2642bebf0695Srbtnn  CheckDefAndScriptSuccess(lines)
2643bebf0695Srbtnn
2644bebf0695Srbtnn  # test skipped blocks at inside of function
2645bebf0695Srbtnn  lines =<< trim END
2646bebf0695Srbtnn    def DefTrue()
2647bebf0695Srbtnn      var result = []
2648bebf0695Srbtnn      if true
2649bebf0695Srbtnn        for n in [1, 2]
2650bebf0695Srbtnn          result += [n]
2651bebf0695Srbtnn        endfor
2652bebf0695Srbtnn      else
2653bebf0695Srbtnn        for n in [3, 4]
2654bebf0695Srbtnn          result += [n]
2655bebf0695Srbtnn        endfor
2656bebf0695Srbtnn      endif
2657bebf0695Srbtnn      assert_equal([1, 2], result)
2658bebf0695Srbtnn    enddef
2659bebf0695Srbtnn    DefTrue()
2660bebf0695Srbtnn
2661bebf0695Srbtnn    def DefFalse()
2662bebf0695Srbtnn      var result = []
2663bebf0695Srbtnn      if false
2664bebf0695Srbtnn        for n in [1, 2]
2665bebf0695Srbtnn          result += [n]
2666bebf0695Srbtnn        endfor
2667bebf0695Srbtnn      else
2668bebf0695Srbtnn        for n in [3, 4]
2669bebf0695Srbtnn          result += [n]
2670bebf0695Srbtnn        endfor
2671bebf0695Srbtnn      endif
2672bebf0695Srbtnn      assert_equal([3, 4], result)
2673bebf0695Srbtnn    enddef
2674bebf0695Srbtnn    DefFalse()
2675bebf0695Srbtnn  END
2676bebf0695Srbtnn  CheckDefAndScriptSuccess(lines)
2677bebf0695Srbtnnenddef
2678bebf0695Srbtnn
2679e8c4abbbSBram Moolenaardef Test_for_loop()
2680f2253963SBram Moolenaar  var lines =<< trim END
2681cfcd011fSBram Moolenaar      var result = ''
2682e8c4abbbSBram Moolenaar      for cnt in range(7)
2683e8c4abbbSBram Moolenaar        if cnt == 4
2684e8c4abbbSBram Moolenaar          break
2685e8c4abbbSBram Moolenaar        endif
2686e8c4abbbSBram Moolenaar        if cnt == 2
2687e8c4abbbSBram Moolenaar          continue
2688e8c4abbbSBram Moolenaar        endif
2689e8c4abbbSBram Moolenaar        result ..= cnt .. '_'
2690e8c4abbbSBram Moolenaar      endfor
2691e8c4abbbSBram Moolenaar      assert_equal('0_1_3_', result)
26920ad3e894SBram Moolenaar
2693cfcd011fSBram Moolenaar      var concat = ''
26940ad3e894SBram Moolenaar      for str in eval('["one", "two"]')
26950ad3e894SBram Moolenaar        concat ..= str
26960ad3e894SBram Moolenaar      endfor
26970ad3e894SBram Moolenaar      assert_equal('onetwo', concat)
269838bd8de5SBram Moolenaar
269938bd8de5SBram Moolenaar      var total = 0
270038bd8de5SBram Moolenaar      for nr in
270138bd8de5SBram Moolenaar          [1, 2, 3]
270238bd8de5SBram Moolenaar        total += nr
270338bd8de5SBram Moolenaar      endfor
270438bd8de5SBram Moolenaar      assert_equal(6, total)
270538bd8de5SBram Moolenaar
270638bd8de5SBram Moolenaar      total = 0
270738bd8de5SBram Moolenaar      for nr
270838bd8de5SBram Moolenaar        in [1, 2, 3]
270938bd8de5SBram Moolenaar        total += nr
271038bd8de5SBram Moolenaar      endfor
271138bd8de5SBram Moolenaar      assert_equal(6, total)
271238bd8de5SBram Moolenaar
271338bd8de5SBram Moolenaar      total = 0
271438bd8de5SBram Moolenaar      for nr
271538bd8de5SBram Moolenaar        in
271638bd8de5SBram Moolenaar        [1, 2, 3]
271738bd8de5SBram Moolenaar        total += nr
271838bd8de5SBram Moolenaar      endfor
271938bd8de5SBram Moolenaar      assert_equal(6, total)
2720036d0714SBram Moolenaar
2721a3589a0dSBram Moolenaar      # with type
2722a3589a0dSBram Moolenaar      total = 0
2723a3589a0dSBram Moolenaar      for n: number in [1, 2, 3]
2724a3589a0dSBram Moolenaar        total += n
2725a3589a0dSBram Moolenaar      endfor
2726a3589a0dSBram Moolenaar      assert_equal(6, total)
2727a3589a0dSBram Moolenaar
2728fe090eb5SBram Moolenaar      var chars = ''
2729fe090eb5SBram Moolenaar      for s: string in 'foobar'
2730fe090eb5SBram Moolenaar        chars ..= s
2731fe090eb5SBram Moolenaar      endfor
2732fe090eb5SBram Moolenaar      assert_equal('foobar', chars)
2733fe090eb5SBram Moolenaar
27345ede5b23SBram Moolenaar      chars = ''
27355ede5b23SBram Moolenaar      for x: string in {a: 'a', b: 'b'}->values()
27365ede5b23SBram Moolenaar        chars ..= x
27375ede5b23SBram Moolenaar      endfor
27385ede5b23SBram Moolenaar      assert_equal('ab', chars)
27395ede5b23SBram Moolenaar
2740a3589a0dSBram Moolenaar      # unpack with type
2741f2253963SBram Moolenaar      var res = ''
2742a3589a0dSBram Moolenaar      for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2743a3589a0dSBram Moolenaar        res ..= n .. s
2744a3589a0dSBram Moolenaar      endfor
2745a3589a0dSBram Moolenaar      assert_equal('1a2b', res)
2746a3589a0dSBram Moolenaar
2747444d8783SBram Moolenaar      # unpack with one var
2748444d8783SBram Moolenaar      var reslist = []
2749444d8783SBram Moolenaar      for [x] in [['aaa'], ['bbb']]
2750444d8783SBram Moolenaar        reslist->add(x)
2751444d8783SBram Moolenaar      endfor
2752444d8783SBram Moolenaar      assert_equal(['aaa', 'bbb'], reslist)
2753444d8783SBram Moolenaar
2754a3589a0dSBram Moolenaar      # loop over string
2755a3589a0dSBram Moolenaar      res = ''
275674e54fcbSBram Moolenaar      for c in 'aéc̀d'
275774e54fcbSBram Moolenaar        res ..= c .. '-'
275874e54fcbSBram Moolenaar      endfor
275974e54fcbSBram Moolenaar      assert_equal('a-é-c̀-d-', res)
276074e54fcbSBram Moolenaar
276174e54fcbSBram Moolenaar      res = ''
276274e54fcbSBram Moolenaar      for c in ''
276374e54fcbSBram Moolenaar        res ..= c .. '-'
276474e54fcbSBram Moolenaar      endfor
276574e54fcbSBram Moolenaar      assert_equal('', res)
276674e54fcbSBram Moolenaar
276774e54fcbSBram Moolenaar      res = ''
276874e54fcbSBram Moolenaar      for c in test_null_string()
276974e54fcbSBram Moolenaar        res ..= c .. '-'
277074e54fcbSBram Moolenaar      endfor
277174e54fcbSBram Moolenaar      assert_equal('', res)
2772f2253963SBram Moolenaar
2773f2253963SBram Moolenaar      var foo: list<dict<any>> = [
2774f2253963SBram Moolenaar              {a: 'Cat'}
2775f2253963SBram Moolenaar            ]
2776f2253963SBram Moolenaar      for dd in foo
2777f2253963SBram Moolenaar        dd.counter = 12
2778f2253963SBram Moolenaar      endfor
2779f2253963SBram Moolenaar      assert_equal([{a: 'Cat', counter: 12}], foo)
2780ad2d4969SBram Moolenaar
2781ad2d4969SBram Moolenaar      reslist = []
2782ad2d4969SBram Moolenaar      for _ in range(3)
2783ad2d4969SBram Moolenaar        reslist->add('x')
2784ad2d4969SBram Moolenaar      endfor
2785ad2d4969SBram Moolenaar      assert_equal(['x', 'x', 'x'], reslist)
2786f2253963SBram Moolenaar  END
2787f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2788e8c4abbbSBram Moolenaarenddef
2789e8c4abbbSBram Moolenaar
27902eb6fc3bSBram Moolenaardef Test_for_loop_with_closure()
27912eb6fc3bSBram Moolenaar  var lines =<< trim END
27922eb6fc3bSBram Moolenaar      var flist: list<func>
27932eb6fc3bSBram Moolenaar      for i in range(5)
27942eb6fc3bSBram Moolenaar        var inloop = i
27952eb6fc3bSBram Moolenaar        flist[i] = () => inloop
27962eb6fc3bSBram Moolenaar      endfor
27972eb6fc3bSBram Moolenaar      for i in range(5)
27982eb6fc3bSBram Moolenaar        assert_equal(4, flist[i]())
27992eb6fc3bSBram Moolenaar      endfor
28002eb6fc3bSBram Moolenaar  END
28012eb6fc3bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
28022eb6fc3bSBram Moolenaar
28032eb6fc3bSBram Moolenaar  lines =<< trim END
28042eb6fc3bSBram Moolenaar      var flist: list<func>
28052eb6fc3bSBram Moolenaar      for i in range(5)
28062eb6fc3bSBram Moolenaar        var inloop = i
28072eb6fc3bSBram Moolenaar        flist[i] = () => {
28082eb6fc3bSBram Moolenaar              return inloop
28092eb6fc3bSBram Moolenaar            }
28102eb6fc3bSBram Moolenaar      endfor
28112eb6fc3bSBram Moolenaar      for i in range(5)
28122eb6fc3bSBram Moolenaar        assert_equal(4, flist[i]())
28132eb6fc3bSBram Moolenaar      endfor
28142eb6fc3bSBram Moolenaar  END
28152eb6fc3bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
28162eb6fc3bSBram Moolenaarenddef
28172eb6fc3bSBram Moolenaar
2818e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2819442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:')
2820442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:')
2821442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:')
2822442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2823442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2824442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:')
2825d4ab807dSBram Moolenaar  CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2826822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
28272d870f8dSBram Moolenaar  delfunc! g:Func
2828675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2829675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2830675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
283174e54fcbSBram Moolenaar
283274e54fcbSBram Moolenaar  # wrong type detected at compile time
283374e54fcbSBram Moolenaar  CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
283474e54fcbSBram Moolenaar
283574e54fcbSBram Moolenaar  # wrong type detected at runtime
283674e54fcbSBram Moolenaar  g:adict = {a: 1}
283774e54fcbSBram Moolenaar  CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
283874e54fcbSBram Moolenaar  unlet g:adict
2839f6a8d420SBram Moolenaar
2840f6a8d420SBram Moolenaar  var lines =<< trim END
2841f6a8d420SBram Moolenaar      var d: list<dict<any>> = [{a: 0}]
2842f6a8d420SBram Moolenaar      for e in d
2843f6a8d420SBram Moolenaar        e = {a: 0, b: ''}
2844f6a8d420SBram Moolenaar      endfor
2845f6a8d420SBram Moolenaar  END
2846f6a8d420SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3)
2847fe090eb5SBram Moolenaar
2848fe090eb5SBram Moolenaar  lines =<< trim END
2849fe090eb5SBram Moolenaar      for nr: number in ['foo']
2850fe090eb5SBram Moolenaar      endfor
2851fe090eb5SBram Moolenaar  END
2852fe090eb5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2853404557e6SBram Moolenaar
2854404557e6SBram Moolenaar  lines =<< trim END
2855404557e6SBram Moolenaar      for n : number in [1, 2]
2856404557e6SBram Moolenaar        echo n
2857404557e6SBram Moolenaar      endfor
2858404557e6SBram Moolenaar  END
2859404557e6SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1059:', 1)
2860efc5db52SBram Moolenaar
2861efc5db52SBram Moolenaar  lines =<< trim END
2862efc5db52SBram Moolenaar      var d: dict<number> = {a: 1, b: 2}
2863efc5db52SBram Moolenaar      for [k: job, v: job] in d->items()
2864efc5db52SBram Moolenaar        echo k v
2865efc5db52SBram Moolenaar      endfor
2866efc5db52SBram Moolenaar  END
2867efc5db52SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2)
2868e8c4abbbSBram Moolenaarenddef
2869e8c4abbbSBram Moolenaar
2870ea87069dSBram Moolenaardef Test_for_loop_script_var()
2871ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2872ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2873ea87069dSBram Moolenaar
2874ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2875ea87069dSBram Moolenaar  var lines =<< trim END
2876ea87069dSBram Moolenaar    vim9script
2877ea87069dSBram Moolenaar    var total = 0
2878ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2879ea87069dSBram Moolenaar      total += s:var
2880ea87069dSBram Moolenaar    endfor
2881ea87069dSBram Moolenaar    assert_equal(6, total)
2882ea87069dSBram Moolenaar
2883ea87069dSBram Moolenaar    total = 0
2884ea87069dSBram Moolenaar    for var in [1, 2, 3]
2885ea87069dSBram Moolenaar      total += var
2886ea87069dSBram Moolenaar    endfor
2887ea87069dSBram Moolenaar    assert_equal(6, total)
2888ea87069dSBram Moolenaar  END
2889ea87069dSBram Moolenaarenddef
2890ea87069dSBram Moolenaar
2891792f786aSBram Moolenaardef Test_for_loop_unpack()
28924b8a0651SBram Moolenaar  var lines =<< trim END
2893792f786aSBram Moolenaar      var result = []
2894792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2895792f786aSBram Moolenaar        result->add(v1)
2896792f786aSBram Moolenaar        result->add(v2)
2897792f786aSBram Moolenaar      endfor
2898792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2899792f786aSBram Moolenaar
2900792f786aSBram Moolenaar      result = []
2901792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2902792f786aSBram Moolenaar        result->add(v1)
2903792f786aSBram Moolenaar        result->add(v2)
2904792f786aSBram Moolenaar        result->add(v3)
2905792f786aSBram Moolenaar      endfor
2906792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2907792f786aSBram Moolenaar
29084b8a0651SBram Moolenaar      result = []
29094b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
29104b8a0651SBram Moolenaar        result->add(&ts)
29114b8a0651SBram Moolenaar        result->add(&sw)
29124b8a0651SBram Moolenaar      endfor
29134b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
29144b8a0651SBram Moolenaar
29154b8a0651SBram Moolenaar      var slist: list<string>
29164b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
29174b8a0651SBram Moolenaar        slist->add($LOOPVAR)
29184b8a0651SBram Moolenaar        slist->add(@r)
29194b8a0651SBram Moolenaar        slist->add(v:errmsg)
29204b8a0651SBram Moolenaar      endfor
29214b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
29224b8a0651SBram Moolenaar
29234b8a0651SBram Moolenaar      slist = []
29244b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
29254b8a0651SBram Moolenaar        slist->add(g:globalvar)
29264b8a0651SBram Moolenaar        slist->add(b:bufvar)
29274b8a0651SBram Moolenaar        slist->add(w:winvar)
29284b8a0651SBram Moolenaar        slist->add(t:tabvar)
29294b8a0651SBram Moolenaar      endfor
29304b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2931f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
2932b777da9bSBram Moolenaar
2933b777da9bSBram Moolenaar      var res = []
2934b777da9bSBram Moolenaar      for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2935b777da9bSBram Moolenaar        res->add(n)
2936b777da9bSBram Moolenaar      endfor
2937b777da9bSBram Moolenaar      assert_equal([2, 5], res)
29384b8a0651SBram Moolenaar  END
29394b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
29404b8a0651SBram Moolenaar
29414b8a0651SBram Moolenaar  lines =<< trim END
2942792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2943792f786aSBram Moolenaar        echo v1 v2
2944792f786aSBram Moolenaar      endfor
2945792f786aSBram Moolenaar  END
2946792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2947792f786aSBram Moolenaar
2948792f786aSBram Moolenaar  lines =<< trim END
2949792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2950792f786aSBram Moolenaar        echo v1 v2
2951792f786aSBram Moolenaar      endfor
2952792f786aSBram Moolenaar  END
2953792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2954792f786aSBram Moolenaar
2955792f786aSBram Moolenaar  lines =<< trim END
2956792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2957792f786aSBram Moolenaar        echo v1
2958792f786aSBram Moolenaar      endfor
2959792f786aSBram Moolenaar  END
2960792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2961792f786aSBram Moolenaarenddef
2962792f786aSBram Moolenaar
2963c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2964f2253963SBram Moolenaar  var lines =<< trim END
2965c150c09eSBram Moolenaar      var looped = 0
2966c150c09eSBram Moolenaar      var cleanup = 0
2967c150c09eSBram Moolenaar      for i in range(3)
2968c150c09eSBram Moolenaar        looped += 1
2969c150c09eSBram Moolenaar        try
2970c150c09eSBram Moolenaar          eval [][0]
2971c150c09eSBram Moolenaar        catch
2972c150c09eSBram Moolenaar          continue
2973c150c09eSBram Moolenaar        finally
2974c150c09eSBram Moolenaar          cleanup += 1
2975c150c09eSBram Moolenaar        endtry
2976c150c09eSBram Moolenaar      endfor
2977c150c09eSBram Moolenaar      assert_equal(3, looped)
2978c150c09eSBram Moolenaar      assert_equal(3, cleanup)
2979f2253963SBram Moolenaar  END
2980f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2981c150c09eSBram Moolenaarenddef
2982c150c09eSBram Moolenaar
2983d895b1d9Srbtnndef Test_while_skipped_block()
2984d895b1d9Srbtnn  # test skipped blocks at outside of function
2985d895b1d9Srbtnn  var lines =<< trim END
2986d895b1d9Srbtnn    var result = []
2987d895b1d9Srbtnn    var n = 0
2988d895b1d9Srbtnn    if true
2989d895b1d9Srbtnn      n = 1
2990d895b1d9Srbtnn      while n < 3
2991d895b1d9Srbtnn        result += [n]
2992d895b1d9Srbtnn        n += 1
2993d895b1d9Srbtnn      endwhile
2994d895b1d9Srbtnn    else
2995d895b1d9Srbtnn      n = 3
2996d895b1d9Srbtnn      while n < 5
2997d895b1d9Srbtnn        result += [n]
2998d895b1d9Srbtnn        n += 1
2999d895b1d9Srbtnn      endwhile
3000d895b1d9Srbtnn    endif
3001d895b1d9Srbtnn    assert_equal([1, 2], result)
3002d895b1d9Srbtnn
3003d895b1d9Srbtnn    result = []
3004d895b1d9Srbtnn    if false
3005d895b1d9Srbtnn      n = 1
3006d895b1d9Srbtnn      while n < 3
3007d895b1d9Srbtnn        result += [n]
3008d895b1d9Srbtnn        n += 1
3009d895b1d9Srbtnn      endwhile
3010d895b1d9Srbtnn    else
3011d895b1d9Srbtnn      n = 3
3012d895b1d9Srbtnn      while n < 5
3013d895b1d9Srbtnn        result += [n]
3014d895b1d9Srbtnn        n += 1
3015d895b1d9Srbtnn      endwhile
3016d895b1d9Srbtnn    endif
3017d895b1d9Srbtnn    assert_equal([3, 4], result)
3018d895b1d9Srbtnn  END
3019d895b1d9Srbtnn  CheckDefAndScriptSuccess(lines)
3020d895b1d9Srbtnn
3021d895b1d9Srbtnn  # test skipped blocks at inside of function
3022d895b1d9Srbtnn  lines =<< trim END
3023d895b1d9Srbtnn    def DefTrue()
3024d895b1d9Srbtnn      var result = []
3025d895b1d9Srbtnn      var n = 0
3026d895b1d9Srbtnn      if true
3027d895b1d9Srbtnn        n = 1
3028d895b1d9Srbtnn        while n < 3
3029d895b1d9Srbtnn          result += [n]
3030d895b1d9Srbtnn          n += 1
3031d895b1d9Srbtnn        endwhile
3032d895b1d9Srbtnn      else
3033d895b1d9Srbtnn        n = 3
3034d895b1d9Srbtnn        while n < 5
3035d895b1d9Srbtnn          result += [n]
3036d895b1d9Srbtnn          n += 1
3037d895b1d9Srbtnn        endwhile
3038d895b1d9Srbtnn      endif
3039d895b1d9Srbtnn      assert_equal([1, 2], result)
3040d895b1d9Srbtnn    enddef
3041d895b1d9Srbtnn    DefTrue()
3042d895b1d9Srbtnn
3043d895b1d9Srbtnn    def DefFalse()
3044d895b1d9Srbtnn      var result = []
3045d895b1d9Srbtnn      var n = 0
3046d895b1d9Srbtnn      if false
3047d895b1d9Srbtnn        n = 1
3048d895b1d9Srbtnn        while n < 3
3049d895b1d9Srbtnn          result += [n]
3050d895b1d9Srbtnn          n += 1
3051d895b1d9Srbtnn        endwhile
3052d895b1d9Srbtnn      else
3053d895b1d9Srbtnn        n = 3
3054d895b1d9Srbtnn        while n < 5
3055d895b1d9Srbtnn          result += [n]
3056d895b1d9Srbtnn          n += 1
3057d895b1d9Srbtnn        endwhile
3058d895b1d9Srbtnn      endif
3059d895b1d9Srbtnn      assert_equal([3, 4], result)
3060d895b1d9Srbtnn    enddef
3061d895b1d9Srbtnn    DefFalse()
3062d895b1d9Srbtnn  END
3063d895b1d9Srbtnn  CheckDefAndScriptSuccess(lines)
3064d895b1d9Srbtnnenddef
3065d895b1d9Srbtnn
3066d0df1aacSBram Moolenaardef Test_while_loop()
3067cfcd011fSBram Moolenaar  var result = ''
3068cfcd011fSBram Moolenaar  var cnt = 0
3069d0df1aacSBram Moolenaar  while cnt < 555
3070d0df1aacSBram Moolenaar    if cnt == 3
3071d0df1aacSBram Moolenaar      break
3072d0df1aacSBram Moolenaar    endif
3073d0df1aacSBram Moolenaar    cnt += 1
3074d0df1aacSBram Moolenaar    if cnt == 2
3075d0df1aacSBram Moolenaar      continue
3076d0df1aacSBram Moolenaar    endif
3077d0df1aacSBram Moolenaar    result ..= cnt .. '_'
3078d0df1aacSBram Moolenaar  endwhile
3079d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
3080dee37dc7SBram Moolenaar
3081dee37dc7SBram Moolenaar  var s = ''
30820123cc1eSBram Moolenaar  while s == 'x' # {comment}
3083dee37dc7SBram Moolenaar  endwhile
3084d0df1aacSBram Moolenaarenddef
3085d0df1aacSBram Moolenaar
3086e8c4abbbSBram Moolenaardef Test_while_loop_fails()
3087675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
3088675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
3089675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
3090675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
3091675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
3092675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
3093675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
30946628b7ebSBram Moolenaar
30956628b7ebSBram Moolenaar  var lines =<< trim END
30966628b7ebSBram Moolenaar      var s = ''
30976628b7ebSBram Moolenaar      while s = ''
30986628b7ebSBram Moolenaar      endwhile
30996628b7ebSBram Moolenaar  END
31006628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
3101bd5da371SBram Moolenaarenddef
3102bd5da371SBram Moolenaar
31039645e2d9SBram Moolenaardef Test_interrupt_loop()
3104cfcd011fSBram Moolenaar  var caught = false
3105cfcd011fSBram Moolenaar  var x = 0
310697acfc78SBram Moolenaar  try
31079645e2d9SBram Moolenaar    while 1
31089645e2d9SBram Moolenaar      x += 1
31099645e2d9SBram Moolenaar      if x == 100
31109645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
31119645e2d9SBram Moolenaar      endif
31129645e2d9SBram Moolenaar    endwhile
311397acfc78SBram Moolenaar  catch
311497acfc78SBram Moolenaar    caught = true
311597acfc78SBram Moolenaar    assert_equal(100, x)
311697acfc78SBram Moolenaar  endtry
311797acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
311825859dd7SBram Moolenaar  # consume the CTRL-C
311925859dd7SBram Moolenaar  getchar(0)
31209645e2d9SBram Moolenaarenddef
312120431c9dSBram Moolenaar
31224fdae999SBram Moolenaardef Test_automatic_line_continuation()
3123cfcd011fSBram Moolenaar  var mylist = [
31244fdae999SBram Moolenaar      'one',
31254fdae999SBram Moolenaar      'two',
31264fdae999SBram Moolenaar      'three',
3127f5be8cdbSBram Moolenaar      ] # comment
31284fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
31294fdae999SBram Moolenaar
3130cfcd011fSBram Moolenaar  var mydict = {
3131e0de171eSBram Moolenaar      ['one']: 1,
3132e0de171eSBram Moolenaar      ['two']: 2,
3133e0de171eSBram Moolenaar      ['three']:
31344fdae999SBram Moolenaar          3,
3135f5be8cdbSBram Moolenaar      } # comment
3136e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
3137e0de171eSBram Moolenaar  mydict = {
31382c330432SBram Moolenaar      one: 1,  # comment
31392c330432SBram Moolenaar      two:     # comment
31402c330432SBram Moolenaar           2,  # comment
31412c330432SBram Moolenaar      three: 3 # comment
31422c330432SBram Moolenaar      }
3143e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
3144e0de171eSBram Moolenaar  mydict = {
31452c330432SBram Moolenaar      one: 1,
31464fdae999SBram Moolenaar      two:
31474fdae999SBram Moolenaar           2,
31482c330432SBram Moolenaar      three: 3
31494fdae999SBram Moolenaar      }
3150e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
3151e6085c53SBram Moolenaar
3152e6085c53SBram Moolenaar  assert_equal(
3153e6085c53SBram Moolenaar        ['one', 'two', 'three'],
3154e6085c53SBram Moolenaar        split('one two three')
3155e6085c53SBram Moolenaar        )
31564fdae999SBram Moolenaarenddef
31574fdae999SBram Moolenaar
31587a092245SBram Moolenaardef Test_vim9_comment()
31597a092245SBram Moolenaar  CheckScriptSuccess([
31607a092245SBram Moolenaar      'vim9script',
31617a092245SBram Moolenaar      '# something',
316293f82cbeSBram Moolenaar      '#something',
316393f82cbeSBram Moolenaar      '#{something',
31647a092245SBram Moolenaar      ])
316593f82cbeSBram Moolenaar
316693f82cbeSBram Moolenaar  split Xfile
316793f82cbeSBram Moolenaar  CheckScriptSuccess([
316893f82cbeSBram Moolenaar      'vim9script',
316993f82cbeSBram Moolenaar      'edit #something',
317093f82cbeSBram Moolenaar      ])
317193f82cbeSBram Moolenaar  CheckScriptSuccess([
317293f82cbeSBram Moolenaar      'vim9script',
317393f82cbeSBram Moolenaar      'edit #{something',
317493f82cbeSBram Moolenaar      ])
317593f82cbeSBram Moolenaar  close
317693f82cbeSBram Moolenaar
31777a092245SBram Moolenaar  CheckScriptFailure([
31787a092245SBram Moolenaar      'vim9script',
31797a092245SBram Moolenaar      ':# something',
31807a092245SBram Moolenaar      ], 'E488:')
31817a092245SBram Moolenaar  CheckScriptFailure([
31827a092245SBram Moolenaar      '# something',
31837a092245SBram Moolenaar      ], 'E488:')
31847a092245SBram Moolenaar  CheckScriptFailure([
31857a092245SBram Moolenaar      ':# something',
31867a092245SBram Moolenaar      ], 'E488:')
31877a092245SBram Moolenaar
31884a8d9f2eSBram Moolenaar  { # block start
31894a8d9f2eSBram Moolenaar  } # block end
31904a8d9f2eSBram Moolenaar  CheckDefFailure([
31914a8d9f2eSBram Moolenaar      '{# comment',
31924a8d9f2eSBram Moolenaar      ], 'E488:')
31934a8d9f2eSBram Moolenaar  CheckDefFailure([
31944a8d9f2eSBram Moolenaar      '{',
31954a8d9f2eSBram Moolenaar      '}# comment',
31964a8d9f2eSBram Moolenaar      ], 'E488:')
31974a8d9f2eSBram Moolenaar
31984a8d9f2eSBram Moolenaar  echo "yes" # comment
31994a8d9f2eSBram Moolenaar  CheckDefFailure([
32004a8d9f2eSBram Moolenaar      'echo "yes"# comment',
32014a8d9f2eSBram Moolenaar      ], 'E488:')
32027a092245SBram Moolenaar  CheckScriptSuccess([
32037a092245SBram Moolenaar      'vim9script',
32047a092245SBram Moolenaar      'echo "yes" # something',
32057a092245SBram Moolenaar      ])
32067a092245SBram Moolenaar  CheckScriptFailure([
32077a092245SBram Moolenaar      'vim9script',
32087a092245SBram Moolenaar      'echo "yes"# something',
32097a092245SBram Moolenaar      ], 'E121:')
32107a092245SBram Moolenaar  CheckScriptFailure([
32117a092245SBram Moolenaar      'vim9script',
32127a092245SBram Moolenaar      'echo# something',
3213f8103f27SBram Moolenaar      ], 'E1144:')
32147a092245SBram Moolenaar  CheckScriptFailure([
32157a092245SBram Moolenaar      'echo "yes" # something',
32167a092245SBram Moolenaar      ], 'E121:')
32177a092245SBram Moolenaar
32184a8d9f2eSBram Moolenaar  exe "echo" # comment
32194a8d9f2eSBram Moolenaar  CheckDefFailure([
32204a8d9f2eSBram Moolenaar      'exe "echo"# comment',
32214a8d9f2eSBram Moolenaar      ], 'E488:')
32224a8d9f2eSBram Moolenaar  CheckScriptSuccess([
32234a8d9f2eSBram Moolenaar      'vim9script',
32244a8d9f2eSBram Moolenaar      'exe "echo" # something',
32254a8d9f2eSBram Moolenaar      ])
32264a8d9f2eSBram Moolenaar  CheckScriptFailure([
32274a8d9f2eSBram Moolenaar      'vim9script',
32284a8d9f2eSBram Moolenaar      'exe "echo"# something',
32294a8d9f2eSBram Moolenaar      ], 'E121:')
32304a8d9f2eSBram Moolenaar  CheckScriptFailure([
32314a8d9f2eSBram Moolenaar      'vim9script',
32324a8d9f2eSBram Moolenaar      'exe# something',
3233f8103f27SBram Moolenaar      ], 'E1144:')
32344a8d9f2eSBram Moolenaar  CheckScriptFailure([
32354a8d9f2eSBram Moolenaar      'exe "echo" # something',
32364a8d9f2eSBram Moolenaar      ], 'E121:')
32374a8d9f2eSBram Moolenaar
32387a092245SBram Moolenaar  CheckDefFailure([
32397a092245SBram Moolenaar      'try# comment',
32407a092245SBram Moolenaar      '  echo "yes"',
32417a092245SBram Moolenaar      'catch',
32427a092245SBram Moolenaar      'endtry',
3243f8103f27SBram Moolenaar      ], 'E1144:')
32442c5ed4e3SBram Moolenaar  CheckScriptFailure([
32452c5ed4e3SBram Moolenaar      'vim9script',
32462c5ed4e3SBram Moolenaar      'try# comment',
32472c5ed4e3SBram Moolenaar      'echo "yes"',
3248f8103f27SBram Moolenaar      ], 'E1144:')
32497a092245SBram Moolenaar  CheckDefFailure([
32507a092245SBram Moolenaar      'try',
3251a72cfb80SBram Moolenaar      '  throw#comment',
3252a72cfb80SBram Moolenaar      'catch',
3253a72cfb80SBram Moolenaar      'endtry',
3254f8103f27SBram Moolenaar      ], 'E1144:')
3255a72cfb80SBram Moolenaar  CheckDefFailure([
3256a72cfb80SBram Moolenaar      'try',
3257a72cfb80SBram Moolenaar      '  throw "yes"#comment',
3258a72cfb80SBram Moolenaar      'catch',
3259a72cfb80SBram Moolenaar      'endtry',
3260a72cfb80SBram Moolenaar      ], 'E488:')
3261a72cfb80SBram Moolenaar  CheckDefFailure([
3262a72cfb80SBram Moolenaar      'try',
32637a092245SBram Moolenaar      '  echo "yes"',
32647a092245SBram Moolenaar      'catch# comment',
32657a092245SBram Moolenaar      'endtry',
3266f8103f27SBram Moolenaar      ], 'E1144:')
32672c5ed4e3SBram Moolenaar  CheckScriptFailure([
32682c5ed4e3SBram Moolenaar      'vim9script',
32692c5ed4e3SBram Moolenaar      'try',
32702c5ed4e3SBram Moolenaar      '  echo "yes"',
32712c5ed4e3SBram Moolenaar      'catch# comment',
32722c5ed4e3SBram Moolenaar      'endtry',
3273f8103f27SBram Moolenaar      ], 'E1144:')
32742c5ed4e3SBram Moolenaar  CheckDefFailure([
32752c5ed4e3SBram Moolenaar      'try',
32762c5ed4e3SBram Moolenaar      '  echo "yes"',
32772c5ed4e3SBram Moolenaar      'catch /pat/# comment',
32782c5ed4e3SBram Moolenaar      'endtry',
32792c5ed4e3SBram Moolenaar      ], 'E488:')
32807a092245SBram Moolenaar  CheckDefFailure([
32817a092245SBram Moolenaar      'try',
32827a092245SBram Moolenaar      'echo "yes"',
32837a092245SBram Moolenaar      'catch',
32847a092245SBram Moolenaar      'endtry# comment',
3285f8103f27SBram Moolenaar      ], 'E1144:')
32862c5ed4e3SBram Moolenaar  CheckScriptFailure([
32872c5ed4e3SBram Moolenaar      'vim9script',
32882c5ed4e3SBram Moolenaar      'try',
32892c5ed4e3SBram Moolenaar      '  echo "yes"',
32902c5ed4e3SBram Moolenaar      'catch',
32912c5ed4e3SBram Moolenaar      'endtry# comment',
3292f8103f27SBram Moolenaar      ], 'E1144:')
32932c5ed4e3SBram Moolenaar
32942c5ed4e3SBram Moolenaar  CheckScriptSuccess([
32952c5ed4e3SBram Moolenaar      'vim9script',
32962c5ed4e3SBram Moolenaar      'hi # comment',
32972c5ed4e3SBram Moolenaar      ])
32982c5ed4e3SBram Moolenaar  CheckScriptFailure([
32992c5ed4e3SBram Moolenaar      'vim9script',
33002c5ed4e3SBram Moolenaar      'hi# comment',
3301f8103f27SBram Moolenaar      ], 'E1144:')
33021966c248SBram Moolenaar  CheckScriptSuccess([
33031966c248SBram Moolenaar      'vim9script',
33041966c248SBram Moolenaar      'hi Search # comment',
33051966c248SBram Moolenaar      ])
33061966c248SBram Moolenaar  CheckScriptFailure([
33071966c248SBram Moolenaar      'vim9script',
33081966c248SBram Moolenaar      'hi Search# comment',
33091966c248SBram Moolenaar      ], 'E416:')
33101966c248SBram Moolenaar  CheckScriptSuccess([
33111966c248SBram Moolenaar      'vim9script',
33121966c248SBram Moolenaar      'hi link This Search # comment',
33131966c248SBram Moolenaar      ])
33141966c248SBram Moolenaar  CheckScriptFailure([
33151966c248SBram Moolenaar      'vim9script',
33161966c248SBram Moolenaar      'hi link This That# comment',
33171966c248SBram Moolenaar      ], 'E413:')
33181966c248SBram Moolenaar  CheckScriptSuccess([
33191966c248SBram Moolenaar      'vim9script',
33201966c248SBram Moolenaar      'hi clear This # comment',
33211966c248SBram Moolenaar      'hi clear # comment',
33221966c248SBram Moolenaar      ])
3323f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
3324f5be8cdbSBram Moolenaar  # hi clear This# comment',
33251966c248SBram Moolenaar  CheckScriptFailure([
33261966c248SBram Moolenaar      'vim9script',
33271966c248SBram Moolenaar      'hi clear# comment',
33281966c248SBram Moolenaar      ], 'E416:')
33291966c248SBram Moolenaar
33301966c248SBram Moolenaar  CheckScriptSuccess([
33311966c248SBram Moolenaar      'vim9script',
33321966c248SBram Moolenaar      'hi Group term=bold',
33331966c248SBram Moolenaar      'match Group /todo/ # comment',
33341966c248SBram Moolenaar      ])
33351966c248SBram Moolenaar  CheckScriptFailure([
33361966c248SBram Moolenaar      'vim9script',
33371966c248SBram Moolenaar      'hi Group term=bold',
33381966c248SBram Moolenaar      'match Group /todo/# comment',
33391966c248SBram Moolenaar      ], 'E488:')
33401966c248SBram Moolenaar  CheckScriptSuccess([
33411966c248SBram Moolenaar      'vim9script',
33421966c248SBram Moolenaar      'match # comment',
33431966c248SBram Moolenaar      ])
33441966c248SBram Moolenaar  CheckScriptFailure([
33451966c248SBram Moolenaar      'vim9script',
33461966c248SBram Moolenaar      'match# comment',
3347f8103f27SBram Moolenaar      ], 'E1144:')
33481966c248SBram Moolenaar  CheckScriptSuccess([
33491966c248SBram Moolenaar      'vim9script',
33501966c248SBram Moolenaar      'match none # comment',
33511966c248SBram Moolenaar      ])
33521966c248SBram Moolenaar  CheckScriptFailure([
33531966c248SBram Moolenaar      'vim9script',
33541966c248SBram Moolenaar      'match none# comment',
33551966c248SBram Moolenaar      ], 'E475:')
33561966c248SBram Moolenaar
33571966c248SBram Moolenaar  CheckScriptSuccess([
33581966c248SBram Moolenaar      'vim9script',
33591966c248SBram Moolenaar      'menutrans clear # comment',
33601966c248SBram Moolenaar      ])
33611966c248SBram Moolenaar  CheckScriptFailure([
33621966c248SBram Moolenaar      'vim9script',
33631966c248SBram Moolenaar      'menutrans clear# comment text',
33641966c248SBram Moolenaar      ], 'E474:')
33651966c248SBram Moolenaar
33661966c248SBram Moolenaar  CheckScriptSuccess([
33671966c248SBram Moolenaar      'vim9script',
33681966c248SBram Moolenaar      'syntax clear # comment',
33691966c248SBram Moolenaar      ])
33701966c248SBram Moolenaar  CheckScriptFailure([
33711966c248SBram Moolenaar      'vim9script',
33721966c248SBram Moolenaar      'syntax clear# comment text',
33731966c248SBram Moolenaar      ], 'E28:')
33741966c248SBram Moolenaar  CheckScriptSuccess([
33751966c248SBram Moolenaar      'vim9script',
33761966c248SBram Moolenaar      'syntax keyword Word some',
33771966c248SBram Moolenaar      'syntax clear Word # comment',
33781966c248SBram Moolenaar      ])
33791966c248SBram Moolenaar  CheckScriptFailure([
33801966c248SBram Moolenaar      'vim9script',
33811966c248SBram Moolenaar      'syntax keyword Word some',
33821966c248SBram Moolenaar      'syntax clear Word# comment text',
33831966c248SBram Moolenaar      ], 'E28:')
33841966c248SBram Moolenaar
33851966c248SBram Moolenaar  CheckScriptSuccess([
33861966c248SBram Moolenaar      'vim9script',
33871966c248SBram Moolenaar      'syntax list # comment',
33881966c248SBram Moolenaar      ])
33891966c248SBram Moolenaar  CheckScriptFailure([
33901966c248SBram Moolenaar      'vim9script',
33911966c248SBram Moolenaar      'syntax list# comment text',
33921966c248SBram Moolenaar      ], 'E28:')
33931966c248SBram Moolenaar
33941966c248SBram Moolenaar  CheckScriptSuccess([
33951966c248SBram Moolenaar      'vim9script',
33961966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
33971966c248SBram Moolenaar      ])
33981966c248SBram Moolenaar  CheckScriptFailure([
33991966c248SBram Moolenaar      'vim9script',
34001966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
34011966c248SBram Moolenaar      ], 'E475:')
34021966c248SBram Moolenaar
34031966c248SBram Moolenaar  CheckScriptSuccess([
34041966c248SBram Moolenaar      'vim9script',
34051966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
34061966c248SBram Moolenaar      ])
34071966c248SBram Moolenaar  CheckScriptFailure([
34081966c248SBram Moolenaar      'vim9script',
34091966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
34101966c248SBram Moolenaar      ], 'E789:')
34111966c248SBram Moolenaar
34121966c248SBram Moolenaar  CheckScriptSuccess([
34131966c248SBram Moolenaar      'vim9script',
34141966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
34151966c248SBram Moolenaar      ])
34161966c248SBram Moolenaar  CheckScriptFailure([
34171966c248SBram Moolenaar      'vim9script',
34181966c248SBram Moolenaar      'syntax match Word /pat/# comment',
34191966c248SBram Moolenaar      ], 'E402:')
34201966c248SBram Moolenaar
34211966c248SBram Moolenaar  CheckScriptSuccess([
34221966c248SBram Moolenaar      'vim9script',
34231966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
34241966c248SBram Moolenaar      ])
34251966c248SBram Moolenaar  CheckScriptFailure([
34261966c248SBram Moolenaar      'vim9script',
34271966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
34281966c248SBram Moolenaar      ], 'E475:')
34291966c248SBram Moolenaar  CheckScriptFailure([
34301966c248SBram Moolenaar      'vim9script',
34311966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
34321966c248SBram Moolenaar      ], 'E406:')
34331966c248SBram Moolenaar  CheckScriptFailure([
34341966c248SBram Moolenaar      'vim9script',
34351966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
34361966c248SBram Moolenaar      ], 'E475:')
34371966c248SBram Moolenaar
34381966c248SBram Moolenaar  CheckScriptSuccess([
34391966c248SBram Moolenaar      'vim9script',
34401966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
34411966c248SBram Moolenaar      ])
34421966c248SBram Moolenaar  CheckScriptFailure([
34431966c248SBram Moolenaar      'vim9script',
34441966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
3445d032f34aSBram Moolenaar      ], 'E402:')
34461966c248SBram Moolenaar
34471966c248SBram Moolenaar  CheckScriptSuccess([
34481966c248SBram Moolenaar      'vim9script',
34491966c248SBram Moolenaar      'syntax sync # comment',
34501966c248SBram Moolenaar      ])
34511966c248SBram Moolenaar  CheckScriptFailure([
34521966c248SBram Moolenaar      'vim9script',
34531966c248SBram Moolenaar      'syntax sync# comment',
34541966c248SBram Moolenaar      ], 'E404:')
34551966c248SBram Moolenaar  CheckScriptSuccess([
34561966c248SBram Moolenaar      'vim9script',
34571966c248SBram Moolenaar      'syntax sync ccomment # comment',
34581966c248SBram Moolenaar      ])
34591966c248SBram Moolenaar  CheckScriptFailure([
34601966c248SBram Moolenaar      'vim9script',
34611966c248SBram Moolenaar      'syntax sync ccomment# comment',
34621966c248SBram Moolenaar      ], 'E404:')
34631966c248SBram Moolenaar
34641966c248SBram Moolenaar  CheckScriptSuccess([
34651966c248SBram Moolenaar      'vim9script',
34661966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
34671966c248SBram Moolenaar      ])
34681966c248SBram Moolenaar  CheckScriptFailure([
34691966c248SBram Moolenaar      'vim9script',
34701966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
34711966c248SBram Moolenaar      ], 'E475:')
3472a72cfb80SBram Moolenaar
3473a72cfb80SBram Moolenaar  CheckScriptSuccess([
3474a72cfb80SBram Moolenaar      'vim9script',
3475a72cfb80SBram Moolenaar      'command Echo echo # comment',
3476a72cfb80SBram Moolenaar      'command Echo # comment',
34772d870f8dSBram Moolenaar      'delcommand Echo',
3478a72cfb80SBram Moolenaar      ])
3479a72cfb80SBram Moolenaar  CheckScriptFailure([
3480a72cfb80SBram Moolenaar      'vim9script',
3481a72cfb80SBram Moolenaar      'command Echo echo# comment',
3482a72cfb80SBram Moolenaar      'Echo',
3483f8103f27SBram Moolenaar      ], 'E1144:')
34842d870f8dSBram Moolenaar  delcommand Echo
348570249ee8SBram Moolenaar
348670249ee8SBram Moolenaar  var curdir = getcwd()
348770249ee8SBram Moolenaar  CheckScriptSuccess([
348870249ee8SBram Moolenaar      'command Echo cd " comment',
348970249ee8SBram Moolenaar      'Echo',
349070249ee8SBram Moolenaar      'delcommand Echo',
349170249ee8SBram Moolenaar      ])
349270249ee8SBram Moolenaar  CheckScriptSuccess([
3493090728adSBram Moolenaar      'vim9script',
349470249ee8SBram Moolenaar      'command Echo cd # comment',
349570249ee8SBram Moolenaar      'Echo',
349670249ee8SBram Moolenaar      'delcommand Echo',
349770249ee8SBram Moolenaar      ])
349870249ee8SBram Moolenaar  CheckScriptFailure([
349970249ee8SBram Moolenaar      'vim9script',
350070249ee8SBram Moolenaar      'command Echo cd " comment',
350170249ee8SBram Moolenaar      'Echo',
350270249ee8SBram Moolenaar      ], 'E344:')
350370249ee8SBram Moolenaar  delcommand Echo
350470249ee8SBram Moolenaar  chdir(curdir)
350570249ee8SBram Moolenaar
3506a72cfb80SBram Moolenaar  CheckScriptFailure([
3507a72cfb80SBram Moolenaar      'vim9script',
3508a72cfb80SBram Moolenaar      'command Echo# comment',
3509a72cfb80SBram Moolenaar      ], 'E182:')
3510a72cfb80SBram Moolenaar  CheckScriptFailure([
3511a72cfb80SBram Moolenaar      'vim9script',
3512a72cfb80SBram Moolenaar      'command Echo echo',
3513a72cfb80SBram Moolenaar      'command Echo# comment',
3514a72cfb80SBram Moolenaar      ], 'E182:')
35152d870f8dSBram Moolenaar  delcommand Echo
3516a72cfb80SBram Moolenaar
3517a72cfb80SBram Moolenaar  CheckScriptSuccess([
3518a72cfb80SBram Moolenaar      'vim9script',
3519a72cfb80SBram Moolenaar      'function # comment',
3520a72cfb80SBram Moolenaar      ])
3521a72cfb80SBram Moolenaar  CheckScriptFailure([
3522a72cfb80SBram Moolenaar      'vim9script',
35239898107fSBram Moolenaar      'function " comment',
35249898107fSBram Moolenaar      ], 'E129:')
35259898107fSBram Moolenaar  CheckScriptFailure([
35269898107fSBram Moolenaar      'vim9script',
3527a72cfb80SBram Moolenaar      'function# comment',
3528f8103f27SBram Moolenaar      ], 'E1144:')
3529a72cfb80SBram Moolenaar  CheckScriptSuccess([
3530a72cfb80SBram Moolenaar      'vim9script',
3531a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
3532a72cfb80SBram Moolenaar      ])
3533a72cfb80SBram Moolenaar  CheckScriptFailure([
3534a72cfb80SBram Moolenaar      'vim9script',
3535a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
3536a72cfb80SBram Moolenaar      ], 'E488:')
3537a72cfb80SBram Moolenaar
3538a72cfb80SBram Moolenaar  CheckScriptSuccess([
3539a72cfb80SBram Moolenaar      'vim9script',
35404c17ad94SBram Moolenaar      'func g:DeleteMeA()',
3541a72cfb80SBram Moolenaar      'endfunc',
35424c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
3543a72cfb80SBram Moolenaar      ])
3544a72cfb80SBram Moolenaar  CheckScriptFailure([
3545a72cfb80SBram Moolenaar      'vim9script',
35464c17ad94SBram Moolenaar      'func g:DeleteMeB()',
3547a72cfb80SBram Moolenaar      'endfunc',
35484c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
3549a72cfb80SBram Moolenaar      ], 'E488:')
3550a72cfb80SBram Moolenaar
3551a72cfb80SBram Moolenaar  CheckScriptSuccess([
3552a72cfb80SBram Moolenaar      'vim9script',
3553a72cfb80SBram Moolenaar      'call execute("ls") # comment',
3554a72cfb80SBram Moolenaar      ])
3555a72cfb80SBram Moolenaar  CheckScriptFailure([
3556a72cfb80SBram Moolenaar      'vim9script',
3557a72cfb80SBram Moolenaar      'call execute("ls")# comment',
3558a72cfb80SBram Moolenaar      ], 'E488:')
3559e7e4838fSBram Moolenaar
3560e7e4838fSBram Moolenaar  CheckScriptFailure([
3561e7e4838fSBram Moolenaar      'def Test() " comment',
3562e7e4838fSBram Moolenaar      'enddef',
3563e7e4838fSBram Moolenaar      ], 'E488:')
3564e7e4838fSBram Moolenaar  CheckScriptFailure([
3565e7e4838fSBram Moolenaar      'vim9script',
3566e7e4838fSBram Moolenaar      'def Test() " comment',
3567e7e4838fSBram Moolenaar      'enddef',
3568e7e4838fSBram Moolenaar      ], 'E488:')
3569e7e4838fSBram Moolenaar
3570e7e4838fSBram Moolenaar  CheckScriptSuccess([
3571e7e4838fSBram Moolenaar      'func Test() " comment',
3572e7e4838fSBram Moolenaar      'endfunc',
35732d870f8dSBram Moolenaar      'delfunc Test',
3574e7e4838fSBram Moolenaar      ])
35759898107fSBram Moolenaar  CheckScriptSuccess([
3576e7e4838fSBram Moolenaar      'vim9script',
3577e7e4838fSBram Moolenaar      'func Test() " comment',
3578e7e4838fSBram Moolenaar      'endfunc',
35799898107fSBram Moolenaar      ])
3580e7e4838fSBram Moolenaar
3581e7e4838fSBram Moolenaar  CheckScriptSuccess([
3582e7e4838fSBram Moolenaar      'def Test() # comment',
3583e7e4838fSBram Moolenaar      'enddef',
3584e7e4838fSBram Moolenaar      ])
3585e7e4838fSBram Moolenaar  CheckScriptFailure([
3586e7e4838fSBram Moolenaar      'func Test() # comment',
3587e7e4838fSBram Moolenaar      'endfunc',
3588e7e4838fSBram Moolenaar      ], 'E488:')
35890f37e356SBram Moolenaar
35900f37e356SBram Moolenaar  var lines =<< trim END
35910f37e356SBram Moolenaar      vim9script
35920f37e356SBram Moolenaar      syn region Text
35930f37e356SBram Moolenaar      \ start='foo'
35940f37e356SBram Moolenaar      #\ comment
35950f37e356SBram Moolenaar      \ end='bar'
35965072b47aSBram Moolenaar      syn region Text start='foo'
35975072b47aSBram Moolenaar      #\ comment
35985072b47aSBram Moolenaar      \ end='bar'
35990f37e356SBram Moolenaar  END
36000f37e356SBram Moolenaar  CheckScriptSuccess(lines)
36010f37e356SBram Moolenaar
36020f37e356SBram Moolenaar  lines =<< trim END
36030f37e356SBram Moolenaar      vim9script
36040f37e356SBram Moolenaar      syn region Text
36050f37e356SBram Moolenaar      \ start='foo'
36060f37e356SBram Moolenaar      "\ comment
36070f37e356SBram Moolenaar      \ end='bar'
36080f37e356SBram Moolenaar  END
36090f37e356SBram Moolenaar  CheckScriptFailure(lines, 'E399:')
36102c5ed4e3SBram Moolenaarenddef
36112c5ed4e3SBram Moolenaar
36122c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
36132c5ed4e3SBram Moolenaar  CheckCanRunGui
36142c5ed4e3SBram Moolenaar
36152c5ed4e3SBram Moolenaar  CheckScriptFailure([
36162c5ed4e3SBram Moolenaar      'vim9script',
36172c5ed4e3SBram Moolenaar      'gui#comment'
3618f8103f27SBram Moolenaar      ], 'E1144:')
36192c5ed4e3SBram Moolenaar  CheckScriptFailure([
36202c5ed4e3SBram Moolenaar      'vim9script',
36212c5ed4e3SBram Moolenaar      'gui -f#comment'
3622b8bd2e6eSBram Moolenaar      ], 'E194:')
36237a092245SBram Moolenaarenddef
36247a092245SBram Moolenaar
3625a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
36266797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
36276797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3628a26b9700SBram Moolenaar
3629a26b9700SBram Moolenaar  edit test.vim
3630a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3631a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3632a26b9700SBram Moolenaar
3633a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3634a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3635a26b9700SBram Moolenaar
3636a26b9700SBram Moolenaar  g:entered = 0
3637a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3638a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3639a26b9700SBram Moolenaar
3640a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3641a26b9700SBram Moolenaar
3642a26b9700SBram Moolenaar  au! TabEnter
3643a26b9700SBram Moolenaar  unlet g:entered
3644d72c1bf0SBram Moolenaar
3645d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3646d72c1bf0SBram Moolenaar      'vim9script',
36476797966dSBram Moolenaar      'g:var = 123',
3648e55b1c09SBram Moolenaar      'b:var = 456',
3649e55b1c09SBram Moolenaar      'w:var = 777',
3650e55b1c09SBram Moolenaar      't:var = 888',
3651d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3652d72c1bf0SBram Moolenaar      ])
3653d72c1bf0SBram Moolenaar
3654d72c1bf0SBram Moolenaar  CheckScriptFailure([
3655d72c1bf0SBram Moolenaar      'vim9script',
3656cfcd011fSBram Moolenaar      'let var = 123',
3657cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3658cfcd011fSBram Moolenaar
3659cfcd011fSBram Moolenaar  CheckScriptFailure([
3660cfcd011fSBram Moolenaar      'vim9script',
3661cfcd011fSBram Moolenaar      'var g:var = 123',
3662e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3663e55b1c09SBram Moolenaar
3664e55b1c09SBram Moolenaar  CheckScriptFailure([
3665e55b1c09SBram Moolenaar      'vim9script',
3666cfcd011fSBram Moolenaar      'var b:var = 123',
3667e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3668e55b1c09SBram Moolenaar
3669e55b1c09SBram Moolenaar  CheckScriptFailure([
3670e55b1c09SBram Moolenaar      'vim9script',
3671cfcd011fSBram Moolenaar      'var w:var = 123',
3672e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3673e55b1c09SBram Moolenaar
3674e55b1c09SBram Moolenaar  CheckScriptFailure([
3675e55b1c09SBram Moolenaar      'vim9script',
3676cfcd011fSBram Moolenaar      'var t:var = 123',
3677e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3678e55b1c09SBram Moolenaar
3679e55b1c09SBram Moolenaar  CheckScriptFailure([
3680e55b1c09SBram Moolenaar      'vim9script',
3681cfcd011fSBram Moolenaar      'var v:version = 123',
3682e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3683e55b1c09SBram Moolenaar
3684e55b1c09SBram Moolenaar  CheckScriptFailure([
3685e55b1c09SBram Moolenaar      'vim9script',
3686cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3687e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
36886797966dSBram Moolenaar
36896797966dSBram Moolenaar  CheckScriptFailure([
36906797966dSBram Moolenaar      'vim9script',
36916797966dSBram Moolenaar      'g:var = 123',
369232e35117SBram Moolenaar      'unlet g:var# comment1',
3693d72c1bf0SBram Moolenaar      ], 'E108:')
3694d72c1bf0SBram Moolenaar
3695d72c1bf0SBram Moolenaar  CheckScriptFailure([
3696d72c1bf0SBram Moolenaar      'let g:var = 123',
3697d72c1bf0SBram Moolenaar      'unlet g:var # something',
3698d72c1bf0SBram Moolenaar      ], 'E488:')
3699faac4104SBram Moolenaar
3700faac4104SBram Moolenaar  CheckScriptSuccess([
3701faac4104SBram Moolenaar      'vim9script',
370232e35117SBram Moolenaar      'if 1 # comment2',
3703faac4104SBram Moolenaar      '  echo "yes"',
3704faac4104SBram Moolenaar      'elseif 2 #comment',
3705faac4104SBram Moolenaar      '  echo "no"',
3706faac4104SBram Moolenaar      'endif',
3707faac4104SBram Moolenaar      ])
3708faac4104SBram Moolenaar
3709faac4104SBram Moolenaar  CheckScriptFailure([
3710faac4104SBram Moolenaar      'vim9script',
371132e35117SBram Moolenaar      'if 1# comment3',
3712faac4104SBram Moolenaar      '  echo "yes"',
3713faac4104SBram Moolenaar      'endif',
3714fae55a9cSBram Moolenaar      ], 'E488:')
3715faac4104SBram Moolenaar
3716faac4104SBram Moolenaar  CheckScriptFailure([
3717faac4104SBram Moolenaar      'vim9script',
371832e35117SBram Moolenaar      'if 0 # comment4',
3719faac4104SBram Moolenaar      '  echo "yes"',
3720faac4104SBram Moolenaar      'elseif 2#comment',
3721faac4104SBram Moolenaar      '  echo "no"',
3722faac4104SBram Moolenaar      'endif',
3723fae55a9cSBram Moolenaar      ], 'E488:')
3724faac4104SBram Moolenaar
3725faac4104SBram Moolenaar  CheckScriptSuccess([
3726faac4104SBram Moolenaar      'vim9script',
3727cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3728faac4104SBram Moolenaar      ])
3729faac4104SBram Moolenaar
3730faac4104SBram Moolenaar  CheckScriptFailure([
3731faac4104SBram Moolenaar      'vim9script',
3732cfcd011fSBram Moolenaar      'var v = 1# comment6',
3733fae55a9cSBram Moolenaar      ], 'E488:')
3734faac4104SBram Moolenaar
3735faac4104SBram Moolenaar  CheckScriptSuccess([
3736faac4104SBram Moolenaar      'vim9script',
3737faac4104SBram Moolenaar      'new'
3738d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3739df069eecSBram Moolenaar      ':$',
3740faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3741faac4104SBram Moolenaar      'bwipe!',
3742faac4104SBram Moolenaar      ])
3743faac4104SBram Moolenaar
3744f5be8cdbSBram Moolenaar  CheckScriptFailure([
3745f5be8cdbSBram Moolenaar      'vim9script',
3746f5be8cdbSBram Moolenaar      'new'
3747d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3748f5be8cdbSBram Moolenaar      ':$',
3749f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3750f5be8cdbSBram Moolenaar      'bwipe!',
3751f5be8cdbSBram Moolenaar      ], 'E488:')
3752f5be8cdbSBram Moolenaar
3753f5be8cdbSBram Moolenaar  CheckScriptFailure([
3754f5be8cdbSBram Moolenaar      'vim9script',
3755f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3756f5be8cdbSBram Moolenaar      ], 'E477:')
3757a26b9700SBram Moolenaarenddef
3758a26b9700SBram Moolenaar
37597e5bd91dSBram Moolenaardef Test_finish()
3760cfcd011fSBram Moolenaar  var lines =<< trim END
37617e5bd91dSBram Moolenaar    vim9script
37626797966dSBram Moolenaar    g:res = 'one'
37637e5bd91dSBram Moolenaar    if v:false | finish | endif
37646797966dSBram Moolenaar    g:res = 'two'
37657e5bd91dSBram Moolenaar    finish
37666797966dSBram Moolenaar    g:res = 'three'
37677e5bd91dSBram Moolenaar  END
37687e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
37697e5bd91dSBram Moolenaar  source Xfinished
37707e5bd91dSBram Moolenaar  assert_equal('two', g:res)
37717e5bd91dSBram Moolenaar
37727e5bd91dSBram Moolenaar  unlet g:res
37737e5bd91dSBram Moolenaar  delete('Xfinished')
37747e5bd91dSBram Moolenaarenddef
37757e5bd91dSBram Moolenaar
3776a5d0077eSBram Moolenaardef Test_forward_declaration()
3777cfcd011fSBram Moolenaar  var lines =<< trim END
3778a5d0077eSBram Moolenaar    vim9script
3779a5d0077eSBram Moolenaar    def GetValue(): string
3780a5d0077eSBram Moolenaar      return theVal
3781a5d0077eSBram Moolenaar    enddef
3782cfcd011fSBram Moolenaar    var theVal = 'something'
3783822ba247SBram Moolenaar    g:initVal = GetValue()
3784a5d0077eSBram Moolenaar    theVal = 'else'
3785a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3786a5d0077eSBram Moolenaar  END
3787a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3788a5d0077eSBram Moolenaar  source Xforward
3789a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3790a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3791a5d0077eSBram Moolenaar
3792a5d0077eSBram Moolenaar  unlet g:initVal
3793a5d0077eSBram Moolenaar  unlet g:laterVal
3794a5d0077eSBram Moolenaar  delete('Xforward')
3795a5d0077eSBram Moolenaarenddef
3796a5d0077eSBram Moolenaar
37979721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3798a6294955SBram Moolenaar  var vim9_lines =<< trim END
3799a6294955SBram Moolenaar    vim9script
3800a6294955SBram Moolenaar    var local = 'local'
3801a6294955SBram Moolenaar    g:global = 'global'
3802a6294955SBram Moolenaar    export var exported = 'exported'
3803a6294955SBram Moolenaar    export def GetText(): string
3804a6294955SBram Moolenaar       return 'text'
3805a6294955SBram Moolenaar    enddef
3806a6294955SBram Moolenaar  END
3807a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3808a6294955SBram Moolenaar
3809cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
38109721fb4eSBram Moolenaar    source Xvim9_script.vim
38119721fb4eSBram Moolenaar
38129721fb4eSBram Moolenaar    call assert_false(exists('local'))
38139721fb4eSBram Moolenaar    call assert_false(exists('exported'))
38149721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
38159721fb4eSBram Moolenaar    call assert_equal('global', global)
38169721fb4eSBram Moolenaar    call assert_equal('global', g:global)
38179721fb4eSBram Moolenaar
38189721fb4eSBram Moolenaar    " imported variable becomes script-local
38199721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
38209721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
38219721fb4eSBram Moolenaar    call assert_false(exists('exported'))
38229721fb4eSBram Moolenaar
38239721fb4eSBram Moolenaar    " imported function becomes script-local
38249721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
38259721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
38269721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
38279721fb4eSBram Moolenaar  END
38289721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
38299721fb4eSBram Moolenaar
38309721fb4eSBram Moolenaar  source Xlegacy_script.vim
38319721fb4eSBram Moolenaar  assert_equal('global', g:global)
3832f5be8cdbSBram Moolenaar  unlet g:global
38339721fb4eSBram Moolenaar
38349721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
38359721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
38369721fb4eSBram Moolenaarenddef
3837a5d0077eSBram Moolenaar
3838e535db86SBram Moolenaardef Test_declare_script_in_func()
3839e535db86SBram Moolenaar  var lines =<< trim END
3840e535db86SBram Moolenaar      vim9script
3841e535db86SBram Moolenaar      func Declare()
3842e535db86SBram Moolenaar        let s:local = 123
3843e535db86SBram Moolenaar      endfunc
3844e535db86SBram Moolenaar      Declare()
3845e535db86SBram Moolenaar      assert_equal(123, local)
3846e535db86SBram Moolenaar
3847e535db86SBram Moolenaar      var error: string
3848e535db86SBram Moolenaar      try
3849e535db86SBram Moolenaar        local = 'asdf'
3850e535db86SBram Moolenaar      catch
3851e535db86SBram Moolenaar        error = v:exception
3852e535db86SBram Moolenaar      endtry
3853e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3854e535db86SBram Moolenaar
3855e535db86SBram Moolenaar      lockvar local
3856e535db86SBram Moolenaar      try
3857e535db86SBram Moolenaar        local = 999
3858e535db86SBram Moolenaar      catch
3859e535db86SBram Moolenaar        error = v:exception
3860e535db86SBram Moolenaar      endtry
3861e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3862e535db86SBram Moolenaar  END
3863e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3864e535db86SBram Moolenaarenddef
3865e535db86SBram Moolenaar
3866e535db86SBram Moolenaar
38677d699701SBram Moolenaarfunc Test_vim9script_not_global()
38687d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
38697d699701SBram Moolenaar  let vim9lines =<< trim END
38707d699701SBram Moolenaar    vim9script
3871cfcd011fSBram Moolenaar    var name = 'local'
38727d699701SBram Moolenaar    func TheFunc()
38737d699701SBram Moolenaar      echo 'local'
38747d699701SBram Moolenaar    endfunc
38757d699701SBram Moolenaar    def DefFunc()
38767d699701SBram Moolenaar      echo 'local'
38777d699701SBram Moolenaar    enddef
38787d699701SBram Moolenaar  END
38797d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
38807d699701SBram Moolenaar  source Xvim9script.vim
38817d699701SBram Moolenaar  try
38827d699701SBram Moolenaar    echo g:var
38837d699701SBram Moolenaar    assert_report('did not fail')
38847d699701SBram Moolenaar  catch /E121:/
38857d699701SBram Moolenaar    " caught
38867d699701SBram Moolenaar  endtry
38877d699701SBram Moolenaar  try
38887d699701SBram Moolenaar    call TheFunc()
38897d699701SBram Moolenaar    assert_report('did not fail')
38907d699701SBram Moolenaar  catch /E117:/
38917d699701SBram Moolenaar    " caught
38927d699701SBram Moolenaar  endtry
38937d699701SBram Moolenaar  try
38947d699701SBram Moolenaar    call DefFunc()
38957d699701SBram Moolenaar    assert_report('did not fail')
38967d699701SBram Moolenaar  catch /E117:/
38977d699701SBram Moolenaar    " caught
38987d699701SBram Moolenaar  endtry
38997d699701SBram Moolenaar
390025859dd7SBram Moolenaar  call delete('Xvim9script.vim')
39017d699701SBram Moolenaarendfunc
39027d699701SBram Moolenaar
3903eeb27bfeSBram Moolenaardef Test_vim9_copen()
3904eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3905eeb27bfeSBram Moolenaar  copen
3906eeb27bfeSBram Moolenaar  quit
3907eeb27bfeSBram Moolenaarenddef
3908eeb27bfeSBram Moolenaar
390903290b84SBram Moolenaar" test using an auto-loaded function and variable
39102d6b20d6SBram Moolenaardef Test_vim9_autoload()
3911cfcd011fSBram Moolenaar  var lines =<< trim END
39122d6b20d6SBram Moolenaar     vim9script
391303290b84SBram Moolenaar     def some#gettest(): string
391403290b84SBram Moolenaar       return 'test'
391503290b84SBram Moolenaar     enddef
391603290b84SBram Moolenaar     g:some#name = 'name'
3917227c58a4SBram Moolenaar     g:some#dict = {key: 'value'}
3918e3ffcd99SBram Moolenaar
3919e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3920e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3921e3ffcd99SBram Moolenaar     enddef
392203290b84SBram Moolenaar  END
392303290b84SBram Moolenaar
392403290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
392503290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
392603290b84SBram Moolenaar  var save_rtp = &rtp
392703290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
392803290b84SBram Moolenaar
392903290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
393003290b84SBram Moolenaar  assert_equal('name', g:some#name)
3931227c58a4SBram Moolenaar  assert_equal('value', g:some#dict.key)
393203290b84SBram Moolenaar  g:some#other = 'other'
393303290b84SBram Moolenaar  assert_equal('other', g:some#other)
393403290b84SBram Moolenaar
3935e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3936e3ffcd99SBram Moolenaar
393717f700acSBram Moolenaar  # upper case script name works
393817f700acSBram Moolenaar  lines =<< trim END
393917f700acSBram Moolenaar     vim9script
394017f700acSBram Moolenaar     def Other#getOther(): string
394117f700acSBram Moolenaar       return 'other'
394217f700acSBram Moolenaar     enddef
394317f700acSBram Moolenaar  END
394417f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
394517f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
394617f700acSBram Moolenaar
394703290b84SBram Moolenaar  delete('Xdir', 'rf')
394803290b84SBram Moolenaar  &rtp = save_rtp
394903290b84SBram Moolenaarenddef
395003290b84SBram Moolenaar
395103290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
395203290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
395303290b84SBram Moolenaar  var lines =<< trim END
395403290b84SBram Moolenaar     vim9script
39552d6b20d6SBram Moolenaar     def foo#test()
39562d6b20d6SBram Moolenaar         echomsg getreg('"')
39572d6b20d6SBram Moolenaar     enddef
39582d6b20d6SBram Moolenaar  END
39592d6b20d6SBram Moolenaar
39602d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
39612d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3962cfcd011fSBram Moolenaar  var save_rtp = &rtp
39632d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
39642d6b20d6SBram Moolenaar  augroup test
39652d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
39662d6b20d6SBram Moolenaar  augroup END
39672d6b20d6SBram Moolenaar
39682d6b20d6SBram Moolenaar  normal Y
39692d6b20d6SBram Moolenaar
39702d6b20d6SBram Moolenaar  augroup test
39712d6b20d6SBram Moolenaar    autocmd!
39722d6b20d6SBram Moolenaar  augroup END
39732d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
39742d6b20d6SBram Moolenaar  &rtp = save_rtp
39752d6b20d6SBram Moolenaarenddef
39762d6b20d6SBram Moolenaar
397777e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
397877e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3979cfcd011fSBram Moolenaar  var lines =<< trim END
398077e5dcc3SBram Moolenaar      vim9script
398177e5dcc3SBram Moolenaar      def crash#func()
398277e5dcc3SBram Moolenaar          try
398377e5dcc3SBram Moolenaar              for x in List()
398477e5dcc3SBram Moolenaar              endfor
398577e5dcc3SBram Moolenaar          catch
398677e5dcc3SBram Moolenaar          endtry
398777e5dcc3SBram Moolenaar          g:ok = true
398877e5dcc3SBram Moolenaar      enddef
398977e5dcc3SBram Moolenaar      fu List()
399077e5dcc3SBram Moolenaar          invalid
399177e5dcc3SBram Moolenaar      endfu
399277e5dcc3SBram Moolenaar      try
399348e11c10SBram Moolenaar          alsoinvalid
399477e5dcc3SBram Moolenaar      catch /wontmatch/
399577e5dcc3SBram Moolenaar      endtry
399677e5dcc3SBram Moolenaar  END
399777e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
399877e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
399977e5dcc3SBram Moolenaar
400077e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
400177e5dcc3SBram Moolenaar  lines =<< trim END
400277e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
400377e5dcc3SBram Moolenaar    call crash#func()
400477e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
40059c4f5520SBram Moolenaar    qall!
400677e5dcc3SBram Moolenaar  END
400777e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
400877e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
400977e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
401077e5dcc3SBram Moolenaar
401177e5dcc3SBram Moolenaar  delete('Xdidit')
401277e5dcc3SBram Moolenaar  delete('Xscript')
401377e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
401403290b84SBram Moolenaar
401503290b84SBram Moolenaar  lines =<< trim END
401603290b84SBram Moolenaar    vim9script
401703290b84SBram Moolenaar    var foo#bar = 'asdf'
401803290b84SBram Moolenaar  END
401903290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
402077e5dcc3SBram Moolenaarenddef
402177e5dcc3SBram Moolenaar
402281e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
402381e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
402481e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
4025cfcd011fSBram Moolenaar  var lines =<< trim END
402681e17fbeSBram Moolenaar    let s:counter = 1
402781e17fbeSBram Moolenaar    def s:Func()
402881e17fbeSBram Moolenaar      au! CursorHold
402981e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
403081e17fbeSBram Moolenaar    enddef
403181e17fbeSBram Moolenaar    call s:Func()
403281e17fbeSBram Moolenaar    doau CursorHold
403381e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
403481e17fbeSBram Moolenaar    au! CursorHold
403581e17fbeSBram Moolenaar  END
403681e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
403781e17fbeSBram Moolenaarenddef
403881e17fbeSBram Moolenaar
4039b5841b99SBram Moolenaardef Test_error_in_autoload_script()
4040b5841b99SBram Moolenaar  var save_rtp = &rtp
4041b5841b99SBram Moolenaar  var dir = getcwd() .. '/Xruntime'
4042b5841b99SBram Moolenaar  &rtp = dir
4043b5841b99SBram Moolenaar  mkdir(dir .. '/autoload', 'p')
4044b5841b99SBram Moolenaar
4045b5841b99SBram Moolenaar  var lines =<< trim END
4046b5841b99SBram Moolenaar      vim9script noclear
4047b5841b99SBram Moolenaar      def script#autoloaded()
4048b5841b99SBram Moolenaar      enddef
4049b5841b99SBram Moolenaar      def Broken()
4050b5841b99SBram Moolenaar        var x: any = ''
4051b5841b99SBram Moolenaar        eval x != 0
4052b5841b99SBram Moolenaar      enddef
4053b5841b99SBram Moolenaar      Broken()
4054b5841b99SBram Moolenaar  END
4055b5841b99SBram Moolenaar  writefile(lines, dir .. '/autoload/script.vim')
4056b5841b99SBram Moolenaar
4057b5841b99SBram Moolenaar  lines =<< trim END
4058b5841b99SBram Moolenaar      vim9script
4059b5841b99SBram Moolenaar      def CallAutoloaded()
4060b5841b99SBram Moolenaar        script#autoloaded()
4061b5841b99SBram Moolenaar      enddef
4062b5841b99SBram Moolenaar
4063b5841b99SBram Moolenaar      function Legacy()
4064b5841b99SBram Moolenaar        try
4065b5841b99SBram Moolenaar          call s:CallAutoloaded()
4066b5841b99SBram Moolenaar        catch
4067b5841b99SBram Moolenaar          call assert_match('E1030: Using a String as a Number', v:exception)
4068b5841b99SBram Moolenaar        endtry
4069b5841b99SBram Moolenaar      endfunction
4070b5841b99SBram Moolenaar
4071b5841b99SBram Moolenaar      Legacy()
4072b5841b99SBram Moolenaar  END
4073b5841b99SBram Moolenaar  CheckScriptSuccess(lines)
4074b5841b99SBram Moolenaar
4075b5841b99SBram Moolenaar  &rtp = save_rtp
4076b5841b99SBram Moolenaar  delete(dir, 'rf')
4077b5841b99SBram Moolenaarenddef
4078b5841b99SBram Moolenaar
40793896a105SBram Moolenaardef Test_cmdline_win()
40803896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
40813896a105SBram Moolenaar  # the command line window.
40823896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
4083cfcd011fSBram Moolenaar  var export_lines =<< trim END
40843896a105SBram Moolenaar    vim9script
4085cfcd011fSBram Moolenaar    export var That = 'yes'
40863896a105SBram Moolenaar  END
40873896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
4088cfcd011fSBram Moolenaar  var import_lines =<< trim END
40893896a105SBram Moolenaar    vim9script
40903896a105SBram Moolenaar    import That from './Xexport.vim'
40913896a105SBram Moolenaar  END
40923896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
4093cfcd011fSBram Moolenaar  var save_rtp = &rtp
40943896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
40953896a105SBram Moolenaar  syntax on
40963896a105SBram Moolenaar  augroup CmdWin
40973896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
40983896a105SBram Moolenaar  augroup END
40993896a105SBram Moolenaar  # this will open and also close the cmdline window
41003896a105SBram Moolenaar  feedkeys('q:', 'xt')
41013896a105SBram Moolenaar  assert_equal('yes', g:got_there)
41023896a105SBram Moolenaar
41033896a105SBram Moolenaar  augroup CmdWin
41043896a105SBram Moolenaar    au!
41053896a105SBram Moolenaar  augroup END
41063896a105SBram Moolenaar  &rtp = save_rtp
41073896a105SBram Moolenaar  delete('rtp', 'rf')
41083896a105SBram Moolenaarenddef
41093896a105SBram Moolenaar
4110e3d4685fSBram Moolenaardef Test_invalid_sid()
4111e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
411225859dd7SBram Moolenaar
41139c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
4114d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
4115e3d4685fSBram Moolenaar  endif
4116e3d4685fSBram Moolenaar  delete('Xdidit')
4117e3d4685fSBram Moolenaarenddef
4118e3d4685fSBram Moolenaar
41199ec7026fSBram Moolenaardef Test_restoring_cpo()
41209ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
41219ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
41229ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
41239ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
41249ec7026fSBram Moolenaar  endif
41259ec7026fSBram Moolenaar  delete('Xsourced')
41269ec7026fSBram Moolenaar  delete('Xclose')
4127090728adSBram Moolenaar  delete('Xdone')
41280123cc1eSBram Moolenaar
41290123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
41300123cc1eSBram Moolenaar  set cpo=aABceFsMny>
41310123cc1eSBram Moolenaar  edit XanotherScript
41320123cc1eSBram Moolenaar  so %
41330123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
41340123cc1eSBram Moolenaar  :1del
41350123cc1eSBram Moolenaar  w
41360123cc1eSBram Moolenaar  so %
41370123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
41380123cc1eSBram Moolenaar
41390123cc1eSBram Moolenaar  delete('XanotherScript')
41400123cc1eSBram Moolenaar  set cpo&vim
41419ec7026fSBram Moolenaarenddef
41429ec7026fSBram Moolenaar
4143ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
4144ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
414537294bd6SBram Moolenaar  CheckScreendump
4146ffb7dcdbSBram Moolenaar  CheckFeature timers
414737294bd6SBram Moolenaar
4148ffb7dcdbSBram Moolenaar  let lines =<< trim END
414937294bd6SBram Moolenaar    vim9script
415037294bd6SBram Moolenaar    def script#func()
415137294bd6SBram Moolenaar    enddef
415237294bd6SBram Moolenaar  END
4153ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
4154ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
415537294bd6SBram Moolenaar
4156ffb7dcdbSBram Moolenaar  let lines =<< trim END
415737294bd6SBram Moolenaar      vim9script
415837294bd6SBram Moolenaar      set cpo+=M
415937294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
4160767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
416137294bd6SBram Moolenaar      setline(1, 'some text')
416237294bd6SBram Moolenaar  END
4163ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
4164ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
4165ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
4166ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
416737294bd6SBram Moolenaar
4168ffb7dcdbSBram Moolenaar  " clean up
4169ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
4170ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
4171ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
4172ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
4173ffb7dcdbSBram Moolenaarendfunc
417437294bd6SBram Moolenaar
41759ec7026fSBram Moolenaar
4176f0afd9e1SBram Moolenaardef Test_unset_any_variable()
4177cfcd011fSBram Moolenaar  var lines =<< trim END
4178cfcd011fSBram Moolenaar    var name: any
4179cfcd011fSBram Moolenaar    assert_equal(0, name)
4180f0afd9e1SBram Moolenaar  END
4181f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
4182f0afd9e1SBram Moolenaarenddef
4183f0afd9e1SBram Moolenaar
41847e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
418558dbef33SBram Moolenaar  CheckRunVimInTerminal
418658dbef33SBram Moolenaar
41877e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
41887e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
41897e9210eaSBram Moolenaarendfunc
41907e9210eaSBram Moolenaar
41917e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
41929c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
4193cfcd011fSBram Moolenaar  var lines =<< trim END
41949c4f5520SBram Moolenaar    func CheckAndQuit()
41959c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
41969c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
41979c4f5520SBram Moolenaar    endfunc
41989c4f5520SBram Moolenaar  END
41999c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
42009c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
4201e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
42029c4f5520SBram Moolenaar  # define Afunc() on the command line
42039c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
42049c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
42052949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
42069c4f5520SBram Moolenaar
42079c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
42089c4f5520SBram Moolenaar  delete('XcallFunc')
42099c4f5520SBram Moolenaar  delete('Xdidcmd')
42109c4f5520SBram Moolenaarenddef
42119c4f5520SBram Moolenaar
4212fcdc5d83SBram Moolenaardef Test_script_var_scope()
4213fcdc5d83SBram Moolenaar  var lines =<< trim END
4214fcdc5d83SBram Moolenaar      vim9script
4215fcdc5d83SBram Moolenaar      if true
4216fcdc5d83SBram Moolenaar        if true
4217fcdc5d83SBram Moolenaar          var one = 'one'
4218fcdc5d83SBram Moolenaar          echo one
4219fcdc5d83SBram Moolenaar        endif
4220fcdc5d83SBram Moolenaar        echo one
4221fcdc5d83SBram Moolenaar      endif
4222fcdc5d83SBram Moolenaar  END
4223fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
4224fcdc5d83SBram Moolenaar
4225fcdc5d83SBram Moolenaar  lines =<< trim END
4226fcdc5d83SBram Moolenaar      vim9script
4227fcdc5d83SBram Moolenaar      if true
4228fcdc5d83SBram Moolenaar        if false
4229fcdc5d83SBram Moolenaar          var one = 'one'
4230fcdc5d83SBram Moolenaar          echo one
4231fcdc5d83SBram Moolenaar        else
4232fcdc5d83SBram Moolenaar          var one = 'one'
4233fcdc5d83SBram Moolenaar          echo one
4234fcdc5d83SBram Moolenaar        endif
4235fcdc5d83SBram Moolenaar        echo one
4236fcdc5d83SBram Moolenaar      endif
4237fcdc5d83SBram Moolenaar  END
4238fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
4239fcdc5d83SBram Moolenaar
4240fcdc5d83SBram Moolenaar  lines =<< trim END
4241fcdc5d83SBram Moolenaar      vim9script
4242fcdc5d83SBram Moolenaar      while true
4243fcdc5d83SBram Moolenaar        var one = 'one'
4244fcdc5d83SBram Moolenaar        echo one
4245fcdc5d83SBram Moolenaar        break
4246fcdc5d83SBram Moolenaar      endwhile
4247fcdc5d83SBram Moolenaar      echo one
4248fcdc5d83SBram Moolenaar  END
4249fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
4250fcdc5d83SBram Moolenaar
4251fcdc5d83SBram Moolenaar  lines =<< trim END
4252fcdc5d83SBram Moolenaar      vim9script
4253fcdc5d83SBram Moolenaar      for i in range(1)
4254fcdc5d83SBram Moolenaar        var one = 'one'
4255fcdc5d83SBram Moolenaar        echo one
4256fcdc5d83SBram Moolenaar      endfor
4257fcdc5d83SBram Moolenaar      echo one
4258fcdc5d83SBram Moolenaar  END
4259fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
42609becdf2bSBram Moolenaar
42619becdf2bSBram Moolenaar  lines =<< trim END
42629becdf2bSBram Moolenaar      vim9script
42639becdf2bSBram Moolenaar      {
42649becdf2bSBram Moolenaar        var one = 'one'
42659becdf2bSBram Moolenaar        assert_equal('one', one)
42669becdf2bSBram Moolenaar      }
42679becdf2bSBram Moolenaar      assert_false(exists('one'))
42689becdf2bSBram Moolenaar      assert_false(exists('s:one'))
42699becdf2bSBram Moolenaar  END
42709becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
42719becdf2bSBram Moolenaar
42729becdf2bSBram Moolenaar  lines =<< trim END
42739becdf2bSBram Moolenaar      vim9script
42749becdf2bSBram Moolenaar      {
42759becdf2bSBram Moolenaar        var one = 'one'
42769becdf2bSBram Moolenaar        echo one
42779becdf2bSBram Moolenaar      }
42789becdf2bSBram Moolenaar      echo one
42799becdf2bSBram Moolenaar  END
42809becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
4281fcdc5d83SBram Moolenaarenddef
4282fcdc5d83SBram Moolenaar
4283352134bbSBram Moolenaardef Test_catch_exception_in_callback()
4284352134bbSBram Moolenaar  var lines =<< trim END
4285352134bbSBram Moolenaar    vim9script
42862a38908bSBram Moolenaar    def Callback(...l: list<any>)
4287352134bbSBram Moolenaar      try
4288352134bbSBram Moolenaar        var x: string
4289352134bbSBram Moolenaar        var y: string
4290352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
4291352134bbSBram Moolenaar        [x, y] = ['']
4292352134bbSBram Moolenaar      catch
4293352134bbSBram Moolenaar        g:caught = 'yes'
4294352134bbSBram Moolenaar      endtry
4295352134bbSBram Moolenaar    enddef
4296e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
4297352134bbSBram Moolenaar    feedkeys("\r", 'xt')
4298352134bbSBram Moolenaar  END
4299352134bbSBram Moolenaar  CheckScriptSuccess(lines)
4300352134bbSBram Moolenaar
4301352134bbSBram Moolenaar  unlet g:caught
4302352134bbSBram Moolenaarenddef
4303352134bbSBram Moolenaar
4304631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
4305631e8f93SBram Moolenaar  if !has('unix') || !has('job')
4306631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
4307631e8f93SBram Moolenaar  endif
4308b16ff292SBram Moolenaar  # FIXME: this check should not be needed
4309b16ff292SBram Moolenaar  if has('win32')
4310b16ff292SBram Moolenaar    throw 'Skipped: does not work on MS-Windows'
4311b16ff292SBram Moolenaar  endif
4312631e8f93SBram Moolenaar  var lines =<< trim END
4313631e8f93SBram Moolenaar      vim9script
4314631e8f93SBram Moolenaar      var source: list<number>
43152a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
4316631e8f93SBram Moolenaar          eval [][0]
4317631e8f93SBram Moolenaar      enddef
43182a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
4319631e8f93SBram Moolenaar          sleep 1m
4320631e8f93SBram Moolenaar          source += l
4321631e8f93SBram Moolenaar      enddef
4322e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
43236f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
43246f17a3f0SBram Moolenaar        sleep 10m
43256f17a3f0SBram Moolenaar      endwhile
4326206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
4327fe95b94fSBram Moolenaar      sleep 200m
4328631e8f93SBram Moolenaar  END
4329631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
4330631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
4331631e8f93SBram Moolenaar  delete('Xdef')
4332631e8f93SBram Moolenaarenddef
4333631e8f93SBram Moolenaar
43344324d87aSBram Moolenaardef InvokeNormal()
43354324d87aSBram Moolenaar  exe "norm! :m+1\r"
43364324d87aSBram Moolenaarenddef
43374324d87aSBram Moolenaar
43384324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
43394324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
43404324d87aSBram Moolenaar  new
43414324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
43424324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
43434324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
43444324d87aSBram Moolenaar  xunmap <F3>
4345b5b9480eSBram Moolenaarenddef
4346b5b9480eSBram Moolenaar
4347b5b9480eSBram Moolenaardef Test_white_space_after_command()
4348b5b9480eSBram Moolenaar  var lines =<< trim END
4349b5b9480eSBram Moolenaar    exit_cb: Func})
4350b5b9480eSBram Moolenaar  END
4351b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
4352f8103f27SBram Moolenaar
4353f8103f27SBram Moolenaar  lines =<< trim END
4354f8103f27SBram Moolenaar    e#
4355f8103f27SBram Moolenaar  END
4356f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
43574324d87aSBram Moolenaarenddef
43584324d87aSBram Moolenaar
43594aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
43604aab88d9SBram Moolenaar  var lines =<< trim END
43614aab88d9SBram Moolenaar      vim9script
43624aab88d9SBram Moolenaar      if exists('g:guard')
43634aab88d9SBram Moolenaar        finish
43644aab88d9SBram Moolenaar      endif
43654aab88d9SBram Moolenaar      g:guard = 1
43664aab88d9SBram Moolenaar      var name = 'thename'
43674aab88d9SBram Moolenaar      def g:GetName(): string
43684aab88d9SBram Moolenaar        return name
43694aab88d9SBram Moolenaar      enddef
43704aab88d9SBram Moolenaar      def g:SetName(arg: string)
43714aab88d9SBram Moolenaar        name = arg
43724aab88d9SBram Moolenaar      enddef
43734aab88d9SBram Moolenaar  END
43744aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
43754aab88d9SBram Moolenaar  so XscriptTwice.vim
43764aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
43774aab88d9SBram Moolenaar  g:SetName('newname')
43784aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
43794aab88d9SBram Moolenaar  so XscriptTwice.vim
43804aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
43814aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
43824aab88d9SBram Moolenaar
43834aab88d9SBram Moolenaar  delfunc g:GetName
43844aab88d9SBram Moolenaar  delfunc g:SetName
43854aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
43864aab88d9SBram Moolenaar  unlet g:guard
43874aab88d9SBram Moolenaarenddef
43884aab88d9SBram Moolenaar
43894aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
43904aab88d9SBram Moolenaar  var exportlines =<< trim END
43914aab88d9SBram Moolenaar      vim9script
43924aab88d9SBram Moolenaar      if exists('g:guard')
43934aab88d9SBram Moolenaar        finish
43944aab88d9SBram Moolenaar      endif
43954aab88d9SBram Moolenaar      g:guard = 1
43964aab88d9SBram Moolenaar      export var name = 'someName'
43974aab88d9SBram Moolenaar  END
43984aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
43994aab88d9SBram Moolenaar
44004aab88d9SBram Moolenaar  var lines =<< trim END
44014aab88d9SBram Moolenaar      vim9script
44024aab88d9SBram Moolenaar      import name from './XexportScript.vim'
44034aab88d9SBram Moolenaar      def g:GetName(): string
44044aab88d9SBram Moolenaar        return name
44054aab88d9SBram Moolenaar      enddef
44064aab88d9SBram Moolenaar  END
44074aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
44084aab88d9SBram Moolenaar  so XscriptImport.vim
44094aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
44104aab88d9SBram Moolenaar
44114aab88d9SBram Moolenaar  so XexportScript.vim
44124aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
44134aab88d9SBram Moolenaar
44144aab88d9SBram Moolenaar  delfunc g:GetName
44154aab88d9SBram Moolenaar  delete('XexportScript.vim')
44164aab88d9SBram Moolenaar  delete('XscriptImport.vim')
44174aab88d9SBram Moolenaar  unlet g:guard
44184aab88d9SBram Moolenaarenddef
44194aab88d9SBram Moolenaar
442010b9421fSBram Moolenaardef Test_unsupported_commands()
442110b9421fSBram Moolenaar  var lines =<< trim END
442210b9421fSBram Moolenaar      ka
442310b9421fSBram Moolenaar  END
44247d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
44257d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
442610b9421fSBram Moolenaar
442710b9421fSBram Moolenaar  lines =<< trim END
4428ada1d870SBram Moolenaar      :1ka
4429ada1d870SBram Moolenaar  END
44307d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
44317d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
4432ada1d870SBram Moolenaar
4433ada1d870SBram Moolenaar  lines =<< trim END
443410b9421fSBram Moolenaar    t
443510b9421fSBram Moolenaar  END
443610b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
443710b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
443810b9421fSBram Moolenaar
443910b9421fSBram Moolenaar  lines =<< trim END
444010b9421fSBram Moolenaar    x
444110b9421fSBram Moolenaar  END
444210b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
444310b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
444410b9421fSBram Moolenaar
444510b9421fSBram Moolenaar  lines =<< trim END
444610b9421fSBram Moolenaar    xit
444710b9421fSBram Moolenaar  END
444810b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
444910b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
445010b9421fSBram Moolenaarenddef
445110b9421fSBram Moolenaar
4452c70fe460SBram Moolenaardef Test_mapping_line_number()
4453c70fe460SBram Moolenaar  var lines =<< trim END
4454c70fe460SBram Moolenaar      vim9script
4455c70fe460SBram Moolenaar      def g:FuncA()
4456c70fe460SBram Moolenaar          # Some comment
4457c70fe460SBram Moolenaar          FuncB(0)
4458c70fe460SBram Moolenaar      enddef
4459c70fe460SBram Moolenaar          # Some comment
4460c70fe460SBram Moolenaar      def FuncB(
4461c70fe460SBram Moolenaar          # Some comment
4462c70fe460SBram Moolenaar          n: number
4463c70fe460SBram Moolenaar      )
4464c70fe460SBram Moolenaar          exe 'nno '
4465c70fe460SBram Moolenaar              # Some comment
4466c70fe460SBram Moolenaar              .. '<F3> a'
4467c70fe460SBram Moolenaar              .. 'b'
4468c70fe460SBram Moolenaar              .. 'c'
4469c70fe460SBram Moolenaar      enddef
4470c70fe460SBram Moolenaar  END
4471c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
4472c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
4473c70fe460SBram Moolenaar  assert_match('No mapping found', res)
4474c70fe460SBram Moolenaar
4475c70fe460SBram Moolenaar  g:FuncA()
4476c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
4477c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4478c70fe460SBram Moolenaar
4479c70fe460SBram Moolenaar  nunmap <F3>
4480c70fe460SBram Moolenaar  delfunc g:FuncA
4481c70fe460SBram Moolenaarenddef
4482c70fe460SBram Moolenaar
4483deb108baSBram Moolenaardef Test_option_set()
4484deb108baSBram Moolenaar  # legacy script allows for white space
4485deb108baSBram Moolenaar  var lines =<< trim END
4486deb108baSBram Moolenaar      set foldlevel  =11
4487deb108baSBram Moolenaar      call assert_equal(11, &foldlevel)
4488deb108baSBram Moolenaar  END
4489deb108baSBram Moolenaar  CheckScriptSuccess(lines)
4490deb108baSBram Moolenaar
4491deb108baSBram Moolenaar  set foldlevel
4492deb108baSBram Moolenaar  set foldlevel=12
4493deb108baSBram Moolenaar  assert_equal(12, &foldlevel)
4494deb108baSBram Moolenaar  set foldlevel+=2
4495deb108baSBram Moolenaar  assert_equal(14, &foldlevel)
4496deb108baSBram Moolenaar  set foldlevel-=3
4497deb108baSBram Moolenaar  assert_equal(11, &foldlevel)
4498deb108baSBram Moolenaar
4499deb108baSBram Moolenaar  lines =<< trim END
4500deb108baSBram Moolenaar      set foldlevel =1
4501deb108baSBram Moolenaar  END
4502deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
4503deb108baSBram Moolenaar
4504deb108baSBram Moolenaar  lines =<< trim END
4505deb108baSBram Moolenaar      set foldlevel +=1
4506deb108baSBram Moolenaar  END
4507deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
4508deb108baSBram Moolenaar
4509deb108baSBram Moolenaar  lines =<< trim END
4510deb108baSBram Moolenaar      set foldlevel ^=1
4511deb108baSBram Moolenaar  END
4512deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
4513deb108baSBram Moolenaar
4514deb108baSBram Moolenaar  lines =<< trim END
4515deb108baSBram Moolenaar      set foldlevel -=1
4516deb108baSBram Moolenaar  END
4517deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
4518deb108baSBram Moolenaar
4519deb108baSBram Moolenaar  set foldlevel&
4520deb108baSBram Moolenaarenddef
4521deb108baSBram Moolenaar
4522208f0b48SBram Moolenaardef Test_option_modifier()
45231594f313SBram Moolenaar  # legacy script allows for white space
4524208f0b48SBram Moolenaar  var lines =<< trim END
4525208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
4526208f0b48SBram Moolenaar      call assert_equal(1, &hlsearch)
4527208f0b48SBram Moolenaar  END
4528208f0b48SBram Moolenaar  CheckScriptSuccess(lines)
4529208f0b48SBram Moolenaar
45301594f313SBram Moolenaar  set hlsearch
45311594f313SBram Moolenaar  set hlsearch!
45321594f313SBram Moolenaar  assert_equal(false, &hlsearch)
45331594f313SBram Moolenaar
45341594f313SBram Moolenaar  set hlsearch
4535208f0b48SBram Moolenaar  set hlsearch&
45361594f313SBram Moolenaar  assert_equal(false, &hlsearch)
4537208f0b48SBram Moolenaar
4538208f0b48SBram Moolenaar  lines =<< trim END
45391594f313SBram Moolenaar      set hlsearch &
4540208f0b48SBram Moolenaar  END
45411594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
45421594f313SBram Moolenaar
45431594f313SBram Moolenaar  lines =<< trim END
45441594f313SBram Moolenaar      set hlsearch   !
45451594f313SBram Moolenaar  END
45461594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
45471594f313SBram Moolenaar
45481594f313SBram Moolenaar  set hlsearch&
4549208f0b48SBram Moolenaarenddef
4550208f0b48SBram Moolenaar
4551c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail
4552c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number()
4553c03fe66aSBram Moolenaar  var lines =<< trim END
4554c03fe66aSBram Moolenaar      echoerr 'some'
4555c03fe66aSBram Moolenaar         .. ' error'
4556c03fe66aSBram Moolenaar         .. ' continued'
4557c03fe66aSBram Moolenaar  END
4558c03fe66aSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
4559c03fe66aSBram Moolenaarenddef
4560c03fe66aSBram Moolenaar
4561648594eaSBram Moolenaardef ProfiledWithLambda()
4562d9162550SBram Moolenaar  var n = 3
4563d9162550SBram Moolenaar  echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4564d9162550SBram Moolenaarenddef
4565d9162550SBram Moolenaar
4566648594eaSBram Moolenaardef ProfiledNested()
4567648594eaSBram Moolenaar  var x = 0
4568648594eaSBram Moolenaar  def Nested(): any
4569648594eaSBram Moolenaar      return x
4570648594eaSBram Moolenaar  enddef
4571648594eaSBram Moolenaar  Nested()
4572648594eaSBram Moolenaarenddef
4573648594eaSBram Moolenaar
4574ffcfddc7SBram Moolenaardef ProfiledNestedProfiled()
4575ffcfddc7SBram Moolenaar  var x = 0
4576ffcfddc7SBram Moolenaar  def Nested(): any
4577ffcfddc7SBram Moolenaar      return x
4578ffcfddc7SBram Moolenaar  enddef
4579ffcfddc7SBram Moolenaar  Nested()
4580ffcfddc7SBram Moolenaarenddef
4581ffcfddc7SBram Moolenaar
4582d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists.
4583d9162550SBram Moolenaar" This only tests that it works, not the profiling output.
4584d9162550SBram Moolenaardef Test_xx_profile_with_lambda()
45854ece152aSBram Moolenaar  CheckFeature profile
45864ece152aSBram Moolenaar
4587d9162550SBram Moolenaar  profile start Xprofile.log
4588648594eaSBram Moolenaar  profile func ProfiledWithLambda
4589648594eaSBram Moolenaar  ProfiledWithLambda()
4590ffcfddc7SBram Moolenaar
4591648594eaSBram Moolenaar  profile func ProfiledNested
4592648594eaSBram Moolenaar  ProfiledNested()
4593ffcfddc7SBram Moolenaar
4594ffcfddc7SBram Moolenaar  # Also profile the nested function.  Use a different function, although the
4595ffcfddc7SBram Moolenaar  # contents is the same, to make sure it was not already compiled.
4596ffcfddc7SBram Moolenaar  profile func *
4597ffcfddc7SBram Moolenaar  ProfiledNestedProfiled()
4598ffcfddc7SBram Moolenaar
4599ffcfddc7SBram Moolenaar  profdel func *
4600ffcfddc7SBram Moolenaar  profile pause
4601d9162550SBram Moolenaarenddef
4602d9162550SBram Moolenaar
4603585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
4604585fea7bSBram Moolenaardef Test_substitute_cmd()
4605585fea7bSBram Moolenaar  new
4606585fea7bSBram Moolenaar  setline(1, 'something')
4607585fea7bSBram Moolenaar  :substitute(some(other(
4608585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
4609585fea7bSBram Moolenaar  bwipe!
4610585fea7bSBram Moolenaar
4611f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
4612cfcd011fSBram Moolenaar  var lines =<< trim END
4613585fea7bSBram Moolenaar    vim9script
4614585fea7bSBram Moolenaar    new
4615585fea7bSBram Moolenaar    setline(1, 'something')
4616585fea7bSBram Moolenaar    :substitute(some(other(
4617585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
4618585fea7bSBram Moolenaar    bwipe!
4619585fea7bSBram Moolenaar  END
4620585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
4621585fea7bSBram Moolenaar  source Xvim9lines
4622585fea7bSBram Moolenaar
4623585fea7bSBram Moolenaar  delete('Xvim9lines')
4624585fea7bSBram Moolenaarenddef
4625585fea7bSBram Moolenaar
46268a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
4627