18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
7e3d4685fSBram Moolenaarsource shared.vim
837294bd6SBram Moolenaarsource screendump.vim
98a7d6542SBram Moolenaar
105d72ce69SBram Moolenaardef Test_range_only()
115d72ce69SBram Moolenaar  new
125d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
135d72ce69SBram Moolenaar  :/Blah/
145d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
15c2af0affSBram Moolenaar  bwipe!
16c2af0affSBram Moolenaar
17c2af0affSBram Moolenaar  # without range commands use current line
18c2af0affSBram Moolenaar  new
19c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
20c2af0affSBram Moolenaar  :2
21c2af0affSBram Moolenaar  print
22c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
23c2af0affSBram Moolenaar  :3
24c2af0affSBram Moolenaar  list
25c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
26b8554304SBram Moolenaar
27b8554304SBram Moolenaar  # missing command does not print the line
28b8554304SBram Moolenaar  var lines =<< trim END
29b8554304SBram Moolenaar    vim9script
30b8554304SBram Moolenaar    :1|
31b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
32b8554304SBram Moolenaar    :|
33b8554304SBram Moolenaar    assert_equal('three$', Screenline(&lines))
34b8554304SBram Moolenaar  END
35b8554304SBram Moolenaar  CheckScriptSuccess(lines)
36b8554304SBram Moolenaar
37c2af0affSBram Moolenaar  bwipe!
38025cb1caSBram Moolenaar
39025cb1caSBram Moolenaar  # won't generate anything
40025cb1caSBram Moolenaar  if false
41025cb1caSBram Moolenaar    :123
42025cb1caSBram Moolenaar  endif
435d72ce69SBram Moolenaarenddef
445d72ce69SBram Moolenaar
45a6e67e4fSBram Moolenaarlet g:alist = [7]
46a6e67e4fSBram Moolenaarlet g:astring = 'text'
47f0b9f43cSBram Moolenaarlet g:anumber = 123
486e587dcbSBram Moolenaar
494c17ad94SBram Moolenaardef Test_delfunction()
50f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
514c17ad94SBram Moolenaar  CheckScriptSuccess([
524c17ad94SBram Moolenaar      'vim9script',
534c17ad94SBram Moolenaar      'func CheckMe()',
544c17ad94SBram Moolenaar      '  return 123',
554c17ad94SBram Moolenaar      'endfunc',
564c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
574c17ad94SBram Moolenaar      ])
584c17ad94SBram Moolenaar
59f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
604c17ad94SBram Moolenaar  CheckScriptFailure([
614c17ad94SBram Moolenaar      'vim9script',
624c17ad94SBram Moolenaar      'func DeleteMe1()',
634c17ad94SBram Moolenaar      'endfunc',
644c17ad94SBram Moolenaar      'delfunction DeleteMe1',
654c17ad94SBram Moolenaar      ], 'E1084:')
664c17ad94SBram Moolenaar  CheckScriptFailure([
674c17ad94SBram Moolenaar      'vim9script',
684c17ad94SBram Moolenaar      'func DeleteMe2()',
694c17ad94SBram Moolenaar      'endfunc',
704c17ad94SBram Moolenaar      'def DoThat()',
714c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
724c17ad94SBram Moolenaar      'enddef',
734c17ad94SBram Moolenaar      'DoThat()',
744c17ad94SBram Moolenaar      ], 'E1084:')
754c17ad94SBram Moolenaar  CheckScriptFailure([
764c17ad94SBram Moolenaar      'vim9script',
774c17ad94SBram Moolenaar      'def DeleteMe3()',
784c17ad94SBram Moolenaar      'enddef',
794c17ad94SBram Moolenaar      'delfunction DeleteMe3',
804c17ad94SBram Moolenaar      ], 'E1084:')
814c17ad94SBram Moolenaar  CheckScriptFailure([
824c17ad94SBram Moolenaar      'vim9script',
834c17ad94SBram Moolenaar      'def DeleteMe4()',
844c17ad94SBram Moolenaar      'enddef',
854c17ad94SBram Moolenaar      'def DoThat()',
864c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
874c17ad94SBram Moolenaar      'enddef',
884c17ad94SBram Moolenaar      'DoThat()',
894c17ad94SBram Moolenaar      ], 'E1084:')
90925e9fd6SBram Moolenaar
91925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
92cfcd011fSBram Moolenaar  var lines =<< trim END
93925e9fd6SBram Moolenaar      vim9script
94925e9fd6SBram Moolenaar      def g:Global(): string
95925e9fd6SBram Moolenaar        return "yes"
96925e9fd6SBram Moolenaar      enddef
97925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
98925e9fd6SBram Moolenaar      def! g:Global(): string
99925e9fd6SBram Moolenaar        return "no"
100925e9fd6SBram Moolenaar      enddef
101925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
102925e9fd6SBram Moolenaar      delfunc g:Global
103925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
104925e9fd6SBram Moolenaar  END
105925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
106925e9fd6SBram Moolenaar
107925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
108925e9fd6SBram Moolenaar  lines =<< trim END
109925e9fd6SBram Moolenaar      vim9script
110925e9fd6SBram Moolenaar      func g:Global()
111925e9fd6SBram Moolenaar        return "yes"
112925e9fd6SBram Moolenaar      endfunc
113925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
114925e9fd6SBram Moolenaar      def! g:Global(): string
115925e9fd6SBram Moolenaar        return "no"
116925e9fd6SBram Moolenaar      enddef
117925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
118925e9fd6SBram Moolenaar      delfunc g:Global
119925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
120925e9fd6SBram Moolenaar  END
121925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
122925e9fd6SBram Moolenaar
123925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
124925e9fd6SBram Moolenaar  lines =<< trim END
125925e9fd6SBram Moolenaar      vim9script
126925e9fd6SBram Moolenaar      def g:Global(): string
127925e9fd6SBram Moolenaar        return "yes"
128925e9fd6SBram Moolenaar      enddef
129925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
130925e9fd6SBram Moolenaar      func! g:Global()
131925e9fd6SBram Moolenaar        return "no"
132925e9fd6SBram Moolenaar      endfunc
133925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
134925e9fd6SBram Moolenaar      delfunc g:Global
135925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
136925e9fd6SBram Moolenaar  END
137925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1384c17ad94SBram Moolenaarenddef
1394c17ad94SBram Moolenaar
14008052228SBram Moolenaardef Test_wrong_type()
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
143cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
144cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
145599c89c8SBram Moolenaar
146cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
147cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
14842a480bfSBram Moolenaar
149cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
150cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
151cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
152cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
153cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
154cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
155cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
156cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
157cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
158cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
159cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
160a0a9f43aSBram Moolenaar
161cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
162cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
16308052228SBram Moolenaarenddef
1648a7d6542SBram Moolenaar
16510c65860SBram Moolenaardef Test_script_wrong_type()
16610c65860SBram Moolenaar  var lines =<< trim END
16710c65860SBram Moolenaar      vim9script
16810c65860SBram Moolenaar      var s:dict: dict<string>
16910c65860SBram Moolenaar      s:dict['a'] = ['x']
17010c65860SBram Moolenaar  END
17110c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
17210c65860SBram Moolenaarenddef
17310c65860SBram Moolenaar
17408052228SBram Moolenaardef Test_const()
175cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
176cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
177cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
17830fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
17930fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
180dbeecb2bSBram Moolenaar
181cfcd011fSBram Moolenaar  var lines =<< trim END
18230fd8204SBram Moolenaar    final list = [1, 2, 3]
183dbeecb2bSBram Moolenaar    list[0] = 4
1840b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
18530fd8204SBram Moolenaar    const other = [5, 6, 7]
1860b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
18771abe482SBram Moolenaar
188cfcd011fSBram Moolenaar    var varlist = [7, 8]
18930fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
19071abe482SBram Moolenaar    varlist[0] = 77
19123e2e115SBram Moolenaar    constlist[1][1] = 88
192cfcd011fSBram Moolenaar    var cl = constlist[1]
19371abe482SBram Moolenaar    cl[1] = 88
19471abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
19571abe482SBram Moolenaar
196e0de171eSBram Moolenaar    var vardict = {five: 5, six: 6}
197e0de171eSBram Moolenaar    const constdict = {one: 1, two: vardict, three: 3}
19871abe482SBram Moolenaar    vardict['five'] = 55
19923e2e115SBram Moolenaar    constdict['two']['six'] = 66
200cfcd011fSBram Moolenaar    var cd = constdict['two']
20171abe482SBram Moolenaar    cd['six'] = 66
202e0de171eSBram Moolenaar    constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
203dbeecb2bSBram Moolenaar  END
204dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
20508052228SBram Moolenaarenddef
2068a7d6542SBram Moolenaar
2070b4c66c6SBram Moolenaardef Test_const_bang()
208cfcd011fSBram Moolenaar  var lines =<< trim END
20930fd8204SBram Moolenaar      const var = 234
2100b4c66c6SBram Moolenaar      var = 99
2110b4c66c6SBram Moolenaar  END
2120b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
2130b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
2140b4c66c6SBram Moolenaar
2150b4c66c6SBram Moolenaar  lines =<< trim END
21630fd8204SBram Moolenaar      const ll = [2, 3, 4]
2170b4c66c6SBram Moolenaar      ll[0] = 99
2180b4c66c6SBram Moolenaar  END
2190b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2200b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2210b4c66c6SBram Moolenaar
2220b4c66c6SBram Moolenaar  lines =<< trim END
22330fd8204SBram Moolenaar      const ll = [2, 3, 4]
2240b4c66c6SBram Moolenaar      ll[3] = 99
2250b4c66c6SBram Moolenaar  END
2260b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2270b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2280b4c66c6SBram Moolenaar
2290b4c66c6SBram Moolenaar  lines =<< trim END
230e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2310b4c66c6SBram Moolenaar      dd["one"] = 99
2320b4c66c6SBram Moolenaar  END
2330b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2340b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2350b4c66c6SBram Moolenaar
2360b4c66c6SBram Moolenaar  lines =<< trim END
237e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2380b4c66c6SBram Moolenaar      dd["three"] = 99
2390b4c66c6SBram Moolenaar  END
2400b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2410b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2420b4c66c6SBram Moolenaarenddef
2430b4c66c6SBram Moolenaar
244df069eecSBram Moolenaardef Test_range_no_colon()
245d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
246d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
247d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
248d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
249df069eecSBram Moolenaarenddef
250df069eecSBram Moolenaar
251df069eecSBram Moolenaar
2528a7d6542SBram Moolenaardef Test_block()
253cfcd011fSBram Moolenaar  var outer = 1
2548a7d6542SBram Moolenaar  {
255cfcd011fSBram Moolenaar    var inner = 2
2568a7d6542SBram Moolenaar    assert_equal(1, outer)
2578a7d6542SBram Moolenaar    assert_equal(2, inner)
2588a7d6542SBram Moolenaar  }
2598a7d6542SBram Moolenaar  assert_equal(1, outer)
2603f1e9f00SBram Moolenaar
2613f1e9f00SBram Moolenaar  {|echo 'yes'|}
2628a7d6542SBram Moolenaarenddef
2638a7d6542SBram Moolenaar
26408052228SBram Moolenaardef Test_block_failure()
265cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
26608052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
26708052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
26808052228SBram Moolenaarenddef
2698a7d6542SBram Moolenaar
270fbbcd003SBram Moolenaardef Test_block_local_vars()
271fbbcd003SBram Moolenaar  var lines =<< trim END
272fbbcd003SBram Moolenaar      vim9script
273ed234f24SBram Moolenaar      v:testing = 1
274fbbcd003SBram Moolenaar      if true
275ed234f24SBram Moolenaar        var text = ['hello']
276ed234f24SBram Moolenaar        def SayHello(): list<string>
277fbbcd003SBram Moolenaar          return text
278fbbcd003SBram Moolenaar        enddef
279fbbcd003SBram Moolenaar        def SetText(v: string)
280ed234f24SBram Moolenaar          text = [v]
281fbbcd003SBram Moolenaar        enddef
282fbbcd003SBram Moolenaar      endif
283fbbcd003SBram Moolenaar
284fbbcd003SBram Moolenaar      if true
285ed234f24SBram Moolenaar        var text = ['again']
286ed234f24SBram Moolenaar        def SayAgain(): list<string>
287fbbcd003SBram Moolenaar          return text
288fbbcd003SBram Moolenaar        enddef
289fbbcd003SBram Moolenaar      endif
290ed234f24SBram Moolenaar
291ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
292ed234f24SBram Moolenaar      test_garbagecollect_now()
293ed234f24SBram Moolenaar
294fbbcd003SBram Moolenaar      defcompile
295fbbcd003SBram Moolenaar
296ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
297ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
298fbbcd003SBram Moolenaar
299fbbcd003SBram Moolenaar      SetText('foobar')
300ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
301ed234f24SBram Moolenaar
302ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
303ed234f24SBram Moolenaar      qall!
304fbbcd003SBram Moolenaar  END
305ed234f24SBram Moolenaar
306ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
307ed234f24SBram Moolenaar  # context gets garbage collected.
308ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
309ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
310ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
311ed234f24SBram Moolenaar
312ed234f24SBram Moolenaar  delete('Xscript')
313ed234f24SBram Moolenaar  delete('Xdidit')
314fbbcd003SBram Moolenaarenddef
315fbbcd003SBram Moolenaar
31639ca4127SBram Moolenaardef Test_block_local_vars_with_func()
31739ca4127SBram Moolenaar  var lines =<< trim END
31839ca4127SBram Moolenaar      vim9script
31939ca4127SBram Moolenaar      if true
32039ca4127SBram Moolenaar        var foo = 'foo'
32139ca4127SBram Moolenaar        if true
32239ca4127SBram Moolenaar          var bar = 'bar'
32339ca4127SBram Moolenaar          def Func(): list<string>
32439ca4127SBram Moolenaar            return [foo, bar]
32539ca4127SBram Moolenaar          enddef
32639ca4127SBram Moolenaar        endif
32739ca4127SBram Moolenaar      endif
32839ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
32939ca4127SBram Moolenaar      # "foo" and "bar"
33039ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
33139ca4127SBram Moolenaar  END
33239ca4127SBram Moolenaar  CheckScriptSuccess(lines)
33339ca4127SBram Moolenaarenddef
33439ca4127SBram Moolenaar
335e4db17fbSBram Moolenaar" legacy func for command that's defined later
336e4db17fbSBram Moolenaarfunc InvokeSomeCommand()
337e4db17fbSBram Moolenaar  SomeCommand
338e4db17fbSBram Moolenaarendfunc
339e4db17fbSBram Moolenaar
340e4db17fbSBram Moolenaardef Test_autocommand_block()
341e4db17fbSBram Moolenaar  com SomeCommand {
342e4db17fbSBram Moolenaar      g:someVar = 'some'
343e4db17fbSBram Moolenaar    }
344e4db17fbSBram Moolenaar  InvokeSomeCommand()
345e4db17fbSBram Moolenaar  assert_equal('some', g:someVar)
346e4db17fbSBram Moolenaar
347e4db17fbSBram Moolenaar  delcommand SomeCommand
348e4db17fbSBram Moolenaar  unlet g:someVar
349e4db17fbSBram Moolenaarenddef
350e4db17fbSBram Moolenaar
351e4db17fbSBram Moolenaardef Test_command_block()
352e4db17fbSBram Moolenaar  au BufNew *.xml {
353e4db17fbSBram Moolenaar      g:otherVar = 'other'
354e4db17fbSBram Moolenaar    }
355e4db17fbSBram Moolenaar  split other.xml
356e4db17fbSBram Moolenaar  assert_equal('other', g:otherVar)
357e4db17fbSBram Moolenaar
358e4db17fbSBram Moolenaar  bwipe!
359e4db17fbSBram Moolenaar  au! BufNew *.xml
360e4db17fbSBram Moolenaar  unlet g:otherVar
361e4db17fbSBram Moolenaarenddef
362e4db17fbSBram Moolenaar
363d032f34aSBram Moolenaarfunc g:NoSuchFunc()
364d032f34aSBram Moolenaar  echo 'none'
365d032f34aSBram Moolenaarendfunc
366d032f34aSBram Moolenaar
3679e1d9e34SBram Moolenaardef Test_try_catch_throw()
368cfcd011fSBram Moolenaar  var l = []
3697a092245SBram Moolenaar  try # comment
3708a7d6542SBram Moolenaar    add(l, '1')
3718a7d6542SBram Moolenaar    throw 'wrong'
3728a7d6542SBram Moolenaar    add(l, '2')
3737a092245SBram Moolenaar  catch # comment
3748a7d6542SBram Moolenaar    add(l, v:exception)
3757a092245SBram Moolenaar  finally # comment
3768a7d6542SBram Moolenaar    add(l, '3')
3777a092245SBram Moolenaar  endtry # comment
3788a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
37968d130c6SBram Moolenaar
380e859312eSBram Moolenaar  l = []
381e859312eSBram Moolenaar  try
382e859312eSBram Moolenaar    try
383e859312eSBram Moolenaar      add(l, '1')
384e859312eSBram Moolenaar      throw 'wrong'
385e859312eSBram Moolenaar      add(l, '2')
386e859312eSBram Moolenaar    catch /right/
387e859312eSBram Moolenaar      add(l, v:exception)
388e859312eSBram Moolenaar    endtry
389e859312eSBram Moolenaar  catch /wrong/
390e859312eSBram Moolenaar    add(l, 'caught')
391373863edSBram Moolenaar  fina
392e859312eSBram Moolenaar    add(l, 'finally')
393e859312eSBram Moolenaar  endtry
394e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
395e859312eSBram Moolenaar
396cfcd011fSBram Moolenaar  var n: number
39768d130c6SBram Moolenaar  try
39868d130c6SBram Moolenaar    n = l[3]
39968d130c6SBram Moolenaar  catch /E684:/
40068d130c6SBram Moolenaar    n = 99
40168d130c6SBram Moolenaar  endtry
40268d130c6SBram Moolenaar  assert_equal(99, n)
40368d130c6SBram Moolenaar
40469f7050cSBram Moolenaar  var done = 'no'
40569f7050cSBram Moolenaar  if 0
40669f7050cSBram Moolenaar    try | catch | endtry
40769f7050cSBram Moolenaar  else
40869f7050cSBram Moolenaar    done = 'yes'
40969f7050cSBram Moolenaar  endif
41069f7050cSBram Moolenaar  assert_equal('yes', done)
41169f7050cSBram Moolenaar
41269f7050cSBram Moolenaar  done = 'no'
41369f7050cSBram Moolenaar  if 1
41469f7050cSBram Moolenaar    done = 'yes'
41569f7050cSBram Moolenaar  else
41669f7050cSBram Moolenaar    try | catch | endtry
41769f7050cSBram Moolenaar    done = 'never'
41869f7050cSBram Moolenaar  endif
41969f7050cSBram Moolenaar  assert_equal('yes', done)
42069f7050cSBram Moolenaar
42169f7050cSBram Moolenaar  if 1
42269f7050cSBram Moolenaar  else
42369f7050cSBram Moolenaar    try | catch /pat/ | endtry
42469f7050cSBram Moolenaar    try | catch /pat/
42569f7050cSBram Moolenaar    endtry
42669f7050cSBram Moolenaar    try
42769f7050cSBram Moolenaar    catch /pat/ | endtry
42869f7050cSBram Moolenaar    try
42969f7050cSBram Moolenaar    catch /pat/
43069f7050cSBram Moolenaar    endtry
43169f7050cSBram Moolenaar  endif
43269f7050cSBram Moolenaar
43368d130c6SBram Moolenaar  try
434cc673e74SBram Moolenaar    # string slice returns a string, not a number
43568d130c6SBram Moolenaar    n = g:astring[3]
4365e654230SBram Moolenaar  catch /E1012:/
43768d130c6SBram Moolenaar    n = 77
43868d130c6SBram Moolenaar  endtry
43968d130c6SBram Moolenaar  assert_equal(77, n)
44068d130c6SBram Moolenaar
44168d130c6SBram Moolenaar  try
44268d130c6SBram Moolenaar    n = l[g:astring]
4435e654230SBram Moolenaar  catch /E1012:/
44456acb094SBram Moolenaar    n = 88
44568d130c6SBram Moolenaar  endtry
44656acb094SBram Moolenaar  assert_equal(88, n)
44768d130c6SBram Moolenaar
44868d130c6SBram Moolenaar  try
44968d130c6SBram Moolenaar    n = s:does_not_exist
45068d130c6SBram Moolenaar  catch /E121:/
451f0b9f43cSBram Moolenaar    n = 111
452f0b9f43cSBram Moolenaar  endtry
453f0b9f43cSBram Moolenaar  assert_equal(111, n)
454f0b9f43cSBram Moolenaar
455f0b9f43cSBram Moolenaar  try
456f0b9f43cSBram Moolenaar    n = g:does_not_exist
457f0b9f43cSBram Moolenaar  catch /E121:/
45868d130c6SBram Moolenaar    n = 121
45968d130c6SBram Moolenaar  endtry
46068d130c6SBram Moolenaar  assert_equal(121, n)
46168d130c6SBram Moolenaar
462e0de171eSBram Moolenaar  var d = {one: 1}
46368d130c6SBram Moolenaar  try
46468d130c6SBram Moolenaar    n = d[g:astring]
46568d130c6SBram Moolenaar  catch /E716:/
46668d130c6SBram Moolenaar    n = 222
46768d130c6SBram Moolenaar  endtry
46868d130c6SBram Moolenaar  assert_equal(222, n)
469f0b9f43cSBram Moolenaar
470f0b9f43cSBram Moolenaar  try
471f0b9f43cSBram Moolenaar    n = -g:astring
472cd6b4f30SBram Moolenaar  catch /E1012:/
473f0b9f43cSBram Moolenaar    n = 233
474f0b9f43cSBram Moolenaar  endtry
475f0b9f43cSBram Moolenaar  assert_equal(233, n)
476f0b9f43cSBram Moolenaar
477f0b9f43cSBram Moolenaar  try
478f0b9f43cSBram Moolenaar    n = +g:astring
479cd6b4f30SBram Moolenaar  catch /E1012:/
480f0b9f43cSBram Moolenaar    n = 244
481f0b9f43cSBram Moolenaar  endtry
482f0b9f43cSBram Moolenaar  assert_equal(244, n)
483f0b9f43cSBram Moolenaar
484f0b9f43cSBram Moolenaar  try
485f0b9f43cSBram Moolenaar    n = +g:alist
486cd6b4f30SBram Moolenaar  catch /E1012:/
487f0b9f43cSBram Moolenaar    n = 255
488f0b9f43cSBram Moolenaar  endtry
489f0b9f43cSBram Moolenaar  assert_equal(255, n)
490f0b9f43cSBram Moolenaar
491cfcd011fSBram Moolenaar  var nd: dict<any>
492f0b9f43cSBram Moolenaar  try
4932e5910bfSBram Moolenaar    nd = {[g:alist]: 1}
4942e5910bfSBram Moolenaar  catch /E1105:/
495f0b9f43cSBram Moolenaar    n = 266
496f0b9f43cSBram Moolenaar  endtry
497f0b9f43cSBram Moolenaar  assert_equal(266, n)
498f0b9f43cSBram Moolenaar
499f0b9f43cSBram Moolenaar  try
500f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
501f0b9f43cSBram Moolenaar  catch /E1093:/
502f0b9f43cSBram Moolenaar    n = 277
503f0b9f43cSBram Moolenaar  endtry
504f0b9f43cSBram Moolenaar  assert_equal(277, n)
505f0b9f43cSBram Moolenaar
506e859312eSBram Moolenaar  try
507e859312eSBram Moolenaar    &ts = g:astring
5085e654230SBram Moolenaar  catch /E1012:/
509e859312eSBram Moolenaar    n = 288
510e859312eSBram Moolenaar  endtry
511e859312eSBram Moolenaar  assert_equal(288, n)
512e859312eSBram Moolenaar
513e859312eSBram Moolenaar  try
514e859312eSBram Moolenaar    &backspace = 'asdf'
515e859312eSBram Moolenaar  catch /E474:/
516e859312eSBram Moolenaar    n = 299
517e859312eSBram Moolenaar  endtry
518e859312eSBram Moolenaar  assert_equal(299, n)
519e859312eSBram Moolenaar
520e859312eSBram Moolenaar  l = [1]
521e859312eSBram Moolenaar  try
522e859312eSBram Moolenaar    l[3] = 3
523e859312eSBram Moolenaar  catch /E684:/
524e859312eSBram Moolenaar    n = 300
525e859312eSBram Moolenaar  endtry
526e859312eSBram Moolenaar  assert_equal(300, n)
527e859312eSBram Moolenaar
528e859312eSBram Moolenaar  try
529e859312eSBram Moolenaar    unlet g:does_not_exist
530e859312eSBram Moolenaar  catch /E108:/
531e859312eSBram Moolenaar    n = 322
532e859312eSBram Moolenaar  endtry
533e859312eSBram Moolenaar  assert_equal(322, n)
534e859312eSBram Moolenaar
535e859312eSBram Moolenaar  try
5362bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
537e859312eSBram Moolenaar  catch /E721:/
538e859312eSBram Moolenaar    n = 333
539e859312eSBram Moolenaar  endtry
540e859312eSBram Moolenaar  assert_equal(333, n)
541e859312eSBram Moolenaar
542e859312eSBram Moolenaar  try
543e859312eSBram Moolenaar    l = DeletedFunc()
544e859312eSBram Moolenaar  catch /E933:/
545e859312eSBram Moolenaar    n = 344
546e859312eSBram Moolenaar  endtry
547e859312eSBram Moolenaar  assert_equal(344, n)
548d032f34aSBram Moolenaar
549d032f34aSBram Moolenaar  try
550a764e73dSYegappan Lakshmanan    echo range(1, 2, 0)
551a764e73dSYegappan Lakshmanan  catch /E726:/
552d032f34aSBram Moolenaar    n = 355
553d032f34aSBram Moolenaar  endtry
554d032f34aSBram Moolenaar  assert_equal(355, n)
555d032f34aSBram Moolenaar
556cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
557d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
558d032f34aSBram Moolenaar  try
559d032f34aSBram Moolenaar    echo P()
560d032f34aSBram Moolenaar  catch /E117:/
561d032f34aSBram Moolenaar    n = 366
562d032f34aSBram Moolenaar  endtry
563d032f34aSBram Moolenaar  assert_equal(366, n)
564d032f34aSBram Moolenaar
565d032f34aSBram Moolenaar  try
566d032f34aSBram Moolenaar    echo g:NoSuchFunc()
567d032f34aSBram Moolenaar  catch /E117:/
568d032f34aSBram Moolenaar    n = 377
569d032f34aSBram Moolenaar  endtry
570d032f34aSBram Moolenaar  assert_equal(377, n)
571d032f34aSBram Moolenaar
572d032f34aSBram Moolenaar  try
573d032f34aSBram Moolenaar    echo g:alist + 4
574d032f34aSBram Moolenaar  catch /E745:/
575d032f34aSBram Moolenaar    n = 388
576d032f34aSBram Moolenaar  endtry
577d032f34aSBram Moolenaar  assert_equal(388, n)
578d032f34aSBram Moolenaar
579d032f34aSBram Moolenaar  try
580d032f34aSBram Moolenaar    echo 4 + g:alist
581d032f34aSBram Moolenaar  catch /E745:/
582d032f34aSBram Moolenaar    n = 399
583d032f34aSBram Moolenaar  endtry
584d032f34aSBram Moolenaar  assert_equal(399, n)
585d032f34aSBram Moolenaar
586d032f34aSBram Moolenaar  try
587d032f34aSBram Moolenaar    echo g:alist.member
588d032f34aSBram Moolenaar  catch /E715:/
589d032f34aSBram Moolenaar    n = 400
590d032f34aSBram Moolenaar  endtry
591d032f34aSBram Moolenaar  assert_equal(400, n)
592d032f34aSBram Moolenaar
593d032f34aSBram Moolenaar  try
594d032f34aSBram Moolenaar    echo d.member
595d032f34aSBram Moolenaar  catch /E716:/
596d032f34aSBram Moolenaar    n = 411
597d032f34aSBram Moolenaar  endtry
598d032f34aSBram Moolenaar  assert_equal(411, n)
599d9d7789bSBram Moolenaar
600d9d7789bSBram Moolenaar  var counter = 0
601d9d7789bSBram Moolenaar  for i in range(4)
602d9d7789bSBram Moolenaar    try
603d9d7789bSBram Moolenaar      eval [][0]
604d9d7789bSBram Moolenaar    catch
605d9d7789bSBram Moolenaar    endtry
606d9d7789bSBram Moolenaar    counter += 1
607d9d7789bSBram Moolenaar  endfor
608d9d7789bSBram Moolenaar  assert_equal(4, counter)
6097e82c5f3SBram Moolenaar
6109fa5dabeSBram Moolenaar  # no requirement for spaces before |
6119fa5dabeSBram Moolenaar  try|echo 0|catch|endtry
6129fa5dabeSBram Moolenaar
6137e82c5f3SBram Moolenaar  # return in finally after empty catch
6147e82c5f3SBram Moolenaar  def ReturnInFinally(): number
6157e82c5f3SBram Moolenaar    try
6167e82c5f3SBram Moolenaar    finally
6177e82c5f3SBram Moolenaar      return 4
6187e82c5f3SBram Moolenaar    endtry
6197e82c5f3SBram Moolenaar    return 2
6207e82c5f3SBram Moolenaar  enddef
6217e82c5f3SBram Moolenaar  assert_equal(4, ReturnInFinally())
6228ac681a2SBram Moolenaar
6238ac681a2SBram Moolenaar  var lines =<< trim END
6248ac681a2SBram Moolenaar      vim9script
6258ac681a2SBram Moolenaar      try
6268ac681a2SBram Moolenaar        acos('0.5')
6278ac681a2SBram Moolenaar          ->setline(1)
6288ac681a2SBram Moolenaar      catch
6298ac681a2SBram Moolenaar        g:caught = v:exception
6308ac681a2SBram Moolenaar      endtry
6318ac681a2SBram Moolenaar  END
6328ac681a2SBram Moolenaar  CheckScriptSuccess(lines)
6334490ec4eSYegappan Lakshmanan  assert_match('E1219: Float or Number required for argument 1', g:caught)
6348ac681a2SBram Moolenaar  unlet g:caught
6354197828dSBram Moolenaar
6364197828dSBram Moolenaar  # missing catch and/or finally
6374197828dSBram Moolenaar  lines =<< trim END
6384197828dSBram Moolenaar      vim9script
6394197828dSBram Moolenaar      try
6404197828dSBram Moolenaar        echo 'something'
6414197828dSBram Moolenaar      endtry
6424197828dSBram Moolenaar  END
6434197828dSBram Moolenaar  CheckScriptFailure(lines, 'E1032:')
64484934998Srbtnn
64584934998Srbtnn  # skipping try-finally-endtry when try-finally-endtry is used in another block
64684934998Srbtnn  lines =<< trim END
64784934998Srbtnn      if v:true
64884934998Srbtnn        try
64984934998Srbtnn        finally
65084934998Srbtnn        endtry
65184934998Srbtnn      else
65284934998Srbtnn        try
65384934998Srbtnn        finally
65484934998Srbtnn        endtry
65584934998Srbtnn      endif
65684934998Srbtnn  END
65784934998Srbtnn  CheckDefAndScriptSuccess(lines)
6588a7d6542SBram Moolenaarenddef
6598a7d6542SBram Moolenaar
6603f987b59SBram Moolenaardef Test_try_in_catch()
6613f987b59SBram Moolenaar  var lines =<< trim END
6623f987b59SBram Moolenaar      vim9script
6633f987b59SBram Moolenaar      var seq = []
6643f987b59SBram Moolenaar      def DoIt()
6653f987b59SBram Moolenaar        try
6663f987b59SBram Moolenaar          seq->add('throw 1')
6673f987b59SBram Moolenaar          eval [][0]
6683f987b59SBram Moolenaar          seq->add('notreached')
6693f987b59SBram Moolenaar        catch
6703f987b59SBram Moolenaar          seq->add('catch')
6713f987b59SBram Moolenaar          try
6723f987b59SBram Moolenaar            seq->add('throw 2')
6733f987b59SBram Moolenaar            eval [][0]
6743f987b59SBram Moolenaar            seq->add('notreached')
6753f987b59SBram Moolenaar          catch /nothing/
6763f987b59SBram Moolenaar            seq->add('notreached')
6773f987b59SBram Moolenaar          endtry
6783f987b59SBram Moolenaar          seq->add('done')
6793f987b59SBram Moolenaar        endtry
6803f987b59SBram Moolenaar      enddef
6813f987b59SBram Moolenaar      DoIt()
6823f987b59SBram Moolenaar      assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
6833f987b59SBram Moolenaar  END
6843f987b59SBram Moolenaarenddef
6853f987b59SBram Moolenaar
686d3d8feebSBram Moolenaardef Test_error_in_catch()
687d3d8feebSBram Moolenaar  var lines =<< trim END
688d3d8feebSBram Moolenaar      try
689d3d8feebSBram Moolenaar        eval [][0]
690d3d8feebSBram Moolenaar      catch /E684:/
691d3d8feebSBram Moolenaar        eval [][0]
692d3d8feebSBram Moolenaar      endtry
693d3d8feebSBram Moolenaar  END
694d3d8feebSBram Moolenaar  CheckDefExecFailure(lines, 'E684:', 4)
695d3d8feebSBram Moolenaarenddef
696d3d8feebSBram Moolenaar
6972e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to
6982e34c34bSBram Moolenaardef TryContinueFunc()
6992e34c34bSBram Moolenaar while g:Count < 2
7002e34c34bSBram Moolenaar   g:sequence ..= 't'
7012e34c34bSBram Moolenaar    try
7022e34c34bSBram Moolenaar      echoerr 'Test'
7032e34c34bSBram Moolenaar    catch
7042e34c34bSBram Moolenaar      g:Count += 1
7052e34c34bSBram Moolenaar      g:sequence ..= 'c'
7062e34c34bSBram Moolenaar      continue
7072e34c34bSBram Moolenaar    endtry
7082e34c34bSBram Moolenaar    g:sequence ..= 'e'
7092e34c34bSBram Moolenaar    g:Count += 1
7102e34c34bSBram Moolenaar  endwhile
7112e34c34bSBram Moolenaarenddef
7122e34c34bSBram Moolenaar
7132e34c34bSBram Moolenaardef Test_continue_in_try_in_while()
7142e34c34bSBram Moolenaar  g:Count = 0
7152e34c34bSBram Moolenaar  g:sequence = ''
7162e34c34bSBram Moolenaar  TryContinueFunc()
7172e34c34bSBram Moolenaar  assert_equal('tctc', g:sequence)
7182e34c34bSBram Moolenaar  unlet g:Count
7192e34c34bSBram Moolenaar  unlet g:sequence
7202e34c34bSBram Moolenaarenddef
7212e34c34bSBram Moolenaar
7229cb577a6SBram Moolenaardef Test_nocatch_return_in_try()
7239cb577a6SBram Moolenaar  # return in try block returns normally
7249cb577a6SBram Moolenaar  def ReturnInTry(): string
7259cb577a6SBram Moolenaar    try
7269cb577a6SBram Moolenaar      return '"some message"'
7279cb577a6SBram Moolenaar    catch
7289cb577a6SBram Moolenaar    endtry
7299cb577a6SBram Moolenaar    return 'not reached'
7309cb577a6SBram Moolenaar  enddef
7319cb577a6SBram Moolenaar  exe 'echoerr ' .. ReturnInTry()
7329cb577a6SBram Moolenaarenddef
7339cb577a6SBram Moolenaar
7341430ceebSBram Moolenaardef Test_cnext_works_in_catch()
7351430ceebSBram Moolenaar  var lines =<< trim END
7361430ceebSBram Moolenaar      vim9script
737c323527dSBram Moolenaar      au BufEnter * eval 1 + 2
7381430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
7391430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
7401430ceebSBram Moolenaar      var items = [
7411430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
7421430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
7431430ceebSBram Moolenaar        ]
7441430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
7451430ceebSBram Moolenaar      cwindow
7461430ceebSBram Moolenaar
7471430ceebSBram Moolenaar      def CnextOrCfirst()
7481430ceebSBram Moolenaar        # if cnext fails, cfirst is used
7491430ceebSBram Moolenaar        try
7501430ceebSBram Moolenaar          cnext
7511430ceebSBram Moolenaar        catch
7521430ceebSBram Moolenaar          cfirst
7531430ceebSBram Moolenaar        endtry
7541430ceebSBram Moolenaar      enddef
7551430ceebSBram Moolenaar
7561430ceebSBram Moolenaar      CnextOrCfirst()
7571430ceebSBram Moolenaar      CnextOrCfirst()
7581430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
7591430ceebSBram Moolenaar      qall
7601430ceebSBram Moolenaar  END
7611430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
7621430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
7631430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
7641430ceebSBram Moolenaar
7651430ceebSBram Moolenaar  delete('Xfile1')
7661430ceebSBram Moolenaar  delete('Xfile2')
7671430ceebSBram Moolenaar  delete('XCatchCnext')
7681430ceebSBram Moolenaar  delete('Xresult')
7691430ceebSBram Moolenaarenddef
7701430ceebSBram Moolenaar
7719e1d9e34SBram Moolenaardef Test_throw_skipped()
7729e1d9e34SBram Moolenaar  if 0
7739e1d9e34SBram Moolenaar    throw dontgethere
7749e1d9e34SBram Moolenaar  endif
7759e1d9e34SBram Moolenaarenddef
7769e1d9e34SBram Moolenaar
7778f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
7788f81b22eSBram Moolenaar  var lines =<< trim END
7798f81b22eSBram Moolenaar    vim9script
7808f81b22eSBram Moolenaar    def Func()
7818f81b22eSBram Moolenaar      throw 'error'
7828f81b22eSBram Moolenaar    enddef
7838f81b22eSBram Moolenaar    silent! Func()
7848f81b22eSBram Moolenaar  END
7858f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
7868f81b22eSBram Moolenaar  source XthrowSilenced
7878f81b22eSBram Moolenaar  delete('XthrowSilenced')
7888f81b22eSBram Moolenaarenddef
7898f81b22eSBram Moolenaar
790e859312eSBram Moolenaardef DeletedFunc(): list<any>
791e859312eSBram Moolenaar  return ['delete me']
792e859312eSBram Moolenaarenddef
793e859312eSBram Moolenaardefcompile
794e859312eSBram Moolenaardelfunc DeletedFunc
795e859312eSBram Moolenaar
796257cc5eeSBram Moolenaardef ThrowFromDef()
797a72cfb80SBram Moolenaar  throw "getout" # comment
798257cc5eeSBram Moolenaarenddef
799257cc5eeSBram Moolenaar
800257cc5eeSBram Moolenaarfunc CatchInFunc()
801257cc5eeSBram Moolenaar  try
802257cc5eeSBram Moolenaar    call ThrowFromDef()
803257cc5eeSBram Moolenaar  catch
804257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
805257cc5eeSBram Moolenaar  endtry
806257cc5eeSBram Moolenaarendfunc
807257cc5eeSBram Moolenaar
808257cc5eeSBram Moolenaardef CatchInDef()
809257cc5eeSBram Moolenaar  try
810257cc5eeSBram Moolenaar    ThrowFromDef()
811257cc5eeSBram Moolenaar  catch
812257cc5eeSBram Moolenaar    g:thrown_def = v:exception
813257cc5eeSBram Moolenaar  endtry
814257cc5eeSBram Moolenaarenddef
815257cc5eeSBram Moolenaar
816f575adffSBram Moolenaardef ReturnFinally(): string
817f575adffSBram Moolenaar  try
818f575adffSBram Moolenaar    return 'intry'
819373863edSBram Moolenaar  finall
820f575adffSBram Moolenaar    g:in_finally = 'finally'
821f575adffSBram Moolenaar  endtry
822f575adffSBram Moolenaar  return 'end'
823f575adffSBram Moolenaarenddef
824f575adffSBram Moolenaar
825257cc5eeSBram Moolenaardef Test_try_catch_nested()
826257cc5eeSBram Moolenaar  CatchInFunc()
827257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
828257cc5eeSBram Moolenaar
829257cc5eeSBram Moolenaar  CatchInDef()
830257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
831f575adffSBram Moolenaar
832f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
833f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
834d3d8feebSBram Moolenaar
835d3d8feebSBram Moolenaar  var l = []
836d3d8feebSBram Moolenaar  try
837d3d8feebSBram Moolenaar    l->add('1')
838d3d8feebSBram Moolenaar    throw 'bad'
839d3d8feebSBram Moolenaar    l->add('x')
840d3d8feebSBram Moolenaar  catch /bad/
841d3d8feebSBram Moolenaar    l->add('2')
842d3d8feebSBram Moolenaar    try
843d3d8feebSBram Moolenaar      l->add('3')
844d3d8feebSBram Moolenaar      throw 'one'
845d3d8feebSBram Moolenaar      l->add('x')
846d3d8feebSBram Moolenaar    catch /one/
847d3d8feebSBram Moolenaar      l->add('4')
848d3d8feebSBram Moolenaar      try
849d3d8feebSBram Moolenaar        l->add('5')
850d3d8feebSBram Moolenaar        throw 'more'
851d3d8feebSBram Moolenaar        l->add('x')
852d3d8feebSBram Moolenaar      catch /more/
853d3d8feebSBram Moolenaar        l->add('6')
854d3d8feebSBram Moolenaar      endtry
855d3d8feebSBram Moolenaar    endtry
856d3d8feebSBram Moolenaar  endtry
857d3d8feebSBram Moolenaar  assert_equal(['1', '2', '3', '4', '5', '6'], l)
858834193afSBram Moolenaar
859834193afSBram Moolenaar  l = []
860834193afSBram Moolenaar  try
861834193afSBram Moolenaar    try
862834193afSBram Moolenaar      l->add('1')
863834193afSBram Moolenaar      throw 'foo'
864834193afSBram Moolenaar      l->add('x')
865834193afSBram Moolenaar    catch
866834193afSBram Moolenaar      l->add('2')
867834193afSBram Moolenaar      throw 'bar'
868834193afSBram Moolenaar      l->add('x')
869834193afSBram Moolenaar    finally
870834193afSBram Moolenaar      l->add('3')
871834193afSBram Moolenaar    endtry
872834193afSBram Moolenaar    l->add('x')
873834193afSBram Moolenaar  catch /bar/
874834193afSBram Moolenaar    l->add('4')
875834193afSBram Moolenaar  endtry
876834193afSBram Moolenaar  assert_equal(['1', '2', '3', '4'], l)
877f575adffSBram Moolenaarenddef
878f575adffSBram Moolenaar
8799939f57bSBram Moolenaardef TryOne(): number
8809939f57bSBram Moolenaar  try
8819939f57bSBram Moolenaar    return 0
8829939f57bSBram Moolenaar  catch
8839939f57bSBram Moolenaar  endtry
8849939f57bSBram Moolenaar  return 0
8859939f57bSBram Moolenaarenddef
8869939f57bSBram Moolenaar
8879939f57bSBram Moolenaardef TryTwo(n: number): string
8889939f57bSBram Moolenaar  try
889cfcd011fSBram Moolenaar    var x = {}
8909939f57bSBram Moolenaar  catch
8919939f57bSBram Moolenaar  endtry
8929939f57bSBram Moolenaar  return 'text'
8939939f57bSBram Moolenaarenddef
8949939f57bSBram Moolenaar
8959939f57bSBram Moolenaardef Test_try_catch_twice()
8969939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
8979939f57bSBram Moolenaarenddef
8989939f57bSBram Moolenaar
899f575adffSBram Moolenaardef Test_try_catch_match()
900cfcd011fSBram Moolenaar  var seq = 'a'
901f575adffSBram Moolenaar  try
902f575adffSBram Moolenaar    throw 'something'
903f575adffSBram Moolenaar  catch /nothing/
904f575adffSBram Moolenaar    seq ..= 'x'
905f575adffSBram Moolenaar  catch /some/
906f575adffSBram Moolenaar    seq ..= 'b'
907f575adffSBram Moolenaar  catch /asdf/
908f575adffSBram Moolenaar    seq ..= 'x'
909e8c4abbbSBram Moolenaar  catch ?a\?sdf?
910e8c4abbbSBram Moolenaar    seq ..= 'y'
911f575adffSBram Moolenaar  finally
912f575adffSBram Moolenaar    seq ..= 'c'
913f575adffSBram Moolenaar  endtry
914f575adffSBram Moolenaar  assert_equal('abc', seq)
915257cc5eeSBram Moolenaarenddef
916257cc5eeSBram Moolenaar
917e8c4abbbSBram Moolenaardef Test_try_catch_fails()
918d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
919d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
920d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
921d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
922d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
923d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
924d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
925d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
92613106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
927d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
928585fea7bSBram Moolenaar
929e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
930d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
931e8c4abbbSBram Moolenaarenddef
932e8c4abbbSBram Moolenaar
9337c5b3c03SBram Moolenaardef Try_catch_skipped()
9347c5b3c03SBram Moolenaar  var l = []
9357c5b3c03SBram Moolenaar  try
9367c5b3c03SBram Moolenaar  finally
9377c5b3c03SBram Moolenaar  endtry
9387c5b3c03SBram Moolenaar
9397c5b3c03SBram Moolenaar  if 1
9407c5b3c03SBram Moolenaar  else
9417c5b3c03SBram Moolenaar    try
9427c5b3c03SBram Moolenaar    endtry
9437c5b3c03SBram Moolenaar  endif
9447c5b3c03SBram Moolenaarenddef
9457c5b3c03SBram Moolenaar
9467c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction.
9477c5b3c03SBram Moolenaardef Test_try_catch_skipped()
9487c5b3c03SBram Moolenaar  var instr = execute('disassemble Try_catch_skipped')
9497c5b3c03SBram Moolenaar  assert_match("NEWLIST size 0\n", instr)
9507c5b3c03SBram Moolenaarenddef
9517c5b3c03SBram Moolenaar
9527c5b3c03SBram Moolenaar
9537c5b3c03SBram Moolenaar
954006ad48bSBram Moolenaardef Test_throw_vimscript()
955f5be8cdbSBram Moolenaar  # only checks line continuation
956cfcd011fSBram Moolenaar  var lines =<< trim END
957006ad48bSBram Moolenaar      vim9script
958006ad48bSBram Moolenaar      try
959006ad48bSBram Moolenaar        throw 'one'
960006ad48bSBram Moolenaar              .. 'two'
961006ad48bSBram Moolenaar      catch
962006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
963006ad48bSBram Moolenaar      endtry
964006ad48bSBram Moolenaar  END
965006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
9661e021e63SBram Moolenaar
9671e021e63SBram Moolenaar  lines =<< trim END
9681e021e63SBram Moolenaar    vim9script
969352134bbSBram Moolenaar    @r = ''
9701e021e63SBram Moolenaar    def Func()
9711e021e63SBram Moolenaar      throw @r
9721e021e63SBram Moolenaar    enddef
9731e021e63SBram Moolenaar    var result = ''
9741e021e63SBram Moolenaar    try
9751e021e63SBram Moolenaar      Func()
9761e021e63SBram Moolenaar    catch /E1129:/
9771e021e63SBram Moolenaar      result = 'caught'
9781e021e63SBram Moolenaar    endtry
9791e021e63SBram Moolenaar    assert_equal('caught', result)
9801e021e63SBram Moolenaar  END
9811e021e63SBram Moolenaar  CheckScriptSuccess(lines)
982006ad48bSBram Moolenaarenddef
983006ad48bSBram Moolenaar
984ed677f55SBram Moolenaardef Test_error_in_nested_function()
98503dfde2bSBram Moolenaar  # an error in a nested :function aborts executing in the calling :def function
986cfcd011fSBram Moolenaar  var lines =<< trim END
987ed677f55SBram Moolenaar      vim9script
988ed677f55SBram Moolenaar      def Func()
989ed677f55SBram Moolenaar        Error()
990ed677f55SBram Moolenaar        g:test_var = 1
991ed677f55SBram Moolenaar      enddef
992ed677f55SBram Moolenaar      func Error() abort
993ed677f55SBram Moolenaar        eval [][0]
994ed677f55SBram Moolenaar      endfunc
995ed677f55SBram Moolenaar      Func()
996ed677f55SBram Moolenaar  END
997ed677f55SBram Moolenaar  g:test_var = 0
998ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
999ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
1000ed677f55SBram Moolenaarenddef
1001ed677f55SBram Moolenaar
1002227c58a4SBram Moolenaardef Test_abort_after_error()
1003227c58a4SBram Moolenaar  var lines =<< trim END
1004227c58a4SBram Moolenaar      vim9script
1005227c58a4SBram Moolenaar      while true
1006227c58a4SBram Moolenaar        echo notfound
1007227c58a4SBram Moolenaar      endwhile
1008227c58a4SBram Moolenaar      g:gotthere = true
1009227c58a4SBram Moolenaar  END
1010227c58a4SBram Moolenaar  g:gotthere = false
1011227c58a4SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
1012227c58a4SBram Moolenaar  assert_false(g:gotthere)
1013227c58a4SBram Moolenaar  unlet g:gotthere
1014227c58a4SBram Moolenaarenddef
1015227c58a4SBram Moolenaar
101637c83711SBram Moolenaardef Test_cexpr_vimscript()
1017f5be8cdbSBram Moolenaar  # only checks line continuation
101837c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
1019cfcd011fSBram Moolenaar  var lines =<< trim END
102037c83711SBram Moolenaar      vim9script
102137c83711SBram Moolenaar      cexpr 'File'
102237c83711SBram Moolenaar                .. ' someFile' ..
102337c83711SBram Moolenaar                   ' line 19'
102437c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
102537c83711SBram Moolenaar  END
102637c83711SBram Moolenaar  CheckScriptSuccess(lines)
102737c83711SBram Moolenaar  set errorformat&
102837c83711SBram Moolenaarenddef
102937c83711SBram Moolenaar
1030c9edd6b5SBram Moolenaardef Test_statusline_syntax()
1031c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
1032cfcd011fSBram Moolenaar  var lines =<< trim END
1033c9edd6b5SBram Moolenaar      vim9script
1034c9edd6b5SBram Moolenaar      func g:Status()
1035c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
1036c9edd6b5SBram Moolenaar      endfunc
1037c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
1038c9edd6b5SBram Moolenaar      redrawstatus
1039c9edd6b5SBram Moolenaar      set laststatus statusline=
1040c9edd6b5SBram Moolenaar  END
1041c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1042c9edd6b5SBram Moolenaarenddef
1043c9edd6b5SBram Moolenaar
1044b209750bSBram Moolenaardef Test_list_vimscript()
1045b209750bSBram Moolenaar  # checks line continuation and comments
1046cfcd011fSBram Moolenaar  var lines =<< trim END
1047b209750bSBram Moolenaar      vim9script
1048cfcd011fSBram Moolenaar      var mylist = [
1049b209750bSBram Moolenaar            'one',
1050b209750bSBram Moolenaar            # comment
1051b209750bSBram Moolenaar            'two', # empty line follows
1052b209750bSBram Moolenaar
1053b209750bSBram Moolenaar            'three',
1054b209750bSBram Moolenaar            ]
1055b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1056b209750bSBram Moolenaar  END
1057b209750bSBram Moolenaar  CheckScriptSuccess(lines)
105866250c93SBram Moolenaar
105966250c93SBram Moolenaar  # check all lines from heredoc are kept
106066250c93SBram Moolenaar  lines =<< trim END
106166250c93SBram Moolenaar      # comment 1
106266250c93SBram Moolenaar      two
106366250c93SBram Moolenaar      # comment 3
106466250c93SBram Moolenaar
106566250c93SBram Moolenaar      five
106666250c93SBram Moolenaar      # comment 6
106766250c93SBram Moolenaar  END
106866250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
10694bce26bbSBram Moolenaar
10704bce26bbSBram Moolenaar  lines =<< trim END
10714bce26bbSBram Moolenaar    [{
10724bce26bbSBram Moolenaar      a: 0}]->string()->assert_equal("[{'a': 0}]")
10734bce26bbSBram Moolenaar  END
10744bce26bbSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1075b209750bSBram Moolenaarenddef
1076b209750bSBram Moolenaar
10772a1381c3SBram Moolenaarif has('channel')
107840ee466cSBram Moolenaar  let someJob = test_null_job()
107940ee466cSBram Moolenaar
108040ee466cSBram Moolenaar  def FuncWithError()
108140ee466cSBram Moolenaar    echomsg g:someJob
108240ee466cSBram Moolenaar  enddef
108340ee466cSBram Moolenaar
108440ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
108540ee466cSBram Moolenaar    try
108640ee466cSBram Moolenaar      call FuncWithError()
108740ee466cSBram Moolenaar    catch
108840ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
108940ee466cSBram Moolenaar    endtry
109040ee466cSBram Moolenaar  endfunc
10912a1381c3SBram Moolenaarendif
109240ee466cSBram Moolenaar
10938a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
10948a7d6542SBram Moolenaar  vim9script
1095cfcd011fSBram Moolenaar  var name: string = 'bob'
10968a7d6542SBram Moolenaar  def Concat(arg: string): string
10978a7d6542SBram Moolenaar    return name .. arg
10988a7d6542SBram Moolenaar  enddef
1099227a69deSBram Moolenaar  g:result = Concat('bie')
1100227a69deSBram Moolenaar  g:localname = name
11018a7d6542SBram Moolenaar
11028a7d6542SBram Moolenaar  export const CONST = 1234
1103cfcd011fSBram Moolenaar  export var exported = 9876
1104cfcd011fSBram Moolenaar  export var exp_name = 'John'
11058a7d6542SBram Moolenaar  export def Exported(): string
11068a7d6542SBram Moolenaar    return 'Exported'
11078a7d6542SBram Moolenaar  enddef
110824e93165SBram Moolenaar  export def ExportedValue(): number
110924e93165SBram Moolenaar    return exported
111024e93165SBram Moolenaar  enddef
111124e93165SBram Moolenaar  export def ExportedInc()
111224e93165SBram Moolenaar    exported += 5
111324e93165SBram Moolenaar  enddef
11140f2a5cc6SBram Moolenaar  export final theList = [1]
11158a7d6542SBram MoolenaarEND
11168a7d6542SBram Moolenaar
1117b3ca9824SBram Moolenaardef Undo_export_script_lines()
1118b3ca9824SBram Moolenaar  unlet g:result
1119b3ca9824SBram Moolenaar  unlet g:localname
1120b3ca9824SBram Moolenaarenddef
1121b3ca9824SBram Moolenaar
11225269bd2aSBram Moolenaardef Test_vim9_import_export()
1123cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
11248a7d6542SBram Moolenaar    vim9script
112524e93165SBram Moolenaar    import {exported, Exported, ExportedValue} from './Xexport.vim'
112624e93165SBram Moolenaar    g:exported1 = exported
11276e587dcbSBram Moolenaar    exported += 3
112824e93165SBram Moolenaar    g:exported2 = exported
112924e93165SBram Moolenaar    g:exported3 = ExportedValue()
113024e93165SBram Moolenaar
113124e93165SBram Moolenaar    import ExportedInc from './Xexport.vim'
113224e93165SBram Moolenaar    ExportedInc()
113324e93165SBram Moolenaar    g:exported_i1 = exported
113424e93165SBram Moolenaar    g:exported_i2 = ExportedValue()
113524e93165SBram Moolenaar
113624e93165SBram Moolenaar    exported = 11
113724e93165SBram Moolenaar    g:exported_s1 = exported
113824e93165SBram Moolenaar    g:exported_s2 = ExportedValue()
113924e93165SBram Moolenaar
11408a7d6542SBram Moolenaar    g:imported_func = Exported()
11416e587dcbSBram Moolenaar
114240f4f7a4SBram Moolenaar    def GetExported(): string
1143e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
114440f4f7a4SBram Moolenaar      return local_dict.ref()
114540f4f7a4SBram Moolenaar    enddef
114640f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
114740f4f7a4SBram Moolenaar
11484db572eeSBram Moolenaar    var dir = './'
11494db572eeSBram Moolenaar    var ext = ".vim"
11504db572eeSBram Moolenaar    import {exp_name} from dir .. 'Xexport' .. ext
11516e587dcbSBram Moolenaar    g:imported_name = exp_name
11526e587dcbSBram Moolenaar    exp_name ..= ' Doe'
11536e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
115424e93165SBram Moolenaar    g:exported_later = exported
11550f2a5cc6SBram Moolenaar
11560f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
11570f2a5cc6SBram Moolenaar    theList->add(2)
11580f2a5cc6SBram Moolenaar    assert_equal([1, 2], theList)
11598a7d6542SBram Moolenaar  END
11608a7d6542SBram Moolenaar
11618a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
11628a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
11638a7d6542SBram Moolenaar
11648a7d6542SBram Moolenaar  source Ximport.vim
11658a7d6542SBram Moolenaar
11668a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
11678a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
116824e93165SBram Moolenaar  assert_equal(9876, g:exported1)
116924e93165SBram Moolenaar  assert_equal(9879, g:exported2)
117024e93165SBram Moolenaar  assert_equal(9879, g:exported3)
117124e93165SBram Moolenaar
117224e93165SBram Moolenaar  assert_equal(9884, g:exported_i1)
117324e93165SBram Moolenaar  assert_equal(9884, g:exported_i2)
117424e93165SBram Moolenaar
117524e93165SBram Moolenaar  assert_equal(11, g:exported_s1)
117624e93165SBram Moolenaar  assert_equal(11, g:exported_s2)
117724e93165SBram Moolenaar  assert_equal(11, g:exported_later)
117824e93165SBram Moolenaar
11798a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
118040f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
11816e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
11826e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
11838a7d6542SBram Moolenaar  assert_false(exists('g:name'))
11848a7d6542SBram Moolenaar
1185b3ca9824SBram Moolenaar  Undo_export_script_lines()
118624e93165SBram Moolenaar  unlet g:exported1
118724e93165SBram Moolenaar  unlet g:exported2
118824e93165SBram Moolenaar  unlet g:exported3
118924e93165SBram Moolenaar  unlet g:exported_i1
119024e93165SBram Moolenaar  unlet g:exported_i2
119124e93165SBram Moolenaar  unlet g:exported_later
11928a7d6542SBram Moolenaar  unlet g:imported_func
11936e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
11948a7d6542SBram Moolenaar  delete('Ximport.vim')
1195f2d5c240SBram Moolenaar
11961c991144SBram Moolenaar  # similar, with line breaks
1197cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
11981c991144SBram Moolenaar    vim9script
11991c991144SBram Moolenaar    import {
12001c991144SBram Moolenaar        exported,
12011c991144SBram Moolenaar        Exported,
12021c991144SBram Moolenaar        }
12031c991144SBram Moolenaar        from
12041c991144SBram Moolenaar        './Xexport.vim'
120524e93165SBram Moolenaar    g:exported = exported
120624e93165SBram Moolenaar    exported += 7
120724e93165SBram Moolenaar    g:exported_added = exported
12081c991144SBram Moolenaar    g:imported_func = Exported()
12091c991144SBram Moolenaar  END
12101c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
12111c991144SBram Moolenaar  source Ximport_lbr.vim
12121c991144SBram Moolenaar
121324e93165SBram Moolenaar  assert_equal(11, g:exported)
121424e93165SBram Moolenaar  assert_equal(18, g:exported_added)
12151c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
12161c991144SBram Moolenaar
12171c991144SBram Moolenaar  # exported script not sourced again
12181c991144SBram Moolenaar  assert_false(exists('g:result'))
121924e93165SBram Moolenaar  unlet g:exported
122024e93165SBram Moolenaar  unlet g:exported_added
12211c991144SBram Moolenaar  unlet g:imported_func
12221c991144SBram Moolenaar  delete('Ximport_lbr.vim')
12231c991144SBram Moolenaar
1224cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
1225f2d5c240SBram Moolenaar    vim9script
1226f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1227f2d5c240SBram Moolenaar    def UseExport()
122824e93165SBram Moolenaar      g:exported_def = Export.exported
1229f2d5c240SBram Moolenaar    enddef
123024e93165SBram Moolenaar    g:exported_script = Export.exported
1231cb4e80faSBram Moolenaar    assert_equal(1, exists('Export.exported'))
1232cb4e80faSBram Moolenaar    assert_equal(0, exists('Export.notexported'))
1233f2d5c240SBram Moolenaar    UseExport()
1234f2d5c240SBram Moolenaar  END
1235f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1236f2d5c240SBram Moolenaar  source Ximport.vim
123724e93165SBram Moolenaar
123824e93165SBram Moolenaar  assert_equal(18, g:exported_def)
123924e93165SBram Moolenaar  assert_equal(18, g:exported_script)
124024e93165SBram Moolenaar  unlet g:exported_def
124124e93165SBram Moolenaar  unlet g:exported_script
1242f2d5c240SBram Moolenaar
1243cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
1244599c89c8SBram Moolenaar    vim9script
1245599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1246599c89c8SBram Moolenaar    def Func()
1247cfcd011fSBram Moolenaar      var dummy = 1
1248cfcd011fSBram Moolenaar      var imported = Export + dummy
1249599c89c8SBram Moolenaar    enddef
1250822ba247SBram Moolenaar    defcompile
1251599c89c8SBram Moolenaar  END
1252599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
125344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1254599c89c8SBram Moolenaar
1255cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
1256599c89c8SBram Moolenaar    vim9script
1257599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1258599c89c8SBram Moolenaar    def Func()
1259cfcd011fSBram Moolenaar      var imported = Export . exported
1260599c89c8SBram Moolenaar    enddef
1261822ba247SBram Moolenaar    defcompile
1262599c89c8SBram Moolenaar  END
1263599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
126444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1265599c89c8SBram Moolenaar
1266921ba529SBram Moolenaar  var import_func_duplicated =<< trim END
1267921ba529SBram Moolenaar    vim9script
1268921ba529SBram Moolenaar    import ExportedInc from './Xexport.vim'
1269921ba529SBram Moolenaar    import ExportedInc from './Xexport.vim'
1270921ba529SBram Moolenaar
1271921ba529SBram Moolenaar    ExportedInc()
1272921ba529SBram Moolenaar  END
1273921ba529SBram Moolenaar  writefile(import_func_duplicated, 'Ximport.vim')
1274921ba529SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
1275921ba529SBram Moolenaar
1276a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
1277a6294955SBram Moolenaar    vim9script
1278a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1279a6294955SBram Moolenaar    var some = 'other'
1280a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
1281a6294955SBram Moolenaar    defcompile
1282a6294955SBram Moolenaar  END
1283a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
1284a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1285a6294955SBram Moolenaar
1286cb4e80faSBram Moolenaar  var import_star_as_lines_script_no_dot =<< trim END
1287cb4e80faSBram Moolenaar    vim9script
1288cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1289cb4e80faSBram Moolenaar    g:imported_script = Export exported
1290cb4e80faSBram Moolenaar  END
1291cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
1292cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1029:')
1293cb4e80faSBram Moolenaar
1294cb4e80faSBram Moolenaar  var import_star_as_lines_script_space_after_dot =<< trim END
1295cb4e80faSBram Moolenaar    vim9script
1296cb4e80faSBram Moolenaar    import * as Export from './Xexport.vim'
1297cb4e80faSBram Moolenaar    g:imported_script = Export. exported
1298cb4e80faSBram Moolenaar  END
1299cb4e80faSBram Moolenaar  writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1300cb4e80faSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1301cb4e80faSBram Moolenaar
1302cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
1303599c89c8SBram Moolenaar    vim9script
1304599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1305599c89c8SBram Moolenaar    def Func()
1306cfcd011fSBram Moolenaar      var imported = Export.
1307599c89c8SBram Moolenaar    enddef
1308822ba247SBram Moolenaar    defcompile
1309599c89c8SBram Moolenaar  END
1310599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
131144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1312599c89c8SBram Moolenaar
1313cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
13141c991144SBram Moolenaar    vim9script
13151c991144SBram Moolenaar    import *
13161c991144SBram Moolenaar        as Export
13171c991144SBram Moolenaar        from
13181c991144SBram Moolenaar        './Xexport.vim'
13191c991144SBram Moolenaar    def UseExport()
132024e93165SBram Moolenaar      g:exported = Export.exported
13211c991144SBram Moolenaar    enddef
13221c991144SBram Moolenaar    UseExport()
13231c991144SBram Moolenaar  END
13241c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
13251c991144SBram Moolenaar  source Ximport.vim
132624e93165SBram Moolenaar  assert_equal(18, g:exported)
132724e93165SBram Moolenaar  unlet g:exported
13281c991144SBram Moolenaar
1329cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1330f2d5c240SBram Moolenaar    vim9script
1331f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1332f2d5c240SBram Moolenaar  END
1333f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
133444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1335f2d5c240SBram Moolenaar
1336f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1337cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1338fa29c8abSBram Moolenaar    vim9script
1339fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1340fa29c8abSBram Moolenaar  END
1341fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
134244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1343fa29c8abSBram Moolenaar
1344f5be8cdbSBram Moolenaar  # try to import something that is already defined
1345cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
13465269bd2aSBram Moolenaar    vim9script
1347cfcd011fSBram Moolenaar    var exported = 'something'
13485269bd2aSBram Moolenaar    import exported from './Xexport.vim'
13495269bd2aSBram Moolenaar  END
13505269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1351057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13525269bd2aSBram Moolenaar
1353f5be8cdbSBram Moolenaar  # try to import something that is already defined
13545269bd2aSBram Moolenaar  import_already_defined =<< trim END
13555269bd2aSBram Moolenaar    vim9script
1356cfcd011fSBram Moolenaar    var exported = 'something'
13575269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
13585269bd2aSBram Moolenaar  END
13595269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1360057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13615269bd2aSBram Moolenaar
1362f5be8cdbSBram Moolenaar  # try to import something that is already defined
13635269bd2aSBram Moolenaar  import_already_defined =<< trim END
13645269bd2aSBram Moolenaar    vim9script
1365cfcd011fSBram Moolenaar    var exported = 'something'
13665269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
13675269bd2aSBram Moolenaar  END
13685269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
1369057e84afSBram Moolenaar  assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
13705269bd2aSBram Moolenaar
1371918a4249SBram Moolenaar  # try changing an imported const
1372918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1373918a4249SBram Moolenaar    vim9script
1374918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1375918a4249SBram Moolenaar    def Assign()
1376918a4249SBram Moolenaar      CONST = 987
1377918a4249SBram Moolenaar    enddef
1378918a4249SBram Moolenaar    defcompile
1379918a4249SBram Moolenaar  END
1380918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1381918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1382918a4249SBram Moolenaar
13830f2a5cc6SBram Moolenaar  # try changing an imported final
13840f2a5cc6SBram Moolenaar  var import_assign_to_final =<< trim END
13850f2a5cc6SBram Moolenaar    vim9script
13860f2a5cc6SBram Moolenaar    import theList from './Xexport.vim'
13870f2a5cc6SBram Moolenaar    def Assign()
13880f2a5cc6SBram Moolenaar      theList = [2]
13890f2a5cc6SBram Moolenaar    enddef
13900f2a5cc6SBram Moolenaar    defcompile
13910f2a5cc6SBram Moolenaar  END
13920f2a5cc6SBram Moolenaar  writefile(import_assign_to_final, 'Ximport.vim')
13930f2a5cc6SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
13940f2a5cc6SBram Moolenaar
1395f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1396cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1397fa29c8abSBram Moolenaar    vim9script
1398fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1399fa29c8abSBram Moolenaar  END
1400fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
140144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1402fa29c8abSBram Moolenaar
1403cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1404fa29c8abSBram Moolenaar    vim9script
1405fa29c8abSBram Moolenaar    import name './Xexport.vim'
1406fa29c8abSBram Moolenaar  END
1407fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
140844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1409fa29c8abSBram Moolenaar
1410cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1411fa29c8abSBram Moolenaar    vim9script
1412fa29c8abSBram Moolenaar    import name from Xexport.vim
1413fa29c8abSBram Moolenaar  END
1414fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
14154db572eeSBram Moolenaar  assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim')
1416fa29c8abSBram Moolenaar
1417cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1418fa29c8abSBram Moolenaar    vim9script
1419fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1420fa29c8abSBram Moolenaar  END
1421fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
142244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1423fa29c8abSBram Moolenaar
1424cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1425fa29c8abSBram Moolenaar    vim9script
1426fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1427fa29c8abSBram Moolenaar  END
14285269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
142944d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1430fa29c8abSBram Moolenaar
143160579350SBram Moolenaar  var import_redefining_lines =<< trim END
143260579350SBram Moolenaar    vim9script
143360579350SBram Moolenaar    import exported from './Xexport.vim'
143460579350SBram Moolenaar    var exported = 5
143560579350SBram Moolenaar  END
143660579350SBram Moolenaar  writefile(import_redefining_lines, 'Ximport.vim')
143760579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3)
143860579350SBram Moolenaar
143960579350SBram Moolenaar  var import_assign_wrong_type_lines =<< trim END
144060579350SBram Moolenaar    vim9script
144160579350SBram Moolenaar    import exported from './Xexport.vim'
144260579350SBram Moolenaar    exported = 'xxx'
144360579350SBram Moolenaar  END
144460579350SBram Moolenaar  writefile(import_assign_wrong_type_lines, 'Ximport.vim')
144560579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3)
144660579350SBram Moolenaar
144760579350SBram Moolenaar  var import_assign_const_lines =<< trim END
144860579350SBram Moolenaar    vim9script
144960579350SBram Moolenaar    import CONST from './Xexport.vim'
145060579350SBram Moolenaar    CONST = 4321
145160579350SBram Moolenaar  END
145260579350SBram Moolenaar  writefile(import_assign_const_lines, 'Ximport.vim')
145360579350SBram Moolenaar  assert_fails('source Ximport.vim', 'E741: Value is locked: CONST', '', 3)
145460579350SBram Moolenaar
1455f2d5c240SBram Moolenaar  delete('Ximport.vim')
14565269bd2aSBram Moolenaar  delete('Ximport3.vim')
14578a7d6542SBram Moolenaar  delete('Xexport.vim')
14588a7d6542SBram Moolenaar
1459f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
14603e191694SBram Moolenaar  # Flags added or removed are also applied to the restored value.
14613e191694SBram Moolenaar  set cpo=abcd
1462cfcd011fSBram Moolenaar  var lines =<< trim END
1463750802b5SBram Moolenaar    vim9script
1464750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
14653e191694SBram Moolenaar    set cpo+=f
14663e191694SBram Moolenaar    set cpo-=c
14673e191694SBram Moolenaar    g:cpo_after_vim9script = &cpo
1468750802b5SBram Moolenaar  END
1469750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1470750802b5SBram Moolenaar  source Xvim9_script
14713e191694SBram Moolenaar  assert_equal('fabd', &cpo)
1472750802b5SBram Moolenaar  set cpo&vim
1473750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
14743e191694SBram Moolenaar  var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
14753e191694SBram Moolenaar  assert_equal(newcpo, g:cpo_after_vim9script)
14763e191694SBram Moolenaar
1477750802b5SBram Moolenaar  delete('Xvim9_script')
1478750802b5SBram Moolenaarenddef
1479750802b5SBram Moolenaar
14806853c38bSBram Moolenaardef Test_import_star_fails()
14816853c38bSBram Moolenaar  writefile([], 'Xfoo.vim')
14826853c38bSBram Moolenaar  var lines =<< trim END
1483af2d5d2cSBram Moolenaar      import * as foo from './Xfoo.vim'
14846853c38bSBram Moolenaar      foo = 'bar'
14856853c38bSBram Moolenaar  END
14866853c38bSBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1094:', 'E1236: Cannot use foo itself')
14876853c38bSBram Moolenaar  lines =<< trim END
14886853c38bSBram Moolenaar      vim9script
1489af2d5d2cSBram Moolenaar      import * as foo from './Xfoo.vim'
14906853c38bSBram Moolenaar      var that = foo
14916853c38bSBram Moolenaar  END
14926853c38bSBram Moolenaar  CheckScriptFailure(lines, 'E1029: Expected ''.''')
1493a9e3d560SBram Moolenaar
1494a9e3d560SBram Moolenaar  lines =<< trim END
1495a9e3d560SBram Moolenaar      vim9script
1496a9e3d560SBram Moolenaar      import * as 9foo from './Xfoo.vim'
1497a9e3d560SBram Moolenaar  END
1498a9e3d560SBram Moolenaar  CheckScriptFailure(lines, 'E1047:')
1499a9e3d560SBram Moolenaar  lines =<< trim END
1500a9e3d560SBram Moolenaar      vim9script
1501a9e3d560SBram Moolenaar      import * as the#foo from './Xfoo.vim'
1502a9e3d560SBram Moolenaar  END
1503a9e3d560SBram Moolenaar  CheckScriptFailure(lines, 'E1047:')
1504a9e3d560SBram Moolenaar  lines =<< trim END
1505a9e3d560SBram Moolenaar      vim9script
1506a9e3d560SBram Moolenaar      import * as g:foo from './Xfoo.vim'
1507a9e3d560SBram Moolenaar  END
1508a9e3d560SBram Moolenaar  CheckScriptFailure(lines, 'E1047:')
1509a9e3d560SBram Moolenaar
1510af2d5d2cSBram Moolenaar  delete('Xfoo.vim')
15116853c38bSBram Moolenaarenddef
15126853c38bSBram Moolenaar
15130a84284eSBram Moolenaardef Test_import_as()
15140a84284eSBram Moolenaar  var export_lines =<< trim END
15150a84284eSBram Moolenaar    vim9script
15160a84284eSBram Moolenaar    export var one = 1
15170a84284eSBram Moolenaar    export var yes = 'yes'
1518c967d57aSBram Moolenaar    export var slist: list<string>
15190a84284eSBram Moolenaar  END
15200a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
15210a84284eSBram Moolenaar
15220a84284eSBram Moolenaar  var import_lines =<< trim END
15230a84284eSBram Moolenaar    vim9script
15246c7cc347SBram Moolenaar    var one = 'notused'
15256c7cc347SBram Moolenaar    var yes = 777
15260a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
15270a84284eSBram Moolenaar    assert_equal(1, thatOne)
15280a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
15290a84284eSBram Moolenaar    assert_equal('yes', yesYes)
15300a84284eSBram Moolenaar  END
15310a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
15320a84284eSBram Moolenaar
15330a84284eSBram Moolenaar  import_lines =<< trim END
15340a84284eSBram Moolenaar    vim9script
15350a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
15360a84284eSBram Moolenaar    assert_equal(1, thatOne)
15370a84284eSBram Moolenaar    assert_equal('yes', yesYes)
15380a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
15390a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
15400a84284eSBram Moolenaar  END
15410a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
15420a84284eSBram Moolenaar
1543c967d57aSBram Moolenaar  import_lines =<< trim END
1544c967d57aSBram Moolenaar    vim9script
1545c967d57aSBram Moolenaar    import {slist as impSlist} from './XexportAs'
1546c967d57aSBram Moolenaar    impSlist->add(123)
1547c967d57aSBram Moolenaar  END
1548c967d57aSBram Moolenaar  CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number')
1549c967d57aSBram Moolenaar
15500a84284eSBram Moolenaar  delete('XexportAs')
15510a84284eSBram Moolenaarenddef
15520a84284eSBram Moolenaar
1553803af686SBram Moolenaarfunc g:Trigger()
1554803af686SBram Moolenaar  source Ximport.vim
1555803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1556803af686SBram Moolenaarendfunc
1557803af686SBram Moolenaar
1558803af686SBram Moolenaardef Test_import_export_expr_map()
1559803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1560cfcd011fSBram Moolenaar  var export_lines =<< trim END
1561803af686SBram Moolenaar    vim9script
1562803af686SBram Moolenaar    export def That(): string
1563803af686SBram Moolenaar      return 'yes'
1564803af686SBram Moolenaar    enddef
1565803af686SBram Moolenaar  END
1566803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1567803af686SBram Moolenaar
1568cfcd011fSBram Moolenaar  var import_lines =<< trim END
1569803af686SBram Moolenaar    vim9script
1570803af686SBram Moolenaar    import That from './Xexport_that.vim'
1571803af686SBram Moolenaar    assert_equal('yes', That())
1572803af686SBram Moolenaar  END
1573803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1574803af686SBram Moolenaar
1575803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1576803af686SBram Moolenaar  feedkeys('trigger', "xt")
1577803af686SBram Moolenaar
1578730b2483SBram Moolenaar  delete('Xexport_that.vim')
1579803af686SBram Moolenaar  delete('Ximport.vim')
1580803af686SBram Moolenaar  nunmap trigger
1581803af686SBram Moolenaarenddef
1582803af686SBram Moolenaar
15838e1986e3SBram Moolenaardef Test_import_in_filetype()
15848e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
15858e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1586cfcd011fSBram Moolenaar  var export_lines =<< trim END
15878e1986e3SBram Moolenaar    vim9script
1588cfcd011fSBram Moolenaar    export var That = 'yes'
15898e1986e3SBram Moolenaar  END
1590730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
15918e1986e3SBram Moolenaar
1592cfcd011fSBram Moolenaar  var import_lines =<< trim END
15938e1986e3SBram Moolenaar    vim9script
1594730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
15958e1986e3SBram Moolenaar    assert_equal('yes', That)
15968e1986e3SBram Moolenaar    g:did_load_mytpe = 1
15978e1986e3SBram Moolenaar  END
15988e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
15998e1986e3SBram Moolenaar
1600cfcd011fSBram Moolenaar  var save_rtp = &rtp
16018e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
16028e1986e3SBram Moolenaar
16038e1986e3SBram Moolenaar  filetype plugin on
16048e1986e3SBram Moolenaar  copen
16058e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
16068e1986e3SBram Moolenaar
16078e1986e3SBram Moolenaar  quit!
1608730b2483SBram Moolenaar  delete('Xexport_ft.vim')
16098e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
16108e1986e3SBram Moolenaar  &rtp = save_rtp
16118e1986e3SBram Moolenaarenddef
16128e1986e3SBram Moolenaar
1613efa94447SBram Moolenaardef Test_use_import_in_mapping()
1614cfcd011fSBram Moolenaar  var lines =<< trim END
1615efa94447SBram Moolenaar      vim9script
1616efa94447SBram Moolenaar      export def Funcx()
1617efa94447SBram Moolenaar        g:result = 42
1618efa94447SBram Moolenaar      enddef
1619efa94447SBram Moolenaar  END
1620efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1621efa94447SBram Moolenaar  lines =<< trim END
1622efa94447SBram Moolenaar      vim9script
1623efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1624b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1625efa94447SBram Moolenaar  END
1626efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1627efa94447SBram Moolenaar
1628efa94447SBram Moolenaar  source Xmapscript.vim
1629b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1630efa94447SBram Moolenaar  assert_equal(42, g:result)
1631efa94447SBram Moolenaar
1632efa94447SBram Moolenaar  unlet g:result
1633efa94447SBram Moolenaar  delete('XsomeExport.vim')
1634efa94447SBram Moolenaar  delete('Xmapscript.vim')
1635b3ca9824SBram Moolenaar  nunmap <F3>
1636efa94447SBram Moolenaarenddef
1637efa94447SBram Moolenaar
1638d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1639d3f8a9eeSBram Moolenaar  var lines =<< trim END
1640d3f8a9eeSBram Moolenaar    if has(g:feature)
1641d3f8a9eeSBram Moolenaar      " legacy script
1642d3f8a9eeSBram Moolenaar      let g:legacy = 1
1643d3f8a9eeSBram Moolenaar      finish
1644d3f8a9eeSBram Moolenaar    endif
1645d3f8a9eeSBram Moolenaar    vim9script
1646d3f8a9eeSBram Moolenaar    g:legacy = 0
1647d3f8a9eeSBram Moolenaar  END
1648d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1649d3f8a9eeSBram Moolenaar  g:legacy = -1
1650d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1651d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1652d3f8a9eeSBram Moolenaar
1653d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1654d3f8a9eeSBram Moolenaar  g:legacy = -1
1655d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1656d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1657d3f8a9eeSBram Moolenaarenddef
1658d3f8a9eeSBram Moolenaar
1659750802b5SBram Moolenaardef Test_vim9script_fails()
16608a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
16618a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1662cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
16639721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1664cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1665750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1666750802b5SBram Moolenaar
1667cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1668c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1669c785b9a7SBram Moolenaar
1670e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1671e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
16728a7d6542SBram Moolenaarenddef
16738a7d6542SBram Moolenaar
1674f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1675101f4810SBram Moolenaar  CheckRunVimInTerminal
1676101f4810SBram Moolenaar
16779bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1678c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
16799bb3eb3eSBram Moolenaarendfunc
16809bb3eb3eSBram Moolenaar
1681c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1682cfcd011fSBram Moolenaar  var export =<< trim END
1683101f4810SBram Moolenaar    vim9script
1684101f4810SBram Moolenaar    export def Foo(): number
1685101f4810SBram Moolenaar        return 0
1686101f4810SBram Moolenaar    enddef
1687101f4810SBram Moolenaar  END
1688730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1689101f4810SBram Moolenaar
1690e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
16919bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
16922949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1693101f4810SBram Moolenaar
1694730b2483SBram Moolenaar  delete('XexportCmd.vim')
16959bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
16969bb3eb3eSBram Moolenaarenddef
1697101f4810SBram Moolenaar
16982b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
16992b32700dSBram Moolenaar  var lines =<< trim END
1700a6294955SBram Moolenaar    vim9script
1701a6294955SBram Moolenaar    export var exported = 'thexport'
170260dc8274SBram Moolenaar
170360dc8274SBram Moolenaar    export def TheFunc(x = 0)
170460dc8274SBram Moolenaar    enddef
1705a6294955SBram Moolenaar  END
1706a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1707a6294955SBram Moolenaar  lines =<< trim END
17082b32700dSBram Moolenaar    vim9script noclear
17092b32700dSBram Moolenaar    g:loadCount += 1
17102b32700dSBram Moolenaar    var s:reloaded = 'init'
1711a6294955SBram Moolenaar    import exported from './XExportReload'
17122b32700dSBram Moolenaar
17132b32700dSBram Moolenaar    def Again(): string
17142b32700dSBram Moolenaar      return 'again'
17152b32700dSBram Moolenaar    enddef
17162b32700dSBram Moolenaar
171760dc8274SBram Moolenaar    import TheFunc from './XExportReload'
171860dc8274SBram Moolenaar    TheFunc()
171960dc8274SBram Moolenaar
17202b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
17212b32700dSBram Moolenaar    var s:loaded = true
17222b32700dSBram Moolenaar
17232b32700dSBram Moolenaar    var s:notReloaded = 'yes'
17242b32700dSBram Moolenaar    s:reloaded = 'first'
17252b32700dSBram Moolenaar    def g:Values(): list<string>
1726a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
17272b32700dSBram Moolenaar    enddef
17282b32700dSBram Moolenaar
17292b32700dSBram Moolenaar    def Once(): string
17302b32700dSBram Moolenaar      return 'once'
17312b32700dSBram Moolenaar    enddef
17322b32700dSBram Moolenaar  END
17332b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
17342b32700dSBram Moolenaar  g:loadCount = 0
17352b32700dSBram Moolenaar  source XReloaded
17362b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1737a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
17382b32700dSBram Moolenaar  source XReloaded
17392b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1740a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
17412b32700dSBram Moolenaar  source XReloaded
17422b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1743a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
17442b32700dSBram Moolenaar
174548e11c10SBram Moolenaar  delete('XReloaded')
1746a6294955SBram Moolenaar  delete('XExportReload')
17472b32700dSBram Moolenaar  delfunc g:Values
17482b32700dSBram Moolenaar  unlet g:loadCount
1749577dc93dSBram Moolenaar
1750577dc93dSBram Moolenaar  lines =<< trim END
1751577dc93dSBram Moolenaar      vim9script
1752577dc93dSBram Moolenaar      def Inner()
1753577dc93dSBram Moolenaar      enddef
1754577dc93dSBram Moolenaar  END
1755577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1756577dc93dSBram Moolenaar  source XreloadScript.vim
1757577dc93dSBram Moolenaar
1758577dc93dSBram Moolenaar  lines =<< trim END
1759577dc93dSBram Moolenaar      vim9script
1760577dc93dSBram Moolenaar      def Outer()
1761577dc93dSBram Moolenaar        def Inner()
1762577dc93dSBram Moolenaar        enddef
1763577dc93dSBram Moolenaar      enddef
1764577dc93dSBram Moolenaar      defcompile
1765577dc93dSBram Moolenaar  END
1766577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1767577dc93dSBram Moolenaar  source XreloadScript.vim
1768577dc93dSBram Moolenaar
1769577dc93dSBram Moolenaar  delete('XreloadScript.vim')
17702b32700dSBram Moolenaarenddef
17712b32700dSBram Moolenaar
17724c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1773cfcd011fSBram Moolenaar  var lines =<< trim END
17748a7d6542SBram Moolenaar    vim9script
17758a7d6542SBram Moolenaar    const var = ''
1776cfcd011fSBram Moolenaar    var valone = 1234
17778a7d6542SBram Moolenaar    def MyFunc(arg: string)
17788a7d6542SBram Moolenaar       valone = 5678
17798a7d6542SBram Moolenaar    enddef
17808a7d6542SBram Moolenaar  END
1781cfcd011fSBram Moolenaar  var morelines =<< trim END
1782cfcd011fSBram Moolenaar    var valtwo = 222
17838a7d6542SBram Moolenaar    export def GetValtwo(): number
17848a7d6542SBram Moolenaar      return valtwo
17858a7d6542SBram Moolenaar    enddef
17868a7d6542SBram Moolenaar  END
178703afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
17888a7d6542SBram Moolenaar  source Xreload.vim
17898a7d6542SBram Moolenaar  source Xreload.vim
17908a7d6542SBram Moolenaar  source Xreload.vim
17918a7d6542SBram Moolenaar
1792f5be8cdbSBram Moolenaar  # cannot declare a var twice
17938a7d6542SBram Moolenaar  lines =<< trim END
17948a7d6542SBram Moolenaar    vim9script
1795cfcd011fSBram Moolenaar    var valone = 1234
1796cfcd011fSBram Moolenaar    var valone = 5678
17978a7d6542SBram Moolenaar  END
17988a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
179944d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
18008a7d6542SBram Moolenaar
18018a7d6542SBram Moolenaar  delete('Xreload.vim')
18028a7d6542SBram Moolenaar  delete('Ximport.vim')
18038a7d6542SBram Moolenaarenddef
18048a7d6542SBram Moolenaar
180507a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
180607a65d26SBram Moolenaar" compiled function using that variable must fail.
180707a65d26SBram Moolenaardef Test_script_reload_change_type()
180807a65d26SBram Moolenaar  var lines =<< trim END
180907a65d26SBram Moolenaar    vim9script noclear
181007a65d26SBram Moolenaar    var str = 'string'
181107a65d26SBram Moolenaar    def g:GetStr(): string
181207a65d26SBram Moolenaar      return str .. 'xxx'
181307a65d26SBram Moolenaar    enddef
181407a65d26SBram Moolenaar  END
181507a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
181607a65d26SBram Moolenaar  source Xreload.vim
181707a65d26SBram Moolenaar  echo g:GetStr()
181807a65d26SBram Moolenaar
181907a65d26SBram Moolenaar  lines =<< trim END
182007a65d26SBram Moolenaar    vim9script noclear
182107a65d26SBram Moolenaar    var str = 1234
182207a65d26SBram Moolenaar  END
182307a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
182407a65d26SBram Moolenaar  source Xreload.vim
182507a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
182607a65d26SBram Moolenaar
182707a65d26SBram Moolenaar  delfunc g:GetStr
182807a65d26SBram Moolenaar  delete('Xreload.vim')
182907a65d26SBram Moolenaarenddef
183007a65d26SBram Moolenaar
1831c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled
1832c970e422SBram Moolenaarcommand CallFunc echo 'nop'
1833c970e422SBram Moolenaar
1834c970e422SBram Moolenaardef Test_script_reload_from_function()
1835c970e422SBram Moolenaar  var lines =<< trim END
1836c970e422SBram Moolenaar      vim9script
1837c970e422SBram Moolenaar
1838c970e422SBram Moolenaar      if exists('g:loaded')
1839c970e422SBram Moolenaar        finish
1840c970e422SBram Moolenaar      endif
1841c970e422SBram Moolenaar      g:loaded = 1
1842c970e422SBram Moolenaar      delcommand CallFunc
1843c970e422SBram Moolenaar      command CallFunc Func()
1844c970e422SBram Moolenaar      def Func()
1845a4c81beaSBram Moolenaar        so XreloadFunc.vim
1846c970e422SBram Moolenaar        g:didTheFunc = 1
1847c970e422SBram Moolenaar      enddef
1848c970e422SBram Moolenaar  END
1849c970e422SBram Moolenaar  writefile(lines, 'XreloadFunc.vim')
1850c970e422SBram Moolenaar  source XreloadFunc.vim
1851c970e422SBram Moolenaar  CallFunc
1852c970e422SBram Moolenaar  assert_equal(1, g:didTheFunc)
1853c970e422SBram Moolenaar
1854c970e422SBram Moolenaar  delete('XreloadFunc.vim')
1855c970e422SBram Moolenaar  delcommand CallFunc
1856c970e422SBram Moolenaar  unlet g:loaded
1857c970e422SBram Moolenaar  unlet g:didTheFunc
1858c970e422SBram Moolenaarenddef
1859c970e422SBram Moolenaar
18606c3843caSBram Moolenaardef Test_script_var_shadows_function()
18616c3843caSBram Moolenaar  var lines =<< trim END
18626c3843caSBram Moolenaar      vim9script
18636c3843caSBram Moolenaar      def Func(): number
18646c3843caSBram Moolenaar        return 123
18656c3843caSBram Moolenaar      enddef
18666c3843caSBram Moolenaar      var Func = 1
18676c3843caSBram Moolenaar  END
18686c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
18696c3843caSBram Moolenaarenddef
18706c3843caSBram Moolenaar
1871c323527dSBram Moolenaardef Test_script_var_shadows_command()
1872c323527dSBram Moolenaar  var lines =<< trim END
1873c323527dSBram Moolenaar      var undo = 1
1874c323527dSBram Moolenaar      undo = 2
1875c323527dSBram Moolenaar      assert_equal(2, undo)
1876c323527dSBram Moolenaar  END
1877c323527dSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1878c323527dSBram Moolenaar
1879c323527dSBram Moolenaar  lines =<< trim END
1880c323527dSBram Moolenaar      var undo = 1
1881c323527dSBram Moolenaar      undo
1882c323527dSBram Moolenaar  END
1883c323527dSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1207:', 2)
1884c323527dSBram Moolenaarenddef
1885c323527dSBram Moolenaar
188695006e3dSBram Moolenaardef s:RetSome(): string
188795006e3dSBram Moolenaar  return 'some'
188895006e3dSBram Moolenaarenddef
188995006e3dSBram Moolenaar
1890fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1891fe465a01SBram Moolenaar" script-local name.
1892fe465a01SBram Moolenaardef Test_vim9script_funcref()
1893cfcd011fSBram Moolenaar  var sortlines =<< trim END
1894fe465a01SBram Moolenaar      vim9script
1895fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1896bed36b93SBram Moolenaar        return i2 - i1
1897fe465a01SBram Moolenaar      enddef
1898fe465a01SBram Moolenaar
1899fe465a01SBram Moolenaar      export def FastSort(): list<number>
1900fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1901fe465a01SBram Moolenaar      enddef
1902529fb5a5SBram Moolenaar
1903529fb5a5SBram Moolenaar      export def GetString(arg: string): string
1904529fb5a5SBram Moolenaar        return arg
1905529fb5a5SBram Moolenaar      enddef
1906fe465a01SBram Moolenaar  END
1907fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1908fe465a01SBram Moolenaar
1909cfcd011fSBram Moolenaar  var lines =<< trim END
1910fe465a01SBram Moolenaar    vim9script
1911fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1912fe465a01SBram Moolenaar    def Test()
1913fe465a01SBram Moolenaar      g:result = FastSort()
1914fe465a01SBram Moolenaar    enddef
1915fe465a01SBram Moolenaar    Test()
1916529fb5a5SBram Moolenaar
1917529fb5a5SBram Moolenaar    # using a function imported with "as"
1918529fb5a5SBram Moolenaar    import * as anAlias from './Xsort.vim'
1919529fb5a5SBram Moolenaar    assert_equal('yes', anAlias.GetString('yes'))
1920529fb5a5SBram Moolenaar
1921529fb5a5SBram Moolenaar    # using the function from a compiled function
1922529fb5a5SBram Moolenaar    def TestMore(): string
1923ca51cc0aSBram Moolenaar      var s = s:anAlias.GetString('foo')
1924ca51cc0aSBram Moolenaar      return s .. anAlias.GetString('bar')
1925529fb5a5SBram Moolenaar    enddef
1926ca51cc0aSBram Moolenaar    assert_equal('foobar', TestMore())
1927529fb5a5SBram Moolenaar
1928529fb5a5SBram Moolenaar    # error when using a function that isn't exported
1929529fb5a5SBram Moolenaar    assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1930fe465a01SBram Moolenaar  END
1931fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1932fe465a01SBram Moolenaar
1933fe465a01SBram Moolenaar  source Xscript.vim
1934fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1935fe465a01SBram Moolenaar
1936fe465a01SBram Moolenaar  unlet g:result
1937fe465a01SBram Moolenaar  delete('Xsort.vim')
1938fe465a01SBram Moolenaar  delete('Xscript.vim')
193995006e3dSBram Moolenaar
1940cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
194195006e3dSBram Moolenaar  assert_equal('some', Funcref())
1942fe465a01SBram Moolenaarenddef
1943fe465a01SBram Moolenaar
1944601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1945601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1946601e76acSBram Moolenaar" function reference.
1947c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1948cfcd011fSBram Moolenaar  var filterLines =<< trim END
1949c620c055SBram Moolenaar    vim9script
1950c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1951c620c055SBram Moolenaar      return idx % 2 == 1
1952c620c055SBram Moolenaar    enddef
1953c620c055SBram Moolenaar    export def FastFilter(): list<number>
1954c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1955c620c055SBram Moolenaar    enddef
1956601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1957601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1958601e76acSBram Moolenaar    enddef
1959c620c055SBram Moolenaar  END
1960c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1961c620c055SBram Moolenaar
1962cfcd011fSBram Moolenaar  var lines =<< trim END
1963c620c055SBram Moolenaar    vim9script
1964601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1965c620c055SBram Moolenaar    def Test()
1966cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1967c620c055SBram Moolenaar    enddef
1968c620c055SBram Moolenaar    Test()
1969601e76acSBram Moolenaar    def TestDirect()
1970cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1971601e76acSBram Moolenaar    enddef
1972601e76acSBram Moolenaar    TestDirect()
1973c620c055SBram Moolenaar  END
1974601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1975c620c055SBram Moolenaar  delete('Xfilter.vim')
1976c620c055SBram Moolenaarenddef
1977c620c055SBram Moolenaar
19784c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1979cfcd011fSBram Moolenaar  var first_lines =<< trim END
19804c17ad94SBram Moolenaar    vim9script
19814c17ad94SBram Moolenaar    def FuncYes(): string
19824c17ad94SBram Moolenaar      return 'yes'
19834c17ad94SBram Moolenaar    enddef
19844c17ad94SBram Moolenaar  END
1985cfcd011fSBram Moolenaar  var withno_lines =<< trim END
19864c17ad94SBram Moolenaar    def FuncNo(): string
19874c17ad94SBram Moolenaar      return 'no'
19884c17ad94SBram Moolenaar    enddef
19894c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
19904c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
19914c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
199203afdcf1SBram Moolenaar    enddef
199303afdcf1SBram Moolenaar  END
1994cfcd011fSBram Moolenaar  var nono_lines =<< trim END
199503afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
199603afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
199744d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
19984c17ad94SBram Moolenaar    enddef
19994c17ad94SBram Moolenaar  END
20004c17ad94SBram Moolenaar
20014c17ad94SBram Moolenaar  # FuncNo() is defined
200203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
20034c17ad94SBram Moolenaar  source Xreloaded.vim
20044c17ad94SBram Moolenaar  g:DoCheck(true)
20054c17ad94SBram Moolenaar
20064c17ad94SBram Moolenaar  # FuncNo() is not redefined
200703afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
20084c17ad94SBram Moolenaar  source Xreloaded.vim
20095082471fSBram Moolenaar  g:DoCheck(false)
20104c17ad94SBram Moolenaar
20114c17ad94SBram Moolenaar  # FuncNo() is back
201203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
20134c17ad94SBram Moolenaar  source Xreloaded.vim
20145082471fSBram Moolenaar  g:DoCheck(false)
20154c17ad94SBram Moolenaar
20164c17ad94SBram Moolenaar  delete('Xreloaded.vim')
20174c17ad94SBram Moolenaarenddef
20184c17ad94SBram Moolenaar
201989483d40SBram Moolenaardef Test_vim9script_reload_delvar()
202089483d40SBram Moolenaar  # write the script with a script-local variable
2021cfcd011fSBram Moolenaar  var lines =<< trim END
202289483d40SBram Moolenaar    vim9script
2023cfcd011fSBram Moolenaar    var name = 'string'
202489483d40SBram Moolenaar  END
202589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
202689483d40SBram Moolenaar  source XreloadVar.vim
202789483d40SBram Moolenaar
202889483d40SBram Moolenaar  # now write the script using the same variable locally - works
202989483d40SBram Moolenaar  lines =<< trim END
203089483d40SBram Moolenaar    vim9script
203189483d40SBram Moolenaar    def Func()
2032cfcd011fSBram Moolenaar      var name = 'string'
203389483d40SBram Moolenaar    enddef
203489483d40SBram Moolenaar  END
203589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
203689483d40SBram Moolenaar  source XreloadVar.vim
203789483d40SBram Moolenaar
203889483d40SBram Moolenaar  delete('XreloadVar.vim')
203989483d40SBram Moolenaarenddef
204089483d40SBram Moolenaar
20418a7d6542SBram Moolenaardef Test_import_absolute()
2042cfcd011fSBram Moolenaar  var import_lines = [
2043e6085c53SBram Moolenaar        'vim9script',
2044e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
2045e6085c53SBram Moolenaar        'def UseExported()',
2046e6085c53SBram Moolenaar        '  g:imported_abs = exported',
2047e6085c53SBram Moolenaar        '  exported = 8888',
2048e6085c53SBram Moolenaar        '  g:imported_after = exported',
2049e6085c53SBram Moolenaar        'enddef',
2050e6085c53SBram Moolenaar        'UseExported()',
2051e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
2052e6085c53SBram Moolenaar        ]
20538a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
20548a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
20558a7d6542SBram Moolenaar
20568a7d6542SBram Moolenaar  source Ximport_abs.vim
20578a7d6542SBram Moolenaar
20588a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
20594e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
2060fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
2061fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
2062fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2063fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
2064fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
2065fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
2066fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
2067fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
2068fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2069fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
2070e6085c53SBram Moolenaar        g:import_disassembled)
2071b3ca9824SBram Moolenaar
2072b3ca9824SBram Moolenaar  Undo_export_script_lines()
20738a7d6542SBram Moolenaar  unlet g:imported_abs
20744e12a5dfSBram Moolenaar  unlet g:import_disassembled
20758a7d6542SBram Moolenaar
20768a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
20778a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
20788a7d6542SBram Moolenaarenddef
20798a7d6542SBram Moolenaar
20808a7d6542SBram Moolenaardef Test_import_rtp()
2081cfcd011fSBram Moolenaar  var import_lines = [
2082e6085c53SBram Moolenaar        'vim9script',
2083e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
2084e6085c53SBram Moolenaar        'g:imported_rtp = exported',
2085e6085c53SBram Moolenaar        ]
20868a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
2087b885a7c7SBram Moolenaar  mkdir('import', 'p')
2088b885a7c7SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
20898a7d6542SBram Moolenaar
2090cfcd011fSBram Moolenaar  var save_rtp = &rtp
20918a7d6542SBram Moolenaar  &rtp = getcwd()
20928a7d6542SBram Moolenaar  source Ximport_rtp.vim
20938a7d6542SBram Moolenaar  &rtp = save_rtp
20948a7d6542SBram Moolenaar
20958a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
20968a7d6542SBram Moolenaar
2097b3ca9824SBram Moolenaar  Undo_export_script_lines()
2098b3ca9824SBram Moolenaar  unlet g:imported_rtp
20998a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
2100b885a7c7SBram Moolenaar  delete('import', 'rf')
21018a7d6542SBram Moolenaarenddef
21028a7d6542SBram Moolenaar
210325e0f586SBram Moolenaardef Test_import_compile_error()
2104cfcd011fSBram Moolenaar  var export_lines = [
210525e0f586SBram Moolenaar        'vim9script',
210625e0f586SBram Moolenaar        'export def ExpFunc(): string',
210725e0f586SBram Moolenaar        '  return notDefined',
210825e0f586SBram Moolenaar        'enddef',
210925e0f586SBram Moolenaar        ]
211025e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
211125e0f586SBram Moolenaar
2112cfcd011fSBram Moolenaar  var import_lines = [
211325e0f586SBram Moolenaar        'vim9script',
211425e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
211525e0f586SBram Moolenaar        'def ImpFunc()',
211625e0f586SBram Moolenaar        '  echo ExpFunc()',
211725e0f586SBram Moolenaar        'enddef',
211825e0f586SBram Moolenaar        'defcompile',
211925e0f586SBram Moolenaar        ]
212025e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
212125e0f586SBram Moolenaar
212225e0f586SBram Moolenaar  try
212325e0f586SBram Moolenaar    source Ximport.vim
212425e0f586SBram Moolenaar  catch /E1001/
2125f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
21267707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
212725e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
212825e0f586SBram Moolenaar  endtry
212925e0f586SBram Moolenaar
213025e0f586SBram Moolenaar  delete('Xexported.vim')
213125e0f586SBram Moolenaar  delete('Ximport.vim')
213225e0f586SBram Moolenaarenddef
213325e0f586SBram Moolenaar
2134c4ce36d4SBram Moolenaardef Test_func_redefine_error()
2135cfcd011fSBram Moolenaar  var lines = [
2136c4ce36d4SBram Moolenaar        'vim9script',
2137c4ce36d4SBram Moolenaar        'def Func()',
2138c4ce36d4SBram Moolenaar        '  eval [][0]',
2139c4ce36d4SBram Moolenaar        'enddef',
2140c4ce36d4SBram Moolenaar        'Func()',
2141c4ce36d4SBram Moolenaar        ]
2142c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
2143c4ce36d4SBram Moolenaar
2144c4ce36d4SBram Moolenaar  for count in range(3)
2145c4ce36d4SBram Moolenaar    try
2146c4ce36d4SBram Moolenaar      source Xtestscript.vim
2147c4ce36d4SBram Moolenaar    catch /E684/
2148c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
2149c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
2150c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
2151c4ce36d4SBram Moolenaar    endtry
2152c4ce36d4SBram Moolenaar  endfor
2153c4ce36d4SBram Moolenaar
2154c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
2155c4ce36d4SBram Moolenaarenddef
2156c4ce36d4SBram Moolenaar
2157eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
2158cfcd011fSBram Moolenaar  var export_lines =<< trim END
2159eef2102eSBram Moolenaar      vim9script
2160eef2102eSBram Moolenaar      export def Func()
2161eef2102eSBram Moolenaar        echo 'imported'
2162eef2102eSBram Moolenaar      enddef
2163eef2102eSBram Moolenaar  END
2164eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
2165eef2102eSBram Moolenaar
2166cfcd011fSBram Moolenaar  var lines =<< trim END
2167eef2102eSBram Moolenaar    vim9script
2168eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2169eef2102eSBram Moolenaar    def Func()
2170eef2102eSBram Moolenaar      echo 'local to function'
2171eef2102eSBram Moolenaar    enddef
2172eef2102eSBram Moolenaar  END
2173eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2174eef2102eSBram Moolenaar
2175eef2102eSBram Moolenaar  lines =<< trim END
2176eef2102eSBram Moolenaar    vim9script
2177eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2178eef2102eSBram Moolenaar    def Outer()
2179eef2102eSBram Moolenaar      def Func()
2180eef2102eSBram Moolenaar        echo 'local to function'
2181eef2102eSBram Moolenaar      enddef
2182eef2102eSBram Moolenaar    enddef
2183eef2102eSBram Moolenaar    defcompile
2184eef2102eSBram Moolenaar  END
2185eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2186eef2102eSBram Moolenaar
2187eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
2188eef2102eSBram Moolenaarenddef
2189eef2102eSBram Moolenaar
2190b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
2191cfcd011fSBram Moolenaar  var lines =<< trim END
2192b9a2cac3SBram Moolenaar    vim9script
2193b9a2cac3SBram Moolenaar    def Func()
2194b9a2cac3SBram Moolenaar      echo 'one'
2195b9a2cac3SBram Moolenaar    enddef
2196b9a2cac3SBram Moolenaar    def Func()
2197b9a2cac3SBram Moolenaar      echo 'two'
2198b9a2cac3SBram Moolenaar    enddef
2199b9a2cac3SBram Moolenaar  END
2200b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2201fa211f3cSBram Moolenaar
2202fa211f3cSBram Moolenaar  lines =<< trim END
2203fa211f3cSBram Moolenaar    vim9script
2204fa211f3cSBram Moolenaar    def Foo(): string
2205fa211f3cSBram Moolenaar      return 'foo'
2206fa211f3cSBram Moolenaar      enddef
2207fa211f3cSBram Moolenaar    def Func()
2208cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
2209fa211f3cSBram Moolenaar    enddef
2210fa211f3cSBram Moolenaar    defcompile
2211fa211f3cSBram Moolenaar  END
2212fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2213b9a2cac3SBram Moolenaarenddef
2214b9a2cac3SBram Moolenaar
22158a7d6542SBram Moolenaardef Test_fixed_size_list()
2216f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
2217cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
22188a7d6542SBram Moolenaar  l->remove(0)
22198a7d6542SBram Moolenaar  l->add(5)
22208a7d6542SBram Moolenaar  l->insert(99, 1)
22210f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
22228a7d6542SBram Moolenaarenddef
22238a7d6542SBram Moolenaar
2224ae616494SBram Moolenaardef Test_no_insert_xit()
2225d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2226d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2227d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2228d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2229d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2230ae616494SBram Moolenaar
2231ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2232ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2233ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2234ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2235f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2236f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
22376508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
22386508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
2239f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2240f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2241f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2242ae616494SBram Moolenaarenddef
2243ae616494SBram Moolenaar
2244158906cfSBram Moolenaardef IfElse(what: number): string
2245cfcd011fSBram Moolenaar  var res = ''
2246158906cfSBram Moolenaar  if what == 1
2247158906cfSBram Moolenaar    res = "one"
2248158906cfSBram Moolenaar  elseif what == 2
2249158906cfSBram Moolenaar    res = "two"
2250a259d8d3SBram Moolenaar  else
2251158906cfSBram Moolenaar    res = "three"
2252a259d8d3SBram Moolenaar  endif
2253158906cfSBram Moolenaar  return res
2254a259d8d3SBram Moolenaarenddef
2255a259d8d3SBram Moolenaar
2256158906cfSBram Moolenaardef Test_if_elseif_else()
2257158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2258158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2259158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
22600f18b6d1SBram Moolenaarenddef
22610f18b6d1SBram Moolenaar
2262e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2263d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2264d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2265d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2266ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
2267d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
22686628b7ebSBram Moolenaar
22696628b7ebSBram Moolenaar  var lines =<< trim END
22706628b7ebSBram Moolenaar      var s = ''
22716628b7ebSBram Moolenaar      if s = ''
22726628b7ebSBram Moolenaar      endif
22736628b7ebSBram Moolenaar  END
22746628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
22756628b7ebSBram Moolenaar
22766628b7ebSBram Moolenaar  lines =<< trim END
22776628b7ebSBram Moolenaar      var s = ''
22786628b7ebSBram Moolenaar      if s == ''
22796628b7ebSBram Moolenaar      elseif s = ''
22806628b7ebSBram Moolenaar      endif
22816628b7ebSBram Moolenaar  END
22826628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2283e8c4abbbSBram Moolenaarenddef
2284e8c4abbbSBram Moolenaar
22856d69bf60SBram Moolenaarlet g:bool_true = v:true
22866d69bf60SBram Moolenaarlet g:bool_false = v:false
22876d69bf60SBram Moolenaar
22886d69bf60SBram Moolenaardef Test_if_const_expr()
2289cfcd011fSBram Moolenaar  var res = false
22906d69bf60SBram Moolenaar  if true ? true : false
22916d69bf60SBram Moolenaar    res = true
22926d69bf60SBram Moolenaar  endif
22936d69bf60SBram Moolenaar  assert_equal(true, res)
22946d69bf60SBram Moolenaar
2295585fea7bSBram Moolenaar  g:glob = 2
2296585fea7bSBram Moolenaar  if false
22976797966dSBram Moolenaar    execute('g:glob = 3')
2298585fea7bSBram Moolenaar  endif
2299585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2300585fea7bSBram Moolenaar  if true
23016797966dSBram Moolenaar    execute('g:glob = 3')
2302585fea7bSBram Moolenaar  endif
2303585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2304585fea7bSBram Moolenaar
23056d69bf60SBram Moolenaar  res = false
23066d69bf60SBram Moolenaar  if g:bool_true ? true : false
23076d69bf60SBram Moolenaar    res = true
23086d69bf60SBram Moolenaar  endif
23096d69bf60SBram Moolenaar  assert_equal(true, res)
23106d69bf60SBram Moolenaar
23116d69bf60SBram Moolenaar  res = false
23126d69bf60SBram Moolenaar  if true ? g:bool_true : false
23136d69bf60SBram Moolenaar    res = true
23146d69bf60SBram Moolenaar  endif
23156d69bf60SBram Moolenaar  assert_equal(true, res)
23166d69bf60SBram Moolenaar
23176d69bf60SBram Moolenaar  res = false
23186d69bf60SBram Moolenaar  if true ? true : g:bool_false
23196d69bf60SBram Moolenaar    res = true
23206d69bf60SBram Moolenaar  endif
23216d69bf60SBram Moolenaar  assert_equal(true, res)
23226d69bf60SBram Moolenaar
23236d69bf60SBram Moolenaar  res = false
23246d69bf60SBram Moolenaar  if true ? false : true
23256d69bf60SBram Moolenaar    res = true
23266d69bf60SBram Moolenaar  endif
23276d69bf60SBram Moolenaar  assert_equal(false, res)
23286d69bf60SBram Moolenaar
23296d69bf60SBram Moolenaar  res = false
23306d69bf60SBram Moolenaar  if false ? false : true
23316d69bf60SBram Moolenaar    res = true
23326d69bf60SBram Moolenaar  endif
23336d69bf60SBram Moolenaar  assert_equal(true, res)
23346d69bf60SBram Moolenaar
23356d69bf60SBram Moolenaar  res = false
23366d69bf60SBram Moolenaar  if false ? true : false
23376d69bf60SBram Moolenaar    res = true
23386d69bf60SBram Moolenaar  endif
23396d69bf60SBram Moolenaar  assert_equal(false, res)
23406d69bf60SBram Moolenaar
23416d69bf60SBram Moolenaar  res = false
2342e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2343e8c4abbbSBram Moolenaar    res = true
2344e8c4abbbSBram Moolenaar  endif
2345e8c4abbbSBram Moolenaar  assert_equal(false, res)
2346e8c4abbbSBram Moolenaar
2347e8c4abbbSBram Moolenaar  res = false
23486d69bf60SBram Moolenaar  if true && true
23496d69bf60SBram Moolenaar    res = true
23506d69bf60SBram Moolenaar  endif
23516d69bf60SBram Moolenaar  assert_equal(true, res)
23526d69bf60SBram Moolenaar
23536d69bf60SBram Moolenaar  res = false
23546d69bf60SBram Moolenaar  if true && false
23556d69bf60SBram Moolenaar    res = true
23566d69bf60SBram Moolenaar  endif
23576d69bf60SBram Moolenaar  assert_equal(false, res)
23586d69bf60SBram Moolenaar
23596d69bf60SBram Moolenaar  res = false
23606d69bf60SBram Moolenaar  if g:bool_true && false
23616d69bf60SBram Moolenaar    res = true
23626d69bf60SBram Moolenaar  endif
23636d69bf60SBram Moolenaar  assert_equal(false, res)
23646d69bf60SBram Moolenaar
23656d69bf60SBram Moolenaar  res = false
23666d69bf60SBram Moolenaar  if true && g:bool_false
23676d69bf60SBram Moolenaar    res = true
23686d69bf60SBram Moolenaar  endif
23696d69bf60SBram Moolenaar  assert_equal(false, res)
23706d69bf60SBram Moolenaar
23716d69bf60SBram Moolenaar  res = false
23726d69bf60SBram Moolenaar  if false && false
23736d69bf60SBram Moolenaar    res = true
23746d69bf60SBram Moolenaar  endif
23756d69bf60SBram Moolenaar  assert_equal(false, res)
23766d69bf60SBram Moolenaar
23776d69bf60SBram Moolenaar  res = false
23786d69bf60SBram Moolenaar  if true || false
23796d69bf60SBram Moolenaar    res = true
23806d69bf60SBram Moolenaar  endif
23816d69bf60SBram Moolenaar  assert_equal(true, res)
23826d69bf60SBram Moolenaar
23836d69bf60SBram Moolenaar  res = false
23846d69bf60SBram Moolenaar  if g:bool_true || false
23856d69bf60SBram Moolenaar    res = true
23866d69bf60SBram Moolenaar  endif
23876d69bf60SBram Moolenaar  assert_equal(true, res)
23886d69bf60SBram Moolenaar
23896d69bf60SBram Moolenaar  res = false
23906d69bf60SBram Moolenaar  if true || g:bool_false
23916d69bf60SBram Moolenaar    res = true
23926d69bf60SBram Moolenaar  endif
23936d69bf60SBram Moolenaar  assert_equal(true, res)
23946d69bf60SBram Moolenaar
23956d69bf60SBram Moolenaar  res = false
23966d69bf60SBram Moolenaar  if false || false
23976d69bf60SBram Moolenaar    res = true
23986d69bf60SBram Moolenaar  endif
23996d69bf60SBram Moolenaar  assert_equal(false, res)
24003988f64fSBram Moolenaar
24013988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
2402c323527dSBram Moolenaar  if false | eval 1 + 2 | endif
24033988f64fSBram Moolenaar  if false | eval burp + 234 | endif
24043988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
24053988f64fSBram Moolenaar  if false
24063988f64fSBram Moolenaar    burp
24073988f64fSBram Moolenaar  endif
2408e525bddaSBram Moolenaar
2409e525bddaSBram Moolenaar  # expression with line breaks skipped
2410e525bddaSBram Moolenaar  if false
2411e525bddaSBram Moolenaar      ('aaa'
2412e525bddaSBram Moolenaar      .. 'bbb'
2413e525bddaSBram Moolenaar      .. 'ccc'
2414e525bddaSBram Moolenaar      )->setline(1)
2415e525bddaSBram Moolenaar  endif
241680c34ca3SBram Moolenaarenddef
24176d69bf60SBram Moolenaar
241880c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2419d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2420d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2421d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2422d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
24236d69bf60SBram Moolenaarenddef
24246d69bf60SBram Moolenaar
242572abcf42SBram Moolenaardef RunNested(i: number): number
2426cfcd011fSBram Moolenaar  var x: number = 0
242772abcf42SBram Moolenaar  if i % 2
242872abcf42SBram Moolenaar    if 1
2429f5be8cdbSBram Moolenaar      # comment
243072abcf42SBram Moolenaar    else
2431f5be8cdbSBram Moolenaar      # comment
243272abcf42SBram Moolenaar    endif
243372abcf42SBram Moolenaar    x += 1
243472abcf42SBram Moolenaar  else
243572abcf42SBram Moolenaar    x += 1000
243672abcf42SBram Moolenaar  endif
243772abcf42SBram Moolenaar  return x
243872abcf42SBram Moolenaarenddef
243972abcf42SBram Moolenaar
244072abcf42SBram Moolenaardef Test_nested_if()
244172abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
244272abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
244372abcf42SBram Moolenaarenddef
244472abcf42SBram Moolenaar
2445ad39c094SBram Moolenaardef Test_execute_cmd()
2446e4984290SBram Moolenaar  # missing argument is ignored
2447e4984290SBram Moolenaar  execute
2448e4984290SBram Moolenaar  execute # comment
2449e4984290SBram Moolenaar
2450ad39c094SBram Moolenaar  new
2451ad39c094SBram Moolenaar  setline(1, 'default')
2452d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2453ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2454a72cfb80SBram Moolenaar
2455d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2456a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2457a72cfb80SBram Moolenaar
2458cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2459cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2460a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2461ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2462a72cfb80SBram Moolenaar
2463d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2464ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2465a72cfb80SBram Moolenaar
2466cfcd011fSBram Moolenaar  var cmd_first = 'call '
2467cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2468ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2469ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2470ad39c094SBram Moolenaar  bwipe!
2471585fea7bSBram Moolenaar
2472cfcd011fSBram Moolenaar  var n = true
24732d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
24742d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
24752d6b20d6SBram Moolenaar
2476e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2477e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2478e5abf7afSBram Moolenaar
2479d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2480d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2481d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2482ad39c094SBram Moolenaarenddef
2483ad39c094SBram Moolenaar
248447e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2485f5be8cdbSBram Moolenaar  # only checks line continuation
2486cfcd011fSBram Moolenaar  var lines =<< trim END
248747e880d6SBram Moolenaar      vim9script
248847e880d6SBram Moolenaar      execute 'g:someVar'
248947e880d6SBram Moolenaar                .. ' = ' ..
249047e880d6SBram Moolenaar                   '28'
249147e880d6SBram Moolenaar      assert_equal(28, g:someVar)
249247e880d6SBram Moolenaar      unlet g:someVar
249347e880d6SBram Moolenaar  END
249447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
249547e880d6SBram Moolenaarenddef
249647e880d6SBram Moolenaar
2497ad39c094SBram Moolenaardef Test_echo_cmd()
2498a72cfb80SBram Moolenaar  echo 'some' # comment
2499585fea7bSBram Moolenaar  echon 'thing'
2500ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2501ad39c094SBram Moolenaar
2502a72cfb80SBram Moolenaar  echo "some" # comment
2503a72cfb80SBram Moolenaar  echon "thing"
2504a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2505a72cfb80SBram Moolenaar
2506cfcd011fSBram Moolenaar  var str1 = 'some'
2507cfcd011fSBram Moolenaar  var str2 = 'more'
2508ad39c094SBram Moolenaar  echo str1 str2
2509ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2510a72cfb80SBram Moolenaar
2511d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2512ad39c094SBram Moolenaarenddef
2513ad39c094SBram Moolenaar
2514f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2515f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2516f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2517f93c7feaSBram Moolenaar  echo 'clear'
2518df069eecSBram Moolenaar  :1messages
2519f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2520f93c7feaSBram Moolenaar
2521d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2522f93c7feaSBram Moolenaarenddef
2523f93c7feaSBram Moolenaar
252447e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2525f5be8cdbSBram Moolenaar  # only checks line continuation
2526cfcd011fSBram Moolenaar  var lines =<< trim END
252747e880d6SBram Moolenaar      vim9script
252847e880d6SBram Moolenaar      echomsg 'here'
252947e880d6SBram Moolenaar                .. ' is ' ..
253047e880d6SBram Moolenaar                   'a message'
253147e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
253247e880d6SBram Moolenaar  END
253347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
253447e880d6SBram Moolenaarenddef
253547e880d6SBram Moolenaar
2536f93c7feaSBram Moolenaardef Test_echoerr_cmd()
25377de62623SBram Moolenaar  var local = 'local'
253840ee466cSBram Moolenaar  try
25397de62623SBram Moolenaar    echoerr 'something' local 'wrong' # comment
254040ee466cSBram Moolenaar  catch
25417de62623SBram Moolenaar    assert_match('something local wrong', v:exception)
254240ee466cSBram Moolenaar  endtry
2543f93c7feaSBram Moolenaarenddef
2544f93c7feaSBram Moolenaar
254547e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2546f5be8cdbSBram Moolenaar  # only checks line continuation
2547cfcd011fSBram Moolenaar  var lines =<< trim END
254847e880d6SBram Moolenaar      vim9script
254947e880d6SBram Moolenaar      try
255047e880d6SBram Moolenaar        echoerr 'this'
255147e880d6SBram Moolenaar                .. ' is ' ..
255247e880d6SBram Moolenaar                   'wrong'
255347e880d6SBram Moolenaar      catch
255447e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
255547e880d6SBram Moolenaar      endtry
255647e880d6SBram Moolenaar  END
255747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
255847e880d6SBram Moolenaarenddef
255947e880d6SBram Moolenaar
25607de62623SBram Moolenaardef Test_echoconsole_cmd()
25617de62623SBram Moolenaar  var local = 'local'
25627de62623SBram Moolenaar  echoconsole 'something' local # comment
25637de62623SBram Moolenaar  # output goes anywhere
25647de62623SBram Moolenaarenddef
25657de62623SBram Moolenaar
256641fe0617SBram Moolenaardef Test_for_outside_of_function()
2567cfcd011fSBram Moolenaar  var lines =<< trim END
256841fe0617SBram Moolenaar    vim9script
256941fe0617SBram Moolenaar    new
257041fe0617SBram Moolenaar    for var in range(0, 3)
257141fe0617SBram Moolenaar      append(line('$'), var)
257241fe0617SBram Moolenaar    endfor
257341fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
257441fe0617SBram Moolenaar    bwipe!
2575522eefd9SBram Moolenaar
2576522eefd9SBram Moolenaar    var result = ''
2577522eefd9SBram Moolenaar    for i in [1, 2, 3]
2578522eefd9SBram Moolenaar      var loop = ' loop ' .. i
2579522eefd9SBram Moolenaar      result ..= loop
2580522eefd9SBram Moolenaar    endfor
2581522eefd9SBram Moolenaar    assert_equal(' loop 1 loop 2 loop 3', result)
258241fe0617SBram Moolenaar  END
258341fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
258441fe0617SBram Moolenaar  source Xvim9for.vim
258541fe0617SBram Moolenaar  delete('Xvim9for.vim')
258641fe0617SBram Moolenaarenddef
25878a7d6542SBram Moolenaar
2588bebf0695Srbtnndef Test_for_skipped_block()
2589bebf0695Srbtnn  # test skipped blocks at outside of function
2590bebf0695Srbtnn  var lines =<< trim END
2591bebf0695Srbtnn    var result = []
2592bebf0695Srbtnn    if true
2593bebf0695Srbtnn      for n in [1, 2]
2594bebf0695Srbtnn        result += [n]
2595bebf0695Srbtnn      endfor
2596bebf0695Srbtnn    else
2597bebf0695Srbtnn      for n in [3, 4]
2598bebf0695Srbtnn        result += [n]
2599bebf0695Srbtnn      endfor
2600bebf0695Srbtnn    endif
2601bebf0695Srbtnn    assert_equal([1, 2], result)
2602bebf0695Srbtnn
2603bebf0695Srbtnn    result = []
2604bebf0695Srbtnn    if false
2605bebf0695Srbtnn      for n in [1, 2]
2606bebf0695Srbtnn        result += [n]
2607bebf0695Srbtnn      endfor
2608bebf0695Srbtnn    else
2609bebf0695Srbtnn      for n in [3, 4]
2610bebf0695Srbtnn        result += [n]
2611bebf0695Srbtnn      endfor
2612bebf0695Srbtnn    endif
2613bebf0695Srbtnn    assert_equal([3, 4], result)
2614bebf0695Srbtnn  END
2615bebf0695Srbtnn  CheckDefAndScriptSuccess(lines)
2616bebf0695Srbtnn
2617bebf0695Srbtnn  # test skipped blocks at inside of function
2618bebf0695Srbtnn  lines =<< trim END
2619bebf0695Srbtnn    def DefTrue()
2620bebf0695Srbtnn      var result = []
2621bebf0695Srbtnn      if true
2622bebf0695Srbtnn        for n in [1, 2]
2623bebf0695Srbtnn          result += [n]
2624bebf0695Srbtnn        endfor
2625bebf0695Srbtnn      else
2626bebf0695Srbtnn        for n in [3, 4]
2627bebf0695Srbtnn          result += [n]
2628bebf0695Srbtnn        endfor
2629bebf0695Srbtnn      endif
2630bebf0695Srbtnn      assert_equal([1, 2], result)
2631bebf0695Srbtnn    enddef
2632bebf0695Srbtnn    DefTrue()
2633bebf0695Srbtnn
2634bebf0695Srbtnn    def DefFalse()
2635bebf0695Srbtnn      var result = []
2636bebf0695Srbtnn      if false
2637bebf0695Srbtnn        for n in [1, 2]
2638bebf0695Srbtnn          result += [n]
2639bebf0695Srbtnn        endfor
2640bebf0695Srbtnn      else
2641bebf0695Srbtnn        for n in [3, 4]
2642bebf0695Srbtnn          result += [n]
2643bebf0695Srbtnn        endfor
2644bebf0695Srbtnn      endif
2645bebf0695Srbtnn      assert_equal([3, 4], result)
2646bebf0695Srbtnn    enddef
2647bebf0695Srbtnn    DefFalse()
2648bebf0695Srbtnn  END
2649bebf0695Srbtnn  CheckDefAndScriptSuccess(lines)
2650bebf0695Srbtnnenddef
2651bebf0695Srbtnn
2652e8c4abbbSBram Moolenaardef Test_for_loop()
2653f2253963SBram Moolenaar  var lines =<< trim END
2654cfcd011fSBram Moolenaar      var result = ''
2655e8c4abbbSBram Moolenaar      for cnt in range(7)
2656e8c4abbbSBram Moolenaar        if cnt == 4
2657e8c4abbbSBram Moolenaar          break
2658e8c4abbbSBram Moolenaar        endif
2659e8c4abbbSBram Moolenaar        if cnt == 2
2660e8c4abbbSBram Moolenaar          continue
2661e8c4abbbSBram Moolenaar        endif
2662e8c4abbbSBram Moolenaar        result ..= cnt .. '_'
2663e8c4abbbSBram Moolenaar      endfor
2664e8c4abbbSBram Moolenaar      assert_equal('0_1_3_', result)
26650ad3e894SBram Moolenaar
2666cfcd011fSBram Moolenaar      var concat = ''
26670ad3e894SBram Moolenaar      for str in eval('["one", "two"]')
26680ad3e894SBram Moolenaar        concat ..= str
26690ad3e894SBram Moolenaar      endfor
26700ad3e894SBram Moolenaar      assert_equal('onetwo', concat)
267138bd8de5SBram Moolenaar
267238bd8de5SBram Moolenaar      var total = 0
267338bd8de5SBram Moolenaar      for nr in
267438bd8de5SBram Moolenaar          [1, 2, 3]
267538bd8de5SBram Moolenaar        total += nr
267638bd8de5SBram Moolenaar      endfor
267738bd8de5SBram Moolenaar      assert_equal(6, total)
267838bd8de5SBram Moolenaar
267938bd8de5SBram Moolenaar      total = 0
268038bd8de5SBram Moolenaar      for nr
268138bd8de5SBram Moolenaar        in [1, 2, 3]
268238bd8de5SBram Moolenaar        total += nr
268338bd8de5SBram Moolenaar      endfor
268438bd8de5SBram Moolenaar      assert_equal(6, total)
268538bd8de5SBram Moolenaar
268638bd8de5SBram Moolenaar      total = 0
268738bd8de5SBram Moolenaar      for nr
268838bd8de5SBram Moolenaar        in
268938bd8de5SBram Moolenaar        [1, 2, 3]
269038bd8de5SBram Moolenaar        total += nr
269138bd8de5SBram Moolenaar      endfor
269238bd8de5SBram Moolenaar      assert_equal(6, total)
2693036d0714SBram Moolenaar
2694a3589a0dSBram Moolenaar      # with type
2695a3589a0dSBram Moolenaar      total = 0
2696a3589a0dSBram Moolenaar      for n: number in [1, 2, 3]
2697a3589a0dSBram Moolenaar        total += n
2698a3589a0dSBram Moolenaar      endfor
2699a3589a0dSBram Moolenaar      assert_equal(6, total)
2700a3589a0dSBram Moolenaar
2701fe090eb5SBram Moolenaar      var chars = ''
2702fe090eb5SBram Moolenaar      for s: string in 'foobar'
2703fe090eb5SBram Moolenaar        chars ..= s
2704fe090eb5SBram Moolenaar      endfor
2705fe090eb5SBram Moolenaar      assert_equal('foobar', chars)
2706fe090eb5SBram Moolenaar
27075ede5b23SBram Moolenaar      chars = ''
27085ede5b23SBram Moolenaar      for x: string in {a: 'a', b: 'b'}->values()
27095ede5b23SBram Moolenaar        chars ..= x
27105ede5b23SBram Moolenaar      endfor
27115ede5b23SBram Moolenaar      assert_equal('ab', chars)
27125ede5b23SBram Moolenaar
2713a3589a0dSBram Moolenaar      # unpack with type
2714f2253963SBram Moolenaar      var res = ''
2715a3589a0dSBram Moolenaar      for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2716a3589a0dSBram Moolenaar        res ..= n .. s
2717a3589a0dSBram Moolenaar      endfor
2718a3589a0dSBram Moolenaar      assert_equal('1a2b', res)
2719a3589a0dSBram Moolenaar
2720444d8783SBram Moolenaar      # unpack with one var
2721444d8783SBram Moolenaar      var reslist = []
2722444d8783SBram Moolenaar      for [x] in [['aaa'], ['bbb']]
2723444d8783SBram Moolenaar        reslist->add(x)
2724444d8783SBram Moolenaar      endfor
2725444d8783SBram Moolenaar      assert_equal(['aaa', 'bbb'], reslist)
2726444d8783SBram Moolenaar
2727a3589a0dSBram Moolenaar      # loop over string
2728a3589a0dSBram Moolenaar      res = ''
272974e54fcbSBram Moolenaar      for c in 'aéc̀d'
273074e54fcbSBram Moolenaar        res ..= c .. '-'
273174e54fcbSBram Moolenaar      endfor
273274e54fcbSBram Moolenaar      assert_equal('a-é-c̀-d-', res)
273374e54fcbSBram Moolenaar
273474e54fcbSBram Moolenaar      res = ''
273574e54fcbSBram Moolenaar      for c in ''
273674e54fcbSBram Moolenaar        res ..= c .. '-'
273774e54fcbSBram Moolenaar      endfor
273874e54fcbSBram Moolenaar      assert_equal('', res)
273974e54fcbSBram Moolenaar
274074e54fcbSBram Moolenaar      res = ''
274174e54fcbSBram Moolenaar      for c in test_null_string()
274274e54fcbSBram Moolenaar        res ..= c .. '-'
274374e54fcbSBram Moolenaar      endfor
274474e54fcbSBram Moolenaar      assert_equal('', res)
2745f2253963SBram Moolenaar
2746f2253963SBram Moolenaar      var foo: list<dict<any>> = [
2747f2253963SBram Moolenaar              {a: 'Cat'}
2748f2253963SBram Moolenaar            ]
2749f2253963SBram Moolenaar      for dd in foo
2750f2253963SBram Moolenaar        dd.counter = 12
2751f2253963SBram Moolenaar      endfor
2752f2253963SBram Moolenaar      assert_equal([{a: 'Cat', counter: 12}], foo)
2753ad2d4969SBram Moolenaar
2754ad2d4969SBram Moolenaar      reslist = []
2755ad2d4969SBram Moolenaar      for _ in range(3)
2756ad2d4969SBram Moolenaar        reslist->add('x')
2757ad2d4969SBram Moolenaar      endfor
2758ad2d4969SBram Moolenaar      assert_equal(['x', 'x', 'x'], reslist)
2759f2253963SBram Moolenaar  END
2760f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2761e8c4abbbSBram Moolenaarenddef
2762e8c4abbbSBram Moolenaar
27632eb6fc3bSBram Moolenaardef Test_for_loop_with_closure()
27642eb6fc3bSBram Moolenaar  var lines =<< trim END
27652eb6fc3bSBram Moolenaar      var flist: list<func>
27662eb6fc3bSBram Moolenaar      for i in range(5)
27672eb6fc3bSBram Moolenaar        var inloop = i
27682eb6fc3bSBram Moolenaar        flist[i] = () => inloop
27692eb6fc3bSBram Moolenaar      endfor
27702eb6fc3bSBram Moolenaar      for i in range(5)
27712eb6fc3bSBram Moolenaar        assert_equal(4, flist[i]())
27722eb6fc3bSBram Moolenaar      endfor
27732eb6fc3bSBram Moolenaar  END
27742eb6fc3bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
27752eb6fc3bSBram Moolenaar
27762eb6fc3bSBram Moolenaar  lines =<< trim END
27772eb6fc3bSBram Moolenaar      var flist: list<func>
27782eb6fc3bSBram Moolenaar      for i in range(5)
27792eb6fc3bSBram Moolenaar        var inloop = i
27802eb6fc3bSBram Moolenaar        flist[i] = () => {
27812eb6fc3bSBram Moolenaar              return inloop
27822eb6fc3bSBram Moolenaar            }
27832eb6fc3bSBram Moolenaar      endfor
27842eb6fc3bSBram Moolenaar      for i in range(5)
27852eb6fc3bSBram Moolenaar        assert_equal(4, flist[i]())
27862eb6fc3bSBram Moolenaar      endfor
27872eb6fc3bSBram Moolenaar  END
27882eb6fc3bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
27892eb6fc3bSBram Moolenaarenddef
27902eb6fc3bSBram Moolenaar
2791e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2792442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:')
2793442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:')
2794442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:')
2795442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2796442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2797442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:')
2798d4ab807dSBram Moolenaar  CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2799822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
28002d870f8dSBram Moolenaar  delfunc! g:Func
2801675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2802675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2803675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
280474e54fcbSBram Moolenaar
280574e54fcbSBram Moolenaar  # wrong type detected at compile time
280674e54fcbSBram Moolenaar  CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
280774e54fcbSBram Moolenaar
280874e54fcbSBram Moolenaar  # wrong type detected at runtime
280974e54fcbSBram Moolenaar  g:adict = {a: 1}
281074e54fcbSBram Moolenaar  CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
281174e54fcbSBram Moolenaar  unlet g:adict
2812f6a8d420SBram Moolenaar
2813f6a8d420SBram Moolenaar  var lines =<< trim END
2814f6a8d420SBram Moolenaar      var d: list<dict<any>> = [{a: 0}]
2815f6a8d420SBram Moolenaar      for e in d
2816f6a8d420SBram Moolenaar        e = {a: 0, b: ''}
2817f6a8d420SBram Moolenaar      endfor
2818f6a8d420SBram Moolenaar  END
2819f6a8d420SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3)
2820fe090eb5SBram Moolenaar
2821fe090eb5SBram Moolenaar  lines =<< trim END
2822fe090eb5SBram Moolenaar      for nr: number in ['foo']
2823fe090eb5SBram Moolenaar      endfor
2824fe090eb5SBram Moolenaar  END
2825fe090eb5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2826404557e6SBram Moolenaar
2827404557e6SBram Moolenaar  lines =<< trim END
2828404557e6SBram Moolenaar      for n : number in [1, 2]
2829404557e6SBram Moolenaar        echo n
2830404557e6SBram Moolenaar      endfor
2831404557e6SBram Moolenaar  END
2832404557e6SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1059:', 1)
2833efc5db52SBram Moolenaar
2834efc5db52SBram Moolenaar  lines =<< trim END
2835efc5db52SBram Moolenaar      var d: dict<number> = {a: 1, b: 2}
2836efc5db52SBram Moolenaar      for [k: job, v: job] in d->items()
2837efc5db52SBram Moolenaar        echo k v
2838efc5db52SBram Moolenaar      endfor
2839efc5db52SBram Moolenaar  END
2840efc5db52SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2)
2841e8c4abbbSBram Moolenaarenddef
2842e8c4abbbSBram Moolenaar
2843ea87069dSBram Moolenaardef Test_for_loop_script_var()
2844ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2845ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2846ea87069dSBram Moolenaar
2847ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2848ea87069dSBram Moolenaar  var lines =<< trim END
2849ea87069dSBram Moolenaar    vim9script
2850ea87069dSBram Moolenaar    var total = 0
2851ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2852ea87069dSBram Moolenaar      total += s:var
2853ea87069dSBram Moolenaar    endfor
2854ea87069dSBram Moolenaar    assert_equal(6, total)
2855ea87069dSBram Moolenaar
2856ea87069dSBram Moolenaar    total = 0
2857ea87069dSBram Moolenaar    for var in [1, 2, 3]
2858ea87069dSBram Moolenaar      total += var
2859ea87069dSBram Moolenaar    endfor
2860ea87069dSBram Moolenaar    assert_equal(6, total)
2861ea87069dSBram Moolenaar  END
2862ea87069dSBram Moolenaarenddef
2863ea87069dSBram Moolenaar
2864792f786aSBram Moolenaardef Test_for_loop_unpack()
28654b8a0651SBram Moolenaar  var lines =<< trim END
2866792f786aSBram Moolenaar      var result = []
2867792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2868792f786aSBram Moolenaar        result->add(v1)
2869792f786aSBram Moolenaar        result->add(v2)
2870792f786aSBram Moolenaar      endfor
2871792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2872792f786aSBram Moolenaar
2873792f786aSBram Moolenaar      result = []
2874792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2875792f786aSBram Moolenaar        result->add(v1)
2876792f786aSBram Moolenaar        result->add(v2)
2877792f786aSBram Moolenaar        result->add(v3)
2878792f786aSBram Moolenaar      endfor
2879792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2880792f786aSBram Moolenaar
28814b8a0651SBram Moolenaar      result = []
28824b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
28834b8a0651SBram Moolenaar        result->add(&ts)
28844b8a0651SBram Moolenaar        result->add(&sw)
28854b8a0651SBram Moolenaar      endfor
28864b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
28874b8a0651SBram Moolenaar
28884b8a0651SBram Moolenaar      var slist: list<string>
28894b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
28904b8a0651SBram Moolenaar        slist->add($LOOPVAR)
28914b8a0651SBram Moolenaar        slist->add(@r)
28924b8a0651SBram Moolenaar        slist->add(v:errmsg)
28934b8a0651SBram Moolenaar      endfor
28944b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
28954b8a0651SBram Moolenaar
28964b8a0651SBram Moolenaar      slist = []
28974b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
28984b8a0651SBram Moolenaar        slist->add(g:globalvar)
28994b8a0651SBram Moolenaar        slist->add(b:bufvar)
29004b8a0651SBram Moolenaar        slist->add(w:winvar)
29014b8a0651SBram Moolenaar        slist->add(t:tabvar)
29024b8a0651SBram Moolenaar      endfor
29034b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2904f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
2905b777da9bSBram Moolenaar
2906b777da9bSBram Moolenaar      var res = []
2907b777da9bSBram Moolenaar      for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2908b777da9bSBram Moolenaar        res->add(n)
2909b777da9bSBram Moolenaar      endfor
2910b777da9bSBram Moolenaar      assert_equal([2, 5], res)
29114b8a0651SBram Moolenaar  END
29124b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
29134b8a0651SBram Moolenaar
29144b8a0651SBram Moolenaar  lines =<< trim END
2915792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2916792f786aSBram Moolenaar        echo v1 v2
2917792f786aSBram Moolenaar      endfor
2918792f786aSBram Moolenaar  END
2919792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2920792f786aSBram Moolenaar
2921792f786aSBram Moolenaar  lines =<< trim END
2922792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2923792f786aSBram Moolenaar        echo v1 v2
2924792f786aSBram Moolenaar      endfor
2925792f786aSBram Moolenaar  END
2926792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2927792f786aSBram Moolenaar
2928792f786aSBram Moolenaar  lines =<< trim END
2929792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2930792f786aSBram Moolenaar        echo v1
2931792f786aSBram Moolenaar      endfor
2932792f786aSBram Moolenaar  END
2933792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2934792f786aSBram Moolenaarenddef
2935792f786aSBram Moolenaar
2936c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2937f2253963SBram Moolenaar  var lines =<< trim END
2938c150c09eSBram Moolenaar      var looped = 0
2939c150c09eSBram Moolenaar      var cleanup = 0
2940c150c09eSBram Moolenaar      for i in range(3)
2941c150c09eSBram Moolenaar        looped += 1
2942c150c09eSBram Moolenaar        try
2943c150c09eSBram Moolenaar          eval [][0]
2944c150c09eSBram Moolenaar        catch
2945c150c09eSBram Moolenaar          continue
2946c150c09eSBram Moolenaar        finally
2947c150c09eSBram Moolenaar          cleanup += 1
2948c150c09eSBram Moolenaar        endtry
2949c150c09eSBram Moolenaar      endfor
2950c150c09eSBram Moolenaar      assert_equal(3, looped)
2951c150c09eSBram Moolenaar      assert_equal(3, cleanup)
2952f2253963SBram Moolenaar  END
2953f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2954c150c09eSBram Moolenaarenddef
2955c150c09eSBram Moolenaar
2956d895b1d9Srbtnndef Test_while_skipped_block()
2957d895b1d9Srbtnn  # test skipped blocks at outside of function
2958d895b1d9Srbtnn  var lines =<< trim END
2959d895b1d9Srbtnn    var result = []
2960d895b1d9Srbtnn    var n = 0
2961d895b1d9Srbtnn    if true
2962d895b1d9Srbtnn      n = 1
2963d895b1d9Srbtnn      while n < 3
2964d895b1d9Srbtnn        result += [n]
2965d895b1d9Srbtnn        n += 1
2966d895b1d9Srbtnn      endwhile
2967d895b1d9Srbtnn    else
2968d895b1d9Srbtnn      n = 3
2969d895b1d9Srbtnn      while n < 5
2970d895b1d9Srbtnn        result += [n]
2971d895b1d9Srbtnn        n += 1
2972d895b1d9Srbtnn      endwhile
2973d895b1d9Srbtnn    endif
2974d895b1d9Srbtnn    assert_equal([1, 2], result)
2975d895b1d9Srbtnn
2976d895b1d9Srbtnn    result = []
2977d895b1d9Srbtnn    if false
2978d895b1d9Srbtnn      n = 1
2979d895b1d9Srbtnn      while n < 3
2980d895b1d9Srbtnn        result += [n]
2981d895b1d9Srbtnn        n += 1
2982d895b1d9Srbtnn      endwhile
2983d895b1d9Srbtnn    else
2984d895b1d9Srbtnn      n = 3
2985d895b1d9Srbtnn      while n < 5
2986d895b1d9Srbtnn        result += [n]
2987d895b1d9Srbtnn        n += 1
2988d895b1d9Srbtnn      endwhile
2989d895b1d9Srbtnn    endif
2990d895b1d9Srbtnn    assert_equal([3, 4], result)
2991d895b1d9Srbtnn  END
2992d895b1d9Srbtnn  CheckDefAndScriptSuccess(lines)
2993d895b1d9Srbtnn
2994d895b1d9Srbtnn  # test skipped blocks at inside of function
2995d895b1d9Srbtnn  lines =<< trim END
2996d895b1d9Srbtnn    def DefTrue()
2997d895b1d9Srbtnn      var result = []
2998d895b1d9Srbtnn      var n = 0
2999d895b1d9Srbtnn      if true
3000d895b1d9Srbtnn        n = 1
3001d895b1d9Srbtnn        while n < 3
3002d895b1d9Srbtnn          result += [n]
3003d895b1d9Srbtnn          n += 1
3004d895b1d9Srbtnn        endwhile
3005d895b1d9Srbtnn      else
3006d895b1d9Srbtnn        n = 3
3007d895b1d9Srbtnn        while n < 5
3008d895b1d9Srbtnn          result += [n]
3009d895b1d9Srbtnn          n += 1
3010d895b1d9Srbtnn        endwhile
3011d895b1d9Srbtnn      endif
3012d895b1d9Srbtnn      assert_equal([1, 2], result)
3013d895b1d9Srbtnn    enddef
3014d895b1d9Srbtnn    DefTrue()
3015d895b1d9Srbtnn
3016d895b1d9Srbtnn    def DefFalse()
3017d895b1d9Srbtnn      var result = []
3018d895b1d9Srbtnn      var n = 0
3019d895b1d9Srbtnn      if false
3020d895b1d9Srbtnn        n = 1
3021d895b1d9Srbtnn        while n < 3
3022d895b1d9Srbtnn          result += [n]
3023d895b1d9Srbtnn          n += 1
3024d895b1d9Srbtnn        endwhile
3025d895b1d9Srbtnn      else
3026d895b1d9Srbtnn        n = 3
3027d895b1d9Srbtnn        while n < 5
3028d895b1d9Srbtnn          result += [n]
3029d895b1d9Srbtnn          n += 1
3030d895b1d9Srbtnn        endwhile
3031d895b1d9Srbtnn      endif
3032d895b1d9Srbtnn      assert_equal([3, 4], result)
3033d895b1d9Srbtnn    enddef
3034d895b1d9Srbtnn    DefFalse()
3035d895b1d9Srbtnn  END
3036d895b1d9Srbtnn  CheckDefAndScriptSuccess(lines)
3037d895b1d9Srbtnnenddef
3038d895b1d9Srbtnn
3039d0df1aacSBram Moolenaardef Test_while_loop()
3040cfcd011fSBram Moolenaar  var result = ''
3041cfcd011fSBram Moolenaar  var cnt = 0
3042d0df1aacSBram Moolenaar  while cnt < 555
3043d0df1aacSBram Moolenaar    if cnt == 3
3044d0df1aacSBram Moolenaar      break
3045d0df1aacSBram Moolenaar    endif
3046d0df1aacSBram Moolenaar    cnt += 1
3047d0df1aacSBram Moolenaar    if cnt == 2
3048d0df1aacSBram Moolenaar      continue
3049d0df1aacSBram Moolenaar    endif
3050d0df1aacSBram Moolenaar    result ..= cnt .. '_'
3051d0df1aacSBram Moolenaar  endwhile
3052d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
3053dee37dc7SBram Moolenaar
3054dee37dc7SBram Moolenaar  var s = ''
30550123cc1eSBram Moolenaar  while s == 'x' # {comment}
3056dee37dc7SBram Moolenaar  endwhile
3057d0df1aacSBram Moolenaarenddef
3058d0df1aacSBram Moolenaar
3059e8c4abbbSBram Moolenaardef Test_while_loop_fails()
3060675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
3061675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
3062675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
3063675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
3064675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
3065675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
3066675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
30676628b7ebSBram Moolenaar
30686628b7ebSBram Moolenaar  var lines =<< trim END
30696628b7ebSBram Moolenaar      var s = ''
30706628b7ebSBram Moolenaar      while s = ''
30716628b7ebSBram Moolenaar      endwhile
30726628b7ebSBram Moolenaar  END
30736628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
3074bd5da371SBram Moolenaarenddef
3075bd5da371SBram Moolenaar
30769645e2d9SBram Moolenaardef Test_interrupt_loop()
3077cfcd011fSBram Moolenaar  var caught = false
3078cfcd011fSBram Moolenaar  var x = 0
307997acfc78SBram Moolenaar  try
30809645e2d9SBram Moolenaar    while 1
30819645e2d9SBram Moolenaar      x += 1
30829645e2d9SBram Moolenaar      if x == 100
30839645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
30849645e2d9SBram Moolenaar      endif
30859645e2d9SBram Moolenaar    endwhile
308697acfc78SBram Moolenaar  catch
308797acfc78SBram Moolenaar    caught = true
308897acfc78SBram Moolenaar    assert_equal(100, x)
308997acfc78SBram Moolenaar  endtry
309097acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
309125859dd7SBram Moolenaar  # consume the CTRL-C
309225859dd7SBram Moolenaar  getchar(0)
30939645e2d9SBram Moolenaarenddef
309420431c9dSBram Moolenaar
30954fdae999SBram Moolenaardef Test_automatic_line_continuation()
3096cfcd011fSBram Moolenaar  var mylist = [
30974fdae999SBram Moolenaar      'one',
30984fdae999SBram Moolenaar      'two',
30994fdae999SBram Moolenaar      'three',
3100f5be8cdbSBram Moolenaar      ] # comment
31014fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
31024fdae999SBram Moolenaar
3103cfcd011fSBram Moolenaar  var mydict = {
3104e0de171eSBram Moolenaar      ['one']: 1,
3105e0de171eSBram Moolenaar      ['two']: 2,
3106e0de171eSBram Moolenaar      ['three']:
31074fdae999SBram Moolenaar          3,
3108f5be8cdbSBram Moolenaar      } # comment
3109e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
3110e0de171eSBram Moolenaar  mydict = {
31112c330432SBram Moolenaar      one: 1,  # comment
31122c330432SBram Moolenaar      two:     # comment
31132c330432SBram Moolenaar           2,  # comment
31142c330432SBram Moolenaar      three: 3 # comment
31152c330432SBram Moolenaar      }
3116e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
3117e0de171eSBram Moolenaar  mydict = {
31182c330432SBram Moolenaar      one: 1,
31194fdae999SBram Moolenaar      two:
31204fdae999SBram Moolenaar           2,
31212c330432SBram Moolenaar      three: 3
31224fdae999SBram Moolenaar      }
3123e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
3124e6085c53SBram Moolenaar
3125e6085c53SBram Moolenaar  assert_equal(
3126e6085c53SBram Moolenaar        ['one', 'two', 'three'],
3127e6085c53SBram Moolenaar        split('one two three')
3128e6085c53SBram Moolenaar        )
31294fdae999SBram Moolenaarenddef
31304fdae999SBram Moolenaar
31317a092245SBram Moolenaardef Test_vim9_comment()
31327a092245SBram Moolenaar  CheckScriptSuccess([
31337a092245SBram Moolenaar      'vim9script',
31347a092245SBram Moolenaar      '# something',
313593f82cbeSBram Moolenaar      '#something',
313693f82cbeSBram Moolenaar      '#{something',
31377a092245SBram Moolenaar      ])
313893f82cbeSBram Moolenaar
313993f82cbeSBram Moolenaar  split Xfile
314093f82cbeSBram Moolenaar  CheckScriptSuccess([
314193f82cbeSBram Moolenaar      'vim9script',
314293f82cbeSBram Moolenaar      'edit #something',
314393f82cbeSBram Moolenaar      ])
314493f82cbeSBram Moolenaar  CheckScriptSuccess([
314593f82cbeSBram Moolenaar      'vim9script',
314693f82cbeSBram Moolenaar      'edit #{something',
314793f82cbeSBram Moolenaar      ])
314893f82cbeSBram Moolenaar  close
314993f82cbeSBram Moolenaar
31507a092245SBram Moolenaar  CheckScriptFailure([
31517a092245SBram Moolenaar      'vim9script',
31527a092245SBram Moolenaar      ':# something',
31537a092245SBram Moolenaar      ], 'E488:')
31547a092245SBram Moolenaar  CheckScriptFailure([
31557a092245SBram Moolenaar      '# something',
31567a092245SBram Moolenaar      ], 'E488:')
31577a092245SBram Moolenaar  CheckScriptFailure([
31587a092245SBram Moolenaar      ':# something',
31597a092245SBram Moolenaar      ], 'E488:')
31607a092245SBram Moolenaar
31614a8d9f2eSBram Moolenaar  { # block start
31624a8d9f2eSBram Moolenaar  } # block end
31634a8d9f2eSBram Moolenaar  CheckDefFailure([
31644a8d9f2eSBram Moolenaar      '{# comment',
31654a8d9f2eSBram Moolenaar      ], 'E488:')
31664a8d9f2eSBram Moolenaar  CheckDefFailure([
31674a8d9f2eSBram Moolenaar      '{',
31684a8d9f2eSBram Moolenaar      '}# comment',
31694a8d9f2eSBram Moolenaar      ], 'E488:')
31704a8d9f2eSBram Moolenaar
31714a8d9f2eSBram Moolenaar  echo "yes" # comment
31724a8d9f2eSBram Moolenaar  CheckDefFailure([
31734a8d9f2eSBram Moolenaar      'echo "yes"# comment',
31744a8d9f2eSBram Moolenaar      ], 'E488:')
31757a092245SBram Moolenaar  CheckScriptSuccess([
31767a092245SBram Moolenaar      'vim9script',
31777a092245SBram Moolenaar      'echo "yes" # something',
31787a092245SBram Moolenaar      ])
31797a092245SBram Moolenaar  CheckScriptFailure([
31807a092245SBram Moolenaar      'vim9script',
31817a092245SBram Moolenaar      'echo "yes"# something',
31827a092245SBram Moolenaar      ], 'E121:')
31837a092245SBram Moolenaar  CheckScriptFailure([
31847a092245SBram Moolenaar      'vim9script',
31857a092245SBram Moolenaar      'echo# something',
3186f8103f27SBram Moolenaar      ], 'E1144:')
31877a092245SBram Moolenaar  CheckScriptFailure([
31887a092245SBram Moolenaar      'echo "yes" # something',
31897a092245SBram Moolenaar      ], 'E121:')
31907a092245SBram Moolenaar
31914a8d9f2eSBram Moolenaar  exe "echo" # comment
31924a8d9f2eSBram Moolenaar  CheckDefFailure([
31934a8d9f2eSBram Moolenaar      'exe "echo"# comment',
31944a8d9f2eSBram Moolenaar      ], 'E488:')
31954a8d9f2eSBram Moolenaar  CheckScriptSuccess([
31964a8d9f2eSBram Moolenaar      'vim9script',
31974a8d9f2eSBram Moolenaar      'exe "echo" # something',
31984a8d9f2eSBram Moolenaar      ])
31994a8d9f2eSBram Moolenaar  CheckScriptFailure([
32004a8d9f2eSBram Moolenaar      'vim9script',
32014a8d9f2eSBram Moolenaar      'exe "echo"# something',
32024a8d9f2eSBram Moolenaar      ], 'E121:')
32034a8d9f2eSBram Moolenaar  CheckScriptFailure([
32044a8d9f2eSBram Moolenaar      'vim9script',
32054a8d9f2eSBram Moolenaar      'exe# something',
3206f8103f27SBram Moolenaar      ], 'E1144:')
32074a8d9f2eSBram Moolenaar  CheckScriptFailure([
32084a8d9f2eSBram Moolenaar      'exe "echo" # something',
32094a8d9f2eSBram Moolenaar      ], 'E121:')
32104a8d9f2eSBram Moolenaar
32117a092245SBram Moolenaar  CheckDefFailure([
32127a092245SBram Moolenaar      'try# comment',
32137a092245SBram Moolenaar      '  echo "yes"',
32147a092245SBram Moolenaar      'catch',
32157a092245SBram Moolenaar      'endtry',
3216f8103f27SBram Moolenaar      ], 'E1144:')
32172c5ed4e3SBram Moolenaar  CheckScriptFailure([
32182c5ed4e3SBram Moolenaar      'vim9script',
32192c5ed4e3SBram Moolenaar      'try# comment',
32202c5ed4e3SBram Moolenaar      'echo "yes"',
3221f8103f27SBram Moolenaar      ], 'E1144:')
32227a092245SBram Moolenaar  CheckDefFailure([
32237a092245SBram Moolenaar      'try',
3224a72cfb80SBram Moolenaar      '  throw#comment',
3225a72cfb80SBram Moolenaar      'catch',
3226a72cfb80SBram Moolenaar      'endtry',
3227f8103f27SBram Moolenaar      ], 'E1144:')
3228a72cfb80SBram Moolenaar  CheckDefFailure([
3229a72cfb80SBram Moolenaar      'try',
3230a72cfb80SBram Moolenaar      '  throw "yes"#comment',
3231a72cfb80SBram Moolenaar      'catch',
3232a72cfb80SBram Moolenaar      'endtry',
3233a72cfb80SBram Moolenaar      ], 'E488:')
3234a72cfb80SBram Moolenaar  CheckDefFailure([
3235a72cfb80SBram Moolenaar      'try',
32367a092245SBram Moolenaar      '  echo "yes"',
32377a092245SBram Moolenaar      'catch# comment',
32387a092245SBram Moolenaar      'endtry',
3239f8103f27SBram Moolenaar      ], 'E1144:')
32402c5ed4e3SBram Moolenaar  CheckScriptFailure([
32412c5ed4e3SBram Moolenaar      'vim9script',
32422c5ed4e3SBram Moolenaar      'try',
32432c5ed4e3SBram Moolenaar      '  echo "yes"',
32442c5ed4e3SBram Moolenaar      'catch# comment',
32452c5ed4e3SBram Moolenaar      'endtry',
3246f8103f27SBram Moolenaar      ], 'E1144:')
32472c5ed4e3SBram Moolenaar  CheckDefFailure([
32482c5ed4e3SBram Moolenaar      'try',
32492c5ed4e3SBram Moolenaar      '  echo "yes"',
32502c5ed4e3SBram Moolenaar      'catch /pat/# comment',
32512c5ed4e3SBram Moolenaar      'endtry',
32522c5ed4e3SBram Moolenaar      ], 'E488:')
32537a092245SBram Moolenaar  CheckDefFailure([
32547a092245SBram Moolenaar      'try',
32557a092245SBram Moolenaar      'echo "yes"',
32567a092245SBram Moolenaar      'catch',
32577a092245SBram Moolenaar      'endtry# comment',
3258f8103f27SBram Moolenaar      ], 'E1144:')
32592c5ed4e3SBram Moolenaar  CheckScriptFailure([
32602c5ed4e3SBram Moolenaar      'vim9script',
32612c5ed4e3SBram Moolenaar      'try',
32622c5ed4e3SBram Moolenaar      '  echo "yes"',
32632c5ed4e3SBram Moolenaar      'catch',
32642c5ed4e3SBram Moolenaar      'endtry# comment',
3265f8103f27SBram Moolenaar      ], 'E1144:')
32662c5ed4e3SBram Moolenaar
32672c5ed4e3SBram Moolenaar  CheckScriptSuccess([
32682c5ed4e3SBram Moolenaar      'vim9script',
32692c5ed4e3SBram Moolenaar      'hi # comment',
32702c5ed4e3SBram Moolenaar      ])
32712c5ed4e3SBram Moolenaar  CheckScriptFailure([
32722c5ed4e3SBram Moolenaar      'vim9script',
32732c5ed4e3SBram Moolenaar      'hi# comment',
3274f8103f27SBram Moolenaar      ], 'E1144:')
32751966c248SBram Moolenaar  CheckScriptSuccess([
32761966c248SBram Moolenaar      'vim9script',
32771966c248SBram Moolenaar      'hi Search # comment',
32781966c248SBram Moolenaar      ])
32791966c248SBram Moolenaar  CheckScriptFailure([
32801966c248SBram Moolenaar      'vim9script',
32811966c248SBram Moolenaar      'hi Search# comment',
32821966c248SBram Moolenaar      ], 'E416:')
32831966c248SBram Moolenaar  CheckScriptSuccess([
32841966c248SBram Moolenaar      'vim9script',
32851966c248SBram Moolenaar      'hi link This Search # comment',
32861966c248SBram Moolenaar      ])
32871966c248SBram Moolenaar  CheckScriptFailure([
32881966c248SBram Moolenaar      'vim9script',
32891966c248SBram Moolenaar      'hi link This That# comment',
32901966c248SBram Moolenaar      ], 'E413:')
32911966c248SBram Moolenaar  CheckScriptSuccess([
32921966c248SBram Moolenaar      'vim9script',
32931966c248SBram Moolenaar      'hi clear This # comment',
32941966c248SBram Moolenaar      'hi clear # comment',
32951966c248SBram Moolenaar      ])
3296f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
3297f5be8cdbSBram Moolenaar  # hi clear This# comment',
32981966c248SBram Moolenaar  CheckScriptFailure([
32991966c248SBram Moolenaar      'vim9script',
33001966c248SBram Moolenaar      'hi clear# comment',
33011966c248SBram Moolenaar      ], 'E416:')
33021966c248SBram Moolenaar
33031966c248SBram Moolenaar  CheckScriptSuccess([
33041966c248SBram Moolenaar      'vim9script',
33051966c248SBram Moolenaar      'hi Group term=bold',
33061966c248SBram Moolenaar      'match Group /todo/ # comment',
33071966c248SBram Moolenaar      ])
33081966c248SBram Moolenaar  CheckScriptFailure([
33091966c248SBram Moolenaar      'vim9script',
33101966c248SBram Moolenaar      'hi Group term=bold',
33111966c248SBram Moolenaar      'match Group /todo/# comment',
33121966c248SBram Moolenaar      ], 'E488:')
33131966c248SBram Moolenaar  CheckScriptSuccess([
33141966c248SBram Moolenaar      'vim9script',
33151966c248SBram Moolenaar      'match # comment',
33161966c248SBram Moolenaar      ])
33171966c248SBram Moolenaar  CheckScriptFailure([
33181966c248SBram Moolenaar      'vim9script',
33191966c248SBram Moolenaar      'match# comment',
3320f8103f27SBram Moolenaar      ], 'E1144:')
33211966c248SBram Moolenaar  CheckScriptSuccess([
33221966c248SBram Moolenaar      'vim9script',
33231966c248SBram Moolenaar      'match none # comment',
33241966c248SBram Moolenaar      ])
33251966c248SBram Moolenaar  CheckScriptFailure([
33261966c248SBram Moolenaar      'vim9script',
33271966c248SBram Moolenaar      'match none# comment',
33281966c248SBram Moolenaar      ], 'E475:')
33291966c248SBram Moolenaar
33301966c248SBram Moolenaar  CheckScriptSuccess([
33311966c248SBram Moolenaar      'vim9script',
33321966c248SBram Moolenaar      'menutrans clear # comment',
33331966c248SBram Moolenaar      ])
33341966c248SBram Moolenaar  CheckScriptFailure([
33351966c248SBram Moolenaar      'vim9script',
33361966c248SBram Moolenaar      'menutrans clear# comment text',
33371966c248SBram Moolenaar      ], 'E474:')
33381966c248SBram Moolenaar
33391966c248SBram Moolenaar  CheckScriptSuccess([
33401966c248SBram Moolenaar      'vim9script',
33411966c248SBram Moolenaar      'syntax clear # comment',
33421966c248SBram Moolenaar      ])
33431966c248SBram Moolenaar  CheckScriptFailure([
33441966c248SBram Moolenaar      'vim9script',
33451966c248SBram Moolenaar      'syntax clear# comment text',
33461966c248SBram Moolenaar      ], 'E28:')
33471966c248SBram Moolenaar  CheckScriptSuccess([
33481966c248SBram Moolenaar      'vim9script',
33491966c248SBram Moolenaar      'syntax keyword Word some',
33501966c248SBram Moolenaar      'syntax clear Word # comment',
33511966c248SBram Moolenaar      ])
33521966c248SBram Moolenaar  CheckScriptFailure([
33531966c248SBram Moolenaar      'vim9script',
33541966c248SBram Moolenaar      'syntax keyword Word some',
33551966c248SBram Moolenaar      'syntax clear Word# comment text',
33561966c248SBram Moolenaar      ], 'E28:')
33571966c248SBram Moolenaar
33581966c248SBram Moolenaar  CheckScriptSuccess([
33591966c248SBram Moolenaar      'vim9script',
33601966c248SBram Moolenaar      'syntax list # comment',
33611966c248SBram Moolenaar      ])
33621966c248SBram Moolenaar  CheckScriptFailure([
33631966c248SBram Moolenaar      'vim9script',
33641966c248SBram Moolenaar      'syntax list# comment text',
33651966c248SBram Moolenaar      ], 'E28:')
33661966c248SBram Moolenaar
33671966c248SBram Moolenaar  CheckScriptSuccess([
33681966c248SBram Moolenaar      'vim9script',
33691966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
33701966c248SBram Moolenaar      ])
33711966c248SBram Moolenaar  CheckScriptFailure([
33721966c248SBram Moolenaar      'vim9script',
33731966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
33741966c248SBram Moolenaar      ], 'E475:')
33751966c248SBram Moolenaar
33761966c248SBram Moolenaar  CheckScriptSuccess([
33771966c248SBram Moolenaar      'vim9script',
33781966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
33791966c248SBram Moolenaar      ])
33801966c248SBram Moolenaar  CheckScriptFailure([
33811966c248SBram Moolenaar      'vim9script',
33821966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
33831966c248SBram Moolenaar      ], 'E789:')
33841966c248SBram Moolenaar
33851966c248SBram Moolenaar  CheckScriptSuccess([
33861966c248SBram Moolenaar      'vim9script',
33871966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
33881966c248SBram Moolenaar      ])
33891966c248SBram Moolenaar  CheckScriptFailure([
33901966c248SBram Moolenaar      'vim9script',
33911966c248SBram Moolenaar      'syntax match Word /pat/# comment',
33921966c248SBram Moolenaar      ], 'E402:')
33931966c248SBram Moolenaar
33941966c248SBram Moolenaar  CheckScriptSuccess([
33951966c248SBram Moolenaar      'vim9script',
33961966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
33971966c248SBram Moolenaar      ])
33981966c248SBram Moolenaar  CheckScriptFailure([
33991966c248SBram Moolenaar      'vim9script',
34001966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
34011966c248SBram Moolenaar      ], 'E475:')
34021966c248SBram Moolenaar  CheckScriptFailure([
34031966c248SBram Moolenaar      'vim9script',
34041966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
34051966c248SBram Moolenaar      ], 'E406:')
34061966c248SBram Moolenaar  CheckScriptFailure([
34071966c248SBram Moolenaar      'vim9script',
34081966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
34091966c248SBram Moolenaar      ], 'E475:')
34101966c248SBram Moolenaar
34111966c248SBram Moolenaar  CheckScriptSuccess([
34121966c248SBram Moolenaar      'vim9script',
34131966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
34141966c248SBram Moolenaar      ])
34151966c248SBram Moolenaar  CheckScriptFailure([
34161966c248SBram Moolenaar      'vim9script',
34171966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
3418d032f34aSBram Moolenaar      ], 'E402:')
34191966c248SBram Moolenaar
34201966c248SBram Moolenaar  CheckScriptSuccess([
34211966c248SBram Moolenaar      'vim9script',
34221966c248SBram Moolenaar      'syntax sync # comment',
34231966c248SBram Moolenaar      ])
34241966c248SBram Moolenaar  CheckScriptFailure([
34251966c248SBram Moolenaar      'vim9script',
34261966c248SBram Moolenaar      'syntax sync# comment',
34271966c248SBram Moolenaar      ], 'E404:')
34281966c248SBram Moolenaar  CheckScriptSuccess([
34291966c248SBram Moolenaar      'vim9script',
34301966c248SBram Moolenaar      'syntax sync ccomment # comment',
34311966c248SBram Moolenaar      ])
34321966c248SBram Moolenaar  CheckScriptFailure([
34331966c248SBram Moolenaar      'vim9script',
34341966c248SBram Moolenaar      'syntax sync ccomment# comment',
34351966c248SBram Moolenaar      ], 'E404:')
34361966c248SBram Moolenaar
34371966c248SBram Moolenaar  CheckScriptSuccess([
34381966c248SBram Moolenaar      'vim9script',
34391966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
34401966c248SBram Moolenaar      ])
34411966c248SBram Moolenaar  CheckScriptFailure([
34421966c248SBram Moolenaar      'vim9script',
34431966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
34441966c248SBram Moolenaar      ], 'E475:')
3445a72cfb80SBram Moolenaar
3446a72cfb80SBram Moolenaar  CheckScriptSuccess([
3447a72cfb80SBram Moolenaar      'vim9script',
3448a72cfb80SBram Moolenaar      'command Echo echo # comment',
3449a72cfb80SBram Moolenaar      'command Echo # comment',
34502d870f8dSBram Moolenaar      'delcommand Echo',
3451a72cfb80SBram Moolenaar      ])
3452a72cfb80SBram Moolenaar  CheckScriptFailure([
3453a72cfb80SBram Moolenaar      'vim9script',
3454a72cfb80SBram Moolenaar      'command Echo echo# comment',
3455a72cfb80SBram Moolenaar      'Echo',
3456f8103f27SBram Moolenaar      ], 'E1144:')
34572d870f8dSBram Moolenaar  delcommand Echo
345870249ee8SBram Moolenaar
345970249ee8SBram Moolenaar  var curdir = getcwd()
346070249ee8SBram Moolenaar  CheckScriptSuccess([
346170249ee8SBram Moolenaar      'command Echo cd " comment',
346270249ee8SBram Moolenaar      'Echo',
346370249ee8SBram Moolenaar      'delcommand Echo',
346470249ee8SBram Moolenaar      ])
346570249ee8SBram Moolenaar  CheckScriptSuccess([
3466090728adSBram Moolenaar      'vim9script',
346770249ee8SBram Moolenaar      'command Echo cd # comment',
346870249ee8SBram Moolenaar      'Echo',
346970249ee8SBram Moolenaar      'delcommand Echo',
347070249ee8SBram Moolenaar      ])
347170249ee8SBram Moolenaar  CheckScriptFailure([
347270249ee8SBram Moolenaar      'vim9script',
347370249ee8SBram Moolenaar      'command Echo cd " comment',
347470249ee8SBram Moolenaar      'Echo',
347570249ee8SBram Moolenaar      ], 'E344:')
347670249ee8SBram Moolenaar  delcommand Echo
347770249ee8SBram Moolenaar  chdir(curdir)
347870249ee8SBram Moolenaar
3479a72cfb80SBram Moolenaar  CheckScriptFailure([
3480a72cfb80SBram Moolenaar      'vim9script',
3481a72cfb80SBram Moolenaar      'command Echo# comment',
3482a72cfb80SBram Moolenaar      ], 'E182:')
3483a72cfb80SBram Moolenaar  CheckScriptFailure([
3484a72cfb80SBram Moolenaar      'vim9script',
3485a72cfb80SBram Moolenaar      'command Echo echo',
3486a72cfb80SBram Moolenaar      'command Echo# comment',
3487a72cfb80SBram Moolenaar      ], 'E182:')
34882d870f8dSBram Moolenaar  delcommand Echo
3489a72cfb80SBram Moolenaar
3490a72cfb80SBram Moolenaar  CheckScriptSuccess([
3491a72cfb80SBram Moolenaar      'vim9script',
3492a72cfb80SBram Moolenaar      'function # comment',
3493a72cfb80SBram Moolenaar      ])
3494a72cfb80SBram Moolenaar  CheckScriptFailure([
3495a72cfb80SBram Moolenaar      'vim9script',
34969898107fSBram Moolenaar      'function " comment',
34979898107fSBram Moolenaar      ], 'E129:')
34989898107fSBram Moolenaar  CheckScriptFailure([
34999898107fSBram Moolenaar      'vim9script',
3500a72cfb80SBram Moolenaar      'function# comment',
3501f8103f27SBram Moolenaar      ], 'E1144:')
3502a72cfb80SBram Moolenaar  CheckScriptSuccess([
3503a72cfb80SBram Moolenaar      'vim9script',
3504a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
3505a72cfb80SBram Moolenaar      ])
3506a72cfb80SBram Moolenaar  CheckScriptFailure([
3507a72cfb80SBram Moolenaar      'vim9script',
3508a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
3509a72cfb80SBram Moolenaar      ], 'E488:')
3510a72cfb80SBram Moolenaar
3511a72cfb80SBram Moolenaar  CheckScriptSuccess([
3512a72cfb80SBram Moolenaar      'vim9script',
35134c17ad94SBram Moolenaar      'func g:DeleteMeA()',
3514a72cfb80SBram Moolenaar      'endfunc',
35154c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
3516a72cfb80SBram Moolenaar      ])
3517a72cfb80SBram Moolenaar  CheckScriptFailure([
3518a72cfb80SBram Moolenaar      'vim9script',
35194c17ad94SBram Moolenaar      'func g:DeleteMeB()',
3520a72cfb80SBram Moolenaar      'endfunc',
35214c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
3522a72cfb80SBram Moolenaar      ], 'E488:')
3523a72cfb80SBram Moolenaar
3524a72cfb80SBram Moolenaar  CheckScriptSuccess([
3525a72cfb80SBram Moolenaar      'vim9script',
3526a72cfb80SBram Moolenaar      'call execute("ls") # comment',
3527a72cfb80SBram Moolenaar      ])
3528a72cfb80SBram Moolenaar  CheckScriptFailure([
3529a72cfb80SBram Moolenaar      'vim9script',
3530a72cfb80SBram Moolenaar      'call execute("ls")# comment',
3531a72cfb80SBram Moolenaar      ], 'E488:')
3532e7e4838fSBram Moolenaar
3533e7e4838fSBram Moolenaar  CheckScriptFailure([
3534e7e4838fSBram Moolenaar      'def Test() " comment',
3535e7e4838fSBram Moolenaar      'enddef',
3536e7e4838fSBram Moolenaar      ], 'E488:')
3537e7e4838fSBram Moolenaar  CheckScriptFailure([
3538e7e4838fSBram Moolenaar      'vim9script',
3539e7e4838fSBram Moolenaar      'def Test() " comment',
3540e7e4838fSBram Moolenaar      'enddef',
3541e7e4838fSBram Moolenaar      ], 'E488:')
3542e7e4838fSBram Moolenaar
3543e7e4838fSBram Moolenaar  CheckScriptSuccess([
3544e7e4838fSBram Moolenaar      'func Test() " comment',
3545e7e4838fSBram Moolenaar      'endfunc',
35462d870f8dSBram Moolenaar      'delfunc Test',
3547e7e4838fSBram Moolenaar      ])
35489898107fSBram Moolenaar  CheckScriptSuccess([
3549e7e4838fSBram Moolenaar      'vim9script',
3550e7e4838fSBram Moolenaar      'func Test() " comment',
3551e7e4838fSBram Moolenaar      'endfunc',
35529898107fSBram Moolenaar      ])
3553e7e4838fSBram Moolenaar
3554e7e4838fSBram Moolenaar  CheckScriptSuccess([
3555e7e4838fSBram Moolenaar      'def Test() # comment',
3556e7e4838fSBram Moolenaar      'enddef',
3557e7e4838fSBram Moolenaar      ])
3558e7e4838fSBram Moolenaar  CheckScriptFailure([
3559e7e4838fSBram Moolenaar      'func Test() # comment',
3560e7e4838fSBram Moolenaar      'endfunc',
3561e7e4838fSBram Moolenaar      ], 'E488:')
35620f37e356SBram Moolenaar
35630f37e356SBram Moolenaar  var lines =<< trim END
35640f37e356SBram Moolenaar      vim9script
35650f37e356SBram Moolenaar      syn region Text
35660f37e356SBram Moolenaar      \ start='foo'
35670f37e356SBram Moolenaar      #\ comment
35680f37e356SBram Moolenaar      \ end='bar'
35695072b47aSBram Moolenaar      syn region Text start='foo'
35705072b47aSBram Moolenaar      #\ comment
35715072b47aSBram Moolenaar      \ end='bar'
35720f37e356SBram Moolenaar  END
35730f37e356SBram Moolenaar  CheckScriptSuccess(lines)
35740f37e356SBram Moolenaar
35750f37e356SBram Moolenaar  lines =<< trim END
35760f37e356SBram Moolenaar      vim9script
35770f37e356SBram Moolenaar      syn region Text
35780f37e356SBram Moolenaar      \ start='foo'
35790f37e356SBram Moolenaar      "\ comment
35800f37e356SBram Moolenaar      \ end='bar'
35810f37e356SBram Moolenaar  END
35820f37e356SBram Moolenaar  CheckScriptFailure(lines, 'E399:')
35832c5ed4e3SBram Moolenaarenddef
35842c5ed4e3SBram Moolenaar
35852c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
35862c5ed4e3SBram Moolenaar  CheckCanRunGui
35872c5ed4e3SBram Moolenaar
35882c5ed4e3SBram Moolenaar  CheckScriptFailure([
35892c5ed4e3SBram Moolenaar      'vim9script',
35902c5ed4e3SBram Moolenaar      'gui#comment'
3591f8103f27SBram Moolenaar      ], 'E1144:')
35922c5ed4e3SBram Moolenaar  CheckScriptFailure([
35932c5ed4e3SBram Moolenaar      'vim9script',
35942c5ed4e3SBram Moolenaar      'gui -f#comment'
3595b8bd2e6eSBram Moolenaar      ], 'E194:')
35967a092245SBram Moolenaarenddef
35977a092245SBram Moolenaar
3598a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
35996797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
36006797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3601a26b9700SBram Moolenaar
3602a26b9700SBram Moolenaar  edit test.vim
3603a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3604a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3605a26b9700SBram Moolenaar
3606a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3607a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3608a26b9700SBram Moolenaar
3609a26b9700SBram Moolenaar  g:entered = 0
3610a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3611a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3612a26b9700SBram Moolenaar
3613a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3614a26b9700SBram Moolenaar
3615a26b9700SBram Moolenaar  au! TabEnter
3616a26b9700SBram Moolenaar  unlet g:entered
3617d72c1bf0SBram Moolenaar
3618d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3619d72c1bf0SBram Moolenaar      'vim9script',
36206797966dSBram Moolenaar      'g:var = 123',
3621e55b1c09SBram Moolenaar      'b:var = 456',
3622e55b1c09SBram Moolenaar      'w:var = 777',
3623e55b1c09SBram Moolenaar      't:var = 888',
3624d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3625d72c1bf0SBram Moolenaar      ])
3626d72c1bf0SBram Moolenaar
3627d72c1bf0SBram Moolenaar  CheckScriptFailure([
3628d72c1bf0SBram Moolenaar      'vim9script',
3629cfcd011fSBram Moolenaar      'let var = 123',
3630cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3631cfcd011fSBram Moolenaar
3632cfcd011fSBram Moolenaar  CheckScriptFailure([
3633cfcd011fSBram Moolenaar      'vim9script',
3634cfcd011fSBram Moolenaar      'var g:var = 123',
3635e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3636e55b1c09SBram Moolenaar
3637e55b1c09SBram Moolenaar  CheckScriptFailure([
3638e55b1c09SBram Moolenaar      'vim9script',
3639cfcd011fSBram Moolenaar      'var b:var = 123',
3640e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3641e55b1c09SBram Moolenaar
3642e55b1c09SBram Moolenaar  CheckScriptFailure([
3643e55b1c09SBram Moolenaar      'vim9script',
3644cfcd011fSBram Moolenaar      'var w:var = 123',
3645e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3646e55b1c09SBram Moolenaar
3647e55b1c09SBram Moolenaar  CheckScriptFailure([
3648e55b1c09SBram Moolenaar      'vim9script',
3649cfcd011fSBram Moolenaar      'var t:var = 123',
3650e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3651e55b1c09SBram Moolenaar
3652e55b1c09SBram Moolenaar  CheckScriptFailure([
3653e55b1c09SBram Moolenaar      'vim9script',
3654cfcd011fSBram Moolenaar      'var v:version = 123',
3655e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3656e55b1c09SBram Moolenaar
3657e55b1c09SBram Moolenaar  CheckScriptFailure([
3658e55b1c09SBram Moolenaar      'vim9script',
3659cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3660e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
36616797966dSBram Moolenaar
36626797966dSBram Moolenaar  CheckScriptFailure([
36636797966dSBram Moolenaar      'vim9script',
36646797966dSBram Moolenaar      'g:var = 123',
366532e35117SBram Moolenaar      'unlet g:var# comment1',
3666d72c1bf0SBram Moolenaar      ], 'E108:')
3667d72c1bf0SBram Moolenaar
3668d72c1bf0SBram Moolenaar  CheckScriptFailure([
3669d72c1bf0SBram Moolenaar      'let g:var = 123',
3670d72c1bf0SBram Moolenaar      'unlet g:var # something',
3671d72c1bf0SBram Moolenaar      ], 'E488:')
3672faac4104SBram Moolenaar
3673faac4104SBram Moolenaar  CheckScriptSuccess([
3674faac4104SBram Moolenaar      'vim9script',
367532e35117SBram Moolenaar      'if 1 # comment2',
3676faac4104SBram Moolenaar      '  echo "yes"',
3677faac4104SBram Moolenaar      'elseif 2 #comment',
3678faac4104SBram Moolenaar      '  echo "no"',
3679faac4104SBram Moolenaar      'endif',
3680faac4104SBram Moolenaar      ])
3681faac4104SBram Moolenaar
3682faac4104SBram Moolenaar  CheckScriptFailure([
3683faac4104SBram Moolenaar      'vim9script',
368432e35117SBram Moolenaar      'if 1# comment3',
3685faac4104SBram Moolenaar      '  echo "yes"',
3686faac4104SBram Moolenaar      'endif',
3687fae55a9cSBram Moolenaar      ], 'E488:')
3688faac4104SBram Moolenaar
3689faac4104SBram Moolenaar  CheckScriptFailure([
3690faac4104SBram Moolenaar      'vim9script',
369132e35117SBram Moolenaar      'if 0 # comment4',
3692faac4104SBram Moolenaar      '  echo "yes"',
3693faac4104SBram Moolenaar      'elseif 2#comment',
3694faac4104SBram Moolenaar      '  echo "no"',
3695faac4104SBram Moolenaar      'endif',
3696fae55a9cSBram Moolenaar      ], 'E488:')
3697faac4104SBram Moolenaar
3698faac4104SBram Moolenaar  CheckScriptSuccess([
3699faac4104SBram Moolenaar      'vim9script',
3700cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3701faac4104SBram Moolenaar      ])
3702faac4104SBram Moolenaar
3703faac4104SBram Moolenaar  CheckScriptFailure([
3704faac4104SBram Moolenaar      'vim9script',
3705cfcd011fSBram Moolenaar      'var v = 1# comment6',
3706fae55a9cSBram Moolenaar      ], 'E488:')
3707faac4104SBram Moolenaar
3708faac4104SBram Moolenaar  CheckScriptSuccess([
3709faac4104SBram Moolenaar      'vim9script',
3710faac4104SBram Moolenaar      'new'
3711d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3712df069eecSBram Moolenaar      ':$',
3713faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3714faac4104SBram Moolenaar      'bwipe!',
3715faac4104SBram Moolenaar      ])
3716faac4104SBram Moolenaar
3717f5be8cdbSBram Moolenaar  CheckScriptFailure([
3718f5be8cdbSBram Moolenaar      'vim9script',
3719f5be8cdbSBram Moolenaar      'new'
3720d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3721f5be8cdbSBram Moolenaar      ':$',
3722f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3723f5be8cdbSBram Moolenaar      'bwipe!',
3724f5be8cdbSBram Moolenaar      ], 'E488:')
3725f5be8cdbSBram Moolenaar
3726f5be8cdbSBram Moolenaar  CheckScriptFailure([
3727f5be8cdbSBram Moolenaar      'vim9script',
3728f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3729f5be8cdbSBram Moolenaar      ], 'E477:')
3730a26b9700SBram Moolenaarenddef
3731a26b9700SBram Moolenaar
37327e5bd91dSBram Moolenaardef Test_finish()
3733cfcd011fSBram Moolenaar  var lines =<< trim END
37347e5bd91dSBram Moolenaar    vim9script
37356797966dSBram Moolenaar    g:res = 'one'
37367e5bd91dSBram Moolenaar    if v:false | finish | endif
37376797966dSBram Moolenaar    g:res = 'two'
37387e5bd91dSBram Moolenaar    finish
37396797966dSBram Moolenaar    g:res = 'three'
37407e5bd91dSBram Moolenaar  END
37417e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
37427e5bd91dSBram Moolenaar  source Xfinished
37437e5bd91dSBram Moolenaar  assert_equal('two', g:res)
37447e5bd91dSBram Moolenaar
37457e5bd91dSBram Moolenaar  unlet g:res
37467e5bd91dSBram Moolenaar  delete('Xfinished')
37477e5bd91dSBram Moolenaarenddef
37487e5bd91dSBram Moolenaar
3749a5d0077eSBram Moolenaardef Test_forward_declaration()
3750cfcd011fSBram Moolenaar  var lines =<< trim END
3751a5d0077eSBram Moolenaar    vim9script
3752a5d0077eSBram Moolenaar    def GetValue(): string
3753a5d0077eSBram Moolenaar      return theVal
3754a5d0077eSBram Moolenaar    enddef
3755cfcd011fSBram Moolenaar    var theVal = 'something'
3756822ba247SBram Moolenaar    g:initVal = GetValue()
3757a5d0077eSBram Moolenaar    theVal = 'else'
3758a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3759a5d0077eSBram Moolenaar  END
3760a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3761a5d0077eSBram Moolenaar  source Xforward
3762a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3763a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3764a5d0077eSBram Moolenaar
3765a5d0077eSBram Moolenaar  unlet g:initVal
3766a5d0077eSBram Moolenaar  unlet g:laterVal
3767a5d0077eSBram Moolenaar  delete('Xforward')
3768a5d0077eSBram Moolenaarenddef
3769a5d0077eSBram Moolenaar
37709721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3771a6294955SBram Moolenaar  var vim9_lines =<< trim END
3772a6294955SBram Moolenaar    vim9script
3773a6294955SBram Moolenaar    var local = 'local'
3774a6294955SBram Moolenaar    g:global = 'global'
3775a6294955SBram Moolenaar    export var exported = 'exported'
3776a6294955SBram Moolenaar    export def GetText(): string
3777a6294955SBram Moolenaar       return 'text'
3778a6294955SBram Moolenaar    enddef
3779a6294955SBram Moolenaar  END
3780a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3781a6294955SBram Moolenaar
3782cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
37839721fb4eSBram Moolenaar    source Xvim9_script.vim
37849721fb4eSBram Moolenaar
37859721fb4eSBram Moolenaar    call assert_false(exists('local'))
37869721fb4eSBram Moolenaar    call assert_false(exists('exported'))
37879721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
37889721fb4eSBram Moolenaar    call assert_equal('global', global)
37899721fb4eSBram Moolenaar    call assert_equal('global', g:global)
37909721fb4eSBram Moolenaar
37919721fb4eSBram Moolenaar    " imported variable becomes script-local
37929721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
37939721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
37949721fb4eSBram Moolenaar    call assert_false(exists('exported'))
37959721fb4eSBram Moolenaar
37969721fb4eSBram Moolenaar    " imported function becomes script-local
37979721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
37989721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
37999721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
38009721fb4eSBram Moolenaar  END
38019721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
38029721fb4eSBram Moolenaar
38039721fb4eSBram Moolenaar  source Xlegacy_script.vim
38049721fb4eSBram Moolenaar  assert_equal('global', g:global)
3805f5be8cdbSBram Moolenaar  unlet g:global
38069721fb4eSBram Moolenaar
38079721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
38089721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
38099721fb4eSBram Moolenaarenddef
3810a5d0077eSBram Moolenaar
3811e535db86SBram Moolenaardef Test_declare_script_in_func()
3812e535db86SBram Moolenaar  var lines =<< trim END
3813e535db86SBram Moolenaar      vim9script
3814e535db86SBram Moolenaar      func Declare()
3815e535db86SBram Moolenaar        let s:local = 123
3816e535db86SBram Moolenaar      endfunc
3817e535db86SBram Moolenaar      Declare()
3818e535db86SBram Moolenaar      assert_equal(123, local)
3819e535db86SBram Moolenaar
3820e535db86SBram Moolenaar      var error: string
3821e535db86SBram Moolenaar      try
3822e535db86SBram Moolenaar        local = 'asdf'
3823e535db86SBram Moolenaar      catch
3824e535db86SBram Moolenaar        error = v:exception
3825e535db86SBram Moolenaar      endtry
3826e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3827e535db86SBram Moolenaar
3828e535db86SBram Moolenaar      lockvar local
3829e535db86SBram Moolenaar      try
3830e535db86SBram Moolenaar        local = 999
3831e535db86SBram Moolenaar      catch
3832e535db86SBram Moolenaar        error = v:exception
3833e535db86SBram Moolenaar      endtry
3834e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3835e535db86SBram Moolenaar  END
3836e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3837e535db86SBram Moolenaarenddef
3838e535db86SBram Moolenaar
3839e535db86SBram Moolenaar
38407d699701SBram Moolenaarfunc Test_vim9script_not_global()
38417d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
38427d699701SBram Moolenaar  let vim9lines =<< trim END
38437d699701SBram Moolenaar    vim9script
3844cfcd011fSBram Moolenaar    var name = 'local'
38457d699701SBram Moolenaar    func TheFunc()
38467d699701SBram Moolenaar      echo 'local'
38477d699701SBram Moolenaar    endfunc
38487d699701SBram Moolenaar    def DefFunc()
38497d699701SBram Moolenaar      echo 'local'
38507d699701SBram Moolenaar    enddef
38517d699701SBram Moolenaar  END
38527d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
38537d699701SBram Moolenaar  source Xvim9script.vim
38547d699701SBram Moolenaar  try
38557d699701SBram Moolenaar    echo g:var
38567d699701SBram Moolenaar    assert_report('did not fail')
38577d699701SBram Moolenaar  catch /E121:/
38587d699701SBram Moolenaar    " caught
38597d699701SBram Moolenaar  endtry
38607d699701SBram Moolenaar  try
38617d699701SBram Moolenaar    call TheFunc()
38627d699701SBram Moolenaar    assert_report('did not fail')
38637d699701SBram Moolenaar  catch /E117:/
38647d699701SBram Moolenaar    " caught
38657d699701SBram Moolenaar  endtry
38667d699701SBram Moolenaar  try
38677d699701SBram Moolenaar    call DefFunc()
38687d699701SBram Moolenaar    assert_report('did not fail')
38697d699701SBram Moolenaar  catch /E117:/
38707d699701SBram Moolenaar    " caught
38717d699701SBram Moolenaar  endtry
38727d699701SBram Moolenaar
387325859dd7SBram Moolenaar  call delete('Xvim9script.vim')
38747d699701SBram Moolenaarendfunc
38757d699701SBram Moolenaar
3876eeb27bfeSBram Moolenaardef Test_vim9_copen()
3877eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3878eeb27bfeSBram Moolenaar  copen
3879eeb27bfeSBram Moolenaar  quit
3880eeb27bfeSBram Moolenaarenddef
3881eeb27bfeSBram Moolenaar
388203290b84SBram Moolenaar" test using an auto-loaded function and variable
38832d6b20d6SBram Moolenaardef Test_vim9_autoload()
3884cfcd011fSBram Moolenaar  var lines =<< trim END
38852d6b20d6SBram Moolenaar     vim9script
388603290b84SBram Moolenaar     def some#gettest(): string
388703290b84SBram Moolenaar       return 'test'
388803290b84SBram Moolenaar     enddef
388903290b84SBram Moolenaar     g:some#name = 'name'
3890227c58a4SBram Moolenaar     g:some#dict = {key: 'value'}
3891e3ffcd99SBram Moolenaar
3892e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3893e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3894e3ffcd99SBram Moolenaar     enddef
389503290b84SBram Moolenaar  END
389603290b84SBram Moolenaar
389703290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
389803290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
389903290b84SBram Moolenaar  var save_rtp = &rtp
390003290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
390103290b84SBram Moolenaar
390203290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
390303290b84SBram Moolenaar  assert_equal('name', g:some#name)
3904227c58a4SBram Moolenaar  assert_equal('value', g:some#dict.key)
390503290b84SBram Moolenaar  g:some#other = 'other'
390603290b84SBram Moolenaar  assert_equal('other', g:some#other)
390703290b84SBram Moolenaar
3908e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3909e3ffcd99SBram Moolenaar
391017f700acSBram Moolenaar  # upper case script name works
391117f700acSBram Moolenaar  lines =<< trim END
391217f700acSBram Moolenaar     vim9script
391317f700acSBram Moolenaar     def Other#getOther(): string
391417f700acSBram Moolenaar       return 'other'
391517f700acSBram Moolenaar     enddef
391617f700acSBram Moolenaar  END
391717f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
391817f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
391917f700acSBram Moolenaar
392003290b84SBram Moolenaar  delete('Xdir', 'rf')
392103290b84SBram Moolenaar  &rtp = save_rtp
392203290b84SBram Moolenaarenddef
392303290b84SBram Moolenaar
392403290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
392503290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
392603290b84SBram Moolenaar  var lines =<< trim END
392703290b84SBram Moolenaar     vim9script
39282d6b20d6SBram Moolenaar     def foo#test()
39292d6b20d6SBram Moolenaar         echomsg getreg('"')
39302d6b20d6SBram Moolenaar     enddef
39312d6b20d6SBram Moolenaar  END
39322d6b20d6SBram Moolenaar
39332d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
39342d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3935cfcd011fSBram Moolenaar  var save_rtp = &rtp
39362d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
39372d6b20d6SBram Moolenaar  augroup test
39382d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
39392d6b20d6SBram Moolenaar  augroup END
39402d6b20d6SBram Moolenaar
39412d6b20d6SBram Moolenaar  normal Y
39422d6b20d6SBram Moolenaar
39432d6b20d6SBram Moolenaar  augroup test
39442d6b20d6SBram Moolenaar    autocmd!
39452d6b20d6SBram Moolenaar  augroup END
39462d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
39472d6b20d6SBram Moolenaar  &rtp = save_rtp
39482d6b20d6SBram Moolenaarenddef
39492d6b20d6SBram Moolenaar
395077e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
395177e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3952cfcd011fSBram Moolenaar  var lines =<< trim END
395377e5dcc3SBram Moolenaar      vim9script
395477e5dcc3SBram Moolenaar      def crash#func()
395577e5dcc3SBram Moolenaar          try
395677e5dcc3SBram Moolenaar              for x in List()
395777e5dcc3SBram Moolenaar              endfor
395877e5dcc3SBram Moolenaar          catch
395977e5dcc3SBram Moolenaar          endtry
396077e5dcc3SBram Moolenaar          g:ok = true
396177e5dcc3SBram Moolenaar      enddef
396277e5dcc3SBram Moolenaar      fu List()
396377e5dcc3SBram Moolenaar          invalid
396477e5dcc3SBram Moolenaar      endfu
396577e5dcc3SBram Moolenaar      try
396648e11c10SBram Moolenaar          alsoinvalid
396777e5dcc3SBram Moolenaar      catch /wontmatch/
396877e5dcc3SBram Moolenaar      endtry
396977e5dcc3SBram Moolenaar  END
397077e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
397177e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
397277e5dcc3SBram Moolenaar
397377e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
397477e5dcc3SBram Moolenaar  lines =<< trim END
397577e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
397677e5dcc3SBram Moolenaar    call crash#func()
397777e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
39789c4f5520SBram Moolenaar    qall!
397977e5dcc3SBram Moolenaar  END
398077e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
398177e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
398277e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
398377e5dcc3SBram Moolenaar
398477e5dcc3SBram Moolenaar  delete('Xdidit')
398577e5dcc3SBram Moolenaar  delete('Xscript')
398677e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
398703290b84SBram Moolenaar
398803290b84SBram Moolenaar  lines =<< trim END
398903290b84SBram Moolenaar    vim9script
399003290b84SBram Moolenaar    var foo#bar = 'asdf'
399103290b84SBram Moolenaar  END
399203290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
399377e5dcc3SBram Moolenaarenddef
399477e5dcc3SBram Moolenaar
399581e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
399681e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
399781e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3998cfcd011fSBram Moolenaar  var lines =<< trim END
399981e17fbeSBram Moolenaar    let s:counter = 1
400081e17fbeSBram Moolenaar    def s:Func()
400181e17fbeSBram Moolenaar      au! CursorHold
400281e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
400381e17fbeSBram Moolenaar    enddef
400481e17fbeSBram Moolenaar    call s:Func()
400581e17fbeSBram Moolenaar    doau CursorHold
400681e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
400781e17fbeSBram Moolenaar    au! CursorHold
400881e17fbeSBram Moolenaar  END
400981e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
401081e17fbeSBram Moolenaarenddef
401181e17fbeSBram Moolenaar
4012b5841b99SBram Moolenaardef Test_error_in_autoload_script()
4013b5841b99SBram Moolenaar  var save_rtp = &rtp
4014b5841b99SBram Moolenaar  var dir = getcwd() .. '/Xruntime'
4015b5841b99SBram Moolenaar  &rtp = dir
4016b5841b99SBram Moolenaar  mkdir(dir .. '/autoload', 'p')
4017b5841b99SBram Moolenaar
4018b5841b99SBram Moolenaar  var lines =<< trim END
4019b5841b99SBram Moolenaar      vim9script noclear
4020b5841b99SBram Moolenaar      def script#autoloaded()
4021b5841b99SBram Moolenaar      enddef
4022b5841b99SBram Moolenaar      def Broken()
4023b5841b99SBram Moolenaar        var x: any = ''
4024b5841b99SBram Moolenaar        eval x != 0
4025b5841b99SBram Moolenaar      enddef
4026b5841b99SBram Moolenaar      Broken()
4027b5841b99SBram Moolenaar  END
4028b5841b99SBram Moolenaar  writefile(lines, dir .. '/autoload/script.vim')
4029b5841b99SBram Moolenaar
4030b5841b99SBram Moolenaar  lines =<< trim END
4031b5841b99SBram Moolenaar      vim9script
4032b5841b99SBram Moolenaar      def CallAutoloaded()
4033b5841b99SBram Moolenaar        script#autoloaded()
4034b5841b99SBram Moolenaar      enddef
4035b5841b99SBram Moolenaar
4036b5841b99SBram Moolenaar      function Legacy()
4037b5841b99SBram Moolenaar        try
4038b5841b99SBram Moolenaar          call s:CallAutoloaded()
4039b5841b99SBram Moolenaar        catch
4040b5841b99SBram Moolenaar          call assert_match('E1030: Using a String as a Number', v:exception)
4041b5841b99SBram Moolenaar        endtry
4042b5841b99SBram Moolenaar      endfunction
4043b5841b99SBram Moolenaar
4044b5841b99SBram Moolenaar      Legacy()
4045b5841b99SBram Moolenaar  END
4046b5841b99SBram Moolenaar  CheckScriptSuccess(lines)
4047b5841b99SBram Moolenaar
4048b5841b99SBram Moolenaar  &rtp = save_rtp
4049b5841b99SBram Moolenaar  delete(dir, 'rf')
4050b5841b99SBram Moolenaarenddef
4051b5841b99SBram Moolenaar
40523896a105SBram Moolenaardef Test_cmdline_win()
40533896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
40543896a105SBram Moolenaar  # the command line window.
40553896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
4056cfcd011fSBram Moolenaar  var export_lines =<< trim END
40573896a105SBram Moolenaar    vim9script
4058cfcd011fSBram Moolenaar    export var That = 'yes'
40593896a105SBram Moolenaar  END
40603896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
4061cfcd011fSBram Moolenaar  var import_lines =<< trim END
40623896a105SBram Moolenaar    vim9script
40633896a105SBram Moolenaar    import That from './Xexport.vim'
40643896a105SBram Moolenaar  END
40653896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
4066cfcd011fSBram Moolenaar  var save_rtp = &rtp
40673896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
40683896a105SBram Moolenaar  syntax on
40693896a105SBram Moolenaar  augroup CmdWin
40703896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
40713896a105SBram Moolenaar  augroup END
40723896a105SBram Moolenaar  # this will open and also close the cmdline window
40733896a105SBram Moolenaar  feedkeys('q:', 'xt')
40743896a105SBram Moolenaar  assert_equal('yes', g:got_there)
40753896a105SBram Moolenaar
40763896a105SBram Moolenaar  augroup CmdWin
40773896a105SBram Moolenaar    au!
40783896a105SBram Moolenaar  augroup END
40793896a105SBram Moolenaar  &rtp = save_rtp
40803896a105SBram Moolenaar  delete('rtp', 'rf')
40813896a105SBram Moolenaarenddef
40823896a105SBram Moolenaar
4083e3d4685fSBram Moolenaardef Test_invalid_sid()
4084e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
408525859dd7SBram Moolenaar
40869c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
4087d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
4088e3d4685fSBram Moolenaar  endif
4089e3d4685fSBram Moolenaar  delete('Xdidit')
4090e3d4685fSBram Moolenaarenddef
4091e3d4685fSBram Moolenaar
40929ec7026fSBram Moolenaardef Test_restoring_cpo()
40939ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
40949ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
40959ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
40969ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
40979ec7026fSBram Moolenaar  endif
40989ec7026fSBram Moolenaar  delete('Xsourced')
40999ec7026fSBram Moolenaar  delete('Xclose')
4100090728adSBram Moolenaar  delete('Xdone')
41010123cc1eSBram Moolenaar
41020123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
41030123cc1eSBram Moolenaar  set cpo=aABceFsMny>
41040123cc1eSBram Moolenaar  edit XanotherScript
41050123cc1eSBram Moolenaar  so %
41060123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
41070123cc1eSBram Moolenaar  :1del
41080123cc1eSBram Moolenaar  w
41090123cc1eSBram Moolenaar  so %
41100123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
41110123cc1eSBram Moolenaar
41120123cc1eSBram Moolenaar  delete('XanotherScript')
41130123cc1eSBram Moolenaar  set cpo&vim
41149ec7026fSBram Moolenaarenddef
41159ec7026fSBram Moolenaar
4116ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
4117ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
411837294bd6SBram Moolenaar  CheckScreendump
4119ffb7dcdbSBram Moolenaar  CheckFeature timers
412037294bd6SBram Moolenaar
4121ffb7dcdbSBram Moolenaar  let lines =<< trim END
412237294bd6SBram Moolenaar    vim9script
412337294bd6SBram Moolenaar    def script#func()
412437294bd6SBram Moolenaar    enddef
412537294bd6SBram Moolenaar  END
4126ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
4127ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
412837294bd6SBram Moolenaar
4129ffb7dcdbSBram Moolenaar  let lines =<< trim END
413037294bd6SBram Moolenaar      vim9script
413137294bd6SBram Moolenaar      set cpo+=M
413237294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
4133767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
413437294bd6SBram Moolenaar      setline(1, 'some text')
413537294bd6SBram Moolenaar  END
4136ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
4137ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
4138ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
4139ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
414037294bd6SBram Moolenaar
4141ffb7dcdbSBram Moolenaar  " clean up
4142ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
4143ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
4144ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
4145ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
4146ffb7dcdbSBram Moolenaarendfunc
414737294bd6SBram Moolenaar
41489ec7026fSBram Moolenaar
4149f0afd9e1SBram Moolenaardef Test_unset_any_variable()
4150cfcd011fSBram Moolenaar  var lines =<< trim END
4151cfcd011fSBram Moolenaar    var name: any
4152cfcd011fSBram Moolenaar    assert_equal(0, name)
4153f0afd9e1SBram Moolenaar  END
4154f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
4155f0afd9e1SBram Moolenaarenddef
4156f0afd9e1SBram Moolenaar
41577e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
415858dbef33SBram Moolenaar  CheckRunVimInTerminal
415958dbef33SBram Moolenaar
41607e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
41617e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
41627e9210eaSBram Moolenaarendfunc
41637e9210eaSBram Moolenaar
41647e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
41659c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
4166cfcd011fSBram Moolenaar  var lines =<< trim END
41679c4f5520SBram Moolenaar    func CheckAndQuit()
41689c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
41699c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
41709c4f5520SBram Moolenaar    endfunc
41719c4f5520SBram Moolenaar  END
41729c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
41739c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
4174e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
41759c4f5520SBram Moolenaar  # define Afunc() on the command line
41769c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
41779c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
41782949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
41799c4f5520SBram Moolenaar
41809c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
41819c4f5520SBram Moolenaar  delete('XcallFunc')
41829c4f5520SBram Moolenaar  delete('Xdidcmd')
41839c4f5520SBram Moolenaarenddef
41849c4f5520SBram Moolenaar
4185fcdc5d83SBram Moolenaardef Test_script_var_scope()
4186fcdc5d83SBram Moolenaar  var lines =<< trim END
4187fcdc5d83SBram Moolenaar      vim9script
4188fcdc5d83SBram Moolenaar      if true
4189fcdc5d83SBram Moolenaar        if true
4190fcdc5d83SBram Moolenaar          var one = 'one'
4191fcdc5d83SBram Moolenaar          echo one
4192fcdc5d83SBram Moolenaar        endif
4193fcdc5d83SBram Moolenaar        echo one
4194fcdc5d83SBram Moolenaar      endif
4195fcdc5d83SBram Moolenaar  END
4196fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
4197fcdc5d83SBram Moolenaar
4198fcdc5d83SBram Moolenaar  lines =<< trim END
4199fcdc5d83SBram Moolenaar      vim9script
4200fcdc5d83SBram Moolenaar      if true
4201fcdc5d83SBram Moolenaar        if false
4202fcdc5d83SBram Moolenaar          var one = 'one'
4203fcdc5d83SBram Moolenaar          echo one
4204fcdc5d83SBram Moolenaar        else
4205fcdc5d83SBram Moolenaar          var one = 'one'
4206fcdc5d83SBram Moolenaar          echo one
4207fcdc5d83SBram Moolenaar        endif
4208fcdc5d83SBram Moolenaar        echo one
4209fcdc5d83SBram Moolenaar      endif
4210fcdc5d83SBram Moolenaar  END
4211fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
4212fcdc5d83SBram Moolenaar
4213fcdc5d83SBram Moolenaar  lines =<< trim END
4214fcdc5d83SBram Moolenaar      vim9script
4215fcdc5d83SBram Moolenaar      while true
4216fcdc5d83SBram Moolenaar        var one = 'one'
4217fcdc5d83SBram Moolenaar        echo one
4218fcdc5d83SBram Moolenaar        break
4219fcdc5d83SBram Moolenaar      endwhile
4220fcdc5d83SBram Moolenaar      echo one
4221fcdc5d83SBram Moolenaar  END
4222fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
4223fcdc5d83SBram Moolenaar
4224fcdc5d83SBram Moolenaar  lines =<< trim END
4225fcdc5d83SBram Moolenaar      vim9script
4226fcdc5d83SBram Moolenaar      for i in range(1)
4227fcdc5d83SBram Moolenaar        var one = 'one'
4228fcdc5d83SBram Moolenaar        echo one
4229fcdc5d83SBram Moolenaar      endfor
4230fcdc5d83SBram Moolenaar      echo one
4231fcdc5d83SBram Moolenaar  END
4232fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
42339becdf2bSBram Moolenaar
42349becdf2bSBram Moolenaar  lines =<< trim END
42359becdf2bSBram Moolenaar      vim9script
42369becdf2bSBram Moolenaar      {
42379becdf2bSBram Moolenaar        var one = 'one'
42389becdf2bSBram Moolenaar        assert_equal('one', one)
42399becdf2bSBram Moolenaar      }
42409becdf2bSBram Moolenaar      assert_false(exists('one'))
42419becdf2bSBram Moolenaar      assert_false(exists('s:one'))
42429becdf2bSBram Moolenaar  END
42439becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
42449becdf2bSBram Moolenaar
42459becdf2bSBram Moolenaar  lines =<< trim END
42469becdf2bSBram Moolenaar      vim9script
42479becdf2bSBram Moolenaar      {
42489becdf2bSBram Moolenaar        var one = 'one'
42499becdf2bSBram Moolenaar        echo one
42509becdf2bSBram Moolenaar      }
42519becdf2bSBram Moolenaar      echo one
42529becdf2bSBram Moolenaar  END
42539becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
4254fcdc5d83SBram Moolenaarenddef
4255fcdc5d83SBram Moolenaar
4256352134bbSBram Moolenaardef Test_catch_exception_in_callback()
4257352134bbSBram Moolenaar  var lines =<< trim END
4258352134bbSBram Moolenaar    vim9script
42592a38908bSBram Moolenaar    def Callback(...l: list<any>)
4260352134bbSBram Moolenaar      try
4261352134bbSBram Moolenaar        var x: string
4262352134bbSBram Moolenaar        var y: string
4263352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
4264352134bbSBram Moolenaar        [x, y] = ['']
4265352134bbSBram Moolenaar      catch
4266352134bbSBram Moolenaar        g:caught = 'yes'
4267352134bbSBram Moolenaar      endtry
4268352134bbSBram Moolenaar    enddef
4269e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
4270352134bbSBram Moolenaar    feedkeys("\r", 'xt')
4271352134bbSBram Moolenaar  END
4272352134bbSBram Moolenaar  CheckScriptSuccess(lines)
4273352134bbSBram Moolenaar
4274352134bbSBram Moolenaar  unlet g:caught
4275352134bbSBram Moolenaarenddef
4276352134bbSBram Moolenaar
4277631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
4278631e8f93SBram Moolenaar  if !has('unix') || !has('job')
4279631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
4280631e8f93SBram Moolenaar  endif
4281*b16ff292SBram Moolenaar  # FIXME: this check should not be needed
4282*b16ff292SBram Moolenaar  if has('win32')
4283*b16ff292SBram Moolenaar    throw 'Skipped: does not work on MS-Windows'
4284*b16ff292SBram Moolenaar  endif
4285631e8f93SBram Moolenaar  var lines =<< trim END
4286631e8f93SBram Moolenaar      vim9script
4287631e8f93SBram Moolenaar      var source: list<number>
42882a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
4289631e8f93SBram Moolenaar          eval [][0]
4290631e8f93SBram Moolenaar      enddef
42912a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
4292631e8f93SBram Moolenaar          sleep 1m
4293631e8f93SBram Moolenaar          source += l
4294631e8f93SBram Moolenaar      enddef
4295e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
42966f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
42976f17a3f0SBram Moolenaar        sleep 10m
42986f17a3f0SBram Moolenaar      endwhile
4299206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
4300fe95b94fSBram Moolenaar      sleep 200m
4301631e8f93SBram Moolenaar  END
4302631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
4303631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
4304631e8f93SBram Moolenaar  delete('Xdef')
4305631e8f93SBram Moolenaarenddef
4306631e8f93SBram Moolenaar
43074324d87aSBram Moolenaardef InvokeNormal()
43084324d87aSBram Moolenaar  exe "norm! :m+1\r"
43094324d87aSBram Moolenaarenddef
43104324d87aSBram Moolenaar
43114324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
43124324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
43134324d87aSBram Moolenaar  new
43144324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
43154324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
43164324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
43174324d87aSBram Moolenaar  xunmap <F3>
4318b5b9480eSBram Moolenaarenddef
4319b5b9480eSBram Moolenaar
4320b5b9480eSBram Moolenaardef Test_white_space_after_command()
4321b5b9480eSBram Moolenaar  var lines =<< trim END
4322b5b9480eSBram Moolenaar    exit_cb: Func})
4323b5b9480eSBram Moolenaar  END
4324b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
4325f8103f27SBram Moolenaar
4326f8103f27SBram Moolenaar  lines =<< trim END
4327f8103f27SBram Moolenaar    e#
4328f8103f27SBram Moolenaar  END
4329f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
43304324d87aSBram Moolenaarenddef
43314324d87aSBram Moolenaar
43324aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
43334aab88d9SBram Moolenaar  var lines =<< trim END
43344aab88d9SBram Moolenaar      vim9script
43354aab88d9SBram Moolenaar      if exists('g:guard')
43364aab88d9SBram Moolenaar        finish
43374aab88d9SBram Moolenaar      endif
43384aab88d9SBram Moolenaar      g:guard = 1
43394aab88d9SBram Moolenaar      var name = 'thename'
43404aab88d9SBram Moolenaar      def g:GetName(): string
43414aab88d9SBram Moolenaar        return name
43424aab88d9SBram Moolenaar      enddef
43434aab88d9SBram Moolenaar      def g:SetName(arg: string)
43444aab88d9SBram Moolenaar        name = arg
43454aab88d9SBram Moolenaar      enddef
43464aab88d9SBram Moolenaar  END
43474aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
43484aab88d9SBram Moolenaar  so XscriptTwice.vim
43494aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
43504aab88d9SBram Moolenaar  g:SetName('newname')
43514aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
43524aab88d9SBram Moolenaar  so XscriptTwice.vim
43534aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
43544aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
43554aab88d9SBram Moolenaar
43564aab88d9SBram Moolenaar  delfunc g:GetName
43574aab88d9SBram Moolenaar  delfunc g:SetName
43584aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
43594aab88d9SBram Moolenaar  unlet g:guard
43604aab88d9SBram Moolenaarenddef
43614aab88d9SBram Moolenaar
43624aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
43634aab88d9SBram Moolenaar  var exportlines =<< trim END
43644aab88d9SBram Moolenaar      vim9script
43654aab88d9SBram Moolenaar      if exists('g:guard')
43664aab88d9SBram Moolenaar        finish
43674aab88d9SBram Moolenaar      endif
43684aab88d9SBram Moolenaar      g:guard = 1
43694aab88d9SBram Moolenaar      export var name = 'someName'
43704aab88d9SBram Moolenaar  END
43714aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
43724aab88d9SBram Moolenaar
43734aab88d9SBram Moolenaar  var lines =<< trim END
43744aab88d9SBram Moolenaar      vim9script
43754aab88d9SBram Moolenaar      import name from './XexportScript.vim'
43764aab88d9SBram Moolenaar      def g:GetName(): string
43774aab88d9SBram Moolenaar        return name
43784aab88d9SBram Moolenaar      enddef
43794aab88d9SBram Moolenaar  END
43804aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
43814aab88d9SBram Moolenaar  so XscriptImport.vim
43824aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
43834aab88d9SBram Moolenaar
43844aab88d9SBram Moolenaar  so XexportScript.vim
43854aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
43864aab88d9SBram Moolenaar
43874aab88d9SBram Moolenaar  delfunc g:GetName
43884aab88d9SBram Moolenaar  delete('XexportScript.vim')
43894aab88d9SBram Moolenaar  delete('XscriptImport.vim')
43904aab88d9SBram Moolenaar  unlet g:guard
43914aab88d9SBram Moolenaarenddef
43924aab88d9SBram Moolenaar
439310b9421fSBram Moolenaardef Test_unsupported_commands()
439410b9421fSBram Moolenaar  var lines =<< trim END
439510b9421fSBram Moolenaar      ka
439610b9421fSBram Moolenaar  END
43977d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
43987d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
439910b9421fSBram Moolenaar
440010b9421fSBram Moolenaar  lines =<< trim END
4401ada1d870SBram Moolenaar      :1ka
4402ada1d870SBram Moolenaar  END
44037d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
44047d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
4405ada1d870SBram Moolenaar
4406ada1d870SBram Moolenaar  lines =<< trim END
440710b9421fSBram Moolenaar    t
440810b9421fSBram Moolenaar  END
440910b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
441010b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
441110b9421fSBram Moolenaar
441210b9421fSBram Moolenaar  lines =<< trim END
441310b9421fSBram Moolenaar    x
441410b9421fSBram Moolenaar  END
441510b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
441610b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
441710b9421fSBram Moolenaar
441810b9421fSBram Moolenaar  lines =<< trim END
441910b9421fSBram Moolenaar    xit
442010b9421fSBram Moolenaar  END
442110b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
442210b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
442310b9421fSBram Moolenaarenddef
442410b9421fSBram Moolenaar
4425c70fe460SBram Moolenaardef Test_mapping_line_number()
4426c70fe460SBram Moolenaar  var lines =<< trim END
4427c70fe460SBram Moolenaar      vim9script
4428c70fe460SBram Moolenaar      def g:FuncA()
4429c70fe460SBram Moolenaar          # Some comment
4430c70fe460SBram Moolenaar          FuncB(0)
4431c70fe460SBram Moolenaar      enddef
4432c70fe460SBram Moolenaar          # Some comment
4433c70fe460SBram Moolenaar      def FuncB(
4434c70fe460SBram Moolenaar          # Some comment
4435c70fe460SBram Moolenaar          n: number
4436c70fe460SBram Moolenaar      )
4437c70fe460SBram Moolenaar          exe 'nno '
4438c70fe460SBram Moolenaar              # Some comment
4439c70fe460SBram Moolenaar              .. '<F3> a'
4440c70fe460SBram Moolenaar              .. 'b'
4441c70fe460SBram Moolenaar              .. 'c'
4442c70fe460SBram Moolenaar      enddef
4443c70fe460SBram Moolenaar  END
4444c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
4445c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
4446c70fe460SBram Moolenaar  assert_match('No mapping found', res)
4447c70fe460SBram Moolenaar
4448c70fe460SBram Moolenaar  g:FuncA()
4449c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
4450c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4451c70fe460SBram Moolenaar
4452c70fe460SBram Moolenaar  nunmap <F3>
4453c70fe460SBram Moolenaar  delfunc g:FuncA
4454c70fe460SBram Moolenaarenddef
4455c70fe460SBram Moolenaar
4456deb108baSBram Moolenaardef Test_option_set()
4457deb108baSBram Moolenaar  # legacy script allows for white space
4458deb108baSBram Moolenaar  var lines =<< trim END
4459deb108baSBram Moolenaar      set foldlevel  =11
4460deb108baSBram Moolenaar      call assert_equal(11, &foldlevel)
4461deb108baSBram Moolenaar  END
4462deb108baSBram Moolenaar  CheckScriptSuccess(lines)
4463deb108baSBram Moolenaar
4464deb108baSBram Moolenaar  set foldlevel
4465deb108baSBram Moolenaar  set foldlevel=12
4466deb108baSBram Moolenaar  assert_equal(12, &foldlevel)
4467deb108baSBram Moolenaar  set foldlevel+=2
4468deb108baSBram Moolenaar  assert_equal(14, &foldlevel)
4469deb108baSBram Moolenaar  set foldlevel-=3
4470deb108baSBram Moolenaar  assert_equal(11, &foldlevel)
4471deb108baSBram Moolenaar
4472deb108baSBram Moolenaar  lines =<< trim END
4473deb108baSBram Moolenaar      set foldlevel =1
4474deb108baSBram Moolenaar  END
4475deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
4476deb108baSBram Moolenaar
4477deb108baSBram Moolenaar  lines =<< trim END
4478deb108baSBram Moolenaar      set foldlevel +=1
4479deb108baSBram Moolenaar  END
4480deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
4481deb108baSBram Moolenaar
4482deb108baSBram Moolenaar  lines =<< trim END
4483deb108baSBram Moolenaar      set foldlevel ^=1
4484deb108baSBram Moolenaar  END
4485deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
4486deb108baSBram Moolenaar
4487deb108baSBram Moolenaar  lines =<< trim END
4488deb108baSBram Moolenaar      set foldlevel -=1
4489deb108baSBram Moolenaar  END
4490deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
4491deb108baSBram Moolenaar
4492deb108baSBram Moolenaar  set foldlevel&
4493deb108baSBram Moolenaarenddef
4494deb108baSBram Moolenaar
4495208f0b48SBram Moolenaardef Test_option_modifier()
44961594f313SBram Moolenaar  # legacy script allows for white space
4497208f0b48SBram Moolenaar  var lines =<< trim END
4498208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
4499208f0b48SBram Moolenaar      call assert_equal(1, &hlsearch)
4500208f0b48SBram Moolenaar  END
4501208f0b48SBram Moolenaar  CheckScriptSuccess(lines)
4502208f0b48SBram Moolenaar
45031594f313SBram Moolenaar  set hlsearch
45041594f313SBram Moolenaar  set hlsearch!
45051594f313SBram Moolenaar  assert_equal(false, &hlsearch)
45061594f313SBram Moolenaar
45071594f313SBram Moolenaar  set hlsearch
4508208f0b48SBram Moolenaar  set hlsearch&
45091594f313SBram Moolenaar  assert_equal(false, &hlsearch)
4510208f0b48SBram Moolenaar
4511208f0b48SBram Moolenaar  lines =<< trim END
45121594f313SBram Moolenaar      set hlsearch &
4513208f0b48SBram Moolenaar  END
45141594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
45151594f313SBram Moolenaar
45161594f313SBram Moolenaar  lines =<< trim END
45171594f313SBram Moolenaar      set hlsearch   !
45181594f313SBram Moolenaar  END
45191594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
45201594f313SBram Moolenaar
45211594f313SBram Moolenaar  set hlsearch&
4522208f0b48SBram Moolenaarenddef
4523208f0b48SBram Moolenaar
4524c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail
4525c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number()
4526c03fe66aSBram Moolenaar  var lines =<< trim END
4527c03fe66aSBram Moolenaar      echoerr 'some'
4528c03fe66aSBram Moolenaar         .. ' error'
4529c03fe66aSBram Moolenaar         .. ' continued'
4530c03fe66aSBram Moolenaar  END
4531c03fe66aSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
4532c03fe66aSBram Moolenaarenddef
4533c03fe66aSBram Moolenaar
4534648594eaSBram Moolenaardef ProfiledWithLambda()
4535d9162550SBram Moolenaar  var n = 3
4536d9162550SBram Moolenaar  echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4537d9162550SBram Moolenaarenddef
4538d9162550SBram Moolenaar
4539648594eaSBram Moolenaardef ProfiledNested()
4540648594eaSBram Moolenaar  var x = 0
4541648594eaSBram Moolenaar  def Nested(): any
4542648594eaSBram Moolenaar      return x
4543648594eaSBram Moolenaar  enddef
4544648594eaSBram Moolenaar  Nested()
4545648594eaSBram Moolenaarenddef
4546648594eaSBram Moolenaar
4547ffcfddc7SBram Moolenaardef ProfiledNestedProfiled()
4548ffcfddc7SBram Moolenaar  var x = 0
4549ffcfddc7SBram Moolenaar  def Nested(): any
4550ffcfddc7SBram Moolenaar      return x
4551ffcfddc7SBram Moolenaar  enddef
4552ffcfddc7SBram Moolenaar  Nested()
4553ffcfddc7SBram Moolenaarenddef
4554ffcfddc7SBram Moolenaar
4555d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists.
4556d9162550SBram Moolenaar" This only tests that it works, not the profiling output.
4557d9162550SBram Moolenaardef Test_xx_profile_with_lambda()
45584ece152aSBram Moolenaar  CheckFeature profile
45594ece152aSBram Moolenaar
4560d9162550SBram Moolenaar  profile start Xprofile.log
4561648594eaSBram Moolenaar  profile func ProfiledWithLambda
4562648594eaSBram Moolenaar  ProfiledWithLambda()
4563ffcfddc7SBram Moolenaar
4564648594eaSBram Moolenaar  profile func ProfiledNested
4565648594eaSBram Moolenaar  ProfiledNested()
4566ffcfddc7SBram Moolenaar
4567ffcfddc7SBram Moolenaar  # Also profile the nested function.  Use a different function, although the
4568ffcfddc7SBram Moolenaar  # contents is the same, to make sure it was not already compiled.
4569ffcfddc7SBram Moolenaar  profile func *
4570ffcfddc7SBram Moolenaar  ProfiledNestedProfiled()
4571ffcfddc7SBram Moolenaar
4572ffcfddc7SBram Moolenaar  profdel func *
4573ffcfddc7SBram Moolenaar  profile pause
4574d9162550SBram Moolenaarenddef
4575d9162550SBram Moolenaar
4576585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
4577585fea7bSBram Moolenaardef Test_substitute_cmd()
4578585fea7bSBram Moolenaar  new
4579585fea7bSBram Moolenaar  setline(1, 'something')
4580585fea7bSBram Moolenaar  :substitute(some(other(
4581585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
4582585fea7bSBram Moolenaar  bwipe!
4583585fea7bSBram Moolenaar
4584f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
4585cfcd011fSBram Moolenaar  var lines =<< trim END
4586585fea7bSBram Moolenaar    vim9script
4587585fea7bSBram Moolenaar    new
4588585fea7bSBram Moolenaar    setline(1, 'something')
4589585fea7bSBram Moolenaar    :substitute(some(other(
4590585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
4591585fea7bSBram Moolenaar    bwipe!
4592585fea7bSBram Moolenaar  END
4593585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
4594585fea7bSBram Moolenaar  source Xvim9lines
4595585fea7bSBram Moolenaar
4596585fea7bSBram Moolenaar  delete('Xvim9lines')
4597585fea7bSBram Moolenaarenddef
4598585fea7bSBram Moolenaar
45998a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
4600