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!
265d72ce69SBram Moolenaarenddef
275d72ce69SBram Moolenaar
28a6e67e4fSBram Moolenaarlet g:alist = [7]
29a6e67e4fSBram Moolenaarlet g:astring = 'text'
30f0b9f43cSBram Moolenaarlet g:anumber = 123
316e587dcbSBram Moolenaar
324c17ad94SBram Moolenaardef Test_delfunction()
33f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
344c17ad94SBram Moolenaar  CheckScriptSuccess([
354c17ad94SBram Moolenaar      'vim9script',
364c17ad94SBram Moolenaar      'func CheckMe()',
374c17ad94SBram Moolenaar      '  return 123',
384c17ad94SBram Moolenaar      'endfunc',
394c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
404c17ad94SBram Moolenaar      ])
414c17ad94SBram Moolenaar
42f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
434c17ad94SBram Moolenaar  CheckScriptFailure([
444c17ad94SBram Moolenaar      'vim9script',
454c17ad94SBram Moolenaar      'func DeleteMe1()',
464c17ad94SBram Moolenaar      'endfunc',
474c17ad94SBram Moolenaar      'delfunction DeleteMe1',
484c17ad94SBram Moolenaar      ], 'E1084:')
494c17ad94SBram Moolenaar  CheckScriptFailure([
504c17ad94SBram Moolenaar      'vim9script',
514c17ad94SBram Moolenaar      'func DeleteMe2()',
524c17ad94SBram Moolenaar      'endfunc',
534c17ad94SBram Moolenaar      'def DoThat()',
544c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
554c17ad94SBram Moolenaar      'enddef',
564c17ad94SBram Moolenaar      'DoThat()',
574c17ad94SBram Moolenaar      ], 'E1084:')
584c17ad94SBram Moolenaar  CheckScriptFailure([
594c17ad94SBram Moolenaar      'vim9script',
604c17ad94SBram Moolenaar      'def DeleteMe3()',
614c17ad94SBram Moolenaar      'enddef',
624c17ad94SBram Moolenaar      'delfunction DeleteMe3',
634c17ad94SBram Moolenaar      ], 'E1084:')
644c17ad94SBram Moolenaar  CheckScriptFailure([
654c17ad94SBram Moolenaar      'vim9script',
664c17ad94SBram Moolenaar      'def DeleteMe4()',
674c17ad94SBram Moolenaar      'enddef',
684c17ad94SBram Moolenaar      'def DoThat()',
694c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
704c17ad94SBram Moolenaar      'enddef',
714c17ad94SBram Moolenaar      'DoThat()',
724c17ad94SBram Moolenaar      ], 'E1084:')
73925e9fd6SBram Moolenaar
74925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
75cfcd011fSBram Moolenaar  var lines =<< trim END
76925e9fd6SBram Moolenaar      vim9script
77925e9fd6SBram Moolenaar      def g:Global(): string
78925e9fd6SBram Moolenaar        return "yes"
79925e9fd6SBram Moolenaar      enddef
80925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
81925e9fd6SBram Moolenaar      def! g:Global(): string
82925e9fd6SBram Moolenaar        return "no"
83925e9fd6SBram Moolenaar      enddef
84925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
85925e9fd6SBram Moolenaar      delfunc g:Global
86925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
87925e9fd6SBram Moolenaar  END
88925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
89925e9fd6SBram Moolenaar
90925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
91925e9fd6SBram Moolenaar  lines =<< trim END
92925e9fd6SBram Moolenaar      vim9script
93925e9fd6SBram Moolenaar      func g:Global()
94925e9fd6SBram Moolenaar        return "yes"
95925e9fd6SBram Moolenaar      endfunc
96925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
97925e9fd6SBram Moolenaar      def! g:Global(): string
98925e9fd6SBram Moolenaar        return "no"
99925e9fd6SBram Moolenaar      enddef
100925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
101925e9fd6SBram Moolenaar      delfunc g:Global
102925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
103925e9fd6SBram Moolenaar  END
104925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
105925e9fd6SBram Moolenaar
106925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
107925e9fd6SBram Moolenaar  lines =<< trim END
108925e9fd6SBram Moolenaar      vim9script
109925e9fd6SBram Moolenaar      def g:Global(): string
110925e9fd6SBram Moolenaar        return "yes"
111925e9fd6SBram Moolenaar      enddef
112925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
113925e9fd6SBram Moolenaar      func! g:Global()
114925e9fd6SBram Moolenaar        return "no"
115925e9fd6SBram Moolenaar      endfunc
116925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
117925e9fd6SBram Moolenaar      delfunc g:Global
118925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
119925e9fd6SBram Moolenaar  END
120925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
1214c17ad94SBram Moolenaarenddef
1224c17ad94SBram Moolenaar
12308052228SBram Moolenaardef Test_wrong_type()
124cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<nothing>'], 'E1010:')
125cfcd011fSBram Moolenaar  CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
126cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
127cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
128599c89c8SBram Moolenaar
129cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
130cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
13142a480bfSBram Moolenaar
132cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ally'], 'E1010:')
133cfcd011fSBram Moolenaar  CheckDefFailure(['var name: bram'], 'E1010:')
134cfcd011fSBram Moolenaar  CheckDefFailure(['var name: cathy'], 'E1010:')
135cfcd011fSBram Moolenaar  CheckDefFailure(['var name: dom'], 'E1010:')
136cfcd011fSBram Moolenaar  CheckDefFailure(['var name: freddy'], 'E1010:')
137cfcd011fSBram Moolenaar  CheckDefFailure(['var name: john'], 'E1010:')
138cfcd011fSBram Moolenaar  CheckDefFailure(['var name: larry'], 'E1010:')
139cfcd011fSBram Moolenaar  CheckDefFailure(['var name: ned'], 'E1010:')
140cfcd011fSBram Moolenaar  CheckDefFailure(['var name: pam'], 'E1010:')
141cfcd011fSBram Moolenaar  CheckDefFailure(['var name: sam'], 'E1010:')
142cfcd011fSBram Moolenaar  CheckDefFailure(['var name: vim'], 'E1010:')
143a0a9f43aSBram Moolenaar
144cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
145cfcd011fSBram Moolenaar  CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
14608052228SBram Moolenaarenddef
1478a7d6542SBram Moolenaar
14810c65860SBram Moolenaardef Test_script_wrong_type()
14910c65860SBram Moolenaar  var lines =<< trim END
15010c65860SBram Moolenaar      vim9script
15110c65860SBram Moolenaar      var s:dict: dict<string>
15210c65860SBram Moolenaar      s:dict['a'] = ['x']
15310c65860SBram Moolenaar  END
15410c65860SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
15510c65860SBram Moolenaarenddef
15610c65860SBram Moolenaar
15708052228SBram Moolenaardef Test_const()
158cfcd011fSBram Moolenaar  CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
159cfcd011fSBram Moolenaar  CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
160cfcd011fSBram Moolenaar  CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
16130fd8204SBram Moolenaar  CheckDefFailure(['final two'], 'E1125:')
16230fd8204SBram Moolenaar  CheckDefFailure(['final &option'], 'E996:')
163dbeecb2bSBram Moolenaar
164cfcd011fSBram Moolenaar  var lines =<< trim END
16530fd8204SBram Moolenaar    final list = [1, 2, 3]
166dbeecb2bSBram Moolenaar    list[0] = 4
1670b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
16830fd8204SBram Moolenaar    const other = [5, 6, 7]
1690b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
17071abe482SBram Moolenaar
171cfcd011fSBram Moolenaar    var varlist = [7, 8]
17230fd8204SBram Moolenaar    const constlist = [1, varlist, 3]
17371abe482SBram Moolenaar    varlist[0] = 77
17471abe482SBram Moolenaar    # TODO: does not work yet
17571abe482SBram Moolenaar    # constlist[1][1] = 88
176cfcd011fSBram Moolenaar    var cl = constlist[1]
17771abe482SBram Moolenaar    cl[1] = 88
17871abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
17971abe482SBram Moolenaar
180cfcd011fSBram Moolenaar    var vardict = #{five: 5, six: 6}
18130fd8204SBram Moolenaar    const constdict = #{one: 1, two: vardict, three: 3}
18271abe482SBram Moolenaar    vardict['five'] = 55
18371abe482SBram Moolenaar    # TODO: does not work yet
18471abe482SBram Moolenaar    # constdict['two']['six'] = 66
185cfcd011fSBram Moolenaar    var cd = constdict['two']
18671abe482SBram Moolenaar    cd['six'] = 66
18771abe482SBram Moolenaar    constdict->assert_equal(#{one: 1, two: #{five: 55, six: 66}, three: 3})
188dbeecb2bSBram Moolenaar  END
189dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
19008052228SBram Moolenaarenddef
1918a7d6542SBram Moolenaar
1920b4c66c6SBram Moolenaardef Test_const_bang()
193cfcd011fSBram Moolenaar  var lines =<< trim END
19430fd8204SBram Moolenaar      const var = 234
1950b4c66c6SBram Moolenaar      var = 99
1960b4c66c6SBram Moolenaar  END
1970b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
1980b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
1990b4c66c6SBram Moolenaar
2000b4c66c6SBram Moolenaar  lines =<< trim END
20130fd8204SBram Moolenaar      const ll = [2, 3, 4]
2020b4c66c6SBram Moolenaar      ll[0] = 99
2030b4c66c6SBram Moolenaar  END
2040b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
2050b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2060b4c66c6SBram Moolenaar
2070b4c66c6SBram Moolenaar  lines =<< trim END
20830fd8204SBram Moolenaar      const ll = [2, 3, 4]
2090b4c66c6SBram Moolenaar      ll[3] = 99
2100b4c66c6SBram Moolenaar  END
2110b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
2120b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
2130b4c66c6SBram Moolenaar
2140b4c66c6SBram Moolenaar  lines =<< trim END
21530fd8204SBram Moolenaar      const dd = #{one: 1, two: 2}
2160b4c66c6SBram Moolenaar      dd["one"] = 99
2170b4c66c6SBram Moolenaar  END
2180b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
2190b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2200b4c66c6SBram Moolenaar
2210b4c66c6SBram Moolenaar  lines =<< trim END
22230fd8204SBram Moolenaar      const dd = #{one: 1, two: 2}
2230b4c66c6SBram Moolenaar      dd["three"] = 99
2240b4c66c6SBram Moolenaar  END
2250b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
2260b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
2270b4c66c6SBram Moolenaarenddef
2280b4c66c6SBram Moolenaar
229df069eecSBram Moolenaardef Test_range_no_colon()
230d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
231d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
232d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
233d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
234df069eecSBram Moolenaarenddef
235df069eecSBram Moolenaar
236df069eecSBram Moolenaar
2378a7d6542SBram Moolenaardef Test_block()
238cfcd011fSBram Moolenaar  var outer = 1
2398a7d6542SBram Moolenaar  {
240cfcd011fSBram Moolenaar    var inner = 2
2418a7d6542SBram Moolenaar    assert_equal(1, outer)
2428a7d6542SBram Moolenaar    assert_equal(2, inner)
2438a7d6542SBram Moolenaar  }
2448a7d6542SBram Moolenaar  assert_equal(1, outer)
2458a7d6542SBram Moolenaarenddef
2468a7d6542SBram Moolenaar
24708052228SBram Moolenaardef Test_block_failure()
248cfcd011fSBram Moolenaar  CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
24908052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
25008052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
25108052228SBram Moolenaarenddef
2528a7d6542SBram Moolenaar
253fbbcd003SBram Moolenaardef Test_block_local_vars()
254fbbcd003SBram Moolenaar  var lines =<< trim END
255fbbcd003SBram Moolenaar      vim9script
256ed234f24SBram Moolenaar      v:testing = 1
257fbbcd003SBram Moolenaar      if true
258ed234f24SBram Moolenaar        var text = ['hello']
259ed234f24SBram Moolenaar        def SayHello(): list<string>
260fbbcd003SBram Moolenaar          return text
261fbbcd003SBram Moolenaar        enddef
262fbbcd003SBram Moolenaar        def SetText(v: string)
263ed234f24SBram Moolenaar          text = [v]
264fbbcd003SBram Moolenaar        enddef
265fbbcd003SBram Moolenaar      endif
266fbbcd003SBram Moolenaar
267fbbcd003SBram Moolenaar      if true
268ed234f24SBram Moolenaar        var text = ['again']
269ed234f24SBram Moolenaar        def SayAgain(): list<string>
270fbbcd003SBram Moolenaar          return text
271fbbcd003SBram Moolenaar        enddef
272fbbcd003SBram Moolenaar      endif
273ed234f24SBram Moolenaar
274ed234f24SBram Moolenaar      # test that the "text" variables are not cleaned up
275ed234f24SBram Moolenaar      test_garbagecollect_now()
276ed234f24SBram Moolenaar
277fbbcd003SBram Moolenaar      defcompile
278fbbcd003SBram Moolenaar
279ed234f24SBram Moolenaar      assert_equal(['hello'], SayHello())
280ed234f24SBram Moolenaar      assert_equal(['again'], SayAgain())
281fbbcd003SBram Moolenaar
282fbbcd003SBram Moolenaar      SetText('foobar')
283ed234f24SBram Moolenaar      assert_equal(['foobar'], SayHello())
284ed234f24SBram Moolenaar
285ed234f24SBram Moolenaar      call writefile(['ok'], 'Xdidit')
286ed234f24SBram Moolenaar      qall!
287fbbcd003SBram Moolenaar  END
288ed234f24SBram Moolenaar
289ed234f24SBram Moolenaar  # need to execute this with a separate Vim instance to avoid the current
290ed234f24SBram Moolenaar  # context gets garbage collected.
291ed234f24SBram Moolenaar  writefile(lines, 'Xscript')
292ed234f24SBram Moolenaar  RunVim([], [], '-S Xscript')
293ed234f24SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
294ed234f24SBram Moolenaar
295ed234f24SBram Moolenaar  delete('Xscript')
296ed234f24SBram Moolenaar  delete('Xdidit')
297fbbcd003SBram Moolenaarenddef
298fbbcd003SBram Moolenaar
299d032f34aSBram Moolenaarfunc g:NoSuchFunc()
300d032f34aSBram Moolenaar  echo 'none'
301d032f34aSBram Moolenaarendfunc
302d032f34aSBram Moolenaar
3038a7d6542SBram Moolenaardef Test_try_catch()
304cfcd011fSBram Moolenaar  var l = []
3057a092245SBram Moolenaar  try # comment
3068a7d6542SBram Moolenaar    add(l, '1')
3078a7d6542SBram Moolenaar    throw 'wrong'
3088a7d6542SBram Moolenaar    add(l, '2')
3097a092245SBram Moolenaar  catch # comment
3108a7d6542SBram Moolenaar    add(l, v:exception)
3117a092245SBram Moolenaar  finally # comment
3128a7d6542SBram Moolenaar    add(l, '3')
3137a092245SBram Moolenaar  endtry # comment
3148a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
31568d130c6SBram Moolenaar
316e859312eSBram Moolenaar  l = []
317e859312eSBram Moolenaar  try
318e859312eSBram Moolenaar    try
319e859312eSBram Moolenaar      add(l, '1')
320e859312eSBram Moolenaar      throw 'wrong'
321e859312eSBram Moolenaar      add(l, '2')
322e859312eSBram Moolenaar    catch /right/
323e859312eSBram Moolenaar      add(l, v:exception)
324e859312eSBram Moolenaar    endtry
325e859312eSBram Moolenaar  catch /wrong/
326e859312eSBram Moolenaar    add(l, 'caught')
327373863edSBram Moolenaar  fina
328e859312eSBram Moolenaar    add(l, 'finally')
329e859312eSBram Moolenaar  endtry
330e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
331e859312eSBram Moolenaar
332cfcd011fSBram Moolenaar  var n: number
33368d130c6SBram Moolenaar  try
33468d130c6SBram Moolenaar    n = l[3]
33568d130c6SBram Moolenaar  catch /E684:/
33668d130c6SBram Moolenaar    n = 99
33768d130c6SBram Moolenaar  endtry
33868d130c6SBram Moolenaar  assert_equal(99, n)
33968d130c6SBram Moolenaar
34068d130c6SBram Moolenaar  try
341cc673e74SBram Moolenaar    # string slice returns a string, not a number
34268d130c6SBram Moolenaar    n = g:astring[3]
3435e654230SBram Moolenaar  catch /E1012:/
34468d130c6SBram Moolenaar    n = 77
34568d130c6SBram Moolenaar  endtry
34668d130c6SBram Moolenaar  assert_equal(77, n)
34768d130c6SBram Moolenaar
34868d130c6SBram Moolenaar  try
34968d130c6SBram Moolenaar    n = l[g:astring]
3505e654230SBram Moolenaar  catch /E1012:/
35156acb094SBram Moolenaar    n = 88
35268d130c6SBram Moolenaar  endtry
35356acb094SBram Moolenaar  assert_equal(88, n)
35468d130c6SBram Moolenaar
35568d130c6SBram Moolenaar  try
35668d130c6SBram Moolenaar    n = s:does_not_exist
35768d130c6SBram Moolenaar  catch /E121:/
358f0b9f43cSBram Moolenaar    n = 111
359f0b9f43cSBram Moolenaar  endtry
360f0b9f43cSBram Moolenaar  assert_equal(111, n)
361f0b9f43cSBram Moolenaar
362f0b9f43cSBram Moolenaar  try
363f0b9f43cSBram Moolenaar    n = g:does_not_exist
364f0b9f43cSBram Moolenaar  catch /E121:/
36568d130c6SBram Moolenaar    n = 121
36668d130c6SBram Moolenaar  endtry
36768d130c6SBram Moolenaar  assert_equal(121, n)
36868d130c6SBram Moolenaar
369cfcd011fSBram Moolenaar  var d = #{one: 1}
37068d130c6SBram Moolenaar  try
37168d130c6SBram Moolenaar    n = d[g:astring]
37268d130c6SBram Moolenaar  catch /E716:/
37368d130c6SBram Moolenaar    n = 222
37468d130c6SBram Moolenaar  endtry
37568d130c6SBram Moolenaar  assert_equal(222, n)
376f0b9f43cSBram Moolenaar
377f0b9f43cSBram Moolenaar  try
378f0b9f43cSBram Moolenaar    n = -g:astring
379f0b9f43cSBram Moolenaar  catch /E39:/
380f0b9f43cSBram Moolenaar    n = 233
381f0b9f43cSBram Moolenaar  endtry
382f0b9f43cSBram Moolenaar  assert_equal(233, n)
383f0b9f43cSBram Moolenaar
384f0b9f43cSBram Moolenaar  try
385f0b9f43cSBram Moolenaar    n = +g:astring
386f0b9f43cSBram Moolenaar  catch /E1030:/
387f0b9f43cSBram Moolenaar    n = 244
388f0b9f43cSBram Moolenaar  endtry
389f0b9f43cSBram Moolenaar  assert_equal(244, n)
390f0b9f43cSBram Moolenaar
391f0b9f43cSBram Moolenaar  try
392f0b9f43cSBram Moolenaar    n = +g:alist
393f0b9f43cSBram Moolenaar  catch /E745:/
394f0b9f43cSBram Moolenaar    n = 255
395f0b9f43cSBram Moolenaar  endtry
396f0b9f43cSBram Moolenaar  assert_equal(255, n)
397f0b9f43cSBram Moolenaar
398cfcd011fSBram Moolenaar  var nd: dict<any>
399f0b9f43cSBram Moolenaar  try
400f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
4015e654230SBram Moolenaar  catch /E1012:/
402f0b9f43cSBram Moolenaar    n = 266
403f0b9f43cSBram Moolenaar  endtry
404f0b9f43cSBram Moolenaar  assert_equal(266, n)
405f0b9f43cSBram Moolenaar
406f0b9f43cSBram Moolenaar  try
407f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
408f0b9f43cSBram Moolenaar  catch /E1093:/
409f0b9f43cSBram Moolenaar    n = 277
410f0b9f43cSBram Moolenaar  endtry
411f0b9f43cSBram Moolenaar  assert_equal(277, n)
412f0b9f43cSBram Moolenaar
413e859312eSBram Moolenaar  try
414e859312eSBram Moolenaar    &ts = g:astring
4155e654230SBram Moolenaar  catch /E1012:/
416e859312eSBram Moolenaar    n = 288
417e859312eSBram Moolenaar  endtry
418e859312eSBram Moolenaar  assert_equal(288, n)
419e859312eSBram Moolenaar
420e859312eSBram Moolenaar  try
421e859312eSBram Moolenaar    &backspace = 'asdf'
422e859312eSBram Moolenaar  catch /E474:/
423e859312eSBram Moolenaar    n = 299
424e859312eSBram Moolenaar  endtry
425e859312eSBram Moolenaar  assert_equal(299, n)
426e859312eSBram Moolenaar
427e859312eSBram Moolenaar  l = [1]
428e859312eSBram Moolenaar  try
429e859312eSBram Moolenaar    l[3] = 3
430e859312eSBram Moolenaar  catch /E684:/
431e859312eSBram Moolenaar    n = 300
432e859312eSBram Moolenaar  endtry
433e859312eSBram Moolenaar  assert_equal(300, n)
434e859312eSBram Moolenaar
435e859312eSBram Moolenaar  try
436e859312eSBram Moolenaar    unlet g:does_not_exist
437e859312eSBram Moolenaar  catch /E108:/
438e859312eSBram Moolenaar    n = 322
439e859312eSBram Moolenaar  endtry
440e859312eSBram Moolenaar  assert_equal(322, n)
441e859312eSBram Moolenaar
442e859312eSBram Moolenaar  try
443e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
444e859312eSBram Moolenaar  catch /E721:/
445e859312eSBram Moolenaar    n = 333
446e859312eSBram Moolenaar  endtry
447e859312eSBram Moolenaar  assert_equal(333, n)
448e859312eSBram Moolenaar
449e859312eSBram Moolenaar  try
450e859312eSBram Moolenaar    l = DeletedFunc()
451e859312eSBram Moolenaar  catch /E933:/
452e859312eSBram Moolenaar    n = 344
453e859312eSBram Moolenaar  endtry
454e859312eSBram Moolenaar  assert_equal(344, n)
455d032f34aSBram Moolenaar
456d032f34aSBram Moolenaar  try
457d032f34aSBram Moolenaar    echo len(v:true)
458d032f34aSBram Moolenaar  catch /E701:/
459d032f34aSBram Moolenaar    n = 355
460d032f34aSBram Moolenaar  endtry
461d032f34aSBram Moolenaar  assert_equal(355, n)
462d032f34aSBram Moolenaar
463cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
464d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
465d032f34aSBram Moolenaar  try
466d032f34aSBram Moolenaar    echo P()
467d032f34aSBram Moolenaar  catch /E117:/
468d032f34aSBram Moolenaar    n = 366
469d032f34aSBram Moolenaar  endtry
470d032f34aSBram Moolenaar  assert_equal(366, n)
471d032f34aSBram Moolenaar
472d032f34aSBram Moolenaar  try
473d032f34aSBram Moolenaar    echo g:NoSuchFunc()
474d032f34aSBram Moolenaar  catch /E117:/
475d032f34aSBram Moolenaar    n = 377
476d032f34aSBram Moolenaar  endtry
477d032f34aSBram Moolenaar  assert_equal(377, n)
478d032f34aSBram Moolenaar
479d032f34aSBram Moolenaar  try
480d032f34aSBram Moolenaar    echo g:alist + 4
481d032f34aSBram Moolenaar  catch /E745:/
482d032f34aSBram Moolenaar    n = 388
483d032f34aSBram Moolenaar  endtry
484d032f34aSBram Moolenaar  assert_equal(388, n)
485d032f34aSBram Moolenaar
486d032f34aSBram Moolenaar  try
487d032f34aSBram Moolenaar    echo 4 + g:alist
488d032f34aSBram Moolenaar  catch /E745:/
489d032f34aSBram Moolenaar    n = 399
490d032f34aSBram Moolenaar  endtry
491d032f34aSBram Moolenaar  assert_equal(399, n)
492d032f34aSBram Moolenaar
493d032f34aSBram Moolenaar  try
494d032f34aSBram Moolenaar    echo g:alist.member
495d032f34aSBram Moolenaar  catch /E715:/
496d032f34aSBram Moolenaar    n = 400
497d032f34aSBram Moolenaar  endtry
498d032f34aSBram Moolenaar  assert_equal(400, n)
499d032f34aSBram Moolenaar
500d032f34aSBram Moolenaar  try
501d032f34aSBram Moolenaar    echo d.member
502d032f34aSBram Moolenaar  catch /E716:/
503d032f34aSBram Moolenaar    n = 411
504d032f34aSBram Moolenaar  endtry
505d032f34aSBram Moolenaar  assert_equal(411, n)
5068a7d6542SBram Moolenaarenddef
5078a7d6542SBram Moolenaar
508e859312eSBram Moolenaardef DeletedFunc(): list<any>
509e859312eSBram Moolenaar  return ['delete me']
510e859312eSBram Moolenaarenddef
511e859312eSBram Moolenaardefcompile
512e859312eSBram Moolenaardelfunc DeletedFunc
513e859312eSBram Moolenaar
514257cc5eeSBram Moolenaardef ThrowFromDef()
515a72cfb80SBram Moolenaar  throw "getout" # comment
516257cc5eeSBram Moolenaarenddef
517257cc5eeSBram Moolenaar
518257cc5eeSBram Moolenaarfunc CatchInFunc()
519257cc5eeSBram Moolenaar  try
520257cc5eeSBram Moolenaar    call ThrowFromDef()
521257cc5eeSBram Moolenaar  catch
522257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
523257cc5eeSBram Moolenaar  endtry
524257cc5eeSBram Moolenaarendfunc
525257cc5eeSBram Moolenaar
526257cc5eeSBram Moolenaardef CatchInDef()
527257cc5eeSBram Moolenaar  try
528257cc5eeSBram Moolenaar    ThrowFromDef()
529257cc5eeSBram Moolenaar  catch
530257cc5eeSBram Moolenaar    g:thrown_def = v:exception
531257cc5eeSBram Moolenaar  endtry
532257cc5eeSBram Moolenaarenddef
533257cc5eeSBram Moolenaar
534f575adffSBram Moolenaardef ReturnFinally(): string
535f575adffSBram Moolenaar  try
536f575adffSBram Moolenaar    return 'intry'
537373863edSBram Moolenaar  finall
538f575adffSBram Moolenaar    g:in_finally = 'finally'
539f575adffSBram Moolenaar  endtry
540f575adffSBram Moolenaar  return 'end'
541f575adffSBram Moolenaarenddef
542f575adffSBram Moolenaar
543257cc5eeSBram Moolenaardef Test_try_catch_nested()
544257cc5eeSBram Moolenaar  CatchInFunc()
545257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
546257cc5eeSBram Moolenaar
547257cc5eeSBram Moolenaar  CatchInDef()
548257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
549f575adffSBram Moolenaar
550f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
551f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
552f575adffSBram Moolenaarenddef
553f575adffSBram Moolenaar
5549939f57bSBram Moolenaardef TryOne(): number
5559939f57bSBram Moolenaar  try
5569939f57bSBram Moolenaar    return 0
5579939f57bSBram Moolenaar  catch
5589939f57bSBram Moolenaar  endtry
5599939f57bSBram Moolenaar  return 0
5609939f57bSBram Moolenaarenddef
5619939f57bSBram Moolenaar
5629939f57bSBram Moolenaardef TryTwo(n: number): string
5639939f57bSBram Moolenaar  try
564cfcd011fSBram Moolenaar    var x = {}
5659939f57bSBram Moolenaar  catch
5669939f57bSBram Moolenaar  endtry
5679939f57bSBram Moolenaar  return 'text'
5689939f57bSBram Moolenaarenddef
5699939f57bSBram Moolenaar
5709939f57bSBram Moolenaardef Test_try_catch_twice()
5719939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
5729939f57bSBram Moolenaarenddef
5739939f57bSBram Moolenaar
574f575adffSBram Moolenaardef Test_try_catch_match()
575cfcd011fSBram Moolenaar  var seq = 'a'
576f575adffSBram Moolenaar  try
577f575adffSBram Moolenaar    throw 'something'
578f575adffSBram Moolenaar  catch /nothing/
579f575adffSBram Moolenaar    seq ..= 'x'
580f575adffSBram Moolenaar  catch /some/
581f575adffSBram Moolenaar    seq ..= 'b'
582f575adffSBram Moolenaar  catch /asdf/
583f575adffSBram Moolenaar    seq ..= 'x'
584e8c4abbbSBram Moolenaar  catch ?a\?sdf?
585e8c4abbbSBram Moolenaar    seq ..= 'y'
586f575adffSBram Moolenaar  finally
587f575adffSBram Moolenaar    seq ..= 'c'
588f575adffSBram Moolenaar  endtry
589f575adffSBram Moolenaar  assert_equal('abc', seq)
590257cc5eeSBram Moolenaarenddef
591257cc5eeSBram Moolenaar
592e8c4abbbSBram Moolenaardef Test_try_catch_fails()
593d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
594d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
595d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
596d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
597d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
598d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
599d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
600d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
60113106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
602d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
603585fea7bSBram Moolenaar
604d2c61705SBram Moolenaar  CheckDefFailure(['throw'], 'E1015:')
605d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
606e8c4abbbSBram Moolenaarenddef
607e8c4abbbSBram Moolenaar
608006ad48bSBram Moolenaardef Test_throw_vimscript()
609f5be8cdbSBram Moolenaar  # only checks line continuation
610cfcd011fSBram Moolenaar  var lines =<< trim END
611006ad48bSBram Moolenaar      vim9script
612006ad48bSBram Moolenaar      try
613006ad48bSBram Moolenaar        throw 'one'
614006ad48bSBram Moolenaar              .. 'two'
615006ad48bSBram Moolenaar      catch
616006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
617006ad48bSBram Moolenaar      endtry
618006ad48bSBram Moolenaar  END
619006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
6201e021e63SBram Moolenaar
6211e021e63SBram Moolenaar  lines =<< trim END
6221e021e63SBram Moolenaar    vim9script
623*352134bbSBram Moolenaar    @r = ''
6241e021e63SBram Moolenaar    def Func()
6251e021e63SBram Moolenaar      throw @r
6261e021e63SBram Moolenaar    enddef
6271e021e63SBram Moolenaar    var result = ''
6281e021e63SBram Moolenaar    try
6291e021e63SBram Moolenaar      Func()
6301e021e63SBram Moolenaar    catch /E1129:/
6311e021e63SBram Moolenaar      result = 'caught'
6321e021e63SBram Moolenaar    endtry
6331e021e63SBram Moolenaar    assert_equal('caught', result)
6341e021e63SBram Moolenaar  END
6351e021e63SBram Moolenaar  CheckScriptSuccess(lines)
636006ad48bSBram Moolenaarenddef
637006ad48bSBram Moolenaar
638ed677f55SBram Moolenaardef Test_error_in_nested_function()
639ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
640cfcd011fSBram Moolenaar  var lines =<< trim END
641ed677f55SBram Moolenaar      vim9script
642ed677f55SBram Moolenaar      def Func()
643ed677f55SBram Moolenaar        Error()
644ed677f55SBram Moolenaar        g:test_var = 1
645ed677f55SBram Moolenaar      enddef
646ed677f55SBram Moolenaar      func Error() abort
647ed677f55SBram Moolenaar        eval [][0]
648ed677f55SBram Moolenaar      endfunc
649ed677f55SBram Moolenaar      Func()
650ed677f55SBram Moolenaar  END
651ed677f55SBram Moolenaar  g:test_var = 0
652ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
653ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
654ed677f55SBram Moolenaarenddef
655ed677f55SBram Moolenaar
65637c83711SBram Moolenaardef Test_cexpr_vimscript()
657f5be8cdbSBram Moolenaar  # only checks line continuation
65837c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
659cfcd011fSBram Moolenaar  var lines =<< trim END
66037c83711SBram Moolenaar      vim9script
66137c83711SBram Moolenaar      cexpr 'File'
66237c83711SBram Moolenaar                .. ' someFile' ..
66337c83711SBram Moolenaar                   ' line 19'
66437c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
66537c83711SBram Moolenaar  END
66637c83711SBram Moolenaar  CheckScriptSuccess(lines)
66737c83711SBram Moolenaar  set errorformat&
66837c83711SBram Moolenaarenddef
66937c83711SBram Moolenaar
670c9edd6b5SBram Moolenaardef Test_statusline_syntax()
671c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
672cfcd011fSBram Moolenaar  var lines =<< trim END
673c9edd6b5SBram Moolenaar      vim9script
674c9edd6b5SBram Moolenaar      func g:Status()
675c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
676c9edd6b5SBram Moolenaar      endfunc
677c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
678c9edd6b5SBram Moolenaar      redrawstatus
679c9edd6b5SBram Moolenaar      set laststatus statusline=
680c9edd6b5SBram Moolenaar  END
681c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
682c9edd6b5SBram Moolenaarenddef
683c9edd6b5SBram Moolenaar
684b209750bSBram Moolenaardef Test_list_vimscript()
685b209750bSBram Moolenaar  # checks line continuation and comments
686cfcd011fSBram Moolenaar  var lines =<< trim END
687b209750bSBram Moolenaar      vim9script
688cfcd011fSBram Moolenaar      var mylist = [
689b209750bSBram Moolenaar            'one',
690b209750bSBram Moolenaar            # comment
691b209750bSBram Moolenaar            'two', # empty line follows
692b209750bSBram Moolenaar
693b209750bSBram Moolenaar            'three',
694b209750bSBram Moolenaar            ]
695b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
696b209750bSBram Moolenaar  END
697b209750bSBram Moolenaar  CheckScriptSuccess(lines)
69866250c93SBram Moolenaar
69966250c93SBram Moolenaar  # check all lines from heredoc are kept
70066250c93SBram Moolenaar  lines =<< trim END
70166250c93SBram Moolenaar      # comment 1
70266250c93SBram Moolenaar      two
70366250c93SBram Moolenaar      # comment 3
70466250c93SBram Moolenaar
70566250c93SBram Moolenaar      five
70666250c93SBram Moolenaar      # comment 6
70766250c93SBram Moolenaar  END
70866250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
709b209750bSBram Moolenaarenddef
710b209750bSBram Moolenaar
7112a1381c3SBram Moolenaarif has('channel')
71240ee466cSBram Moolenaar  let someJob = test_null_job()
71340ee466cSBram Moolenaar
71440ee466cSBram Moolenaar  def FuncWithError()
71540ee466cSBram Moolenaar    echomsg g:someJob
71640ee466cSBram Moolenaar  enddef
71740ee466cSBram Moolenaar
71840ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
71940ee466cSBram Moolenaar    try
72040ee466cSBram Moolenaar      call FuncWithError()
72140ee466cSBram Moolenaar    catch
72240ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
72340ee466cSBram Moolenaar    endtry
72440ee466cSBram Moolenaar  endfunc
7252a1381c3SBram Moolenaarendif
72640ee466cSBram Moolenaar
7278a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
7288a7d6542SBram Moolenaar  vim9script
729cfcd011fSBram Moolenaar  var name: string = 'bob'
7308a7d6542SBram Moolenaar  def Concat(arg: string): string
7318a7d6542SBram Moolenaar    return name .. arg
7328a7d6542SBram Moolenaar  enddef
733227a69deSBram Moolenaar  g:result = Concat('bie')
734227a69deSBram Moolenaar  g:localname = name
7358a7d6542SBram Moolenaar
7368a7d6542SBram Moolenaar  export const CONST = 1234
737cfcd011fSBram Moolenaar  export var exported = 9876
738cfcd011fSBram Moolenaar  export var exp_name = 'John'
7398a7d6542SBram Moolenaar  export def Exported(): string
7408a7d6542SBram Moolenaar    return 'Exported'
7418a7d6542SBram Moolenaar  enddef
7428a7d6542SBram MoolenaarEND
7438a7d6542SBram Moolenaar
744b3ca9824SBram Moolenaardef Undo_export_script_lines()
745b3ca9824SBram Moolenaar  unlet g:result
746b3ca9824SBram Moolenaar  unlet g:localname
747b3ca9824SBram Moolenaarenddef
748b3ca9824SBram Moolenaar
7495269bd2aSBram Moolenaardef Test_vim9_import_export()
750cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
7518a7d6542SBram Moolenaar    vim9script
7528a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
7538a7d6542SBram Moolenaar    g:imported = exported
7546e587dcbSBram Moolenaar    exported += 3
7556e587dcbSBram Moolenaar    g:imported_added = exported
7568a7d6542SBram Moolenaar    g:imported_func = Exported()
7576e587dcbSBram Moolenaar
75840f4f7a4SBram Moolenaar    def GetExported(): string
759cfcd011fSBram Moolenaar      var local_dict = #{ref: Exported}
76040f4f7a4SBram Moolenaar      return local_dict.ref()
76140f4f7a4SBram Moolenaar    enddef
76240f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
76340f4f7a4SBram Moolenaar
7646e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
7656e587dcbSBram Moolenaar    g:imported_name = exp_name
7666e587dcbSBram Moolenaar    exp_name ..= ' Doe'
7676e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
7685381c7a1SBram Moolenaar    g:imported_later = exported
7698a7d6542SBram Moolenaar  END
7708a7d6542SBram Moolenaar
7718a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
7728a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
7738a7d6542SBram Moolenaar
7748a7d6542SBram Moolenaar  source Ximport.vim
7758a7d6542SBram Moolenaar
7768a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
7778a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
7788a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
7796e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
7805381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
7818a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
78240f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
7836e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
7846e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
7858a7d6542SBram Moolenaar  assert_false(exists('g:name'))
7868a7d6542SBram Moolenaar
787b3ca9824SBram Moolenaar  Undo_export_script_lines()
7888a7d6542SBram Moolenaar  unlet g:imported
7896e587dcbSBram Moolenaar  unlet g:imported_added
7905381c7a1SBram Moolenaar  unlet g:imported_later
7918a7d6542SBram Moolenaar  unlet g:imported_func
7926e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
7938a7d6542SBram Moolenaar  delete('Ximport.vim')
794f2d5c240SBram Moolenaar
7951c991144SBram Moolenaar  # similar, with line breaks
796cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
7971c991144SBram Moolenaar    vim9script
7981c991144SBram Moolenaar    import {
7991c991144SBram Moolenaar        exported,
8001c991144SBram Moolenaar        Exported,
8011c991144SBram Moolenaar        }
8021c991144SBram Moolenaar        from
8031c991144SBram Moolenaar        './Xexport.vim'
8041c991144SBram Moolenaar    g:imported = exported
8051c991144SBram Moolenaar    exported += 5
8061c991144SBram Moolenaar    g:imported_added = exported
8071c991144SBram Moolenaar    g:imported_func = Exported()
8081c991144SBram Moolenaar  END
8091c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
8101c991144SBram Moolenaar  source Ximport_lbr.vim
8111c991144SBram Moolenaar
8121c991144SBram Moolenaar  assert_equal(9876, g:imported)
8131c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
8141c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
8151c991144SBram Moolenaar
8161c991144SBram Moolenaar  # exported script not sourced again
8171c991144SBram Moolenaar  assert_false(exists('g:result'))
8181c991144SBram Moolenaar  unlet g:imported
8191c991144SBram Moolenaar  unlet g:imported_added
8201c991144SBram Moolenaar  unlet g:imported_func
8211c991144SBram Moolenaar  delete('Ximport_lbr.vim')
8221c991144SBram Moolenaar
8231c991144SBram Moolenaar  # import inside :def function
824cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
8255381c7a1SBram Moolenaar    vim9script
8265381c7a1SBram Moolenaar    def ImportInDef()
8275381c7a1SBram Moolenaar      import exported from './Xexport.vim'
8285381c7a1SBram Moolenaar      g:imported = exported
8295381c7a1SBram Moolenaar      exported += 7
8305381c7a1SBram Moolenaar      g:imported_added = exported
8315381c7a1SBram Moolenaar    enddef
8325381c7a1SBram Moolenaar    ImportInDef()
8335381c7a1SBram Moolenaar  END
8345381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
8355381c7a1SBram Moolenaar  source Ximport2.vim
836f5be8cdbSBram Moolenaar  # TODO: this should be 9879
8375381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
8385381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
8395381c7a1SBram Moolenaar  unlet g:imported
8405381c7a1SBram Moolenaar  unlet g:imported_added
8415381c7a1SBram Moolenaar  delete('Ximport2.vim')
8425381c7a1SBram Moolenaar
843cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
844f2d5c240SBram Moolenaar    vim9script
845f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
846f2d5c240SBram Moolenaar    def UseExport()
847f2d5c240SBram Moolenaar      g:imported = Export.exported
848f2d5c240SBram Moolenaar    enddef
849f2d5c240SBram Moolenaar    UseExport()
850f2d5c240SBram Moolenaar  END
851f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
852f2d5c240SBram Moolenaar  source Ximport.vim
8535381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
854f2d5c240SBram Moolenaar
855cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
856599c89c8SBram Moolenaar    vim9script
857599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
858599c89c8SBram Moolenaar    def Func()
859cfcd011fSBram Moolenaar      var dummy = 1
860cfcd011fSBram Moolenaar      var imported = Export + dummy
861599c89c8SBram Moolenaar    enddef
862822ba247SBram Moolenaar    defcompile
863599c89c8SBram Moolenaar  END
864599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
86544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
866599c89c8SBram Moolenaar
867cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
868599c89c8SBram Moolenaar    vim9script
869599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
870599c89c8SBram Moolenaar    def Func()
871cfcd011fSBram Moolenaar      var imported = Export . exported
872599c89c8SBram Moolenaar    enddef
873822ba247SBram Moolenaar    defcompile
874599c89c8SBram Moolenaar  END
875599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
87644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
877599c89c8SBram Moolenaar
878cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
879599c89c8SBram Moolenaar    vim9script
880599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
881599c89c8SBram Moolenaar    def Func()
882cfcd011fSBram Moolenaar      var imported = Export.
883599c89c8SBram Moolenaar    enddef
884822ba247SBram Moolenaar    defcompile
885599c89c8SBram Moolenaar  END
886599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
88744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
888599c89c8SBram Moolenaar
889cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
8901c991144SBram Moolenaar    vim9script
8911c991144SBram Moolenaar    import *
8921c991144SBram Moolenaar        as Export
8931c991144SBram Moolenaar        from
8941c991144SBram Moolenaar        './Xexport.vim'
8951c991144SBram Moolenaar    def UseExport()
8961c991144SBram Moolenaar      g:imported = Export.exported
8971c991144SBram Moolenaar    enddef
8981c991144SBram Moolenaar    UseExport()
8991c991144SBram Moolenaar  END
9001c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
9011c991144SBram Moolenaar  source Ximport.vim
9021c991144SBram Moolenaar  assert_equal(9883, g:imported)
9031c991144SBram Moolenaar
904cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
905f2d5c240SBram Moolenaar    vim9script
906f2d5c240SBram Moolenaar    import * from './Xexport.vim'
907f2d5c240SBram Moolenaar  END
908f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
90944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
910f2d5c240SBram Moolenaar
911f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
912cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
913fa29c8abSBram Moolenaar    vim9script
914fa29c8abSBram Moolenaar    import name from './Xexport.vim'
915fa29c8abSBram Moolenaar  END
916fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
91744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
918fa29c8abSBram Moolenaar
919f5be8cdbSBram Moolenaar  # try to import something that is already defined
920cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
9215269bd2aSBram Moolenaar    vim9script
922cfcd011fSBram Moolenaar    var exported = 'something'
9235269bd2aSBram Moolenaar    import exported from './Xexport.vim'
9245269bd2aSBram Moolenaar  END
9255269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
92644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9275269bd2aSBram Moolenaar
928f5be8cdbSBram Moolenaar  # try to import something that is already defined
9295269bd2aSBram Moolenaar  import_already_defined =<< trim END
9305269bd2aSBram Moolenaar    vim9script
931cfcd011fSBram Moolenaar    var exported = 'something'
9325269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
9335269bd2aSBram Moolenaar  END
9345269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
93544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9365269bd2aSBram Moolenaar
937f5be8cdbSBram Moolenaar  # try to import something that is already defined
9385269bd2aSBram Moolenaar  import_already_defined =<< trim END
9395269bd2aSBram Moolenaar    vim9script
940cfcd011fSBram Moolenaar    var exported = 'something'
9415269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
9425269bd2aSBram Moolenaar  END
9435269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
94444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
9455269bd2aSBram Moolenaar
946f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
947cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
948fa29c8abSBram Moolenaar    vim9script
949fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
950fa29c8abSBram Moolenaar  END
951fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
95244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
953fa29c8abSBram Moolenaar
954cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
955fa29c8abSBram Moolenaar    vim9script
956fa29c8abSBram Moolenaar    import name './Xexport.vim'
957fa29c8abSBram Moolenaar  END
958fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
95944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
960fa29c8abSBram Moolenaar
961cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
962fa29c8abSBram Moolenaar    vim9script
963fa29c8abSBram Moolenaar    import name from Xexport.vim
964fa29c8abSBram Moolenaar  END
965fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
96644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
967fa29c8abSBram Moolenaar
968cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
969fa29c8abSBram Moolenaar    vim9script
970fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
971fa29c8abSBram Moolenaar  END
972fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
97344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
974fa29c8abSBram Moolenaar
975cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
976fa29c8abSBram Moolenaar    vim9script
977fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
978fa29c8abSBram Moolenaar  END
9795269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
98044d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
981fa29c8abSBram Moolenaar
982f2d5c240SBram Moolenaar  delete('Ximport.vim')
9835269bd2aSBram Moolenaar  delete('Ximport3.vim')
9848a7d6542SBram Moolenaar  delete('Xexport.vim')
9858a7d6542SBram Moolenaar
986f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
987750802b5SBram Moolenaar  set cpo&vi
988cfcd011fSBram Moolenaar  var cpo_before = &cpo
989cfcd011fSBram Moolenaar  var lines =<< trim END
990750802b5SBram Moolenaar    vim9script
991750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
992750802b5SBram Moolenaar  END
993750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
994750802b5SBram Moolenaar  source Xvim9_script
995750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
996750802b5SBram Moolenaar  set cpo&vim
997750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
998750802b5SBram Moolenaar  delete('Xvim9_script')
999750802b5SBram Moolenaarenddef
1000750802b5SBram Moolenaar
1001803af686SBram Moolenaarfunc g:Trigger()
1002803af686SBram Moolenaar  source Ximport.vim
1003803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1004803af686SBram Moolenaarendfunc
1005803af686SBram Moolenaar
1006803af686SBram Moolenaardef Test_import_export_expr_map()
1007803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1008cfcd011fSBram Moolenaar  var export_lines =<< trim END
1009803af686SBram Moolenaar    vim9script
1010803af686SBram Moolenaar    export def That(): string
1011803af686SBram Moolenaar      return 'yes'
1012803af686SBram Moolenaar    enddef
1013803af686SBram Moolenaar  END
1014803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1015803af686SBram Moolenaar
1016cfcd011fSBram Moolenaar  var import_lines =<< trim END
1017803af686SBram Moolenaar    vim9script
1018803af686SBram Moolenaar    import That from './Xexport_that.vim'
1019803af686SBram Moolenaar    assert_equal('yes', That())
1020803af686SBram Moolenaar  END
1021803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1022803af686SBram Moolenaar
1023803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1024803af686SBram Moolenaar  feedkeys('trigger', "xt")
1025803af686SBram Moolenaar
1026730b2483SBram Moolenaar  delete('Xexport_that.vim')
1027803af686SBram Moolenaar  delete('Ximport.vim')
1028803af686SBram Moolenaar  nunmap trigger
1029803af686SBram Moolenaarenddef
1030803af686SBram Moolenaar
10318e1986e3SBram Moolenaardef Test_import_in_filetype()
10328e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
10338e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
1034cfcd011fSBram Moolenaar  var export_lines =<< trim END
10358e1986e3SBram Moolenaar    vim9script
1036cfcd011fSBram Moolenaar    export var That = 'yes'
10378e1986e3SBram Moolenaar  END
1038730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
10398e1986e3SBram Moolenaar
1040cfcd011fSBram Moolenaar  var import_lines =<< trim END
10418e1986e3SBram Moolenaar    vim9script
1042730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
10438e1986e3SBram Moolenaar    assert_equal('yes', That)
10448e1986e3SBram Moolenaar    g:did_load_mytpe = 1
10458e1986e3SBram Moolenaar  END
10468e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
10478e1986e3SBram Moolenaar
1048cfcd011fSBram Moolenaar  var save_rtp = &rtp
10498e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
10508e1986e3SBram Moolenaar
10518e1986e3SBram Moolenaar  filetype plugin on
10528e1986e3SBram Moolenaar  copen
10538e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
10548e1986e3SBram Moolenaar
10558e1986e3SBram Moolenaar  quit!
1056730b2483SBram Moolenaar  delete('Xexport_ft.vim')
10578e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
10588e1986e3SBram Moolenaar  &rtp = save_rtp
10598e1986e3SBram Moolenaarenddef
10608e1986e3SBram Moolenaar
1061efa94447SBram Moolenaardef Test_use_import_in_mapping()
1062cfcd011fSBram Moolenaar  var lines =<< trim END
1063efa94447SBram Moolenaar      vim9script
1064efa94447SBram Moolenaar      export def Funcx()
1065efa94447SBram Moolenaar        g:result = 42
1066efa94447SBram Moolenaar      enddef
1067efa94447SBram Moolenaar  END
1068efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1069efa94447SBram Moolenaar  lines =<< trim END
1070efa94447SBram Moolenaar      vim9script
1071efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1072b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1073efa94447SBram Moolenaar  END
1074efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1075efa94447SBram Moolenaar
1076efa94447SBram Moolenaar  source Xmapscript.vim
1077b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1078efa94447SBram Moolenaar  assert_equal(42, g:result)
1079efa94447SBram Moolenaar
1080efa94447SBram Moolenaar  unlet g:result
1081efa94447SBram Moolenaar  delete('XsomeExport.vim')
1082efa94447SBram Moolenaar  delete('Xmapscript.vim')
1083b3ca9824SBram Moolenaar  nunmap <F3>
1084efa94447SBram Moolenaarenddef
1085efa94447SBram Moolenaar
1086750802b5SBram Moolenaardef Test_vim9script_fails()
10878a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
10888a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1089cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
10909721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1091cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1092750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1093750802b5SBram Moolenaar
1094cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1095c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1096c785b9a7SBram Moolenaar
1097e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1098e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
10998a7d6542SBram Moolenaarenddef
11008a7d6542SBram Moolenaar
1101f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1102101f4810SBram Moolenaar  CheckRunVimInTerminal
1103101f4810SBram Moolenaar
11049bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1105c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
11069bb3eb3eSBram Moolenaarendfunc
11079bb3eb3eSBram Moolenaar
1108c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1109cfcd011fSBram Moolenaar  var export =<< trim END
1110101f4810SBram Moolenaar    vim9script
1111101f4810SBram Moolenaar    export def Foo(): number
1112101f4810SBram Moolenaar        return 0
1113101f4810SBram Moolenaar    enddef
1114101f4810SBram Moolenaar  END
1115730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1116101f4810SBram Moolenaar
1117cfcd011fSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
11189bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
11199bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1120101f4810SBram Moolenaar
1121730b2483SBram Moolenaar  delete('XexportCmd.vim')
11229bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
11239bb3eb3eSBram Moolenaarenddef
1124101f4810SBram Moolenaar
11254c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1126cfcd011fSBram Moolenaar  var lines =<< trim END
11278a7d6542SBram Moolenaar    vim9script
11288a7d6542SBram Moolenaar    const var = ''
1129cfcd011fSBram Moolenaar    var valone = 1234
11308a7d6542SBram Moolenaar    def MyFunc(arg: string)
11318a7d6542SBram Moolenaar       valone = 5678
11328a7d6542SBram Moolenaar    enddef
11338a7d6542SBram Moolenaar  END
1134cfcd011fSBram Moolenaar  var morelines =<< trim END
1135cfcd011fSBram Moolenaar    var valtwo = 222
11368a7d6542SBram Moolenaar    export def GetValtwo(): number
11378a7d6542SBram Moolenaar      return valtwo
11388a7d6542SBram Moolenaar    enddef
11398a7d6542SBram Moolenaar  END
114003afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
11418a7d6542SBram Moolenaar  source Xreload.vim
11428a7d6542SBram Moolenaar  source Xreload.vim
11438a7d6542SBram Moolenaar  source Xreload.vim
11448a7d6542SBram Moolenaar
1145cfcd011fSBram Moolenaar  var testlines =<< trim END
11468a7d6542SBram Moolenaar    vim9script
11478a7d6542SBram Moolenaar    def TheFunc()
11488a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
11498a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
11508a7d6542SBram Moolenaar    enddef
11518a7d6542SBram Moolenaar    TheFunc()
11528a7d6542SBram Moolenaar  END
11538a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
11548a7d6542SBram Moolenaar  source Ximport.vim
11558a7d6542SBram Moolenaar
1156f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1157f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
11588a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
11598a7d6542SBram Moolenaar  source Ximport.vim
11608a7d6542SBram Moolenaar
1161f5be8cdbSBram Moolenaar  # cannot declare a var twice
11628a7d6542SBram Moolenaar  lines =<< trim END
11638a7d6542SBram Moolenaar    vim9script
1164cfcd011fSBram Moolenaar    var valone = 1234
1165cfcd011fSBram Moolenaar    var valone = 5678
11668a7d6542SBram Moolenaar  END
11678a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
116844d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
11698a7d6542SBram Moolenaar
11708a7d6542SBram Moolenaar  delete('Xreload.vim')
11718a7d6542SBram Moolenaar  delete('Ximport.vim')
11728a7d6542SBram Moolenaarenddef
11738a7d6542SBram Moolenaar
117495006e3dSBram Moolenaardef s:RetSome(): string
117595006e3dSBram Moolenaar  return 'some'
117695006e3dSBram Moolenaarenddef
117795006e3dSBram Moolenaar
1178fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1179fe465a01SBram Moolenaar" script-local name.
1180fe465a01SBram Moolenaardef Test_vim9script_funcref()
1181cfcd011fSBram Moolenaar  var sortlines =<< trim END
1182fe465a01SBram Moolenaar      vim9script
1183fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1184bed36b93SBram Moolenaar        return i2 - i1
1185fe465a01SBram Moolenaar      enddef
1186fe465a01SBram Moolenaar
1187fe465a01SBram Moolenaar      export def FastSort(): list<number>
1188fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1189fe465a01SBram Moolenaar      enddef
1190fe465a01SBram Moolenaar  END
1191fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1192fe465a01SBram Moolenaar
1193cfcd011fSBram Moolenaar  var lines =<< trim END
1194fe465a01SBram Moolenaar    vim9script
1195fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1196fe465a01SBram Moolenaar    def Test()
1197fe465a01SBram Moolenaar      g:result = FastSort()
1198fe465a01SBram Moolenaar    enddef
1199fe465a01SBram Moolenaar    Test()
1200fe465a01SBram Moolenaar  END
1201fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1202fe465a01SBram Moolenaar
1203fe465a01SBram Moolenaar  source Xscript.vim
1204fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1205fe465a01SBram Moolenaar
1206fe465a01SBram Moolenaar  unlet g:result
1207fe465a01SBram Moolenaar  delete('Xsort.vim')
1208fe465a01SBram Moolenaar  delete('Xscript.vim')
120995006e3dSBram Moolenaar
1210cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
121195006e3dSBram Moolenaar  assert_equal('some', Funcref())
1212fe465a01SBram Moolenaarenddef
1213fe465a01SBram Moolenaar
1214601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1215601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1216601e76acSBram Moolenaar" function reference.
1217c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1218cfcd011fSBram Moolenaar  var filterLines =<< trim END
1219c620c055SBram Moolenaar    vim9script
1220c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1221c620c055SBram Moolenaar      return idx % 2 == 1
1222c620c055SBram Moolenaar    enddef
1223c620c055SBram Moolenaar    export def FastFilter(): list<number>
1224c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1225c620c055SBram Moolenaar    enddef
1226601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1227601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1228601e76acSBram Moolenaar    enddef
1229c620c055SBram Moolenaar  END
1230c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1231c620c055SBram Moolenaar
1232cfcd011fSBram Moolenaar  var lines =<< trim END
1233c620c055SBram Moolenaar    vim9script
1234601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1235c620c055SBram Moolenaar    def Test()
1236cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1237c620c055SBram Moolenaar    enddef
1238c620c055SBram Moolenaar    Test()
1239601e76acSBram Moolenaar    def TestDirect()
1240cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1241601e76acSBram Moolenaar    enddef
1242601e76acSBram Moolenaar    TestDirect()
1243c620c055SBram Moolenaar  END
1244601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1245c620c055SBram Moolenaar  delete('Xfilter.vim')
1246c620c055SBram Moolenaarenddef
1247c620c055SBram Moolenaar
12484c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1249cfcd011fSBram Moolenaar  var first_lines =<< trim END
12504c17ad94SBram Moolenaar    vim9script
12514c17ad94SBram Moolenaar    def FuncYes(): string
12524c17ad94SBram Moolenaar      return 'yes'
12534c17ad94SBram Moolenaar    enddef
12544c17ad94SBram Moolenaar  END
1255cfcd011fSBram Moolenaar  var withno_lines =<< trim END
12564c17ad94SBram Moolenaar    def FuncNo(): string
12574c17ad94SBram Moolenaar      return 'no'
12584c17ad94SBram Moolenaar    enddef
12594c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
12604c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
12614c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
126203afdcf1SBram Moolenaar    enddef
126303afdcf1SBram Moolenaar  END
1264cfcd011fSBram Moolenaar  var nono_lines =<< trim END
126503afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
126603afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
126744d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
12684c17ad94SBram Moolenaar    enddef
12694c17ad94SBram Moolenaar  END
12704c17ad94SBram Moolenaar
12714c17ad94SBram Moolenaar  # FuncNo() is defined
127203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12734c17ad94SBram Moolenaar  source Xreloaded.vim
12744c17ad94SBram Moolenaar  g:DoCheck(true)
12754c17ad94SBram Moolenaar
12764c17ad94SBram Moolenaar  # FuncNo() is not redefined
127703afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
12784c17ad94SBram Moolenaar  source Xreloaded.vim
127903afdcf1SBram Moolenaar  g:DoCheck()
12804c17ad94SBram Moolenaar
12814c17ad94SBram Moolenaar  # FuncNo() is back
128203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12834c17ad94SBram Moolenaar  source Xreloaded.vim
128403afdcf1SBram Moolenaar  g:DoCheck()
12854c17ad94SBram Moolenaar
12864c17ad94SBram Moolenaar  delete('Xreloaded.vim')
12874c17ad94SBram Moolenaarenddef
12884c17ad94SBram Moolenaar
128989483d40SBram Moolenaardef Test_vim9script_reload_delvar()
129089483d40SBram Moolenaar  # write the script with a script-local variable
1291cfcd011fSBram Moolenaar  var lines =<< trim END
129289483d40SBram Moolenaar    vim9script
1293cfcd011fSBram Moolenaar    var name = 'string'
129489483d40SBram Moolenaar  END
129589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
129689483d40SBram Moolenaar  source XreloadVar.vim
129789483d40SBram Moolenaar
129889483d40SBram Moolenaar  # now write the script using the same variable locally - works
129989483d40SBram Moolenaar  lines =<< trim END
130089483d40SBram Moolenaar    vim9script
130189483d40SBram Moolenaar    def Func()
1302cfcd011fSBram Moolenaar      var name = 'string'
130389483d40SBram Moolenaar    enddef
130489483d40SBram Moolenaar  END
130589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
130689483d40SBram Moolenaar  source XreloadVar.vim
130789483d40SBram Moolenaar
130889483d40SBram Moolenaar  delete('XreloadVar.vim')
130989483d40SBram Moolenaarenddef
131089483d40SBram Moolenaar
13118a7d6542SBram Moolenaardef Test_import_absolute()
1312cfcd011fSBram Moolenaar  var import_lines = [
1313e6085c53SBram Moolenaar        'vim9script',
1314e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1315e6085c53SBram Moolenaar        'def UseExported()',
1316e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1317e6085c53SBram Moolenaar        '  exported = 8888',
1318e6085c53SBram Moolenaar        '  g:imported_after = exported',
1319e6085c53SBram Moolenaar        'enddef',
1320e6085c53SBram Moolenaar        'UseExported()',
1321e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1322e6085c53SBram Moolenaar        ]
13238a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
13248a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
13258a7d6542SBram Moolenaar
13268a7d6542SBram Moolenaar  source Ximport_abs.vim
13278a7d6542SBram Moolenaar
13288a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
13294e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1330fbbcd003SBram Moolenaar  assert_match('<SNR>\d\+_UseExported\_s*' ..
1331fbbcd003SBram Moolenaar          'g:imported_abs = exported\_s*' ..
1332fbbcd003SBram Moolenaar          '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1333fbbcd003SBram Moolenaar          '1 STOREG g:imported_abs\_s*' ..
1334fbbcd003SBram Moolenaar          'exported = 8888\_s*' ..
1335fbbcd003SBram Moolenaar          '2 PUSHNR 8888\_s*' ..
1336fbbcd003SBram Moolenaar          '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1337fbbcd003SBram Moolenaar          'g:imported_after = exported\_s*' ..
1338fbbcd003SBram Moolenaar          '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1339fbbcd003SBram Moolenaar          '5 STOREG g:imported_after',
1340e6085c53SBram Moolenaar        g:import_disassembled)
1341b3ca9824SBram Moolenaar
1342b3ca9824SBram Moolenaar  Undo_export_script_lines()
13438a7d6542SBram Moolenaar  unlet g:imported_abs
13444e12a5dfSBram Moolenaar  unlet g:import_disassembled
13458a7d6542SBram Moolenaar
13468a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
13478a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
13488a7d6542SBram Moolenaarenddef
13498a7d6542SBram Moolenaar
13508a7d6542SBram Moolenaardef Test_import_rtp()
1351cfcd011fSBram Moolenaar  var import_lines = [
1352e6085c53SBram Moolenaar        'vim9script',
1353e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1354e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1355e6085c53SBram Moolenaar        ]
13568a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
13578a7d6542SBram Moolenaar  mkdir('import')
13588a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
13598a7d6542SBram Moolenaar
1360cfcd011fSBram Moolenaar  var save_rtp = &rtp
13618a7d6542SBram Moolenaar  &rtp = getcwd()
13628a7d6542SBram Moolenaar  source Ximport_rtp.vim
13638a7d6542SBram Moolenaar  &rtp = save_rtp
13648a7d6542SBram Moolenaar
13658a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
13668a7d6542SBram Moolenaar
1367b3ca9824SBram Moolenaar  Undo_export_script_lines()
1368b3ca9824SBram Moolenaar  unlet g:imported_rtp
13698a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
137089483d40SBram Moolenaar  delete('import', 'rf')
13718a7d6542SBram Moolenaarenddef
13728a7d6542SBram Moolenaar
137325e0f586SBram Moolenaardef Test_import_compile_error()
1374cfcd011fSBram Moolenaar  var export_lines = [
137525e0f586SBram Moolenaar        'vim9script',
137625e0f586SBram Moolenaar        'export def ExpFunc(): string',
137725e0f586SBram Moolenaar        '  return notDefined',
137825e0f586SBram Moolenaar        'enddef',
137925e0f586SBram Moolenaar        ]
138025e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
138125e0f586SBram Moolenaar
1382cfcd011fSBram Moolenaar  var import_lines = [
138325e0f586SBram Moolenaar        'vim9script',
138425e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
138525e0f586SBram Moolenaar        'def ImpFunc()',
138625e0f586SBram Moolenaar        '  echo ExpFunc()',
138725e0f586SBram Moolenaar        'enddef',
138825e0f586SBram Moolenaar        'defcompile',
138925e0f586SBram Moolenaar        ]
139025e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
139125e0f586SBram Moolenaar
139225e0f586SBram Moolenaar  try
139325e0f586SBram Moolenaar    source Ximport.vim
139425e0f586SBram Moolenaar  catch /E1001/
1395f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
13967707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
139725e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
139825e0f586SBram Moolenaar  endtry
139925e0f586SBram Moolenaar
140025e0f586SBram Moolenaar  delete('Xexported.vim')
140125e0f586SBram Moolenaar  delete('Ximport.vim')
140225e0f586SBram Moolenaarenddef
140325e0f586SBram Moolenaar
1404c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1405cfcd011fSBram Moolenaar  var lines = [
1406c4ce36d4SBram Moolenaar        'vim9script',
1407c4ce36d4SBram Moolenaar        'def Func()',
1408c4ce36d4SBram Moolenaar        '  eval [][0]',
1409c4ce36d4SBram Moolenaar        'enddef',
1410c4ce36d4SBram Moolenaar        'Func()',
1411c4ce36d4SBram Moolenaar        ]
1412c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1413c4ce36d4SBram Moolenaar
1414c4ce36d4SBram Moolenaar  for count in range(3)
1415c4ce36d4SBram Moolenaar    try
1416c4ce36d4SBram Moolenaar      source Xtestscript.vim
1417c4ce36d4SBram Moolenaar    catch /E684/
1418c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1419c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1420c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1421c4ce36d4SBram Moolenaar    endtry
1422c4ce36d4SBram Moolenaar  endfor
1423c4ce36d4SBram Moolenaar
1424c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1425c4ce36d4SBram Moolenaarenddef
1426c4ce36d4SBram Moolenaar
1427eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1428cfcd011fSBram Moolenaar  var export_lines =<< trim END
1429eef2102eSBram Moolenaar      vim9script
1430eef2102eSBram Moolenaar      export def Func()
1431eef2102eSBram Moolenaar        echo 'imported'
1432eef2102eSBram Moolenaar      enddef
1433eef2102eSBram Moolenaar  END
1434eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1435eef2102eSBram Moolenaar
1436cfcd011fSBram Moolenaar  var lines =<< trim END
1437eef2102eSBram Moolenaar    vim9script
1438eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1439eef2102eSBram Moolenaar    def Func()
1440eef2102eSBram Moolenaar      echo 'local to function'
1441eef2102eSBram Moolenaar    enddef
1442eef2102eSBram Moolenaar  END
1443eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1444eef2102eSBram Moolenaar
1445eef2102eSBram Moolenaar  lines =<< trim END
1446eef2102eSBram Moolenaar    vim9script
1447eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1448eef2102eSBram Moolenaar    def Outer()
1449eef2102eSBram Moolenaar      def Func()
1450eef2102eSBram Moolenaar        echo 'local to function'
1451eef2102eSBram Moolenaar      enddef
1452eef2102eSBram Moolenaar    enddef
1453eef2102eSBram Moolenaar    defcompile
1454eef2102eSBram Moolenaar  END
1455eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1456eef2102eSBram Moolenaar
1457eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1458eef2102eSBram Moolenaarenddef
1459eef2102eSBram Moolenaar
1460b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1461cfcd011fSBram Moolenaar  var lines =<< trim END
1462b9a2cac3SBram Moolenaar    vim9script
1463b9a2cac3SBram Moolenaar    def Func()
1464b9a2cac3SBram Moolenaar      echo 'one'
1465b9a2cac3SBram Moolenaar    enddef
1466b9a2cac3SBram Moolenaar    def Func()
1467b9a2cac3SBram Moolenaar      echo 'two'
1468b9a2cac3SBram Moolenaar    enddef
1469b9a2cac3SBram Moolenaar  END
1470b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1471fa211f3cSBram Moolenaar
1472fa211f3cSBram Moolenaar  lines =<< trim END
1473fa211f3cSBram Moolenaar    vim9script
1474fa211f3cSBram Moolenaar    def Foo(): string
1475fa211f3cSBram Moolenaar      return 'foo'
1476fa211f3cSBram Moolenaar      enddef
1477fa211f3cSBram Moolenaar    def Func()
1478cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1479fa211f3cSBram Moolenaar    enddef
1480fa211f3cSBram Moolenaar    defcompile
1481fa211f3cSBram Moolenaar  END
1482fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1483b9a2cac3SBram Moolenaarenddef
1484b9a2cac3SBram Moolenaar
14858a7d6542SBram Moolenaardef Test_fixed_size_list()
1486f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1487cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
14888a7d6542SBram Moolenaar  l->remove(0)
14898a7d6542SBram Moolenaar  l->add(5)
14908a7d6542SBram Moolenaar  l->insert(99, 1)
14910f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
14928a7d6542SBram Moolenaarenddef
14938a7d6542SBram Moolenaar
1494ae616494SBram Moolenaardef Test_no_insert_xit()
1495d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1496d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1497d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1498d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1499d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1500ae616494SBram Moolenaar
1501ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1502ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1503ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1504ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1505f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1506f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1507f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1508f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1509f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1510ae616494SBram Moolenaarenddef
1511ae616494SBram Moolenaar
1512158906cfSBram Moolenaardef IfElse(what: number): string
1513cfcd011fSBram Moolenaar  var res = ''
1514158906cfSBram Moolenaar  if what == 1
1515158906cfSBram Moolenaar    res = "one"
1516158906cfSBram Moolenaar  elseif what == 2
1517158906cfSBram Moolenaar    res = "two"
1518a259d8d3SBram Moolenaar  else
1519158906cfSBram Moolenaar    res = "three"
1520a259d8d3SBram Moolenaar  endif
1521158906cfSBram Moolenaar  return res
1522a259d8d3SBram Moolenaarenddef
1523a259d8d3SBram Moolenaar
1524158906cfSBram Moolenaardef Test_if_elseif_else()
1525158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1526158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1527158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
15280f18b6d1SBram Moolenaarenddef
15290f18b6d1SBram Moolenaar
1530e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1531d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1532d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1533d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1534d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1535d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
1536e8c4abbbSBram Moolenaarenddef
1537e8c4abbbSBram Moolenaar
15386d69bf60SBram Moolenaarlet g:bool_true = v:true
15396d69bf60SBram Moolenaarlet g:bool_false = v:false
15406d69bf60SBram Moolenaar
15416d69bf60SBram Moolenaardef Test_if_const_expr()
1542cfcd011fSBram Moolenaar  var res = false
15436d69bf60SBram Moolenaar  if true ? true : false
15446d69bf60SBram Moolenaar    res = true
15456d69bf60SBram Moolenaar  endif
15466d69bf60SBram Moolenaar  assert_equal(true, res)
15476d69bf60SBram Moolenaar
1548585fea7bSBram Moolenaar  g:glob = 2
1549585fea7bSBram Moolenaar  if false
15506797966dSBram Moolenaar    execute('g:glob = 3')
1551585fea7bSBram Moolenaar  endif
1552585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1553585fea7bSBram Moolenaar  if true
15546797966dSBram Moolenaar    execute('g:glob = 3')
1555585fea7bSBram Moolenaar  endif
1556585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1557585fea7bSBram Moolenaar
15586d69bf60SBram Moolenaar  res = false
15596d69bf60SBram Moolenaar  if g:bool_true ? true : false
15606d69bf60SBram Moolenaar    res = true
15616d69bf60SBram Moolenaar  endif
15626d69bf60SBram Moolenaar  assert_equal(true, res)
15636d69bf60SBram Moolenaar
15646d69bf60SBram Moolenaar  res = false
15656d69bf60SBram Moolenaar  if true ? g:bool_true : false
15666d69bf60SBram Moolenaar    res = true
15676d69bf60SBram Moolenaar  endif
15686d69bf60SBram Moolenaar  assert_equal(true, res)
15696d69bf60SBram Moolenaar
15706d69bf60SBram Moolenaar  res = false
15716d69bf60SBram Moolenaar  if true ? true : g:bool_false
15726d69bf60SBram Moolenaar    res = true
15736d69bf60SBram Moolenaar  endif
15746d69bf60SBram Moolenaar  assert_equal(true, res)
15756d69bf60SBram Moolenaar
15766d69bf60SBram Moolenaar  res = false
15776d69bf60SBram Moolenaar  if true ? false : true
15786d69bf60SBram Moolenaar    res = true
15796d69bf60SBram Moolenaar  endif
15806d69bf60SBram Moolenaar  assert_equal(false, res)
15816d69bf60SBram Moolenaar
15826d69bf60SBram Moolenaar  res = false
15836d69bf60SBram Moolenaar  if false ? false : true
15846d69bf60SBram Moolenaar    res = true
15856d69bf60SBram Moolenaar  endif
15866d69bf60SBram Moolenaar  assert_equal(true, res)
15876d69bf60SBram Moolenaar
15886d69bf60SBram Moolenaar  res = false
15896d69bf60SBram Moolenaar  if false ? true : false
15906d69bf60SBram Moolenaar    res = true
15916d69bf60SBram Moolenaar  endif
15926d69bf60SBram Moolenaar  assert_equal(false, res)
15936d69bf60SBram Moolenaar
15946d69bf60SBram Moolenaar  res = false
1595e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1596e8c4abbbSBram Moolenaar    res = true
1597e8c4abbbSBram Moolenaar  endif
1598e8c4abbbSBram Moolenaar  assert_equal(false, res)
1599e8c4abbbSBram Moolenaar
1600e8c4abbbSBram Moolenaar  res = false
16016d69bf60SBram Moolenaar  if true && true
16026d69bf60SBram Moolenaar    res = true
16036d69bf60SBram Moolenaar  endif
16046d69bf60SBram Moolenaar  assert_equal(true, res)
16056d69bf60SBram Moolenaar
16066d69bf60SBram Moolenaar  res = false
16076d69bf60SBram Moolenaar  if true && false
16086d69bf60SBram Moolenaar    res = true
16096d69bf60SBram Moolenaar  endif
16106d69bf60SBram Moolenaar  assert_equal(false, res)
16116d69bf60SBram Moolenaar
16126d69bf60SBram Moolenaar  res = false
16136d69bf60SBram Moolenaar  if g:bool_true && false
16146d69bf60SBram Moolenaar    res = true
16156d69bf60SBram Moolenaar  endif
16166d69bf60SBram Moolenaar  assert_equal(false, res)
16176d69bf60SBram Moolenaar
16186d69bf60SBram Moolenaar  res = false
16196d69bf60SBram Moolenaar  if true && g:bool_false
16206d69bf60SBram Moolenaar    res = true
16216d69bf60SBram Moolenaar  endif
16226d69bf60SBram Moolenaar  assert_equal(false, res)
16236d69bf60SBram Moolenaar
16246d69bf60SBram Moolenaar  res = false
16256d69bf60SBram Moolenaar  if false && false
16266d69bf60SBram Moolenaar    res = true
16276d69bf60SBram Moolenaar  endif
16286d69bf60SBram Moolenaar  assert_equal(false, res)
16296d69bf60SBram Moolenaar
16306d69bf60SBram Moolenaar  res = false
16316d69bf60SBram Moolenaar  if true || false
16326d69bf60SBram Moolenaar    res = true
16336d69bf60SBram Moolenaar  endif
16346d69bf60SBram Moolenaar  assert_equal(true, res)
16356d69bf60SBram Moolenaar
16366d69bf60SBram Moolenaar  res = false
16376d69bf60SBram Moolenaar  if g:bool_true || false
16386d69bf60SBram Moolenaar    res = true
16396d69bf60SBram Moolenaar  endif
16406d69bf60SBram Moolenaar  assert_equal(true, res)
16416d69bf60SBram Moolenaar
16426d69bf60SBram Moolenaar  res = false
16436d69bf60SBram Moolenaar  if true || g:bool_false
16446d69bf60SBram Moolenaar    res = true
16456d69bf60SBram Moolenaar  endif
16466d69bf60SBram Moolenaar  assert_equal(true, res)
16476d69bf60SBram Moolenaar
16486d69bf60SBram Moolenaar  res = false
16496d69bf60SBram Moolenaar  if false || false
16506d69bf60SBram Moolenaar    res = true
16516d69bf60SBram Moolenaar  endif
16526d69bf60SBram Moolenaar  assert_equal(false, res)
16533988f64fSBram Moolenaar
16543988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
16553988f64fSBram Moolenaar  if false | eval 0 | endif
16563988f64fSBram Moolenaar  if false | eval burp + 234 | endif
16573988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
16583988f64fSBram Moolenaar  if false
16593988f64fSBram Moolenaar    burp
16603988f64fSBram Moolenaar  endif
166180c34ca3SBram Moolenaarenddef
16626d69bf60SBram Moolenaar
166380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1664d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1665d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1666d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1667d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
16686d69bf60SBram Moolenaarenddef
16696d69bf60SBram Moolenaar
167072abcf42SBram Moolenaardef RunNested(i: number): number
1671cfcd011fSBram Moolenaar  var x: number = 0
167272abcf42SBram Moolenaar  if i % 2
167372abcf42SBram Moolenaar    if 1
1674f5be8cdbSBram Moolenaar      # comment
167572abcf42SBram Moolenaar    else
1676f5be8cdbSBram Moolenaar      # comment
167772abcf42SBram Moolenaar    endif
167872abcf42SBram Moolenaar    x += 1
167972abcf42SBram Moolenaar  else
168072abcf42SBram Moolenaar    x += 1000
168172abcf42SBram Moolenaar  endif
168272abcf42SBram Moolenaar  return x
168372abcf42SBram Moolenaarenddef
168472abcf42SBram Moolenaar
168572abcf42SBram Moolenaardef Test_nested_if()
168672abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
168772abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
168872abcf42SBram Moolenaarenddef
168972abcf42SBram Moolenaar
1690ad39c094SBram Moolenaardef Test_execute_cmd()
1691ad39c094SBram Moolenaar  new
1692ad39c094SBram Moolenaar  setline(1, 'default')
1693d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1694ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1695a72cfb80SBram Moolenaar
1696d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1697a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1698a72cfb80SBram Moolenaar
1699cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
1700cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
1701a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1702ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1703a72cfb80SBram Moolenaar
1704d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
1705ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1706a72cfb80SBram Moolenaar
1707cfcd011fSBram Moolenaar  var cmd_first = 'call '
1708cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
1709ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1710ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1711ad39c094SBram Moolenaar  bwipe!
1712585fea7bSBram Moolenaar
1713cfcd011fSBram Moolenaar  var n = true
17142d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
17152d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
17162d6b20d6SBram Moolenaar
1717e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
1718e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
1719e5abf7afSBram Moolenaar
1720d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
1721d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1722d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
1723ad39c094SBram Moolenaarenddef
1724ad39c094SBram Moolenaar
172547e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1726f5be8cdbSBram Moolenaar  # only checks line continuation
1727cfcd011fSBram Moolenaar  var lines =<< trim END
172847e880d6SBram Moolenaar      vim9script
172947e880d6SBram Moolenaar      execute 'g:someVar'
173047e880d6SBram Moolenaar                .. ' = ' ..
173147e880d6SBram Moolenaar                   '28'
173247e880d6SBram Moolenaar      assert_equal(28, g:someVar)
173347e880d6SBram Moolenaar      unlet g:someVar
173447e880d6SBram Moolenaar  END
173547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
173647e880d6SBram Moolenaarenddef
173747e880d6SBram Moolenaar
1738ad39c094SBram Moolenaardef Test_echo_cmd()
1739a72cfb80SBram Moolenaar  echo 'some' # comment
1740585fea7bSBram Moolenaar  echon 'thing'
1741ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1742ad39c094SBram Moolenaar
1743a72cfb80SBram Moolenaar  echo "some" # comment
1744a72cfb80SBram Moolenaar  echon "thing"
1745a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1746a72cfb80SBram Moolenaar
1747cfcd011fSBram Moolenaar  var str1 = 'some'
1748cfcd011fSBram Moolenaar  var str2 = 'more'
1749ad39c094SBram Moolenaar  echo str1 str2
1750ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1751a72cfb80SBram Moolenaar
1752d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1753ad39c094SBram Moolenaarenddef
1754ad39c094SBram Moolenaar
1755f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1756f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1757f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1758f93c7feaSBram Moolenaar  echo 'clear'
1759df069eecSBram Moolenaar  :1messages
1760f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1761f93c7feaSBram Moolenaar
1762d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1763f93c7feaSBram Moolenaarenddef
1764f93c7feaSBram Moolenaar
176547e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1766f5be8cdbSBram Moolenaar  # only checks line continuation
1767cfcd011fSBram Moolenaar  var lines =<< trim END
176847e880d6SBram Moolenaar      vim9script
176947e880d6SBram Moolenaar      echomsg 'here'
177047e880d6SBram Moolenaar                .. ' is ' ..
177147e880d6SBram Moolenaar                   'a message'
177247e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
177347e880d6SBram Moolenaar  END
177447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
177547e880d6SBram Moolenaarenddef
177647e880d6SBram Moolenaar
1777f93c7feaSBram Moolenaardef Test_echoerr_cmd()
177840ee466cSBram Moolenaar  try
177940ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
178040ee466cSBram Moolenaar  catch
178140ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
178240ee466cSBram Moolenaar  endtry
1783f93c7feaSBram Moolenaarenddef
1784f93c7feaSBram Moolenaar
178547e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1786f5be8cdbSBram Moolenaar  # only checks line continuation
1787cfcd011fSBram Moolenaar  var lines =<< trim END
178847e880d6SBram Moolenaar      vim9script
178947e880d6SBram Moolenaar      try
179047e880d6SBram Moolenaar        echoerr 'this'
179147e880d6SBram Moolenaar                .. ' is ' ..
179247e880d6SBram Moolenaar                   'wrong'
179347e880d6SBram Moolenaar      catch
179447e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
179547e880d6SBram Moolenaar      endtry
179647e880d6SBram Moolenaar  END
179747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
179847e880d6SBram Moolenaarenddef
179947e880d6SBram Moolenaar
180041fe0617SBram Moolenaardef Test_for_outside_of_function()
1801cfcd011fSBram Moolenaar  var lines =<< trim END
180241fe0617SBram Moolenaar    vim9script
180341fe0617SBram Moolenaar    new
180441fe0617SBram Moolenaar    for var in range(0, 3)
180541fe0617SBram Moolenaar      append(line('$'), var)
180641fe0617SBram Moolenaar    endfor
180741fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
180841fe0617SBram Moolenaar    bwipe!
180941fe0617SBram Moolenaar  END
181041fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
181141fe0617SBram Moolenaar  source Xvim9for.vim
181241fe0617SBram Moolenaar  delete('Xvim9for.vim')
181341fe0617SBram Moolenaarenddef
18148a7d6542SBram Moolenaar
1815e8c4abbbSBram Moolenaardef Test_for_loop()
1816cfcd011fSBram Moolenaar  var result = ''
1817e8c4abbbSBram Moolenaar  for cnt in range(7)
1818e8c4abbbSBram Moolenaar    if cnt == 4
1819e8c4abbbSBram Moolenaar      break
1820e8c4abbbSBram Moolenaar    endif
1821e8c4abbbSBram Moolenaar    if cnt == 2
1822e8c4abbbSBram Moolenaar      continue
1823e8c4abbbSBram Moolenaar    endif
1824e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1825e8c4abbbSBram Moolenaar  endfor
1826e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
18270ad3e894SBram Moolenaar
1828cfcd011fSBram Moolenaar  var concat = ''
18290ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
18300ad3e894SBram Moolenaar    concat ..= str
18310ad3e894SBram Moolenaar  endfor
18320ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1833e8c4abbbSBram Moolenaarenddef
1834e8c4abbbSBram Moolenaar
1835e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1836675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1837675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1838cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
1839822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
1840451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
1841675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1842675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1843675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1844e8c4abbbSBram Moolenaarenddef
1845e8c4abbbSBram Moolenaar
1846d0df1aacSBram Moolenaardef Test_while_loop()
1847cfcd011fSBram Moolenaar  var result = ''
1848cfcd011fSBram Moolenaar  var cnt = 0
1849d0df1aacSBram Moolenaar  while cnt < 555
1850d0df1aacSBram Moolenaar    if cnt == 3
1851d0df1aacSBram Moolenaar      break
1852d0df1aacSBram Moolenaar    endif
1853d0df1aacSBram Moolenaar    cnt += 1
1854d0df1aacSBram Moolenaar    if cnt == 2
1855d0df1aacSBram Moolenaar      continue
1856d0df1aacSBram Moolenaar    endif
1857d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1858d0df1aacSBram Moolenaar  endwhile
1859d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1860d0df1aacSBram Moolenaarenddef
1861d0df1aacSBram Moolenaar
1862e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1863675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1864675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1865675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1866675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1867675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1868675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1869675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1870bd5da371SBram Moolenaarenddef
1871bd5da371SBram Moolenaar
18729645e2d9SBram Moolenaardef Test_interrupt_loop()
1873cfcd011fSBram Moolenaar  var caught = false
1874cfcd011fSBram Moolenaar  var x = 0
187597acfc78SBram Moolenaar  try
18769645e2d9SBram Moolenaar    while 1
18779645e2d9SBram Moolenaar      x += 1
18789645e2d9SBram Moolenaar      if x == 100
18799645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
18809645e2d9SBram Moolenaar      endif
18819645e2d9SBram Moolenaar    endwhile
188297acfc78SBram Moolenaar  catch
188397acfc78SBram Moolenaar    caught = true
188497acfc78SBram Moolenaar    assert_equal(100, x)
188597acfc78SBram Moolenaar  endtry
188697acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
188725859dd7SBram Moolenaar  # consume the CTRL-C
188825859dd7SBram Moolenaar  getchar(0)
18899645e2d9SBram Moolenaarenddef
189020431c9dSBram Moolenaar
18914fdae999SBram Moolenaardef Test_automatic_line_continuation()
1892cfcd011fSBram Moolenaar  var mylist = [
18934fdae999SBram Moolenaar      'one',
18944fdae999SBram Moolenaar      'two',
18954fdae999SBram Moolenaar      'three',
1896f5be8cdbSBram Moolenaar      ] # comment
18974fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
18984fdae999SBram Moolenaar
1899cfcd011fSBram Moolenaar  var mydict = {
19004fdae999SBram Moolenaar      'one': 1,
19014fdae999SBram Moolenaar      'two': 2,
19024fdae999SBram Moolenaar      'three':
19034fdae999SBram Moolenaar          3,
1904f5be8cdbSBram Moolenaar      } # comment
19054fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
19064fdae999SBram Moolenaar  mydict = #{
19072c330432SBram Moolenaar      one: 1,  # comment
19082c330432SBram Moolenaar      two:     # comment
19092c330432SBram Moolenaar           2,  # comment
19102c330432SBram Moolenaar      three: 3 # comment
19112c330432SBram Moolenaar      }
19122c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
19132c330432SBram Moolenaar  mydict = #{
19142c330432SBram Moolenaar      one: 1,
19154fdae999SBram Moolenaar      two:
19164fdae999SBram Moolenaar           2,
19172c330432SBram Moolenaar      three: 3
19184fdae999SBram Moolenaar      }
19194fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1920e6085c53SBram Moolenaar
1921e6085c53SBram Moolenaar  assert_equal(
1922e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1923e6085c53SBram Moolenaar        split('one two three')
1924e6085c53SBram Moolenaar        )
19254fdae999SBram Moolenaarenddef
19264fdae999SBram Moolenaar
19277a092245SBram Moolenaardef Test_vim9_comment()
19287a092245SBram Moolenaar  CheckScriptSuccess([
19297a092245SBram Moolenaar      'vim9script',
19307a092245SBram Moolenaar      '# something',
19317a092245SBram Moolenaar      ])
19327a092245SBram Moolenaar  CheckScriptFailure([
19337a092245SBram Moolenaar      'vim9script',
19347a092245SBram Moolenaar      ':# something',
19357a092245SBram Moolenaar      ], 'E488:')
19367a092245SBram Moolenaar  CheckScriptFailure([
19377a092245SBram Moolenaar      '# something',
19387a092245SBram Moolenaar      ], 'E488:')
19397a092245SBram Moolenaar  CheckScriptFailure([
19407a092245SBram Moolenaar      ':# something',
19417a092245SBram Moolenaar      ], 'E488:')
19427a092245SBram Moolenaar
19434a8d9f2eSBram Moolenaar  { # block start
19444a8d9f2eSBram Moolenaar  } # block end
19454a8d9f2eSBram Moolenaar  CheckDefFailure([
19464a8d9f2eSBram Moolenaar      '{# comment',
19474a8d9f2eSBram Moolenaar      ], 'E488:')
19484a8d9f2eSBram Moolenaar  CheckDefFailure([
19494a8d9f2eSBram Moolenaar      '{',
19504a8d9f2eSBram Moolenaar      '}# comment',
19514a8d9f2eSBram Moolenaar      ], 'E488:')
19524a8d9f2eSBram Moolenaar
19534a8d9f2eSBram Moolenaar  echo "yes" # comment
19544a8d9f2eSBram Moolenaar  CheckDefFailure([
19554a8d9f2eSBram Moolenaar      'echo "yes"# comment',
19564a8d9f2eSBram Moolenaar      ], 'E488:')
19577a092245SBram Moolenaar  CheckScriptSuccess([
19587a092245SBram Moolenaar      'vim9script',
19597a092245SBram Moolenaar      'echo "yes" # something',
19607a092245SBram Moolenaar      ])
19617a092245SBram Moolenaar  CheckScriptFailure([
19627a092245SBram Moolenaar      'vim9script',
19637a092245SBram Moolenaar      'echo "yes"# something',
19647a092245SBram Moolenaar      ], 'E121:')
19657a092245SBram Moolenaar  CheckScriptFailure([
19667a092245SBram Moolenaar      'vim9script',
19677a092245SBram Moolenaar      'echo# something',
19687a092245SBram Moolenaar      ], 'E121:')
19697a092245SBram Moolenaar  CheckScriptFailure([
19707a092245SBram Moolenaar      'echo "yes" # something',
19717a092245SBram Moolenaar      ], 'E121:')
19727a092245SBram Moolenaar
19734a8d9f2eSBram Moolenaar  exe "echo" # comment
19744a8d9f2eSBram Moolenaar  CheckDefFailure([
19754a8d9f2eSBram Moolenaar      'exe "echo"# comment',
19764a8d9f2eSBram Moolenaar      ], 'E488:')
19774a8d9f2eSBram Moolenaar  CheckScriptSuccess([
19784a8d9f2eSBram Moolenaar      'vim9script',
19794a8d9f2eSBram Moolenaar      'exe "echo" # something',
19804a8d9f2eSBram Moolenaar      ])
19814a8d9f2eSBram Moolenaar  CheckScriptFailure([
19824a8d9f2eSBram Moolenaar      'vim9script',
19834a8d9f2eSBram Moolenaar      'exe "echo"# something',
19844a8d9f2eSBram Moolenaar      ], 'E121:')
19854a8d9f2eSBram Moolenaar  CheckDefFailure([
19864a8d9f2eSBram Moolenaar      'exe # comment',
19874a8d9f2eSBram Moolenaar      ], 'E1015:')
19884a8d9f2eSBram Moolenaar  CheckScriptFailure([
19894a8d9f2eSBram Moolenaar      'vim9script',
19904a8d9f2eSBram Moolenaar      'exe# something',
19914a8d9f2eSBram Moolenaar      ], 'E121:')
19924a8d9f2eSBram Moolenaar  CheckScriptFailure([
19934a8d9f2eSBram Moolenaar      'exe "echo" # something',
19944a8d9f2eSBram Moolenaar      ], 'E121:')
19954a8d9f2eSBram Moolenaar
19967a092245SBram Moolenaar  CheckDefFailure([
19977a092245SBram Moolenaar      'try# comment',
19987a092245SBram Moolenaar      '  echo "yes"',
19997a092245SBram Moolenaar      'catch',
20007a092245SBram Moolenaar      'endtry',
20017a092245SBram Moolenaar      ], 'E488:')
20022c5ed4e3SBram Moolenaar  CheckScriptFailure([
20032c5ed4e3SBram Moolenaar      'vim9script',
20042c5ed4e3SBram Moolenaar      'try# comment',
20052c5ed4e3SBram Moolenaar      'echo "yes"',
20062c5ed4e3SBram Moolenaar      ], 'E488:')
20077a092245SBram Moolenaar  CheckDefFailure([
20087a092245SBram Moolenaar      'try',
2009a72cfb80SBram Moolenaar      '  throw#comment',
2010a72cfb80SBram Moolenaar      'catch',
2011a72cfb80SBram Moolenaar      'endtry',
2012a72cfb80SBram Moolenaar      ], 'E1015:')
2013a72cfb80SBram Moolenaar  CheckDefFailure([
2014a72cfb80SBram Moolenaar      'try',
2015a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2016a72cfb80SBram Moolenaar      'catch',
2017a72cfb80SBram Moolenaar      'endtry',
2018a72cfb80SBram Moolenaar      ], 'E488:')
2019a72cfb80SBram Moolenaar  CheckDefFailure([
2020a72cfb80SBram Moolenaar      'try',
20217a092245SBram Moolenaar      '  echo "yes"',
20227a092245SBram Moolenaar      'catch# comment',
20237a092245SBram Moolenaar      'endtry',
20247a092245SBram Moolenaar      ], 'E488:')
20252c5ed4e3SBram Moolenaar  CheckScriptFailure([
20262c5ed4e3SBram Moolenaar      'vim9script',
20272c5ed4e3SBram Moolenaar      'try',
20282c5ed4e3SBram Moolenaar      '  echo "yes"',
20292c5ed4e3SBram Moolenaar      'catch# comment',
20302c5ed4e3SBram Moolenaar      'endtry',
20312c5ed4e3SBram Moolenaar      ], 'E654:')
20322c5ed4e3SBram Moolenaar  CheckDefFailure([
20332c5ed4e3SBram Moolenaar      'try',
20342c5ed4e3SBram Moolenaar      '  echo "yes"',
20352c5ed4e3SBram Moolenaar      'catch /pat/# comment',
20362c5ed4e3SBram Moolenaar      'endtry',
20372c5ed4e3SBram Moolenaar      ], 'E488:')
20387a092245SBram Moolenaar  CheckDefFailure([
20397a092245SBram Moolenaar      'try',
20407a092245SBram Moolenaar      'echo "yes"',
20417a092245SBram Moolenaar      'catch',
20427a092245SBram Moolenaar      'endtry# comment',
20437a092245SBram Moolenaar      ], 'E488:')
20442c5ed4e3SBram Moolenaar  CheckScriptFailure([
20452c5ed4e3SBram Moolenaar      'vim9script',
20462c5ed4e3SBram Moolenaar      'try',
20472c5ed4e3SBram Moolenaar      '  echo "yes"',
20482c5ed4e3SBram Moolenaar      'catch',
20492c5ed4e3SBram Moolenaar      'endtry# comment',
20509b7bf9e9SBram Moolenaar      ], 'E488:')
20512c5ed4e3SBram Moolenaar
20522c5ed4e3SBram Moolenaar  CheckScriptSuccess([
20532c5ed4e3SBram Moolenaar      'vim9script',
20542c5ed4e3SBram Moolenaar      'hi # comment',
20552c5ed4e3SBram Moolenaar      ])
20562c5ed4e3SBram Moolenaar  CheckScriptFailure([
20572c5ed4e3SBram Moolenaar      'vim9script',
20582c5ed4e3SBram Moolenaar      'hi# comment',
20592c5ed4e3SBram Moolenaar      ], 'E416:')
20601966c248SBram Moolenaar  CheckScriptSuccess([
20611966c248SBram Moolenaar      'vim9script',
20621966c248SBram Moolenaar      'hi Search # comment',
20631966c248SBram Moolenaar      ])
20641966c248SBram Moolenaar  CheckScriptFailure([
20651966c248SBram Moolenaar      'vim9script',
20661966c248SBram Moolenaar      'hi Search# comment',
20671966c248SBram Moolenaar      ], 'E416:')
20681966c248SBram Moolenaar  CheckScriptSuccess([
20691966c248SBram Moolenaar      'vim9script',
20701966c248SBram Moolenaar      'hi link This Search # comment',
20711966c248SBram Moolenaar      ])
20721966c248SBram Moolenaar  CheckScriptFailure([
20731966c248SBram Moolenaar      'vim9script',
20741966c248SBram Moolenaar      'hi link This That# comment',
20751966c248SBram Moolenaar      ], 'E413:')
20761966c248SBram Moolenaar  CheckScriptSuccess([
20771966c248SBram Moolenaar      'vim9script',
20781966c248SBram Moolenaar      'hi clear This # comment',
20791966c248SBram Moolenaar      'hi clear # comment',
20801966c248SBram Moolenaar      ])
2081f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2082f5be8cdbSBram Moolenaar  # hi clear This# comment',
20831966c248SBram Moolenaar  CheckScriptFailure([
20841966c248SBram Moolenaar      'vim9script',
20851966c248SBram Moolenaar      'hi clear# comment',
20861966c248SBram Moolenaar      ], 'E416:')
20871966c248SBram Moolenaar
20881966c248SBram Moolenaar  CheckScriptSuccess([
20891966c248SBram Moolenaar      'vim9script',
20901966c248SBram Moolenaar      'hi Group term=bold',
20911966c248SBram Moolenaar      'match Group /todo/ # comment',
20921966c248SBram Moolenaar      ])
20931966c248SBram Moolenaar  CheckScriptFailure([
20941966c248SBram Moolenaar      'vim9script',
20951966c248SBram Moolenaar      'hi Group term=bold',
20961966c248SBram Moolenaar      'match Group /todo/# comment',
20971966c248SBram Moolenaar      ], 'E488:')
20981966c248SBram Moolenaar  CheckScriptSuccess([
20991966c248SBram Moolenaar      'vim9script',
21001966c248SBram Moolenaar      'match # comment',
21011966c248SBram Moolenaar      ])
21021966c248SBram Moolenaar  CheckScriptFailure([
21031966c248SBram Moolenaar      'vim9script',
21041966c248SBram Moolenaar      'match# comment',
21051966c248SBram Moolenaar      ], 'E475:')
21061966c248SBram Moolenaar  CheckScriptSuccess([
21071966c248SBram Moolenaar      'vim9script',
21081966c248SBram Moolenaar      'match none # comment',
21091966c248SBram Moolenaar      ])
21101966c248SBram Moolenaar  CheckScriptFailure([
21111966c248SBram Moolenaar      'vim9script',
21121966c248SBram Moolenaar      'match none# comment',
21131966c248SBram Moolenaar      ], 'E475:')
21141966c248SBram Moolenaar
21151966c248SBram Moolenaar  CheckScriptSuccess([
21161966c248SBram Moolenaar      'vim9script',
21171966c248SBram Moolenaar      'menutrans clear # comment',
21181966c248SBram Moolenaar      ])
21191966c248SBram Moolenaar  CheckScriptFailure([
21201966c248SBram Moolenaar      'vim9script',
21211966c248SBram Moolenaar      'menutrans clear# comment text',
21221966c248SBram Moolenaar      ], 'E474:')
21231966c248SBram Moolenaar
21241966c248SBram Moolenaar  CheckScriptSuccess([
21251966c248SBram Moolenaar      'vim9script',
21261966c248SBram Moolenaar      'syntax clear # comment',
21271966c248SBram Moolenaar      ])
21281966c248SBram Moolenaar  CheckScriptFailure([
21291966c248SBram Moolenaar      'vim9script',
21301966c248SBram Moolenaar      'syntax clear# comment text',
21311966c248SBram Moolenaar      ], 'E28:')
21321966c248SBram Moolenaar  CheckScriptSuccess([
21331966c248SBram Moolenaar      'vim9script',
21341966c248SBram Moolenaar      'syntax keyword Word some',
21351966c248SBram Moolenaar      'syntax clear Word # comment',
21361966c248SBram Moolenaar      ])
21371966c248SBram Moolenaar  CheckScriptFailure([
21381966c248SBram Moolenaar      'vim9script',
21391966c248SBram Moolenaar      'syntax keyword Word some',
21401966c248SBram Moolenaar      'syntax clear Word# comment text',
21411966c248SBram Moolenaar      ], 'E28:')
21421966c248SBram Moolenaar
21431966c248SBram Moolenaar  CheckScriptSuccess([
21441966c248SBram Moolenaar      'vim9script',
21451966c248SBram Moolenaar      'syntax list # comment',
21461966c248SBram Moolenaar      ])
21471966c248SBram Moolenaar  CheckScriptFailure([
21481966c248SBram Moolenaar      'vim9script',
21491966c248SBram Moolenaar      'syntax list# comment text',
21501966c248SBram Moolenaar      ], 'E28:')
21511966c248SBram Moolenaar
21521966c248SBram Moolenaar  CheckScriptSuccess([
21531966c248SBram Moolenaar      'vim9script',
21541966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
21551966c248SBram Moolenaar      ])
21561966c248SBram Moolenaar  CheckScriptFailure([
21571966c248SBram Moolenaar      'vim9script',
21581966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
21591966c248SBram Moolenaar      ], 'E475:')
21601966c248SBram Moolenaar
21611966c248SBram Moolenaar  CheckScriptSuccess([
21621966c248SBram Moolenaar      'vim9script',
21631966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
21641966c248SBram Moolenaar      ])
21651966c248SBram Moolenaar  CheckScriptFailure([
21661966c248SBram Moolenaar      'vim9script',
21671966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
21681966c248SBram Moolenaar      ], 'E789:')
21691966c248SBram Moolenaar
21701966c248SBram Moolenaar  CheckScriptSuccess([
21711966c248SBram Moolenaar      'vim9script',
21721966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
21731966c248SBram Moolenaar      ])
21741966c248SBram Moolenaar  CheckScriptFailure([
21751966c248SBram Moolenaar      'vim9script',
21761966c248SBram Moolenaar      'syntax match Word /pat/# comment',
21771966c248SBram Moolenaar      ], 'E402:')
21781966c248SBram Moolenaar
21791966c248SBram Moolenaar  CheckScriptSuccess([
21801966c248SBram Moolenaar      'vim9script',
21811966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
21821966c248SBram Moolenaar      ])
21831966c248SBram Moolenaar  CheckScriptFailure([
21841966c248SBram Moolenaar      'vim9script',
21851966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
21861966c248SBram Moolenaar      ], 'E475:')
21871966c248SBram Moolenaar  CheckScriptFailure([
21881966c248SBram Moolenaar      'vim9script',
21891966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
21901966c248SBram Moolenaar      ], 'E406:')
21911966c248SBram Moolenaar  CheckScriptFailure([
21921966c248SBram Moolenaar      'vim9script',
21931966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
21941966c248SBram Moolenaar      ], 'E475:')
21951966c248SBram Moolenaar
21961966c248SBram Moolenaar  CheckScriptSuccess([
21971966c248SBram Moolenaar      'vim9script',
21981966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
21991966c248SBram Moolenaar      ])
22001966c248SBram Moolenaar  CheckScriptFailure([
22011966c248SBram Moolenaar      'vim9script',
22021966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2203d032f34aSBram Moolenaar      ], 'E402:')
22041966c248SBram Moolenaar
22051966c248SBram Moolenaar  CheckScriptSuccess([
22061966c248SBram Moolenaar      'vim9script',
22071966c248SBram Moolenaar      'syntax sync # comment',
22081966c248SBram Moolenaar      ])
22091966c248SBram Moolenaar  CheckScriptFailure([
22101966c248SBram Moolenaar      'vim9script',
22111966c248SBram Moolenaar      'syntax sync# comment',
22121966c248SBram Moolenaar      ], 'E404:')
22131966c248SBram Moolenaar  CheckScriptSuccess([
22141966c248SBram Moolenaar      'vim9script',
22151966c248SBram Moolenaar      'syntax sync ccomment # comment',
22161966c248SBram Moolenaar      ])
22171966c248SBram Moolenaar  CheckScriptFailure([
22181966c248SBram Moolenaar      'vim9script',
22191966c248SBram Moolenaar      'syntax sync ccomment# comment',
22201966c248SBram Moolenaar      ], 'E404:')
22211966c248SBram Moolenaar
22221966c248SBram Moolenaar  CheckScriptSuccess([
22231966c248SBram Moolenaar      'vim9script',
22241966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
22251966c248SBram Moolenaar      ])
22261966c248SBram Moolenaar  CheckScriptFailure([
22271966c248SBram Moolenaar      'vim9script',
22281966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
22291966c248SBram Moolenaar      ], 'E475:')
2230a72cfb80SBram Moolenaar
2231a72cfb80SBram Moolenaar  CheckScriptSuccess([
2232a72cfb80SBram Moolenaar      'vim9script',
2233a72cfb80SBram Moolenaar      'command Echo echo # comment',
2234a72cfb80SBram Moolenaar      'command Echo # comment',
2235a72cfb80SBram Moolenaar      ])
2236a72cfb80SBram Moolenaar  CheckScriptFailure([
2237a72cfb80SBram Moolenaar      'vim9script',
2238a72cfb80SBram Moolenaar      'command Echo echo# comment',
2239a72cfb80SBram Moolenaar      'Echo',
2240a72cfb80SBram Moolenaar      ], 'E121:')
2241a72cfb80SBram Moolenaar  CheckScriptFailure([
2242a72cfb80SBram Moolenaar      'vim9script',
2243a72cfb80SBram Moolenaar      'command Echo# comment',
2244a72cfb80SBram Moolenaar      ], 'E182:')
2245a72cfb80SBram Moolenaar  CheckScriptFailure([
2246a72cfb80SBram Moolenaar      'vim9script',
2247a72cfb80SBram Moolenaar      'command Echo echo',
2248a72cfb80SBram Moolenaar      'command Echo# comment',
2249a72cfb80SBram Moolenaar      ], 'E182:')
2250a72cfb80SBram Moolenaar
2251a72cfb80SBram Moolenaar  CheckScriptSuccess([
2252a72cfb80SBram Moolenaar      'vim9script',
2253a72cfb80SBram Moolenaar      'function # comment',
2254a72cfb80SBram Moolenaar      ])
2255a72cfb80SBram Moolenaar  CheckScriptFailure([
2256a72cfb80SBram Moolenaar      'vim9script',
22579898107fSBram Moolenaar      'function " comment',
22589898107fSBram Moolenaar      ], 'E129:')
22599898107fSBram Moolenaar  CheckScriptFailure([
22609898107fSBram Moolenaar      'vim9script',
2261a72cfb80SBram Moolenaar      'function# comment',
2262a72cfb80SBram Moolenaar      ], 'E129:')
2263a72cfb80SBram Moolenaar  CheckScriptSuccess([
2264a72cfb80SBram Moolenaar      'vim9script',
2265a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2266a72cfb80SBram Moolenaar      ])
2267a72cfb80SBram Moolenaar  CheckScriptFailure([
2268a72cfb80SBram Moolenaar      'vim9script',
2269a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2270a72cfb80SBram Moolenaar      ], 'E488:')
2271a72cfb80SBram Moolenaar
2272a72cfb80SBram Moolenaar  CheckScriptSuccess([
2273a72cfb80SBram Moolenaar      'vim9script',
22744c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2275a72cfb80SBram Moolenaar      'endfunc',
22764c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2277a72cfb80SBram Moolenaar      ])
2278a72cfb80SBram Moolenaar  CheckScriptFailure([
2279a72cfb80SBram Moolenaar      'vim9script',
22804c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2281a72cfb80SBram Moolenaar      'endfunc',
22824c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2283a72cfb80SBram Moolenaar      ], 'E488:')
2284a72cfb80SBram Moolenaar
2285a72cfb80SBram Moolenaar  CheckScriptSuccess([
2286a72cfb80SBram Moolenaar      'vim9script',
2287a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2288a72cfb80SBram Moolenaar      ])
2289a72cfb80SBram Moolenaar  CheckScriptFailure([
2290a72cfb80SBram Moolenaar      'vim9script',
2291a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2292a72cfb80SBram Moolenaar      ], 'E488:')
2293e7e4838fSBram Moolenaar
2294e7e4838fSBram Moolenaar  CheckScriptFailure([
2295e7e4838fSBram Moolenaar      'def Test() " comment',
2296e7e4838fSBram Moolenaar      'enddef',
2297e7e4838fSBram Moolenaar      ], 'E488:')
2298e7e4838fSBram Moolenaar  CheckScriptFailure([
2299e7e4838fSBram Moolenaar      'vim9script',
2300e7e4838fSBram Moolenaar      'def Test() " comment',
2301e7e4838fSBram Moolenaar      'enddef',
2302e7e4838fSBram Moolenaar      ], 'E488:')
2303e7e4838fSBram Moolenaar
2304e7e4838fSBram Moolenaar  CheckScriptSuccess([
2305e7e4838fSBram Moolenaar      'func Test() " comment',
2306e7e4838fSBram Moolenaar      'endfunc',
2307e7e4838fSBram Moolenaar      ])
23089898107fSBram Moolenaar  CheckScriptSuccess([
2309e7e4838fSBram Moolenaar      'vim9script',
2310e7e4838fSBram Moolenaar      'func Test() " comment',
2311e7e4838fSBram Moolenaar      'endfunc',
23129898107fSBram Moolenaar      ])
2313e7e4838fSBram Moolenaar
2314e7e4838fSBram Moolenaar  CheckScriptSuccess([
2315e7e4838fSBram Moolenaar      'def Test() # comment',
2316e7e4838fSBram Moolenaar      'enddef',
2317e7e4838fSBram Moolenaar      ])
2318e7e4838fSBram Moolenaar  CheckScriptFailure([
2319e7e4838fSBram Moolenaar      'func Test() # comment',
2320e7e4838fSBram Moolenaar      'endfunc',
2321e7e4838fSBram Moolenaar      ], 'E488:')
23222c5ed4e3SBram Moolenaarenddef
23232c5ed4e3SBram Moolenaar
23242c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
23252c5ed4e3SBram Moolenaar  CheckCanRunGui
23262c5ed4e3SBram Moolenaar
23272c5ed4e3SBram Moolenaar  CheckScriptFailure([
23282c5ed4e3SBram Moolenaar      'vim9script',
23292c5ed4e3SBram Moolenaar      'gui#comment'
23302c5ed4e3SBram Moolenaar      ], 'E499:')
23312c5ed4e3SBram Moolenaar  CheckScriptFailure([
23322c5ed4e3SBram Moolenaar      'vim9script',
23332c5ed4e3SBram Moolenaar      'gui -f#comment'
23342c5ed4e3SBram Moolenaar      ], 'E499:')
23357a092245SBram Moolenaarenddef
23367a092245SBram Moolenaar
2337a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
23386797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
23396797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2340a26b9700SBram Moolenaar
2341a26b9700SBram Moolenaar  edit test.vim
2342a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2343a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2344a26b9700SBram Moolenaar
2345a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2346a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2347a26b9700SBram Moolenaar
2348a26b9700SBram Moolenaar  g:entered = 0
2349a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2350a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2351a26b9700SBram Moolenaar
2352a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2353a26b9700SBram Moolenaar
2354a26b9700SBram Moolenaar  au! TabEnter
2355a26b9700SBram Moolenaar  unlet g:entered
2356d72c1bf0SBram Moolenaar
2357d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2358d72c1bf0SBram Moolenaar      'vim9script',
23596797966dSBram Moolenaar      'g:var = 123',
2360e55b1c09SBram Moolenaar      'b:var = 456',
2361e55b1c09SBram Moolenaar      'w:var = 777',
2362e55b1c09SBram Moolenaar      't:var = 888',
2363d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2364d72c1bf0SBram Moolenaar      ])
2365d72c1bf0SBram Moolenaar
2366d72c1bf0SBram Moolenaar  CheckScriptFailure([
2367d72c1bf0SBram Moolenaar      'vim9script',
2368cfcd011fSBram Moolenaar      'let var = 123',
2369cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2370cfcd011fSBram Moolenaar
2371cfcd011fSBram Moolenaar  CheckScriptFailure([
2372cfcd011fSBram Moolenaar      'vim9script',
2373cfcd011fSBram Moolenaar      'var g:var = 123',
2374e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2375e55b1c09SBram Moolenaar
2376e55b1c09SBram Moolenaar  CheckScriptFailure([
2377e55b1c09SBram Moolenaar      'vim9script',
2378cfcd011fSBram Moolenaar      'var b:var = 123',
2379e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2380e55b1c09SBram Moolenaar
2381e55b1c09SBram Moolenaar  CheckScriptFailure([
2382e55b1c09SBram Moolenaar      'vim9script',
2383cfcd011fSBram Moolenaar      'var w:var = 123',
2384e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2385e55b1c09SBram Moolenaar
2386e55b1c09SBram Moolenaar  CheckScriptFailure([
2387e55b1c09SBram Moolenaar      'vim9script',
2388cfcd011fSBram Moolenaar      'var t:var = 123',
2389e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2390e55b1c09SBram Moolenaar
2391e55b1c09SBram Moolenaar  CheckScriptFailure([
2392e55b1c09SBram Moolenaar      'vim9script',
2393cfcd011fSBram Moolenaar      'var v:version = 123',
2394e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2395e55b1c09SBram Moolenaar
2396e55b1c09SBram Moolenaar  CheckScriptFailure([
2397e55b1c09SBram Moolenaar      'vim9script',
2398cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2399e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
24006797966dSBram Moolenaar
24016797966dSBram Moolenaar  CheckScriptFailure([
24026797966dSBram Moolenaar      'vim9script',
24036797966dSBram Moolenaar      'g:var = 123',
240432e35117SBram Moolenaar      'unlet g:var# comment1',
2405d72c1bf0SBram Moolenaar      ], 'E108:')
2406d72c1bf0SBram Moolenaar
2407d72c1bf0SBram Moolenaar  CheckScriptFailure([
2408d72c1bf0SBram Moolenaar      'let g:var = 123',
2409d72c1bf0SBram Moolenaar      'unlet g:var # something',
2410d72c1bf0SBram Moolenaar      ], 'E488:')
2411faac4104SBram Moolenaar
2412faac4104SBram Moolenaar  CheckScriptSuccess([
2413faac4104SBram Moolenaar      'vim9script',
241432e35117SBram Moolenaar      'if 1 # comment2',
2415faac4104SBram Moolenaar      '  echo "yes"',
2416faac4104SBram Moolenaar      'elseif 2 #comment',
2417faac4104SBram Moolenaar      '  echo "no"',
2418faac4104SBram Moolenaar      'endif',
2419faac4104SBram Moolenaar      ])
2420faac4104SBram Moolenaar
2421faac4104SBram Moolenaar  CheckScriptFailure([
2422faac4104SBram Moolenaar      'vim9script',
242332e35117SBram Moolenaar      'if 1# comment3',
2424faac4104SBram Moolenaar      '  echo "yes"',
2425faac4104SBram Moolenaar      'endif',
2426faac4104SBram Moolenaar      ], 'E15:')
2427faac4104SBram Moolenaar
2428faac4104SBram Moolenaar  CheckScriptFailure([
2429faac4104SBram Moolenaar      'vim9script',
243032e35117SBram Moolenaar      'if 0 # comment4',
2431faac4104SBram Moolenaar      '  echo "yes"',
2432faac4104SBram Moolenaar      'elseif 2#comment',
2433faac4104SBram Moolenaar      '  echo "no"',
2434faac4104SBram Moolenaar      'endif',
2435faac4104SBram Moolenaar      ], 'E15:')
2436faac4104SBram Moolenaar
2437faac4104SBram Moolenaar  CheckScriptSuccess([
2438faac4104SBram Moolenaar      'vim9script',
2439cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2440faac4104SBram Moolenaar      ])
2441faac4104SBram Moolenaar
2442faac4104SBram Moolenaar  CheckScriptFailure([
2443faac4104SBram Moolenaar      'vim9script',
2444cfcd011fSBram Moolenaar      'var v = 1# comment6',
244532e35117SBram Moolenaar      ], 'E15:')
2446faac4104SBram Moolenaar
2447faac4104SBram Moolenaar  CheckScriptSuccess([
2448faac4104SBram Moolenaar      'vim9script',
2449faac4104SBram Moolenaar      'new'
2450d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2451df069eecSBram Moolenaar      ':$',
2452faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2453faac4104SBram Moolenaar      'bwipe!',
2454faac4104SBram Moolenaar      ])
2455faac4104SBram Moolenaar
2456f5be8cdbSBram Moolenaar  CheckScriptFailure([
2457f5be8cdbSBram Moolenaar      'vim9script',
2458f5be8cdbSBram Moolenaar      'new'
2459d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2460f5be8cdbSBram Moolenaar      ':$',
2461f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2462f5be8cdbSBram Moolenaar      'bwipe!',
2463f5be8cdbSBram Moolenaar      ], 'E488:')
2464f5be8cdbSBram Moolenaar
2465f5be8cdbSBram Moolenaar  CheckScriptFailure([
2466f5be8cdbSBram Moolenaar      'vim9script',
2467f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2468f5be8cdbSBram Moolenaar      ], 'E477:')
2469a26b9700SBram Moolenaarenddef
2470a26b9700SBram Moolenaar
24717e5bd91dSBram Moolenaardef Test_finish()
2472cfcd011fSBram Moolenaar  var lines =<< trim END
24737e5bd91dSBram Moolenaar    vim9script
24746797966dSBram Moolenaar    g:res = 'one'
24757e5bd91dSBram Moolenaar    if v:false | finish | endif
24766797966dSBram Moolenaar    g:res = 'two'
24777e5bd91dSBram Moolenaar    finish
24786797966dSBram Moolenaar    g:res = 'three'
24797e5bd91dSBram Moolenaar  END
24807e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
24817e5bd91dSBram Moolenaar  source Xfinished
24827e5bd91dSBram Moolenaar  assert_equal('two', g:res)
24837e5bd91dSBram Moolenaar
24847e5bd91dSBram Moolenaar  unlet g:res
24857e5bd91dSBram Moolenaar  delete('Xfinished')
24867e5bd91dSBram Moolenaarenddef
24877e5bd91dSBram Moolenaar
2488a5d0077eSBram Moolenaardef Test_forward_declaration()
2489cfcd011fSBram Moolenaar  var lines =<< trim END
2490a5d0077eSBram Moolenaar    vim9script
2491a5d0077eSBram Moolenaar    def GetValue(): string
2492a5d0077eSBram Moolenaar      return theVal
2493a5d0077eSBram Moolenaar    enddef
2494cfcd011fSBram Moolenaar    var theVal = 'something'
2495822ba247SBram Moolenaar    g:initVal = GetValue()
2496a5d0077eSBram Moolenaar    theVal = 'else'
2497a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2498a5d0077eSBram Moolenaar  END
2499a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2500a5d0077eSBram Moolenaar  source Xforward
2501a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2502a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2503a5d0077eSBram Moolenaar
2504a5d0077eSBram Moolenaar  unlet g:initVal
2505a5d0077eSBram Moolenaar  unlet g:laterVal
2506a5d0077eSBram Moolenaar  delete('Xforward')
2507a5d0077eSBram Moolenaarenddef
2508a5d0077eSBram Moolenaar
25099721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
2510cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
25119721fb4eSBram Moolenaar    source Xvim9_script.vim
25129721fb4eSBram Moolenaar
25139721fb4eSBram Moolenaar    call assert_false(exists('local'))
25149721fb4eSBram Moolenaar    call assert_false(exists('exported'))
25159721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
25169721fb4eSBram Moolenaar    call assert_equal('global', global)
25179721fb4eSBram Moolenaar    call assert_equal('global', g:global)
25189721fb4eSBram Moolenaar
25199721fb4eSBram Moolenaar    " imported variable becomes script-local
25209721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
25219721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
25229721fb4eSBram Moolenaar    call assert_false(exists('exported'))
25239721fb4eSBram Moolenaar
25249721fb4eSBram Moolenaar    " imported function becomes script-local
25259721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
25269721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
25279721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
25289721fb4eSBram Moolenaar  END
25299721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
25309721fb4eSBram Moolenaar
2531cfcd011fSBram Moolenaar  var vim9_lines =<< trim END
25329721fb4eSBram Moolenaar    vim9script
2533cfcd011fSBram Moolenaar    var local = 'local'
25349721fb4eSBram Moolenaar    g:global = 'global'
2535cfcd011fSBram Moolenaar    export var exported = 'exported'
25369721fb4eSBram Moolenaar    export def GetText(): string
25379721fb4eSBram Moolenaar       return 'text'
25389721fb4eSBram Moolenaar    enddef
25399721fb4eSBram Moolenaar  END
25409721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
25419721fb4eSBram Moolenaar
25429721fb4eSBram Moolenaar  source Xlegacy_script.vim
25439721fb4eSBram Moolenaar
25449721fb4eSBram Moolenaar  assert_equal('global', g:global)
2545f5be8cdbSBram Moolenaar  unlet g:global
25469721fb4eSBram Moolenaar
25479721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
25489721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
25499721fb4eSBram Moolenaarenddef
2550a5d0077eSBram Moolenaar
25517d699701SBram Moolenaarfunc Test_vim9script_not_global()
25527d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
25537d699701SBram Moolenaar  let vim9lines =<< trim END
25547d699701SBram Moolenaar    vim9script
2555cfcd011fSBram Moolenaar    var name = 'local'
25567d699701SBram Moolenaar    func TheFunc()
25577d699701SBram Moolenaar      echo 'local'
25587d699701SBram Moolenaar    endfunc
25597d699701SBram Moolenaar    def DefFunc()
25607d699701SBram Moolenaar      echo 'local'
25617d699701SBram Moolenaar    enddef
25627d699701SBram Moolenaar  END
25637d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
25647d699701SBram Moolenaar  source Xvim9script.vim
25657d699701SBram Moolenaar  try
25667d699701SBram Moolenaar    echo g:var
25677d699701SBram Moolenaar    assert_report('did not fail')
25687d699701SBram Moolenaar  catch /E121:/
25697d699701SBram Moolenaar    " caught
25707d699701SBram Moolenaar  endtry
25717d699701SBram Moolenaar  try
25727d699701SBram Moolenaar    call TheFunc()
25737d699701SBram Moolenaar    assert_report('did not fail')
25747d699701SBram Moolenaar  catch /E117:/
25757d699701SBram Moolenaar    " caught
25767d699701SBram Moolenaar  endtry
25777d699701SBram Moolenaar  try
25787d699701SBram Moolenaar    call DefFunc()
25797d699701SBram Moolenaar    assert_report('did not fail')
25807d699701SBram Moolenaar  catch /E117:/
25817d699701SBram Moolenaar    " caught
25827d699701SBram Moolenaar  endtry
25837d699701SBram Moolenaar
258425859dd7SBram Moolenaar  call delete('Xvim9script.vim')
25857d699701SBram Moolenaarendfunc
25867d699701SBram Moolenaar
2587eeb27bfeSBram Moolenaardef Test_vim9_copen()
2588eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2589eeb27bfeSBram Moolenaar  copen
2590eeb27bfeSBram Moolenaar  quit
2591eeb27bfeSBram Moolenaarenddef
2592eeb27bfeSBram Moolenaar
25932d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
25942d6b20d6SBram Moolenaardef Test_vim9_autoload()
2595cfcd011fSBram Moolenaar  var lines =<< trim END
25962d6b20d6SBram Moolenaar     vim9script
25972d6b20d6SBram Moolenaar     def foo#test()
25982d6b20d6SBram Moolenaar         echomsg getreg('"')
25992d6b20d6SBram Moolenaar     enddef
26002d6b20d6SBram Moolenaar  END
26012d6b20d6SBram Moolenaar
26022d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
26032d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
2604cfcd011fSBram Moolenaar  var save_rtp = &rtp
26052d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
26062d6b20d6SBram Moolenaar  augroup test
26072d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
26082d6b20d6SBram Moolenaar  augroup END
26092d6b20d6SBram Moolenaar
26102d6b20d6SBram Moolenaar  normal Y
26112d6b20d6SBram Moolenaar
26122d6b20d6SBram Moolenaar  augroup test
26132d6b20d6SBram Moolenaar    autocmd!
26142d6b20d6SBram Moolenaar  augroup END
26152d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
26162d6b20d6SBram Moolenaar  &rtp = save_rtp
26172d6b20d6SBram Moolenaarenddef
26182d6b20d6SBram Moolenaar
261977e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
262077e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
2621cfcd011fSBram Moolenaar  var lines =<< trim END
262277e5dcc3SBram Moolenaar      vim9script
262377e5dcc3SBram Moolenaar      def crash#func()
262477e5dcc3SBram Moolenaar          try
262577e5dcc3SBram Moolenaar              for x in List()
262677e5dcc3SBram Moolenaar              endfor
262777e5dcc3SBram Moolenaar          catch
262877e5dcc3SBram Moolenaar          endtry
262977e5dcc3SBram Moolenaar          g:ok = true
263077e5dcc3SBram Moolenaar      enddef
263177e5dcc3SBram Moolenaar      fu List()
263277e5dcc3SBram Moolenaar          invalid
263377e5dcc3SBram Moolenaar      endfu
263477e5dcc3SBram Moolenaar      try
263577e5dcc3SBram Moolenaar          invalid
263677e5dcc3SBram Moolenaar      catch /wontmatch/
263777e5dcc3SBram Moolenaar      endtry
263877e5dcc3SBram Moolenaar  END
263977e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
264077e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
264177e5dcc3SBram Moolenaar
264277e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
264377e5dcc3SBram Moolenaar  lines =<< trim END
264477e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
264577e5dcc3SBram Moolenaar    call crash#func()
264677e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
26479c4f5520SBram Moolenaar    qall!
264877e5dcc3SBram Moolenaar  END
264977e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
265077e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
265177e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
265277e5dcc3SBram Moolenaar
265377e5dcc3SBram Moolenaar  delete('Xdidit')
265477e5dcc3SBram Moolenaar  delete('Xscript')
265577e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
265677e5dcc3SBram Moolenaarenddef
265777e5dcc3SBram Moolenaar
265881e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
265981e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
266081e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
2661cfcd011fSBram Moolenaar  var lines =<< trim END
266281e17fbeSBram Moolenaar    let s:counter = 1
266381e17fbeSBram Moolenaar    def s:Func()
266481e17fbeSBram Moolenaar      au! CursorHold
266581e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
266681e17fbeSBram Moolenaar    enddef
266781e17fbeSBram Moolenaar    call s:Func()
266881e17fbeSBram Moolenaar    doau CursorHold
266981e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
267081e17fbeSBram Moolenaar    au! CursorHold
267181e17fbeSBram Moolenaar  END
267281e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
267381e17fbeSBram Moolenaarenddef
267481e17fbeSBram Moolenaar
26753896a105SBram Moolenaardef Test_cmdline_win()
26763896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
26773896a105SBram Moolenaar  # the command line window.
26783896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
2679cfcd011fSBram Moolenaar  var export_lines =<< trim END
26803896a105SBram Moolenaar    vim9script
2681cfcd011fSBram Moolenaar    export var That = 'yes'
26823896a105SBram Moolenaar  END
26833896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
2684cfcd011fSBram Moolenaar  var import_lines =<< trim END
26853896a105SBram Moolenaar    vim9script
26863896a105SBram Moolenaar    import That from './Xexport.vim'
26873896a105SBram Moolenaar  END
26883896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
2689cfcd011fSBram Moolenaar  var save_rtp = &rtp
26903896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
26913896a105SBram Moolenaar  syntax on
26923896a105SBram Moolenaar  augroup CmdWin
26933896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
26943896a105SBram Moolenaar  augroup END
26953896a105SBram Moolenaar  # this will open and also close the cmdline window
26963896a105SBram Moolenaar  feedkeys('q:', 'xt')
26973896a105SBram Moolenaar  assert_equal('yes', g:got_there)
26983896a105SBram Moolenaar
26993896a105SBram Moolenaar  augroup CmdWin
27003896a105SBram Moolenaar    au!
27013896a105SBram Moolenaar  augroup END
27023896a105SBram Moolenaar  &rtp = save_rtp
27033896a105SBram Moolenaar  delete('rtp', 'rf')
27043896a105SBram Moolenaarenddef
27053896a105SBram Moolenaar
2706e3d4685fSBram Moolenaardef Test_invalid_sid()
2707e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
270825859dd7SBram Moolenaar
27099c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
2710d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
2711e3d4685fSBram Moolenaar  endif
2712e3d4685fSBram Moolenaar  delete('Xdidit')
2713e3d4685fSBram Moolenaarenddef
2714e3d4685fSBram Moolenaar
2715f0afd9e1SBram Moolenaardef Test_unset_any_variable()
2716cfcd011fSBram Moolenaar  var lines =<< trim END
2717cfcd011fSBram Moolenaar    var name: any
2718cfcd011fSBram Moolenaar    assert_equal(0, name)
2719f0afd9e1SBram Moolenaar  END
2720f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2721f0afd9e1SBram Moolenaarenddef
2722f0afd9e1SBram Moolenaar
27237e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
272458dbef33SBram Moolenaar  CheckRunVimInTerminal
272558dbef33SBram Moolenaar
27267e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
27277e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
27287e9210eaSBram Moolenaarendfunc
27297e9210eaSBram Moolenaar
27307e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
27319c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
2732cfcd011fSBram Moolenaar  var lines =<< trim END
27339c4f5520SBram Moolenaar    func CheckAndQuit()
27349c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
27359c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
27369c4f5520SBram Moolenaar    endfunc
27379c4f5520SBram Moolenaar  END
27389c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
27399c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
2740cfcd011fSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', #{rows: 6})
27419c4f5520SBram Moolenaar  # define Afunc() on the command line
27429c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
27439c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
27449c4f5520SBram Moolenaar  WaitForAssert({-> assert_equal(['errors: []'], readfile('Xdidcmd'))})
27459c4f5520SBram Moolenaar
27469c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
27479c4f5520SBram Moolenaar  delete('XcallFunc')
27489c4f5520SBram Moolenaar  delete('Xdidcmd')
27499c4f5520SBram Moolenaarenddef
27509c4f5520SBram Moolenaar
2751fcdc5d83SBram Moolenaardef Test_script_var_scope()
2752fcdc5d83SBram Moolenaar  var lines =<< trim END
2753fcdc5d83SBram Moolenaar      vim9script
2754fcdc5d83SBram Moolenaar      if true
2755fcdc5d83SBram Moolenaar        if true
2756fcdc5d83SBram Moolenaar          var one = 'one'
2757fcdc5d83SBram Moolenaar          echo one
2758fcdc5d83SBram Moolenaar        endif
2759fcdc5d83SBram Moolenaar        echo one
2760fcdc5d83SBram Moolenaar      endif
2761fcdc5d83SBram Moolenaar  END
2762fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
2763fcdc5d83SBram Moolenaar
2764fcdc5d83SBram Moolenaar  lines =<< trim END
2765fcdc5d83SBram Moolenaar      vim9script
2766fcdc5d83SBram Moolenaar      if true
2767fcdc5d83SBram Moolenaar        if false
2768fcdc5d83SBram Moolenaar          var one = 'one'
2769fcdc5d83SBram Moolenaar          echo one
2770fcdc5d83SBram Moolenaar        else
2771fcdc5d83SBram Moolenaar          var one = 'one'
2772fcdc5d83SBram Moolenaar          echo one
2773fcdc5d83SBram Moolenaar        endif
2774fcdc5d83SBram Moolenaar        echo one
2775fcdc5d83SBram Moolenaar      endif
2776fcdc5d83SBram Moolenaar  END
2777fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
2778fcdc5d83SBram Moolenaar
2779fcdc5d83SBram Moolenaar  lines =<< trim END
2780fcdc5d83SBram Moolenaar      vim9script
2781fcdc5d83SBram Moolenaar      while true
2782fcdc5d83SBram Moolenaar        var one = 'one'
2783fcdc5d83SBram Moolenaar        echo one
2784fcdc5d83SBram Moolenaar        break
2785fcdc5d83SBram Moolenaar      endwhile
2786fcdc5d83SBram Moolenaar      echo one
2787fcdc5d83SBram Moolenaar  END
2788fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
2789fcdc5d83SBram Moolenaar
2790fcdc5d83SBram Moolenaar  lines =<< trim END
2791fcdc5d83SBram Moolenaar      vim9script
2792fcdc5d83SBram Moolenaar      for i in range(1)
2793fcdc5d83SBram Moolenaar        var one = 'one'
2794fcdc5d83SBram Moolenaar        echo one
2795fcdc5d83SBram Moolenaar      endfor
2796fcdc5d83SBram Moolenaar      echo one
2797fcdc5d83SBram Moolenaar  END
2798fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
27999becdf2bSBram Moolenaar
28009becdf2bSBram Moolenaar  lines =<< trim END
28019becdf2bSBram Moolenaar      vim9script
28029becdf2bSBram Moolenaar      {
28039becdf2bSBram Moolenaar        var one = 'one'
28049becdf2bSBram Moolenaar        assert_equal('one', one)
28059becdf2bSBram Moolenaar      }
28069becdf2bSBram Moolenaar      assert_false(exists('one'))
28079becdf2bSBram Moolenaar      assert_false(exists('s:one'))
28089becdf2bSBram Moolenaar  END
28099becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
28109becdf2bSBram Moolenaar
28119becdf2bSBram Moolenaar  lines =<< trim END
28129becdf2bSBram Moolenaar      vim9script
28139becdf2bSBram Moolenaar      {
28149becdf2bSBram Moolenaar        var one = 'one'
28159becdf2bSBram Moolenaar        echo one
28169becdf2bSBram Moolenaar      }
28179becdf2bSBram Moolenaar      echo one
28189becdf2bSBram Moolenaar  END
28199becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
2820fcdc5d83SBram Moolenaarenddef
2821fcdc5d83SBram Moolenaar
2822*352134bbSBram Moolenaardef Test_catch_exception_in_callback()
2823*352134bbSBram Moolenaar  var lines =<< trim END
2824*352134bbSBram Moolenaar    vim9script
2825*352134bbSBram Moolenaar    def Callback(...l: any)
2826*352134bbSBram Moolenaar      try
2827*352134bbSBram Moolenaar        var x: string
2828*352134bbSBram Moolenaar        var y: string
2829*352134bbSBram Moolenaar        # this error should be caught with CHECKLEN
2830*352134bbSBram Moolenaar        [x, y] = ['']
2831*352134bbSBram Moolenaar      catch
2832*352134bbSBram Moolenaar        g:caught = 'yes'
2833*352134bbSBram Moolenaar      endtry
2834*352134bbSBram Moolenaar    enddef
2835*352134bbSBram Moolenaar    popup_menu('popup', #{callback: Callback})
2836*352134bbSBram Moolenaar    feedkeys("\r", 'xt')
2837*352134bbSBram Moolenaar  END
2838*352134bbSBram Moolenaar  CheckScriptSuccess(lines)
2839*352134bbSBram Moolenaar
2840*352134bbSBram Moolenaar  unlet g:caught
2841*352134bbSBram Moolenaarenddef
2842*352134bbSBram Moolenaar
2843585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2844585fea7bSBram Moolenaardef Test_substitute_cmd()
2845585fea7bSBram Moolenaar  new
2846585fea7bSBram Moolenaar  setline(1, 'something')
2847585fea7bSBram Moolenaar  :substitute(some(other(
2848585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2849585fea7bSBram Moolenaar  bwipe!
2850585fea7bSBram Moolenaar
2851f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2852cfcd011fSBram Moolenaar  var lines =<< trim END
2853585fea7bSBram Moolenaar    vim9script
2854585fea7bSBram Moolenaar    new
2855585fea7bSBram Moolenaar    setline(1, 'something')
2856585fea7bSBram Moolenaar    :substitute(some(other(
2857585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2858585fea7bSBram Moolenaar    bwipe!
2859585fea7bSBram Moolenaar  END
2860585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2861585fea7bSBram Moolenaar  source Xvim9lines
2862585fea7bSBram Moolenaar
2863585fea7bSBram Moolenaar  delete('Xvim9lines')
2864585fea7bSBram Moolenaarenddef
2865585fea7bSBram Moolenaar
28668a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2867