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
472f0b9f43cSBram Moolenaar  catch /E39:/
473f0b9f43cSBram Moolenaar    n = 233
474f0b9f43cSBram Moolenaar  endtry
475f0b9f43cSBram Moolenaar  assert_equal(233, n)
476f0b9f43cSBram Moolenaar
477f0b9f43cSBram Moolenaar  try
478f0b9f43cSBram Moolenaar    n = +g:astring
479f0b9f43cSBram Moolenaar  catch /E1030:/
480f0b9f43cSBram Moolenaar    n = 244
481f0b9f43cSBram Moolenaar  endtry
482f0b9f43cSBram Moolenaar  assert_equal(244, n)
483f0b9f43cSBram Moolenaar
484f0b9f43cSBram Moolenaar  try
485f0b9f43cSBram Moolenaar    n = +g:alist
486f0b9f43cSBram Moolenaar  catch /E745:/
487f0b9f43cSBram Moolenaar    n = 255
488f0b9f43cSBram Moolenaar  endtry
489f0b9f43cSBram Moolenaar  assert_equal(255, n)
490f0b9f43cSBram Moolenaar
491cfcd011fSBram Moolenaar  var nd: dict<any>
492f0b9f43cSBram Moolenaar  try
4932e5910bfSBram Moolenaar    nd = {[g:alist]: 1}
4942e5910bfSBram Moolenaar  catch /E1105:/
495f0b9f43cSBram Moolenaar    n = 266
496f0b9f43cSBram Moolenaar  endtry
497f0b9f43cSBram Moolenaar  assert_equal(266, n)
498f0b9f43cSBram Moolenaar
499f0b9f43cSBram Moolenaar  try
500f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
501f0b9f43cSBram Moolenaar  catch /E1093:/
502f0b9f43cSBram Moolenaar    n = 277
503f0b9f43cSBram Moolenaar  endtry
504f0b9f43cSBram Moolenaar  assert_equal(277, n)
505f0b9f43cSBram Moolenaar
506e859312eSBram Moolenaar  try
507e859312eSBram Moolenaar    &ts = g:astring
5085e654230SBram Moolenaar  catch /E1012:/
509e859312eSBram Moolenaar    n = 288
510e859312eSBram Moolenaar  endtry
511e859312eSBram Moolenaar  assert_equal(288, n)
512e859312eSBram Moolenaar
513e859312eSBram Moolenaar  try
514e859312eSBram Moolenaar    &backspace = 'asdf'
515e859312eSBram Moolenaar  catch /E474:/
516e859312eSBram Moolenaar    n = 299
517e859312eSBram Moolenaar  endtry
518e859312eSBram Moolenaar  assert_equal(299, n)
519e859312eSBram Moolenaar
520e859312eSBram Moolenaar  l = [1]
521e859312eSBram Moolenaar  try
522e859312eSBram Moolenaar    l[3] = 3
523e859312eSBram Moolenaar  catch /E684:/
524e859312eSBram Moolenaar    n = 300
525e859312eSBram Moolenaar  endtry
526e859312eSBram Moolenaar  assert_equal(300, n)
527e859312eSBram Moolenaar
528e859312eSBram Moolenaar  try
529e859312eSBram Moolenaar    unlet g:does_not_exist
530e859312eSBram Moolenaar  catch /E108:/
531e859312eSBram Moolenaar    n = 322
532e859312eSBram Moolenaar  endtry
533e859312eSBram Moolenaar  assert_equal(322, n)
534e859312eSBram Moolenaar
535e859312eSBram Moolenaar  try
5362bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
537e859312eSBram Moolenaar  catch /E721:/
538e859312eSBram Moolenaar    n = 333
539e859312eSBram Moolenaar  endtry
540e859312eSBram Moolenaar  assert_equal(333, n)
541e859312eSBram Moolenaar
542e859312eSBram Moolenaar  try
543e859312eSBram Moolenaar    l = DeletedFunc()
544e859312eSBram Moolenaar  catch /E933:/
545e859312eSBram Moolenaar    n = 344
546e859312eSBram Moolenaar  endtry
547e859312eSBram Moolenaar  assert_equal(344, n)
548d032f34aSBram Moolenaar
549d032f34aSBram Moolenaar  try
550a764e73dSYegappan Lakshmanan    echo range(1, 2, 0)
551a764e73dSYegappan Lakshmanan  catch /E726:/
552d032f34aSBram Moolenaar    n = 355
553d032f34aSBram Moolenaar  endtry
554d032f34aSBram Moolenaar  assert_equal(355, n)
555d032f34aSBram Moolenaar
556cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
557d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
558d032f34aSBram Moolenaar  try
559d032f34aSBram Moolenaar    echo P()
560d032f34aSBram Moolenaar  catch /E117:/
561d032f34aSBram Moolenaar    n = 366
562d032f34aSBram Moolenaar  endtry
563d032f34aSBram Moolenaar  assert_equal(366, n)
564d032f34aSBram Moolenaar
565d032f34aSBram Moolenaar  try
566d032f34aSBram Moolenaar    echo g:NoSuchFunc()
567d032f34aSBram Moolenaar  catch /E117:/
568d032f34aSBram Moolenaar    n = 377
569d032f34aSBram Moolenaar  endtry
570d032f34aSBram Moolenaar  assert_equal(377, n)
571d032f34aSBram Moolenaar
572d032f34aSBram Moolenaar  try
573d032f34aSBram Moolenaar    echo g:alist + 4
574d032f34aSBram Moolenaar  catch /E745:/
575d032f34aSBram Moolenaar    n = 388
576d032f34aSBram Moolenaar  endtry
577d032f34aSBram Moolenaar  assert_equal(388, n)
578d032f34aSBram Moolenaar
579d032f34aSBram Moolenaar  try
580d032f34aSBram Moolenaar    echo 4 + g:alist
581d032f34aSBram Moolenaar  catch /E745:/
582d032f34aSBram Moolenaar    n = 399
583d032f34aSBram Moolenaar  endtry
584d032f34aSBram Moolenaar  assert_equal(399, n)
585d032f34aSBram Moolenaar
586d032f34aSBram Moolenaar  try
587d032f34aSBram Moolenaar    echo g:alist.member
588d032f34aSBram Moolenaar  catch /E715:/
589d032f34aSBram Moolenaar    n = 400
590d032f34aSBram Moolenaar  endtry
591d032f34aSBram Moolenaar  assert_equal(400, n)
592d032f34aSBram Moolenaar
593d032f34aSBram Moolenaar  try
594d032f34aSBram Moolenaar    echo d.member
595d032f34aSBram Moolenaar  catch /E716:/
596d032f34aSBram Moolenaar    n = 411
597d032f34aSBram Moolenaar  endtry
598d032f34aSBram Moolenaar  assert_equal(411, n)
599d9d7789bSBram Moolenaar
600d9d7789bSBram Moolenaar  var counter = 0
601d9d7789bSBram Moolenaar  for i in range(4)
602d9d7789bSBram Moolenaar    try
603d9d7789bSBram Moolenaar      eval [][0]
604d9d7789bSBram Moolenaar    catch
605d9d7789bSBram Moolenaar    endtry
606d9d7789bSBram Moolenaar    counter += 1
607d9d7789bSBram Moolenaar  endfor
608d9d7789bSBram Moolenaar  assert_equal(4, counter)
6097e82c5f3SBram Moolenaar
6109fa5dabeSBram Moolenaar  # no requirement for spaces before |
6119fa5dabeSBram Moolenaar  try|echo 0|catch|endtry
6129fa5dabeSBram Moolenaar
6137e82c5f3SBram Moolenaar  # return in finally after empty catch
6147e82c5f3SBram Moolenaar  def ReturnInFinally(): number
6157e82c5f3SBram Moolenaar    try
6167e82c5f3SBram Moolenaar    finally
6177e82c5f3SBram Moolenaar      return 4
6187e82c5f3SBram Moolenaar    endtry
6197e82c5f3SBram Moolenaar    return 2
6207e82c5f3SBram Moolenaar  enddef
6217e82c5f3SBram Moolenaar  assert_equal(4, ReturnInFinally())
6228ac681a2SBram Moolenaar
6238ac681a2SBram Moolenaar  var lines =<< trim END
6248ac681a2SBram Moolenaar      vim9script
6258ac681a2SBram Moolenaar      try
6268ac681a2SBram Moolenaar        acos('0.5')
6278ac681a2SBram Moolenaar          ->setline(1)
6288ac681a2SBram Moolenaar      catch
6298ac681a2SBram Moolenaar        g:caught = v:exception
6308ac681a2SBram Moolenaar      endtry
6318ac681a2SBram Moolenaar  END
6328ac681a2SBram Moolenaar  CheckScriptSuccess(lines)
6334490ec4eSYegappan Lakshmanan  assert_match('E1219: Float or Number required for argument 1', g:caught)
6348ac681a2SBram Moolenaar  unlet g:caught
6354197828dSBram Moolenaar
6364197828dSBram Moolenaar  # missing catch and/or finally
6374197828dSBram Moolenaar  lines =<< trim END
6384197828dSBram Moolenaar      vim9script
6394197828dSBram Moolenaar      try
6404197828dSBram Moolenaar        echo 'something'
6414197828dSBram Moolenaar      endtry
6424197828dSBram Moolenaar  END
6434197828dSBram Moolenaar  CheckScriptFailure(lines, 'E1032:')
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
2375*e525bddaSBram Moolenaar
2376*e525bddaSBram Moolenaar  # expression with line breaks skipped
2377*e525bddaSBram Moolenaar  if false
2378*e525bddaSBram Moolenaar      ('aaa'
2379*e525bddaSBram Moolenaar      .. 'bbb'
2380*e525bddaSBram Moolenaar      .. 'ccc'
2381*e525bddaSBram Moolenaar      )->setline(1)
2382*e525bddaSBram 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
2859d0df1aacSBram Moolenaardef Test_while_loop()
2860cfcd011fSBram Moolenaar  var result = ''
2861cfcd011fSBram Moolenaar  var cnt = 0
2862d0df1aacSBram Moolenaar  while cnt < 555
2863d0df1aacSBram Moolenaar    if cnt == 3
2864d0df1aacSBram Moolenaar      break
2865d0df1aacSBram Moolenaar    endif
2866d0df1aacSBram Moolenaar    cnt += 1
2867d0df1aacSBram Moolenaar    if cnt == 2
2868d0df1aacSBram Moolenaar      continue
2869d0df1aacSBram Moolenaar    endif
2870d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2871d0df1aacSBram Moolenaar  endwhile
2872d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2873dee37dc7SBram Moolenaar
2874dee37dc7SBram Moolenaar  var s = ''
28750123cc1eSBram Moolenaar  while s == 'x' # {comment}
2876dee37dc7SBram Moolenaar  endwhile
2877d0df1aacSBram Moolenaarenddef
2878d0df1aacSBram Moolenaar
2879e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2880675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2881675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2882675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2883675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2884675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2885675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2886675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
28876628b7ebSBram Moolenaar
28886628b7ebSBram Moolenaar  var lines =<< trim END
28896628b7ebSBram Moolenaar      var s = ''
28906628b7ebSBram Moolenaar      while s = ''
28916628b7ebSBram Moolenaar      endwhile
28926628b7ebSBram Moolenaar  END
28936628b7ebSBram Moolenaar  CheckDefFailure(lines, 'E488:')
2894bd5da371SBram Moolenaarenddef
2895bd5da371SBram Moolenaar
28969645e2d9SBram Moolenaardef Test_interrupt_loop()
2897cfcd011fSBram Moolenaar  var caught = false
2898cfcd011fSBram Moolenaar  var x = 0
289997acfc78SBram Moolenaar  try
29009645e2d9SBram Moolenaar    while 1
29019645e2d9SBram Moolenaar      x += 1
29029645e2d9SBram Moolenaar      if x == 100
29039645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
29049645e2d9SBram Moolenaar      endif
29059645e2d9SBram Moolenaar    endwhile
290697acfc78SBram Moolenaar  catch
290797acfc78SBram Moolenaar    caught = true
290897acfc78SBram Moolenaar    assert_equal(100, x)
290997acfc78SBram Moolenaar  endtry
291097acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
291125859dd7SBram Moolenaar  # consume the CTRL-C
291225859dd7SBram Moolenaar  getchar(0)
29139645e2d9SBram Moolenaarenddef
291420431c9dSBram Moolenaar
29154fdae999SBram Moolenaardef Test_automatic_line_continuation()
2916cfcd011fSBram Moolenaar  var mylist = [
29174fdae999SBram Moolenaar      'one',
29184fdae999SBram Moolenaar      'two',
29194fdae999SBram Moolenaar      'three',
2920f5be8cdbSBram Moolenaar      ] # comment
29214fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
29224fdae999SBram Moolenaar
2923cfcd011fSBram Moolenaar  var mydict = {
2924e0de171eSBram Moolenaar      ['one']: 1,
2925e0de171eSBram Moolenaar      ['two']: 2,
2926e0de171eSBram Moolenaar      ['three']:
29274fdae999SBram Moolenaar          3,
2928f5be8cdbSBram Moolenaar      } # comment
2929e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2930e0de171eSBram Moolenaar  mydict = {
29312c330432SBram Moolenaar      one: 1,  # comment
29322c330432SBram Moolenaar      two:     # comment
29332c330432SBram Moolenaar           2,  # comment
29342c330432SBram Moolenaar      three: 3 # comment
29352c330432SBram Moolenaar      }
2936e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2937e0de171eSBram Moolenaar  mydict = {
29382c330432SBram Moolenaar      one: 1,
29394fdae999SBram Moolenaar      two:
29404fdae999SBram Moolenaar           2,
29412c330432SBram Moolenaar      three: 3
29424fdae999SBram Moolenaar      }
2943e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2944e6085c53SBram Moolenaar
2945e6085c53SBram Moolenaar  assert_equal(
2946e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2947e6085c53SBram Moolenaar        split('one two three')
2948e6085c53SBram Moolenaar        )
29494fdae999SBram Moolenaarenddef
29504fdae999SBram Moolenaar
29517a092245SBram Moolenaardef Test_vim9_comment()
29527a092245SBram Moolenaar  CheckScriptSuccess([
29537a092245SBram Moolenaar      'vim9script',
29547a092245SBram Moolenaar      '# something',
295593f82cbeSBram Moolenaar      '#something',
295693f82cbeSBram Moolenaar      '#{something',
29577a092245SBram Moolenaar      ])
295893f82cbeSBram Moolenaar
295993f82cbeSBram Moolenaar  split Xfile
296093f82cbeSBram Moolenaar  CheckScriptSuccess([
296193f82cbeSBram Moolenaar      'vim9script',
296293f82cbeSBram Moolenaar      'edit #something',
296393f82cbeSBram Moolenaar      ])
296493f82cbeSBram Moolenaar  CheckScriptSuccess([
296593f82cbeSBram Moolenaar      'vim9script',
296693f82cbeSBram Moolenaar      'edit #{something',
296793f82cbeSBram Moolenaar      ])
296893f82cbeSBram Moolenaar  close
296993f82cbeSBram Moolenaar
29707a092245SBram Moolenaar  CheckScriptFailure([
29717a092245SBram Moolenaar      'vim9script',
29727a092245SBram Moolenaar      ':# something',
29737a092245SBram Moolenaar      ], 'E488:')
29747a092245SBram Moolenaar  CheckScriptFailure([
29757a092245SBram Moolenaar      '# something',
29767a092245SBram Moolenaar      ], 'E488:')
29777a092245SBram Moolenaar  CheckScriptFailure([
29787a092245SBram Moolenaar      ':# something',
29797a092245SBram Moolenaar      ], 'E488:')
29807a092245SBram Moolenaar
29814a8d9f2eSBram Moolenaar  { # block start
29824a8d9f2eSBram Moolenaar  } # block end
29834a8d9f2eSBram Moolenaar  CheckDefFailure([
29844a8d9f2eSBram Moolenaar      '{# comment',
29854a8d9f2eSBram Moolenaar      ], 'E488:')
29864a8d9f2eSBram Moolenaar  CheckDefFailure([
29874a8d9f2eSBram Moolenaar      '{',
29884a8d9f2eSBram Moolenaar      '}# comment',
29894a8d9f2eSBram Moolenaar      ], 'E488:')
29904a8d9f2eSBram Moolenaar
29914a8d9f2eSBram Moolenaar  echo "yes" # comment
29924a8d9f2eSBram Moolenaar  CheckDefFailure([
29934a8d9f2eSBram Moolenaar      'echo "yes"# comment',
29944a8d9f2eSBram Moolenaar      ], 'E488:')
29957a092245SBram Moolenaar  CheckScriptSuccess([
29967a092245SBram Moolenaar      'vim9script',
29977a092245SBram Moolenaar      'echo "yes" # something',
29987a092245SBram Moolenaar      ])
29997a092245SBram Moolenaar  CheckScriptFailure([
30007a092245SBram Moolenaar      'vim9script',
30017a092245SBram Moolenaar      'echo "yes"# something',
30027a092245SBram Moolenaar      ], 'E121:')
30037a092245SBram Moolenaar  CheckScriptFailure([
30047a092245SBram Moolenaar      'vim9script',
30057a092245SBram Moolenaar      'echo# something',
3006f8103f27SBram Moolenaar      ], 'E1144:')
30077a092245SBram Moolenaar  CheckScriptFailure([
30087a092245SBram Moolenaar      'echo "yes" # something',
30097a092245SBram Moolenaar      ], 'E121:')
30107a092245SBram Moolenaar
30114a8d9f2eSBram Moolenaar  exe "echo" # comment
30124a8d9f2eSBram Moolenaar  CheckDefFailure([
30134a8d9f2eSBram Moolenaar      'exe "echo"# comment',
30144a8d9f2eSBram Moolenaar      ], 'E488:')
30154a8d9f2eSBram Moolenaar  CheckScriptSuccess([
30164a8d9f2eSBram Moolenaar      'vim9script',
30174a8d9f2eSBram Moolenaar      'exe "echo" # something',
30184a8d9f2eSBram Moolenaar      ])
30194a8d9f2eSBram Moolenaar  CheckScriptFailure([
30204a8d9f2eSBram Moolenaar      'vim9script',
30214a8d9f2eSBram Moolenaar      'exe "echo"# something',
30224a8d9f2eSBram Moolenaar      ], 'E121:')
30234a8d9f2eSBram Moolenaar  CheckScriptFailure([
30244a8d9f2eSBram Moolenaar      'vim9script',
30254a8d9f2eSBram Moolenaar      'exe# something',
3026f8103f27SBram Moolenaar      ], 'E1144:')
30274a8d9f2eSBram Moolenaar  CheckScriptFailure([
30284a8d9f2eSBram Moolenaar      'exe "echo" # something',
30294a8d9f2eSBram Moolenaar      ], 'E121:')
30304a8d9f2eSBram Moolenaar
30317a092245SBram Moolenaar  CheckDefFailure([
30327a092245SBram Moolenaar      'try# comment',
30337a092245SBram Moolenaar      '  echo "yes"',
30347a092245SBram Moolenaar      'catch',
30357a092245SBram Moolenaar      'endtry',
3036f8103f27SBram Moolenaar      ], 'E1144:')
30372c5ed4e3SBram Moolenaar  CheckScriptFailure([
30382c5ed4e3SBram Moolenaar      'vim9script',
30392c5ed4e3SBram Moolenaar      'try# comment',
30402c5ed4e3SBram Moolenaar      'echo "yes"',
3041f8103f27SBram Moolenaar      ], 'E1144:')
30427a092245SBram Moolenaar  CheckDefFailure([
30437a092245SBram Moolenaar      'try',
3044a72cfb80SBram Moolenaar      '  throw#comment',
3045a72cfb80SBram Moolenaar      'catch',
3046a72cfb80SBram Moolenaar      'endtry',
3047f8103f27SBram Moolenaar      ], 'E1144:')
3048a72cfb80SBram Moolenaar  CheckDefFailure([
3049a72cfb80SBram Moolenaar      'try',
3050a72cfb80SBram Moolenaar      '  throw "yes"#comment',
3051a72cfb80SBram Moolenaar      'catch',
3052a72cfb80SBram Moolenaar      'endtry',
3053a72cfb80SBram Moolenaar      ], 'E488:')
3054a72cfb80SBram Moolenaar  CheckDefFailure([
3055a72cfb80SBram Moolenaar      'try',
30567a092245SBram Moolenaar      '  echo "yes"',
30577a092245SBram Moolenaar      'catch# comment',
30587a092245SBram Moolenaar      'endtry',
3059f8103f27SBram Moolenaar      ], 'E1144:')
30602c5ed4e3SBram Moolenaar  CheckScriptFailure([
30612c5ed4e3SBram Moolenaar      'vim9script',
30622c5ed4e3SBram Moolenaar      'try',
30632c5ed4e3SBram Moolenaar      '  echo "yes"',
30642c5ed4e3SBram Moolenaar      'catch# comment',
30652c5ed4e3SBram Moolenaar      'endtry',
3066f8103f27SBram Moolenaar      ], 'E1144:')
30672c5ed4e3SBram Moolenaar  CheckDefFailure([
30682c5ed4e3SBram Moolenaar      'try',
30692c5ed4e3SBram Moolenaar      '  echo "yes"',
30702c5ed4e3SBram Moolenaar      'catch /pat/# comment',
30712c5ed4e3SBram Moolenaar      'endtry',
30722c5ed4e3SBram Moolenaar      ], 'E488:')
30737a092245SBram Moolenaar  CheckDefFailure([
30747a092245SBram Moolenaar      'try',
30757a092245SBram Moolenaar      'echo "yes"',
30767a092245SBram Moolenaar      'catch',
30777a092245SBram Moolenaar      'endtry# comment',
3078f8103f27SBram Moolenaar      ], 'E1144:')
30792c5ed4e3SBram Moolenaar  CheckScriptFailure([
30802c5ed4e3SBram Moolenaar      'vim9script',
30812c5ed4e3SBram Moolenaar      'try',
30822c5ed4e3SBram Moolenaar      '  echo "yes"',
30832c5ed4e3SBram Moolenaar      'catch',
30842c5ed4e3SBram Moolenaar      'endtry# comment',
3085f8103f27SBram Moolenaar      ], 'E1144:')
30862c5ed4e3SBram Moolenaar
30872c5ed4e3SBram Moolenaar  CheckScriptSuccess([
30882c5ed4e3SBram Moolenaar      'vim9script',
30892c5ed4e3SBram Moolenaar      'hi # comment',
30902c5ed4e3SBram Moolenaar      ])
30912c5ed4e3SBram Moolenaar  CheckScriptFailure([
30922c5ed4e3SBram Moolenaar      'vim9script',
30932c5ed4e3SBram Moolenaar      'hi# comment',
3094f8103f27SBram Moolenaar      ], 'E1144:')
30951966c248SBram Moolenaar  CheckScriptSuccess([
30961966c248SBram Moolenaar      'vim9script',
30971966c248SBram Moolenaar      'hi Search # comment',
30981966c248SBram Moolenaar      ])
30991966c248SBram Moolenaar  CheckScriptFailure([
31001966c248SBram Moolenaar      'vim9script',
31011966c248SBram Moolenaar      'hi Search# comment',
31021966c248SBram Moolenaar      ], 'E416:')
31031966c248SBram Moolenaar  CheckScriptSuccess([
31041966c248SBram Moolenaar      'vim9script',
31051966c248SBram Moolenaar      'hi link This Search # comment',
31061966c248SBram Moolenaar      ])
31071966c248SBram Moolenaar  CheckScriptFailure([
31081966c248SBram Moolenaar      'vim9script',
31091966c248SBram Moolenaar      'hi link This That# comment',
31101966c248SBram Moolenaar      ], 'E413:')
31111966c248SBram Moolenaar  CheckScriptSuccess([
31121966c248SBram Moolenaar      'vim9script',
31131966c248SBram Moolenaar      'hi clear This # comment',
31141966c248SBram Moolenaar      'hi clear # comment',
31151966c248SBram Moolenaar      ])
3116f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
3117f5be8cdbSBram Moolenaar  # hi clear This# comment',
31181966c248SBram Moolenaar  CheckScriptFailure([
31191966c248SBram Moolenaar      'vim9script',
31201966c248SBram Moolenaar      'hi clear# comment',
31211966c248SBram Moolenaar      ], 'E416:')
31221966c248SBram Moolenaar
31231966c248SBram Moolenaar  CheckScriptSuccess([
31241966c248SBram Moolenaar      'vim9script',
31251966c248SBram Moolenaar      'hi Group term=bold',
31261966c248SBram Moolenaar      'match Group /todo/ # comment',
31271966c248SBram Moolenaar      ])
31281966c248SBram Moolenaar  CheckScriptFailure([
31291966c248SBram Moolenaar      'vim9script',
31301966c248SBram Moolenaar      'hi Group term=bold',
31311966c248SBram Moolenaar      'match Group /todo/# comment',
31321966c248SBram Moolenaar      ], 'E488:')
31331966c248SBram Moolenaar  CheckScriptSuccess([
31341966c248SBram Moolenaar      'vim9script',
31351966c248SBram Moolenaar      'match # comment',
31361966c248SBram Moolenaar      ])
31371966c248SBram Moolenaar  CheckScriptFailure([
31381966c248SBram Moolenaar      'vim9script',
31391966c248SBram Moolenaar      'match# comment',
3140f8103f27SBram Moolenaar      ], 'E1144:')
31411966c248SBram Moolenaar  CheckScriptSuccess([
31421966c248SBram Moolenaar      'vim9script',
31431966c248SBram Moolenaar      'match none # comment',
31441966c248SBram Moolenaar      ])
31451966c248SBram Moolenaar  CheckScriptFailure([
31461966c248SBram Moolenaar      'vim9script',
31471966c248SBram Moolenaar      'match none# comment',
31481966c248SBram Moolenaar      ], 'E475:')
31491966c248SBram Moolenaar
31501966c248SBram Moolenaar  CheckScriptSuccess([
31511966c248SBram Moolenaar      'vim9script',
31521966c248SBram Moolenaar      'menutrans clear # comment',
31531966c248SBram Moolenaar      ])
31541966c248SBram Moolenaar  CheckScriptFailure([
31551966c248SBram Moolenaar      'vim9script',
31561966c248SBram Moolenaar      'menutrans clear# comment text',
31571966c248SBram Moolenaar      ], 'E474:')
31581966c248SBram Moolenaar
31591966c248SBram Moolenaar  CheckScriptSuccess([
31601966c248SBram Moolenaar      'vim9script',
31611966c248SBram Moolenaar      'syntax clear # comment',
31621966c248SBram Moolenaar      ])
31631966c248SBram Moolenaar  CheckScriptFailure([
31641966c248SBram Moolenaar      'vim9script',
31651966c248SBram Moolenaar      'syntax clear# comment text',
31661966c248SBram Moolenaar      ], 'E28:')
31671966c248SBram Moolenaar  CheckScriptSuccess([
31681966c248SBram Moolenaar      'vim9script',
31691966c248SBram Moolenaar      'syntax keyword Word some',
31701966c248SBram Moolenaar      'syntax clear Word # comment',
31711966c248SBram Moolenaar      ])
31721966c248SBram Moolenaar  CheckScriptFailure([
31731966c248SBram Moolenaar      'vim9script',
31741966c248SBram Moolenaar      'syntax keyword Word some',
31751966c248SBram Moolenaar      'syntax clear Word# comment text',
31761966c248SBram Moolenaar      ], 'E28:')
31771966c248SBram Moolenaar
31781966c248SBram Moolenaar  CheckScriptSuccess([
31791966c248SBram Moolenaar      'vim9script',
31801966c248SBram Moolenaar      'syntax list # comment',
31811966c248SBram Moolenaar      ])
31821966c248SBram Moolenaar  CheckScriptFailure([
31831966c248SBram Moolenaar      'vim9script',
31841966c248SBram Moolenaar      'syntax list# comment text',
31851966c248SBram Moolenaar      ], 'E28:')
31861966c248SBram Moolenaar
31871966c248SBram Moolenaar  CheckScriptSuccess([
31881966c248SBram Moolenaar      'vim9script',
31891966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
31901966c248SBram Moolenaar      ])
31911966c248SBram Moolenaar  CheckScriptFailure([
31921966c248SBram Moolenaar      'vim9script',
31931966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
31941966c248SBram Moolenaar      ], 'E475:')
31951966c248SBram Moolenaar
31961966c248SBram Moolenaar  CheckScriptSuccess([
31971966c248SBram Moolenaar      'vim9script',
31981966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
31991966c248SBram Moolenaar      ])
32001966c248SBram Moolenaar  CheckScriptFailure([
32011966c248SBram Moolenaar      'vim9script',
32021966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
32031966c248SBram Moolenaar      ], 'E789:')
32041966c248SBram Moolenaar
32051966c248SBram Moolenaar  CheckScriptSuccess([
32061966c248SBram Moolenaar      'vim9script',
32071966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
32081966c248SBram Moolenaar      ])
32091966c248SBram Moolenaar  CheckScriptFailure([
32101966c248SBram Moolenaar      'vim9script',
32111966c248SBram Moolenaar      'syntax match Word /pat/# comment',
32121966c248SBram Moolenaar      ], 'E402:')
32131966c248SBram Moolenaar
32141966c248SBram Moolenaar  CheckScriptSuccess([
32151966c248SBram Moolenaar      'vim9script',
32161966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
32171966c248SBram Moolenaar      ])
32181966c248SBram Moolenaar  CheckScriptFailure([
32191966c248SBram Moolenaar      'vim9script',
32201966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
32211966c248SBram Moolenaar      ], 'E475:')
32221966c248SBram Moolenaar  CheckScriptFailure([
32231966c248SBram Moolenaar      'vim9script',
32241966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
32251966c248SBram Moolenaar      ], 'E406:')
32261966c248SBram Moolenaar  CheckScriptFailure([
32271966c248SBram Moolenaar      'vim9script',
32281966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
32291966c248SBram Moolenaar      ], 'E475:')
32301966c248SBram Moolenaar
32311966c248SBram Moolenaar  CheckScriptSuccess([
32321966c248SBram Moolenaar      'vim9script',
32331966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
32341966c248SBram Moolenaar      ])
32351966c248SBram Moolenaar  CheckScriptFailure([
32361966c248SBram Moolenaar      'vim9script',
32371966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
3238d032f34aSBram Moolenaar      ], 'E402:')
32391966c248SBram Moolenaar
32401966c248SBram Moolenaar  CheckScriptSuccess([
32411966c248SBram Moolenaar      'vim9script',
32421966c248SBram Moolenaar      'syntax sync # comment',
32431966c248SBram Moolenaar      ])
32441966c248SBram Moolenaar  CheckScriptFailure([
32451966c248SBram Moolenaar      'vim9script',
32461966c248SBram Moolenaar      'syntax sync# comment',
32471966c248SBram Moolenaar      ], 'E404:')
32481966c248SBram Moolenaar  CheckScriptSuccess([
32491966c248SBram Moolenaar      'vim9script',
32501966c248SBram Moolenaar      'syntax sync ccomment # comment',
32511966c248SBram Moolenaar      ])
32521966c248SBram Moolenaar  CheckScriptFailure([
32531966c248SBram Moolenaar      'vim9script',
32541966c248SBram Moolenaar      'syntax sync ccomment# comment',
32551966c248SBram Moolenaar      ], 'E404:')
32561966c248SBram Moolenaar
32571966c248SBram Moolenaar  CheckScriptSuccess([
32581966c248SBram Moolenaar      'vim9script',
32591966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
32601966c248SBram Moolenaar      ])
32611966c248SBram Moolenaar  CheckScriptFailure([
32621966c248SBram Moolenaar      'vim9script',
32631966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
32641966c248SBram Moolenaar      ], 'E475:')
3265a72cfb80SBram Moolenaar
3266a72cfb80SBram Moolenaar  CheckScriptSuccess([
3267a72cfb80SBram Moolenaar      'vim9script',
3268a72cfb80SBram Moolenaar      'command Echo echo # comment',
3269a72cfb80SBram Moolenaar      'command Echo # comment',
32702d870f8dSBram Moolenaar      'delcommand Echo',
3271a72cfb80SBram Moolenaar      ])
3272a72cfb80SBram Moolenaar  CheckScriptFailure([
3273a72cfb80SBram Moolenaar      'vim9script',
3274a72cfb80SBram Moolenaar      'command Echo echo# comment',
3275a72cfb80SBram Moolenaar      'Echo',
3276f8103f27SBram Moolenaar      ], 'E1144:')
32772d870f8dSBram Moolenaar  delcommand Echo
327870249ee8SBram Moolenaar
327970249ee8SBram Moolenaar  var curdir = getcwd()
328070249ee8SBram Moolenaar  CheckScriptSuccess([
328170249ee8SBram Moolenaar      'command Echo cd " comment',
328270249ee8SBram Moolenaar      'Echo',
328370249ee8SBram Moolenaar      'delcommand Echo',
328470249ee8SBram Moolenaar      ])
328570249ee8SBram Moolenaar  CheckScriptSuccess([
3286090728adSBram Moolenaar      'vim9script',
328770249ee8SBram Moolenaar      'command Echo cd # comment',
328870249ee8SBram Moolenaar      'Echo',
328970249ee8SBram Moolenaar      'delcommand Echo',
329070249ee8SBram Moolenaar      ])
329170249ee8SBram Moolenaar  CheckScriptFailure([
329270249ee8SBram Moolenaar      'vim9script',
329370249ee8SBram Moolenaar      'command Echo cd " comment',
329470249ee8SBram Moolenaar      'Echo',
329570249ee8SBram Moolenaar      ], 'E344:')
329670249ee8SBram Moolenaar  delcommand Echo
329770249ee8SBram Moolenaar  chdir(curdir)
329870249ee8SBram Moolenaar
3299a72cfb80SBram Moolenaar  CheckScriptFailure([
3300a72cfb80SBram Moolenaar      'vim9script',
3301a72cfb80SBram Moolenaar      'command Echo# comment',
3302a72cfb80SBram Moolenaar      ], 'E182:')
3303a72cfb80SBram Moolenaar  CheckScriptFailure([
3304a72cfb80SBram Moolenaar      'vim9script',
3305a72cfb80SBram Moolenaar      'command Echo echo',
3306a72cfb80SBram Moolenaar      'command Echo# comment',
3307a72cfb80SBram Moolenaar      ], 'E182:')
33082d870f8dSBram Moolenaar  delcommand Echo
3309a72cfb80SBram Moolenaar
3310a72cfb80SBram Moolenaar  CheckScriptSuccess([
3311a72cfb80SBram Moolenaar      'vim9script',
3312a72cfb80SBram Moolenaar      'function # comment',
3313a72cfb80SBram Moolenaar      ])
3314a72cfb80SBram Moolenaar  CheckScriptFailure([
3315a72cfb80SBram Moolenaar      'vim9script',
33169898107fSBram Moolenaar      'function " comment',
33179898107fSBram Moolenaar      ], 'E129:')
33189898107fSBram Moolenaar  CheckScriptFailure([
33199898107fSBram Moolenaar      'vim9script',
3320a72cfb80SBram Moolenaar      'function# comment',
3321f8103f27SBram Moolenaar      ], 'E1144:')
3322a72cfb80SBram Moolenaar  CheckScriptSuccess([
3323a72cfb80SBram Moolenaar      'vim9script',
3324a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
3325a72cfb80SBram Moolenaar      ])
3326a72cfb80SBram Moolenaar  CheckScriptFailure([
3327a72cfb80SBram Moolenaar      'vim9script',
3328a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
3329a72cfb80SBram Moolenaar      ], 'E488:')
3330a72cfb80SBram Moolenaar
3331a72cfb80SBram Moolenaar  CheckScriptSuccess([
3332a72cfb80SBram Moolenaar      'vim9script',
33334c17ad94SBram Moolenaar      'func g:DeleteMeA()',
3334a72cfb80SBram Moolenaar      'endfunc',
33354c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
3336a72cfb80SBram Moolenaar      ])
3337a72cfb80SBram Moolenaar  CheckScriptFailure([
3338a72cfb80SBram Moolenaar      'vim9script',
33394c17ad94SBram Moolenaar      'func g:DeleteMeB()',
3340a72cfb80SBram Moolenaar      'endfunc',
33414c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
3342a72cfb80SBram Moolenaar      ], 'E488:')
3343a72cfb80SBram Moolenaar
3344a72cfb80SBram Moolenaar  CheckScriptSuccess([
3345a72cfb80SBram Moolenaar      'vim9script',
3346a72cfb80SBram Moolenaar      'call execute("ls") # comment',
3347a72cfb80SBram Moolenaar      ])
3348a72cfb80SBram Moolenaar  CheckScriptFailure([
3349a72cfb80SBram Moolenaar      'vim9script',
3350a72cfb80SBram Moolenaar      'call execute("ls")# comment',
3351a72cfb80SBram Moolenaar      ], 'E488:')
3352e7e4838fSBram Moolenaar
3353e7e4838fSBram Moolenaar  CheckScriptFailure([
3354e7e4838fSBram Moolenaar      'def Test() " comment',
3355e7e4838fSBram Moolenaar      'enddef',
3356e7e4838fSBram Moolenaar      ], 'E488:')
3357e7e4838fSBram Moolenaar  CheckScriptFailure([
3358e7e4838fSBram Moolenaar      'vim9script',
3359e7e4838fSBram Moolenaar      'def Test() " comment',
3360e7e4838fSBram Moolenaar      'enddef',
3361e7e4838fSBram Moolenaar      ], 'E488:')
3362e7e4838fSBram Moolenaar
3363e7e4838fSBram Moolenaar  CheckScriptSuccess([
3364e7e4838fSBram Moolenaar      'func Test() " comment',
3365e7e4838fSBram Moolenaar      'endfunc',
33662d870f8dSBram Moolenaar      'delfunc Test',
3367e7e4838fSBram Moolenaar      ])
33689898107fSBram Moolenaar  CheckScriptSuccess([
3369e7e4838fSBram Moolenaar      'vim9script',
3370e7e4838fSBram Moolenaar      'func Test() " comment',
3371e7e4838fSBram Moolenaar      'endfunc',
33729898107fSBram Moolenaar      ])
3373e7e4838fSBram Moolenaar
3374e7e4838fSBram Moolenaar  CheckScriptSuccess([
3375e7e4838fSBram Moolenaar      'def Test() # comment',
3376e7e4838fSBram Moolenaar      'enddef',
3377e7e4838fSBram Moolenaar      ])
3378e7e4838fSBram Moolenaar  CheckScriptFailure([
3379e7e4838fSBram Moolenaar      'func Test() # comment',
3380e7e4838fSBram Moolenaar      'endfunc',
3381e7e4838fSBram Moolenaar      ], 'E488:')
33820f37e356SBram Moolenaar
33830f37e356SBram Moolenaar  var lines =<< trim END
33840f37e356SBram Moolenaar      vim9script
33850f37e356SBram Moolenaar      syn region Text
33860f37e356SBram Moolenaar      \ start='foo'
33870f37e356SBram Moolenaar      #\ comment
33880f37e356SBram Moolenaar      \ end='bar'
33895072b47aSBram Moolenaar      syn region Text start='foo'
33905072b47aSBram Moolenaar      #\ comment
33915072b47aSBram Moolenaar      \ end='bar'
33920f37e356SBram Moolenaar  END
33930f37e356SBram Moolenaar  CheckScriptSuccess(lines)
33940f37e356SBram Moolenaar
33950f37e356SBram Moolenaar  lines =<< trim END
33960f37e356SBram Moolenaar      vim9script
33970f37e356SBram Moolenaar      syn region Text
33980f37e356SBram Moolenaar      \ start='foo'
33990f37e356SBram Moolenaar      "\ comment
34000f37e356SBram Moolenaar      \ end='bar'
34010f37e356SBram Moolenaar  END
34020f37e356SBram Moolenaar  CheckScriptFailure(lines, 'E399:')
34032c5ed4e3SBram Moolenaarenddef
34042c5ed4e3SBram Moolenaar
34052c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
34062c5ed4e3SBram Moolenaar  CheckCanRunGui
34072c5ed4e3SBram Moolenaar
34082c5ed4e3SBram Moolenaar  CheckScriptFailure([
34092c5ed4e3SBram Moolenaar      'vim9script',
34102c5ed4e3SBram Moolenaar      'gui#comment'
3411f8103f27SBram Moolenaar      ], 'E1144:')
34122c5ed4e3SBram Moolenaar  CheckScriptFailure([
34132c5ed4e3SBram Moolenaar      'vim9script',
34142c5ed4e3SBram Moolenaar      'gui -f#comment'
34152c5ed4e3SBram Moolenaar      ], 'E499:')
34167a092245SBram Moolenaarenddef
34177a092245SBram Moolenaar
3418a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
34196797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
34206797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
3421a26b9700SBram Moolenaar
3422a26b9700SBram Moolenaar  edit test.vim
3423a26b9700SBram Moolenaar  doautocmd TabEnter #comment
3424a26b9700SBram Moolenaar  assert_equal(1, g:entered)
3425a26b9700SBram Moolenaar
3426a26b9700SBram Moolenaar  doautocmd TabEnter f.x
3427a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3428a26b9700SBram Moolenaar
3429a26b9700SBram Moolenaar  g:entered = 0
3430a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
3431a26b9700SBram Moolenaar  assert_equal(2, g:entered)
3432a26b9700SBram Moolenaar
3433a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
3434a26b9700SBram Moolenaar
3435a26b9700SBram Moolenaar  au! TabEnter
3436a26b9700SBram Moolenaar  unlet g:entered
3437d72c1bf0SBram Moolenaar
3438d72c1bf0SBram Moolenaar  CheckScriptSuccess([
3439d72c1bf0SBram Moolenaar      'vim9script',
34406797966dSBram Moolenaar      'g:var = 123',
3441e55b1c09SBram Moolenaar      'b:var = 456',
3442e55b1c09SBram Moolenaar      'w:var = 777',
3443e55b1c09SBram Moolenaar      't:var = 888',
3444d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
3445d72c1bf0SBram Moolenaar      ])
3446d72c1bf0SBram Moolenaar
3447d72c1bf0SBram Moolenaar  CheckScriptFailure([
3448d72c1bf0SBram Moolenaar      'vim9script',
3449cfcd011fSBram Moolenaar      'let var = 123',
3450cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
3451cfcd011fSBram Moolenaar
3452cfcd011fSBram Moolenaar  CheckScriptFailure([
3453cfcd011fSBram Moolenaar      'vim9script',
3454cfcd011fSBram Moolenaar      'var g:var = 123',
3455e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
3456e55b1c09SBram Moolenaar
3457e55b1c09SBram Moolenaar  CheckScriptFailure([
3458e55b1c09SBram Moolenaar      'vim9script',
3459cfcd011fSBram Moolenaar      'var b:var = 123',
3460e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
3461e55b1c09SBram Moolenaar
3462e55b1c09SBram Moolenaar  CheckScriptFailure([
3463e55b1c09SBram Moolenaar      'vim9script',
3464cfcd011fSBram Moolenaar      'var w:var = 123',
3465e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
3466e55b1c09SBram Moolenaar
3467e55b1c09SBram Moolenaar  CheckScriptFailure([
3468e55b1c09SBram Moolenaar      'vim9script',
3469cfcd011fSBram Moolenaar      'var t:var = 123',
3470e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
3471e55b1c09SBram Moolenaar
3472e55b1c09SBram Moolenaar  CheckScriptFailure([
3473e55b1c09SBram Moolenaar      'vim9script',
3474cfcd011fSBram Moolenaar      'var v:version = 123',
3475e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
3476e55b1c09SBram Moolenaar
3477e55b1c09SBram Moolenaar  CheckScriptFailure([
3478e55b1c09SBram Moolenaar      'vim9script',
3479cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
3480e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
34816797966dSBram Moolenaar
34826797966dSBram Moolenaar  CheckScriptFailure([
34836797966dSBram Moolenaar      'vim9script',
34846797966dSBram Moolenaar      'g:var = 123',
348532e35117SBram Moolenaar      'unlet g:var# comment1',
3486d72c1bf0SBram Moolenaar      ], 'E108:')
3487d72c1bf0SBram Moolenaar
3488d72c1bf0SBram Moolenaar  CheckScriptFailure([
3489d72c1bf0SBram Moolenaar      'let g:var = 123',
3490d72c1bf0SBram Moolenaar      'unlet g:var # something',
3491d72c1bf0SBram Moolenaar      ], 'E488:')
3492faac4104SBram Moolenaar
3493faac4104SBram Moolenaar  CheckScriptSuccess([
3494faac4104SBram Moolenaar      'vim9script',
349532e35117SBram Moolenaar      'if 1 # comment2',
3496faac4104SBram Moolenaar      '  echo "yes"',
3497faac4104SBram Moolenaar      'elseif 2 #comment',
3498faac4104SBram Moolenaar      '  echo "no"',
3499faac4104SBram Moolenaar      'endif',
3500faac4104SBram Moolenaar      ])
3501faac4104SBram Moolenaar
3502faac4104SBram Moolenaar  CheckScriptFailure([
3503faac4104SBram Moolenaar      'vim9script',
350432e35117SBram Moolenaar      'if 1# comment3',
3505faac4104SBram Moolenaar      '  echo "yes"',
3506faac4104SBram Moolenaar      'endif',
3507fae55a9cSBram Moolenaar      ], 'E488:')
3508faac4104SBram Moolenaar
3509faac4104SBram Moolenaar  CheckScriptFailure([
3510faac4104SBram Moolenaar      'vim9script',
351132e35117SBram Moolenaar      'if 0 # comment4',
3512faac4104SBram Moolenaar      '  echo "yes"',
3513faac4104SBram Moolenaar      'elseif 2#comment',
3514faac4104SBram Moolenaar      '  echo "no"',
3515faac4104SBram Moolenaar      'endif',
3516fae55a9cSBram Moolenaar      ], 'E488:')
3517faac4104SBram Moolenaar
3518faac4104SBram Moolenaar  CheckScriptSuccess([
3519faac4104SBram Moolenaar      'vim9script',
3520cfcd011fSBram Moolenaar      'var v = 1 # comment5',
3521faac4104SBram Moolenaar      ])
3522faac4104SBram Moolenaar
3523faac4104SBram Moolenaar  CheckScriptFailure([
3524faac4104SBram Moolenaar      'vim9script',
3525cfcd011fSBram Moolenaar      'var v = 1# comment6',
3526fae55a9cSBram Moolenaar      ], 'E488:')
3527faac4104SBram Moolenaar
3528faac4104SBram Moolenaar  CheckScriptSuccess([
3529faac4104SBram Moolenaar      'vim9script',
3530faac4104SBram Moolenaar      'new'
3531d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3532df069eecSBram Moolenaar      ':$',
3533faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3534faac4104SBram Moolenaar      'bwipe!',
3535faac4104SBram Moolenaar      ])
3536faac4104SBram Moolenaar
3537f5be8cdbSBram Moolenaar  CheckScriptFailure([
3538f5be8cdbSBram Moolenaar      'vim9script',
3539f5be8cdbSBram Moolenaar      'new'
3540d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3541f5be8cdbSBram Moolenaar      ':$',
3542f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3543f5be8cdbSBram Moolenaar      'bwipe!',
3544f5be8cdbSBram Moolenaar      ], 'E488:')
3545f5be8cdbSBram Moolenaar
3546f5be8cdbSBram Moolenaar  CheckScriptFailure([
3547f5be8cdbSBram Moolenaar      'vim9script',
3548f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3549f5be8cdbSBram Moolenaar      ], 'E477:')
3550a26b9700SBram Moolenaarenddef
3551a26b9700SBram Moolenaar
35527e5bd91dSBram Moolenaardef Test_finish()
3553cfcd011fSBram Moolenaar  var lines =<< trim END
35547e5bd91dSBram Moolenaar    vim9script
35556797966dSBram Moolenaar    g:res = 'one'
35567e5bd91dSBram Moolenaar    if v:false | finish | endif
35576797966dSBram Moolenaar    g:res = 'two'
35587e5bd91dSBram Moolenaar    finish
35596797966dSBram Moolenaar    g:res = 'three'
35607e5bd91dSBram Moolenaar  END
35617e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
35627e5bd91dSBram Moolenaar  source Xfinished
35637e5bd91dSBram Moolenaar  assert_equal('two', g:res)
35647e5bd91dSBram Moolenaar
35657e5bd91dSBram Moolenaar  unlet g:res
35667e5bd91dSBram Moolenaar  delete('Xfinished')
35677e5bd91dSBram Moolenaarenddef
35687e5bd91dSBram Moolenaar
3569a5d0077eSBram Moolenaardef Test_forward_declaration()
3570cfcd011fSBram Moolenaar  var lines =<< trim END
3571a5d0077eSBram Moolenaar    vim9script
3572a5d0077eSBram Moolenaar    def GetValue(): string
3573a5d0077eSBram Moolenaar      return theVal
3574a5d0077eSBram Moolenaar    enddef
3575cfcd011fSBram Moolenaar    var theVal = 'something'
3576822ba247SBram Moolenaar    g:initVal = GetValue()
3577a5d0077eSBram Moolenaar    theVal = 'else'
3578a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3579a5d0077eSBram Moolenaar  END
3580a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3581a5d0077eSBram Moolenaar  source Xforward
3582a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3583a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3584a5d0077eSBram Moolenaar
3585a5d0077eSBram Moolenaar  unlet g:initVal
3586a5d0077eSBram Moolenaar  unlet g:laterVal
3587a5d0077eSBram Moolenaar  delete('Xforward')
3588a5d0077eSBram Moolenaarenddef
3589a5d0077eSBram Moolenaar
35909721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
3591a6294955SBram Moolenaar  var vim9_lines =<< trim END
3592a6294955SBram Moolenaar    vim9script
3593a6294955SBram Moolenaar    var local = 'local'
3594a6294955SBram Moolenaar    g:global = 'global'
3595a6294955SBram Moolenaar    export var exported = 'exported'
3596a6294955SBram Moolenaar    export def GetText(): string
3597a6294955SBram Moolenaar       return 'text'
3598a6294955SBram Moolenaar    enddef
3599a6294955SBram Moolenaar  END
3600a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
3601a6294955SBram Moolenaar
3602cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
36039721fb4eSBram Moolenaar    source Xvim9_script.vim
36049721fb4eSBram Moolenaar
36059721fb4eSBram Moolenaar    call assert_false(exists('local'))
36069721fb4eSBram Moolenaar    call assert_false(exists('exported'))
36079721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
36089721fb4eSBram Moolenaar    call assert_equal('global', global)
36099721fb4eSBram Moolenaar    call assert_equal('global', g:global)
36109721fb4eSBram Moolenaar
36119721fb4eSBram Moolenaar    " imported variable becomes script-local
36129721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
36139721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
36149721fb4eSBram Moolenaar    call assert_false(exists('exported'))
36159721fb4eSBram Moolenaar
36169721fb4eSBram Moolenaar    " imported function becomes script-local
36179721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
36189721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
36199721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
36209721fb4eSBram Moolenaar  END
36219721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
36229721fb4eSBram Moolenaar
36239721fb4eSBram Moolenaar  source Xlegacy_script.vim
36249721fb4eSBram Moolenaar  assert_equal('global', g:global)
3625f5be8cdbSBram Moolenaar  unlet g:global
36269721fb4eSBram Moolenaar
36279721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
36289721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
36299721fb4eSBram Moolenaarenddef
3630a5d0077eSBram Moolenaar
3631e535db86SBram Moolenaardef Test_declare_script_in_func()
3632e535db86SBram Moolenaar  var lines =<< trim END
3633e535db86SBram Moolenaar      vim9script
3634e535db86SBram Moolenaar      func Declare()
3635e535db86SBram Moolenaar        let s:local = 123
3636e535db86SBram Moolenaar      endfunc
3637e535db86SBram Moolenaar      Declare()
3638e535db86SBram Moolenaar      assert_equal(123, local)
3639e535db86SBram Moolenaar
3640e535db86SBram Moolenaar      var error: string
3641e535db86SBram Moolenaar      try
3642e535db86SBram Moolenaar        local = 'asdf'
3643e535db86SBram Moolenaar      catch
3644e535db86SBram Moolenaar        error = v:exception
3645e535db86SBram Moolenaar      endtry
3646e535db86SBram Moolenaar      assert_match('E1012: Type mismatch; expected number but got string', error)
3647e535db86SBram Moolenaar
3648e535db86SBram Moolenaar      lockvar local
3649e535db86SBram Moolenaar      try
3650e535db86SBram Moolenaar        local = 999
3651e535db86SBram Moolenaar      catch
3652e535db86SBram Moolenaar        error = v:exception
3653e535db86SBram Moolenaar      endtry
3654e535db86SBram Moolenaar      assert_match('E741: Value is locked: local', error)
3655e535db86SBram Moolenaar  END
3656e535db86SBram Moolenaar  CheckScriptSuccess(lines)
3657e535db86SBram Moolenaarenddef
3658e535db86SBram Moolenaar
3659e535db86SBram Moolenaar
36607d699701SBram Moolenaarfunc Test_vim9script_not_global()
36617d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
36627d699701SBram Moolenaar  let vim9lines =<< trim END
36637d699701SBram Moolenaar    vim9script
3664cfcd011fSBram Moolenaar    var name = 'local'
36657d699701SBram Moolenaar    func TheFunc()
36667d699701SBram Moolenaar      echo 'local'
36677d699701SBram Moolenaar    endfunc
36687d699701SBram Moolenaar    def DefFunc()
36697d699701SBram Moolenaar      echo 'local'
36707d699701SBram Moolenaar    enddef
36717d699701SBram Moolenaar  END
36727d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
36737d699701SBram Moolenaar  source Xvim9script.vim
36747d699701SBram Moolenaar  try
36757d699701SBram Moolenaar    echo g:var
36767d699701SBram Moolenaar    assert_report('did not fail')
36777d699701SBram Moolenaar  catch /E121:/
36787d699701SBram Moolenaar    " caught
36797d699701SBram Moolenaar  endtry
36807d699701SBram Moolenaar  try
36817d699701SBram Moolenaar    call TheFunc()
36827d699701SBram Moolenaar    assert_report('did not fail')
36837d699701SBram Moolenaar  catch /E117:/
36847d699701SBram Moolenaar    " caught
36857d699701SBram Moolenaar  endtry
36867d699701SBram Moolenaar  try
36877d699701SBram Moolenaar    call DefFunc()
36887d699701SBram Moolenaar    assert_report('did not fail')
36897d699701SBram Moolenaar  catch /E117:/
36907d699701SBram Moolenaar    " caught
36917d699701SBram Moolenaar  endtry
36927d699701SBram Moolenaar
369325859dd7SBram Moolenaar  call delete('Xvim9script.vim')
36947d699701SBram Moolenaarendfunc
36957d699701SBram Moolenaar
3696eeb27bfeSBram Moolenaardef Test_vim9_copen()
3697eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3698eeb27bfeSBram Moolenaar  copen
3699eeb27bfeSBram Moolenaar  quit
3700eeb27bfeSBram Moolenaarenddef
3701eeb27bfeSBram Moolenaar
370203290b84SBram Moolenaar" test using an auto-loaded function and variable
37032d6b20d6SBram Moolenaardef Test_vim9_autoload()
3704cfcd011fSBram Moolenaar  var lines =<< trim END
37052d6b20d6SBram Moolenaar     vim9script
370603290b84SBram Moolenaar     def some#gettest(): string
370703290b84SBram Moolenaar       return 'test'
370803290b84SBram Moolenaar     enddef
370903290b84SBram Moolenaar     g:some#name = 'name'
3710227c58a4SBram Moolenaar     g:some#dict = {key: 'value'}
3711e3ffcd99SBram Moolenaar
3712e3ffcd99SBram Moolenaar     def some#varargs(a1: string, ...l: list<string>): string
3713e3ffcd99SBram Moolenaar       return a1 .. l[0] .. l[1]
3714e3ffcd99SBram Moolenaar     enddef
371503290b84SBram Moolenaar  END
371603290b84SBram Moolenaar
371703290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
371803290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
371903290b84SBram Moolenaar  var save_rtp = &rtp
372003290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
372103290b84SBram Moolenaar
372203290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
372303290b84SBram Moolenaar  assert_equal('name', g:some#name)
3724227c58a4SBram Moolenaar  assert_equal('value', g:some#dict.key)
372503290b84SBram Moolenaar  g:some#other = 'other'
372603290b84SBram Moolenaar  assert_equal('other', g:some#other)
372703290b84SBram Moolenaar
3728e3ffcd99SBram Moolenaar  assert_equal('abc', some#varargs('a', 'b', 'c'))
3729e3ffcd99SBram Moolenaar
373017f700acSBram Moolenaar  # upper case script name works
373117f700acSBram Moolenaar  lines =<< trim END
373217f700acSBram Moolenaar     vim9script
373317f700acSBram Moolenaar     def Other#getOther(): string
373417f700acSBram Moolenaar       return 'other'
373517f700acSBram Moolenaar     enddef
373617f700acSBram Moolenaar  END
373717f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
373817f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
373917f700acSBram Moolenaar
374003290b84SBram Moolenaar  delete('Xdir', 'rf')
374103290b84SBram Moolenaar  &rtp = save_rtp
374203290b84SBram Moolenaarenddef
374303290b84SBram Moolenaar
374403290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
374503290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
374603290b84SBram Moolenaar  var lines =<< trim END
374703290b84SBram Moolenaar     vim9script
37482d6b20d6SBram Moolenaar     def foo#test()
37492d6b20d6SBram Moolenaar         echomsg getreg('"')
37502d6b20d6SBram Moolenaar     enddef
37512d6b20d6SBram Moolenaar  END
37522d6b20d6SBram Moolenaar
37532d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
37542d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
3755cfcd011fSBram Moolenaar  var save_rtp = &rtp
37562d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
37572d6b20d6SBram Moolenaar  augroup test
37582d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
37592d6b20d6SBram Moolenaar  augroup END
37602d6b20d6SBram Moolenaar
37612d6b20d6SBram Moolenaar  normal Y
37622d6b20d6SBram Moolenaar
37632d6b20d6SBram Moolenaar  augroup test
37642d6b20d6SBram Moolenaar    autocmd!
37652d6b20d6SBram Moolenaar  augroup END
37662d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
37672d6b20d6SBram Moolenaar  &rtp = save_rtp
37682d6b20d6SBram Moolenaarenddef
37692d6b20d6SBram Moolenaar
377077e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
377177e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3772cfcd011fSBram Moolenaar  var lines =<< trim END
377377e5dcc3SBram Moolenaar      vim9script
377477e5dcc3SBram Moolenaar      def crash#func()
377577e5dcc3SBram Moolenaar          try
377677e5dcc3SBram Moolenaar              for x in List()
377777e5dcc3SBram Moolenaar              endfor
377877e5dcc3SBram Moolenaar          catch
377977e5dcc3SBram Moolenaar          endtry
378077e5dcc3SBram Moolenaar          g:ok = true
378177e5dcc3SBram Moolenaar      enddef
378277e5dcc3SBram Moolenaar      fu List()
378377e5dcc3SBram Moolenaar          invalid
378477e5dcc3SBram Moolenaar      endfu
378577e5dcc3SBram Moolenaar      try
378648e11c10SBram Moolenaar          alsoinvalid
378777e5dcc3SBram Moolenaar      catch /wontmatch/
378877e5dcc3SBram Moolenaar      endtry
378977e5dcc3SBram Moolenaar  END
379077e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
379177e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
379277e5dcc3SBram Moolenaar
379377e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
379477e5dcc3SBram Moolenaar  lines =<< trim END
379577e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
379677e5dcc3SBram Moolenaar    call crash#func()
379777e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
37989c4f5520SBram Moolenaar    qall!
379977e5dcc3SBram Moolenaar  END
380077e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
380177e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
380277e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
380377e5dcc3SBram Moolenaar
380477e5dcc3SBram Moolenaar  delete('Xdidit')
380577e5dcc3SBram Moolenaar  delete('Xscript')
380677e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
380703290b84SBram Moolenaar
380803290b84SBram Moolenaar  lines =<< trim END
380903290b84SBram Moolenaar    vim9script
381003290b84SBram Moolenaar    var foo#bar = 'asdf'
381103290b84SBram Moolenaar  END
381203290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
381377e5dcc3SBram Moolenaarenddef
381477e5dcc3SBram Moolenaar
381581e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
381681e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
381781e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3818cfcd011fSBram Moolenaar  var lines =<< trim END
381981e17fbeSBram Moolenaar    let s:counter = 1
382081e17fbeSBram Moolenaar    def s:Func()
382181e17fbeSBram Moolenaar      au! CursorHold
382281e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
382381e17fbeSBram Moolenaar    enddef
382481e17fbeSBram Moolenaar    call s:Func()
382581e17fbeSBram Moolenaar    doau CursorHold
382681e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
382781e17fbeSBram Moolenaar    au! CursorHold
382881e17fbeSBram Moolenaar  END
382981e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
383081e17fbeSBram Moolenaarenddef
383181e17fbeSBram Moolenaar
3832b5841b99SBram Moolenaardef Test_error_in_autoload_script()
3833b5841b99SBram Moolenaar  var save_rtp = &rtp
3834b5841b99SBram Moolenaar  var dir = getcwd() .. '/Xruntime'
3835b5841b99SBram Moolenaar  &rtp = dir
3836b5841b99SBram Moolenaar  mkdir(dir .. '/autoload', 'p')
3837b5841b99SBram Moolenaar
3838b5841b99SBram Moolenaar  var lines =<< trim END
3839b5841b99SBram Moolenaar      vim9script noclear
3840b5841b99SBram Moolenaar      def script#autoloaded()
3841b5841b99SBram Moolenaar      enddef
3842b5841b99SBram Moolenaar      def Broken()
3843b5841b99SBram Moolenaar        var x: any = ''
3844b5841b99SBram Moolenaar        eval x != 0
3845b5841b99SBram Moolenaar      enddef
3846b5841b99SBram Moolenaar      Broken()
3847b5841b99SBram Moolenaar  END
3848b5841b99SBram Moolenaar  writefile(lines, dir .. '/autoload/script.vim')
3849b5841b99SBram Moolenaar
3850b5841b99SBram Moolenaar  lines =<< trim END
3851b5841b99SBram Moolenaar      vim9script
3852b5841b99SBram Moolenaar      def CallAutoloaded()
3853b5841b99SBram Moolenaar        script#autoloaded()
3854b5841b99SBram Moolenaar      enddef
3855b5841b99SBram Moolenaar
3856b5841b99SBram Moolenaar      function Legacy()
3857b5841b99SBram Moolenaar        try
3858b5841b99SBram Moolenaar          call s:CallAutoloaded()
3859b5841b99SBram Moolenaar        catch
3860b5841b99SBram Moolenaar          call assert_match('E1030: Using a String as a Number', v:exception)
3861b5841b99SBram Moolenaar        endtry
3862b5841b99SBram Moolenaar      endfunction
3863b5841b99SBram Moolenaar
3864b5841b99SBram Moolenaar      Legacy()
3865b5841b99SBram Moolenaar  END
3866b5841b99SBram Moolenaar  CheckScriptSuccess(lines)
3867b5841b99SBram Moolenaar
3868b5841b99SBram Moolenaar  &rtp = save_rtp
3869b5841b99SBram Moolenaar  delete(dir, 'rf')
3870b5841b99SBram Moolenaarenddef
3871b5841b99SBram Moolenaar
38723896a105SBram Moolenaardef Test_cmdline_win()
38733896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
38743896a105SBram Moolenaar  # the command line window.
38753896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3876cfcd011fSBram Moolenaar  var export_lines =<< trim END
38773896a105SBram Moolenaar    vim9script
3878cfcd011fSBram Moolenaar    export var That = 'yes'
38793896a105SBram Moolenaar  END
38803896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3881cfcd011fSBram Moolenaar  var import_lines =<< trim END
38823896a105SBram Moolenaar    vim9script
38833896a105SBram Moolenaar    import That from './Xexport.vim'
38843896a105SBram Moolenaar  END
38853896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3886cfcd011fSBram Moolenaar  var save_rtp = &rtp
38873896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
38883896a105SBram Moolenaar  syntax on
38893896a105SBram Moolenaar  augroup CmdWin
38903896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
38913896a105SBram Moolenaar  augroup END
38923896a105SBram Moolenaar  # this will open and also close the cmdline window
38933896a105SBram Moolenaar  feedkeys('q:', 'xt')
38943896a105SBram Moolenaar  assert_equal('yes', g:got_there)
38953896a105SBram Moolenaar
38963896a105SBram Moolenaar  augroup CmdWin
38973896a105SBram Moolenaar    au!
38983896a105SBram Moolenaar  augroup END
38993896a105SBram Moolenaar  &rtp = save_rtp
39003896a105SBram Moolenaar  delete('rtp', 'rf')
39013896a105SBram Moolenaarenddef
39023896a105SBram Moolenaar
3903e3d4685fSBram Moolenaardef Test_invalid_sid()
3904e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
390525859dd7SBram Moolenaar
39069c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3907d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3908e3d4685fSBram Moolenaar  endif
3909e3d4685fSBram Moolenaar  delete('Xdidit')
3910e3d4685fSBram Moolenaarenddef
3911e3d4685fSBram Moolenaar
39129ec7026fSBram Moolenaardef Test_restoring_cpo()
39139ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
39149ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
39159ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
39169ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
39179ec7026fSBram Moolenaar  endif
39189ec7026fSBram Moolenaar  delete('Xsourced')
39199ec7026fSBram Moolenaar  delete('Xclose')
3920090728adSBram Moolenaar  delete('Xdone')
39210123cc1eSBram Moolenaar
39220123cc1eSBram Moolenaar  writefile(['vim9script'], 'XanotherScript')
39230123cc1eSBram Moolenaar  set cpo=aABceFsMny>
39240123cc1eSBram Moolenaar  edit XanotherScript
39250123cc1eSBram Moolenaar  so %
39260123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
39270123cc1eSBram Moolenaar  :1del
39280123cc1eSBram Moolenaar  w
39290123cc1eSBram Moolenaar  so %
39300123cc1eSBram Moolenaar  assert_equal('aABceFsMny>', &cpo)
39310123cc1eSBram Moolenaar
39320123cc1eSBram Moolenaar  delete('XanotherScript')
39330123cc1eSBram Moolenaar  set cpo&vim
39349ec7026fSBram Moolenaarenddef
39359ec7026fSBram Moolenaar
3936ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands
3937ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo()
393837294bd6SBram Moolenaar  CheckScreendump
3939ffb7dcdbSBram Moolenaar  CheckFeature timers
394037294bd6SBram Moolenaar
3941ffb7dcdbSBram Moolenaar  let lines =<< trim END
394237294bd6SBram Moolenaar    vim9script
394337294bd6SBram Moolenaar    def script#func()
394437294bd6SBram Moolenaar    enddef
394537294bd6SBram Moolenaar  END
3946ffb7dcdbSBram Moolenaar  call mkdir('Xdir/autoload', 'p')
3947ffb7dcdbSBram Moolenaar  call writefile(lines, 'Xdir/autoload/script.vim')
394837294bd6SBram Moolenaar
3949ffb7dcdbSBram Moolenaar  let lines =<< trim END
395037294bd6SBram Moolenaar      vim9script
395137294bd6SBram Moolenaar      set cpo+=M
395237294bd6SBram Moolenaar      exe 'set rtp^=' .. getcwd() .. '/Xdir'
3953767034c5SBram Moolenaar      au CmdlineEnter : ++once timer_start(0, (_) => script#func())
395437294bd6SBram Moolenaar      setline(1, 'some text')
395537294bd6SBram Moolenaar  END
3956ffb7dcdbSBram Moolenaar  call writefile(lines, 'XTest_redraw_cpo')
3957ffb7dcdbSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3958ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "V:")
3959ffb7dcdbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
396037294bd6SBram Moolenaar
3961ffb7dcdbSBram Moolenaar  " clean up
3962ffb7dcdbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>u")
3963ffb7dcdbSBram Moolenaar  call StopVimInTerminal(buf)
3964ffb7dcdbSBram Moolenaar  call delete('XTest_redraw_cpo')
3965ffb7dcdbSBram Moolenaar  call delete('Xdir', 'rf')
3966ffb7dcdbSBram Moolenaarendfunc
396737294bd6SBram Moolenaar
39689ec7026fSBram Moolenaar
3969f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3970cfcd011fSBram Moolenaar  var lines =<< trim END
3971cfcd011fSBram Moolenaar    var name: any
3972cfcd011fSBram Moolenaar    assert_equal(0, name)
3973f0afd9e1SBram Moolenaar  END
3974f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3975f0afd9e1SBram Moolenaarenddef
3976f0afd9e1SBram Moolenaar
39777e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
397858dbef33SBram Moolenaar  CheckRunVimInTerminal
397958dbef33SBram Moolenaar
39807e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
39817e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
39827e9210eaSBram Moolenaarendfunc
39837e9210eaSBram Moolenaar
39847e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
39859c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3986cfcd011fSBram Moolenaar  var lines =<< trim END
39879c4f5520SBram Moolenaar    func CheckAndQuit()
39889c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
39899c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
39909c4f5520SBram Moolenaar    endfunc
39919c4f5520SBram Moolenaar  END
39929c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
39939c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3994e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
39959c4f5520SBram Moolenaar  # define Afunc() on the command line
39969c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
39979c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
39982949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
39999c4f5520SBram Moolenaar
40009c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
40019c4f5520SBram Moolenaar  delete('XcallFunc')
40029c4f5520SBram Moolenaar  delete('Xdidcmd')
40039c4f5520SBram Moolenaarenddef
40049c4f5520SBram Moolenaar
4005fcdc5d83SBram Moolenaardef Test_script_var_scope()
4006fcdc5d83SBram Moolenaar  var lines =<< trim END
4007fcdc5d83SBram Moolenaar      vim9script
4008fcdc5d83SBram Moolenaar      if true
4009fcdc5d83SBram Moolenaar        if true
4010fcdc5d83SBram Moolenaar          var one = 'one'
4011fcdc5d83SBram Moolenaar          echo one
4012fcdc5d83SBram Moolenaar        endif
4013fcdc5d83SBram Moolenaar        echo one
4014fcdc5d83SBram Moolenaar      endif
4015fcdc5d83SBram Moolenaar  END
4016fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
4017fcdc5d83SBram Moolenaar
4018fcdc5d83SBram Moolenaar  lines =<< trim END
4019fcdc5d83SBram Moolenaar      vim9script
4020fcdc5d83SBram Moolenaar      if true
4021fcdc5d83SBram Moolenaar        if false
4022fcdc5d83SBram Moolenaar          var one = 'one'
4023fcdc5d83SBram Moolenaar          echo one
4024fcdc5d83SBram Moolenaar        else
4025fcdc5d83SBram Moolenaar          var one = 'one'
4026fcdc5d83SBram Moolenaar          echo one
4027fcdc5d83SBram Moolenaar        endif
4028fcdc5d83SBram Moolenaar        echo one
4029fcdc5d83SBram Moolenaar      endif
4030fcdc5d83SBram Moolenaar  END
4031fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
4032fcdc5d83SBram Moolenaar
4033fcdc5d83SBram Moolenaar  lines =<< trim END
4034fcdc5d83SBram Moolenaar      vim9script
4035fcdc5d83SBram Moolenaar      while true
4036fcdc5d83SBram Moolenaar        var one = 'one'
4037fcdc5d83SBram Moolenaar        echo one
4038fcdc5d83SBram Moolenaar        break
4039fcdc5d83SBram Moolenaar      endwhile
4040fcdc5d83SBram Moolenaar      echo one
4041fcdc5d83SBram Moolenaar  END
4042fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
4043fcdc5d83SBram Moolenaar
4044fcdc5d83SBram Moolenaar  lines =<< trim END
4045fcdc5d83SBram Moolenaar      vim9script
4046fcdc5d83SBram Moolenaar      for i in range(1)
4047fcdc5d83SBram Moolenaar        var one = 'one'
4048fcdc5d83SBram Moolenaar        echo one
4049fcdc5d83SBram Moolenaar      endfor
4050fcdc5d83SBram Moolenaar      echo one
4051fcdc5d83SBram Moolenaar  END
4052fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
40539becdf2bSBram Moolenaar
40549becdf2bSBram Moolenaar  lines =<< trim END
40559becdf2bSBram Moolenaar      vim9script
40569becdf2bSBram Moolenaar      {
40579becdf2bSBram Moolenaar        var one = 'one'
40589becdf2bSBram Moolenaar        assert_equal('one', one)
40599becdf2bSBram Moolenaar      }
40609becdf2bSBram Moolenaar      assert_false(exists('one'))
40619becdf2bSBram Moolenaar      assert_false(exists('s:one'))
40629becdf2bSBram Moolenaar  END
40639becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
40649becdf2bSBram Moolenaar
40659becdf2bSBram Moolenaar  lines =<< trim END
40669becdf2bSBram Moolenaar      vim9script
40679becdf2bSBram Moolenaar      {
40689becdf2bSBram Moolenaar        var one = 'one'
40699becdf2bSBram Moolenaar        echo one
40709becdf2bSBram Moolenaar      }
40719becdf2bSBram Moolenaar      echo one
40729becdf2bSBram Moolenaar  END
40739becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
4074fcdc5d83SBram Moolenaarenddef
4075fcdc5d83SBram Moolenaar
4076352134bbSBram Moolenaardef Test_catch_exception_in_callback()
4077352134bbSBram Moolenaar  var lines =<< trim END
4078352134bbSBram Moolenaar    vim9script
40792a38908bSBram Moolenaar    def Callback(...l: list<any>)
4080352134bbSBram Moolenaar      try
4081352134bbSBram Moolenaar        var x: string
4082352134bbSBram Moolenaar        var y: string
4083352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
4084352134bbSBram Moolenaar        [x, y] = ['']
4085352134bbSBram Moolenaar      catch
4086352134bbSBram Moolenaar        g:caught = 'yes'
4087352134bbSBram Moolenaar      endtry
4088352134bbSBram Moolenaar    enddef
4089e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
4090352134bbSBram Moolenaar    feedkeys("\r", 'xt')
4091352134bbSBram Moolenaar  END
4092352134bbSBram Moolenaar  CheckScriptSuccess(lines)
4093352134bbSBram Moolenaar
4094352134bbSBram Moolenaar  unlet g:caught
4095352134bbSBram Moolenaarenddef
4096352134bbSBram Moolenaar
4097631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
4098631e8f93SBram Moolenaar  if !has('unix') || !has('job')
4099631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
4100631e8f93SBram Moolenaar  endif
4101631e8f93SBram Moolenaar  var lines =<< trim END
4102631e8f93SBram Moolenaar      vim9script
4103631e8f93SBram Moolenaar      var source: list<number>
41042a38908bSBram Moolenaar      def Out_cb(...l: list<any>)
4105631e8f93SBram Moolenaar          eval [][0]
4106631e8f93SBram Moolenaar      enddef
41072a38908bSBram Moolenaar      def Exit_cb(...l: list<any>)
4108631e8f93SBram Moolenaar          sleep 1m
4109631e8f93SBram Moolenaar          source += l
4110631e8f93SBram Moolenaar      enddef
4111e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
41126f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
41136f17a3f0SBram Moolenaar        sleep 10m
41146f17a3f0SBram Moolenaar      endwhile
4115206c2a6eSBram Moolenaar      # wait for Exit_cb() to be called
4116fe95b94fSBram Moolenaar      sleep 200m
4117631e8f93SBram Moolenaar  END
4118631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
4119631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
4120631e8f93SBram Moolenaar  delete('Xdef')
4121631e8f93SBram Moolenaarenddef
4122631e8f93SBram Moolenaar
41234324d87aSBram Moolenaardef InvokeNormal()
41244324d87aSBram Moolenaar  exe "norm! :m+1\r"
41254324d87aSBram Moolenaarenddef
41264324d87aSBram Moolenaar
41274324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
41284324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
41294324d87aSBram Moolenaar  new
41304324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
41314324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
41324324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
41334324d87aSBram Moolenaar  xunmap <F3>
4134b5b9480eSBram Moolenaarenddef
4135b5b9480eSBram Moolenaar
4136b5b9480eSBram Moolenaardef Test_white_space_after_command()
4137b5b9480eSBram Moolenaar  var lines =<< trim END
4138b5b9480eSBram Moolenaar    exit_cb: Func})
4139b5b9480eSBram Moolenaar  END
4140b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
4141f8103f27SBram Moolenaar
4142f8103f27SBram Moolenaar  lines =<< trim END
4143f8103f27SBram Moolenaar    e#
4144f8103f27SBram Moolenaar  END
4145f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
41464324d87aSBram Moolenaarenddef
41474324d87aSBram Moolenaar
41484aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
41494aab88d9SBram Moolenaar  var lines =<< trim END
41504aab88d9SBram Moolenaar      vim9script
41514aab88d9SBram Moolenaar      if exists('g:guard')
41524aab88d9SBram Moolenaar        finish
41534aab88d9SBram Moolenaar      endif
41544aab88d9SBram Moolenaar      g:guard = 1
41554aab88d9SBram Moolenaar      var name = 'thename'
41564aab88d9SBram Moolenaar      def g:GetName(): string
41574aab88d9SBram Moolenaar        return name
41584aab88d9SBram Moolenaar      enddef
41594aab88d9SBram Moolenaar      def g:SetName(arg: string)
41604aab88d9SBram Moolenaar        name = arg
41614aab88d9SBram Moolenaar      enddef
41624aab88d9SBram Moolenaar  END
41634aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
41644aab88d9SBram Moolenaar  so XscriptTwice.vim
41654aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
41664aab88d9SBram Moolenaar  g:SetName('newname')
41674aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
41684aab88d9SBram Moolenaar  so XscriptTwice.vim
41694aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
41704aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
41714aab88d9SBram Moolenaar
41724aab88d9SBram Moolenaar  delfunc g:GetName
41734aab88d9SBram Moolenaar  delfunc g:SetName
41744aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
41754aab88d9SBram Moolenaar  unlet g:guard
41764aab88d9SBram Moolenaarenddef
41774aab88d9SBram Moolenaar
41784aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
41794aab88d9SBram Moolenaar  var exportlines =<< trim END
41804aab88d9SBram Moolenaar      vim9script
41814aab88d9SBram Moolenaar      if exists('g:guard')
41824aab88d9SBram Moolenaar        finish
41834aab88d9SBram Moolenaar      endif
41844aab88d9SBram Moolenaar      g:guard = 1
41854aab88d9SBram Moolenaar      export var name = 'someName'
41864aab88d9SBram Moolenaar  END
41874aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
41884aab88d9SBram Moolenaar
41894aab88d9SBram Moolenaar  var lines =<< trim END
41904aab88d9SBram Moolenaar      vim9script
41914aab88d9SBram Moolenaar      import name from './XexportScript.vim'
41924aab88d9SBram Moolenaar      def g:GetName(): string
41934aab88d9SBram Moolenaar        return name
41944aab88d9SBram Moolenaar      enddef
41954aab88d9SBram Moolenaar  END
41964aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
41974aab88d9SBram Moolenaar  so XscriptImport.vim
41984aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
41994aab88d9SBram Moolenaar
42004aab88d9SBram Moolenaar  so XexportScript.vim
42014aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
42024aab88d9SBram Moolenaar
42034aab88d9SBram Moolenaar  delfunc g:GetName
42044aab88d9SBram Moolenaar  delete('XexportScript.vim')
42054aab88d9SBram Moolenaar  delete('XscriptImport.vim')
42064aab88d9SBram Moolenaar  unlet g:guard
42074aab88d9SBram Moolenaarenddef
42084aab88d9SBram Moolenaar
420910b9421fSBram Moolenaardef Test_unsupported_commands()
421010b9421fSBram Moolenaar  var lines =<< trim END
421110b9421fSBram Moolenaar      ka
421210b9421fSBram Moolenaar  END
42137d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
42147d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
421510b9421fSBram Moolenaar
421610b9421fSBram Moolenaar  lines =<< trim END
4217ada1d870SBram Moolenaar      :1ka
4218ada1d870SBram Moolenaar  END
42197d840e9aSBram Moolenaar  CheckDefFailure(lines, 'E476:')
42207d840e9aSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E492:')
4221ada1d870SBram Moolenaar
4222ada1d870SBram Moolenaar  lines =<< trim END
422310b9421fSBram Moolenaar    t
422410b9421fSBram Moolenaar  END
422510b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
422610b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
422710b9421fSBram Moolenaar
422810b9421fSBram Moolenaar  lines =<< trim END
422910b9421fSBram Moolenaar    x
423010b9421fSBram Moolenaar  END
423110b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
423210b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
423310b9421fSBram Moolenaar
423410b9421fSBram Moolenaar  lines =<< trim END
423510b9421fSBram Moolenaar    xit
423610b9421fSBram Moolenaar  END
423710b9421fSBram Moolenaar  CheckDefFailure(lines, 'E1100:')
423810b9421fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1100:')
423910b9421fSBram Moolenaarenddef
424010b9421fSBram Moolenaar
4241c70fe460SBram Moolenaardef Test_mapping_line_number()
4242c70fe460SBram Moolenaar  var lines =<< trim END
4243c70fe460SBram Moolenaar      vim9script
4244c70fe460SBram Moolenaar      def g:FuncA()
4245c70fe460SBram Moolenaar          # Some comment
4246c70fe460SBram Moolenaar          FuncB(0)
4247c70fe460SBram Moolenaar      enddef
4248c70fe460SBram Moolenaar          # Some comment
4249c70fe460SBram Moolenaar      def FuncB(
4250c70fe460SBram Moolenaar          # Some comment
4251c70fe460SBram Moolenaar          n: number
4252c70fe460SBram Moolenaar      )
4253c70fe460SBram Moolenaar          exe 'nno '
4254c70fe460SBram Moolenaar              # Some comment
4255c70fe460SBram Moolenaar              .. '<F3> a'
4256c70fe460SBram Moolenaar              .. 'b'
4257c70fe460SBram Moolenaar              .. 'c'
4258c70fe460SBram Moolenaar      enddef
4259c70fe460SBram Moolenaar  END
4260c70fe460SBram Moolenaar  CheckScriptSuccess(lines)
4261c70fe460SBram Moolenaar  var res = execute('verbose nmap <F3>')
4262c70fe460SBram Moolenaar  assert_match('No mapping found', res)
4263c70fe460SBram Moolenaar
4264c70fe460SBram Moolenaar  g:FuncA()
4265c70fe460SBram Moolenaar  res = execute('verbose nmap <F3>')
4266c70fe460SBram Moolenaar  assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4267c70fe460SBram Moolenaar
4268c70fe460SBram Moolenaar  nunmap <F3>
4269c70fe460SBram Moolenaar  delfunc g:FuncA
4270c70fe460SBram Moolenaarenddef
4271c70fe460SBram Moolenaar
4272deb108baSBram Moolenaardef Test_option_set()
4273deb108baSBram Moolenaar  # legacy script allows for white space
4274deb108baSBram Moolenaar  var lines =<< trim END
4275deb108baSBram Moolenaar      set foldlevel  =11
4276deb108baSBram Moolenaar      call assert_equal(11, &foldlevel)
4277deb108baSBram Moolenaar  END
4278deb108baSBram Moolenaar  CheckScriptSuccess(lines)
4279deb108baSBram Moolenaar
4280deb108baSBram Moolenaar  set foldlevel
4281deb108baSBram Moolenaar  set foldlevel=12
4282deb108baSBram Moolenaar  assert_equal(12, &foldlevel)
4283deb108baSBram Moolenaar  set foldlevel+=2
4284deb108baSBram Moolenaar  assert_equal(14, &foldlevel)
4285deb108baSBram Moolenaar  set foldlevel-=3
4286deb108baSBram Moolenaar  assert_equal(11, &foldlevel)
4287deb108baSBram Moolenaar
4288deb108baSBram Moolenaar  lines =<< trim END
4289deb108baSBram Moolenaar      set foldlevel =1
4290deb108baSBram Moolenaar  END
4291deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
4292deb108baSBram Moolenaar
4293deb108baSBram Moolenaar  lines =<< trim END
4294deb108baSBram Moolenaar      set foldlevel +=1
4295deb108baSBram Moolenaar  END
4296deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
4297deb108baSBram Moolenaar
4298deb108baSBram Moolenaar  lines =<< trim END
4299deb108baSBram Moolenaar      set foldlevel ^=1
4300deb108baSBram Moolenaar  END
4301deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
4302deb108baSBram Moolenaar
4303deb108baSBram Moolenaar  lines =<< trim END
4304deb108baSBram Moolenaar      set foldlevel -=1
4305deb108baSBram Moolenaar  END
4306deb108baSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
4307deb108baSBram Moolenaar
4308deb108baSBram Moolenaar  set foldlevel&
4309deb108baSBram Moolenaarenddef
4310deb108baSBram Moolenaar
4311208f0b48SBram Moolenaardef Test_option_modifier()
43121594f313SBram Moolenaar  # legacy script allows for white space
4313208f0b48SBram Moolenaar  var lines =<< trim END
4314208f0b48SBram Moolenaar      set hlsearch &  hlsearch  !
4315208f0b48SBram Moolenaar      call assert_equal(1, &hlsearch)
4316208f0b48SBram Moolenaar  END
4317208f0b48SBram Moolenaar  CheckScriptSuccess(lines)
4318208f0b48SBram Moolenaar
43191594f313SBram Moolenaar  set hlsearch
43201594f313SBram Moolenaar  set hlsearch!
43211594f313SBram Moolenaar  assert_equal(false, &hlsearch)
43221594f313SBram Moolenaar
43231594f313SBram Moolenaar  set hlsearch
4324208f0b48SBram Moolenaar  set hlsearch&
43251594f313SBram Moolenaar  assert_equal(false, &hlsearch)
4326208f0b48SBram Moolenaar
4327208f0b48SBram Moolenaar  lines =<< trim END
43281594f313SBram Moolenaar      set hlsearch &
4329208f0b48SBram Moolenaar  END
43301594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
43311594f313SBram Moolenaar
43321594f313SBram Moolenaar  lines =<< trim END
43331594f313SBram Moolenaar      set hlsearch   !
43341594f313SBram Moolenaar  END
43351594f313SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
43361594f313SBram Moolenaar
43371594f313SBram Moolenaar  set hlsearch&
4338208f0b48SBram Moolenaarenddef
4339208f0b48SBram Moolenaar
4340c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail
4341c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number()
4342c03fe66aSBram Moolenaar  var lines =<< trim END
4343c03fe66aSBram Moolenaar      echoerr 'some'
4344c03fe66aSBram Moolenaar         .. ' error'
4345c03fe66aSBram Moolenaar         .. ' continued'
4346c03fe66aSBram Moolenaar  END
4347c03fe66aSBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
4348c03fe66aSBram Moolenaarenddef
4349c03fe66aSBram Moolenaar
4350648594eaSBram Moolenaardef ProfiledWithLambda()
4351d9162550SBram Moolenaar  var n = 3
4352d9162550SBram Moolenaar  echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4353d9162550SBram Moolenaarenddef
4354d9162550SBram Moolenaar
4355648594eaSBram Moolenaardef ProfiledNested()
4356648594eaSBram Moolenaar  var x = 0
4357648594eaSBram Moolenaar  def Nested(): any
4358648594eaSBram Moolenaar      return x
4359648594eaSBram Moolenaar  enddef
4360648594eaSBram Moolenaar  Nested()
4361648594eaSBram Moolenaarenddef
4362648594eaSBram Moolenaar
4363ffcfddc7SBram Moolenaardef ProfiledNestedProfiled()
4364ffcfddc7SBram Moolenaar  var x = 0
4365ffcfddc7SBram Moolenaar  def Nested(): any
4366ffcfddc7SBram Moolenaar      return x
4367ffcfddc7SBram Moolenaar  enddef
4368ffcfddc7SBram Moolenaar  Nested()
4369ffcfddc7SBram Moolenaarenddef
4370ffcfddc7SBram Moolenaar
4371d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists.
4372d9162550SBram Moolenaar" This only tests that it works, not the profiling output.
4373d9162550SBram Moolenaardef Test_xx_profile_with_lambda()
43744ece152aSBram Moolenaar  CheckFeature profile
43754ece152aSBram Moolenaar
4376d9162550SBram Moolenaar  profile start Xprofile.log
4377648594eaSBram Moolenaar  profile func ProfiledWithLambda
4378648594eaSBram Moolenaar  ProfiledWithLambda()
4379ffcfddc7SBram Moolenaar
4380648594eaSBram Moolenaar  profile func ProfiledNested
4381648594eaSBram Moolenaar  ProfiledNested()
4382ffcfddc7SBram Moolenaar
4383ffcfddc7SBram Moolenaar  # Also profile the nested function.  Use a different function, although the
4384ffcfddc7SBram Moolenaar  # contents is the same, to make sure it was not already compiled.
4385ffcfddc7SBram Moolenaar  profile func *
4386ffcfddc7SBram Moolenaar  ProfiledNestedProfiled()
4387ffcfddc7SBram Moolenaar
4388ffcfddc7SBram Moolenaar  profdel func *
4389ffcfddc7SBram Moolenaar  profile pause
4390d9162550SBram Moolenaarenddef
4391d9162550SBram Moolenaar
4392585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
4393585fea7bSBram Moolenaardef Test_substitute_cmd()
4394585fea7bSBram Moolenaar  new
4395585fea7bSBram Moolenaar  setline(1, 'something')
4396585fea7bSBram Moolenaar  :substitute(some(other(
4397585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
4398585fea7bSBram Moolenaar  bwipe!
4399585fea7bSBram Moolenaar
4400f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
4401cfcd011fSBram Moolenaar  var lines =<< trim END
4402585fea7bSBram Moolenaar    vim9script
4403585fea7bSBram Moolenaar    new
4404585fea7bSBram Moolenaar    setline(1, 'something')
4405585fea7bSBram Moolenaar    :substitute(some(other(
4406585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
4407585fea7bSBram Moolenaar    bwipe!
4408585fea7bSBram Moolenaar  END
4409585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
4410585fea7bSBram Moolenaar  source Xvim9lines
4411585fea7bSBram Moolenaar
4412585fea7bSBram Moolenaar  delete('Xvim9lines')
4413585fea7bSBram Moolenaarenddef
4414585fea7bSBram Moolenaar
44158a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
4416