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
14800a84284eSBram Moolenaardef Test_import_as()
14810a84284eSBram Moolenaar  var export_lines =<< trim END
14820a84284eSBram Moolenaar    vim9script
14830a84284eSBram Moolenaar    export var one = 1
14840a84284eSBram Moolenaar    export var yes = 'yes'
1485c967d57aSBram Moolenaar    export var slist: list<string>
14860a84284eSBram Moolenaar  END
14870a84284eSBram Moolenaar  writefile(export_lines, 'XexportAs')
14880a84284eSBram Moolenaar
14890a84284eSBram Moolenaar  var import_lines =<< trim END
14900a84284eSBram Moolenaar    vim9script
14916c7cc347SBram Moolenaar    var one = 'notused'
14926c7cc347SBram Moolenaar    var yes = 777
14930a84284eSBram Moolenaar    import one as thatOne from './XexportAs'
14940a84284eSBram Moolenaar    assert_equal(1, thatOne)
14950a84284eSBram Moolenaar    import yes as yesYes from './XexportAs'
14960a84284eSBram Moolenaar    assert_equal('yes', yesYes)
14970a84284eSBram Moolenaar  END
14980a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
14990a84284eSBram Moolenaar
15000a84284eSBram Moolenaar  import_lines =<< trim END
15010a84284eSBram Moolenaar    vim9script
15020a84284eSBram Moolenaar    import {one as thatOne, yes as yesYes} from './XexportAs'
15030a84284eSBram Moolenaar    assert_equal(1, thatOne)
15040a84284eSBram Moolenaar    assert_equal('yes', yesYes)
15050a84284eSBram Moolenaar    assert_fails('echo one', 'E121:')
15060a84284eSBram Moolenaar    assert_fails('echo yes', 'E121:')
15070a84284eSBram Moolenaar  END
15080a84284eSBram Moolenaar  CheckScriptSuccess(import_lines)
15090a84284eSBram Moolenaar
1510c967d57aSBram Moolenaar  import_lines =<< trim END
1511c967d57aSBram Moolenaar    vim9script
1512c967d57aSBram Moolenaar    import {slist as impSlist} from './XexportAs'
1513c967d57aSBram Moolenaar    impSlist->add(123)
1514c967d57aSBram Moolenaar  END
1515c967d57aSBram Moolenaar  CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number')
1516c967d57aSBram Moolenaar
15170a84284eSBram Moolenaar  delete('XexportAs')
15180a84284eSBram Moolenaarenddef
15190a84284eSBram Moolenaar
1520803af686SBram Moolenaarfunc g:Trigger()
1521803af686SBram Moolenaar  source Ximport.vim
1522803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1523803af686SBram Moolenaarendfunc
1524803af686SBram Moolenaar
1525803af686SBram Moolenaardef Test_import_export_expr_map()
1526803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1527cfcd011fSBram Moolenaar  var export_lines =<< trim END
1528803af686SBram Moolenaar    vim9script
1529803af686SBram Moolenaar    export def That(): string
1530803af686SBram Moolenaar      return 'yes'
1531803af686SBram Moolenaar    enddef
1532803af686SBram Moolenaar  END
1533803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1534803af686SBram Moolenaar
1535cfcd011fSBram Moolenaar  var import_lines =<< trim END
1536803af686SBram Moolenaar    vim9script
1537803af686SBram Moolenaar    import That from './Xexport_that.vim'
1538803af686SBram Moolenaar    assert_equal('yes', That())
1539803af686SBram Moolenaar  END
1540803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1541803af686SBram Moolenaar
1542803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1543803af686SBram Moolenaar  feedkeys('trigger', "xt")
1544803af686SBram Moolenaar
1545730b2483SBram Moolenaar  delete('Xexport_that.vim')
1546803af686SBram Moolenaar  delete('Ximport.vim')
1547803af686SBram Moolenaar  nunmap trigger
1548803af686SBram Moolenaarenddef
1549803af686SBram Moolenaar
15508e1986e3SBram Moolenaardef Test_import_in_filetype()
15518e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
15528e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1553cfcd011fSBram Moolenaar  var export_lines =<< trim END
15548e1986e3SBram Moolenaar    vim9script
1555cfcd011fSBram Moolenaar    export var That = 'yes'
15568e1986e3SBram Moolenaar  END
1557730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
15588e1986e3SBram Moolenaar
1559cfcd011fSBram Moolenaar  var import_lines =<< trim END
15608e1986e3SBram Moolenaar    vim9script
1561730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
15628e1986e3SBram Moolenaar    assert_equal('yes', That)
15638e1986e3SBram Moolenaar    g:did_load_mytpe = 1
15648e1986e3SBram Moolenaar  END
15658e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
15668e1986e3SBram Moolenaar
1567cfcd011fSBram Moolenaar  var save_rtp = &rtp
15688e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
15698e1986e3SBram Moolenaar
15708e1986e3SBram Moolenaar  filetype plugin on
15718e1986e3SBram Moolenaar  copen
15728e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
15738e1986e3SBram Moolenaar
15748e1986e3SBram Moolenaar  quit!
1575730b2483SBram Moolenaar  delete('Xexport_ft.vim')
15768e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
15778e1986e3SBram Moolenaar  &rtp = save_rtp
15788e1986e3SBram Moolenaarenddef
15798e1986e3SBram Moolenaar
1580efa94447SBram Moolenaardef Test_use_import_in_mapping()
1581cfcd011fSBram Moolenaar  var lines =<< trim END
1582efa94447SBram Moolenaar      vim9script
1583efa94447SBram Moolenaar      export def Funcx()
1584efa94447SBram Moolenaar        g:result = 42
1585efa94447SBram Moolenaar      enddef
1586efa94447SBram Moolenaar  END
1587efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1588efa94447SBram Moolenaar  lines =<< trim END
1589efa94447SBram Moolenaar      vim9script
1590efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1591b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1592efa94447SBram Moolenaar  END
1593efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1594efa94447SBram Moolenaar
1595efa94447SBram Moolenaar  source Xmapscript.vim
1596b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1597efa94447SBram Moolenaar  assert_equal(42, g:result)
1598efa94447SBram Moolenaar
1599efa94447SBram Moolenaar  unlet g:result
1600efa94447SBram Moolenaar  delete('XsomeExport.vim')
1601efa94447SBram Moolenaar  delete('Xmapscript.vim')
1602b3ca9824SBram Moolenaar  nunmap <F3>
1603efa94447SBram Moolenaarenddef
1604efa94447SBram Moolenaar
1605d3f8a9eeSBram Moolenaardef Test_vim9script_mix()
1606d3f8a9eeSBram Moolenaar  var lines =<< trim END
1607d3f8a9eeSBram Moolenaar    if has(g:feature)
1608d3f8a9eeSBram Moolenaar      " legacy script
1609d3f8a9eeSBram Moolenaar      let g:legacy = 1
1610d3f8a9eeSBram Moolenaar      finish
1611d3f8a9eeSBram Moolenaar    endif
1612d3f8a9eeSBram Moolenaar    vim9script
1613d3f8a9eeSBram Moolenaar    g:legacy = 0
1614d3f8a9eeSBram Moolenaar  END
1615d3f8a9eeSBram Moolenaar  g:feature = 'eval'
1616d3f8a9eeSBram Moolenaar  g:legacy = -1
1617d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1618d3f8a9eeSBram Moolenaar  assert_equal(1, g:legacy)
1619d3f8a9eeSBram Moolenaar
1620d3f8a9eeSBram Moolenaar  g:feature = 'noteval'
1621d3f8a9eeSBram Moolenaar  g:legacy = -1
1622d3f8a9eeSBram Moolenaar  CheckScriptSuccess(lines)
1623d3f8a9eeSBram Moolenaar  assert_equal(0, g:legacy)
1624d3f8a9eeSBram Moolenaarenddef
1625d3f8a9eeSBram Moolenaar
1626750802b5SBram Moolenaardef Test_vim9script_fails()
16278a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
16288a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1629cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
16309721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1631cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1632750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1633750802b5SBram Moolenaar
1634cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1635c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1636c785b9a7SBram Moolenaar
1637e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1638e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
16398a7d6542SBram Moolenaarenddef
16408a7d6542SBram Moolenaar
1641f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1642101f4810SBram Moolenaar  CheckRunVimInTerminal
1643101f4810SBram Moolenaar
16449bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1645c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
16469bb3eb3eSBram Moolenaarendfunc
16479bb3eb3eSBram Moolenaar
1648c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1649cfcd011fSBram Moolenaar  var export =<< trim END
1650101f4810SBram Moolenaar    vim9script
1651101f4810SBram Moolenaar    export def Foo(): number
1652101f4810SBram Moolenaar        return 0
1653101f4810SBram Moolenaar    enddef
1654101f4810SBram Moolenaar  END
1655730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1656101f4810SBram Moolenaar
1657e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
16589bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
16592949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1660101f4810SBram Moolenaar
1661730b2483SBram Moolenaar  delete('XexportCmd.vim')
16629bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
16639bb3eb3eSBram Moolenaarenddef
1664101f4810SBram Moolenaar
16652b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
16662b32700dSBram Moolenaar  var lines =<< trim END
1667a6294955SBram Moolenaar    vim9script
1668a6294955SBram Moolenaar    export var exported = 'thexport'
166960dc8274SBram Moolenaar
167060dc8274SBram Moolenaar    export def TheFunc(x = 0)
167160dc8274SBram Moolenaar    enddef
1672a6294955SBram Moolenaar  END
1673a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1674a6294955SBram Moolenaar  lines =<< trim END
16752b32700dSBram Moolenaar    vim9script noclear
16762b32700dSBram Moolenaar    g:loadCount += 1
16772b32700dSBram Moolenaar    var s:reloaded = 'init'
1678a6294955SBram Moolenaar    import exported from './XExportReload'
16792b32700dSBram Moolenaar
16802b32700dSBram Moolenaar    def Again(): string
16812b32700dSBram Moolenaar      return 'again'
16822b32700dSBram Moolenaar    enddef
16832b32700dSBram Moolenaar
168460dc8274SBram Moolenaar    import TheFunc from './XExportReload'
168560dc8274SBram Moolenaar    TheFunc()
168660dc8274SBram Moolenaar
16872b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
16882b32700dSBram Moolenaar    var s:loaded = true
16892b32700dSBram Moolenaar
16902b32700dSBram Moolenaar    var s:notReloaded = 'yes'
16912b32700dSBram Moolenaar    s:reloaded = 'first'
16922b32700dSBram Moolenaar    def g:Values(): list<string>
1693a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
16942b32700dSBram Moolenaar    enddef
16952b32700dSBram Moolenaar
16962b32700dSBram Moolenaar    def Once(): string
16972b32700dSBram Moolenaar      return 'once'
16982b32700dSBram Moolenaar    enddef
16992b32700dSBram Moolenaar  END
17002b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
17012b32700dSBram Moolenaar  g:loadCount = 0
17022b32700dSBram Moolenaar  source XReloaded
17032b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1704a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
17052b32700dSBram Moolenaar  source XReloaded
17062b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1707a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
17082b32700dSBram Moolenaar  source XReloaded
17092b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1710a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
17112b32700dSBram Moolenaar
171248e11c10SBram Moolenaar  delete('XReloaded')
1713a6294955SBram Moolenaar  delete('XExportReload')
17142b32700dSBram Moolenaar  delfunc g:Values
17152b32700dSBram Moolenaar  unlet g:loadCount
1716577dc93dSBram Moolenaar
1717577dc93dSBram Moolenaar  lines =<< trim END
1718577dc93dSBram Moolenaar      vim9script
1719577dc93dSBram Moolenaar      def Inner()
1720577dc93dSBram Moolenaar      enddef
1721577dc93dSBram Moolenaar  END
1722577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1723577dc93dSBram Moolenaar  source XreloadScript.vim
1724577dc93dSBram Moolenaar
1725577dc93dSBram Moolenaar  lines =<< trim END
1726577dc93dSBram Moolenaar      vim9script
1727577dc93dSBram Moolenaar      def Outer()
1728577dc93dSBram Moolenaar        def Inner()
1729577dc93dSBram Moolenaar        enddef
1730577dc93dSBram Moolenaar      enddef
1731577dc93dSBram Moolenaar      defcompile
1732577dc93dSBram Moolenaar  END
1733577dc93dSBram Moolenaar  lines->writefile('XreloadScript.vim')
1734577dc93dSBram Moolenaar  source XreloadScript.vim
1735577dc93dSBram Moolenaar
1736577dc93dSBram Moolenaar  delete('XreloadScript.vim')
17372b32700dSBram Moolenaarenddef
17382b32700dSBram Moolenaar
17394c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1740cfcd011fSBram Moolenaar  var lines =<< trim END
17418a7d6542SBram Moolenaar    vim9script
17428a7d6542SBram Moolenaar    const var = ''
1743cfcd011fSBram Moolenaar    var valone = 1234
17448a7d6542SBram Moolenaar    def MyFunc(arg: string)
17458a7d6542SBram Moolenaar       valone = 5678
17468a7d6542SBram Moolenaar    enddef
17478a7d6542SBram Moolenaar  END
1748cfcd011fSBram Moolenaar  var morelines =<< trim END
1749cfcd011fSBram Moolenaar    var valtwo = 222
17508a7d6542SBram Moolenaar    export def GetValtwo(): number
17518a7d6542SBram Moolenaar      return valtwo
17528a7d6542SBram Moolenaar    enddef
17538a7d6542SBram Moolenaar  END
175403afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
17558a7d6542SBram Moolenaar  source Xreload.vim
17568a7d6542SBram Moolenaar  source Xreload.vim
17578a7d6542SBram Moolenaar  source Xreload.vim
17588a7d6542SBram Moolenaar
1759f5be8cdbSBram Moolenaar  # cannot declare a var twice
17608a7d6542SBram Moolenaar  lines =<< trim END
17618a7d6542SBram Moolenaar    vim9script
1762cfcd011fSBram Moolenaar    var valone = 1234
1763cfcd011fSBram Moolenaar    var valone = 5678
17648a7d6542SBram Moolenaar  END
17658a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
176644d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
17678a7d6542SBram Moolenaar
17688a7d6542SBram Moolenaar  delete('Xreload.vim')
17698a7d6542SBram Moolenaar  delete('Ximport.vim')
17708a7d6542SBram Moolenaarenddef
17718a7d6542SBram Moolenaar
177207a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
177307a65d26SBram Moolenaar" compiled function using that variable must fail.
177407a65d26SBram Moolenaardef Test_script_reload_change_type()
177507a65d26SBram Moolenaar  var lines =<< trim END
177607a65d26SBram Moolenaar    vim9script noclear
177707a65d26SBram Moolenaar    var str = 'string'
177807a65d26SBram Moolenaar    def g:GetStr(): string
177907a65d26SBram Moolenaar      return str .. 'xxx'
178007a65d26SBram Moolenaar    enddef
178107a65d26SBram Moolenaar  END
178207a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
178307a65d26SBram Moolenaar  source Xreload.vim
178407a65d26SBram Moolenaar  echo g:GetStr()
178507a65d26SBram Moolenaar
178607a65d26SBram Moolenaar  lines =<< trim END
178707a65d26SBram Moolenaar    vim9script noclear
178807a65d26SBram Moolenaar    var str = 1234
178907a65d26SBram Moolenaar  END
179007a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
179107a65d26SBram Moolenaar  source Xreload.vim
179207a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
179307a65d26SBram Moolenaar
179407a65d26SBram Moolenaar  delfunc g:GetStr
179507a65d26SBram Moolenaar  delete('Xreload.vim')
179607a65d26SBram Moolenaarenddef
179707a65d26SBram Moolenaar
1798c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled
1799c970e422SBram Moolenaarcommand CallFunc echo 'nop'
1800c970e422SBram Moolenaar
1801c970e422SBram Moolenaardef Test_script_reload_from_function()
1802c970e422SBram Moolenaar  var lines =<< trim END
1803c970e422SBram Moolenaar      vim9script
1804c970e422SBram Moolenaar
1805c970e422SBram Moolenaar      if exists('g:loaded')
1806c970e422SBram Moolenaar        finish
1807c970e422SBram Moolenaar      endif
1808c970e422SBram Moolenaar      g:loaded = 1
1809c970e422SBram Moolenaar      delcommand CallFunc
1810c970e422SBram Moolenaar      command CallFunc Func()
1811c970e422SBram Moolenaar      def Func()
1812a4c81beaSBram Moolenaar        so XreloadFunc.vim
1813c970e422SBram Moolenaar        g:didTheFunc = 1
1814c970e422SBram Moolenaar      enddef
1815c970e422SBram Moolenaar  END
1816c970e422SBram Moolenaar  writefile(lines, 'XreloadFunc.vim')
1817c970e422SBram Moolenaar  source XreloadFunc.vim
1818c970e422SBram Moolenaar  CallFunc
1819c970e422SBram Moolenaar  assert_equal(1, g:didTheFunc)
1820c970e422SBram Moolenaar
1821c970e422SBram Moolenaar  delete('XreloadFunc.vim')
1822c970e422SBram Moolenaar  delcommand CallFunc
1823c970e422SBram Moolenaar  unlet g:loaded
1824c970e422SBram Moolenaar  unlet g:didTheFunc
1825c970e422SBram Moolenaarenddef
1826c970e422SBram Moolenaar
18276c3843caSBram Moolenaardef Test_script_var_shadows_function()
18286c3843caSBram Moolenaar  var lines =<< trim END
18296c3843caSBram Moolenaar      vim9script
18306c3843caSBram Moolenaar      def Func(): number
18316c3843caSBram Moolenaar        return 123
18326c3843caSBram Moolenaar      enddef
18336c3843caSBram Moolenaar      var Func = 1
18346c3843caSBram Moolenaar  END
18356c3843caSBram Moolenaar  CheckScriptFailure(lines, 'E1041:', 5)
18366c3843caSBram Moolenaarenddef
18376c3843caSBram Moolenaar
1838c323527dSBram Moolenaardef Test_script_var_shadows_command()
1839c323527dSBram Moolenaar  var lines =<< trim END
1840c323527dSBram Moolenaar      var undo = 1
1841c323527dSBram Moolenaar      undo = 2
1842c323527dSBram Moolenaar      assert_equal(2, undo)
1843c323527dSBram Moolenaar  END
1844c323527dSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1845c323527dSBram Moolenaar
1846c323527dSBram Moolenaar  lines =<< trim END
1847c323527dSBram Moolenaar      var undo = 1
1848c323527dSBram Moolenaar      undo
1849c323527dSBram Moolenaar  END
1850c323527dSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1207:', 2)
1851c323527dSBram Moolenaarenddef
1852c323527dSBram Moolenaar
185395006e3dSBram Moolenaardef s:RetSome(): string
185495006e3dSBram Moolenaar  return 'some'
185595006e3dSBram Moolenaarenddef
185695006e3dSBram Moolenaar
1857fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1858fe465a01SBram Moolenaar" script-local name.
1859fe465a01SBram Moolenaardef Test_vim9script_funcref()
1860cfcd011fSBram Moolenaar  var sortlines =<< trim END
1861fe465a01SBram Moolenaar      vim9script
1862fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1863bed36b93SBram Moolenaar        return i2 - i1
1864fe465a01SBram Moolenaar      enddef
1865fe465a01SBram Moolenaar
1866fe465a01SBram Moolenaar      export def FastSort(): list<number>
1867fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1868fe465a01SBram Moolenaar      enddef
1869529fb5a5SBram Moolenaar
1870529fb5a5SBram Moolenaar      export def GetString(arg: string): string
1871529fb5a5SBram Moolenaar        return arg
1872529fb5a5SBram Moolenaar      enddef
1873fe465a01SBram Moolenaar  END
1874fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1875fe465a01SBram Moolenaar
1876cfcd011fSBram Moolenaar  var lines =<< trim END
1877fe465a01SBram Moolenaar    vim9script
1878fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1879fe465a01SBram Moolenaar    def Test()
1880fe465a01SBram Moolenaar      g:result = FastSort()
1881fe465a01SBram Moolenaar    enddef
1882fe465a01SBram Moolenaar    Test()
1883529fb5a5SBram Moolenaar
1884529fb5a5SBram Moolenaar    # using a function imported with "as"
1885529fb5a5SBram Moolenaar    import * as anAlias from './Xsort.vim'
1886529fb5a5SBram Moolenaar    assert_equal('yes', anAlias.GetString('yes'))
1887529fb5a5SBram Moolenaar
1888529fb5a5SBram Moolenaar    # using the function from a compiled function
1889529fb5a5SBram Moolenaar    def TestMore(): string
1890ca51cc0aSBram Moolenaar      var s = s:anAlias.GetString('foo')
1891ca51cc0aSBram Moolenaar      return s .. anAlias.GetString('bar')
1892529fb5a5SBram Moolenaar    enddef
1893ca51cc0aSBram Moolenaar    assert_equal('foobar', TestMore())
1894529fb5a5SBram Moolenaar
1895529fb5a5SBram Moolenaar    # error when using a function that isn't exported
1896529fb5a5SBram Moolenaar    assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1897fe465a01SBram Moolenaar  END
1898fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1899fe465a01SBram Moolenaar
1900fe465a01SBram Moolenaar  source Xscript.vim
1901fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1902fe465a01SBram Moolenaar
1903fe465a01SBram Moolenaar  unlet g:result
1904fe465a01SBram Moolenaar  delete('Xsort.vim')
1905fe465a01SBram Moolenaar  delete('Xscript.vim')
190695006e3dSBram Moolenaar
1907cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
190895006e3dSBram Moolenaar  assert_equal('some', Funcref())
1909fe465a01SBram Moolenaarenddef
1910fe465a01SBram Moolenaar
1911601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1912601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1913601e76acSBram Moolenaar" function reference.
1914c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1915cfcd011fSBram Moolenaar  var filterLines =<< trim END
1916c620c055SBram Moolenaar    vim9script
1917c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1918c620c055SBram Moolenaar      return idx % 2 == 1
1919c620c055SBram Moolenaar    enddef
1920c620c055SBram Moolenaar    export def FastFilter(): list<number>
1921c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1922c620c055SBram Moolenaar    enddef
1923601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1924601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1925601e76acSBram Moolenaar    enddef
1926c620c055SBram Moolenaar  END
1927c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1928c620c055SBram Moolenaar
1929cfcd011fSBram Moolenaar  var lines =<< trim END
1930c620c055SBram Moolenaar    vim9script
1931601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1932c620c055SBram Moolenaar    def Test()
1933cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1934c620c055SBram Moolenaar    enddef
1935c620c055SBram Moolenaar    Test()
1936601e76acSBram Moolenaar    def TestDirect()
1937cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1938601e76acSBram Moolenaar    enddef
1939601e76acSBram Moolenaar    TestDirect()
1940c620c055SBram Moolenaar  END
1941601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1942c620c055SBram Moolenaar  delete('Xfilter.vim')
1943c620c055SBram Moolenaarenddef
1944c620c055SBram Moolenaar
19454c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1946cfcd011fSBram Moolenaar  var first_lines =<< trim END
19474c17ad94SBram Moolenaar    vim9script
19484c17ad94SBram Moolenaar    def FuncYes(): string
19494c17ad94SBram Moolenaar      return 'yes'
19504c17ad94SBram Moolenaar    enddef
19514c17ad94SBram Moolenaar  END
1952cfcd011fSBram Moolenaar  var withno_lines =<< trim END
19534c17ad94SBram Moolenaar    def FuncNo(): string
19544c17ad94SBram Moolenaar      return 'no'
19554c17ad94SBram Moolenaar    enddef
19564c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
19574c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
19584c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
195903afdcf1SBram Moolenaar    enddef
196003afdcf1SBram Moolenaar  END
1961cfcd011fSBram Moolenaar  var nono_lines =<< trim END
196203afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
196303afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
196444d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
19654c17ad94SBram Moolenaar    enddef
19664c17ad94SBram Moolenaar  END
19674c17ad94SBram Moolenaar
19684c17ad94SBram Moolenaar  # FuncNo() is defined
196903afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
19704c17ad94SBram Moolenaar  source Xreloaded.vim
19714c17ad94SBram Moolenaar  g:DoCheck(true)
19724c17ad94SBram Moolenaar
19734c17ad94SBram Moolenaar  # FuncNo() is not redefined
197403afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
19754c17ad94SBram Moolenaar  source Xreloaded.vim
19765082471fSBram Moolenaar  g:DoCheck(false)
19774c17ad94SBram Moolenaar
19784c17ad94SBram Moolenaar  # FuncNo() is back
197903afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
19804c17ad94SBram Moolenaar  source Xreloaded.vim
19815082471fSBram Moolenaar  g:DoCheck(false)
19824c17ad94SBram Moolenaar
19834c17ad94SBram Moolenaar  delete('Xreloaded.vim')
19844c17ad94SBram Moolenaarenddef
19854c17ad94SBram Moolenaar
198689483d40SBram Moolenaardef Test_vim9script_reload_delvar()
198789483d40SBram Moolenaar  # write the script with a script-local variable
1988cfcd011fSBram Moolenaar  var lines =<< trim END
198989483d40SBram Moolenaar    vim9script
1990cfcd011fSBram Moolenaar    var name = 'string'
199189483d40SBram Moolenaar  END
199289483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
199389483d40SBram Moolenaar  source XreloadVar.vim
199489483d40SBram Moolenaar
199589483d40SBram Moolenaar  # now write the script using the same variable locally - works
199689483d40SBram Moolenaar  lines =<< trim END
199789483d40SBram Moolenaar    vim9script
199889483d40SBram Moolenaar    def Func()
1999cfcd011fSBram Moolenaar      var name = 'string'
200089483d40SBram Moolenaar    enddef
200189483d40SBram Moolenaar  END
200289483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
200389483d40SBram Moolenaar  source XreloadVar.vim
200489483d40SBram Moolenaar
200589483d40SBram Moolenaar  delete('XreloadVar.vim')
200689483d40SBram Moolenaarenddef
200789483d40SBram Moolenaar
20088a7d6542SBram Moolenaardef Test_import_absolute()
2009cfcd011fSBram Moolenaar  var import_lines = [
2010e6085c53SBram Moolenaar        'vim9script',
2011e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
2012e6085c53SBram Moolenaar        'def UseExported()',
2013e6085c53SBram Moolenaar        '  g:imported_abs = exported',
2014e6085c53SBram Moolenaar        '  exported = 8888',
2015e6085c53SBram Moolenaar        '  g:imported_after = exported',
2016e6085c53SBram Moolenaar        'enddef',
2017e6085c53SBram Moolenaar        'UseExported()',
2018e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
2019e6085c53SBram Moolenaar        ]
20208a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
20218a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
20228a7d6542SBram Moolenaar
20238a7d6542SBram Moolenaar  source Ximport_abs.vim
20248a7d6542SBram Moolenaar
20258a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
20264e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
2027fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
2028fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
2029fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2030fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
2031fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
2032fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
2033fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
2034fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
2035fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2036fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
2037e6085c53SBram Moolenaar        g:import_disassembled)
2038b3ca9824SBram Moolenaar
2039b3ca9824SBram Moolenaar  Undo_export_script_lines()
20408a7d6542SBram Moolenaar  unlet g:imported_abs
20414e12a5dfSBram Moolenaar  unlet g:import_disassembled
20428a7d6542SBram Moolenaar
20438a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
20448a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
20458a7d6542SBram Moolenaarenddef
20468a7d6542SBram Moolenaar
20478a7d6542SBram Moolenaardef Test_import_rtp()
2048cfcd011fSBram Moolenaar  var import_lines = [
2049e6085c53SBram Moolenaar        'vim9script',
2050e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
2051e6085c53SBram Moolenaar        'g:imported_rtp = exported',
2052e6085c53SBram Moolenaar        ]
20538a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
2054b885a7c7SBram Moolenaar  mkdir('import', 'p')
2055b885a7c7SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
20568a7d6542SBram Moolenaar
2057cfcd011fSBram Moolenaar  var save_rtp = &rtp
20588a7d6542SBram Moolenaar  &rtp = getcwd()
20598a7d6542SBram Moolenaar  source Ximport_rtp.vim
20608a7d6542SBram Moolenaar  &rtp = save_rtp
20618a7d6542SBram Moolenaar
20628a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
20638a7d6542SBram Moolenaar
2064b3ca9824SBram Moolenaar  Undo_export_script_lines()
2065b3ca9824SBram Moolenaar  unlet g:imported_rtp
20668a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
2067b885a7c7SBram Moolenaar  delete('import', 'rf')
20688a7d6542SBram Moolenaarenddef
20698a7d6542SBram Moolenaar
207025e0f586SBram Moolenaardef Test_import_compile_error()
2071cfcd011fSBram Moolenaar  var export_lines = [
207225e0f586SBram Moolenaar        'vim9script',
207325e0f586SBram Moolenaar        'export def ExpFunc(): string',
207425e0f586SBram Moolenaar        '  return notDefined',
207525e0f586SBram Moolenaar        'enddef',
207625e0f586SBram Moolenaar        ]
207725e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
207825e0f586SBram Moolenaar
2079cfcd011fSBram Moolenaar  var import_lines = [
208025e0f586SBram Moolenaar        'vim9script',
208125e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
208225e0f586SBram Moolenaar        'def ImpFunc()',
208325e0f586SBram Moolenaar        '  echo ExpFunc()',
208425e0f586SBram Moolenaar        'enddef',
208525e0f586SBram Moolenaar        'defcompile',
208625e0f586SBram Moolenaar        ]
208725e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
208825e0f586SBram Moolenaar
208925e0f586SBram Moolenaar  try
209025e0f586SBram Moolenaar    source Ximport.vim
209125e0f586SBram Moolenaar  catch /E1001/
2092f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
20937707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
209425e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
209525e0f586SBram Moolenaar  endtry
209625e0f586SBram Moolenaar
209725e0f586SBram Moolenaar  delete('Xexported.vim')
209825e0f586SBram Moolenaar  delete('Ximport.vim')
209925e0f586SBram Moolenaarenddef
210025e0f586SBram Moolenaar
2101c4ce36d4SBram Moolenaardef Test_func_redefine_error()
2102cfcd011fSBram Moolenaar  var lines = [
2103c4ce36d4SBram Moolenaar        'vim9script',
2104c4ce36d4SBram Moolenaar        'def Func()',
2105c4ce36d4SBram Moolenaar        '  eval [][0]',
2106c4ce36d4SBram Moolenaar        'enddef',
2107c4ce36d4SBram Moolenaar        'Func()',
2108c4ce36d4SBram Moolenaar        ]
2109c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
2110c4ce36d4SBram Moolenaar
2111c4ce36d4SBram Moolenaar  for count in range(3)
2112c4ce36d4SBram Moolenaar    try
2113c4ce36d4SBram Moolenaar      source Xtestscript.vim
2114c4ce36d4SBram Moolenaar    catch /E684/
2115c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
2116c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
2117c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
2118c4ce36d4SBram Moolenaar    endtry
2119c4ce36d4SBram Moolenaar  endfor
2120c4ce36d4SBram Moolenaar
2121c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
2122c4ce36d4SBram Moolenaarenddef
2123c4ce36d4SBram Moolenaar
2124eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
2125cfcd011fSBram Moolenaar  var export_lines =<< trim END
2126eef2102eSBram Moolenaar      vim9script
2127eef2102eSBram Moolenaar      export def Func()
2128eef2102eSBram Moolenaar        echo 'imported'
2129eef2102eSBram Moolenaar      enddef
2130eef2102eSBram Moolenaar  END
2131eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
2132eef2102eSBram Moolenaar
2133cfcd011fSBram Moolenaar  var lines =<< trim END
2134eef2102eSBram Moolenaar    vim9script
2135eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2136eef2102eSBram Moolenaar    def Func()
2137eef2102eSBram Moolenaar      echo 'local to function'
2138eef2102eSBram Moolenaar    enddef
2139eef2102eSBram Moolenaar  END
2140eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2141eef2102eSBram Moolenaar
2142eef2102eSBram Moolenaar  lines =<< trim END
2143eef2102eSBram Moolenaar    vim9script
2144eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2145eef2102eSBram Moolenaar    def Outer()
2146eef2102eSBram Moolenaar      def Func()
2147eef2102eSBram Moolenaar        echo 'local to function'
2148eef2102eSBram Moolenaar      enddef
2149eef2102eSBram Moolenaar    enddef
2150eef2102eSBram Moolenaar    defcompile
2151eef2102eSBram Moolenaar  END
2152eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2153eef2102eSBram Moolenaar
2154eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
2155eef2102eSBram Moolenaarenddef
2156eef2102eSBram Moolenaar
2157b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
2158cfcd011fSBram Moolenaar  var lines =<< trim END
2159b9a2cac3SBram Moolenaar    vim9script
2160b9a2cac3SBram Moolenaar    def Func()
2161b9a2cac3SBram Moolenaar      echo 'one'
2162b9a2cac3SBram Moolenaar    enddef
2163b9a2cac3SBram Moolenaar    def Func()
2164b9a2cac3SBram Moolenaar      echo 'two'
2165b9a2cac3SBram Moolenaar    enddef
2166b9a2cac3SBram Moolenaar  END
2167b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2168fa211f3cSBram Moolenaar
2169fa211f3cSBram Moolenaar  lines =<< trim END
2170fa211f3cSBram Moolenaar    vim9script
2171fa211f3cSBram Moolenaar    def Foo(): string
2172fa211f3cSBram Moolenaar      return 'foo'
2173fa211f3cSBram Moolenaar      enddef
2174fa211f3cSBram Moolenaar    def Func()
2175cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
2176fa211f3cSBram Moolenaar    enddef
2177fa211f3cSBram Moolenaar    defcompile
2178fa211f3cSBram Moolenaar  END
2179fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2180b9a2cac3SBram Moolenaarenddef
2181b9a2cac3SBram Moolenaar
21828a7d6542SBram Moolenaardef Test_fixed_size_list()
2183f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
2184cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
21858a7d6542SBram Moolenaar  l->remove(0)
21868a7d6542SBram Moolenaar  l->add(5)
21878a7d6542SBram Moolenaar  l->insert(99, 1)
21880f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
21898a7d6542SBram Moolenaarenddef
21908a7d6542SBram Moolenaar
2191ae616494SBram Moolenaardef Test_no_insert_xit()
2192d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2193d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2194d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2195d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2196d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2197ae616494SBram Moolenaar
2198ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2199ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2200ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2201ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2202f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2203f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
22046508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
22056508880dSBram Moolenaar  CheckScriptFailure(['vim9script', 'o'], 'E1100:')
2206f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2207f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2208f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2209ae616494SBram Moolenaarenddef
2210ae616494SBram Moolenaar
2211158906cfSBram Moolenaardef IfElse(what: number): string
2212cfcd011fSBram Moolenaar  var res = ''
2213158906cfSBram Moolenaar  if what == 1
2214158906cfSBram Moolenaar    res = "one"
2215158906cfSBram Moolenaar  elseif what == 2
2216158906cfSBram Moolenaar    res = "two"
2217a259d8d3SBram Moolenaar  else
2218158906cfSBram Moolenaar    res = "three"
2219a259d8d3SBram Moolenaar  endif
2220158906cfSBram Moolenaar  return res
2221a259d8d3SBram Moolenaarenddef
2222a259d8d3SBram Moolenaar
2223158906cfSBram Moolenaardef Test_if_elseif_else()
2224158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2225158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2226158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
22270f18b6d1SBram Moolenaarenddef
22280f18b6d1SBram Moolenaar
2229e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2230d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2231d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2232d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2233ced68a00SBram Moolenaar  CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
2234d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
22356628b7ebSBram Moolenaar
22366628b7ebSBram Moolenaar  var lines =<< trim END
22376628b7ebSBram Moolenaar      var s = ''
22386628b7ebSBram Moolenaar      if s = ''
22396628b7ebSBram Moolenaar      endif
22406628b7ebSBram Moolenaar  END
22416628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
22426628b7ebSBram Moolenaar
22436628b7ebSBram Moolenaar  lines =<< trim END
22446628b7ebSBram Moolenaar      var s = ''
22456628b7ebSBram Moolenaar      if s == ''
22466628b7ebSBram Moolenaar      elseif s = ''
22476628b7ebSBram Moolenaar      endif
22486628b7ebSBram Moolenaar  END
22496628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2250e8c4abbbSBram Moolenaarenddef
2251e8c4abbbSBram Moolenaar
22526d69bf60SBram Moolenaarlet g:bool_true = v:true
22536d69bf60SBram Moolenaarlet g:bool_false = v:false
22546d69bf60SBram Moolenaar
22556d69bf60SBram Moolenaardef Test_if_const_expr()
2256cfcd011fSBram Moolenaar  var res = false
22576d69bf60SBram Moolenaar  if true ? true : false
22586d69bf60SBram Moolenaar    res = true
22596d69bf60SBram Moolenaar  endif
22606d69bf60SBram Moolenaar  assert_equal(true, res)
22616d69bf60SBram Moolenaar
2262585fea7bSBram Moolenaar  g:glob = 2
2263585fea7bSBram Moolenaar  if false
22646797966dSBram Moolenaar    execute('g:glob = 3')
2265585fea7bSBram Moolenaar  endif
2266585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2267585fea7bSBram Moolenaar  if true
22686797966dSBram Moolenaar    execute('g:glob = 3')
2269585fea7bSBram Moolenaar  endif
2270585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2271585fea7bSBram Moolenaar
22726d69bf60SBram Moolenaar  res = false
22736d69bf60SBram Moolenaar  if g:bool_true ? true : false
22746d69bf60SBram Moolenaar    res = true
22756d69bf60SBram Moolenaar  endif
22766d69bf60SBram Moolenaar  assert_equal(true, res)
22776d69bf60SBram Moolenaar
22786d69bf60SBram Moolenaar  res = false
22796d69bf60SBram Moolenaar  if true ? g:bool_true : false
22806d69bf60SBram Moolenaar    res = true
22816d69bf60SBram Moolenaar  endif
22826d69bf60SBram Moolenaar  assert_equal(true, res)
22836d69bf60SBram Moolenaar
22846d69bf60SBram Moolenaar  res = false
22856d69bf60SBram Moolenaar  if true ? true : g:bool_false
22866d69bf60SBram Moolenaar    res = true
22876d69bf60SBram Moolenaar  endif
22886d69bf60SBram Moolenaar  assert_equal(true, res)
22896d69bf60SBram Moolenaar
22906d69bf60SBram Moolenaar  res = false
22916d69bf60SBram Moolenaar  if true ? false : true
22926d69bf60SBram Moolenaar    res = true
22936d69bf60SBram Moolenaar  endif
22946d69bf60SBram Moolenaar  assert_equal(false, res)
22956d69bf60SBram Moolenaar
22966d69bf60SBram Moolenaar  res = false
22976d69bf60SBram Moolenaar  if false ? false : true
22986d69bf60SBram Moolenaar    res = true
22996d69bf60SBram Moolenaar  endif
23006d69bf60SBram Moolenaar  assert_equal(true, res)
23016d69bf60SBram Moolenaar
23026d69bf60SBram Moolenaar  res = false
23036d69bf60SBram Moolenaar  if false ? true : false
23046d69bf60SBram Moolenaar    res = true
23056d69bf60SBram Moolenaar  endif
23066d69bf60SBram Moolenaar  assert_equal(false, res)
23076d69bf60SBram Moolenaar
23086d69bf60SBram Moolenaar  res = false
2309e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2310e8c4abbbSBram Moolenaar    res = true
2311e8c4abbbSBram Moolenaar  endif
2312e8c4abbbSBram Moolenaar  assert_equal(false, res)
2313e8c4abbbSBram Moolenaar
2314e8c4abbbSBram Moolenaar  res = false
23156d69bf60SBram Moolenaar  if true && true
23166d69bf60SBram Moolenaar    res = true
23176d69bf60SBram Moolenaar  endif
23186d69bf60SBram Moolenaar  assert_equal(true, res)
23196d69bf60SBram Moolenaar
23206d69bf60SBram Moolenaar  res = false
23216d69bf60SBram Moolenaar  if true && false
23226d69bf60SBram Moolenaar    res = true
23236d69bf60SBram Moolenaar  endif
23246d69bf60SBram Moolenaar  assert_equal(false, res)
23256d69bf60SBram Moolenaar
23266d69bf60SBram Moolenaar  res = false
23276d69bf60SBram Moolenaar  if g:bool_true && false
23286d69bf60SBram Moolenaar    res = true
23296d69bf60SBram Moolenaar  endif
23306d69bf60SBram Moolenaar  assert_equal(false, res)
23316d69bf60SBram Moolenaar
23326d69bf60SBram Moolenaar  res = false
23336d69bf60SBram Moolenaar  if true && g:bool_false
23346d69bf60SBram Moolenaar    res = true
23356d69bf60SBram Moolenaar  endif
23366d69bf60SBram Moolenaar  assert_equal(false, res)
23376d69bf60SBram Moolenaar
23386d69bf60SBram Moolenaar  res = false
23396d69bf60SBram Moolenaar  if false && false
23406d69bf60SBram Moolenaar    res = true
23416d69bf60SBram Moolenaar  endif
23426d69bf60SBram Moolenaar  assert_equal(false, res)
23436d69bf60SBram Moolenaar
23446d69bf60SBram Moolenaar  res = false
23456d69bf60SBram Moolenaar  if true || false
23466d69bf60SBram Moolenaar    res = true
23476d69bf60SBram Moolenaar  endif
23486d69bf60SBram Moolenaar  assert_equal(true, res)
23496d69bf60SBram Moolenaar
23506d69bf60SBram Moolenaar  res = false
23516d69bf60SBram Moolenaar  if g:bool_true || false
23526d69bf60SBram Moolenaar    res = true
23536d69bf60SBram Moolenaar  endif
23546d69bf60SBram Moolenaar  assert_equal(true, res)
23556d69bf60SBram Moolenaar
23566d69bf60SBram Moolenaar  res = false
23576d69bf60SBram Moolenaar  if true || g:bool_false
23586d69bf60SBram Moolenaar    res = true
23596d69bf60SBram Moolenaar  endif
23606d69bf60SBram Moolenaar  assert_equal(true, res)
23616d69bf60SBram Moolenaar
23626d69bf60SBram Moolenaar  res = false
23636d69bf60SBram Moolenaar  if false || false
23646d69bf60SBram Moolenaar    res = true
23656d69bf60SBram Moolenaar  endif
23666d69bf60SBram Moolenaar  assert_equal(false, res)
23673988f64fSBram Moolenaar
23683988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
2369c323527dSBram Moolenaar  if false | eval 1 + 2 | endif
23703988f64fSBram Moolenaar  if false | eval burp + 234 | endif
23713988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
23723988f64fSBram Moolenaar  if false
23733988f64fSBram Moolenaar    burp
23743988f64fSBram Moolenaar  endif
2375e525bddaSBram Moolenaar
2376e525bddaSBram Moolenaar  # expression with line breaks skipped
2377e525bddaSBram Moolenaar  if false
2378e525bddaSBram Moolenaar      ('aaa'
2379e525bddaSBram Moolenaar      .. 'bbb'
2380e525bddaSBram Moolenaar      .. 'ccc'
2381e525bddaSBram Moolenaar      )->setline(1)
2382e525bddaSBram Moolenaar  endif
238380c34ca3SBram Moolenaarenddef
23846d69bf60SBram Moolenaar
238580c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2386d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2387d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2388d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2389d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
23906d69bf60SBram Moolenaarenddef
23916d69bf60SBram Moolenaar
239272abcf42SBram Moolenaardef RunNested(i: number): number
2393cfcd011fSBram Moolenaar  var x: number = 0
239472abcf42SBram Moolenaar  if i % 2
239572abcf42SBram Moolenaar    if 1
2396f5be8cdbSBram Moolenaar      # comment
239772abcf42SBram Moolenaar    else
2398f5be8cdbSBram Moolenaar      # comment
239972abcf42SBram Moolenaar    endif
240072abcf42SBram Moolenaar    x += 1
240172abcf42SBram Moolenaar  else
240272abcf42SBram Moolenaar    x += 1000
240372abcf42SBram Moolenaar  endif
240472abcf42SBram Moolenaar  return x
240572abcf42SBram Moolenaarenddef
240672abcf42SBram Moolenaar
240772abcf42SBram Moolenaardef Test_nested_if()
240872abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
240972abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
241072abcf42SBram Moolenaarenddef
241172abcf42SBram Moolenaar
2412ad39c094SBram Moolenaardef Test_execute_cmd()
2413e4984290SBram Moolenaar  # missing argument is ignored
2414e4984290SBram Moolenaar  execute
2415e4984290SBram Moolenaar  execute # comment
2416e4984290SBram Moolenaar
2417ad39c094SBram Moolenaar  new
2418ad39c094SBram Moolenaar  setline(1, 'default')
2419d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2420ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2421a72cfb80SBram Moolenaar
2422d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2423a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2424a72cfb80SBram Moolenaar
2425cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
2426cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
2427a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2428ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2429a72cfb80SBram Moolenaar
2430d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2431ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2432a72cfb80SBram Moolenaar
2433cfcd011fSBram Moolenaar  var cmd_first = 'call '
2434cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
2435ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2436ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2437ad39c094SBram Moolenaar  bwipe!
2438585fea7bSBram Moolenaar
2439cfcd011fSBram Moolenaar  var n = true
24402d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
24412d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
24422d6b20d6SBram Moolenaar
2443e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
2444e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2445e5abf7afSBram Moolenaar
2446d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2447d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2448d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2449ad39c094SBram Moolenaarenddef
2450ad39c094SBram Moolenaar
245147e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2452f5be8cdbSBram Moolenaar  # only checks line continuation
2453cfcd011fSBram Moolenaar  var lines =<< trim END
245447e880d6SBram Moolenaar      vim9script
245547e880d6SBram Moolenaar      execute 'g:someVar'
245647e880d6SBram Moolenaar                .. ' = ' ..
245747e880d6SBram Moolenaar                   '28'
245847e880d6SBram Moolenaar      assert_equal(28, g:someVar)
245947e880d6SBram Moolenaar      unlet g:someVar
246047e880d6SBram Moolenaar  END
246147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
246247e880d6SBram Moolenaarenddef
246347e880d6SBram Moolenaar
2464ad39c094SBram Moolenaardef Test_echo_cmd()
2465a72cfb80SBram Moolenaar  echo 'some' # comment
2466585fea7bSBram Moolenaar  echon 'thing'
2467ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2468ad39c094SBram Moolenaar
2469a72cfb80SBram Moolenaar  echo "some" # comment
2470a72cfb80SBram Moolenaar  echon "thing"
2471a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2472a72cfb80SBram Moolenaar
2473cfcd011fSBram Moolenaar  var str1 = 'some'
2474cfcd011fSBram Moolenaar  var str2 = 'more'
2475ad39c094SBram Moolenaar  echo str1 str2
2476ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2477a72cfb80SBram Moolenaar
2478d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2479ad39c094SBram Moolenaarenddef
2480ad39c094SBram Moolenaar
2481f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2482f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2483f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2484f93c7feaSBram Moolenaar  echo 'clear'
2485df069eecSBram Moolenaar  :1messages
2486f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2487f93c7feaSBram Moolenaar
2488d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2489f93c7feaSBram Moolenaarenddef
2490f93c7feaSBram Moolenaar
249147e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2492f5be8cdbSBram Moolenaar  # only checks line continuation
2493cfcd011fSBram Moolenaar  var lines =<< trim END
249447e880d6SBram Moolenaar      vim9script
249547e880d6SBram Moolenaar      echomsg 'here'
249647e880d6SBram Moolenaar                .. ' is ' ..
249747e880d6SBram Moolenaar                   'a message'
249847e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
249947e880d6SBram Moolenaar  END
250047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
250147e880d6SBram Moolenaarenddef
250247e880d6SBram Moolenaar
2503f93c7feaSBram Moolenaardef Test_echoerr_cmd()
25047de62623SBram Moolenaar  var local = 'local'
250540ee466cSBram Moolenaar  try
25067de62623SBram Moolenaar    echoerr 'something' local 'wrong' # comment
250740ee466cSBram Moolenaar  catch
25087de62623SBram Moolenaar    assert_match('something local wrong', v:exception)
250940ee466cSBram Moolenaar  endtry
2510f93c7feaSBram Moolenaarenddef
2511f93c7feaSBram Moolenaar
251247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2513f5be8cdbSBram Moolenaar  # only checks line continuation
2514cfcd011fSBram Moolenaar  var lines =<< trim END
251547e880d6SBram Moolenaar      vim9script
251647e880d6SBram Moolenaar      try
251747e880d6SBram Moolenaar        echoerr 'this'
251847e880d6SBram Moolenaar                .. ' is ' ..
251947e880d6SBram Moolenaar                   'wrong'
252047e880d6SBram Moolenaar      catch
252147e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
252247e880d6SBram Moolenaar      endtry
252347e880d6SBram Moolenaar  END
252447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
252547e880d6SBram Moolenaarenddef
252647e880d6SBram Moolenaar
25277de62623SBram Moolenaardef Test_echoconsole_cmd()
25287de62623SBram Moolenaar  var local = 'local'
25297de62623SBram Moolenaar  echoconsole 'something' local # comment
25307de62623SBram Moolenaar  # output goes anywhere
25317de62623SBram Moolenaarenddef
25327de62623SBram Moolenaar
253341fe0617SBram Moolenaardef Test_for_outside_of_function()
2534cfcd011fSBram Moolenaar  var lines =<< trim END
253541fe0617SBram Moolenaar    vim9script
253641fe0617SBram Moolenaar    new
253741fe0617SBram Moolenaar    for var in range(0, 3)
253841fe0617SBram Moolenaar      append(line('$'), var)
253941fe0617SBram Moolenaar    endfor
254041fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
254141fe0617SBram Moolenaar    bwipe!
2542522eefd9SBram Moolenaar
2543522eefd9SBram Moolenaar    var result = ''
2544522eefd9SBram Moolenaar    for i in [1, 2, 3]
2545522eefd9SBram Moolenaar      var loop = ' loop ' .. i
2546522eefd9SBram Moolenaar      result ..= loop
2547522eefd9SBram Moolenaar    endfor
2548522eefd9SBram Moolenaar    assert_equal(' loop 1 loop 2 loop 3', result)
254941fe0617SBram Moolenaar  END
255041fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
255141fe0617SBram Moolenaar  source Xvim9for.vim
255241fe0617SBram Moolenaar  delete('Xvim9for.vim')
255341fe0617SBram Moolenaarenddef
25548a7d6542SBram Moolenaar
2555e8c4abbbSBram Moolenaardef Test_for_loop()
2556f2253963SBram Moolenaar  var lines =<< trim END
2557cfcd011fSBram Moolenaar      var result = ''
2558e8c4abbbSBram Moolenaar      for cnt in range(7)
2559e8c4abbbSBram Moolenaar        if cnt == 4
2560e8c4abbbSBram Moolenaar          break
2561e8c4abbbSBram Moolenaar        endif
2562e8c4abbbSBram Moolenaar        if cnt == 2
2563e8c4abbbSBram Moolenaar          continue
2564e8c4abbbSBram Moolenaar        endif
2565e8c4abbbSBram Moolenaar        result ..= cnt .. '_'
2566e8c4abbbSBram Moolenaar      endfor
2567e8c4abbbSBram Moolenaar      assert_equal('0_1_3_', result)
25680ad3e894SBram Moolenaar
2569cfcd011fSBram Moolenaar      var concat = ''
25700ad3e894SBram Moolenaar      for str in eval('["one", "two"]')
25710ad3e894SBram Moolenaar        concat ..= str
25720ad3e894SBram Moolenaar      endfor
25730ad3e894SBram Moolenaar      assert_equal('onetwo', concat)
257438bd8de5SBram Moolenaar
257538bd8de5SBram Moolenaar      var total = 0
257638bd8de5SBram Moolenaar      for nr in
257738bd8de5SBram Moolenaar          [1, 2, 3]
257838bd8de5SBram Moolenaar        total += nr
257938bd8de5SBram Moolenaar      endfor
258038bd8de5SBram Moolenaar      assert_equal(6, total)
258138bd8de5SBram Moolenaar
258238bd8de5SBram Moolenaar      total = 0
258338bd8de5SBram Moolenaar      for nr
258438bd8de5SBram Moolenaar        in [1, 2, 3]
258538bd8de5SBram Moolenaar        total += nr
258638bd8de5SBram Moolenaar      endfor
258738bd8de5SBram Moolenaar      assert_equal(6, total)
258838bd8de5SBram Moolenaar
258938bd8de5SBram Moolenaar      total = 0
259038bd8de5SBram Moolenaar      for nr
259138bd8de5SBram Moolenaar        in
259238bd8de5SBram Moolenaar        [1, 2, 3]
259338bd8de5SBram Moolenaar        total += nr
259438bd8de5SBram Moolenaar      endfor
259538bd8de5SBram Moolenaar      assert_equal(6, total)
2596036d0714SBram Moolenaar
2597a3589a0dSBram Moolenaar      # with type
2598a3589a0dSBram Moolenaar      total = 0
2599a3589a0dSBram Moolenaar      for n: number in [1, 2, 3]
2600a3589a0dSBram Moolenaar        total += n
2601a3589a0dSBram Moolenaar      endfor
2602a3589a0dSBram Moolenaar      assert_equal(6, total)
2603a3589a0dSBram Moolenaar
2604fe090eb5SBram Moolenaar      var chars = ''
2605fe090eb5SBram Moolenaar      for s: string in 'foobar'
2606fe090eb5SBram Moolenaar        chars ..= s
2607fe090eb5SBram Moolenaar      endfor
2608fe090eb5SBram Moolenaar      assert_equal('foobar', chars)
2609fe090eb5SBram Moolenaar
26105ede5b23SBram Moolenaar      chars = ''
26115ede5b23SBram Moolenaar      for x: string in {a: 'a', b: 'b'}->values()
26125ede5b23SBram Moolenaar        chars ..= x
26135ede5b23SBram Moolenaar      endfor
26145ede5b23SBram Moolenaar      assert_equal('ab', chars)
26155ede5b23SBram Moolenaar
2616a3589a0dSBram Moolenaar      # unpack with type
2617f2253963SBram Moolenaar      var res = ''
2618a3589a0dSBram Moolenaar      for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2619a3589a0dSBram Moolenaar        res ..= n .. s
2620a3589a0dSBram Moolenaar      endfor
2621a3589a0dSBram Moolenaar      assert_equal('1a2b', res)
2622a3589a0dSBram Moolenaar
2623444d8783SBram Moolenaar      # unpack with one var
2624444d8783SBram Moolenaar      var reslist = []
2625444d8783SBram Moolenaar      for [x] in [['aaa'], ['bbb']]
2626444d8783SBram Moolenaar        reslist->add(x)
2627444d8783SBram Moolenaar      endfor
2628444d8783SBram Moolenaar      assert_equal(['aaa', 'bbb'], reslist)
2629444d8783SBram Moolenaar
2630a3589a0dSBram Moolenaar      # loop over string
2631a3589a0dSBram Moolenaar      res = ''
263274e54fcbSBram Moolenaar      for c in 'aéc̀d'
263374e54fcbSBram Moolenaar        res ..= c .. '-'
263474e54fcbSBram Moolenaar      endfor
263574e54fcbSBram Moolenaar      assert_equal('a-é-c̀-d-', res)
263674e54fcbSBram Moolenaar
263774e54fcbSBram Moolenaar      res = ''
263874e54fcbSBram Moolenaar      for c in ''
263974e54fcbSBram Moolenaar        res ..= c .. '-'
264074e54fcbSBram Moolenaar      endfor
264174e54fcbSBram Moolenaar      assert_equal('', res)
264274e54fcbSBram Moolenaar
264374e54fcbSBram Moolenaar      res = ''
264474e54fcbSBram Moolenaar      for c in test_null_string()
264574e54fcbSBram Moolenaar        res ..= c .. '-'
264674e54fcbSBram Moolenaar      endfor
264774e54fcbSBram Moolenaar      assert_equal('', res)
2648f2253963SBram Moolenaar
2649f2253963SBram Moolenaar      var foo: list<dict<any>> = [
2650f2253963SBram Moolenaar              {a: 'Cat'}
2651f2253963SBram Moolenaar            ]
2652f2253963SBram Moolenaar      for dd in foo
2653f2253963SBram Moolenaar        dd.counter = 12
2654f2253963SBram Moolenaar      endfor
2655f2253963SBram Moolenaar      assert_equal([{a: 'Cat', counter: 12}], foo)
2656ad2d4969SBram Moolenaar
2657ad2d4969SBram Moolenaar      reslist = []
2658ad2d4969SBram Moolenaar      for _ in range(3)
2659ad2d4969SBram Moolenaar        reslist->add('x')
2660ad2d4969SBram Moolenaar      endfor
2661ad2d4969SBram Moolenaar      assert_equal(['x', 'x', 'x'], reslist)
2662f2253963SBram Moolenaar  END
2663f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2664e8c4abbbSBram Moolenaarenddef
2665e8c4abbbSBram Moolenaar
26662eb6fc3bSBram Moolenaardef Test_for_loop_with_closure()
26672eb6fc3bSBram Moolenaar  var lines =<< trim END
26682eb6fc3bSBram Moolenaar      var flist: list<func>
26692eb6fc3bSBram Moolenaar      for i in range(5)
26702eb6fc3bSBram Moolenaar        var inloop = i
26712eb6fc3bSBram Moolenaar        flist[i] = () => inloop
26722eb6fc3bSBram Moolenaar      endfor
26732eb6fc3bSBram Moolenaar      for i in range(5)
26742eb6fc3bSBram Moolenaar        assert_equal(4, flist[i]())
26752eb6fc3bSBram Moolenaar      endfor
26762eb6fc3bSBram Moolenaar  END
26772eb6fc3bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
26782eb6fc3bSBram Moolenaar
26792eb6fc3bSBram Moolenaar  lines =<< trim END
26802eb6fc3bSBram Moolenaar      var flist: list<func>
26812eb6fc3bSBram Moolenaar      for i in range(5)
26822eb6fc3bSBram Moolenaar        var inloop = i
26832eb6fc3bSBram Moolenaar        flist[i] = () => {
26842eb6fc3bSBram Moolenaar              return inloop
26852eb6fc3bSBram Moolenaar            }
26862eb6fc3bSBram Moolenaar      endfor
26872eb6fc3bSBram Moolenaar      for i in range(5)
26882eb6fc3bSBram Moolenaar        assert_equal(4, flist[i]())
26892eb6fc3bSBram Moolenaar      endfor
26902eb6fc3bSBram Moolenaar  END
26912eb6fc3bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
26922eb6fc3bSBram Moolenaarenddef
26932eb6fc3bSBram Moolenaar
2694e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2695442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:')
2696442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:')
2697442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:')
2698442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2699442b29c9SBram Moolenaar  CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2700442b29c9SBram Moolenaar  CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:')
2701d4ab807dSBram Moolenaar  CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2702822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
27032d870f8dSBram Moolenaar  delfunc! g:Func
2704675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2705675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2706675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
270774e54fcbSBram Moolenaar
270874e54fcbSBram Moolenaar  # wrong type detected at compile time
270974e54fcbSBram Moolenaar  CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
271074e54fcbSBram Moolenaar
271174e54fcbSBram Moolenaar  # wrong type detected at runtime
271274e54fcbSBram Moolenaar  g:adict = {a: 1}
271374e54fcbSBram Moolenaar  CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
271474e54fcbSBram Moolenaar  unlet g:adict
2715f6a8d420SBram Moolenaar
2716f6a8d420SBram Moolenaar  var lines =<< trim END
2717f6a8d420SBram Moolenaar      var d: list<dict<any>> = [{a: 0}]
2718f6a8d420SBram Moolenaar      for e in d
2719f6a8d420SBram Moolenaar        e = {a: 0, b: ''}
2720f6a8d420SBram Moolenaar      endfor
2721f6a8d420SBram Moolenaar  END
2722f6a8d420SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3)
2723fe090eb5SBram Moolenaar
2724fe090eb5SBram Moolenaar  lines =<< trim END
2725fe090eb5SBram Moolenaar      for nr: number in ['foo']
2726fe090eb5SBram Moolenaar      endfor
2727fe090eb5SBram Moolenaar  END
2728fe090eb5SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
2729404557e6SBram Moolenaar
2730404557e6SBram Moolenaar  lines =<< trim END
2731404557e6SBram Moolenaar      for n : number in [1, 2]
2732404557e6SBram Moolenaar        echo n
2733404557e6SBram Moolenaar      endfor
2734404557e6SBram Moolenaar  END
2735404557e6SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1059:', 1)
2736efc5db52SBram Moolenaar
2737efc5db52SBram Moolenaar  lines =<< trim END
2738efc5db52SBram Moolenaar      var d: dict<number> = {a: 1, b: 2}
2739efc5db52SBram Moolenaar      for [k: job, v: job] in d->items()
2740efc5db52SBram Moolenaar        echo k v
2741efc5db52SBram Moolenaar      endfor
2742efc5db52SBram Moolenaar  END
2743efc5db52SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2)
2744e8c4abbbSBram Moolenaarenddef
2745e8c4abbbSBram Moolenaar
2746ea87069dSBram Moolenaardef Test_for_loop_script_var()
2747ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2748ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2749ea87069dSBram Moolenaar
2750ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2751ea87069dSBram Moolenaar  var lines =<< trim END
2752ea87069dSBram Moolenaar    vim9script
2753ea87069dSBram Moolenaar    var total = 0
2754ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2755ea87069dSBram Moolenaar      total += s:var
2756ea87069dSBram Moolenaar    endfor
2757ea87069dSBram Moolenaar    assert_equal(6, total)
2758ea87069dSBram Moolenaar
2759ea87069dSBram Moolenaar    total = 0
2760ea87069dSBram Moolenaar    for var in [1, 2, 3]
2761ea87069dSBram Moolenaar      total += var
2762ea87069dSBram Moolenaar    endfor
2763ea87069dSBram Moolenaar    assert_equal(6, total)
2764ea87069dSBram Moolenaar  END
2765ea87069dSBram Moolenaarenddef
2766ea87069dSBram Moolenaar
2767792f786aSBram Moolenaardef Test_for_loop_unpack()
27684b8a0651SBram Moolenaar  var lines =<< trim END
2769792f786aSBram Moolenaar      var result = []
2770792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2771792f786aSBram Moolenaar        result->add(v1)
2772792f786aSBram Moolenaar        result->add(v2)
2773792f786aSBram Moolenaar      endfor
2774792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2775792f786aSBram Moolenaar
2776792f786aSBram Moolenaar      result = []
2777792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2778792f786aSBram Moolenaar        result->add(v1)
2779792f786aSBram Moolenaar        result->add(v2)
2780792f786aSBram Moolenaar        result->add(v3)
2781792f786aSBram Moolenaar      endfor
2782792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2783792f786aSBram Moolenaar
27844b8a0651SBram Moolenaar      result = []
27854b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
27864b8a0651SBram Moolenaar        result->add(&ts)
27874b8a0651SBram Moolenaar        result->add(&sw)
27884b8a0651SBram Moolenaar      endfor
27894b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
27904b8a0651SBram Moolenaar
27914b8a0651SBram Moolenaar      var slist: list<string>
27924b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
27934b8a0651SBram Moolenaar        slist->add($LOOPVAR)
27944b8a0651SBram Moolenaar        slist->add(@r)
27954b8a0651SBram Moolenaar        slist->add(v:errmsg)
27964b8a0651SBram Moolenaar      endfor
27974b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
27984b8a0651SBram Moolenaar
27994b8a0651SBram Moolenaar      slist = []
28004b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
28014b8a0651SBram Moolenaar        slist->add(g:globalvar)
28024b8a0651SBram Moolenaar        slist->add(b:bufvar)
28034b8a0651SBram Moolenaar        slist->add(w:winvar)
28044b8a0651SBram Moolenaar        slist->add(t:tabvar)
28054b8a0651SBram Moolenaar      endfor
28064b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2807f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
2808b777da9bSBram Moolenaar
2809b777da9bSBram Moolenaar      var res = []
2810b777da9bSBram Moolenaar      for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2811b777da9bSBram Moolenaar        res->add(n)
2812b777da9bSBram Moolenaar      endfor
2813b777da9bSBram Moolenaar      assert_equal([2, 5], res)
28144b8a0651SBram Moolenaar  END
28154b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
28164b8a0651SBram Moolenaar
28174b8a0651SBram Moolenaar  lines =<< trim END
2818792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2819792f786aSBram Moolenaar        echo v1 v2
2820792f786aSBram Moolenaar      endfor
2821792f786aSBram Moolenaar  END
2822792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2823792f786aSBram Moolenaar
2824792f786aSBram Moolenaar  lines =<< trim END
2825792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2826792f786aSBram Moolenaar        echo v1 v2
2827792f786aSBram Moolenaar      endfor
2828792f786aSBram Moolenaar  END
2829792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2830792f786aSBram Moolenaar
2831792f786aSBram Moolenaar  lines =<< trim END
2832792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2833792f786aSBram Moolenaar        echo v1
2834792f786aSBram Moolenaar      endfor
2835792f786aSBram Moolenaar  END
2836792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2837792f786aSBram Moolenaarenddef
2838792f786aSBram Moolenaar
2839c150c09eSBram Moolenaardef Test_for_loop_with_try_continue()
2840f2253963SBram Moolenaar  var lines =<< trim END
2841c150c09eSBram Moolenaar      var looped = 0
2842c150c09eSBram Moolenaar      var cleanup = 0
2843c150c09eSBram Moolenaar      for i in range(3)
2844c150c09eSBram Moolenaar        looped += 1
2845c150c09eSBram Moolenaar        try
2846c150c09eSBram Moolenaar          eval [][0]
2847c150c09eSBram Moolenaar        catch
2848c150c09eSBram Moolenaar          continue
2849c150c09eSBram Moolenaar        finally
2850c150c09eSBram Moolenaar          cleanup += 1
2851c150c09eSBram Moolenaar        endtry
2852c150c09eSBram Moolenaar      endfor
2853c150c09eSBram Moolenaar      assert_equal(3, looped)
2854c150c09eSBram Moolenaar      assert_equal(3, cleanup)
2855f2253963SBram Moolenaar  END
2856f2253963SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2857c150c09eSBram Moolenaarenddef
2858c150c09eSBram Moolenaar
2859d895b1d9Srbtnndef Test_while_skipped_block()
2860d895b1d9Srbtnn  # test skipped blocks at outside of function
2861d895b1d9Srbtnn  var lines =<< trim END
2862d895b1d9Srbtnn    var result = []
2863d895b1d9Srbtnn    var n = 0
2864d895b1d9Srbtnn    if true
2865d895b1d9Srbtnn      n = 1
2866d895b1d9Srbtnn      while n < 3
2867d895b1d9Srbtnn        result += [n]
2868d895b1d9Srbtnn        n += 1
2869d895b1d9Srbtnn      endwhile
2870d895b1d9Srbtnn    else
2871d895b1d9Srbtnn      n = 3
2872d895b1d9Srbtnn      while n < 5
2873d895b1d9Srbtnn        result += [n]
2874d895b1d9Srbtnn        n += 1
2875d895b1d9Srbtnn      endwhile
2876d895b1d9Srbtnn    endif
2877d895b1d9Srbtnn    assert_equal([1, 2], result)
2878d895b1d9Srbtnn
2879d895b1d9Srbtnn    result = []
2880d895b1d9Srbtnn    if false
2881d895b1d9Srbtnn      n = 1
2882d895b1d9Srbtnn      while n < 3
2883d895b1d9Srbtnn        result += [n]
2884d895b1d9Srbtnn        n += 1
2885d895b1d9Srbtnn      endwhile
2886d895b1d9Srbtnn    else
2887d895b1d9Srbtnn      n = 3
2888d895b1d9Srbtnn      while n < 5
2889d895b1d9Srbtnn        result += [n]
2890d895b1d9Srbtnn        n += 1
2891d895b1d9Srbtnn      endwhile
2892d895b1d9Srbtnn    endif
2893d895b1d9Srbtnn    assert_equal([3, 4], result)
2894d895b1d9Srbtnn  END
2895d895b1d9Srbtnn  CheckDefAndScriptSuccess(lines)
2896d895b1d9Srbtnn
2897d895b1d9Srbtnn  # test skipped blocks at inside of function
2898d895b1d9Srbtnn  lines =<< trim END
2899d895b1d9Srbtnn    def DefTrue()
2900d895b1d9Srbtnn      var result = []
2901d895b1d9Srbtnn      var n = 0
2902d895b1d9Srbtnn      if true
2903d895b1d9Srbtnn        n = 1
2904d895b1d9Srbtnn        while n < 3
2905d895b1d9Srbtnn          result += [n]
2906d895b1d9Srbtnn          n += 1
2907d895b1d9Srbtnn        endwhile
2908d895b1d9Srbtnn      else
2909d895b1d9Srbtnn        n = 3
2910d895b1d9Srbtnn        while n < 5
2911d895b1d9Srbtnn          result += [n]
2912d895b1d9Srbtnn          n += 1
2913d895b1d9Srbtnn        endwhile
2914d895b1d9Srbtnn      endif
2915d895b1d9Srbtnn      assert_equal([1, 2], result)
2916d895b1d9Srbtnn    enddef
2917d895b1d9Srbtnn    DefTrue()
2918d895b1d9Srbtnn
2919d895b1d9Srbtnn    def DefFalse()
2920d895b1d9Srbtnn      var result = []
2921d895b1d9Srbtnn      var n = 0
2922d895b1d9Srbtnn      if false
2923d895b1d9Srbtnn        n = 1
2924d895b1d9Srbtnn        while n < 3
2925d895b1d9Srbtnn          result += [n]
2926d895b1d9Srbtnn          n += 1
2927d895b1d9Srbtnn        endwhile
2928d895b1d9Srbtnn      else
2929d895b1d9Srbtnn        n = 3
2930d895b1d9Srbtnn        while n < 5
2931d895b1d9Srbtnn          result += [n]
2932d895b1d9Srbtnn          n += 1
2933d895b1d9Srbtnn        endwhile
2934d895b1d9Srbtnn      endif
2935d895b1d9Srbtnn      assert_equal([3, 4], result)
2936d895b1d9Srbtnn    enddef
2937d895b1d9Srbtnn    DefFalse()
2938d895b1d9Srbtnn  END
2939d895b1d9Srbtnn  CheckDefAndScriptSuccess(lines)
2940d895b1d9Srbtnnenddef
2941d895b1d9Srbtnn
2942d0df1aacSBram Moolenaardef Test_while_loop()
2943cfcd011fSBram Moolenaar  var result = ''
2944cfcd011fSBram Moolenaar  var cnt = 0
2945d0df1aacSBram Moolenaar  while cnt < 555
2946d0df1aacSBram Moolenaar    if cnt == 3
2947d0df1aacSBram Moolenaar      break
2948d0df1aacSBram Moolenaar    endif
2949d0df1aacSBram Moolenaar    cnt += 1
2950d0df1aacSBram Moolenaar    if cnt == 2
2951d0df1aacSBram Moolenaar      continue
2952d0df1aacSBram Moolenaar    endif
2953d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2954d0df1aacSBram Moolenaar  endwhile
2955d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2956dee37dc7SBram Moolenaar
2957dee37dc7SBram Moolenaar  var s = ''
29580123cc1eSBram Moolenaar  while s == 'x' # {comment}
2959dee37dc7SBram Moolenaar  endwhile
2960d0df1aacSBram Moolenaarenddef
2961d0df1aacSBram Moolenaar
2962e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2963675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2964675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2965675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2966675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2967675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2968675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2969675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
29706628b7ebSBram Moolenaar
29716628b7ebSBram Moolenaar  var lines =<< trim END
29726628b7ebSBram Moolenaar      var s = ''
29736628b7ebSBram Moolenaar      while s = ''
29746628b7ebSBram Moolenaar      endwhile
29756628b7ebSBram Moolenaar  END
29766628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2977bd5da371SBram Moolenaarenddef
2978bd5da371SBram Moolenaar
29799645e2d9SBram Moolenaardef Test_interrupt_loop()
2980cfcd011fSBram Moolenaar  var caught = false
2981cfcd011fSBram Moolenaar  var x = 0
298297acfc78SBram Moolenaar  try
29839645e2d9SBram Moolenaar    while 1
29849645e2d9SBram Moolenaar      x += 1
29859645e2d9SBram Moolenaar      if x == 100
29869645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
29879645e2d9SBram Moolenaar      endif
29889645e2d9SBram Moolenaar    endwhile
298997acfc78SBram Moolenaar  catch
299097acfc78SBram Moolenaar    caught = true
299197acfc78SBram Moolenaar    assert_equal(100, x)
299297acfc78SBram Moolenaar  endtry
299397acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
299425859dd7SBram Moolenaar  # consume the CTRL-C
299525859dd7SBram Moolenaar  getchar(0)
29969645e2d9SBram Moolenaarenddef
299720431c9dSBram Moolenaar
29984fdae999SBram Moolenaardef Test_automatic_line_continuation()
2999cfcd011fSBram Moolenaar  var mylist = [
30004fdae999SBram Moolenaar      'one',
30014fdae999SBram Moolenaar      'two',
30024fdae999SBram Moolenaar      'three',
3003f5be8cdbSBram Moolenaar      ] # comment
30044fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
30054fdae999SBram Moolenaar
3006cfcd011fSBram Moolenaar  var mydict = {
3007e0de171eSBram Moolenaar      ['one']: 1,
3008e0de171eSBram Moolenaar      ['two']: 2,
3009e0de171eSBram Moolenaar      ['three']:
30104fdae999SBram Moolenaar          3,
3011f5be8cdbSBram Moolenaar      } # comment
3012e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
3013e0de171eSBram Moolenaar  mydict = {
30142c330432SBram Moolenaar      one: 1,  # comment
30152c330432SBram Moolenaar      two:     # comment
30162c330432SBram Moolenaar           2,  # comment
30172c330432SBram Moolenaar      three: 3 # comment
30182c330432SBram Moolenaar      }
3019e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
3020e0de171eSBram Moolenaar  mydict = {
30212c330432SBram Moolenaar      one: 1,
30224fdae999SBram Moolenaar      two:
30234fdae999SBram Moolenaar           2,
30242c330432SBram Moolenaar      three: 3
30254fdae999SBram Moolenaar      }
3026e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
3027e6085c53SBram Moolenaar
3028e6085c53SBram Moolenaar  assert_equal(
3029e6085c53SBram Moolenaar        ['one', 'two', 'three'],
3030e6085c53SBram Moolenaar        split('one two three')
3031e6085c53SBram Moolenaar        )
30324fdae999SBram Moolenaarenddef
30334fdae999SBram Moolenaar
30347a092245SBram Moolenaardef Test_vim9_comment()
30357a092245SBram Moolenaar  CheckScriptSuccess([
30367a092245SBram Moolenaar      'vim9script',
30377a092245SBram Moolenaar      '# something',
303893f82cbeSBram Moolenaar      '#something',
303993f82cbeSBram Moolenaar      '#{something',
30407a092245SBram Moolenaar      ])
304193f82cbeSBram Moolenaar
304293f82cbeSBram Moolenaar  split Xfile
304393f82cbeSBram Moolenaar  CheckScriptSuccess([
304493f82cbeSBram Moolenaar      'vim9script',
304593f82cbeSBram Moolenaar      'edit #something',
304693f82cbeSBram Moolenaar      ])
304793f82cbeSBram Moolenaar  CheckScriptSuccess([
304893f82cbeSBram Moolenaar      'vim9script',
304993f82cbeSBram Moolenaar      'edit #{something',
305093f82cbeSBram Moolenaar      ])
305193f82cbeSBram Moolenaar  close
305293f82cbeSBram Moolenaar
30537a092245SBram Moolenaar  CheckScriptFailure([
30547a092245SBram Moolenaar      'vim9script',
30557a092245SBram Moolenaar      ':# something',
30567a092245SBram Moolenaar      ], 'E488:')
30577a092245SBram Moolenaar  CheckScriptFailure([
30587a092245SBram Moolenaar      '# something',
30597a092245SBram Moolenaar      ], 'E488:')
30607a092245SBram Moolenaar  CheckScriptFailure([
30617a092245SBram Moolenaar      ':# something',
30627a092245SBram Moolenaar      ], 'E488:')
30637a092245SBram Moolenaar
30644a8d9f2eSBram Moolenaar  { # block start
30654a8d9f2eSBram Moolenaar  } # block end
30664a8d9f2eSBram Moolenaar  CheckDefFailure([
30674a8d9f2eSBram Moolenaar      '{# comment',
30684a8d9f2eSBram Moolenaar      ], 'E488:')
30694a8d9f2eSBram Moolenaar  CheckDefFailure([
30704a8d9f2eSBram Moolenaar      '{',
30714a8d9f2eSBram Moolenaar      '}# comment',
30724a8d9f2eSBram Moolenaar      ], 'E488:')
30734a8d9f2eSBram Moolenaar
30744a8d9f2eSBram Moolenaar  echo "yes" # comment
30754a8d9f2eSBram Moolenaar  CheckDefFailure([
30764a8d9f2eSBram Moolenaar      'echo "yes"# comment',
30774a8d9f2eSBram Moolenaar      ], 'E488:')
30787a092245SBram Moolenaar  CheckScriptSuccess([
30797a092245SBram Moolenaar      'vim9script',
30807a092245SBram Moolenaar      'echo "yes" # something',
30817a092245SBram Moolenaar      ])
30827a092245SBram Moolenaar  CheckScriptFailure([
30837a092245SBram Moolenaar      'vim9script',
30847a092245SBram Moolenaar      'echo "yes"# something',
30857a092245SBram Moolenaar      ], 'E121:')
30867a092245SBram Moolenaar  CheckScriptFailure([
30877a092245SBram Moolenaar      'vim9script',
30887a092245SBram Moolenaar      'echo# something',
3089f8103f27SBram Moolenaar      ], 'E1144:')
30907a092245SBram Moolenaar  CheckScriptFailure([
30917a092245SBram Moolenaar      'echo "yes" # something',
30927a092245SBram Moolenaar      ], 'E121:')
30937a092245SBram Moolenaar
30944a8d9f2eSBram Moolenaar  exe "echo" # comment
30954a8d9f2eSBram Moolenaar  CheckDefFailure([
30964a8d9f2eSBram Moolenaar      'exe "echo"# comment',
30974a8d9f2eSBram Moolenaar      ], 'E488:')
30984a8d9f2eSBram Moolenaar  CheckScriptSuccess([
30994a8d9f2eSBram Moolenaar      'vim9script',
31004a8d9f2eSBram Moolenaar      'exe "echo" # something',
31014a8d9f2eSBram Moolenaar      ])
31024a8d9f2eSBram Moolenaar  CheckScriptFailure([
31034a8d9f2eSBram Moolenaar      'vim9script',
31044a8d9f2eSBram Moolenaar      'exe "echo"# something',
31054a8d9f2eSBram Moolenaar      ], 'E121:')
31064a8d9f2eSBram Moolenaar  CheckScriptFailure([
31074a8d9f2eSBram Moolenaar      'vim9script',
31084a8d9f2eSBram Moolenaar      'exe# something',
3109f8103f27SBram Moolenaar      ], 'E1144:')
31104a8d9f2eSBram Moolenaar  CheckScriptFailure([
31114a8d9f2eSBram Moolenaar      'exe "echo" # something',
31124a8d9f2eSBram Moolenaar      ], 'E121:')
31134a8d9f2eSBram Moolenaar
31147a092245SBram Moolenaar  CheckDefFailure([
31157a092245SBram Moolenaar      'try# comment',
31167a092245SBram Moolenaar      '  echo "yes"',
31177a092245SBram Moolenaar      'catch',
31187a092245SBram Moolenaar      'endtry',
3119f8103f27SBram Moolenaar      ], 'E1144:')
31202c5ed4e3SBram Moolenaar  CheckScriptFailure([
31212c5ed4e3SBram Moolenaar      'vim9script',
31222c5ed4e3SBram Moolenaar      'try# comment',
31232c5ed4e3SBram Moolenaar      'echo "yes"',
3124f8103f27SBram Moolenaar      ], 'E1144:')
31257a092245SBram Moolenaar  CheckDefFailure([
31267a092245SBram Moolenaar      'try',
3127a72cfb80SBram Moolenaar      '  throw#comment',
3128a72cfb80SBram Moolenaar      'catch',
3129a72cfb80SBram Moolenaar      'endtry',
3130f8103f27SBram Moolenaar      ], 'E1144:')
3131a72cfb80SBram Moolenaar  CheckDefFailure([
3132a72cfb80SBram Moolenaar      'try',
3133a72cfb80SBram Moolenaar      '  throw "yes"#comment',
3134a72cfb80SBram Moolenaar      'catch',
3135a72cfb80SBram Moolenaar      'endtry',
3136a72cfb80SBram Moolenaar      ], 'E488:')
3137a72cfb80SBram Moolenaar  CheckDefFailure([
3138a72cfb80SBram Moolenaar      'try',
31397a092245SBram Moolenaar      '  echo "yes"',
31407a092245SBram Moolenaar      'catch# comment',
31417a092245SBram Moolenaar      'endtry',
3142f8103f27SBram Moolenaar      ], 'E1144:')
31432c5ed4e3SBram Moolenaar  CheckScriptFailure([
31442c5ed4e3SBram Moolenaar      'vim9script',
31452c5ed4e3SBram Moolenaar      'try',
31462c5ed4e3SBram Moolenaar      '  echo "yes"',
31472c5ed4e3SBram Moolenaar      'catch# comment',
31482c5ed4e3SBram Moolenaar      'endtry',
3149f8103f27SBram Moolenaar      ], 'E1144:')
31502c5ed4e3SBram Moolenaar  CheckDefFailure([
31512c5ed4e3SBram Moolenaar      'try',
31522c5ed4e3SBram Moolenaar      '  echo "yes"',
31532c5ed4e3SBram Moolenaar      'catch /pat/# comment',
31542c5ed4e3SBram Moolenaar      'endtry',
31552c5ed4e3SBram Moolenaar      ], 'E488:')
31567a092245SBram Moolenaar  CheckDefFailure([
31577a092245SBram Moolenaar      'try',
31587a092245SBram Moolenaar      'echo "yes"',
31597a092245SBram Moolenaar      'catch',
31607a092245SBram Moolenaar      'endtry# comment',
3161f8103f27SBram Moolenaar      ], 'E1144:')
31622c5ed4e3SBram Moolenaar  CheckScriptFailure([
31632c5ed4e3SBram Moolenaar      'vim9script',
31642c5ed4e3SBram Moolenaar      'try',
31652c5ed4e3SBram Moolenaar      '  echo "yes"',
31662c5ed4e3SBram Moolenaar      'catch',
31672c5ed4e3SBram Moolenaar      'endtry# comment',
3168f8103f27SBram Moolenaar      ], 'E1144:')
31692c5ed4e3SBram Moolenaar
31702c5ed4e3SBram Moolenaar  CheckScriptSuccess([
31712c5ed4e3SBram Moolenaar      'vim9script',
31722c5ed4e3SBram Moolenaar      'hi # comment',
31732c5ed4e3SBram Moolenaar      ])
31742c5ed4e3SBram Moolenaar  CheckScriptFailure([
31752c5ed4e3SBram Moolenaar      'vim9script',
31762c5ed4e3SBram Moolenaar      'hi# comment',
3177f8103f27SBram Moolenaar      ], 'E1144:')
31781966c248SBram Moolenaar  CheckScriptSuccess([
31791966c248SBram Moolenaar      'vim9script',
31801966c248SBram Moolenaar      'hi Search # comment',
31811966c248SBram Moolenaar      ])
31821966c248SBram Moolenaar  CheckScriptFailure([
31831966c248SBram Moolenaar      'vim9script',
31841966c248SBram Moolenaar      'hi Search# comment',
31851966c248SBram Moolenaar      ], 'E416:')
31861966c248SBram Moolenaar  CheckScriptSuccess([
31871966c248SBram Moolenaar      'vim9script',
31881966c248SBram Moolenaar      'hi link This Search # comment',
31891966c248SBram Moolenaar      ])
31901966c248SBram Moolenaar  CheckScriptFailure([
31911966c248SBram Moolenaar      'vim9script',
31921966c248SBram Moolenaar      'hi link This That# comment',
31931966c248SBram Moolenaar      ], 'E413:')
31941966c248SBram Moolenaar  CheckScriptSuccess([
31951966c248SBram Moolenaar      'vim9script',
31961966c248SBram Moolenaar      'hi clear This # comment',
31971966c248SBram Moolenaar      'hi clear # comment',
31981966c248SBram Moolenaar      ])
3199f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
3200f5be8cdbSBram Moolenaar  # hi clear This# comment',
32011966c248SBram Moolenaar  CheckScriptFailure([
32021966c248SBram Moolenaar      'vim9script',
32031966c248SBram Moolenaar      'hi clear# comment',
32041966c248SBram Moolenaar      ], 'E416:')
32051966c248SBram Moolenaar
32061966c248SBram Moolenaar  CheckScriptSuccess([
32071966c248SBram Moolenaar      'vim9script',
32081966c248SBram Moolenaar      'hi Group term=bold',
32091966c248SBram Moolenaar      'match Group /todo/ # comment',
32101966c248SBram Moolenaar      ])
32111966c248SBram Moolenaar  CheckScriptFailure([
32121966c248SBram Moolenaar      'vim9script',
32131966c248SBram Moolenaar      'hi Group term=bold',
32141966c248SBram Moolenaar      'match Group /todo/# comment',
32151966c248SBram Moolenaar      ], 'E488:')
32161966c248SBram Moolenaar  CheckScriptSuccess([
32171966c248SBram Moolenaar      'vim9script',
32181966c248SBram Moolenaar      'match # comment',
32191966c248SBram Moolenaar      ])
32201966c248SBram Moolenaar  CheckScriptFailure([
32211966c248SBram Moolenaar      'vim9script',
32221966c248SBram Moolenaar      'match# comment',
3223f8103f27SBram Moolenaar      ], 'E1144:')
32241966c248SBram Moolenaar  CheckScriptSuccess([
32251966c248SBram Moolenaar      'vim9script',
32261966c248SBram Moolenaar      'match none # comment',
32271966c248SBram Moolenaar      ])
32281966c248SBram Moolenaar  CheckScriptFailure([
32291966c248SBram Moolenaar      'vim9script',
32301966c248SBram Moolenaar      'match none# comment',
32311966c248SBram Moolenaar      ], 'E475:')
32321966c248SBram Moolenaar
32331966c248SBram Moolenaar  CheckScriptSuccess([
32341966c248SBram Moolenaar      'vim9script',
32351966c248SBram Moolenaar      'menutrans clear # comment',
32361966c248SBram Moolenaar      ])
32371966c248SBram Moolenaar  CheckScriptFailure([
32381966c248SBram Moolenaar      'vim9script',
32391966c248SBram Moolenaar      'menutrans clear# comment text',
32401966c248SBram Moolenaar      ], 'E474:')
32411966c248SBram Moolenaar
32421966c248SBram Moolenaar  CheckScriptSuccess([
32431966c248SBram Moolenaar      'vim9script',
32441966c248SBram Moolenaar      'syntax clear # comment',
32451966c248SBram Moolenaar      ])
32461966c248SBram Moolenaar  CheckScriptFailure([
32471966c248SBram Moolenaar      'vim9script',
32481966c248SBram Moolenaar      'syntax clear# comment text',
32491966c248SBram Moolenaar      ], 'E28:')
32501966c248SBram Moolenaar  CheckScriptSuccess([
32511966c248SBram Moolenaar      'vim9script',
32521966c248SBram Moolenaar      'syntax keyword Word some',
32531966c248SBram Moolenaar      'syntax clear Word # comment',
32541966c248SBram Moolenaar      ])
32551966c248SBram Moolenaar  CheckScriptFailure([
32561966c248SBram Moolenaar      'vim9script',
32571966c248SBram Moolenaar      'syntax keyword Word some',
32581966c248SBram Moolenaar      'syntax clear Word# comment text',
32591966c248SBram Moolenaar      ], 'E28:')
32601966c248SBram Moolenaar
32611966c248SBram Moolenaar  CheckScriptSuccess([
32621966c248SBram Moolenaar      'vim9script',
32631966c248SBram Moolenaar      'syntax list # comment',
32641966c248SBram Moolenaar      ])
32651966c248SBram Moolenaar  CheckScriptFailure([
32661966c248SBram Moolenaar      'vim9script',
32671966c248SBram Moolenaar      'syntax list# comment text',
32681966c248SBram Moolenaar      ], 'E28:')
32691966c248SBram Moolenaar
32701966c248SBram Moolenaar  CheckScriptSuccess([
32711966c248SBram Moolenaar      'vim9script',
32721966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
32731966c248SBram Moolenaar      ])
32741966c248SBram Moolenaar  CheckScriptFailure([
32751966c248SBram Moolenaar      'vim9script',
32761966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
32771966c248SBram Moolenaar      ], 'E475:')
32781966c248SBram Moolenaar
32791966c248SBram Moolenaar  CheckScriptSuccess([
32801966c248SBram Moolenaar      'vim9script',
32811966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
32821966c248SBram Moolenaar      ])
32831966c248SBram Moolenaar  CheckScriptFailure([
32841966c248SBram Moolenaar      'vim9script',
32851966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
32861966c248SBram Moolenaar      ], 'E789:')
32871966c248SBram Moolenaar
32881966c248SBram Moolenaar  CheckScriptSuccess([
32891966c248SBram Moolenaar      'vim9script',
32901966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
32911966c248SBram Moolenaar      ])
32921966c248SBram Moolenaar  CheckScriptFailure([
32931966c248SBram Moolenaar      'vim9script',
32941966c248SBram Moolenaar      'syntax match Word /pat/# comment',
32951966c248SBram Moolenaar      ], 'E402:')
32961966c248SBram Moolenaar
32971966c248SBram Moolenaar  CheckScriptSuccess([
32981966c248SBram Moolenaar      'vim9script',
32991966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
33001966c248SBram Moolenaar      ])
33011966c248SBram Moolenaar  CheckScriptFailure([
33021966c248SBram Moolenaar      'vim9script',
33031966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
33041966c248SBram Moolenaar      ], 'E475:')
33051966c248SBram Moolenaar  CheckScriptFailure([
33061966c248SBram Moolenaar      'vim9script',
33071966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
33081966c248SBram Moolenaar      ], 'E406:')
33091966c248SBram Moolenaar  CheckScriptFailure([
33101966c248SBram Moolenaar      'vim9script',
33111966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
33121966c248SBram Moolenaar      ], 'E475:')
33131966c248SBram Moolenaar
33141966c248SBram Moolenaar  CheckScriptSuccess([
33151966c248SBram Moolenaar      'vim9script',
33161966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
33171966c248SBram Moolenaar      ])
33181966c248SBram Moolenaar  CheckScriptFailure([
33191966c248SBram Moolenaar      'vim9script',
33201966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
3321d032f34aSBram Moolenaar      ], 'E402:')
33221966c248SBram Moolenaar
33231966c248SBram Moolenaar  CheckScriptSuccess([
33241966c248SBram Moolenaar      'vim9script',
33251966c248SBram Moolenaar      'syntax sync # comment',
33261966c248SBram Moolenaar      ])
33271966c248SBram Moolenaar  CheckScriptFailure([
33281966c248SBram Moolenaar      'vim9script',
33291966c248SBram Moolenaar      'syntax sync# comment',
33301966c248SBram Moolenaar      ], 'E404:')
33311966c248SBram Moolenaar  CheckScriptSuccess([
33321966c248SBram Moolenaar      'vim9script',
33331966c248SBram Moolenaar      'syntax sync ccomment # comment',
33341966c248SBram Moolenaar      ])
33351966c248SBram Moolenaar  CheckScriptFailure([
33361966c248SBram Moolenaar      'vim9script',
33371966c248SBram Moolenaar      'syntax sync ccomment# comment',
33381966c248SBram Moolenaar      ], 'E404:')
33391966c248SBram Moolenaar
33401966c248SBram Moolenaar  CheckScriptSuccess([
33411966c248SBram Moolenaar      'vim9script',
33421966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
33431966c248SBram Moolenaar      ])
33441966c248SBram Moolenaar  CheckScriptFailure([
33451966c248SBram Moolenaar      'vim9script',
33461966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
33471966c248SBram Moolenaar      ], 'E475:')
3348a72cfb80SBram Moolenaar
3349a72cfb80SBram Moolenaar  CheckScriptSuccess([
3350a72cfb80SBram Moolenaar      'vim9script',
3351a72cfb80SBram Moolenaar      'command Echo echo # comment',
3352a72cfb80SBram Moolenaar      'command Echo # comment',
33532d870f8dSBram Moolenaar      'delcommand Echo',
3354a72cfb80SBram Moolenaar      ])
3355a72cfb80SBram Moolenaar  CheckScriptFailure([
3356a72cfb80SBram Moolenaar      'vim9script',
3357a72cfb80SBram Moolenaar      'command Echo echo# comment',
3358a72cfb80SBram Moolenaar      'Echo',
3359f8103f27SBram Moolenaar      ], 'E1144:')
33602d870f8dSBram Moolenaar  delcommand Echo
336170249ee8SBram Moolenaar
336270249ee8SBram Moolenaar  var curdir = getcwd()
336370249ee8SBram Moolenaar  CheckScriptSuccess([
336470249ee8SBram Moolenaar      'command Echo cd " comment',
336570249ee8SBram Moolenaar      'Echo',
336670249ee8SBram Moolenaar      'delcommand Echo',
336770249ee8SBram Moolenaar      ])
336870249ee8SBram Moolenaar  CheckScriptSuccess([
3369090728adSBram Moolenaar      'vim9script',
337070249ee8SBram Moolenaar      'command Echo cd # comment',
337170249ee8SBram Moolenaar      'Echo',
337270249ee8SBram Moolenaar      'delcommand Echo',
337370249ee8SBram Moolenaar      ])
337470249ee8SBram Moolenaar  CheckScriptFailure([
337570249ee8SBram Moolenaar      'vim9script',
337670249ee8SBram Moolenaar      'command Echo cd " comment',
337770249ee8SBram Moolenaar      'Echo',
337870249ee8SBram Moolenaar      ], 'E344:')
337970249ee8SBram Moolenaar  delcommand Echo
338070249ee8SBram Moolenaar  chdir(curdir)
338170249ee8SBram Moolenaar
3382a72cfb80SBram Moolenaar  CheckScriptFailure([
3383a72cfb80SBram Moolenaar      'vim9script',
3384a72cfb80SBram Moolenaar      'command Echo# comment',
3385a72cfb80SBram Moolenaar      ], 'E182:')
3386a72cfb80SBram Moolenaar  CheckScriptFailure([
3387a72cfb80SBram Moolenaar      'vim9script',
3388a72cfb80SBram Moolenaar      'command Echo echo',
3389a72cfb80SBram Moolenaar      'command Echo# comment',
3390a72cfb80SBram Moolenaar      ], 'E182:')
33912d870f8dSBram Moolenaar  delcommand Echo
3392a72cfb80SBram Moolenaar
3393a72cfb80SBram Moolenaar  CheckScriptSuccess([
3394a72cfb80SBram Moolenaar      'vim9script',
3395a72cfb80SBram Moolenaar      'function # comment',
3396a72cfb80SBram Moolenaar      ])
3397a72cfb80SBram Moolenaar  CheckScriptFailure([
3398a72cfb80SBram Moolenaar      'vim9script',
33999898107fSBram Moolenaar      'function " comment',
34009898107fSBram Moolenaar      ], 'E129:')
34019898107fSBram Moolenaar  CheckScriptFailure([
34029898107fSBram Moolenaar      'vim9script',
3403a72cfb80SBram Moolenaar      'function# comment',
3404f8103f27SBram Moolenaar      ], 'E1144:')
3405a72cfb80SBram Moolenaar  CheckScriptSuccess([
3406a72cfb80SBram Moolenaar      'vim9script',
3407a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
3408a72cfb80SBram Moolenaar      ])
3409a72cfb80SBram Moolenaar  CheckScriptFailure([
3410a72cfb80SBram Moolenaar      'vim9script',
3411a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
3412a72cfb80SBram Moolenaar      ], 'E488:')
3413a72cfb80SBram Moolenaar
3414a72cfb80SBram Moolenaar  CheckScriptSuccess([
3415a72cfb80SBram Moolenaar      'vim9script',
34164c17ad94SBram Moolenaar      'func g:DeleteMeA()',
3417a72cfb80SBram Moolenaar      'endfunc',
34184c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
3419a72cfb80SBram Moolenaar      ])
3420a72cfb80SBram Moolenaar  CheckScriptFailure([
3421a72cfb80SBram Moolenaar      'vim9script',
34224c17ad94SBram Moolenaar      'func g:DeleteMeB()',
3423a72cfb80SBram Moolenaar      'endfunc',
34244c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
3425a72cfb80SBram Moolenaar      ], 'E488:')
3426a72cfb80SBram Moolenaar
3427a72cfb80SBram Moolenaar  CheckScriptSuccess([
3428a72cfb80SBram Moolenaar      'vim9script',
3429a72cfb80SBram Moolenaar      'call execute("ls") # comment',
3430a72cfb80SBram Moolenaar      ])
3431a72cfb80SBram Moolenaar  CheckScriptFailure([
3432a72cfb80SBram Moolenaar      'vim9script',
3433a72cfb80SBram Moolenaar      'call execute("ls")# comment',
3434a72cfb80SBram Moolenaar      ], 'E488:')
3435e7e4838fSBram Moolenaar
3436e7e4838fSBram Moolenaar  CheckScriptFailure([
3437e7e4838fSBram Moolenaar      'def Test() " comment',
3438e7e4838fSBram Moolenaar      'enddef',
3439e7e4838fSBram Moolenaar      ], 'E488:')
3440e7e4838fSBram Moolenaar  CheckScriptFailure([
3441e7e4838fSBram Moolenaar      'vim9script',
3442e7e4838fSBram Moolenaar      'def Test() " comment',
3443e7e4838fSBram Moolenaar      'enddef',
3444e7e4838fSBram Moolenaar      ], 'E488:')
3445e7e4838fSBram Moolenaar
3446e7e4838fSBram Moolenaar  CheckScriptSuccess([
3447e7e4838fSBram Moolenaar      'func Test() " comment',
3448e7e4838fSBram Moolenaar      'endfunc',
34492d870f8dSBram Moolenaar      'delfunc Test',
3450e7e4838fSBram Moolenaar      ])
34519898107fSBram Moolenaar  CheckScriptSuccess([
3452e7e4838fSBram Moolenaar      'vim9script',
3453e7e4838fSBram Moolenaar      'func Test() " comment',
3454e7e4838fSBram Moolenaar      'endfunc',
34559898107fSBram Moolenaar      ])
3456e7e4838fSBram Moolenaar
3457e7e4838fSBram Moolenaar  CheckScriptSuccess([
3458e7e4838fSBram Moolenaar      'def Test() # comment',
3459e7e4838fSBram Moolenaar      'enddef',
3460e7e4838fSBram Moolenaar      ])
3461e7e4838fSBram Moolenaar  CheckScriptFailure([
3462e7e4838fSBram Moolenaar      'func Test() # comment',
3463e7e4838fSBram Moolenaar      'endfunc',
3464e7e4838fSBram Moolenaar      ], 'E488:')
34650f37e356SBram Moolenaar
34660f37e356SBram Moolenaar  var lines =<< trim END
34670f37e356SBram Moolenaar      vim9script
34680f37e356SBram Moolenaar      syn region Text
34690f37e356SBram Moolenaar      \ start='foo'
34700f37e356SBram Moolenaar      #\ comment
34710f37e356SBram Moolenaar      \ end='bar'
34725072b47aSBram Moolenaar      syn region Text start='foo'
34735072b47aSBram Moolenaar      #\ comment
34745072b47aSBram Moolenaar      \ end='bar'
34750f37e356SBram Moolenaar  END
34760f37e356SBram Moolenaar  CheckScriptSuccess(lines)
34770f37e356SBram Moolenaar
34780f37e356SBram Moolenaar  lines =<< trim END
34790f37e356SBram Moolenaar      vim9script
34800f37e356SBram Moolenaar      syn region Text
34810f37e356SBram Moolenaar      \ start='foo'
34820f37e356SBram Moolenaar      "\ comment
34830f37e356SBram Moolenaar      \ end='bar'
34840f37e356SBram Moolenaar  END
34850f37e356SBram Moolenaar  CheckScriptFailure(lines, 'E399:')
34862c5ed4e3SBram Moolenaarenddef
34872c5ed4e3SBram Moolenaar
34882c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
34892c5ed4e3SBram Moolenaar  CheckCanRunGui
34902c5ed4e3SBram Moolenaar
34912c5ed4e3SBram Moolenaar  CheckScriptFailure([
34922c5ed4e3SBram Moolenaar      'vim9script',
34932c5ed4e3SBram Moolenaar      'gui#comment'
3494f8103f27SBram Moolenaar      ], 'E1144:')
34952c5ed4e3SBram Moolenaar  CheckScriptFailure([
34962c5ed4e3SBram Moolenaar      'vim9script',
34972c5ed4e3SBram Moolenaar      'gui -f#comment'
3498*b8bd2e6eSBram Moolenaar      ], 'E194:')
34997a092245SBram Moolenaarenddef
35007a092245SBram Moolenaar
3501a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
35026797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
35036797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3504a26b9700SBram Moolenaar
3505a26b9700SBram Moolenaar  edit test.vim
3506a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3507a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3508a26b9700SBram Moolenaar
3509a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3510a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3511a26b9700SBram Moolenaar
3512a26b9700SBram Moolenaar  g:entered = 0
3513a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3514a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3515a26b9700SBram Moolenaar
3516a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3517a26b9700SBram Moolenaar
3518a26b9700SBram Moolenaar  au! TabEnter
3519a26b9700SBram Moolenaar  unlet g:entered
3520d72c1bf0SBram Moolenaar
3521d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3522d72c1bf0SBram Moolenaar      'vim9script',
35236797966dSBram Moolenaar      'g:var = 123',
3524e55b1c09SBram Moolenaar      'b:var = 456',
3525e55b1c09SBram Moolenaar      'w:var = 777',
3526e55b1c09SBram Moolenaar      't:var = 888',
3527d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3528d72c1bf0SBram Moolenaar      ])
3529d72c1bf0SBram Moolenaar
3530d72c1bf0SBram Moolenaar  CheckScriptFailure([
3531d72c1bf0SBram Moolenaar      'vim9script',
3532cfcd011fSBram Moolenaar      'let var = 123',
3533cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3534cfcd011fSBram Moolenaar
3535cfcd011fSBram Moolenaar  CheckScriptFailure([
3536cfcd011fSBram Moolenaar      'vim9script',
3537cfcd011fSBram Moolenaar      'var g:var = 123',
3538e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3539e55b1c09SBram Moolenaar
3540e55b1c09SBram Moolenaar  CheckScriptFailure([
3541e55b1c09SBram Moolenaar      'vim9script',
3542cfcd011fSBram Moolenaar      'var b:var = 123',
3543e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3544e55b1c09SBram Moolenaar
3545e55b1c09SBram Moolenaar  CheckScriptFailure([
3546e55b1c09SBram Moolenaar      'vim9script',
3547cfcd011fSBram Moolenaar      'var w:var = 123',
3548e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3549e55b1c09SBram Moolenaar
3550e55b1c09SBram Moolenaar  CheckScriptFailure([
3551e55b1c09SBram Moolenaar      'vim9script',
3552cfcd011fSBram Moolenaar      'var t:var = 123',
3553e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3554e55b1c09SBram Moolenaar
3555e55b1c09SBram Moolenaar  CheckScriptFailure([
3556e55b1c09SBram Moolenaar      'vim9script',
3557cfcd011fSBram Moolenaar      'var v:version = 123',
3558e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3559e55b1c09SBram Moolenaar
3560e55b1c09SBram Moolenaar  CheckScriptFailure([
3561e55b1c09SBram Moolenaar      'vim9script',
3562cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3563e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
35646797966dSBram Moolenaar
35656797966dSBram Moolenaar  CheckScriptFailure([
35666797966dSBram Moolenaar      'vim9script',
35676797966dSBram Moolenaar      'g:var = 123',
356832e35117SBram Moolenaar      'unlet g:var# comment1',
3569d72c1bf0SBram Moolenaar      ], 'E108:')
3570d72c1bf0SBram Moolenaar
3571d72c1bf0SBram Moolenaar  CheckScriptFailure([
3572d72c1bf0SBram Moolenaar      'let g:var = 123',
3573d72c1bf0SBram Moolenaar      'unlet g:var # something',
3574d72c1bf0SBram Moolenaar      ], 'E488:')
3575faac4104SBram Moolenaar
3576faac4104SBram Moolenaar  CheckScriptSuccess([
3577faac4104SBram Moolenaar      'vim9script',
357832e35117SBram Moolenaar      'if 1 # comment2',
3579faac4104SBram Moolenaar      '  echo "yes"',
3580faac4104SBram Moolenaar      'elseif 2 #comment',
3581faac4104SBram Moolenaar      '  echo "no"',
3582faac4104SBram Moolenaar      'endif',
3583faac4104SBram Moolenaar      ])
3584faac4104SBram Moolenaar
3585faac4104SBram Moolenaar  CheckScriptFailure([
3586faac4104SBram Moolenaar      'vim9script',
358732e35117SBram Moolenaar      'if 1# comment3',
3588faac4104SBram Moolenaar      '  echo "yes"',
3589faac4104SBram Moolenaar      'endif',
3590fae55a9cSBram Moolenaar      ], 'E488:')
3591faac4104SBram Moolenaar
3592faac4104SBram Moolenaar  CheckScriptFailure([
3593faac4104SBram Moolenaar      'vim9script',
359432e35117SBram Moolenaar      'if 0 # comment4',
3595faac4104SBram Moolenaar      '  echo "yes"',
3596faac4104SBram Moolenaar      'elseif 2#comment',
3597faac4104SBram Moolenaar      '  echo "no"',
3598faac4104SBram Moolenaar      'endif',
3599fae55a9cSBram Moolenaar      ], 'E488:')
3600faac4104SBram Moolenaar
3601faac4104SBram Moolenaar  CheckScriptSuccess([
3602faac4104SBram Moolenaar      'vim9script',
3603cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3604faac4104SBram Moolenaar      ])
3605faac4104SBram Moolenaar
3606faac4104SBram Moolenaar  CheckScriptFailure([
3607faac4104SBram Moolenaar      'vim9script',
3608cfcd011fSBram Moolenaar      'var v = 1# comment6',
3609fae55a9cSBram Moolenaar      ], 'E488:')
3610faac4104SBram Moolenaar
3611faac4104SBram Moolenaar  CheckScriptSuccess([
3612faac4104SBram Moolenaar      'vim9script',
3613faac4104SBram Moolenaar      'new'
3614d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3615df069eecSBram Moolenaar      ':$',
3616faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3617faac4104SBram Moolenaar      'bwipe!',
3618faac4104SBram Moolenaar      ])
3619faac4104SBram Moolenaar
3620f5be8cdbSBram Moolenaar  CheckScriptFailure([
3621f5be8cdbSBram Moolenaar      'vim9script',
3622f5be8cdbSBram Moolenaar      'new'
3623d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3624f5be8cdbSBram Moolenaar      ':$',
3625f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3626f5be8cdbSBram Moolenaar      'bwipe!',
3627f5be8cdbSBram Moolenaar      ], 'E488:')
3628f5be8cdbSBram Moolenaar
3629f5be8cdbSBram Moolenaar  CheckScriptFailure([
3630f5be8cdbSBram Moolenaar      'vim9script',
3631f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3632f5be8cdbSBram Moolenaar      ], 'E477:')
3633a26b9700SBram Moolenaarenddef
3634a26b9700SBram Moolenaar
36357e5bd91dSBram Moolenaardef Test_finish()
3636cfcd011fSBram Moolenaar  var lines =<< trim END
36377e5bd91dSBram Moolenaar    vim9script
36386797966dSBram Moolenaar    g:res = 'one'
36397e5bd91dSBram Moolenaar    if v:false | finish | endif
36406797966dSBram Moolenaar    g:res = 'two'
36417e5bd91dSBram Moolenaar    finish
36426797966dSBram Moolenaar    g:res = 'three'
36437e5bd91dSBram Moolenaar  END
36447e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
36457e5bd91dSBram Moolenaar  source Xfinished
36467e5bd91dSBram Moolenaar  assert_equal('two', g:res)
36477e5bd91dSBram Moolenaar
36487e5bd91dSBram Moolenaar  unlet g:res
36497e5bd91dSBram Moolenaar  delete('Xfinished')
36507e5bd91dSBram Moolenaarenddef
36517e5bd91dSBram Moolenaar
3652a5d0077eSBram Moolenaardef Test_forward_declaration()
3653cfcd011fSBram Moolenaar  var lines =<< trim END
3654a5d0077eSBram Moolenaar    vim9script
3655a5d0077eSBram Moolenaar    def GetValue(): string
3656a5d0077eSBram Moolenaar      return theVal
3657a5d0077eSBram Moolenaar    enddef
3658cfcd011fSBram Moolenaar    var theVal = 'something'
3659822ba247SBram Moolenaar    g:initVal = GetValue()
3660a5d0077eSBram Moolenaar    theVal = 'else'
3661a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3662a5d0077eSBram Moolenaar  END
3663a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3664a5d0077eSBram Moolenaar  source Xforward
3665a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3666a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3667a5d0077eSBram Moolenaar
3668a5d0077eSBram Moolenaar  unlet g:initVal
3669a5d0077eSBram Moolenaar  unlet g:laterVal
3670a5d0077eSBram Moolenaar  delete('Xforward')
3671a5d0077eSBram Moolenaarenddef
3672a5d0077eSBram Moolenaar
36739721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3674a6294955SBram Moolenaar  var vim9_lines =<< trim END
3675a6294955SBram Moolenaar    vim9script
3676a6294955SBram Moolenaar    var local = 'local'
3677a6294955SBram Moolenaar    g:global = 'global'
3678a6294955SBram Moolenaar    export var exported = 'exported'
3679a6294955SBram Moolenaar    export def GetText(): string
3680a6294955SBram Moolenaar       return 'text'
3681a6294955SBram Moolenaar    enddef
3682a6294955SBram Moolenaar  END
3683a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3684a6294955SBram Moolenaar
3685cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
36869721fb4eSBram Moolenaar    source Xvim9_script.vim
36879721fb4eSBram Moolenaar
36889721fb4eSBram Moolenaar    call assert_false(exists('local'))
36899721fb4eSBram Moolenaar    call assert_false(exists('exported'))
36909721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
36919721fb4eSBram Moolenaar    call assert_equal('global', global)
36929721fb4eSBram Moolenaar    call assert_equal('global', g:global)
36939721fb4eSBram Moolenaar
36949721fb4eSBram Moolenaar    " imported variable becomes script-local
36959721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
36969721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
36979721fb4eSBram Moolenaar    call assert_false(exists('exported'))
36989721fb4eSBram Moolenaar
36999721fb4eSBram Moolenaar    " imported function becomes script-local
37009721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
37019721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
37029721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
37039721fb4eSBram Moolenaar  END
37049721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
37059721fb4eSBram Moolenaar
37069721fb4eSBram Moolenaar  source Xlegacy_script.vim
37079721fb4eSBram Moolenaar  assert_equal('global', g:global)
3708f5be8cdbSBram Moolenaar  unlet g:global
37099721fb4eSBram Moolenaar
37109721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
37119721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
37129721fb4eSBram Moolenaarenddef
3713a5d0077eSBram Moolenaar
3714e535db86SBram Moolenaardef Test_declare_script_in_func()
3715e535db86SBram Moolenaar  var lines =<< trim END
3716e535db86SBram Moolenaar      vim9script
3717e535db86SBram Moolenaar      func Declare()
3718e535db86SBram Moolenaar        let s:local = 123
3719e535db86SBram Moolenaar      endfunc
3720e535db86SBram Moolenaar      Declare()
3721e535db86SBram Moolenaar      assert_equal(123, local)
3722e535db86SBram Moolenaar
3723e535db86SBram Moolenaar      var error: string
3724e535db86SBram Moolenaar      try
3725e535db86SBram Moolenaar        local = 'asdf'
3726e535db86SBram Moolenaar      catch
3727e535db86SBram Moolenaar        error = v:exception
3728e535db86SBram Moolenaar      endtry
3729e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3730e535db86SBram Moolenaar
3731e535db86SBram Moolenaar      lockvar local
3732e535db86SBram Moolenaar      try
3733e535db86SBram Moolenaar        local = 999
3734e535db86SBram Moolenaar      catch
3735e535db86SBram Moolenaar        error = v:exception
3736e535db86SBram Moolenaar      endtry
3737e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3738e535db86SBram Moolenaar  END
3739e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3740e535db86SBram Moolenaarenddef
3741e535db86SBram Moolenaar
3742e535db86SBram Moolenaar
37437d699701SBram Moolenaarfunc Test_vim9script_not_global()
37447d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
37457d699701SBram Moolenaar  let vim9lines =<< trim END
37467d699701SBram Moolenaar    vim9script
3747cfcd011fSBram Moolenaar    var name = 'local'
37487d699701SBram Moolenaar    func TheFunc()
37497d699701SBram Moolenaar      echo 'local'
37507d699701SBram Moolenaar    endfunc
37517d699701SBram Moolenaar    def DefFunc()
37527d699701SBram Moolenaar      echo 'local'
37537d699701SBram Moolenaar    enddef
37547d699701SBram Moolenaar  END
37557d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
37567d699701SBram Moolenaar  source Xvim9script.vim
37577d699701SBram Moolenaar  try
37587d699701SBram Moolenaar    echo g:var
37597d699701SBram Moolenaar    assert_report('did not fail')
37607d699701SBram Moolenaar  catch /E121:/
37617d699701SBram Moolenaar    " caught
37627d699701SBram Moolenaar  endtry
37637d699701SBram Moolenaar  try
37647d699701SBram Moolenaar    call TheFunc()
37657d699701SBram Moolenaar    assert_report('did not fail')
37667d699701SBram Moolenaar  catch /E117:/
37677d699701SBram Moolenaar    " caught
37687d699701SBram Moolenaar  endtry
37697d699701SBram Moolenaar  try
37707d699701SBram Moolenaar    call DefFunc()
37717d699701SBram Moolenaar    assert_report('did not fail')
37727d699701SBram Moolenaar  catch /E117:/
37737d699701SBram Moolenaar    " caught
37747d699701SBram Moolenaar  endtry
37757d699701SBram Moolenaar
377625859dd7SBram Moolenaar  call delete('Xvim9script.vim')
37777d699701SBram Moolenaarendfunc
37787d699701SBram Moolenaar
3779eeb27bfeSBram Moolenaardef Test_vim9_copen()
3780eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3781eeb27bfeSBram Moolenaar  copen
3782eeb27bfeSBram Moolenaar  quit
3783eeb27bfeSBram Moolenaarenddef
3784eeb27bfeSBram Moolenaar
378503290b84SBram Moolenaar" test using an auto-loaded function and variable
37862d6b20d6SBram Moolenaardef Test_vim9_autoload()
3787cfcd011fSBram Moolenaar  var lines =<< trim END
37882d6b20d6SBram Moolenaar     vim9script
378903290b84SBram Moolenaar     def some#gettest(): string
379003290b84SBram Moolenaar       return 'test'
379103290b84SBram Moolenaar     enddef
379203290b84SBram Moolenaar     g:some#name = 'name'
3793227c58a4SBram Moolenaar     g:some#dict = {key: 'value'}
3794e3ffcd99SBram Moolenaar
3795e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3796e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3797e3ffcd99SBram Moolenaar     enddef
379803290b84SBram Moolenaar  END
379903290b84SBram Moolenaar
380003290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
380103290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
380203290b84SBram Moolenaar  var save_rtp = &rtp
380303290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
380403290b84SBram Moolenaar
380503290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
380603290b84SBram Moolenaar  assert_equal('name', g:some#name)
3807227c58a4SBram Moolenaar  assert_equal('value', g:some#dict.key)
380803290b84SBram Moolenaar  g:some#other = 'other'
380903290b84SBram Moolenaar  assert_equal('other', g:some#other)
381003290b84SBram Moolenaar
3811e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3812e3ffcd99SBram Moolenaar
381317f700acSBram Moolenaar  # upper case script name works
381417f700acSBram Moolenaar  lines =<< trim END
381517f700acSBram Moolenaar     vim9script
381617f700acSBram Moolenaar     def Other#getOther(): string
381717f700acSBram Moolenaar       return 'other'
381817f700acSBram Moolenaar     enddef
381917f700acSBram Moolenaar  END
382017f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
382117f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
382217f700acSBram Moolenaar
382303290b84SBram Moolenaar  delete('Xdir', 'rf')
382403290b84SBram Moolenaar  &rtp = save_rtp
382503290b84SBram Moolenaarenddef
382603290b84SBram Moolenaar
382703290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
382803290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
382903290b84SBram Moolenaar  var lines =<< trim END
383003290b84SBram Moolenaar     vim9script
38312d6b20d6SBram Moolenaar     def foo#test()
38322d6b20d6SBram Moolenaar         echomsg getreg('"')
38332d6b20d6SBram Moolenaar     enddef
38342d6b20d6SBram Moolenaar  END
38352d6b20d6SBram Moolenaar
38362d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
38372d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3838cfcd011fSBram Moolenaar  var save_rtp = &rtp
38392d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
38402d6b20d6SBram Moolenaar  augroup test
38412d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
38422d6b20d6SBram Moolenaar  augroup END
38432d6b20d6SBram Moolenaar
38442d6b20d6SBram Moolenaar  normal Y
38452d6b20d6SBram Moolenaar
38462d6b20d6SBram Moolenaar  augroup test
38472d6b20d6SBram Moolenaar    autocmd!
38482d6b20d6SBram Moolenaar  augroup END
38492d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
38502d6b20d6SBram Moolenaar  &rtp = save_rtp
38512d6b20d6SBram Moolenaarenddef
38522d6b20d6SBram Moolenaar
385377e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
385477e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3855cfcd011fSBram Moolenaar  var lines =<< trim END
385677e5dcc3SBram Moolenaar      vim9script
385777e5dcc3SBram Moolenaar      def crash#func()
385877e5dcc3SBram Moolenaar          try
385977e5dcc3SBram Moolenaar              for x in List()
386077e5dcc3SBram Moolenaar              endfor
386177e5dcc3SBram Moolenaar          catch
386277e5dcc3SBram Moolenaar          endtry
386377e5dcc3SBram Moolenaar          g:ok = true
386477e5dcc3SBram Moolenaar      enddef
386577e5dcc3SBram Moolenaar      fu List()
386677e5dcc3SBram Moolenaar          invalid
386777e5dcc3SBram Moolenaar      endfu
386877e5dcc3SBram Moolenaar      try
386948e11c10SBram Moolenaar          alsoinvalid
387077e5dcc3SBram Moolenaar      catch /wontmatch/
387177e5dcc3SBram Moolenaar      endtry
387277e5dcc3SBram Moolenaar  END
387377e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
387477e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
387577e5dcc3SBram Moolenaar
387677e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
387777e5dcc3SBram Moolenaar  lines =<< trim END
387877e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
387977e5dcc3SBram Moolenaar    call crash#func()
388077e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
38819c4f5520SBram Moolenaar    qall!
388277e5dcc3SBram Moolenaar  END
388377e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
388477e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
388577e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
388677e5dcc3SBram Moolenaar
388777e5dcc3SBram Moolenaar  delete('Xdidit')
388877e5dcc3SBram Moolenaar  delete('Xscript')
388977e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
389003290b84SBram Moolenaar
389103290b84SBram Moolenaar  lines =<< trim END
389203290b84SBram Moolenaar    vim9script
389303290b84SBram Moolenaar    var foo#bar = 'asdf'
389403290b84SBram Moolenaar  END
389503290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
389677e5dcc3SBram Moolenaarenddef
389777e5dcc3SBram Moolenaar
389881e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
389981e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
390081e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3901cfcd011fSBram Moolenaar  var lines =<< trim END
390281e17fbeSBram Moolenaar    let s:counter = 1
390381e17fbeSBram Moolenaar    def s:Func()
390481e17fbeSBram Moolenaar      au! CursorHold
390581e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
390681e17fbeSBram Moolenaar    enddef
390781e17fbeSBram Moolenaar    call s:Func()
390881e17fbeSBram Moolenaar    doau CursorHold
390981e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
391081e17fbeSBram Moolenaar    au! CursorHold
391181e17fbeSBram Moolenaar  END
391281e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
391381e17fbeSBram Moolenaarenddef
391481e17fbeSBram Moolenaar
3915b5841b99SBram Moolenaardef Test_error_in_autoload_script()
3916b5841b99SBram Moolenaar  var save_rtp = &rtp
3917b5841b99SBram Moolenaar  var dir = getcwd() .. '/Xruntime'
3918b5841b99SBram Moolenaar  &rtp = dir
3919b5841b99SBram Moolenaar  mkdir(dir .. '/autoload', 'p')
3920b5841b99SBram Moolenaar
3921b5841b99SBram Moolenaar  var lines =<< trim END
3922b5841b99SBram Moolenaar      vim9script noclear
3923b5841b99SBram Moolenaar      def script#autoloaded()
3924b5841b99SBram Moolenaar      enddef
3925b5841b99SBram Moolenaar      def Broken()
3926b5841b99SBram Moolenaar        var x: any = ''
3927b5841b99SBram Moolenaar        eval x != 0
3928b5841b99SBram Moolenaar      enddef
3929b5841b99SBram Moolenaar      Broken()
3930b5841b99SBram Moolenaar  END
3931b5841b99SBram Moolenaar  writefile(lines, dir .. '/autoload/script.vim')
3932b5841b99SBram Moolenaar
3933b5841b99SBram Moolenaar  lines =<< trim END
3934b5841b99SBram Moolenaar      vim9script
3935b5841b99SBram Moolenaar      def CallAutoloaded()
3936b5841b99SBram Moolenaar        script#autoloaded()
3937b5841b99SBram Moolenaar      enddef
3938b5841b99SBram Moolenaar
3939b5841b99SBram Moolenaar      function Legacy()
3940b5841b99SBram Moolenaar        try
3941b5841b99SBram Moolenaar          call s:CallAutoloaded()
3942b5841b99SBram Moolenaar        catch
3943b5841b99SBram Moolenaar          call assert_match('E1030: Using a String as a Number', v:exception)
3944b5841b99SBram Moolenaar        endtry
3945b5841b99SBram Moolenaar      endfunction
3946b5841b99SBram Moolenaar
3947b5841b99SBram Moolenaar      Legacy()
3948b5841b99SBram Moolenaar  END
3949b5841b99SBram Moolenaar  CheckScriptSuccess(lines)
3950b5841b99SBram Moolenaar
3951b5841b99SBram Moolenaar  &rtp = save_rtp
3952b5841b99SBram Moolenaar  delete(dir, 'rf')
3953b5841b99SBram Moolenaarenddef
3954b5841b99SBram Moolenaar
39553896a105SBram Moolenaardef Test_cmdline_win()
39563896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
39573896a105SBram Moolenaar  # the command line window.
39583896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3959cfcd011fSBram Moolenaar  var export_lines =<< trim END
39603896a105SBram Moolenaar    vim9script
3961cfcd011fSBram Moolenaar    export var That = 'yes'
39623896a105SBram Moolenaar  END
39633896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3964cfcd011fSBram Moolenaar  var import_lines =<< trim END
39653896a105SBram Moolenaar    vim9script
39663896a105SBram Moolenaar    import That from './Xexport.vim'
39673896a105SBram Moolenaar  END
39683896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3969cfcd011fSBram Moolenaar  var save_rtp = &rtp
39703896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
39713896a105SBram Moolenaar  syntax on
39723896a105SBram Moolenaar  augroup CmdWin
39733896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
39743896a105SBram Moolenaar  augroup END
39753896a105SBram Moolenaar  # this will open and also close the cmdline window
39763896a105SBram Moolenaar  feedkeys('q:', 'xt')
39773896a105SBram Moolenaar  assert_equal('yes', g:got_there)
39783896a105SBram Moolenaar
39793896a105SBram Moolenaar  augroup CmdWin
39803896a105SBram Moolenaar    au!
39813896a105SBram Moolenaar  augroup END
39823896a105SBram Moolenaar  &rtp = save_rtp
39833896a105SBram Moolenaar  delete('rtp', 'rf')
39843896a105SBram Moolenaarenddef
39853896a105SBram Moolenaar
3986e3d4685fSBram Moolenaardef Test_invalid_sid()
3987e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
398825859dd7SBram Moolenaar
39899c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3990d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3991e3d4685fSBram Moolenaar  endif
3992e3d4685fSBram Moolenaar  delete('Xdidit')
3993e3d4685fSBram Moolenaarenddef
3994e3d4685fSBram Moolenaar
39959ec7026fSBram Moolenaardef Test_restoring_cpo()
39969ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
39979ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
39989ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
39999ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
40009ec7026fSBram Moolenaar  endif
40019ec7026fSBram Moolenaar  delete('Xsourced')
40029ec7026fSBram Moolenaar  delete('Xclose')
4003090728adSBram Moolenaar  delete('Xdone')
40040123cc1eSBram Moolenaar
40050123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
40060123cc1eSBram Moolenaar  set cpo=aABceFsMny>
40070123cc1eSBram Moolenaar  edit XanotherScript
40080123cc1eSBram Moolenaar  so %
40090123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
40100123cc1eSBram Moolenaar  :1del
40110123cc1eSBram Moolenaar  w
40120123cc1eSBram Moolenaar  so %
40130123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
40140123cc1eSBram Moolenaar
40150123cc1eSBram Moolenaar  delete('XanotherScript')
40160123cc1eSBram Moolenaar  set cpo&vim
40179ec7026fSBram Moolenaarenddef
40189ec7026fSBram Moolenaar
4019ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
4020ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
402137294bd6SBram Moolenaar  CheckScreendump
4022ffb7dcdbSBram Moolenaar  CheckFeature timers
402337294bd6SBram Moolenaar
4024ffb7dcdbSBram Moolenaar  let lines =<< trim END
402537294bd6SBram Moolenaar    vim9script
402637294bd6SBram Moolenaar    def script#func()
402737294bd6SBram Moolenaar    enddef
402837294bd6SBram Moolenaar  END
4029ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
4030ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
403137294bd6SBram Moolenaar
4032ffb7dcdbSBram Moolenaar  let lines =<< trim END
403337294bd6SBram Moolenaar      vim9script
403437294bd6SBram Moolenaar      set cpo+=M
403537294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
4036767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
403737294bd6SBram Moolenaar      setline(1, 'some text')
403837294bd6SBram Moolenaar  END
4039ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
4040ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
4041ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
4042ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
404337294bd6SBram Moolenaar
4044ffb7dcdbSBram Moolenaar  " clean up
4045ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
4046ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
4047ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
4048ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
4049ffb7dcdbSBram Moolenaarendfunc
405037294bd6SBram Moolenaar
40519ec7026fSBram Moolenaar
4052f0afd9e1SBram Moolenaardef Test_unset_any_variable()
4053cfcd011fSBram Moolenaar  var lines =<< trim END
4054cfcd011fSBram Moolenaar    var name: any
4055cfcd011fSBram Moolenaar    assert_equal(0, name)
4056f0afd9e1SBram Moolenaar  END
4057f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
4058f0afd9e1SBram Moolenaarenddef
4059f0afd9e1SBram Moolenaar
40607e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
406158dbef33SBram Moolenaar  CheckRunVimInTerminal
406258dbef33SBram Moolenaar
40637e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
40647e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
40657e9210eaSBram Moolenaarendfunc
40667e9210eaSBram Moolenaar
40677e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
40689c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
4069cfcd011fSBram Moolenaar  var lines =<< trim END
40709c4f5520SBram Moolenaar    func CheckAndQuit()
40719c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
40729c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
40739c4f5520SBram Moolenaar    endfunc
40749c4f5520SBram Moolenaar  END
40759c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
40769c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
4077e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
40789c4f5520SBram Moolenaar  # define Afunc() on the command line
40799c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
40809c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
40812949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
40829c4f5520SBram Moolenaar
40839c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
40849c4f5520SBram Moolenaar  delete('XcallFunc')
40859c4f5520SBram Moolenaar  delete('Xdidcmd')
40869c4f5520SBram Moolenaarenddef
40879c4f5520SBram Moolenaar
4088fcdc5d83SBram Moolenaardef Test_script_var_scope()
4089fcdc5d83SBram Moolenaar  var lines =<< trim END
4090fcdc5d83SBram Moolenaar      vim9script
4091fcdc5d83SBram Moolenaar      if true
4092fcdc5d83SBram Moolenaar        if true
4093fcdc5d83SBram Moolenaar          var one = 'one'
4094fcdc5d83SBram Moolenaar          echo one
4095fcdc5d83SBram Moolenaar        endif
4096fcdc5d83SBram Moolenaar        echo one
4097fcdc5d83SBram Moolenaar      endif
4098fcdc5d83SBram Moolenaar  END
4099fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
4100fcdc5d83SBram Moolenaar
4101fcdc5d83SBram Moolenaar  lines =<< trim END
4102fcdc5d83SBram Moolenaar      vim9script
4103fcdc5d83SBram Moolenaar      if true
4104fcdc5d83SBram Moolenaar        if false
4105fcdc5d83SBram Moolenaar          var one = 'one'
4106fcdc5d83SBram Moolenaar          echo one
4107fcdc5d83SBram Moolenaar        else
4108fcdc5d83SBram Moolenaar          var one = 'one'
4109fcdc5d83SBram Moolenaar          echo one
4110fcdc5d83SBram Moolenaar        endif
4111fcdc5d83SBram Moolenaar        echo one
4112fcdc5d83SBram Moolenaar      endif
4113fcdc5d83SBram Moolenaar  END
4114fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
4115fcdc5d83SBram Moolenaar
4116fcdc5d83SBram Moolenaar  lines =<< trim END
4117fcdc5d83SBram Moolenaar      vim9script
4118fcdc5d83SBram Moolenaar      while true
4119fcdc5d83SBram Moolenaar        var one = 'one'
4120fcdc5d83SBram Moolenaar        echo one
4121fcdc5d83SBram Moolenaar        break
4122fcdc5d83SBram Moolenaar      endwhile
4123fcdc5d83SBram Moolenaar      echo one
4124fcdc5d83SBram Moolenaar  END
4125fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
4126fcdc5d83SBram Moolenaar
4127fcdc5d83SBram Moolenaar  lines =<< trim END
4128fcdc5d83SBram Moolenaar      vim9script
4129fcdc5d83SBram Moolenaar      for i in range(1)
4130fcdc5d83SBram Moolenaar        var one = 'one'
4131fcdc5d83SBram Moolenaar        echo one
4132fcdc5d83SBram Moolenaar      endfor
4133fcdc5d83SBram Moolenaar      echo one
4134fcdc5d83SBram Moolenaar  END
4135fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
41369becdf2bSBram Moolenaar
41379becdf2bSBram Moolenaar  lines =<< trim END
41389becdf2bSBram Moolenaar      vim9script
41399becdf2bSBram Moolenaar      {
41409becdf2bSBram Moolenaar        var one = 'one'
41419becdf2bSBram Moolenaar        assert_equal('one', one)
41429becdf2bSBram Moolenaar      }
41439becdf2bSBram Moolenaar      assert_false(exists('one'))
41449becdf2bSBram Moolenaar      assert_false(exists('s:one'))
41459becdf2bSBram Moolenaar  END
41469becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
41479becdf2bSBram Moolenaar
41489becdf2bSBram Moolenaar  lines =<< trim END
41499becdf2bSBram Moolenaar      vim9script
41509becdf2bSBram Moolenaar      {
41519becdf2bSBram Moolenaar        var one = 'one'
41529becdf2bSBram Moolenaar        echo one
41539becdf2bSBram Moolenaar      }
41549becdf2bSBram Moolenaar      echo one
41559becdf2bSBram Moolenaar  END
41569becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
4157fcdc5d83SBram Moolenaarenddef
4158fcdc5d83SBram Moolenaar
4159352134bbSBram Moolenaardef Test_catch_exception_in_callback()
4160352134bbSBram Moolenaar  var lines =<< trim END
4161352134bbSBram Moolenaar    vim9script
41622a38908bSBram Moolenaar    def Callback(...l: list<any>)
4163352134bbSBram Moolenaar      try
4164352134bbSBram Moolenaar        var x: string
4165352134bbSBram Moolenaar        var y: string
4166352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
4167352134bbSBram Moolenaar        [x, y] = ['']
4168352134bbSBram Moolenaar      catch
4169352134bbSBram Moolenaar        g:caught = 'yes'
4170352134bbSBram Moolenaar      endtry
4171352134bbSBram Moolenaar    enddef
4172e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
4173352134bbSBram Moolenaar    feedkeys("\r", 'xt')
4174352134bbSBram Moolenaar  END
4175352134bbSBram Moolenaar  CheckScriptSuccess(lines)
4176352134bbSBram Moolenaar
4177352134bbSBram Moolenaar  unlet g:caught
4178352134bbSBram Moolenaarenddef
4179352134bbSBram Moolenaar
4180631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
4181631e8f93SBram Moolenaar  if !has('unix') || !has('job')
4182631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
4183631e8f93SBram Moolenaar  endif
4184631e8f93SBram Moolenaar  var lines =<< trim END
4185631e8f93SBram Moolenaar      vim9script
4186631e8f93SBram Moolenaar      var source: list<number>
41872a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
4188631e8f93SBram Moolenaar          eval [][0]
4189631e8f93SBram Moolenaar      enddef
41902a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
4191631e8f93SBram Moolenaar          sleep 1m
4192631e8f93SBram Moolenaar          source += l
4193631e8f93SBram Moolenaar      enddef
4194e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
41956f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
41966f17a3f0SBram Moolenaar        sleep 10m
41976f17a3f0SBram Moolenaar      endwhile
4198206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
4199fe95b94fSBram Moolenaar      sleep 200m
4200631e8f93SBram Moolenaar  END
4201631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
4202631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
4203631e8f93SBram Moolenaar  delete('Xdef')
4204631e8f93SBram Moolenaarenddef
4205631e8f93SBram Moolenaar
42064324d87aSBram Moolenaardef InvokeNormal()
42074324d87aSBram Moolenaar  exe "norm! :m+1\r"
42084324d87aSBram Moolenaarenddef
42094324d87aSBram Moolenaar
42104324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
42114324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
42124324d87aSBram Moolenaar  new
42134324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
42144324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
42154324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
42164324d87aSBram Moolenaar  xunmap <F3>
4217b5b9480eSBram Moolenaarenddef
4218b5b9480eSBram Moolenaar
4219b5b9480eSBram Moolenaardef Test_white_space_after_command()
4220b5b9480eSBram Moolenaar  var lines =<< trim END
4221b5b9480eSBram Moolenaar    exit_cb: Func})
4222b5b9480eSBram Moolenaar  END
4223b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
4224f8103f27SBram Moolenaar
4225f8103f27SBram Moolenaar  lines =<< trim END
4226f8103f27SBram Moolenaar    e#
4227f8103f27SBram Moolenaar  END
4228f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
42294324d87aSBram Moolenaarenddef
42304324d87aSBram Moolenaar
42314aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
42324aab88d9SBram Moolenaar  var lines =<< trim END
42334aab88d9SBram Moolenaar      vim9script
42344aab88d9SBram Moolenaar      if exists('g:guard')
42354aab88d9SBram Moolenaar        finish
42364aab88d9SBram Moolenaar      endif
42374aab88d9SBram Moolenaar      g:guard = 1
42384aab88d9SBram Moolenaar      var name = 'thename'
42394aab88d9SBram Moolenaar      def g:GetName(): string
42404aab88d9SBram Moolenaar        return name
42414aab88d9SBram Moolenaar      enddef
42424aab88d9SBram Moolenaar      def g:SetName(arg: string)
42434aab88d9SBram Moolenaar        name = arg
42444aab88d9SBram Moolenaar      enddef
42454aab88d9SBram Moolenaar  END
42464aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
42474aab88d9SBram Moolenaar  so XscriptTwice.vim
42484aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
42494aab88d9SBram Moolenaar  g:SetName('newname')
42504aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
42514aab88d9SBram Moolenaar  so XscriptTwice.vim
42524aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
42534aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
42544aab88d9SBram Moolenaar
42554aab88d9SBram Moolenaar  delfunc g:GetName
42564aab88d9SBram Moolenaar  delfunc g:SetName
42574aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
42584aab88d9SBram Moolenaar  unlet g:guard
42594aab88d9SBram Moolenaarenddef
42604aab88d9SBram Moolenaar
42614aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
42624aab88d9SBram Moolenaar  var exportlines =<< trim END
42634aab88d9SBram Moolenaar      vim9script
42644aab88d9SBram Moolenaar      if exists('g:guard')
42654aab88d9SBram Moolenaar        finish
42664aab88d9SBram Moolenaar      endif
42674aab88d9SBram Moolenaar      g:guard = 1
42684aab88d9SBram Moolenaar      export var name = 'someName'
42694aab88d9SBram Moolenaar  END
42704aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
42714aab88d9SBram Moolenaar
42724aab88d9SBram Moolenaar  var lines =<< trim END
42734aab88d9SBram Moolenaar      vim9script
42744aab88d9SBram Moolenaar      import name from './XexportScript.vim'
42754aab88d9SBram Moolenaar      def g:GetName(): string
42764aab88d9SBram Moolenaar        return name
42774aab88d9SBram Moolenaar      enddef
42784aab88d9SBram Moolenaar  END
42794aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
42804aab88d9SBram Moolenaar  so XscriptImport.vim
42814aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
42824aab88d9SBram Moolenaar
42834aab88d9SBram Moolenaar  so XexportScript.vim
42844aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
42854aab88d9SBram Moolenaar
42864aab88d9SBram Moolenaar  delfunc g:GetName
42874aab88d9SBram Moolenaar  delete('XexportScript.vim')
42884aab88d9SBram Moolenaar  delete('XscriptImport.vim')
42894aab88d9SBram Moolenaar  unlet g:guard
42904aab88d9SBram Moolenaarenddef
42914aab88d9SBram Moolenaar
429210b9421fSBram Moolenaardef Test_unsupported_commands()
429310b9421fSBram Moolenaar  var lines =<< trim END
429410b9421fSBram Moolenaar      ka
429510b9421fSBram Moolenaar  END
42967d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
42977d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
429810b9421fSBram Moolenaar
429910b9421fSBram Moolenaar  lines =<< trim END
4300ada1d870SBram Moolenaar      :1ka
4301ada1d870SBram Moolenaar  END
43027d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
43037d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
4304ada1d870SBram Moolenaar
4305ada1d870SBram Moolenaar  lines =<< trim END
430610b9421fSBram Moolenaar    t
430710b9421fSBram Moolenaar  END
430810b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
430910b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
431010b9421fSBram Moolenaar
431110b9421fSBram Moolenaar  lines =<< trim END
431210b9421fSBram Moolenaar    x
431310b9421fSBram Moolenaar  END
431410b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
431510b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
431610b9421fSBram Moolenaar
431710b9421fSBram Moolenaar  lines =<< trim END
431810b9421fSBram Moolenaar    xit
431910b9421fSBram Moolenaar  END
432010b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
432110b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
432210b9421fSBram Moolenaarenddef
432310b9421fSBram Moolenaar
4324c70fe460SBram Moolenaardef Test_mapping_line_number()
4325c70fe460SBram Moolenaar  var lines =<< trim END
4326c70fe460SBram Moolenaar      vim9script
4327c70fe460SBram Moolenaar      def g:FuncA()
4328c70fe460SBram Moolenaar          # Some comment
4329c70fe460SBram Moolenaar          FuncB(0)
4330c70fe460SBram Moolenaar      enddef
4331c70fe460SBram Moolenaar          # Some comment
4332c70fe460SBram Moolenaar      def FuncB(
4333c70fe460SBram Moolenaar          # Some comment
4334c70fe460SBram Moolenaar          n: number
4335c70fe460SBram Moolenaar      )
4336c70fe460SBram Moolenaar          exe 'nno '
4337c70fe460SBram Moolenaar              # Some comment
4338c70fe460SBram Moolenaar              .. '<F3> a'
4339c70fe460SBram Moolenaar              .. 'b'
4340c70fe460SBram Moolenaar              .. 'c'
4341c70fe460SBram Moolenaar      enddef
4342c70fe460SBram Moolenaar  END
4343c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
4344c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
4345c70fe460SBram Moolenaar  assert_match('No mapping found', res)
4346c70fe460SBram Moolenaar
4347c70fe460SBram Moolenaar  g:FuncA()
4348c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
4349c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4350c70fe460SBram Moolenaar
4351c70fe460SBram Moolenaar  nunmap <F3>
4352c70fe460SBram Moolenaar  delfunc g:FuncA
4353c70fe460SBram Moolenaarenddef
4354c70fe460SBram Moolenaar
4355deb108baSBram Moolenaardef Test_option_set()
4356deb108baSBram Moolenaar  # legacy script allows for white space
4357deb108baSBram Moolenaar  var lines =<< trim END
4358deb108baSBram Moolenaar      set foldlevel  =11
4359deb108baSBram Moolenaar      call assert_equal(11, &foldlevel)
4360deb108baSBram Moolenaar  END
4361deb108baSBram Moolenaar  CheckScriptSuccess(lines)
4362deb108baSBram Moolenaar
4363deb108baSBram Moolenaar  set foldlevel
4364deb108baSBram Moolenaar  set foldlevel=12
4365deb108baSBram Moolenaar  assert_equal(12, &foldlevel)
4366deb108baSBram Moolenaar  set foldlevel+=2
4367deb108baSBram Moolenaar  assert_equal(14, &foldlevel)
4368deb108baSBram Moolenaar  set foldlevel-=3
4369deb108baSBram Moolenaar  assert_equal(11, &foldlevel)
4370deb108baSBram Moolenaar
4371deb108baSBram Moolenaar  lines =<< trim END
4372deb108baSBram Moolenaar      set foldlevel =1
4373deb108baSBram Moolenaar  END
4374deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
4375deb108baSBram Moolenaar
4376deb108baSBram Moolenaar  lines =<< trim END
4377deb108baSBram Moolenaar      set foldlevel +=1
4378deb108baSBram Moolenaar  END
4379deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
4380deb108baSBram Moolenaar
4381deb108baSBram Moolenaar  lines =<< trim END
4382deb108baSBram Moolenaar      set foldlevel ^=1
4383deb108baSBram Moolenaar  END
4384deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
4385deb108baSBram Moolenaar
4386deb108baSBram Moolenaar  lines =<< trim END
4387deb108baSBram Moolenaar      set foldlevel -=1
4388deb108baSBram Moolenaar  END
4389deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
4390deb108baSBram Moolenaar
4391deb108baSBram Moolenaar  set foldlevel&
4392deb108baSBram Moolenaarenddef
4393deb108baSBram Moolenaar
4394208f0b48SBram Moolenaardef Test_option_modifier()
43951594f313SBram Moolenaar  # legacy script allows for white space
4396208f0b48SBram Moolenaar  var lines =<< trim END
4397208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
4398208f0b48SBram Moolenaar      call assert_equal(1, &hlsearch)
4399208f0b48SBram Moolenaar  END
4400208f0b48SBram Moolenaar  CheckScriptSuccess(lines)
4401208f0b48SBram Moolenaar
44021594f313SBram Moolenaar  set hlsearch
44031594f313SBram Moolenaar  set hlsearch!
44041594f313SBram Moolenaar  assert_equal(false, &hlsearch)
44051594f313SBram Moolenaar
44061594f313SBram Moolenaar  set hlsearch
4407208f0b48SBram Moolenaar  set hlsearch&
44081594f313SBram Moolenaar  assert_equal(false, &hlsearch)
4409208f0b48SBram Moolenaar
4410208f0b48SBram Moolenaar  lines =<< trim END
44111594f313SBram Moolenaar      set hlsearch &
4412208f0b48SBram Moolenaar  END
44131594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
44141594f313SBram Moolenaar
44151594f313SBram Moolenaar  lines =<< trim END
44161594f313SBram Moolenaar      set hlsearch   !
44171594f313SBram Moolenaar  END
44181594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
44191594f313SBram Moolenaar
44201594f313SBram Moolenaar  set hlsearch&
4421208f0b48SBram Moolenaarenddef
4422208f0b48SBram Moolenaar
4423c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail
4424c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number()
4425c03fe66aSBram Moolenaar  var lines =<< trim END
4426c03fe66aSBram Moolenaar      echoerr 'some'
4427c03fe66aSBram Moolenaar         .. ' error'
4428c03fe66aSBram Moolenaar         .. ' continued'
4429c03fe66aSBram Moolenaar  END
4430c03fe66aSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
4431c03fe66aSBram Moolenaarenddef
4432c03fe66aSBram Moolenaar
4433648594eaSBram Moolenaardef ProfiledWithLambda()
4434d9162550SBram Moolenaar  var n = 3
4435d9162550SBram Moolenaar  echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4436d9162550SBram Moolenaarenddef
4437d9162550SBram Moolenaar
4438648594eaSBram Moolenaardef ProfiledNested()
4439648594eaSBram Moolenaar  var x = 0
4440648594eaSBram Moolenaar  def Nested(): any
4441648594eaSBram Moolenaar      return x
4442648594eaSBram Moolenaar  enddef
4443648594eaSBram Moolenaar  Nested()
4444648594eaSBram Moolenaarenddef
4445648594eaSBram Moolenaar
4446ffcfddc7SBram Moolenaardef ProfiledNestedProfiled()
4447ffcfddc7SBram Moolenaar  var x = 0
4448ffcfddc7SBram Moolenaar  def Nested(): any
4449ffcfddc7SBram Moolenaar      return x
4450ffcfddc7SBram Moolenaar  enddef
4451ffcfddc7SBram Moolenaar  Nested()
4452ffcfddc7SBram Moolenaarenddef
4453ffcfddc7SBram Moolenaar
4454d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists.
4455d9162550SBram Moolenaar" This only tests that it works, not the profiling output.
4456d9162550SBram Moolenaardef Test_xx_profile_with_lambda()
44574ece152aSBram Moolenaar  CheckFeature profile
44584ece152aSBram Moolenaar
4459d9162550SBram Moolenaar  profile start Xprofile.log
4460648594eaSBram Moolenaar  profile func ProfiledWithLambda
4461648594eaSBram Moolenaar  ProfiledWithLambda()
4462ffcfddc7SBram Moolenaar
4463648594eaSBram Moolenaar  profile func ProfiledNested
4464648594eaSBram Moolenaar  ProfiledNested()
4465ffcfddc7SBram Moolenaar
4466ffcfddc7SBram Moolenaar  # Also profile the nested function.  Use a different function, although the
4467ffcfddc7SBram Moolenaar  # contents is the same, to make sure it was not already compiled.
4468ffcfddc7SBram Moolenaar  profile func *
4469ffcfddc7SBram Moolenaar  ProfiledNestedProfiled()
4470ffcfddc7SBram Moolenaar
4471ffcfddc7SBram Moolenaar  profdel func *
4472ffcfddc7SBram Moolenaar  profile pause
4473d9162550SBram Moolenaarenddef
4474d9162550SBram Moolenaar
4475585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
4476585fea7bSBram Moolenaardef Test_substitute_cmd()
4477585fea7bSBram Moolenaar  new
4478585fea7bSBram Moolenaar  setline(1, 'something')
4479585fea7bSBram Moolenaar  :substitute(some(other(
4480585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
4481585fea7bSBram Moolenaar  bwipe!
4482585fea7bSBram Moolenaar
4483f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
4484cfcd011fSBram Moolenaar  var lines =<< trim END
4485585fea7bSBram Moolenaar    vim9script
4486585fea7bSBram Moolenaar    new
4487585fea7bSBram Moolenaar    setline(1, 'something')
4488585fea7bSBram Moolenaar    :substitute(some(other(
4489585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
4490585fea7bSBram Moolenaar    bwipe!
4491585fea7bSBram Moolenaar  END
4492585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
4493585fea7bSBram Moolenaar  source Xvim9lines
4494585fea7bSBram Moolenaar
4495585fea7bSBram Moolenaar  delete('Xvim9lines')
4496585fea7bSBram Moolenaarenddef
4497585fea7bSBram Moolenaar
44988a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
4499