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
88a7d6542SBram Moolenaar
95d72ce69SBram Moolenaardef Test_range_only()
105d72ce69SBram Moolenaar  new
115d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
125d72ce69SBram Moolenaar  :/Blah/
135d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
14c2af0affSBram Moolenaar  bwipe!
15c2af0affSBram Moolenaar
16c2af0affSBram Moolenaar  # without range commands use current line
17c2af0affSBram Moolenaar  new
18c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
19c2af0affSBram Moolenaar  :2
20c2af0affSBram Moolenaar  print
21c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
22c2af0affSBram Moolenaar  :3
23c2af0affSBram Moolenaar  list
24c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
25c2af0affSBram Moolenaar  bwipe!
26025cb1caSBram Moolenaar
27025cb1caSBram Moolenaar  # won't generate anything
28025cb1caSBram Moolenaar  if false
29025cb1caSBram Moolenaar    :123
30025cb1caSBram Moolenaar  endif
315d72ce69SBram Moolenaarenddef
325d72ce69SBram Moolenaar
33a6e67e4fSBram Moolenaarlet g:alist = [7]
34a6e67e4fSBram Moolenaarlet g:astring = 'text'
35f0b9f43cSBram Moolenaarlet g:anumber = 123
366e587dcbSBram Moolenaar
374c17ad94SBram Moolenaardef Test_delfunction()
38f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
394c17ad94SBram Moolenaar  CheckScriptSuccess([
404c17ad94SBram Moolenaar      'vim9script',
414c17ad94SBram Moolenaar      'func CheckMe()',
424c17ad94SBram Moolenaar      '  return 123',
434c17ad94SBram Moolenaar      'endfunc',
444c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
454c17ad94SBram Moolenaar      ])
464c17ad94SBram Moolenaar
47f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
484c17ad94SBram Moolenaar  CheckScriptFailure([
494c17ad94SBram Moolenaar      'vim9script',
504c17ad94SBram Moolenaar      'func DeleteMe1()',
514c17ad94SBram Moolenaar      'endfunc',
524c17ad94SBram Moolenaar      'delfunction DeleteMe1',
534c17ad94SBram Moolenaar      ], 'E1084:')
544c17ad94SBram Moolenaar  CheckScriptFailure([
554c17ad94SBram Moolenaar      'vim9script',
564c17ad94SBram Moolenaar      'func DeleteMe2()',
574c17ad94SBram Moolenaar      'endfunc',
584c17ad94SBram Moolenaar      'def DoThat()',
594c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
604c17ad94SBram Moolenaar      'enddef',
614c17ad94SBram Moolenaar      'DoThat()',
624c17ad94SBram Moolenaar      ], 'E1084:')
634c17ad94SBram Moolenaar  CheckScriptFailure([
644c17ad94SBram Moolenaar      'vim9script',
654c17ad94SBram Moolenaar      'def DeleteMe3()',
664c17ad94SBram Moolenaar      'enddef',
674c17ad94SBram Moolenaar      'delfunction DeleteMe3',
684c17ad94SBram Moolenaar      ], 'E1084:')
694c17ad94SBram Moolenaar  CheckScriptFailure([
704c17ad94SBram Moolenaar      'vim9script',
714c17ad94SBram Moolenaar      'def DeleteMe4()',
724c17ad94SBram Moolenaar      'enddef',
734c17ad94SBram Moolenaar      'def DoThat()',
744c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
754c17ad94SBram Moolenaar      'enddef',
764c17ad94SBram Moolenaar      'DoThat()',
774c17ad94SBram Moolenaar      ], 'E1084:')
78925e9fd6SBram Moolenaar
79925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
80cfcd011fSBram Moolenaar  var lines =<< trim END
81925e9fd6SBram Moolenaar      vim9script
82925e9fd6SBram Moolenaar      def g:Global(): string
83925e9fd6SBram Moolenaar        return "yes"
84925e9fd6SBram Moolenaar      enddef
85925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
86925e9fd6SBram Moolenaar      def! g:Global(): string
87925e9fd6SBram Moolenaar        return "no"
88925e9fd6SBram Moolenaar      enddef
89925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
90925e9fd6SBram Moolenaar      delfunc g:Global
91925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
92925e9fd6SBram Moolenaar  END
93925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
94925e9fd6SBram Moolenaar
95925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
96925e9fd6SBram Moolenaar  lines =<< trim END
97925e9fd6SBram Moolenaar      vim9script
98925e9fd6SBram Moolenaar      func g:Global()
99925e9fd6SBram Moolenaar        return "yes"
100925e9fd6SBram Moolenaar      endfunc
101925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
102925e9fd6SBram Moolenaar      def! g:Global(): string
103925e9fd6SBram Moolenaar        return "no"
104925e9fd6SBram Moolenaar      enddef
105925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
106925e9fd6SBram Moolenaar      delfunc g:Global
107925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
108925e9fd6SBram Moolenaar  END
109925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
110925e9fd6SBram Moolenaar
111925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
112925e9fd6SBram Moolenaar  lines =<< trim END
113925e9fd6SBram Moolenaar      vim9script
114925e9fd6SBram Moolenaar      def g:Global(): string
115925e9fd6SBram Moolenaar        return "yes"
116925e9fd6SBram Moolenaar      enddef
117925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
118925e9fd6SBram Moolenaar      func! g:Global()
119925e9fd6SBram Moolenaar        return "no"
120925e9fd6SBram Moolenaar      endfunc
121925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
122925e9fd6SBram Moolenaar      delfunc g:Global
123925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
124925e9fd6SBram Moolenaar  END
125925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1264c17ad94SBram Moolenaarenddef
1274c17ad94SBram Moolenaar
12808052228SBram Moolenaardef Test_wrong_type()
129cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
130cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
131cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
132cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
133599c89c8SBram Moolenaar
134cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
135cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
13642a480bfSBram Moolenaar
137cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
138cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
139cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
140cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
143cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
144cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
145cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
146cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
147cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
148a0a9f43aSBram Moolenaar
149cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
150cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
15108052228SBram Moolenaarenddef
1528a7d6542SBram Moolenaar
15310c65860SBram Moolenaardef Test_script_wrong_type()
15410c65860SBram Moolenaar  var lines =<< trim END
15510c65860SBram Moolenaar      vim9script
15610c65860SBram Moolenaar      var s:dict: dict<string>
15710c65860SBram Moolenaar      s:dict['a'] = ['x']
15810c65860SBram Moolenaar  END
15910c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
16010c65860SBram Moolenaarenddef
16110c65860SBram Moolenaar
16208052228SBram Moolenaardef Test_const()
163cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
164cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
165cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
16630fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
16730fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
168dbeecb2bSBram Moolenaar
169cfcd011fSBram Moolenaar  var lines =<< trim END
17030fd8204SBram Moolenaar    final list = [1, 2, 3]
171dbeecb2bSBram Moolenaar    list[0] = 4
1720b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
17330fd8204SBram Moolenaar    const other = [5, 6, 7]
1740b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
17571abe482SBram Moolenaar
176cfcd011fSBram Moolenaar    var varlist = [7, 8]
17730fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
17871abe482SBram Moolenaar    varlist[0] = 77
17971abe482SBram Moolenaar    # TODO: does not work yet
18071abe482SBram Moolenaar    # constlist[1][1] = 88
181cfcd011fSBram Moolenaar    var cl = constlist[1]
18271abe482SBram Moolenaar    cl[1] = 88
18371abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
18471abe482SBram Moolenaar
185e0de171eSBram Moolenaar    var vardict = {five: 5, six: 6}
186e0de171eSBram Moolenaar    const constdict = {one: 1, two: vardict, three: 3}
18771abe482SBram Moolenaar    vardict['five'] = 55
18871abe482SBram Moolenaar    # TODO: does not work yet
18971abe482SBram Moolenaar    # constdict['two']['six'] = 66
190cfcd011fSBram Moolenaar    var cd = constdict['two']
19171abe482SBram Moolenaar    cd['six'] = 66
192e0de171eSBram Moolenaar    constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
193dbeecb2bSBram Moolenaar  END
194dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
19508052228SBram Moolenaarenddef
1968a7d6542SBram Moolenaar
1970b4c66c6SBram Moolenaardef Test_const_bang()
198cfcd011fSBram Moolenaar  var lines =<< trim END
19930fd8204SBram Moolenaar      const var = 234
2000b4c66c6SBram Moolenaar      var = 99
2010b4c66c6SBram Moolenaar  END
2020b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
2030b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
2040b4c66c6SBram Moolenaar
2050b4c66c6SBram Moolenaar  lines =<< trim END
20630fd8204SBram Moolenaar      const ll = [2, 3, 4]
2070b4c66c6SBram Moolenaar      ll[0] = 99
2080b4c66c6SBram Moolenaar  END
2090b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2100b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2110b4c66c6SBram Moolenaar
2120b4c66c6SBram Moolenaar  lines =<< trim END
21330fd8204SBram Moolenaar      const ll = [2, 3, 4]
2140b4c66c6SBram Moolenaar      ll[3] = 99
2150b4c66c6SBram Moolenaar  END
2160b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2170b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2180b4c66c6SBram Moolenaar
2190b4c66c6SBram Moolenaar  lines =<< trim END
220e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2210b4c66c6SBram Moolenaar      dd["one"] = 99
2220b4c66c6SBram Moolenaar  END
2230b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2240b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2250b4c66c6SBram Moolenaar
2260b4c66c6SBram Moolenaar  lines =<< trim END
227e0de171eSBram Moolenaar      const dd = {one: 1, two: 2}
2280b4c66c6SBram Moolenaar      dd["three"] = 99
2290b4c66c6SBram Moolenaar  END
2300b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2310b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2320b4c66c6SBram Moolenaarenddef
2330b4c66c6SBram Moolenaar
234df069eecSBram Moolenaardef Test_range_no_colon()
235d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
236d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
237d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
238d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
239df069eecSBram Moolenaarenddef
240df069eecSBram Moolenaar
241df069eecSBram Moolenaar
2428a7d6542SBram Moolenaardef Test_block()
243cfcd011fSBram Moolenaar  var outer = 1
2448a7d6542SBram Moolenaar  {
245cfcd011fSBram Moolenaar    var inner = 2
2468a7d6542SBram Moolenaar    assert_equal(1, outer)
2478a7d6542SBram Moolenaar    assert_equal(2, inner)
2488a7d6542SBram Moolenaar  }
2498a7d6542SBram Moolenaar  assert_equal(1, outer)
2508a7d6542SBram Moolenaarenddef
2518a7d6542SBram Moolenaar
25208052228SBram Moolenaardef Test_block_failure()
253cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
25408052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
25508052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
25608052228SBram Moolenaarenddef
2578a7d6542SBram Moolenaar
258fbbcd003SBram Moolenaardef Test_block_local_vars()
259fbbcd003SBram Moolenaar  var lines =<< trim END
260fbbcd003SBram Moolenaar      vim9script
261ed234f24SBram Moolenaar      v:testing = 1
262fbbcd003SBram Moolenaar      if true
263ed234f24SBram Moolenaar        var text = ['hello']
264ed234f24SBram Moolenaar        def SayHello(): list<string>
265fbbcd003SBram Moolenaar          return text
266fbbcd003SBram Moolenaar        enddef
267fbbcd003SBram Moolenaar        def SetText(v: string)
268ed234f24SBram Moolenaar          text = [v]
269fbbcd003SBram Moolenaar        enddef
270fbbcd003SBram Moolenaar      endif
271fbbcd003SBram Moolenaar
272fbbcd003SBram Moolenaar      if true
273ed234f24SBram Moolenaar        var text = ['again']
274ed234f24SBram Moolenaar        def SayAgain(): list<string>
275fbbcd003SBram Moolenaar          return text
276fbbcd003SBram Moolenaar        enddef
277fbbcd003SBram Moolenaar      endif
278ed234f24SBram Moolenaar
279ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
280ed234f24SBram Moolenaar      test_garbagecollect_now()
281ed234f24SBram Moolenaar
282fbbcd003SBram Moolenaar      defcompile
283fbbcd003SBram Moolenaar
284ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
285ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
286fbbcd003SBram Moolenaar
287fbbcd003SBram Moolenaar      SetText('foobar')
288ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
289ed234f24SBram Moolenaar
290ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
291ed234f24SBram Moolenaar      qall!
292fbbcd003SBram Moolenaar  END
293ed234f24SBram Moolenaar
294ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
295ed234f24SBram Moolenaar  # context gets garbage collected.
296ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
297ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
298ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
299ed234f24SBram Moolenaar
300ed234f24SBram Moolenaar  delete('Xscript')
301ed234f24SBram Moolenaar  delete('Xdidit')
302fbbcd003SBram Moolenaarenddef
303fbbcd003SBram Moolenaar
30439ca4127SBram Moolenaardef Test_block_local_vars_with_func()
30539ca4127SBram Moolenaar  var lines =<< trim END
30639ca4127SBram Moolenaar      vim9script
30739ca4127SBram Moolenaar      if true
30839ca4127SBram Moolenaar        var foo = 'foo'
30939ca4127SBram Moolenaar        if true
31039ca4127SBram Moolenaar          var bar = 'bar'
31139ca4127SBram Moolenaar          def Func(): list<string>
31239ca4127SBram Moolenaar            return [foo, bar]
31339ca4127SBram Moolenaar          enddef
31439ca4127SBram Moolenaar        endif
31539ca4127SBram Moolenaar      endif
31639ca4127SBram Moolenaar      # function is compiled here, after blocks have finished, can still access
31739ca4127SBram Moolenaar      # "foo" and "bar"
31839ca4127SBram Moolenaar      assert_equal(['foo', 'bar'], Func())
31939ca4127SBram Moolenaar  END
32039ca4127SBram Moolenaar  CheckScriptSuccess(lines)
32139ca4127SBram Moolenaarenddef
32239ca4127SBram Moolenaar
323d032f34aSBram Moolenaarfunc g:NoSuchFunc()
324d032f34aSBram Moolenaar  echo 'none'
325d032f34aSBram Moolenaarendfunc
326d032f34aSBram Moolenaar
3279e1d9e34SBram Moolenaardef Test_try_catch_throw()
328cfcd011fSBram Moolenaar  var l = []
3297a092245SBram Moolenaar  try # comment
3308a7d6542SBram Moolenaar    add(l, '1')
3318a7d6542SBram Moolenaar    throw 'wrong'
3328a7d6542SBram Moolenaar    add(l, '2')
3337a092245SBram Moolenaar  catch # comment
3348a7d6542SBram Moolenaar    add(l, v:exception)
3357a092245SBram Moolenaar  finally # comment
3368a7d6542SBram Moolenaar    add(l, '3')
3377a092245SBram Moolenaar  endtry # comment
3388a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
33968d130c6SBram Moolenaar
340e859312eSBram Moolenaar  l = []
341e859312eSBram Moolenaar  try
342e859312eSBram Moolenaar    try
343e859312eSBram Moolenaar      add(l, '1')
344e859312eSBram Moolenaar      throw 'wrong'
345e859312eSBram Moolenaar      add(l, '2')
346e859312eSBram Moolenaar    catch /right/
347e859312eSBram Moolenaar      add(l, v:exception)
348e859312eSBram Moolenaar    endtry
349e859312eSBram Moolenaar  catch /wrong/
350e859312eSBram Moolenaar    add(l, 'caught')
351373863edSBram Moolenaar  fina
352e859312eSBram Moolenaar    add(l, 'finally')
353e859312eSBram Moolenaar  endtry
354e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
355e859312eSBram Moolenaar
356cfcd011fSBram Moolenaar  var n: number
35768d130c6SBram Moolenaar  try
35868d130c6SBram Moolenaar    n = l[3]
35968d130c6SBram Moolenaar  catch /E684:/
36068d130c6SBram Moolenaar    n = 99
36168d130c6SBram Moolenaar  endtry
36268d130c6SBram Moolenaar  assert_equal(99, n)
36368d130c6SBram Moolenaar
36469f7050cSBram Moolenaar  var done = 'no'
36569f7050cSBram Moolenaar  if 0
36669f7050cSBram Moolenaar    try | catch | endtry
36769f7050cSBram Moolenaar  else
36869f7050cSBram Moolenaar    done = 'yes'
36969f7050cSBram Moolenaar  endif
37069f7050cSBram Moolenaar  assert_equal('yes', done)
37169f7050cSBram Moolenaar
37269f7050cSBram Moolenaar  done = 'no'
37369f7050cSBram Moolenaar  if 1
37469f7050cSBram Moolenaar    done = 'yes'
37569f7050cSBram Moolenaar  else
37669f7050cSBram Moolenaar    try | catch | endtry
37769f7050cSBram Moolenaar    done = 'never'
37869f7050cSBram Moolenaar  endif
37969f7050cSBram Moolenaar  assert_equal('yes', done)
38069f7050cSBram Moolenaar
38169f7050cSBram Moolenaar  if 1
38269f7050cSBram Moolenaar  else
38369f7050cSBram Moolenaar    try | catch /pat/ | endtry
38469f7050cSBram Moolenaar    try | catch /pat/
38569f7050cSBram Moolenaar    endtry
38669f7050cSBram Moolenaar    try
38769f7050cSBram Moolenaar    catch /pat/ | endtry
38869f7050cSBram Moolenaar    try
38969f7050cSBram Moolenaar    catch /pat/
39069f7050cSBram Moolenaar    endtry
39169f7050cSBram Moolenaar  endif
39269f7050cSBram Moolenaar
39368d130c6SBram Moolenaar  try
394cc673e74SBram Moolenaar    # string slice returns a string, not a number
39568d130c6SBram Moolenaar    n = g:astring[3]
3965e654230SBram Moolenaar  catch /E1012:/
39768d130c6SBram Moolenaar    n = 77
39868d130c6SBram Moolenaar  endtry
39968d130c6SBram Moolenaar  assert_equal(77, n)
40068d130c6SBram Moolenaar
40168d130c6SBram Moolenaar  try
40268d130c6SBram Moolenaar    n = l[g:astring]
4035e654230SBram Moolenaar  catch /E1012:/
40456acb094SBram Moolenaar    n = 88
40568d130c6SBram Moolenaar  endtry
40656acb094SBram Moolenaar  assert_equal(88, n)
40768d130c6SBram Moolenaar
40868d130c6SBram Moolenaar  try
40968d130c6SBram Moolenaar    n = s:does_not_exist
41068d130c6SBram Moolenaar  catch /E121:/
411f0b9f43cSBram Moolenaar    n = 111
412f0b9f43cSBram Moolenaar  endtry
413f0b9f43cSBram Moolenaar  assert_equal(111, n)
414f0b9f43cSBram Moolenaar
415f0b9f43cSBram Moolenaar  try
416f0b9f43cSBram Moolenaar    n = g:does_not_exist
417f0b9f43cSBram Moolenaar  catch /E121:/
41868d130c6SBram Moolenaar    n = 121
41968d130c6SBram Moolenaar  endtry
42068d130c6SBram Moolenaar  assert_equal(121, n)
42168d130c6SBram Moolenaar
422e0de171eSBram Moolenaar  var d = {one: 1}
42368d130c6SBram Moolenaar  try
42468d130c6SBram Moolenaar    n = d[g:astring]
42568d130c6SBram Moolenaar  catch /E716:/
42668d130c6SBram Moolenaar    n = 222
42768d130c6SBram Moolenaar  endtry
42868d130c6SBram Moolenaar  assert_equal(222, n)
429f0b9f43cSBram Moolenaar
430f0b9f43cSBram Moolenaar  try
431f0b9f43cSBram Moolenaar    n = -g:astring
432f0b9f43cSBram Moolenaar  catch /E39:/
433f0b9f43cSBram Moolenaar    n = 233
434f0b9f43cSBram Moolenaar  endtry
435f0b9f43cSBram Moolenaar  assert_equal(233, n)
436f0b9f43cSBram Moolenaar
437f0b9f43cSBram Moolenaar  try
438f0b9f43cSBram Moolenaar    n = +g:astring
439f0b9f43cSBram Moolenaar  catch /E1030:/
440f0b9f43cSBram Moolenaar    n = 244
441f0b9f43cSBram Moolenaar  endtry
442f0b9f43cSBram Moolenaar  assert_equal(244, n)
443f0b9f43cSBram Moolenaar
444f0b9f43cSBram Moolenaar  try
445f0b9f43cSBram Moolenaar    n = +g:alist
446f0b9f43cSBram Moolenaar  catch /E745:/
447f0b9f43cSBram Moolenaar    n = 255
448f0b9f43cSBram Moolenaar  endtry
449f0b9f43cSBram Moolenaar  assert_equal(255, n)
450f0b9f43cSBram Moolenaar
451cfcd011fSBram Moolenaar  var nd: dict<any>
452f0b9f43cSBram Moolenaar  try
4532bede173SBram Moolenaar    nd = {[g:anumber]: 1}
4545e654230SBram Moolenaar  catch /E1012:/
455f0b9f43cSBram Moolenaar    n = 266
456f0b9f43cSBram Moolenaar  endtry
457f0b9f43cSBram Moolenaar  assert_equal(266, n)
458f0b9f43cSBram Moolenaar
459f0b9f43cSBram Moolenaar  try
460f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
461f0b9f43cSBram Moolenaar  catch /E1093:/
462f0b9f43cSBram Moolenaar    n = 277
463f0b9f43cSBram Moolenaar  endtry
464f0b9f43cSBram Moolenaar  assert_equal(277, n)
465f0b9f43cSBram Moolenaar
466e859312eSBram Moolenaar  try
467e859312eSBram Moolenaar    &ts = g:astring
4685e654230SBram Moolenaar  catch /E1012:/
469e859312eSBram Moolenaar    n = 288
470e859312eSBram Moolenaar  endtry
471e859312eSBram Moolenaar  assert_equal(288, n)
472e859312eSBram Moolenaar
473e859312eSBram Moolenaar  try
474e859312eSBram Moolenaar    &backspace = 'asdf'
475e859312eSBram Moolenaar  catch /E474:/
476e859312eSBram Moolenaar    n = 299
477e859312eSBram Moolenaar  endtry
478e859312eSBram Moolenaar  assert_equal(299, n)
479e859312eSBram Moolenaar
480e859312eSBram Moolenaar  l = [1]
481e859312eSBram Moolenaar  try
482e859312eSBram Moolenaar    l[3] = 3
483e859312eSBram Moolenaar  catch /E684:/
484e859312eSBram Moolenaar    n = 300
485e859312eSBram Moolenaar  endtry
486e859312eSBram Moolenaar  assert_equal(300, n)
487e859312eSBram Moolenaar
488e859312eSBram Moolenaar  try
489e859312eSBram Moolenaar    unlet g:does_not_exist
490e859312eSBram Moolenaar  catch /E108:/
491e859312eSBram Moolenaar    n = 322
492e859312eSBram Moolenaar  endtry
493e859312eSBram Moolenaar  assert_equal(322, n)
494e859312eSBram Moolenaar
495e859312eSBram Moolenaar  try
4962bede173SBram Moolenaar    d = {text: 1, [g:astring]: 2}
497e859312eSBram Moolenaar  catch /E721:/
498e859312eSBram Moolenaar    n = 333
499e859312eSBram Moolenaar  endtry
500e859312eSBram Moolenaar  assert_equal(333, n)
501e859312eSBram Moolenaar
502e859312eSBram Moolenaar  try
503e859312eSBram Moolenaar    l = DeletedFunc()
504e859312eSBram Moolenaar  catch /E933:/
505e859312eSBram Moolenaar    n = 344
506e859312eSBram Moolenaar  endtry
507e859312eSBram Moolenaar  assert_equal(344, n)
508d032f34aSBram Moolenaar
509d032f34aSBram Moolenaar  try
510d032f34aSBram Moolenaar    echo len(v:true)
511d032f34aSBram Moolenaar  catch /E701:/
512d032f34aSBram Moolenaar    n = 355
513d032f34aSBram Moolenaar  endtry
514d032f34aSBram Moolenaar  assert_equal(355, n)
515d032f34aSBram Moolenaar
516cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
517d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
518d032f34aSBram Moolenaar  try
519d032f34aSBram Moolenaar    echo P()
520d032f34aSBram Moolenaar  catch /E117:/
521d032f34aSBram Moolenaar    n = 366
522d032f34aSBram Moolenaar  endtry
523d032f34aSBram Moolenaar  assert_equal(366, n)
524d032f34aSBram Moolenaar
525d032f34aSBram Moolenaar  try
526d032f34aSBram Moolenaar    echo g:NoSuchFunc()
527d032f34aSBram Moolenaar  catch /E117:/
528d032f34aSBram Moolenaar    n = 377
529d032f34aSBram Moolenaar  endtry
530d032f34aSBram Moolenaar  assert_equal(377, n)
531d032f34aSBram Moolenaar
532d032f34aSBram Moolenaar  try
533d032f34aSBram Moolenaar    echo g:alist + 4
534d032f34aSBram Moolenaar  catch /E745:/
535d032f34aSBram Moolenaar    n = 388
536d032f34aSBram Moolenaar  endtry
537d032f34aSBram Moolenaar  assert_equal(388, n)
538d032f34aSBram Moolenaar
539d032f34aSBram Moolenaar  try
540d032f34aSBram Moolenaar    echo 4 + g:alist
541d032f34aSBram Moolenaar  catch /E745:/
542d032f34aSBram Moolenaar    n = 399
543d032f34aSBram Moolenaar  endtry
544d032f34aSBram Moolenaar  assert_equal(399, n)
545d032f34aSBram Moolenaar
546d032f34aSBram Moolenaar  try
547d032f34aSBram Moolenaar    echo g:alist.member
548d032f34aSBram Moolenaar  catch /E715:/
549d032f34aSBram Moolenaar    n = 400
550d032f34aSBram Moolenaar  endtry
551d032f34aSBram Moolenaar  assert_equal(400, n)
552d032f34aSBram Moolenaar
553d032f34aSBram Moolenaar  try
554d032f34aSBram Moolenaar    echo d.member
555d032f34aSBram Moolenaar  catch /E716:/
556d032f34aSBram Moolenaar    n = 411
557d032f34aSBram Moolenaar  endtry
558d032f34aSBram Moolenaar  assert_equal(411, n)
5598a7d6542SBram Moolenaarenddef
5608a7d6542SBram Moolenaar
561*1430ceebSBram Moolenaardef Test_cnext_works_in_catch()
562*1430ceebSBram Moolenaar  var lines =<< trim END
563*1430ceebSBram Moolenaar      vim9script
564*1430ceebSBram Moolenaar      au BufEnter * eval 0
565*1430ceebSBram Moolenaar      writefile(['text'], 'Xfile1')
566*1430ceebSBram Moolenaar      writefile(['text'], 'Xfile2')
567*1430ceebSBram Moolenaar      var items = [
568*1430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile1', valid: true},
569*1430ceebSBram Moolenaar          {lnum: 1, filename: 'Xfile2', valid: true}
570*1430ceebSBram Moolenaar        ]
571*1430ceebSBram Moolenaar      setqflist([], ' ', {items: items})
572*1430ceebSBram Moolenaar      cwindow
573*1430ceebSBram Moolenaar
574*1430ceebSBram Moolenaar      def CnextOrCfirst()
575*1430ceebSBram Moolenaar        # if cnext fails, cfirst is used
576*1430ceebSBram Moolenaar        try
577*1430ceebSBram Moolenaar          cnext
578*1430ceebSBram Moolenaar        catch
579*1430ceebSBram Moolenaar          cfirst
580*1430ceebSBram Moolenaar        endtry
581*1430ceebSBram Moolenaar      enddef
582*1430ceebSBram Moolenaar
583*1430ceebSBram Moolenaar      CnextOrCfirst()
584*1430ceebSBram Moolenaar      CnextOrCfirst()
585*1430ceebSBram Moolenaar      writefile([getqflist({idx: 0}).idx], 'Xresult')
586*1430ceebSBram Moolenaar      qall
587*1430ceebSBram Moolenaar  END
588*1430ceebSBram Moolenaar  writefile(lines, 'XCatchCnext')
589*1430ceebSBram Moolenaar  RunVim([], [], '--clean -S XCatchCnext')
590*1430ceebSBram Moolenaar  assert_equal(['1'], readfile('Xresult'))
591*1430ceebSBram Moolenaar
592*1430ceebSBram Moolenaar  delete('Xfile1')
593*1430ceebSBram Moolenaar  delete('Xfile2')
594*1430ceebSBram Moolenaar  delete('XCatchCnext')
595*1430ceebSBram Moolenaar  delete('Xresult')
596*1430ceebSBram Moolenaarenddef
597*1430ceebSBram Moolenaar
5989e1d9e34SBram Moolenaardef Test_throw_skipped()
5999e1d9e34SBram Moolenaar  if 0
6009e1d9e34SBram Moolenaar    throw dontgethere
6019e1d9e34SBram Moolenaar  endif
6029e1d9e34SBram Moolenaarenddef
6039e1d9e34SBram Moolenaar
6048f81b22eSBram Moolenaardef Test_nocatch_throw_silenced()
6058f81b22eSBram Moolenaar  var lines =<< trim END
6068f81b22eSBram Moolenaar    vim9script
6078f81b22eSBram Moolenaar    def Func()
6088f81b22eSBram Moolenaar      throw 'error'
6098f81b22eSBram Moolenaar    enddef
6108f81b22eSBram Moolenaar    silent! Func()
6118f81b22eSBram Moolenaar  END
6128f81b22eSBram Moolenaar  writefile(lines, 'XthrowSilenced')
6138f81b22eSBram Moolenaar  source XthrowSilenced
6148f81b22eSBram Moolenaar  delete('XthrowSilenced')
6158f81b22eSBram Moolenaarenddef
6168f81b22eSBram Moolenaar
617e859312eSBram Moolenaardef DeletedFunc(): list<any>
618e859312eSBram Moolenaar  return ['delete me']
619e859312eSBram Moolenaarenddef
620e859312eSBram Moolenaardefcompile
621e859312eSBram Moolenaardelfunc DeletedFunc
622e859312eSBram Moolenaar
623257cc5eeSBram Moolenaardef ThrowFromDef()
624a72cfb80SBram Moolenaar  throw "getout" # comment
625257cc5eeSBram Moolenaarenddef
626257cc5eeSBram Moolenaar
627257cc5eeSBram Moolenaarfunc CatchInFunc()
628257cc5eeSBram Moolenaar  try
629257cc5eeSBram Moolenaar    call ThrowFromDef()
630257cc5eeSBram Moolenaar  catch
631257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
632257cc5eeSBram Moolenaar  endtry
633257cc5eeSBram Moolenaarendfunc
634257cc5eeSBram Moolenaar
635257cc5eeSBram Moolenaardef CatchInDef()
636257cc5eeSBram Moolenaar  try
637257cc5eeSBram Moolenaar    ThrowFromDef()
638257cc5eeSBram Moolenaar  catch
639257cc5eeSBram Moolenaar    g:thrown_def = v:exception
640257cc5eeSBram Moolenaar  endtry
641257cc5eeSBram Moolenaarenddef
642257cc5eeSBram Moolenaar
643f575adffSBram Moolenaardef ReturnFinally(): string
644f575adffSBram Moolenaar  try
645f575adffSBram Moolenaar    return 'intry'
646373863edSBram Moolenaar  finall
647f575adffSBram Moolenaar    g:in_finally = 'finally'
648f575adffSBram Moolenaar  endtry
649f575adffSBram Moolenaar  return 'end'
650f575adffSBram Moolenaarenddef
651f575adffSBram Moolenaar
652257cc5eeSBram Moolenaardef Test_try_catch_nested()
653257cc5eeSBram Moolenaar  CatchInFunc()
654257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
655257cc5eeSBram Moolenaar
656257cc5eeSBram Moolenaar  CatchInDef()
657257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
658f575adffSBram Moolenaar
659f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
660f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
661f575adffSBram Moolenaarenddef
662f575adffSBram Moolenaar
6639939f57bSBram Moolenaardef TryOne(): number
6649939f57bSBram Moolenaar  try
6659939f57bSBram Moolenaar    return 0
6669939f57bSBram Moolenaar  catch
6679939f57bSBram Moolenaar  endtry
6689939f57bSBram Moolenaar  return 0
6699939f57bSBram Moolenaarenddef
6709939f57bSBram Moolenaar
6719939f57bSBram Moolenaardef TryTwo(n: number): string
6729939f57bSBram Moolenaar  try
673cfcd011fSBram Moolenaar    var x = {}
6749939f57bSBram Moolenaar  catch
6759939f57bSBram Moolenaar  endtry
6769939f57bSBram Moolenaar  return 'text'
6779939f57bSBram Moolenaarenddef
6789939f57bSBram Moolenaar
6799939f57bSBram Moolenaardef Test_try_catch_twice()
6809939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
6819939f57bSBram Moolenaarenddef
6829939f57bSBram Moolenaar
683f575adffSBram Moolenaardef Test_try_catch_match()
684cfcd011fSBram Moolenaar  var seq = 'a'
685f575adffSBram Moolenaar  try
686f575adffSBram Moolenaar    throw 'something'
687f575adffSBram Moolenaar  catch /nothing/
688f575adffSBram Moolenaar    seq ..= 'x'
689f575adffSBram Moolenaar  catch /some/
690f575adffSBram Moolenaar    seq ..= 'b'
691f575adffSBram Moolenaar  catch /asdf/
692f575adffSBram Moolenaar    seq ..= 'x'
693e8c4abbbSBram Moolenaar  catch ?a\?sdf?
694e8c4abbbSBram Moolenaar    seq ..= 'y'
695f575adffSBram Moolenaar  finally
696f575adffSBram Moolenaar    seq ..= 'c'
697f575adffSBram Moolenaar  endtry
698f575adffSBram Moolenaar  assert_equal('abc', seq)
699257cc5eeSBram Moolenaarenddef
700257cc5eeSBram Moolenaar
701e8c4abbbSBram Moolenaardef Test_try_catch_fails()
702d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
703d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
704d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
705d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
706d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
707d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
708d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
709d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
71013106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
711d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
712585fea7bSBram Moolenaar
713e4984290SBram Moolenaar  CheckDefFailure(['throw'], 'E1143:')
714d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
715e8c4abbbSBram Moolenaarenddef
716e8c4abbbSBram Moolenaar
717006ad48bSBram Moolenaardef Test_throw_vimscript()
718f5be8cdbSBram Moolenaar  # only checks line continuation
719cfcd011fSBram Moolenaar  var lines =<< trim END
720006ad48bSBram Moolenaar      vim9script
721006ad48bSBram Moolenaar      try
722006ad48bSBram Moolenaar        throw 'one'
723006ad48bSBram Moolenaar              .. 'two'
724006ad48bSBram Moolenaar      catch
725006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
726006ad48bSBram Moolenaar      endtry
727006ad48bSBram Moolenaar  END
728006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
7291e021e63SBram Moolenaar
7301e021e63SBram Moolenaar  lines =<< trim END
7311e021e63SBram Moolenaar    vim9script
732352134bbSBram Moolenaar    @r = ''
7331e021e63SBram Moolenaar    def Func()
7341e021e63SBram Moolenaar      throw @r
7351e021e63SBram Moolenaar    enddef
7361e021e63SBram Moolenaar    var result = ''
7371e021e63SBram Moolenaar    try
7381e021e63SBram Moolenaar      Func()
7391e021e63SBram Moolenaar    catch /E1129:/
7401e021e63SBram Moolenaar      result = 'caught'
7411e021e63SBram Moolenaar    endtry
7421e021e63SBram Moolenaar    assert_equal('caught', result)
7431e021e63SBram Moolenaar  END
7441e021e63SBram Moolenaar  CheckScriptSuccess(lines)
745006ad48bSBram Moolenaarenddef
746006ad48bSBram Moolenaar
747ed677f55SBram Moolenaardef Test_error_in_nested_function()
748ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
749cfcd011fSBram Moolenaar  var lines =<< trim END
750ed677f55SBram Moolenaar      vim9script
751ed677f55SBram Moolenaar      def Func()
752ed677f55SBram Moolenaar        Error()
753ed677f55SBram Moolenaar        g:test_var = 1
754ed677f55SBram Moolenaar      enddef
755ed677f55SBram Moolenaar      func Error() abort
756ed677f55SBram Moolenaar        eval [][0]
757ed677f55SBram Moolenaar      endfunc
758ed677f55SBram Moolenaar      Func()
759ed677f55SBram Moolenaar  END
760ed677f55SBram Moolenaar  g:test_var = 0
761ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
762ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
763ed677f55SBram Moolenaarenddef
764ed677f55SBram Moolenaar
76537c83711SBram Moolenaardef Test_cexpr_vimscript()
766f5be8cdbSBram Moolenaar  # only checks line continuation
76737c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
768cfcd011fSBram Moolenaar  var lines =<< trim END
76937c83711SBram Moolenaar      vim9script
77037c83711SBram Moolenaar      cexpr 'File'
77137c83711SBram Moolenaar                .. ' someFile' ..
77237c83711SBram Moolenaar                   ' line 19'
77337c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
77437c83711SBram Moolenaar  END
77537c83711SBram Moolenaar  CheckScriptSuccess(lines)
77637c83711SBram Moolenaar  set errorformat&
77737c83711SBram Moolenaarenddef
77837c83711SBram Moolenaar
779c9edd6b5SBram Moolenaardef Test_statusline_syntax()
780c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
781cfcd011fSBram Moolenaar  var lines =<< trim END
782c9edd6b5SBram Moolenaar      vim9script
783c9edd6b5SBram Moolenaar      func g:Status()
784c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
785c9edd6b5SBram Moolenaar      endfunc
786c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
787c9edd6b5SBram Moolenaar      redrawstatus
788c9edd6b5SBram Moolenaar      set laststatus statusline=
789c9edd6b5SBram Moolenaar  END
790c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
791c9edd6b5SBram Moolenaarenddef
792c9edd6b5SBram Moolenaar
793b209750bSBram Moolenaardef Test_list_vimscript()
794b209750bSBram Moolenaar  # checks line continuation and comments
795cfcd011fSBram Moolenaar  var lines =<< trim END
796b209750bSBram Moolenaar      vim9script
797cfcd011fSBram Moolenaar      var mylist = [
798b209750bSBram Moolenaar            'one',
799b209750bSBram Moolenaar            # comment
800b209750bSBram Moolenaar            'two', # empty line follows
801b209750bSBram Moolenaar
802b209750bSBram Moolenaar            'three',
803b209750bSBram Moolenaar            ]
804b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
805b209750bSBram Moolenaar  END
806b209750bSBram Moolenaar  CheckScriptSuccess(lines)
80766250c93SBram Moolenaar
80866250c93SBram Moolenaar  # check all lines from heredoc are kept
80966250c93SBram Moolenaar  lines =<< trim END
81066250c93SBram Moolenaar      # comment 1
81166250c93SBram Moolenaar      two
81266250c93SBram Moolenaar      # comment 3
81366250c93SBram Moolenaar
81466250c93SBram Moolenaar      five
81566250c93SBram Moolenaar      # comment 6
81666250c93SBram Moolenaar  END
81766250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
818b209750bSBram Moolenaarenddef
819b209750bSBram Moolenaar
8202a1381c3SBram Moolenaarif has('channel')
82140ee466cSBram Moolenaar  let someJob = test_null_job()
82240ee466cSBram Moolenaar
82340ee466cSBram Moolenaar  def FuncWithError()
82440ee466cSBram Moolenaar    echomsg g:someJob
82540ee466cSBram Moolenaar  enddef
82640ee466cSBram Moolenaar
82740ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
82840ee466cSBram Moolenaar    try
82940ee466cSBram Moolenaar      call FuncWithError()
83040ee466cSBram Moolenaar    catch
83140ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
83240ee466cSBram Moolenaar    endtry
83340ee466cSBram Moolenaar  endfunc
8342a1381c3SBram Moolenaarendif
83540ee466cSBram Moolenaar
8368a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
8378a7d6542SBram Moolenaar  vim9script
838cfcd011fSBram Moolenaar  var name: string = 'bob'
8398a7d6542SBram Moolenaar  def Concat(arg: string): string
8408a7d6542SBram Moolenaar    return name .. arg
8418a7d6542SBram Moolenaar  enddef
842227a69deSBram Moolenaar  g:result = Concat('bie')
843227a69deSBram Moolenaar  g:localname = name
8448a7d6542SBram Moolenaar
8458a7d6542SBram Moolenaar  export const CONST = 1234
846cfcd011fSBram Moolenaar  export var exported = 9876
847cfcd011fSBram Moolenaar  export var exp_name = 'John'
8488a7d6542SBram Moolenaar  export def Exported(): string
8498a7d6542SBram Moolenaar    return 'Exported'
8508a7d6542SBram Moolenaar  enddef
8518a7d6542SBram MoolenaarEND
8528a7d6542SBram Moolenaar
853b3ca9824SBram Moolenaardef Undo_export_script_lines()
854b3ca9824SBram Moolenaar  unlet g:result
855b3ca9824SBram Moolenaar  unlet g:localname
856b3ca9824SBram Moolenaarenddef
857b3ca9824SBram Moolenaar
8585269bd2aSBram Moolenaardef Test_vim9_import_export()
859cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
8608a7d6542SBram Moolenaar    vim9script
8618a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
8628a7d6542SBram Moolenaar    g:imported = exported
8636e587dcbSBram Moolenaar    exported += 3
8646e587dcbSBram Moolenaar    g:imported_added = exported
8658a7d6542SBram Moolenaar    g:imported_func = Exported()
8666e587dcbSBram Moolenaar
86740f4f7a4SBram Moolenaar    def GetExported(): string
868e0de171eSBram Moolenaar      var local_dict = {ref: Exported}
86940f4f7a4SBram Moolenaar      return local_dict.ref()
87040f4f7a4SBram Moolenaar    enddef
87140f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
87240f4f7a4SBram Moolenaar
8736e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
8746e587dcbSBram Moolenaar    g:imported_name = exp_name
8756e587dcbSBram Moolenaar    exp_name ..= ' Doe'
8766e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
8775381c7a1SBram Moolenaar    g:imported_later = exported
8788a7d6542SBram Moolenaar  END
8798a7d6542SBram Moolenaar
8808a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
8818a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
8828a7d6542SBram Moolenaar
8838a7d6542SBram Moolenaar  source Ximport.vim
8848a7d6542SBram Moolenaar
8858a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
8868a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
8878a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
8886e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
8895381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
8908a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
89140f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
8926e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
8936e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
8948a7d6542SBram Moolenaar  assert_false(exists('g:name'))
8958a7d6542SBram Moolenaar
896b3ca9824SBram Moolenaar  Undo_export_script_lines()
8978a7d6542SBram Moolenaar  unlet g:imported
8986e587dcbSBram Moolenaar  unlet g:imported_added
8995381c7a1SBram Moolenaar  unlet g:imported_later
9008a7d6542SBram Moolenaar  unlet g:imported_func
9016e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
9028a7d6542SBram Moolenaar  delete('Ximport.vim')
903f2d5c240SBram Moolenaar
9041c991144SBram Moolenaar  # similar, with line breaks
905cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
9061c991144SBram Moolenaar    vim9script
9071c991144SBram Moolenaar    import {
9081c991144SBram Moolenaar        exported,
9091c991144SBram Moolenaar        Exported,
9101c991144SBram Moolenaar        }
9111c991144SBram Moolenaar        from
9121c991144SBram Moolenaar        './Xexport.vim'
9131c991144SBram Moolenaar    g:imported = exported
9141c991144SBram Moolenaar    exported += 5
9151c991144SBram Moolenaar    g:imported_added = exported
9161c991144SBram Moolenaar    g:imported_func = Exported()
9171c991144SBram Moolenaar  END
9181c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
9191c991144SBram Moolenaar  source Ximport_lbr.vim
9201c991144SBram Moolenaar
9211c991144SBram Moolenaar  assert_equal(9876, g:imported)
9221c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
9231c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
9241c991144SBram Moolenaar
9251c991144SBram Moolenaar  # exported script not sourced again
9261c991144SBram Moolenaar  assert_false(exists('g:result'))
9271c991144SBram Moolenaar  unlet g:imported
9281c991144SBram Moolenaar  unlet g:imported_added
9291c991144SBram Moolenaar  unlet g:imported_func
9301c991144SBram Moolenaar  delete('Ximport_lbr.vim')
9311c991144SBram Moolenaar
9321c991144SBram Moolenaar  # import inside :def function
933cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
9345381c7a1SBram Moolenaar    vim9script
9355381c7a1SBram Moolenaar    def ImportInDef()
9365381c7a1SBram Moolenaar      import exported from './Xexport.vim'
9375381c7a1SBram Moolenaar      g:imported = exported
9385381c7a1SBram Moolenaar      exported += 7
9395381c7a1SBram Moolenaar      g:imported_added = exported
9405381c7a1SBram Moolenaar    enddef
9415381c7a1SBram Moolenaar    ImportInDef()
9425381c7a1SBram Moolenaar  END
9435381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
9445381c7a1SBram Moolenaar  source Ximport2.vim
945f5be8cdbSBram Moolenaar  # TODO: this should be 9879
9465381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
9475381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
9485381c7a1SBram Moolenaar  unlet g:imported
9495381c7a1SBram Moolenaar  unlet g:imported_added
9505381c7a1SBram Moolenaar  delete('Ximport2.vim')
9515381c7a1SBram Moolenaar
952cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
953f2d5c240SBram Moolenaar    vim9script
954f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
955f2d5c240SBram Moolenaar    def UseExport()
956f2d5c240SBram Moolenaar      g:imported = Export.exported
957f2d5c240SBram Moolenaar    enddef
958f2d5c240SBram Moolenaar    UseExport()
959f2d5c240SBram Moolenaar  END
960f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
961f2d5c240SBram Moolenaar  source Ximport.vim
9625381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
963f2d5c240SBram Moolenaar
964cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
965599c89c8SBram Moolenaar    vim9script
966599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
967599c89c8SBram Moolenaar    def Func()
968cfcd011fSBram Moolenaar      var dummy = 1
969cfcd011fSBram Moolenaar      var imported = Export + dummy
970599c89c8SBram Moolenaar    enddef
971822ba247SBram Moolenaar    defcompile
972599c89c8SBram Moolenaar  END
973599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
97444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
975599c89c8SBram Moolenaar
976cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
977599c89c8SBram Moolenaar    vim9script
978599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
979599c89c8SBram Moolenaar    def Func()
980cfcd011fSBram Moolenaar      var imported = Export . exported
981599c89c8SBram Moolenaar    enddef
982822ba247SBram Moolenaar    defcompile
983599c89c8SBram Moolenaar  END
984599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
98544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
986599c89c8SBram Moolenaar
987a6294955SBram Moolenaar  var import_star_as_duplicated =<< trim END
988a6294955SBram Moolenaar    vim9script
989a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
990a6294955SBram Moolenaar    var some = 'other'
991a6294955SBram Moolenaar    import * as Export from './Xexport.vim'
992a6294955SBram Moolenaar    defcompile
993a6294955SBram Moolenaar  END
994a6294955SBram Moolenaar  writefile(import_star_as_duplicated, 'Ximport.vim')
995a6294955SBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
996a6294955SBram Moolenaar
997cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
998599c89c8SBram Moolenaar    vim9script
999599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1000599c89c8SBram Moolenaar    def Func()
1001cfcd011fSBram Moolenaar      var imported = Export.
1002599c89c8SBram Moolenaar    enddef
1003822ba247SBram Moolenaar    defcompile
1004599c89c8SBram Moolenaar  END
1005599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
100644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1007599c89c8SBram Moolenaar
1008cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
10091c991144SBram Moolenaar    vim9script
10101c991144SBram Moolenaar    import *
10111c991144SBram Moolenaar        as Export
10121c991144SBram Moolenaar        from
10131c991144SBram Moolenaar        './Xexport.vim'
10141c991144SBram Moolenaar    def UseExport()
10151c991144SBram Moolenaar      g:imported = Export.exported
10161c991144SBram Moolenaar    enddef
10171c991144SBram Moolenaar    UseExport()
10181c991144SBram Moolenaar  END
10191c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
10201c991144SBram Moolenaar  source Ximport.vim
10211c991144SBram Moolenaar  assert_equal(9883, g:imported)
10221c991144SBram Moolenaar
1023cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
1024f2d5c240SBram Moolenaar    vim9script
1025f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1026f2d5c240SBram Moolenaar  END
1027f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
102844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1029f2d5c240SBram Moolenaar
1030f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1031cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
1032fa29c8abSBram Moolenaar    vim9script
1033fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1034fa29c8abSBram Moolenaar  END
1035fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
103644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1037fa29c8abSBram Moolenaar
1038f5be8cdbSBram Moolenaar  # try to import something that is already defined
1039cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
10405269bd2aSBram Moolenaar    vim9script
1041cfcd011fSBram Moolenaar    var exported = 'something'
10425269bd2aSBram Moolenaar    import exported from './Xexport.vim'
10435269bd2aSBram Moolenaar  END
10445269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
104544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
10465269bd2aSBram Moolenaar
1047f5be8cdbSBram Moolenaar  # try to import something that is already defined
10485269bd2aSBram Moolenaar  import_already_defined =<< trim END
10495269bd2aSBram Moolenaar    vim9script
1050cfcd011fSBram Moolenaar    var exported = 'something'
10515269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
10525269bd2aSBram Moolenaar  END
10535269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
105444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
10555269bd2aSBram Moolenaar
1056f5be8cdbSBram Moolenaar  # try to import something that is already defined
10575269bd2aSBram Moolenaar  import_already_defined =<< trim END
10585269bd2aSBram Moolenaar    vim9script
1059cfcd011fSBram Moolenaar    var exported = 'something'
10605269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
10615269bd2aSBram Moolenaar  END
10625269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
106344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
10645269bd2aSBram Moolenaar
1065918a4249SBram Moolenaar  # try changing an imported const
1066918a4249SBram Moolenaar  var import_assign_to_const =<< trim END
1067918a4249SBram Moolenaar    vim9script
1068918a4249SBram Moolenaar    import CONST from './Xexport.vim'
1069918a4249SBram Moolenaar    def Assign()
1070918a4249SBram Moolenaar      CONST = 987
1071918a4249SBram Moolenaar    enddef
1072918a4249SBram Moolenaar    defcompile
1073918a4249SBram Moolenaar  END
1074918a4249SBram Moolenaar  writefile(import_assign_to_const, 'Ximport.vim')
1075918a4249SBram Moolenaar  assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1076918a4249SBram Moolenaar
1077f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1078cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
1079fa29c8abSBram Moolenaar    vim9script
1080fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1081fa29c8abSBram Moolenaar  END
1082fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
108344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1084fa29c8abSBram Moolenaar
1085cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
1086fa29c8abSBram Moolenaar    vim9script
1087fa29c8abSBram Moolenaar    import name './Xexport.vim'
1088fa29c8abSBram Moolenaar  END
1089fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
109044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1091fa29c8abSBram Moolenaar
1092cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
1093fa29c8abSBram Moolenaar    vim9script
1094fa29c8abSBram Moolenaar    import name from Xexport.vim
1095fa29c8abSBram Moolenaar  END
1096fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
109744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1098fa29c8abSBram Moolenaar
1099cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
1100fa29c8abSBram Moolenaar    vim9script
1101fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1102fa29c8abSBram Moolenaar  END
1103fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
110444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1105fa29c8abSBram Moolenaar
1106cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
1107fa29c8abSBram Moolenaar    vim9script
1108fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1109fa29c8abSBram Moolenaar  END
11105269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
111144d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1112fa29c8abSBram Moolenaar
1113f2d5c240SBram Moolenaar  delete('Ximport.vim')
11145269bd2aSBram Moolenaar  delete('Ximport3.vim')
11158a7d6542SBram Moolenaar  delete('Xexport.vim')
11168a7d6542SBram Moolenaar
1117f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1118750802b5SBram Moolenaar  set cpo&vi
1119cfcd011fSBram Moolenaar  var cpo_before = &cpo
1120cfcd011fSBram Moolenaar  var lines =<< trim END
1121750802b5SBram Moolenaar    vim9script
1122750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1123750802b5SBram Moolenaar  END
1124750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1125750802b5SBram Moolenaar  source Xvim9_script
1126750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1127750802b5SBram Moolenaar  set cpo&vim
1128750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1129750802b5SBram Moolenaar  delete('Xvim9_script')
1130750802b5SBram Moolenaarenddef
1131750802b5SBram Moolenaar
1132803af686SBram Moolenaarfunc g:Trigger()
1133803af686SBram Moolenaar  source Ximport.vim
1134803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1135803af686SBram Moolenaarendfunc
1136803af686SBram Moolenaar
1137803af686SBram Moolenaardef Test_import_export_expr_map()
1138803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1139cfcd011fSBram Moolenaar  var export_lines =<< trim END
1140803af686SBram Moolenaar    vim9script
1141803af686SBram Moolenaar    export def That(): string
1142803af686SBram Moolenaar      return 'yes'
1143803af686SBram Moolenaar    enddef
1144803af686SBram Moolenaar  END
1145803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1146803af686SBram Moolenaar
1147cfcd011fSBram Moolenaar  var import_lines =<< trim END
1148803af686SBram Moolenaar    vim9script
1149803af686SBram Moolenaar    import That from './Xexport_that.vim'
1150803af686SBram Moolenaar    assert_equal('yes', That())
1151803af686SBram Moolenaar  END
1152803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1153803af686SBram Moolenaar
1154803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1155803af686SBram Moolenaar  feedkeys('trigger', "xt")
1156803af686SBram Moolenaar
1157730b2483SBram Moolenaar  delete('Xexport_that.vim')
1158803af686SBram Moolenaar  delete('Ximport.vim')
1159803af686SBram Moolenaar  nunmap trigger
1160803af686SBram Moolenaarenddef
1161803af686SBram Moolenaar
11628e1986e3SBram Moolenaardef Test_import_in_filetype()
11638e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
11648e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1165cfcd011fSBram Moolenaar  var export_lines =<< trim END
11668e1986e3SBram Moolenaar    vim9script
1167cfcd011fSBram Moolenaar    export var That = 'yes'
11688e1986e3SBram Moolenaar  END
1169730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
11708e1986e3SBram Moolenaar
1171cfcd011fSBram Moolenaar  var import_lines =<< trim END
11728e1986e3SBram Moolenaar    vim9script
1173730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
11748e1986e3SBram Moolenaar    assert_equal('yes', That)
11758e1986e3SBram Moolenaar    g:did_load_mytpe = 1
11768e1986e3SBram Moolenaar  END
11778e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
11788e1986e3SBram Moolenaar
1179cfcd011fSBram Moolenaar  var save_rtp = &rtp
11808e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
11818e1986e3SBram Moolenaar
11828e1986e3SBram Moolenaar  filetype plugin on
11838e1986e3SBram Moolenaar  copen
11848e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
11858e1986e3SBram Moolenaar
11868e1986e3SBram Moolenaar  quit!
1187730b2483SBram Moolenaar  delete('Xexport_ft.vim')
11888e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
11898e1986e3SBram Moolenaar  &rtp = save_rtp
11908e1986e3SBram Moolenaarenddef
11918e1986e3SBram Moolenaar
1192efa94447SBram Moolenaardef Test_use_import_in_mapping()
1193cfcd011fSBram Moolenaar  var lines =<< trim END
1194efa94447SBram Moolenaar      vim9script
1195efa94447SBram Moolenaar      export def Funcx()
1196efa94447SBram Moolenaar        g:result = 42
1197efa94447SBram Moolenaar      enddef
1198efa94447SBram Moolenaar  END
1199efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1200efa94447SBram Moolenaar  lines =<< trim END
1201efa94447SBram Moolenaar      vim9script
1202efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1203b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1204efa94447SBram Moolenaar  END
1205efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1206efa94447SBram Moolenaar
1207efa94447SBram Moolenaar  source Xmapscript.vim
1208b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1209efa94447SBram Moolenaar  assert_equal(42, g:result)
1210efa94447SBram Moolenaar
1211efa94447SBram Moolenaar  unlet g:result
1212efa94447SBram Moolenaar  delete('XsomeExport.vim')
1213efa94447SBram Moolenaar  delete('Xmapscript.vim')
1214b3ca9824SBram Moolenaar  nunmap <F3>
1215efa94447SBram Moolenaarenddef
1216efa94447SBram Moolenaar
1217750802b5SBram Moolenaardef Test_vim9script_fails()
12188a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
12198a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1220cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
12219721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1222cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1223750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1224750802b5SBram Moolenaar
1225cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1226c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1227c785b9a7SBram Moolenaar
1228e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1229e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
12308a7d6542SBram Moolenaarenddef
12318a7d6542SBram Moolenaar
1232f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1233101f4810SBram Moolenaar  CheckRunVimInTerminal
1234101f4810SBram Moolenaar
12359bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1236c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
12379bb3eb3eSBram Moolenaarendfunc
12389bb3eb3eSBram Moolenaar
1239c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1240cfcd011fSBram Moolenaar  var export =<< trim END
1241101f4810SBram Moolenaar    vim9script
1242101f4810SBram Moolenaar    export def Foo(): number
1243101f4810SBram Moolenaar        return 0
1244101f4810SBram Moolenaar    enddef
1245101f4810SBram Moolenaar  END
1246730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1247101f4810SBram Moolenaar
1248e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
12499bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
12502949cfdbSBram Moolenaar  WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1251101f4810SBram Moolenaar
1252730b2483SBram Moolenaar  delete('XexportCmd.vim')
12539bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
12549bb3eb3eSBram Moolenaarenddef
1255101f4810SBram Moolenaar
12562b32700dSBram Moolenaardef Test_vim9script_reload_noclear()
12572b32700dSBram Moolenaar  var lines =<< trim END
1258a6294955SBram Moolenaar    vim9script
1259a6294955SBram Moolenaar    export var exported = 'thexport'
1260a6294955SBram Moolenaar  END
1261a6294955SBram Moolenaar  writefile(lines, 'XExportReload')
1262a6294955SBram Moolenaar  lines =<< trim END
12632b32700dSBram Moolenaar    vim9script noclear
12642b32700dSBram Moolenaar    g:loadCount += 1
12652b32700dSBram Moolenaar    var s:reloaded = 'init'
1266a6294955SBram Moolenaar    import exported from './XExportReload'
12672b32700dSBram Moolenaar
12682b32700dSBram Moolenaar    def Again(): string
12692b32700dSBram Moolenaar      return 'again'
12702b32700dSBram Moolenaar    enddef
12712b32700dSBram Moolenaar
12722b32700dSBram Moolenaar    if exists('s:loaded') | finish | endif
12732b32700dSBram Moolenaar    var s:loaded = true
12742b32700dSBram Moolenaar
12752b32700dSBram Moolenaar    var s:notReloaded = 'yes'
12762b32700dSBram Moolenaar    s:reloaded = 'first'
12772b32700dSBram Moolenaar    def g:Values(): list<string>
1278a6294955SBram Moolenaar      return [s:reloaded, s:notReloaded, Again(), Once(), exported]
12792b32700dSBram Moolenaar    enddef
12802b32700dSBram Moolenaar
12812b32700dSBram Moolenaar    def Once(): string
12822b32700dSBram Moolenaar      return 'once'
12832b32700dSBram Moolenaar    enddef
12842b32700dSBram Moolenaar  END
12852b32700dSBram Moolenaar  writefile(lines, 'XReloaded')
12862b32700dSBram Moolenaar  g:loadCount = 0
12872b32700dSBram Moolenaar  source XReloaded
12882b32700dSBram Moolenaar  assert_equal(1, g:loadCount)
1289a6294955SBram Moolenaar  assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
12902b32700dSBram Moolenaar  source XReloaded
12912b32700dSBram Moolenaar  assert_equal(2, g:loadCount)
1292a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
12932b32700dSBram Moolenaar  source XReloaded
12942b32700dSBram Moolenaar  assert_equal(3, g:loadCount)
1295a6294955SBram Moolenaar  assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
12962b32700dSBram Moolenaar
129748e11c10SBram Moolenaar  delete('XReloaded')
1298a6294955SBram Moolenaar  delete('XExportReload')
12992b32700dSBram Moolenaar  delfunc g:Values
13002b32700dSBram Moolenaar  unlet g:loadCount
13012b32700dSBram Moolenaarenddef
13022b32700dSBram Moolenaar
13034c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1304cfcd011fSBram Moolenaar  var lines =<< trim END
13058a7d6542SBram Moolenaar    vim9script
13068a7d6542SBram Moolenaar    const var = ''
1307cfcd011fSBram Moolenaar    var valone = 1234
13088a7d6542SBram Moolenaar    def MyFunc(arg: string)
13098a7d6542SBram Moolenaar       valone = 5678
13108a7d6542SBram Moolenaar    enddef
13118a7d6542SBram Moolenaar  END
1312cfcd011fSBram Moolenaar  var morelines =<< trim END
1313cfcd011fSBram Moolenaar    var valtwo = 222
13148a7d6542SBram Moolenaar    export def GetValtwo(): number
13158a7d6542SBram Moolenaar      return valtwo
13168a7d6542SBram Moolenaar    enddef
13178a7d6542SBram Moolenaar  END
131803afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
13198a7d6542SBram Moolenaar  source Xreload.vim
13208a7d6542SBram Moolenaar  source Xreload.vim
13218a7d6542SBram Moolenaar  source Xreload.vim
13228a7d6542SBram Moolenaar
1323cfcd011fSBram Moolenaar  var testlines =<< trim END
13248a7d6542SBram Moolenaar    vim9script
13258a7d6542SBram Moolenaar    def TheFunc()
13268a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
13278a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
13288a7d6542SBram Moolenaar    enddef
13298a7d6542SBram Moolenaar    TheFunc()
13308a7d6542SBram Moolenaar  END
13318a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
13328a7d6542SBram Moolenaar  source Ximport.vim
13338a7d6542SBram Moolenaar
1334f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1335f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
13368a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
13378a7d6542SBram Moolenaar  source Ximport.vim
13388a7d6542SBram Moolenaar
1339f5be8cdbSBram Moolenaar  # cannot declare a var twice
13408a7d6542SBram Moolenaar  lines =<< trim END
13418a7d6542SBram Moolenaar    vim9script
1342cfcd011fSBram Moolenaar    var valone = 1234
1343cfcd011fSBram Moolenaar    var valone = 5678
13448a7d6542SBram Moolenaar  END
13458a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
134644d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
13478a7d6542SBram Moolenaar
13488a7d6542SBram Moolenaar  delete('Xreload.vim')
13498a7d6542SBram Moolenaar  delete('Ximport.vim')
13508a7d6542SBram Moolenaarenddef
13518a7d6542SBram Moolenaar
135207a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a
135307a65d26SBram Moolenaar" compiled function using that variable must fail.
135407a65d26SBram Moolenaardef Test_script_reload_change_type()
135507a65d26SBram Moolenaar  var lines =<< trim END
135607a65d26SBram Moolenaar    vim9script noclear
135707a65d26SBram Moolenaar    var str = 'string'
135807a65d26SBram Moolenaar    def g:GetStr(): string
135907a65d26SBram Moolenaar      return str .. 'xxx'
136007a65d26SBram Moolenaar    enddef
136107a65d26SBram Moolenaar  END
136207a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
136307a65d26SBram Moolenaar  source Xreload.vim
136407a65d26SBram Moolenaar  echo g:GetStr()
136507a65d26SBram Moolenaar
136607a65d26SBram Moolenaar  lines =<< trim END
136707a65d26SBram Moolenaar    vim9script noclear
136807a65d26SBram Moolenaar    var str = 1234
136907a65d26SBram Moolenaar  END
137007a65d26SBram Moolenaar  writefile(lines, 'Xreload.vim')
137107a65d26SBram Moolenaar  source Xreload.vim
137207a65d26SBram Moolenaar  assert_fails('echo g:GetStr()', 'E1150:')
137307a65d26SBram Moolenaar
137407a65d26SBram Moolenaar  delfunc g:GetStr
137507a65d26SBram Moolenaar  delete('Xreload.vim')
137607a65d26SBram Moolenaarenddef
137707a65d26SBram Moolenaar
137895006e3dSBram Moolenaardef s:RetSome(): string
137995006e3dSBram Moolenaar  return 'some'
138095006e3dSBram Moolenaarenddef
138195006e3dSBram Moolenaar
1382fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1383fe465a01SBram Moolenaar" script-local name.
1384fe465a01SBram Moolenaardef Test_vim9script_funcref()
1385cfcd011fSBram Moolenaar  var sortlines =<< trim END
1386fe465a01SBram Moolenaar      vim9script
1387fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1388bed36b93SBram Moolenaar        return i2 - i1
1389fe465a01SBram Moolenaar      enddef
1390fe465a01SBram Moolenaar
1391fe465a01SBram Moolenaar      export def FastSort(): list<number>
1392fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1393fe465a01SBram Moolenaar      enddef
1394fe465a01SBram Moolenaar  END
1395fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1396fe465a01SBram Moolenaar
1397cfcd011fSBram Moolenaar  var lines =<< trim END
1398fe465a01SBram Moolenaar    vim9script
1399fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1400fe465a01SBram Moolenaar    def Test()
1401fe465a01SBram Moolenaar      g:result = FastSort()
1402fe465a01SBram Moolenaar    enddef
1403fe465a01SBram Moolenaar    Test()
1404fe465a01SBram Moolenaar  END
1405fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1406fe465a01SBram Moolenaar
1407fe465a01SBram Moolenaar  source Xscript.vim
1408fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1409fe465a01SBram Moolenaar
1410fe465a01SBram Moolenaar  unlet g:result
1411fe465a01SBram Moolenaar  delete('Xsort.vim')
1412fe465a01SBram Moolenaar  delete('Xscript.vim')
141395006e3dSBram Moolenaar
1414cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
141595006e3dSBram Moolenaar  assert_equal('some', Funcref())
1416fe465a01SBram Moolenaarenddef
1417fe465a01SBram Moolenaar
1418601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1419601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1420601e76acSBram Moolenaar" function reference.
1421c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1422cfcd011fSBram Moolenaar  var filterLines =<< trim END
1423c620c055SBram Moolenaar    vim9script
1424c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1425c620c055SBram Moolenaar      return idx % 2 == 1
1426c620c055SBram Moolenaar    enddef
1427c620c055SBram Moolenaar    export def FastFilter(): list<number>
1428c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1429c620c055SBram Moolenaar    enddef
1430601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1431601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1432601e76acSBram Moolenaar    enddef
1433c620c055SBram Moolenaar  END
1434c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1435c620c055SBram Moolenaar
1436cfcd011fSBram Moolenaar  var lines =<< trim END
1437c620c055SBram Moolenaar    vim9script
1438601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1439c620c055SBram Moolenaar    def Test()
1440cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1441c620c055SBram Moolenaar    enddef
1442c620c055SBram Moolenaar    Test()
1443601e76acSBram Moolenaar    def TestDirect()
1444cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1445601e76acSBram Moolenaar    enddef
1446601e76acSBram Moolenaar    TestDirect()
1447c620c055SBram Moolenaar  END
1448601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1449c620c055SBram Moolenaar  delete('Xfilter.vim')
1450c620c055SBram Moolenaarenddef
1451c620c055SBram Moolenaar
14524c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1453cfcd011fSBram Moolenaar  var first_lines =<< trim END
14544c17ad94SBram Moolenaar    vim9script
14554c17ad94SBram Moolenaar    def FuncYes(): string
14564c17ad94SBram Moolenaar      return 'yes'
14574c17ad94SBram Moolenaar    enddef
14584c17ad94SBram Moolenaar  END
1459cfcd011fSBram Moolenaar  var withno_lines =<< trim END
14604c17ad94SBram Moolenaar    def FuncNo(): string
14614c17ad94SBram Moolenaar      return 'no'
14624c17ad94SBram Moolenaar    enddef
14634c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
14644c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
14654c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
146603afdcf1SBram Moolenaar    enddef
146703afdcf1SBram Moolenaar  END
1468cfcd011fSBram Moolenaar  var nono_lines =<< trim END
146903afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
147003afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
147144d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
14724c17ad94SBram Moolenaar    enddef
14734c17ad94SBram Moolenaar  END
14744c17ad94SBram Moolenaar
14754c17ad94SBram Moolenaar  # FuncNo() is defined
147603afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
14774c17ad94SBram Moolenaar  source Xreloaded.vim
14784c17ad94SBram Moolenaar  g:DoCheck(true)
14794c17ad94SBram Moolenaar
14804c17ad94SBram Moolenaar  # FuncNo() is not redefined
148103afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
14824c17ad94SBram Moolenaar  source Xreloaded.vim
14835082471fSBram Moolenaar  g:DoCheck(false)
14844c17ad94SBram Moolenaar
14854c17ad94SBram Moolenaar  # FuncNo() is back
148603afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
14874c17ad94SBram Moolenaar  source Xreloaded.vim
14885082471fSBram Moolenaar  g:DoCheck(false)
14894c17ad94SBram Moolenaar
14904c17ad94SBram Moolenaar  delete('Xreloaded.vim')
14914c17ad94SBram Moolenaarenddef
14924c17ad94SBram Moolenaar
149389483d40SBram Moolenaardef Test_vim9script_reload_delvar()
149489483d40SBram Moolenaar  # write the script with a script-local variable
1495cfcd011fSBram Moolenaar  var lines =<< trim END
149689483d40SBram Moolenaar    vim9script
1497cfcd011fSBram Moolenaar    var name = 'string'
149889483d40SBram Moolenaar  END
149989483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
150089483d40SBram Moolenaar  source XreloadVar.vim
150189483d40SBram Moolenaar
150289483d40SBram Moolenaar  # now write the script using the same variable locally - works
150389483d40SBram Moolenaar  lines =<< trim END
150489483d40SBram Moolenaar    vim9script
150589483d40SBram Moolenaar    def Func()
1506cfcd011fSBram Moolenaar      var name = 'string'
150789483d40SBram Moolenaar    enddef
150889483d40SBram Moolenaar  END
150989483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
151089483d40SBram Moolenaar  source XreloadVar.vim
151189483d40SBram Moolenaar
151289483d40SBram Moolenaar  delete('XreloadVar.vim')
151389483d40SBram Moolenaarenddef
151489483d40SBram Moolenaar
15158a7d6542SBram Moolenaardef Test_import_absolute()
1516cfcd011fSBram Moolenaar  var import_lines = [
1517e6085c53SBram Moolenaar        'vim9script',
1518e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1519e6085c53SBram Moolenaar        'def UseExported()',
1520e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1521e6085c53SBram Moolenaar        '  exported = 8888',
1522e6085c53SBram Moolenaar        '  g:imported_after = exported',
1523e6085c53SBram Moolenaar        'enddef',
1524e6085c53SBram Moolenaar        'UseExported()',
1525e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1526e6085c53SBram Moolenaar        ]
15278a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
15288a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
15298a7d6542SBram Moolenaar
15308a7d6542SBram Moolenaar  source Ximport_abs.vim
15318a7d6542SBram Moolenaar
15328a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
15334e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1534fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1535fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1536fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1537fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1538fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1539fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1540fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1541fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1542fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1543fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1544e6085c53SBram Moolenaar        g:import_disassembled)
1545b3ca9824SBram Moolenaar
1546b3ca9824SBram Moolenaar  Undo_export_script_lines()
15478a7d6542SBram Moolenaar  unlet g:imported_abs
15484e12a5dfSBram Moolenaar  unlet g:import_disassembled
15498a7d6542SBram Moolenaar
15508a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
15518a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
15528a7d6542SBram Moolenaarenddef
15538a7d6542SBram Moolenaar
15548a7d6542SBram Moolenaardef Test_import_rtp()
1555cfcd011fSBram Moolenaar  var import_lines = [
1556e6085c53SBram Moolenaar        'vim9script',
1557e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1558e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1559e6085c53SBram Moolenaar        ]
15608a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
15618a7d6542SBram Moolenaar  mkdir('import')
15628a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
15638a7d6542SBram Moolenaar
1564cfcd011fSBram Moolenaar  var save_rtp = &rtp
15658a7d6542SBram Moolenaar  &rtp = getcwd()
15668a7d6542SBram Moolenaar  source Ximport_rtp.vim
15678a7d6542SBram Moolenaar  &rtp = save_rtp
15688a7d6542SBram Moolenaar
15698a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
15708a7d6542SBram Moolenaar
1571b3ca9824SBram Moolenaar  Undo_export_script_lines()
1572b3ca9824SBram Moolenaar  unlet g:imported_rtp
15738a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
157489483d40SBram Moolenaar  delete('import', 'rf')
15758a7d6542SBram Moolenaarenddef
15768a7d6542SBram Moolenaar
157725e0f586SBram Moolenaardef Test_import_compile_error()
1578cfcd011fSBram Moolenaar  var export_lines = [
157925e0f586SBram Moolenaar        'vim9script',
158025e0f586SBram Moolenaar        'export def ExpFunc(): string',
158125e0f586SBram Moolenaar        '  return notDefined',
158225e0f586SBram Moolenaar        'enddef',
158325e0f586SBram Moolenaar        ]
158425e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
158525e0f586SBram Moolenaar
1586cfcd011fSBram Moolenaar  var import_lines = [
158725e0f586SBram Moolenaar        'vim9script',
158825e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
158925e0f586SBram Moolenaar        'def ImpFunc()',
159025e0f586SBram Moolenaar        '  echo ExpFunc()',
159125e0f586SBram Moolenaar        'enddef',
159225e0f586SBram Moolenaar        'defcompile',
159325e0f586SBram Moolenaar        ]
159425e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
159525e0f586SBram Moolenaar
159625e0f586SBram Moolenaar  try
159725e0f586SBram Moolenaar    source Ximport.vim
159825e0f586SBram Moolenaar  catch /E1001/
1599f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
16007707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
160125e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
160225e0f586SBram Moolenaar  endtry
160325e0f586SBram Moolenaar
160425e0f586SBram Moolenaar  delete('Xexported.vim')
160525e0f586SBram Moolenaar  delete('Ximport.vim')
160625e0f586SBram Moolenaarenddef
160725e0f586SBram Moolenaar
1608c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1609cfcd011fSBram Moolenaar  var lines = [
1610c4ce36d4SBram Moolenaar        'vim9script',
1611c4ce36d4SBram Moolenaar        'def Func()',
1612c4ce36d4SBram Moolenaar        '  eval [][0]',
1613c4ce36d4SBram Moolenaar        'enddef',
1614c4ce36d4SBram Moolenaar        'Func()',
1615c4ce36d4SBram Moolenaar        ]
1616c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1617c4ce36d4SBram Moolenaar
1618c4ce36d4SBram Moolenaar  for count in range(3)
1619c4ce36d4SBram Moolenaar    try
1620c4ce36d4SBram Moolenaar      source Xtestscript.vim
1621c4ce36d4SBram Moolenaar    catch /E684/
1622c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1623c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1624c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1625c4ce36d4SBram Moolenaar    endtry
1626c4ce36d4SBram Moolenaar  endfor
1627c4ce36d4SBram Moolenaar
1628c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1629c4ce36d4SBram Moolenaarenddef
1630c4ce36d4SBram Moolenaar
1631eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1632cfcd011fSBram Moolenaar  var export_lines =<< trim END
1633eef2102eSBram Moolenaar      vim9script
1634eef2102eSBram Moolenaar      export def Func()
1635eef2102eSBram Moolenaar        echo 'imported'
1636eef2102eSBram Moolenaar      enddef
1637eef2102eSBram Moolenaar  END
1638eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1639eef2102eSBram Moolenaar
1640cfcd011fSBram Moolenaar  var lines =<< trim END
1641eef2102eSBram Moolenaar    vim9script
1642eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1643eef2102eSBram Moolenaar    def Func()
1644eef2102eSBram Moolenaar      echo 'local to function'
1645eef2102eSBram Moolenaar    enddef
1646eef2102eSBram Moolenaar  END
1647eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1648eef2102eSBram Moolenaar
1649eef2102eSBram Moolenaar  lines =<< trim END
1650eef2102eSBram Moolenaar    vim9script
1651eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1652eef2102eSBram Moolenaar    def Outer()
1653eef2102eSBram Moolenaar      def Func()
1654eef2102eSBram Moolenaar        echo 'local to function'
1655eef2102eSBram Moolenaar      enddef
1656eef2102eSBram Moolenaar    enddef
1657eef2102eSBram Moolenaar    defcompile
1658eef2102eSBram Moolenaar  END
1659eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1660eef2102eSBram Moolenaar
1661eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1662eef2102eSBram Moolenaarenddef
1663eef2102eSBram Moolenaar
1664b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1665cfcd011fSBram Moolenaar  var lines =<< trim END
1666b9a2cac3SBram Moolenaar    vim9script
1667b9a2cac3SBram Moolenaar    def Func()
1668b9a2cac3SBram Moolenaar      echo 'one'
1669b9a2cac3SBram Moolenaar    enddef
1670b9a2cac3SBram Moolenaar    def Func()
1671b9a2cac3SBram Moolenaar      echo 'two'
1672b9a2cac3SBram Moolenaar    enddef
1673b9a2cac3SBram Moolenaar  END
1674b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1675fa211f3cSBram Moolenaar
1676fa211f3cSBram Moolenaar  lines =<< trim END
1677fa211f3cSBram Moolenaar    vim9script
1678fa211f3cSBram Moolenaar    def Foo(): string
1679fa211f3cSBram Moolenaar      return 'foo'
1680fa211f3cSBram Moolenaar      enddef
1681fa211f3cSBram Moolenaar    def Func()
1682cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1683fa211f3cSBram Moolenaar    enddef
1684fa211f3cSBram Moolenaar    defcompile
1685fa211f3cSBram Moolenaar  END
1686fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1687b9a2cac3SBram Moolenaarenddef
1688b9a2cac3SBram Moolenaar
16898a7d6542SBram Moolenaardef Test_fixed_size_list()
1690f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1691cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
16928a7d6542SBram Moolenaar  l->remove(0)
16938a7d6542SBram Moolenaar  l->add(5)
16948a7d6542SBram Moolenaar  l->insert(99, 1)
16950f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
16968a7d6542SBram Moolenaarenddef
16978a7d6542SBram Moolenaar
1698ae616494SBram Moolenaardef Test_no_insert_xit()
1699d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1700d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1701d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1702d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1703d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1704ae616494SBram Moolenaar
1705ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1706ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1707ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1708ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1709f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1710f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1711f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1712f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1713f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1714ae616494SBram Moolenaarenddef
1715ae616494SBram Moolenaar
1716158906cfSBram Moolenaardef IfElse(what: number): string
1717cfcd011fSBram Moolenaar  var res = ''
1718158906cfSBram Moolenaar  if what == 1
1719158906cfSBram Moolenaar    res = "one"
1720158906cfSBram Moolenaar  elseif what == 2
1721158906cfSBram Moolenaar    res = "two"
1722a259d8d3SBram Moolenaar  else
1723158906cfSBram Moolenaar    res = "three"
1724a259d8d3SBram Moolenaar  endif
1725158906cfSBram Moolenaar  return res
1726a259d8d3SBram Moolenaarenddef
1727a259d8d3SBram Moolenaar
1728158906cfSBram Moolenaardef Test_if_elseif_else()
1729158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1730158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1731158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
17320f18b6d1SBram Moolenaarenddef
17330f18b6d1SBram Moolenaar
1734e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1735d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1736d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1737d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1738d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1739d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
1740e8c4abbbSBram Moolenaarenddef
1741e8c4abbbSBram Moolenaar
17426d69bf60SBram Moolenaarlet g:bool_true = v:true
17436d69bf60SBram Moolenaarlet g:bool_false = v:false
17446d69bf60SBram Moolenaar
17456d69bf60SBram Moolenaardef Test_if_const_expr()
1746cfcd011fSBram Moolenaar  var res = false
17476d69bf60SBram Moolenaar  if true ? true : false
17486d69bf60SBram Moolenaar    res = true
17496d69bf60SBram Moolenaar  endif
17506d69bf60SBram Moolenaar  assert_equal(true, res)
17516d69bf60SBram Moolenaar
1752585fea7bSBram Moolenaar  g:glob = 2
1753585fea7bSBram Moolenaar  if false
17546797966dSBram Moolenaar    execute('g:glob = 3')
1755585fea7bSBram Moolenaar  endif
1756585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1757585fea7bSBram Moolenaar  if true
17586797966dSBram Moolenaar    execute('g:glob = 3')
1759585fea7bSBram Moolenaar  endif
1760585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1761585fea7bSBram Moolenaar
17626d69bf60SBram Moolenaar  res = false
17636d69bf60SBram Moolenaar  if g:bool_true ? true : false
17646d69bf60SBram Moolenaar    res = true
17656d69bf60SBram Moolenaar  endif
17666d69bf60SBram Moolenaar  assert_equal(true, res)
17676d69bf60SBram Moolenaar
17686d69bf60SBram Moolenaar  res = false
17696d69bf60SBram Moolenaar  if true ? g:bool_true : false
17706d69bf60SBram Moolenaar    res = true
17716d69bf60SBram Moolenaar  endif
17726d69bf60SBram Moolenaar  assert_equal(true, res)
17736d69bf60SBram Moolenaar
17746d69bf60SBram Moolenaar  res = false
17756d69bf60SBram Moolenaar  if true ? true : g:bool_false
17766d69bf60SBram Moolenaar    res = true
17776d69bf60SBram Moolenaar  endif
17786d69bf60SBram Moolenaar  assert_equal(true, res)
17796d69bf60SBram Moolenaar
17806d69bf60SBram Moolenaar  res = false
17816d69bf60SBram Moolenaar  if true ? false : true
17826d69bf60SBram Moolenaar    res = true
17836d69bf60SBram Moolenaar  endif
17846d69bf60SBram Moolenaar  assert_equal(false, res)
17856d69bf60SBram Moolenaar
17866d69bf60SBram Moolenaar  res = false
17876d69bf60SBram Moolenaar  if false ? false : true
17886d69bf60SBram Moolenaar    res = true
17896d69bf60SBram Moolenaar  endif
17906d69bf60SBram Moolenaar  assert_equal(true, res)
17916d69bf60SBram Moolenaar
17926d69bf60SBram Moolenaar  res = false
17936d69bf60SBram Moolenaar  if false ? true : false
17946d69bf60SBram Moolenaar    res = true
17956d69bf60SBram Moolenaar  endif
17966d69bf60SBram Moolenaar  assert_equal(false, res)
17976d69bf60SBram Moolenaar
17986d69bf60SBram Moolenaar  res = false
1799e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1800e8c4abbbSBram Moolenaar    res = true
1801e8c4abbbSBram Moolenaar  endif
1802e8c4abbbSBram Moolenaar  assert_equal(false, res)
1803e8c4abbbSBram Moolenaar
1804e8c4abbbSBram Moolenaar  res = false
18056d69bf60SBram Moolenaar  if true && true
18066d69bf60SBram Moolenaar    res = true
18076d69bf60SBram Moolenaar  endif
18086d69bf60SBram Moolenaar  assert_equal(true, res)
18096d69bf60SBram Moolenaar
18106d69bf60SBram Moolenaar  res = false
18116d69bf60SBram Moolenaar  if true && false
18126d69bf60SBram Moolenaar    res = true
18136d69bf60SBram Moolenaar  endif
18146d69bf60SBram Moolenaar  assert_equal(false, res)
18156d69bf60SBram Moolenaar
18166d69bf60SBram Moolenaar  res = false
18176d69bf60SBram Moolenaar  if g:bool_true && false
18186d69bf60SBram Moolenaar    res = true
18196d69bf60SBram Moolenaar  endif
18206d69bf60SBram Moolenaar  assert_equal(false, res)
18216d69bf60SBram Moolenaar
18226d69bf60SBram Moolenaar  res = false
18236d69bf60SBram Moolenaar  if true && g:bool_false
18246d69bf60SBram Moolenaar    res = true
18256d69bf60SBram Moolenaar  endif
18266d69bf60SBram Moolenaar  assert_equal(false, res)
18276d69bf60SBram Moolenaar
18286d69bf60SBram Moolenaar  res = false
18296d69bf60SBram Moolenaar  if false && false
18306d69bf60SBram Moolenaar    res = true
18316d69bf60SBram Moolenaar  endif
18326d69bf60SBram Moolenaar  assert_equal(false, res)
18336d69bf60SBram Moolenaar
18346d69bf60SBram Moolenaar  res = false
18356d69bf60SBram Moolenaar  if true || false
18366d69bf60SBram Moolenaar    res = true
18376d69bf60SBram Moolenaar  endif
18386d69bf60SBram Moolenaar  assert_equal(true, res)
18396d69bf60SBram Moolenaar
18406d69bf60SBram Moolenaar  res = false
18416d69bf60SBram Moolenaar  if g:bool_true || false
18426d69bf60SBram Moolenaar    res = true
18436d69bf60SBram Moolenaar  endif
18446d69bf60SBram Moolenaar  assert_equal(true, res)
18456d69bf60SBram Moolenaar
18466d69bf60SBram Moolenaar  res = false
18476d69bf60SBram Moolenaar  if true || g:bool_false
18486d69bf60SBram Moolenaar    res = true
18496d69bf60SBram Moolenaar  endif
18506d69bf60SBram Moolenaar  assert_equal(true, res)
18516d69bf60SBram Moolenaar
18526d69bf60SBram Moolenaar  res = false
18536d69bf60SBram Moolenaar  if false || false
18546d69bf60SBram Moolenaar    res = true
18556d69bf60SBram Moolenaar  endif
18566d69bf60SBram Moolenaar  assert_equal(false, res)
18573988f64fSBram Moolenaar
18583988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
18593988f64fSBram Moolenaar  if false | eval 0 | endif
18603988f64fSBram Moolenaar  if false | eval burp + 234 | endif
18613988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
18623988f64fSBram Moolenaar  if false
18633988f64fSBram Moolenaar    burp
18643988f64fSBram Moolenaar  endif
186580c34ca3SBram Moolenaarenddef
18666d69bf60SBram Moolenaar
186780c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1868d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1869d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1870d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1871d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
18726d69bf60SBram Moolenaarenddef
18736d69bf60SBram Moolenaar
187472abcf42SBram Moolenaardef RunNested(i: number): number
1875cfcd011fSBram Moolenaar  var x: number = 0
187672abcf42SBram Moolenaar  if i % 2
187772abcf42SBram Moolenaar    if 1
1878f5be8cdbSBram Moolenaar      # comment
187972abcf42SBram Moolenaar    else
1880f5be8cdbSBram Moolenaar      # comment
188172abcf42SBram Moolenaar    endif
188272abcf42SBram Moolenaar    x += 1
188372abcf42SBram Moolenaar  else
188472abcf42SBram Moolenaar    x += 1000
188572abcf42SBram Moolenaar  endif
188672abcf42SBram Moolenaar  return x
188772abcf42SBram Moolenaarenddef
188872abcf42SBram Moolenaar
188972abcf42SBram Moolenaardef Test_nested_if()
189072abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
189172abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
189272abcf42SBram Moolenaarenddef
189372abcf42SBram Moolenaar
1894ad39c094SBram Moolenaardef Test_execute_cmd()
1895e4984290SBram Moolenaar  # missing argument is ignored
1896e4984290SBram Moolenaar  execute
1897e4984290SBram Moolenaar  execute # comment
1898e4984290SBram Moolenaar
1899ad39c094SBram Moolenaar  new
1900ad39c094SBram Moolenaar  setline(1, 'default')
1901d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1902ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1903a72cfb80SBram Moolenaar
1904d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1905a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1906a72cfb80SBram Moolenaar
1907cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
1908cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
1909a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1910ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1911a72cfb80SBram Moolenaar
1912d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
1913ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1914a72cfb80SBram Moolenaar
1915cfcd011fSBram Moolenaar  var cmd_first = 'call '
1916cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
1917ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1918ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1919ad39c094SBram Moolenaar  bwipe!
1920585fea7bSBram Moolenaar
1921cfcd011fSBram Moolenaar  var n = true
19222d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
19232d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
19242d6b20d6SBram Moolenaar
1925e0de171eSBram Moolenaar  echomsg [1, 2, 3] {a: 1, b: 2}
1926e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
1927e5abf7afSBram Moolenaar
1928d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
1929d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1930d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
1931ad39c094SBram Moolenaarenddef
1932ad39c094SBram Moolenaar
193347e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1934f5be8cdbSBram Moolenaar  # only checks line continuation
1935cfcd011fSBram Moolenaar  var lines =<< trim END
193647e880d6SBram Moolenaar      vim9script
193747e880d6SBram Moolenaar      execute 'g:someVar'
193847e880d6SBram Moolenaar                .. ' = ' ..
193947e880d6SBram Moolenaar                   '28'
194047e880d6SBram Moolenaar      assert_equal(28, g:someVar)
194147e880d6SBram Moolenaar      unlet g:someVar
194247e880d6SBram Moolenaar  END
194347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
194447e880d6SBram Moolenaarenddef
194547e880d6SBram Moolenaar
1946ad39c094SBram Moolenaardef Test_echo_cmd()
1947a72cfb80SBram Moolenaar  echo 'some' # comment
1948585fea7bSBram Moolenaar  echon 'thing'
1949ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1950ad39c094SBram Moolenaar
1951a72cfb80SBram Moolenaar  echo "some" # comment
1952a72cfb80SBram Moolenaar  echon "thing"
1953a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1954a72cfb80SBram Moolenaar
1955cfcd011fSBram Moolenaar  var str1 = 'some'
1956cfcd011fSBram Moolenaar  var str2 = 'more'
1957ad39c094SBram Moolenaar  echo str1 str2
1958ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1959a72cfb80SBram Moolenaar
1960d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1961ad39c094SBram Moolenaarenddef
1962ad39c094SBram Moolenaar
1963f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1964f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1965f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1966f93c7feaSBram Moolenaar  echo 'clear'
1967df069eecSBram Moolenaar  :1messages
1968f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1969f93c7feaSBram Moolenaar
1970d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1971f93c7feaSBram Moolenaarenddef
1972f93c7feaSBram Moolenaar
197347e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1974f5be8cdbSBram Moolenaar  # only checks line continuation
1975cfcd011fSBram Moolenaar  var lines =<< trim END
197647e880d6SBram Moolenaar      vim9script
197747e880d6SBram Moolenaar      echomsg 'here'
197847e880d6SBram Moolenaar                .. ' is ' ..
197947e880d6SBram Moolenaar                   'a message'
198047e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
198147e880d6SBram Moolenaar  END
198247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
198347e880d6SBram Moolenaarenddef
198447e880d6SBram Moolenaar
1985f93c7feaSBram Moolenaardef Test_echoerr_cmd()
198640ee466cSBram Moolenaar  try
198740ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
198840ee466cSBram Moolenaar  catch
198940ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
199040ee466cSBram Moolenaar  endtry
1991f93c7feaSBram Moolenaarenddef
1992f93c7feaSBram Moolenaar
199347e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1994f5be8cdbSBram Moolenaar  # only checks line continuation
1995cfcd011fSBram Moolenaar  var lines =<< trim END
199647e880d6SBram Moolenaar      vim9script
199747e880d6SBram Moolenaar      try
199847e880d6SBram Moolenaar        echoerr 'this'
199947e880d6SBram Moolenaar                .. ' is ' ..
200047e880d6SBram Moolenaar                   'wrong'
200147e880d6SBram Moolenaar      catch
200247e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
200347e880d6SBram Moolenaar      endtry
200447e880d6SBram Moolenaar  END
200547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
200647e880d6SBram Moolenaarenddef
200747e880d6SBram Moolenaar
200841fe0617SBram Moolenaardef Test_for_outside_of_function()
2009cfcd011fSBram Moolenaar  var lines =<< trim END
201041fe0617SBram Moolenaar    vim9script
201141fe0617SBram Moolenaar    new
201241fe0617SBram Moolenaar    for var in range(0, 3)
201341fe0617SBram Moolenaar      append(line('$'), var)
201441fe0617SBram Moolenaar    endfor
201541fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
201641fe0617SBram Moolenaar    bwipe!
201741fe0617SBram Moolenaar  END
201841fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
201941fe0617SBram Moolenaar  source Xvim9for.vim
202041fe0617SBram Moolenaar  delete('Xvim9for.vim')
202141fe0617SBram Moolenaarenddef
20228a7d6542SBram Moolenaar
2023e8c4abbbSBram Moolenaardef Test_for_loop()
2024cfcd011fSBram Moolenaar  var result = ''
2025e8c4abbbSBram Moolenaar  for cnt in range(7)
2026e8c4abbbSBram Moolenaar    if cnt == 4
2027e8c4abbbSBram Moolenaar      break
2028e8c4abbbSBram Moolenaar    endif
2029e8c4abbbSBram Moolenaar    if cnt == 2
2030e8c4abbbSBram Moolenaar      continue
2031e8c4abbbSBram Moolenaar    endif
2032e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2033e8c4abbbSBram Moolenaar  endfor
2034e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
20350ad3e894SBram Moolenaar
2036cfcd011fSBram Moolenaar  var concat = ''
20370ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
20380ad3e894SBram Moolenaar    concat ..= str
20390ad3e894SBram Moolenaar  endfor
20400ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
204138bd8de5SBram Moolenaar
204238bd8de5SBram Moolenaar  var total = 0
204338bd8de5SBram Moolenaar  for nr in
204438bd8de5SBram Moolenaar      [1, 2, 3]
204538bd8de5SBram Moolenaar    total += nr
204638bd8de5SBram Moolenaar  endfor
204738bd8de5SBram Moolenaar  assert_equal(6, total)
204838bd8de5SBram Moolenaar
204938bd8de5SBram Moolenaar  total = 0
205038bd8de5SBram Moolenaar  for nr
205138bd8de5SBram Moolenaar    in [1, 2, 3]
205238bd8de5SBram Moolenaar    total += nr
205338bd8de5SBram Moolenaar  endfor
205438bd8de5SBram Moolenaar  assert_equal(6, total)
205538bd8de5SBram Moolenaar
205638bd8de5SBram Moolenaar  total = 0
205738bd8de5SBram Moolenaar  for nr
205838bd8de5SBram Moolenaar    in
205938bd8de5SBram Moolenaar    [1, 2, 3]
206038bd8de5SBram Moolenaar    total += nr
206138bd8de5SBram Moolenaar  endfor
206238bd8de5SBram Moolenaar  assert_equal(6, total)
2063e8c4abbbSBram Moolenaarenddef
2064e8c4abbbSBram Moolenaar
2065e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2066025cb1caSBram Moolenaar  CheckDefFailure(['for '], 'E1097:')
2067025cb1caSBram Moolenaar  CheckDefFailure(['for x'], 'E1097:')
2068025cb1caSBram Moolenaar  CheckDefFailure(['for x in'], 'E1097:')
2069675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2070675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2071cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
2072822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
20732d870f8dSBram Moolenaar  delfunc! g:Func
2074451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2075675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2076675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2077675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2078e8c4abbbSBram Moolenaarenddef
2079e8c4abbbSBram Moolenaar
2080ea87069dSBram Moolenaardef Test_for_loop_script_var()
2081ea87069dSBram Moolenaar  # cannot use s:var in a :def function
2082ea87069dSBram Moolenaar  CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2083ea87069dSBram Moolenaar
2084ea87069dSBram Moolenaar  # can use s:var in Vim9 script, with or without s:
2085ea87069dSBram Moolenaar  var lines =<< trim END
2086ea87069dSBram Moolenaar    vim9script
2087ea87069dSBram Moolenaar    var total = 0
2088ea87069dSBram Moolenaar    for s:var in [1, 2, 3]
2089ea87069dSBram Moolenaar      total += s:var
2090ea87069dSBram Moolenaar    endfor
2091ea87069dSBram Moolenaar    assert_equal(6, total)
2092ea87069dSBram Moolenaar
2093ea87069dSBram Moolenaar    total = 0
2094ea87069dSBram Moolenaar    for var in [1, 2, 3]
2095ea87069dSBram Moolenaar      total += var
2096ea87069dSBram Moolenaar    endfor
2097ea87069dSBram Moolenaar    assert_equal(6, total)
2098ea87069dSBram Moolenaar  END
2099ea87069dSBram Moolenaarenddef
2100ea87069dSBram Moolenaar
2101792f786aSBram Moolenaardef Test_for_loop_unpack()
21024b8a0651SBram Moolenaar  var lines =<< trim END
2103792f786aSBram Moolenaar      var result = []
2104792f786aSBram Moolenaar      for [v1, v2] in [[1, 2], [3, 4]]
2105792f786aSBram Moolenaar        result->add(v1)
2106792f786aSBram Moolenaar        result->add(v2)
2107792f786aSBram Moolenaar      endfor
2108792f786aSBram Moolenaar      assert_equal([1, 2, 3, 4], result)
2109792f786aSBram Moolenaar
2110792f786aSBram Moolenaar      result = []
2111792f786aSBram Moolenaar      for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2112792f786aSBram Moolenaar        result->add(v1)
2113792f786aSBram Moolenaar        result->add(v2)
2114792f786aSBram Moolenaar        result->add(v3)
2115792f786aSBram Moolenaar      endfor
2116792f786aSBram Moolenaar      assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2117792f786aSBram Moolenaar
21184b8a0651SBram Moolenaar      result = []
21194b8a0651SBram Moolenaar      for [&ts, &sw] in [[1, 2], [3, 4]]
21204b8a0651SBram Moolenaar        result->add(&ts)
21214b8a0651SBram Moolenaar        result->add(&sw)
21224b8a0651SBram Moolenaar      endfor
21234b8a0651SBram Moolenaar      assert_equal([1, 2, 3, 4], result)
21244b8a0651SBram Moolenaar
21254b8a0651SBram Moolenaar      var slist: list<string>
21264b8a0651SBram Moolenaar      for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
21274b8a0651SBram Moolenaar        slist->add($LOOPVAR)
21284b8a0651SBram Moolenaar        slist->add(@r)
21294b8a0651SBram Moolenaar        slist->add(v:errmsg)
21304b8a0651SBram Moolenaar      endfor
21314b8a0651SBram Moolenaar      assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
21324b8a0651SBram Moolenaar
21334b8a0651SBram Moolenaar      slist = []
21344b8a0651SBram Moolenaar      for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
21354b8a0651SBram Moolenaar        slist->add(g:globalvar)
21364b8a0651SBram Moolenaar        slist->add(b:bufvar)
21374b8a0651SBram Moolenaar        slist->add(w:winvar)
21384b8a0651SBram Moolenaar        slist->add(t:tabvar)
21394b8a0651SBram Moolenaar      endfor
21404b8a0651SBram Moolenaar      assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
2141f6c177abSBram Moolenaar      unlet! g:globalvar b:bufvar w:winvar t:tabvar
21424b8a0651SBram Moolenaar  END
21434b8a0651SBram Moolenaar  CheckDefAndScriptSuccess(lines)
21444b8a0651SBram Moolenaar
21454b8a0651SBram Moolenaar  lines =<< trim END
2146792f786aSBram Moolenaar      for [v1, v2] in [[1, 2, 3], [3, 4]]
2147792f786aSBram Moolenaar        echo v1 v2
2148792f786aSBram Moolenaar      endfor
2149792f786aSBram Moolenaar  END
2150792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E710:', 1)
2151792f786aSBram Moolenaar
2152792f786aSBram Moolenaar  lines =<< trim END
2153792f786aSBram Moolenaar      for [v1, v2] in [[1], [3, 4]]
2154792f786aSBram Moolenaar        echo v1 v2
2155792f786aSBram Moolenaar      endfor
2156792f786aSBram Moolenaar  END
2157792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E711:', 1)
2158792f786aSBram Moolenaar
2159792f786aSBram Moolenaar  lines =<< trim END
2160792f786aSBram Moolenaar      for [v1, v1] in [[1, 2], [3, 4]]
2161792f786aSBram Moolenaar        echo v1
2162792f786aSBram Moolenaar      endfor
2163792f786aSBram Moolenaar  END
2164792f786aSBram Moolenaar  CheckDefExecFailure(lines, 'E1017:', 1)
2165792f786aSBram Moolenaarenddef
2166792f786aSBram Moolenaar
2167d0df1aacSBram Moolenaardef Test_while_loop()
2168cfcd011fSBram Moolenaar  var result = ''
2169cfcd011fSBram Moolenaar  var cnt = 0
2170d0df1aacSBram Moolenaar  while cnt < 555
2171d0df1aacSBram Moolenaar    if cnt == 3
2172d0df1aacSBram Moolenaar      break
2173d0df1aacSBram Moolenaar    endif
2174d0df1aacSBram Moolenaar    cnt += 1
2175d0df1aacSBram Moolenaar    if cnt == 2
2176d0df1aacSBram Moolenaar      continue
2177d0df1aacSBram Moolenaar    endif
2178d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2179d0df1aacSBram Moolenaar  endwhile
2180d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2181d0df1aacSBram Moolenaarenddef
2182d0df1aacSBram Moolenaar
2183e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2184675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2185675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2186675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2187675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2188675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2189675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2190675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2191bd5da371SBram Moolenaarenddef
2192bd5da371SBram Moolenaar
21939645e2d9SBram Moolenaardef Test_interrupt_loop()
2194cfcd011fSBram Moolenaar  var caught = false
2195cfcd011fSBram Moolenaar  var x = 0
219697acfc78SBram Moolenaar  try
21979645e2d9SBram Moolenaar    while 1
21989645e2d9SBram Moolenaar      x += 1
21999645e2d9SBram Moolenaar      if x == 100
22009645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
22019645e2d9SBram Moolenaar      endif
22029645e2d9SBram Moolenaar    endwhile
220397acfc78SBram Moolenaar  catch
220497acfc78SBram Moolenaar    caught = true
220597acfc78SBram Moolenaar    assert_equal(100, x)
220697acfc78SBram Moolenaar  endtry
220797acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
220825859dd7SBram Moolenaar  # consume the CTRL-C
220925859dd7SBram Moolenaar  getchar(0)
22109645e2d9SBram Moolenaarenddef
221120431c9dSBram Moolenaar
22124fdae999SBram Moolenaardef Test_automatic_line_continuation()
2213cfcd011fSBram Moolenaar  var mylist = [
22144fdae999SBram Moolenaar      'one',
22154fdae999SBram Moolenaar      'two',
22164fdae999SBram Moolenaar      'three',
2217f5be8cdbSBram Moolenaar      ] # comment
22184fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
22194fdae999SBram Moolenaar
2220cfcd011fSBram Moolenaar  var mydict = {
2221e0de171eSBram Moolenaar      ['one']: 1,
2222e0de171eSBram Moolenaar      ['two']: 2,
2223e0de171eSBram Moolenaar      ['three']:
22244fdae999SBram Moolenaar          3,
2225f5be8cdbSBram Moolenaar      } # comment
2226e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2227e0de171eSBram Moolenaar  mydict = {
22282c330432SBram Moolenaar      one: 1,  # comment
22292c330432SBram Moolenaar      two:     # comment
22302c330432SBram Moolenaar           2,  # comment
22312c330432SBram Moolenaar      three: 3 # comment
22322c330432SBram Moolenaar      }
2233e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2234e0de171eSBram Moolenaar  mydict = {
22352c330432SBram Moolenaar      one: 1,
22364fdae999SBram Moolenaar      two:
22374fdae999SBram Moolenaar           2,
22382c330432SBram Moolenaar      three: 3
22394fdae999SBram Moolenaar      }
2240e0de171eSBram Moolenaar  assert_equal({one: 1, two: 2, three: 3}, mydict)
2241e6085c53SBram Moolenaar
2242e6085c53SBram Moolenaar  assert_equal(
2243e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2244e6085c53SBram Moolenaar        split('one two three')
2245e6085c53SBram Moolenaar        )
22464fdae999SBram Moolenaarenddef
22474fdae999SBram Moolenaar
22487a092245SBram Moolenaardef Test_vim9_comment()
22497a092245SBram Moolenaar  CheckScriptSuccess([
22507a092245SBram Moolenaar      'vim9script',
22517a092245SBram Moolenaar      '# something',
225293f82cbeSBram Moolenaar      '#something',
225393f82cbeSBram Moolenaar      '#{something',
22547a092245SBram Moolenaar      ])
225593f82cbeSBram Moolenaar
225693f82cbeSBram Moolenaar  split Xfile
225793f82cbeSBram Moolenaar  CheckScriptSuccess([
225893f82cbeSBram Moolenaar      'vim9script',
225993f82cbeSBram Moolenaar      'edit #something',
226093f82cbeSBram Moolenaar      ])
226193f82cbeSBram Moolenaar  CheckScriptSuccess([
226293f82cbeSBram Moolenaar      'vim9script',
226393f82cbeSBram Moolenaar      'edit #{something',
226493f82cbeSBram Moolenaar      ])
226593f82cbeSBram Moolenaar  close
226693f82cbeSBram Moolenaar
22677a092245SBram Moolenaar  CheckScriptFailure([
22687a092245SBram Moolenaar      'vim9script',
22697a092245SBram Moolenaar      ':# something',
22707a092245SBram Moolenaar      ], 'E488:')
22717a092245SBram Moolenaar  CheckScriptFailure([
22727a092245SBram Moolenaar      '# something',
22737a092245SBram Moolenaar      ], 'E488:')
22747a092245SBram Moolenaar  CheckScriptFailure([
22757a092245SBram Moolenaar      ':# something',
22767a092245SBram Moolenaar      ], 'E488:')
22777a092245SBram Moolenaar
22784a8d9f2eSBram Moolenaar  { # block start
22794a8d9f2eSBram Moolenaar  } # block end
22804a8d9f2eSBram Moolenaar  CheckDefFailure([
22814a8d9f2eSBram Moolenaar      '{# comment',
22824a8d9f2eSBram Moolenaar      ], 'E488:')
22834a8d9f2eSBram Moolenaar  CheckDefFailure([
22844a8d9f2eSBram Moolenaar      '{',
22854a8d9f2eSBram Moolenaar      '}# comment',
22864a8d9f2eSBram Moolenaar      ], 'E488:')
22874a8d9f2eSBram Moolenaar
22884a8d9f2eSBram Moolenaar  echo "yes" # comment
22894a8d9f2eSBram Moolenaar  CheckDefFailure([
22904a8d9f2eSBram Moolenaar      'echo "yes"# comment',
22914a8d9f2eSBram Moolenaar      ], 'E488:')
22927a092245SBram Moolenaar  CheckScriptSuccess([
22937a092245SBram Moolenaar      'vim9script',
22947a092245SBram Moolenaar      'echo "yes" # something',
22957a092245SBram Moolenaar      ])
22967a092245SBram Moolenaar  CheckScriptFailure([
22977a092245SBram Moolenaar      'vim9script',
22987a092245SBram Moolenaar      'echo "yes"# something',
22997a092245SBram Moolenaar      ], 'E121:')
23007a092245SBram Moolenaar  CheckScriptFailure([
23017a092245SBram Moolenaar      'vim9script',
23027a092245SBram Moolenaar      'echo# something',
2303f8103f27SBram Moolenaar      ], 'E1144:')
23047a092245SBram Moolenaar  CheckScriptFailure([
23057a092245SBram Moolenaar      'echo "yes" # something',
23067a092245SBram Moolenaar      ], 'E121:')
23077a092245SBram Moolenaar
23084a8d9f2eSBram Moolenaar  exe "echo" # comment
23094a8d9f2eSBram Moolenaar  CheckDefFailure([
23104a8d9f2eSBram Moolenaar      'exe "echo"# comment',
23114a8d9f2eSBram Moolenaar      ], 'E488:')
23124a8d9f2eSBram Moolenaar  CheckScriptSuccess([
23134a8d9f2eSBram Moolenaar      'vim9script',
23144a8d9f2eSBram Moolenaar      'exe "echo" # something',
23154a8d9f2eSBram Moolenaar      ])
23164a8d9f2eSBram Moolenaar  CheckScriptFailure([
23174a8d9f2eSBram Moolenaar      'vim9script',
23184a8d9f2eSBram Moolenaar      'exe "echo"# something',
23194a8d9f2eSBram Moolenaar      ], 'E121:')
23204a8d9f2eSBram Moolenaar  CheckScriptFailure([
23214a8d9f2eSBram Moolenaar      'vim9script',
23224a8d9f2eSBram Moolenaar      'exe# something',
2323f8103f27SBram Moolenaar      ], 'E1144:')
23244a8d9f2eSBram Moolenaar  CheckScriptFailure([
23254a8d9f2eSBram Moolenaar      'exe "echo" # something',
23264a8d9f2eSBram Moolenaar      ], 'E121:')
23274a8d9f2eSBram Moolenaar
23287a092245SBram Moolenaar  CheckDefFailure([
23297a092245SBram Moolenaar      'try# comment',
23307a092245SBram Moolenaar      '  echo "yes"',
23317a092245SBram Moolenaar      'catch',
23327a092245SBram Moolenaar      'endtry',
2333f8103f27SBram Moolenaar      ], 'E1144:')
23342c5ed4e3SBram Moolenaar  CheckScriptFailure([
23352c5ed4e3SBram Moolenaar      'vim9script',
23362c5ed4e3SBram Moolenaar      'try# comment',
23372c5ed4e3SBram Moolenaar      'echo "yes"',
2338f8103f27SBram Moolenaar      ], 'E1144:')
23397a092245SBram Moolenaar  CheckDefFailure([
23407a092245SBram Moolenaar      'try',
2341a72cfb80SBram Moolenaar      '  throw#comment',
2342a72cfb80SBram Moolenaar      'catch',
2343a72cfb80SBram Moolenaar      'endtry',
2344f8103f27SBram Moolenaar      ], 'E1144:')
2345a72cfb80SBram Moolenaar  CheckDefFailure([
2346a72cfb80SBram Moolenaar      'try',
2347a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2348a72cfb80SBram Moolenaar      'catch',
2349a72cfb80SBram Moolenaar      'endtry',
2350a72cfb80SBram Moolenaar      ], 'E488:')
2351a72cfb80SBram Moolenaar  CheckDefFailure([
2352a72cfb80SBram Moolenaar      'try',
23537a092245SBram Moolenaar      '  echo "yes"',
23547a092245SBram Moolenaar      'catch# comment',
23557a092245SBram Moolenaar      'endtry',
2356f8103f27SBram Moolenaar      ], 'E1144:')
23572c5ed4e3SBram Moolenaar  CheckScriptFailure([
23582c5ed4e3SBram Moolenaar      'vim9script',
23592c5ed4e3SBram Moolenaar      'try',
23602c5ed4e3SBram Moolenaar      '  echo "yes"',
23612c5ed4e3SBram Moolenaar      'catch# comment',
23622c5ed4e3SBram Moolenaar      'endtry',
2363f8103f27SBram Moolenaar      ], 'E1144:')
23642c5ed4e3SBram Moolenaar  CheckDefFailure([
23652c5ed4e3SBram Moolenaar      'try',
23662c5ed4e3SBram Moolenaar      '  echo "yes"',
23672c5ed4e3SBram Moolenaar      'catch /pat/# comment',
23682c5ed4e3SBram Moolenaar      'endtry',
23692c5ed4e3SBram Moolenaar      ], 'E488:')
23707a092245SBram Moolenaar  CheckDefFailure([
23717a092245SBram Moolenaar      'try',
23727a092245SBram Moolenaar      'echo "yes"',
23737a092245SBram Moolenaar      'catch',
23747a092245SBram Moolenaar      'endtry# comment',
2375f8103f27SBram Moolenaar      ], 'E1144:')
23762c5ed4e3SBram Moolenaar  CheckScriptFailure([
23772c5ed4e3SBram Moolenaar      'vim9script',
23782c5ed4e3SBram Moolenaar      'try',
23792c5ed4e3SBram Moolenaar      '  echo "yes"',
23802c5ed4e3SBram Moolenaar      'catch',
23812c5ed4e3SBram Moolenaar      'endtry# comment',
2382f8103f27SBram Moolenaar      ], 'E1144:')
23832c5ed4e3SBram Moolenaar
23842c5ed4e3SBram Moolenaar  CheckScriptSuccess([
23852c5ed4e3SBram Moolenaar      'vim9script',
23862c5ed4e3SBram Moolenaar      'hi # comment',
23872c5ed4e3SBram Moolenaar      ])
23882c5ed4e3SBram Moolenaar  CheckScriptFailure([
23892c5ed4e3SBram Moolenaar      'vim9script',
23902c5ed4e3SBram Moolenaar      'hi# comment',
2391f8103f27SBram Moolenaar      ], 'E1144:')
23921966c248SBram Moolenaar  CheckScriptSuccess([
23931966c248SBram Moolenaar      'vim9script',
23941966c248SBram Moolenaar      'hi Search # comment',
23951966c248SBram Moolenaar      ])
23961966c248SBram Moolenaar  CheckScriptFailure([
23971966c248SBram Moolenaar      'vim9script',
23981966c248SBram Moolenaar      'hi Search# comment',
23991966c248SBram Moolenaar      ], 'E416:')
24001966c248SBram Moolenaar  CheckScriptSuccess([
24011966c248SBram Moolenaar      'vim9script',
24021966c248SBram Moolenaar      'hi link This Search # comment',
24031966c248SBram Moolenaar      ])
24041966c248SBram Moolenaar  CheckScriptFailure([
24051966c248SBram Moolenaar      'vim9script',
24061966c248SBram Moolenaar      'hi link This That# comment',
24071966c248SBram Moolenaar      ], 'E413:')
24081966c248SBram Moolenaar  CheckScriptSuccess([
24091966c248SBram Moolenaar      'vim9script',
24101966c248SBram Moolenaar      'hi clear This # comment',
24111966c248SBram Moolenaar      'hi clear # comment',
24121966c248SBram Moolenaar      ])
2413f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2414f5be8cdbSBram Moolenaar  # hi clear This# comment',
24151966c248SBram Moolenaar  CheckScriptFailure([
24161966c248SBram Moolenaar      'vim9script',
24171966c248SBram Moolenaar      'hi clear# comment',
24181966c248SBram Moolenaar      ], 'E416:')
24191966c248SBram Moolenaar
24201966c248SBram Moolenaar  CheckScriptSuccess([
24211966c248SBram Moolenaar      'vim9script',
24221966c248SBram Moolenaar      'hi Group term=bold',
24231966c248SBram Moolenaar      'match Group /todo/ # comment',
24241966c248SBram Moolenaar      ])
24251966c248SBram Moolenaar  CheckScriptFailure([
24261966c248SBram Moolenaar      'vim9script',
24271966c248SBram Moolenaar      'hi Group term=bold',
24281966c248SBram Moolenaar      'match Group /todo/# comment',
24291966c248SBram Moolenaar      ], 'E488:')
24301966c248SBram Moolenaar  CheckScriptSuccess([
24311966c248SBram Moolenaar      'vim9script',
24321966c248SBram Moolenaar      'match # comment',
24331966c248SBram Moolenaar      ])
24341966c248SBram Moolenaar  CheckScriptFailure([
24351966c248SBram Moolenaar      'vim9script',
24361966c248SBram Moolenaar      'match# comment',
2437f8103f27SBram Moolenaar      ], 'E1144:')
24381966c248SBram Moolenaar  CheckScriptSuccess([
24391966c248SBram Moolenaar      'vim9script',
24401966c248SBram Moolenaar      'match none # comment',
24411966c248SBram Moolenaar      ])
24421966c248SBram Moolenaar  CheckScriptFailure([
24431966c248SBram Moolenaar      'vim9script',
24441966c248SBram Moolenaar      'match none# comment',
24451966c248SBram Moolenaar      ], 'E475:')
24461966c248SBram Moolenaar
24471966c248SBram Moolenaar  CheckScriptSuccess([
24481966c248SBram Moolenaar      'vim9script',
24491966c248SBram Moolenaar      'menutrans clear # comment',
24501966c248SBram Moolenaar      ])
24511966c248SBram Moolenaar  CheckScriptFailure([
24521966c248SBram Moolenaar      'vim9script',
24531966c248SBram Moolenaar      'menutrans clear# comment text',
24541966c248SBram Moolenaar      ], 'E474:')
24551966c248SBram Moolenaar
24561966c248SBram Moolenaar  CheckScriptSuccess([
24571966c248SBram Moolenaar      'vim9script',
24581966c248SBram Moolenaar      'syntax clear # comment',
24591966c248SBram Moolenaar      ])
24601966c248SBram Moolenaar  CheckScriptFailure([
24611966c248SBram Moolenaar      'vim9script',
24621966c248SBram Moolenaar      'syntax clear# comment text',
24631966c248SBram Moolenaar      ], 'E28:')
24641966c248SBram Moolenaar  CheckScriptSuccess([
24651966c248SBram Moolenaar      'vim9script',
24661966c248SBram Moolenaar      'syntax keyword Word some',
24671966c248SBram Moolenaar      'syntax clear Word # comment',
24681966c248SBram Moolenaar      ])
24691966c248SBram Moolenaar  CheckScriptFailure([
24701966c248SBram Moolenaar      'vim9script',
24711966c248SBram Moolenaar      'syntax keyword Word some',
24721966c248SBram Moolenaar      'syntax clear Word# comment text',
24731966c248SBram Moolenaar      ], 'E28:')
24741966c248SBram Moolenaar
24751966c248SBram Moolenaar  CheckScriptSuccess([
24761966c248SBram Moolenaar      'vim9script',
24771966c248SBram Moolenaar      'syntax list # comment',
24781966c248SBram Moolenaar      ])
24791966c248SBram Moolenaar  CheckScriptFailure([
24801966c248SBram Moolenaar      'vim9script',
24811966c248SBram Moolenaar      'syntax list# comment text',
24821966c248SBram Moolenaar      ], 'E28:')
24831966c248SBram Moolenaar
24841966c248SBram Moolenaar  CheckScriptSuccess([
24851966c248SBram Moolenaar      'vim9script',
24861966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
24871966c248SBram Moolenaar      ])
24881966c248SBram Moolenaar  CheckScriptFailure([
24891966c248SBram Moolenaar      'vim9script',
24901966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
24911966c248SBram Moolenaar      ], 'E475:')
24921966c248SBram Moolenaar
24931966c248SBram Moolenaar  CheckScriptSuccess([
24941966c248SBram Moolenaar      'vim9script',
24951966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
24961966c248SBram Moolenaar      ])
24971966c248SBram Moolenaar  CheckScriptFailure([
24981966c248SBram Moolenaar      'vim9script',
24991966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
25001966c248SBram Moolenaar      ], 'E789:')
25011966c248SBram Moolenaar
25021966c248SBram Moolenaar  CheckScriptSuccess([
25031966c248SBram Moolenaar      'vim9script',
25041966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
25051966c248SBram Moolenaar      ])
25061966c248SBram Moolenaar  CheckScriptFailure([
25071966c248SBram Moolenaar      'vim9script',
25081966c248SBram Moolenaar      'syntax match Word /pat/# comment',
25091966c248SBram Moolenaar      ], 'E402:')
25101966c248SBram Moolenaar
25111966c248SBram Moolenaar  CheckScriptSuccess([
25121966c248SBram Moolenaar      'vim9script',
25131966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
25141966c248SBram Moolenaar      ])
25151966c248SBram Moolenaar  CheckScriptFailure([
25161966c248SBram Moolenaar      'vim9script',
25171966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
25181966c248SBram Moolenaar      ], 'E475:')
25191966c248SBram Moolenaar  CheckScriptFailure([
25201966c248SBram Moolenaar      'vim9script',
25211966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
25221966c248SBram Moolenaar      ], 'E406:')
25231966c248SBram Moolenaar  CheckScriptFailure([
25241966c248SBram Moolenaar      'vim9script',
25251966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
25261966c248SBram Moolenaar      ], 'E475:')
25271966c248SBram Moolenaar
25281966c248SBram Moolenaar  CheckScriptSuccess([
25291966c248SBram Moolenaar      'vim9script',
25301966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
25311966c248SBram Moolenaar      ])
25321966c248SBram Moolenaar  CheckScriptFailure([
25331966c248SBram Moolenaar      'vim9script',
25341966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2535d032f34aSBram Moolenaar      ], 'E402:')
25361966c248SBram Moolenaar
25371966c248SBram Moolenaar  CheckScriptSuccess([
25381966c248SBram Moolenaar      'vim9script',
25391966c248SBram Moolenaar      'syntax sync # comment',
25401966c248SBram Moolenaar      ])
25411966c248SBram Moolenaar  CheckScriptFailure([
25421966c248SBram Moolenaar      'vim9script',
25431966c248SBram Moolenaar      'syntax sync# comment',
25441966c248SBram Moolenaar      ], 'E404:')
25451966c248SBram Moolenaar  CheckScriptSuccess([
25461966c248SBram Moolenaar      'vim9script',
25471966c248SBram Moolenaar      'syntax sync ccomment # comment',
25481966c248SBram Moolenaar      ])
25491966c248SBram Moolenaar  CheckScriptFailure([
25501966c248SBram Moolenaar      'vim9script',
25511966c248SBram Moolenaar      'syntax sync ccomment# comment',
25521966c248SBram Moolenaar      ], 'E404:')
25531966c248SBram Moolenaar
25541966c248SBram Moolenaar  CheckScriptSuccess([
25551966c248SBram Moolenaar      'vim9script',
25561966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
25571966c248SBram Moolenaar      ])
25581966c248SBram Moolenaar  CheckScriptFailure([
25591966c248SBram Moolenaar      'vim9script',
25601966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
25611966c248SBram Moolenaar      ], 'E475:')
2562a72cfb80SBram Moolenaar
2563a72cfb80SBram Moolenaar  CheckScriptSuccess([
2564a72cfb80SBram Moolenaar      'vim9script',
2565a72cfb80SBram Moolenaar      'command Echo echo # comment',
2566a72cfb80SBram Moolenaar      'command Echo # comment',
25672d870f8dSBram Moolenaar      'delcommand Echo',
2568a72cfb80SBram Moolenaar      ])
2569a72cfb80SBram Moolenaar  CheckScriptFailure([
2570a72cfb80SBram Moolenaar      'vim9script',
2571a72cfb80SBram Moolenaar      'command Echo echo# comment',
2572a72cfb80SBram Moolenaar      'Echo',
2573f8103f27SBram Moolenaar      ], 'E1144:')
25742d870f8dSBram Moolenaar  delcommand Echo
257570249ee8SBram Moolenaar
257670249ee8SBram Moolenaar  var curdir = getcwd()
257770249ee8SBram Moolenaar  CheckScriptSuccess([
257870249ee8SBram Moolenaar      'command Echo cd " comment',
257970249ee8SBram Moolenaar      'Echo',
258070249ee8SBram Moolenaar      'delcommand Echo',
258170249ee8SBram Moolenaar      ])
258270249ee8SBram Moolenaar  CheckScriptSuccess([
2583090728adSBram Moolenaar      'vim9script',
258470249ee8SBram Moolenaar      'command Echo cd # comment',
258570249ee8SBram Moolenaar      'Echo',
258670249ee8SBram Moolenaar      'delcommand Echo',
258770249ee8SBram Moolenaar      ])
258870249ee8SBram Moolenaar  CheckScriptFailure([
258970249ee8SBram Moolenaar      'vim9script',
259070249ee8SBram Moolenaar      'command Echo cd " comment',
259170249ee8SBram Moolenaar      'Echo',
259270249ee8SBram Moolenaar      ], 'E344:')
259370249ee8SBram Moolenaar  delcommand Echo
259470249ee8SBram Moolenaar  chdir(curdir)
259570249ee8SBram Moolenaar
2596a72cfb80SBram Moolenaar  CheckScriptFailure([
2597a72cfb80SBram Moolenaar      'vim9script',
2598a72cfb80SBram Moolenaar      'command Echo# comment',
2599a72cfb80SBram Moolenaar      ], 'E182:')
2600a72cfb80SBram Moolenaar  CheckScriptFailure([
2601a72cfb80SBram Moolenaar      'vim9script',
2602a72cfb80SBram Moolenaar      'command Echo echo',
2603a72cfb80SBram Moolenaar      'command Echo# comment',
2604a72cfb80SBram Moolenaar      ], 'E182:')
26052d870f8dSBram Moolenaar  delcommand Echo
2606a72cfb80SBram Moolenaar
2607a72cfb80SBram Moolenaar  CheckScriptSuccess([
2608a72cfb80SBram Moolenaar      'vim9script',
2609a72cfb80SBram Moolenaar      'function # comment',
2610a72cfb80SBram Moolenaar      ])
2611a72cfb80SBram Moolenaar  CheckScriptFailure([
2612a72cfb80SBram Moolenaar      'vim9script',
26139898107fSBram Moolenaar      'function " comment',
26149898107fSBram Moolenaar      ], 'E129:')
26159898107fSBram Moolenaar  CheckScriptFailure([
26169898107fSBram Moolenaar      'vim9script',
2617a72cfb80SBram Moolenaar      'function# comment',
2618f8103f27SBram Moolenaar      ], 'E1144:')
2619a72cfb80SBram Moolenaar  CheckScriptSuccess([
2620a72cfb80SBram Moolenaar      'vim9script',
2621a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2622a72cfb80SBram Moolenaar      ])
2623a72cfb80SBram Moolenaar  CheckScriptFailure([
2624a72cfb80SBram Moolenaar      'vim9script',
2625a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2626a72cfb80SBram Moolenaar      ], 'E488:')
2627a72cfb80SBram Moolenaar
2628a72cfb80SBram Moolenaar  CheckScriptSuccess([
2629a72cfb80SBram Moolenaar      'vim9script',
26304c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2631a72cfb80SBram Moolenaar      'endfunc',
26324c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2633a72cfb80SBram Moolenaar      ])
2634a72cfb80SBram Moolenaar  CheckScriptFailure([
2635a72cfb80SBram Moolenaar      'vim9script',
26364c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2637a72cfb80SBram Moolenaar      'endfunc',
26384c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2639a72cfb80SBram Moolenaar      ], 'E488:')
2640a72cfb80SBram Moolenaar
2641a72cfb80SBram Moolenaar  CheckScriptSuccess([
2642a72cfb80SBram Moolenaar      'vim9script',
2643a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2644a72cfb80SBram Moolenaar      ])
2645a72cfb80SBram Moolenaar  CheckScriptFailure([
2646a72cfb80SBram Moolenaar      'vim9script',
2647a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2648a72cfb80SBram Moolenaar      ], 'E488:')
2649e7e4838fSBram Moolenaar
2650e7e4838fSBram Moolenaar  CheckScriptFailure([
2651e7e4838fSBram Moolenaar      'def Test() " comment',
2652e7e4838fSBram Moolenaar      'enddef',
2653e7e4838fSBram Moolenaar      ], 'E488:')
2654e7e4838fSBram Moolenaar  CheckScriptFailure([
2655e7e4838fSBram Moolenaar      'vim9script',
2656e7e4838fSBram Moolenaar      'def Test() " comment',
2657e7e4838fSBram Moolenaar      'enddef',
2658e7e4838fSBram Moolenaar      ], 'E488:')
2659e7e4838fSBram Moolenaar
2660e7e4838fSBram Moolenaar  CheckScriptSuccess([
2661e7e4838fSBram Moolenaar      'func Test() " comment',
2662e7e4838fSBram Moolenaar      'endfunc',
26632d870f8dSBram Moolenaar      'delfunc Test',
2664e7e4838fSBram Moolenaar      ])
26659898107fSBram Moolenaar  CheckScriptSuccess([
2666e7e4838fSBram Moolenaar      'vim9script',
2667e7e4838fSBram Moolenaar      'func Test() " comment',
2668e7e4838fSBram Moolenaar      'endfunc',
26699898107fSBram Moolenaar      ])
2670e7e4838fSBram Moolenaar
2671e7e4838fSBram Moolenaar  CheckScriptSuccess([
2672e7e4838fSBram Moolenaar      'def Test() # comment',
2673e7e4838fSBram Moolenaar      'enddef',
2674e7e4838fSBram Moolenaar      ])
2675e7e4838fSBram Moolenaar  CheckScriptFailure([
2676e7e4838fSBram Moolenaar      'func Test() # comment',
2677e7e4838fSBram Moolenaar      'endfunc',
2678e7e4838fSBram Moolenaar      ], 'E488:')
26792c5ed4e3SBram Moolenaarenddef
26802c5ed4e3SBram Moolenaar
26812c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
26822c5ed4e3SBram Moolenaar  CheckCanRunGui
26832c5ed4e3SBram Moolenaar
26842c5ed4e3SBram Moolenaar  CheckScriptFailure([
26852c5ed4e3SBram Moolenaar      'vim9script',
26862c5ed4e3SBram Moolenaar      'gui#comment'
2687f8103f27SBram Moolenaar      ], 'E1144:')
26882c5ed4e3SBram Moolenaar  CheckScriptFailure([
26892c5ed4e3SBram Moolenaar      'vim9script',
26902c5ed4e3SBram Moolenaar      'gui -f#comment'
26912c5ed4e3SBram Moolenaar      ], 'E499:')
26927a092245SBram Moolenaarenddef
26937a092245SBram Moolenaar
2694a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
26956797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
26966797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2697a26b9700SBram Moolenaar
2698a26b9700SBram Moolenaar  edit test.vim
2699a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2700a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2701a26b9700SBram Moolenaar
2702a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2703a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2704a26b9700SBram Moolenaar
2705a26b9700SBram Moolenaar  g:entered = 0
2706a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2707a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2708a26b9700SBram Moolenaar
2709a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2710a26b9700SBram Moolenaar
2711a26b9700SBram Moolenaar  au! TabEnter
2712a26b9700SBram Moolenaar  unlet g:entered
2713d72c1bf0SBram Moolenaar
2714d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2715d72c1bf0SBram Moolenaar      'vim9script',
27166797966dSBram Moolenaar      'g:var = 123',
2717e55b1c09SBram Moolenaar      'b:var = 456',
2718e55b1c09SBram Moolenaar      'w:var = 777',
2719e55b1c09SBram Moolenaar      't:var = 888',
2720d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2721d72c1bf0SBram Moolenaar      ])
2722d72c1bf0SBram Moolenaar
2723d72c1bf0SBram Moolenaar  CheckScriptFailure([
2724d72c1bf0SBram Moolenaar      'vim9script',
2725cfcd011fSBram Moolenaar      'let var = 123',
2726cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2727cfcd011fSBram Moolenaar
2728cfcd011fSBram Moolenaar  CheckScriptFailure([
2729cfcd011fSBram Moolenaar      'vim9script',
2730cfcd011fSBram Moolenaar      'var g:var = 123',
2731e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2732e55b1c09SBram Moolenaar
2733e55b1c09SBram Moolenaar  CheckScriptFailure([
2734e55b1c09SBram Moolenaar      'vim9script',
2735cfcd011fSBram Moolenaar      'var b:var = 123',
2736e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2737e55b1c09SBram Moolenaar
2738e55b1c09SBram Moolenaar  CheckScriptFailure([
2739e55b1c09SBram Moolenaar      'vim9script',
2740cfcd011fSBram Moolenaar      'var w:var = 123',
2741e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2742e55b1c09SBram Moolenaar
2743e55b1c09SBram Moolenaar  CheckScriptFailure([
2744e55b1c09SBram Moolenaar      'vim9script',
2745cfcd011fSBram Moolenaar      'var t:var = 123',
2746e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2747e55b1c09SBram Moolenaar
2748e55b1c09SBram Moolenaar  CheckScriptFailure([
2749e55b1c09SBram Moolenaar      'vim9script',
2750cfcd011fSBram Moolenaar      'var v:version = 123',
2751e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2752e55b1c09SBram Moolenaar
2753e55b1c09SBram Moolenaar  CheckScriptFailure([
2754e55b1c09SBram Moolenaar      'vim9script',
2755cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2756e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
27576797966dSBram Moolenaar
27586797966dSBram Moolenaar  CheckScriptFailure([
27596797966dSBram Moolenaar      'vim9script',
27606797966dSBram Moolenaar      'g:var = 123',
276132e35117SBram Moolenaar      'unlet g:var# comment1',
2762d72c1bf0SBram Moolenaar      ], 'E108:')
2763d72c1bf0SBram Moolenaar
2764d72c1bf0SBram Moolenaar  CheckScriptFailure([
2765d72c1bf0SBram Moolenaar      'let g:var = 123',
2766d72c1bf0SBram Moolenaar      'unlet g:var # something',
2767d72c1bf0SBram Moolenaar      ], 'E488:')
2768faac4104SBram Moolenaar
2769faac4104SBram Moolenaar  CheckScriptSuccess([
2770faac4104SBram Moolenaar      'vim9script',
277132e35117SBram Moolenaar      'if 1 # comment2',
2772faac4104SBram Moolenaar      '  echo "yes"',
2773faac4104SBram Moolenaar      'elseif 2 #comment',
2774faac4104SBram Moolenaar      '  echo "no"',
2775faac4104SBram Moolenaar      'endif',
2776faac4104SBram Moolenaar      ])
2777faac4104SBram Moolenaar
2778faac4104SBram Moolenaar  CheckScriptFailure([
2779faac4104SBram Moolenaar      'vim9script',
278032e35117SBram Moolenaar      'if 1# comment3',
2781faac4104SBram Moolenaar      '  echo "yes"',
2782faac4104SBram Moolenaar      'endif',
2783faac4104SBram Moolenaar      ], 'E15:')
2784faac4104SBram Moolenaar
2785faac4104SBram Moolenaar  CheckScriptFailure([
2786faac4104SBram Moolenaar      'vim9script',
278732e35117SBram Moolenaar      'if 0 # comment4',
2788faac4104SBram Moolenaar      '  echo "yes"',
2789faac4104SBram Moolenaar      'elseif 2#comment',
2790faac4104SBram Moolenaar      '  echo "no"',
2791faac4104SBram Moolenaar      'endif',
2792faac4104SBram Moolenaar      ], 'E15:')
2793faac4104SBram Moolenaar
2794faac4104SBram Moolenaar  CheckScriptSuccess([
2795faac4104SBram Moolenaar      'vim9script',
2796cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2797faac4104SBram Moolenaar      ])
2798faac4104SBram Moolenaar
2799faac4104SBram Moolenaar  CheckScriptFailure([
2800faac4104SBram Moolenaar      'vim9script',
2801cfcd011fSBram Moolenaar      'var v = 1# comment6',
280232e35117SBram Moolenaar      ], 'E15:')
2803faac4104SBram Moolenaar
2804faac4104SBram Moolenaar  CheckScriptSuccess([
2805faac4104SBram Moolenaar      'vim9script',
2806faac4104SBram Moolenaar      'new'
2807d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2808df069eecSBram Moolenaar      ':$',
2809faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2810faac4104SBram Moolenaar      'bwipe!',
2811faac4104SBram Moolenaar      ])
2812faac4104SBram Moolenaar
2813f5be8cdbSBram Moolenaar  CheckScriptFailure([
2814f5be8cdbSBram Moolenaar      'vim9script',
2815f5be8cdbSBram Moolenaar      'new'
2816d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2817f5be8cdbSBram Moolenaar      ':$',
2818f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2819f5be8cdbSBram Moolenaar      'bwipe!',
2820f5be8cdbSBram Moolenaar      ], 'E488:')
2821f5be8cdbSBram Moolenaar
2822f5be8cdbSBram Moolenaar  CheckScriptFailure([
2823f5be8cdbSBram Moolenaar      'vim9script',
2824f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2825f5be8cdbSBram Moolenaar      ], 'E477:')
2826a26b9700SBram Moolenaarenddef
2827a26b9700SBram Moolenaar
28287e5bd91dSBram Moolenaardef Test_finish()
2829cfcd011fSBram Moolenaar  var lines =<< trim END
28307e5bd91dSBram Moolenaar    vim9script
28316797966dSBram Moolenaar    g:res = 'one'
28327e5bd91dSBram Moolenaar    if v:false | finish | endif
28336797966dSBram Moolenaar    g:res = 'two'
28347e5bd91dSBram Moolenaar    finish
28356797966dSBram Moolenaar    g:res = 'three'
28367e5bd91dSBram Moolenaar  END
28377e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
28387e5bd91dSBram Moolenaar  source Xfinished
28397e5bd91dSBram Moolenaar  assert_equal('two', g:res)
28407e5bd91dSBram Moolenaar
28417e5bd91dSBram Moolenaar  unlet g:res
28427e5bd91dSBram Moolenaar  delete('Xfinished')
28437e5bd91dSBram Moolenaarenddef
28447e5bd91dSBram Moolenaar
2845a5d0077eSBram Moolenaardef Test_forward_declaration()
2846cfcd011fSBram Moolenaar  var lines =<< trim END
2847a5d0077eSBram Moolenaar    vim9script
2848a5d0077eSBram Moolenaar    def GetValue(): string
2849a5d0077eSBram Moolenaar      return theVal
2850a5d0077eSBram Moolenaar    enddef
2851cfcd011fSBram Moolenaar    var theVal = 'something'
2852822ba247SBram Moolenaar    g:initVal = GetValue()
2853a5d0077eSBram Moolenaar    theVal = 'else'
2854a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2855a5d0077eSBram Moolenaar  END
2856a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2857a5d0077eSBram Moolenaar  source Xforward
2858a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2859a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2860a5d0077eSBram Moolenaar
2861a5d0077eSBram Moolenaar  unlet g:initVal
2862a5d0077eSBram Moolenaar  unlet g:laterVal
2863a5d0077eSBram Moolenaar  delete('Xforward')
2864a5d0077eSBram Moolenaarenddef
2865a5d0077eSBram Moolenaar
28669721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
2867a6294955SBram Moolenaar  var vim9_lines =<< trim END
2868a6294955SBram Moolenaar    vim9script
2869a6294955SBram Moolenaar    var local = 'local'
2870a6294955SBram Moolenaar    g:global = 'global'
2871a6294955SBram Moolenaar    export var exported = 'exported'
2872a6294955SBram Moolenaar    export def GetText(): string
2873a6294955SBram Moolenaar       return 'text'
2874a6294955SBram Moolenaar    enddef
2875a6294955SBram Moolenaar  END
2876a6294955SBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
2877a6294955SBram Moolenaar
2878cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
28799721fb4eSBram Moolenaar    source Xvim9_script.vim
28809721fb4eSBram Moolenaar
28819721fb4eSBram Moolenaar    call assert_false(exists('local'))
28829721fb4eSBram Moolenaar    call assert_false(exists('exported'))
28839721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
28849721fb4eSBram Moolenaar    call assert_equal('global', global)
28859721fb4eSBram Moolenaar    call assert_equal('global', g:global)
28869721fb4eSBram Moolenaar
28879721fb4eSBram Moolenaar    " imported variable becomes script-local
28889721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
28899721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
28909721fb4eSBram Moolenaar    call assert_false(exists('exported'))
28919721fb4eSBram Moolenaar
28929721fb4eSBram Moolenaar    " imported function becomes script-local
28939721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
28949721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
28959721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
28969721fb4eSBram Moolenaar  END
28979721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
28989721fb4eSBram Moolenaar
28999721fb4eSBram Moolenaar  source Xlegacy_script.vim
29009721fb4eSBram Moolenaar  assert_equal('global', g:global)
2901f5be8cdbSBram Moolenaar  unlet g:global
29029721fb4eSBram Moolenaar
29039721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
29049721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
29059721fb4eSBram Moolenaarenddef
2906a5d0077eSBram Moolenaar
29077d699701SBram Moolenaarfunc Test_vim9script_not_global()
29087d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
29097d699701SBram Moolenaar  let vim9lines =<< trim END
29107d699701SBram Moolenaar    vim9script
2911cfcd011fSBram Moolenaar    var name = 'local'
29127d699701SBram Moolenaar    func TheFunc()
29137d699701SBram Moolenaar      echo 'local'
29147d699701SBram Moolenaar    endfunc
29157d699701SBram Moolenaar    def DefFunc()
29167d699701SBram Moolenaar      echo 'local'
29177d699701SBram Moolenaar    enddef
29187d699701SBram Moolenaar  END
29197d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
29207d699701SBram Moolenaar  source Xvim9script.vim
29217d699701SBram Moolenaar  try
29227d699701SBram Moolenaar    echo g:var
29237d699701SBram Moolenaar    assert_report('did not fail')
29247d699701SBram Moolenaar  catch /E121:/
29257d699701SBram Moolenaar    " caught
29267d699701SBram Moolenaar  endtry
29277d699701SBram Moolenaar  try
29287d699701SBram Moolenaar    call TheFunc()
29297d699701SBram Moolenaar    assert_report('did not fail')
29307d699701SBram Moolenaar  catch /E117:/
29317d699701SBram Moolenaar    " caught
29327d699701SBram Moolenaar  endtry
29337d699701SBram Moolenaar  try
29347d699701SBram Moolenaar    call DefFunc()
29357d699701SBram Moolenaar    assert_report('did not fail')
29367d699701SBram Moolenaar  catch /E117:/
29377d699701SBram Moolenaar    " caught
29387d699701SBram Moolenaar  endtry
29397d699701SBram Moolenaar
294025859dd7SBram Moolenaar  call delete('Xvim9script.vim')
29417d699701SBram Moolenaarendfunc
29427d699701SBram Moolenaar
2943eeb27bfeSBram Moolenaardef Test_vim9_copen()
2944eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2945eeb27bfeSBram Moolenaar  copen
2946eeb27bfeSBram Moolenaar  quit
2947eeb27bfeSBram Moolenaarenddef
2948eeb27bfeSBram Moolenaar
294903290b84SBram Moolenaar" test using an auto-loaded function and variable
29502d6b20d6SBram Moolenaardef Test_vim9_autoload()
2951cfcd011fSBram Moolenaar  var lines =<< trim END
29522d6b20d6SBram Moolenaar     vim9script
295303290b84SBram Moolenaar     def some#gettest(): string
295403290b84SBram Moolenaar       return 'test'
295503290b84SBram Moolenaar     enddef
295603290b84SBram Moolenaar     g:some#name = 'name'
295703290b84SBram Moolenaar  END
295803290b84SBram Moolenaar
295903290b84SBram Moolenaar  mkdir('Xdir/autoload', 'p')
296003290b84SBram Moolenaar  writefile(lines, 'Xdir/autoload/some.vim')
296103290b84SBram Moolenaar  var save_rtp = &rtp
296203290b84SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
296303290b84SBram Moolenaar
296403290b84SBram Moolenaar  assert_equal('test', g:some#gettest())
296503290b84SBram Moolenaar  assert_equal('name', g:some#name)
296603290b84SBram Moolenaar  g:some#other = 'other'
296703290b84SBram Moolenaar  assert_equal('other', g:some#other)
296803290b84SBram Moolenaar
296917f700acSBram Moolenaar  # upper case script name works
297017f700acSBram Moolenaar  lines =<< trim END
297117f700acSBram Moolenaar     vim9script
297217f700acSBram Moolenaar     def Other#getOther(): string
297317f700acSBram Moolenaar       return 'other'
297417f700acSBram Moolenaar     enddef
297517f700acSBram Moolenaar  END
297617f700acSBram Moolenaar  writefile(lines, 'Xdir/autoload/Other.vim')
297717f700acSBram Moolenaar  assert_equal('other', g:Other#getOther())
297817f700acSBram Moolenaar
297903290b84SBram Moolenaar  delete('Xdir', 'rf')
298003290b84SBram Moolenaar  &rtp = save_rtp
298103290b84SBram Moolenaarenddef
298203290b84SBram Moolenaar
298303290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
298403290b84SBram Moolenaardef Test_vim9_aucmd_autoload()
298503290b84SBram Moolenaar  var lines =<< trim END
298603290b84SBram Moolenaar     vim9script
29872d6b20d6SBram Moolenaar     def foo#test()
29882d6b20d6SBram Moolenaar         echomsg getreg('"')
29892d6b20d6SBram Moolenaar     enddef
29902d6b20d6SBram Moolenaar  END
29912d6b20d6SBram Moolenaar
29922d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
29932d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
2994cfcd011fSBram Moolenaar  var save_rtp = &rtp
29952d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
29962d6b20d6SBram Moolenaar  augroup test
29972d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
29982d6b20d6SBram Moolenaar  augroup END
29992d6b20d6SBram Moolenaar
30002d6b20d6SBram Moolenaar  normal Y
30012d6b20d6SBram Moolenaar
30022d6b20d6SBram Moolenaar  augroup test
30032d6b20d6SBram Moolenaar    autocmd!
30042d6b20d6SBram Moolenaar  augroup END
30052d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
30062d6b20d6SBram Moolenaar  &rtp = save_rtp
30072d6b20d6SBram Moolenaarenddef
30082d6b20d6SBram Moolenaar
300977e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
301077e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3011cfcd011fSBram Moolenaar  var lines =<< trim END
301277e5dcc3SBram Moolenaar      vim9script
301377e5dcc3SBram Moolenaar      def crash#func()
301477e5dcc3SBram Moolenaar          try
301577e5dcc3SBram Moolenaar              for x in List()
301677e5dcc3SBram Moolenaar              endfor
301777e5dcc3SBram Moolenaar          catch
301877e5dcc3SBram Moolenaar          endtry
301977e5dcc3SBram Moolenaar          g:ok = true
302077e5dcc3SBram Moolenaar      enddef
302177e5dcc3SBram Moolenaar      fu List()
302277e5dcc3SBram Moolenaar          invalid
302377e5dcc3SBram Moolenaar      endfu
302477e5dcc3SBram Moolenaar      try
302548e11c10SBram Moolenaar          alsoinvalid
302677e5dcc3SBram Moolenaar      catch /wontmatch/
302777e5dcc3SBram Moolenaar      endtry
302877e5dcc3SBram Moolenaar  END
302977e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
303077e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
303177e5dcc3SBram Moolenaar
303277e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
303377e5dcc3SBram Moolenaar  lines =<< trim END
303477e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
303577e5dcc3SBram Moolenaar    call crash#func()
303677e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
30379c4f5520SBram Moolenaar    qall!
303877e5dcc3SBram Moolenaar  END
303977e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
304077e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
304177e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
304277e5dcc3SBram Moolenaar
304377e5dcc3SBram Moolenaar  delete('Xdidit')
304477e5dcc3SBram Moolenaar  delete('Xscript')
304577e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
304603290b84SBram Moolenaar
304703290b84SBram Moolenaar  lines =<< trim END
304803290b84SBram Moolenaar    vim9script
304903290b84SBram Moolenaar    var foo#bar = 'asdf'
305003290b84SBram Moolenaar  END
305103290b84SBram Moolenaar  CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
305277e5dcc3SBram Moolenaarenddef
305377e5dcc3SBram Moolenaar
305481e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
305581e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
305681e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
3057cfcd011fSBram Moolenaar  var lines =<< trim END
305881e17fbeSBram Moolenaar    let s:counter = 1
305981e17fbeSBram Moolenaar    def s:Func()
306081e17fbeSBram Moolenaar      au! CursorHold
306181e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
306281e17fbeSBram Moolenaar    enddef
306381e17fbeSBram Moolenaar    call s:Func()
306481e17fbeSBram Moolenaar    doau CursorHold
306581e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
306681e17fbeSBram Moolenaar    au! CursorHold
306781e17fbeSBram Moolenaar  END
306881e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
306981e17fbeSBram Moolenaarenddef
307081e17fbeSBram Moolenaar
30713896a105SBram Moolenaardef Test_cmdline_win()
30723896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
30733896a105SBram Moolenaar  # the command line window.
30743896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
3075cfcd011fSBram Moolenaar  var export_lines =<< trim END
30763896a105SBram Moolenaar    vim9script
3077cfcd011fSBram Moolenaar    export var That = 'yes'
30783896a105SBram Moolenaar  END
30793896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
3080cfcd011fSBram Moolenaar  var import_lines =<< trim END
30813896a105SBram Moolenaar    vim9script
30823896a105SBram Moolenaar    import That from './Xexport.vim'
30833896a105SBram Moolenaar  END
30843896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
3085cfcd011fSBram Moolenaar  var save_rtp = &rtp
30863896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
30873896a105SBram Moolenaar  syntax on
30883896a105SBram Moolenaar  augroup CmdWin
30893896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
30903896a105SBram Moolenaar  augroup END
30913896a105SBram Moolenaar  # this will open and also close the cmdline window
30923896a105SBram Moolenaar  feedkeys('q:', 'xt')
30933896a105SBram Moolenaar  assert_equal('yes', g:got_there)
30943896a105SBram Moolenaar
30953896a105SBram Moolenaar  augroup CmdWin
30963896a105SBram Moolenaar    au!
30973896a105SBram Moolenaar  augroup END
30983896a105SBram Moolenaar  &rtp = save_rtp
30993896a105SBram Moolenaar  delete('rtp', 'rf')
31003896a105SBram Moolenaarenddef
31013896a105SBram Moolenaar
3102e3d4685fSBram Moolenaardef Test_invalid_sid()
3103e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
310425859dd7SBram Moolenaar
31059c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
3106d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3107e3d4685fSBram Moolenaar  endif
3108e3d4685fSBram Moolenaar  delete('Xdidit')
3109e3d4685fSBram Moolenaarenddef
3110e3d4685fSBram Moolenaar
31119ec7026fSBram Moolenaardef Test_restoring_cpo()
31129ec7026fSBram Moolenaar  writefile(['vim9script', 'set nocp'], 'Xsourced')
31139ec7026fSBram Moolenaar  writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
31149ec7026fSBram Moolenaar  if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
31159ec7026fSBram Moolenaar    assert_equal(['done'], readfile('Xdone'))
31169ec7026fSBram Moolenaar  endif
31179ec7026fSBram Moolenaar  delete('Xsourced')
31189ec7026fSBram Moolenaar  delete('Xclose')
3119090728adSBram Moolenaar  delete('Xdone')
31209ec7026fSBram Moolenaarenddef
31219ec7026fSBram Moolenaar
31229ec7026fSBram Moolenaar
3123f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3124cfcd011fSBram Moolenaar  var lines =<< trim END
3125cfcd011fSBram Moolenaar    var name: any
3126cfcd011fSBram Moolenaar    assert_equal(0, name)
3127f0afd9e1SBram Moolenaar  END
3128f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3129f0afd9e1SBram Moolenaarenddef
3130f0afd9e1SBram Moolenaar
31317e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
313258dbef33SBram Moolenaar  CheckRunVimInTerminal
313358dbef33SBram Moolenaar
31347e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
31357e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
31367e9210eaSBram Moolenaarendfunc
31377e9210eaSBram Moolenaar
31387e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
31399c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
3140cfcd011fSBram Moolenaar  var lines =<< trim END
31419c4f5520SBram Moolenaar    func CheckAndQuit()
31429c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
31439c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
31449c4f5520SBram Moolenaar    endfunc
31459c4f5520SBram Moolenaar  END
31469c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
31479c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
3148e0de171eSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
31499c4f5520SBram Moolenaar  # define Afunc() on the command line
31509c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
31519c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
31522949cfdbSBram Moolenaar  WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
31539c4f5520SBram Moolenaar
31549c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
31559c4f5520SBram Moolenaar  delete('XcallFunc')
31569c4f5520SBram Moolenaar  delete('Xdidcmd')
31579c4f5520SBram Moolenaarenddef
31589c4f5520SBram Moolenaar
3159fcdc5d83SBram Moolenaardef Test_script_var_scope()
3160fcdc5d83SBram Moolenaar  var lines =<< trim END
3161fcdc5d83SBram Moolenaar      vim9script
3162fcdc5d83SBram Moolenaar      if true
3163fcdc5d83SBram Moolenaar        if true
3164fcdc5d83SBram Moolenaar          var one = 'one'
3165fcdc5d83SBram Moolenaar          echo one
3166fcdc5d83SBram Moolenaar        endif
3167fcdc5d83SBram Moolenaar        echo one
3168fcdc5d83SBram Moolenaar      endif
3169fcdc5d83SBram Moolenaar  END
3170fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3171fcdc5d83SBram Moolenaar
3172fcdc5d83SBram Moolenaar  lines =<< trim END
3173fcdc5d83SBram Moolenaar      vim9script
3174fcdc5d83SBram Moolenaar      if true
3175fcdc5d83SBram Moolenaar        if false
3176fcdc5d83SBram Moolenaar          var one = 'one'
3177fcdc5d83SBram Moolenaar          echo one
3178fcdc5d83SBram Moolenaar        else
3179fcdc5d83SBram Moolenaar          var one = 'one'
3180fcdc5d83SBram Moolenaar          echo one
3181fcdc5d83SBram Moolenaar        endif
3182fcdc5d83SBram Moolenaar        echo one
3183fcdc5d83SBram Moolenaar      endif
3184fcdc5d83SBram Moolenaar  END
3185fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
3186fcdc5d83SBram Moolenaar
3187fcdc5d83SBram Moolenaar  lines =<< trim END
3188fcdc5d83SBram Moolenaar      vim9script
3189fcdc5d83SBram Moolenaar      while true
3190fcdc5d83SBram Moolenaar        var one = 'one'
3191fcdc5d83SBram Moolenaar        echo one
3192fcdc5d83SBram Moolenaar        break
3193fcdc5d83SBram Moolenaar      endwhile
3194fcdc5d83SBram Moolenaar      echo one
3195fcdc5d83SBram Moolenaar  END
3196fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
3197fcdc5d83SBram Moolenaar
3198fcdc5d83SBram Moolenaar  lines =<< trim END
3199fcdc5d83SBram Moolenaar      vim9script
3200fcdc5d83SBram Moolenaar      for i in range(1)
3201fcdc5d83SBram Moolenaar        var one = 'one'
3202fcdc5d83SBram Moolenaar        echo one
3203fcdc5d83SBram Moolenaar      endfor
3204fcdc5d83SBram Moolenaar      echo one
3205fcdc5d83SBram Moolenaar  END
3206fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
32079becdf2bSBram Moolenaar
32089becdf2bSBram Moolenaar  lines =<< trim END
32099becdf2bSBram Moolenaar      vim9script
32109becdf2bSBram Moolenaar      {
32119becdf2bSBram Moolenaar        var one = 'one'
32129becdf2bSBram Moolenaar        assert_equal('one', one)
32139becdf2bSBram Moolenaar      }
32149becdf2bSBram Moolenaar      assert_false(exists('one'))
32159becdf2bSBram Moolenaar      assert_false(exists('s:one'))
32169becdf2bSBram Moolenaar  END
32179becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
32189becdf2bSBram Moolenaar
32199becdf2bSBram Moolenaar  lines =<< trim END
32209becdf2bSBram Moolenaar      vim9script
32219becdf2bSBram Moolenaar      {
32229becdf2bSBram Moolenaar        var one = 'one'
32239becdf2bSBram Moolenaar        echo one
32249becdf2bSBram Moolenaar      }
32259becdf2bSBram Moolenaar      echo one
32269becdf2bSBram Moolenaar  END
32279becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
3228fcdc5d83SBram Moolenaarenddef
3229fcdc5d83SBram Moolenaar
3230352134bbSBram Moolenaardef Test_catch_exception_in_callback()
3231352134bbSBram Moolenaar  var lines =<< trim END
3232352134bbSBram Moolenaar    vim9script
3233352134bbSBram Moolenaar    def Callback(...l: any)
3234352134bbSBram Moolenaar      try
3235352134bbSBram Moolenaar        var x: string
3236352134bbSBram Moolenaar        var y: string
3237352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
3238352134bbSBram Moolenaar        [x, y] = ['']
3239352134bbSBram Moolenaar      catch
3240352134bbSBram Moolenaar        g:caught = 'yes'
3241352134bbSBram Moolenaar      endtry
3242352134bbSBram Moolenaar    enddef
3243e0de171eSBram Moolenaar    popup_menu('popup', {callback: Callback})
3244352134bbSBram Moolenaar    feedkeys("\r", 'xt')
3245352134bbSBram Moolenaar  END
3246352134bbSBram Moolenaar  CheckScriptSuccess(lines)
3247352134bbSBram Moolenaar
3248352134bbSBram Moolenaar  unlet g:caught
3249352134bbSBram Moolenaarenddef
3250352134bbSBram Moolenaar
3251631e8f93SBram Moolenaardef Test_no_unknown_error_after_error()
3252631e8f93SBram Moolenaar  if !has('unix') || !has('job')
3253631e8f93SBram Moolenaar    throw 'Skipped: not unix of missing +job feature'
3254631e8f93SBram Moolenaar  endif
3255631e8f93SBram Moolenaar  var lines =<< trim END
3256631e8f93SBram Moolenaar      vim9script
3257631e8f93SBram Moolenaar      var source: list<number>
3258631e8f93SBram Moolenaar      def Out_cb(...l: any)
3259631e8f93SBram Moolenaar          eval [][0]
3260631e8f93SBram Moolenaar      enddef
3261631e8f93SBram Moolenaar      def Exit_cb(...l: any)
3262631e8f93SBram Moolenaar          sleep 1m
3263631e8f93SBram Moolenaar          source += l
3264631e8f93SBram Moolenaar      enddef
3265e0de171eSBram Moolenaar      var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
32666f17a3f0SBram Moolenaar      while job_status(myjob) == 'run'
32676f17a3f0SBram Moolenaar        sleep 10m
32686f17a3f0SBram Moolenaar      endwhile
32696f17a3f0SBram Moolenaar      sleep 10m
3270631e8f93SBram Moolenaar  END
3271631e8f93SBram Moolenaar  writefile(lines, 'Xdef')
3272631e8f93SBram Moolenaar  assert_fails('so Xdef', ['E684:', 'E1012:'])
3273631e8f93SBram Moolenaar  delete('Xdef')
3274631e8f93SBram Moolenaarenddef
3275631e8f93SBram Moolenaar
32764324d87aSBram Moolenaardef InvokeNormal()
32774324d87aSBram Moolenaar  exe "norm! :m+1\r"
32784324d87aSBram Moolenaarenddef
32794324d87aSBram Moolenaar
32804324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode()
32814324d87aSBram Moolenaar  xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
32824324d87aSBram Moolenaar  new
32834324d87aSBram Moolenaar  setline(1, ['aaa', 'bbb'])
32844324d87aSBram Moolenaar  feedkeys("V\<F3>", 'xt')
32854324d87aSBram Moolenaar  assert_equal(['bbb', 'aaa'], getline(1, 2))
32864324d87aSBram Moolenaar  xunmap <F3>
3287b5b9480eSBram Moolenaarenddef
3288b5b9480eSBram Moolenaar
3289b5b9480eSBram Moolenaardef Test_white_space_after_command()
3290b5b9480eSBram Moolenaar  var lines =<< trim END
3291b5b9480eSBram Moolenaar    exit_cb: Func})
3292b5b9480eSBram Moolenaar  END
3293b5b9480eSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
3294f8103f27SBram Moolenaar
3295f8103f27SBram Moolenaar  lines =<< trim END
3296f8103f27SBram Moolenaar    e#
3297f8103f27SBram Moolenaar  END
3298f8103f27SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1144:', 1)
32994324d87aSBram Moolenaarenddef
33004324d87aSBram Moolenaar
33014aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice()
33024aab88d9SBram Moolenaar  var lines =<< trim END
33034aab88d9SBram Moolenaar      vim9script
33044aab88d9SBram Moolenaar      if exists('g:guard')
33054aab88d9SBram Moolenaar        finish
33064aab88d9SBram Moolenaar      endif
33074aab88d9SBram Moolenaar      g:guard = 1
33084aab88d9SBram Moolenaar      var name = 'thename'
33094aab88d9SBram Moolenaar      def g:GetName(): string
33104aab88d9SBram Moolenaar        return name
33114aab88d9SBram Moolenaar      enddef
33124aab88d9SBram Moolenaar      def g:SetName(arg: string)
33134aab88d9SBram Moolenaar        name = arg
33144aab88d9SBram Moolenaar      enddef
33154aab88d9SBram Moolenaar  END
33164aab88d9SBram Moolenaar  writefile(lines, 'XscriptTwice.vim')
33174aab88d9SBram Moolenaar  so XscriptTwice.vim
33184aab88d9SBram Moolenaar  assert_equal('thename', g:GetName())
33194aab88d9SBram Moolenaar  g:SetName('newname')
33204aab88d9SBram Moolenaar  assert_equal('newname', g:GetName())
33214aab88d9SBram Moolenaar  so XscriptTwice.vim
33224aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
33234aab88d9SBram Moolenaar  assert_fails('call g:SetName("x")', 'E1149:')
33244aab88d9SBram Moolenaar
33254aab88d9SBram Moolenaar  delfunc g:GetName
33264aab88d9SBram Moolenaar  delfunc g:SetName
33274aab88d9SBram Moolenaar  delete('XscriptTwice.vim')
33284aab88d9SBram Moolenaar  unlet g:guard
33294aab88d9SBram Moolenaarenddef
33304aab88d9SBram Moolenaar
33314aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice()
33324aab88d9SBram Moolenaar  var exportlines =<< trim END
33334aab88d9SBram Moolenaar      vim9script
33344aab88d9SBram Moolenaar      if exists('g:guard')
33354aab88d9SBram Moolenaar        finish
33364aab88d9SBram Moolenaar      endif
33374aab88d9SBram Moolenaar      g:guard = 1
33384aab88d9SBram Moolenaar      export var name = 'someName'
33394aab88d9SBram Moolenaar  END
33404aab88d9SBram Moolenaar  writefile(exportlines, 'XexportScript.vim')
33414aab88d9SBram Moolenaar
33424aab88d9SBram Moolenaar  var lines =<< trim END
33434aab88d9SBram Moolenaar      vim9script
33444aab88d9SBram Moolenaar      import name from './XexportScript.vim'
33454aab88d9SBram Moolenaar      def g:GetName(): string
33464aab88d9SBram Moolenaar        return name
33474aab88d9SBram Moolenaar      enddef
33484aab88d9SBram Moolenaar  END
33494aab88d9SBram Moolenaar  writefile(lines, 'XscriptImport.vim')
33504aab88d9SBram Moolenaar  so XscriptImport.vim
33514aab88d9SBram Moolenaar  assert_equal('someName', g:GetName())
33524aab88d9SBram Moolenaar
33534aab88d9SBram Moolenaar  so XexportScript.vim
33544aab88d9SBram Moolenaar  assert_fails('call g:GetName()', 'E1149:')
33554aab88d9SBram Moolenaar
33564aab88d9SBram Moolenaar  delfunc g:GetName
33574aab88d9SBram Moolenaar  delete('XexportScript.vim')
33584aab88d9SBram Moolenaar  delete('XscriptImport.vim')
33594aab88d9SBram Moolenaar  unlet g:guard
33604aab88d9SBram Moolenaarenddef
33614aab88d9SBram Moolenaar
3362585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3363585fea7bSBram Moolenaardef Test_substitute_cmd()
3364585fea7bSBram Moolenaar  new
3365585fea7bSBram Moolenaar  setline(1, 'something')
3366585fea7bSBram Moolenaar  :substitute(some(other(
3367585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3368585fea7bSBram Moolenaar  bwipe!
3369585fea7bSBram Moolenaar
3370f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3371cfcd011fSBram Moolenaar  var lines =<< trim END
3372585fea7bSBram Moolenaar    vim9script
3373585fea7bSBram Moolenaar    new
3374585fea7bSBram Moolenaar    setline(1, 'something')
3375585fea7bSBram Moolenaar    :substitute(some(other(
3376585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3377585fea7bSBram Moolenaar    bwipe!
3378585fea7bSBram Moolenaar  END
3379585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3380585fea7bSBram Moolenaar  source Xvim9lines
3381585fea7bSBram Moolenaar
3382585fea7bSBram Moolenaar  delete('Xvim9lines')
3383585fea7bSBram Moolenaarenddef
3384585fea7bSBram Moolenaar
33858a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3386