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
253d032f34aSBram Moolenaarfunc g:NoSuchFunc()
254d032f34aSBram Moolenaar  echo 'none'
255d032f34aSBram Moolenaarendfunc
256d032f34aSBram Moolenaar
2578a7d6542SBram Moolenaardef Test_try_catch()
258cfcd011fSBram Moolenaar  var l = []
2597a092245SBram Moolenaar  try # comment
2608a7d6542SBram Moolenaar    add(l, '1')
2618a7d6542SBram Moolenaar    throw 'wrong'
2628a7d6542SBram Moolenaar    add(l, '2')
2637a092245SBram Moolenaar  catch # comment
2648a7d6542SBram Moolenaar    add(l, v:exception)
2657a092245SBram Moolenaar  finally # comment
2668a7d6542SBram Moolenaar    add(l, '3')
2677a092245SBram Moolenaar  endtry # comment
2688a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
26968d130c6SBram Moolenaar
270e859312eSBram Moolenaar  l = []
271e859312eSBram Moolenaar  try
272e859312eSBram Moolenaar    try
273e859312eSBram Moolenaar      add(l, '1')
274e859312eSBram Moolenaar      throw 'wrong'
275e859312eSBram Moolenaar      add(l, '2')
276e859312eSBram Moolenaar    catch /right/
277e859312eSBram Moolenaar      add(l, v:exception)
278e859312eSBram Moolenaar    endtry
279e859312eSBram Moolenaar  catch /wrong/
280e859312eSBram Moolenaar    add(l, 'caught')
281373863edSBram Moolenaar  fina
282e859312eSBram Moolenaar    add(l, 'finally')
283e859312eSBram Moolenaar  endtry
284e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
285e859312eSBram Moolenaar
286cfcd011fSBram Moolenaar  var n: number
28768d130c6SBram Moolenaar  try
28868d130c6SBram Moolenaar    n = l[3]
28968d130c6SBram Moolenaar  catch /E684:/
29068d130c6SBram Moolenaar    n = 99
29168d130c6SBram Moolenaar  endtry
29268d130c6SBram Moolenaar  assert_equal(99, n)
29368d130c6SBram Moolenaar
29468d130c6SBram Moolenaar  try
295cc673e74SBram Moolenaar    # string slice returns a string, not a number
29668d130c6SBram Moolenaar    n = g:astring[3]
2975e654230SBram Moolenaar  catch /E1012:/
29868d130c6SBram Moolenaar    n = 77
29968d130c6SBram Moolenaar  endtry
30068d130c6SBram Moolenaar  assert_equal(77, n)
30168d130c6SBram Moolenaar
30268d130c6SBram Moolenaar  try
30368d130c6SBram Moolenaar    n = l[g:astring]
3045e654230SBram Moolenaar  catch /E1012:/
30556acb094SBram Moolenaar    n = 88
30668d130c6SBram Moolenaar  endtry
30756acb094SBram Moolenaar  assert_equal(88, n)
30868d130c6SBram Moolenaar
30968d130c6SBram Moolenaar  try
31068d130c6SBram Moolenaar    n = s:does_not_exist
31168d130c6SBram Moolenaar  catch /E121:/
312f0b9f43cSBram Moolenaar    n = 111
313f0b9f43cSBram Moolenaar  endtry
314f0b9f43cSBram Moolenaar  assert_equal(111, n)
315f0b9f43cSBram Moolenaar
316f0b9f43cSBram Moolenaar  try
317f0b9f43cSBram Moolenaar    n = g:does_not_exist
318f0b9f43cSBram Moolenaar  catch /E121:/
31968d130c6SBram Moolenaar    n = 121
32068d130c6SBram Moolenaar  endtry
32168d130c6SBram Moolenaar  assert_equal(121, n)
32268d130c6SBram Moolenaar
323cfcd011fSBram Moolenaar  var d = #{one: 1}
32468d130c6SBram Moolenaar  try
32568d130c6SBram Moolenaar    n = d[g:astring]
32668d130c6SBram Moolenaar  catch /E716:/
32768d130c6SBram Moolenaar    n = 222
32868d130c6SBram Moolenaar  endtry
32968d130c6SBram Moolenaar  assert_equal(222, n)
330f0b9f43cSBram Moolenaar
331f0b9f43cSBram Moolenaar  try
332f0b9f43cSBram Moolenaar    n = -g:astring
333f0b9f43cSBram Moolenaar  catch /E39:/
334f0b9f43cSBram Moolenaar    n = 233
335f0b9f43cSBram Moolenaar  endtry
336f0b9f43cSBram Moolenaar  assert_equal(233, n)
337f0b9f43cSBram Moolenaar
338f0b9f43cSBram Moolenaar  try
339f0b9f43cSBram Moolenaar    n = +g:astring
340f0b9f43cSBram Moolenaar  catch /E1030:/
341f0b9f43cSBram Moolenaar    n = 244
342f0b9f43cSBram Moolenaar  endtry
343f0b9f43cSBram Moolenaar  assert_equal(244, n)
344f0b9f43cSBram Moolenaar
345f0b9f43cSBram Moolenaar  try
346f0b9f43cSBram Moolenaar    n = +g:alist
347f0b9f43cSBram Moolenaar  catch /E745:/
348f0b9f43cSBram Moolenaar    n = 255
349f0b9f43cSBram Moolenaar  endtry
350f0b9f43cSBram Moolenaar  assert_equal(255, n)
351f0b9f43cSBram Moolenaar
352cfcd011fSBram Moolenaar  var nd: dict<any>
353f0b9f43cSBram Moolenaar  try
354f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
3555e654230SBram Moolenaar  catch /E1012:/
356f0b9f43cSBram Moolenaar    n = 266
357f0b9f43cSBram Moolenaar  endtry
358f0b9f43cSBram Moolenaar  assert_equal(266, n)
359f0b9f43cSBram Moolenaar
360f0b9f43cSBram Moolenaar  try
361f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
362f0b9f43cSBram Moolenaar  catch /E1093:/
363f0b9f43cSBram Moolenaar    n = 277
364f0b9f43cSBram Moolenaar  endtry
365f0b9f43cSBram Moolenaar  assert_equal(277, n)
366f0b9f43cSBram Moolenaar
367e859312eSBram Moolenaar  try
368e859312eSBram Moolenaar    &ts = g:astring
3695e654230SBram Moolenaar  catch /E1012:/
370e859312eSBram Moolenaar    n = 288
371e859312eSBram Moolenaar  endtry
372e859312eSBram Moolenaar  assert_equal(288, n)
373e859312eSBram Moolenaar
374e859312eSBram Moolenaar  try
375e859312eSBram Moolenaar    &backspace = 'asdf'
376e859312eSBram Moolenaar  catch /E474:/
377e859312eSBram Moolenaar    n = 299
378e859312eSBram Moolenaar  endtry
379e859312eSBram Moolenaar  assert_equal(299, n)
380e859312eSBram Moolenaar
381e859312eSBram Moolenaar  l = [1]
382e859312eSBram Moolenaar  try
383e859312eSBram Moolenaar    l[3] = 3
384e859312eSBram Moolenaar  catch /E684:/
385e859312eSBram Moolenaar    n = 300
386e859312eSBram Moolenaar  endtry
387e859312eSBram Moolenaar  assert_equal(300, n)
388e859312eSBram Moolenaar
389e859312eSBram Moolenaar  try
390e859312eSBram Moolenaar    unlet g:does_not_exist
391e859312eSBram Moolenaar  catch /E108:/
392e859312eSBram Moolenaar    n = 322
393e859312eSBram Moolenaar  endtry
394e859312eSBram Moolenaar  assert_equal(322, n)
395e859312eSBram Moolenaar
396e859312eSBram Moolenaar  try
397e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
398e859312eSBram Moolenaar  catch /E721:/
399e859312eSBram Moolenaar    n = 333
400e859312eSBram Moolenaar  endtry
401e859312eSBram Moolenaar  assert_equal(333, n)
402e859312eSBram Moolenaar
403e859312eSBram Moolenaar  try
404e859312eSBram Moolenaar    l = DeletedFunc()
405e859312eSBram Moolenaar  catch /E933:/
406e859312eSBram Moolenaar    n = 344
407e859312eSBram Moolenaar  endtry
408e859312eSBram Moolenaar  assert_equal(344, n)
409d032f34aSBram Moolenaar
410d032f34aSBram Moolenaar  try
411d032f34aSBram Moolenaar    echo len(v:true)
412d032f34aSBram Moolenaar  catch /E701:/
413d032f34aSBram Moolenaar    n = 355
414d032f34aSBram Moolenaar  endtry
415d032f34aSBram Moolenaar  assert_equal(355, n)
416d032f34aSBram Moolenaar
417cfcd011fSBram Moolenaar  var P = function('g:NoSuchFunc')
418d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
419d032f34aSBram Moolenaar  try
420d032f34aSBram Moolenaar    echo P()
421d032f34aSBram Moolenaar  catch /E117:/
422d032f34aSBram Moolenaar    n = 366
423d032f34aSBram Moolenaar  endtry
424d032f34aSBram Moolenaar  assert_equal(366, n)
425d032f34aSBram Moolenaar
426d032f34aSBram Moolenaar  try
427d032f34aSBram Moolenaar    echo g:NoSuchFunc()
428d032f34aSBram Moolenaar  catch /E117:/
429d032f34aSBram Moolenaar    n = 377
430d032f34aSBram Moolenaar  endtry
431d032f34aSBram Moolenaar  assert_equal(377, n)
432d032f34aSBram Moolenaar
433d032f34aSBram Moolenaar  try
434d032f34aSBram Moolenaar    echo g:alist + 4
435d032f34aSBram Moolenaar  catch /E745:/
436d032f34aSBram Moolenaar    n = 388
437d032f34aSBram Moolenaar  endtry
438d032f34aSBram Moolenaar  assert_equal(388, n)
439d032f34aSBram Moolenaar
440d032f34aSBram Moolenaar  try
441d032f34aSBram Moolenaar    echo 4 + g:alist
442d032f34aSBram Moolenaar  catch /E745:/
443d032f34aSBram Moolenaar    n = 399
444d032f34aSBram Moolenaar  endtry
445d032f34aSBram Moolenaar  assert_equal(399, n)
446d032f34aSBram Moolenaar
447d032f34aSBram Moolenaar  try
448d032f34aSBram Moolenaar    echo g:alist.member
449d032f34aSBram Moolenaar  catch /E715:/
450d032f34aSBram Moolenaar    n = 400
451d032f34aSBram Moolenaar  endtry
452d032f34aSBram Moolenaar  assert_equal(400, n)
453d032f34aSBram Moolenaar
454d032f34aSBram Moolenaar  try
455d032f34aSBram Moolenaar    echo d.member
456d032f34aSBram Moolenaar  catch /E716:/
457d032f34aSBram Moolenaar    n = 411
458d032f34aSBram Moolenaar  endtry
459d032f34aSBram Moolenaar  assert_equal(411, n)
4608a7d6542SBram Moolenaarenddef
4618a7d6542SBram Moolenaar
462e859312eSBram Moolenaardef DeletedFunc(): list<any>
463e859312eSBram Moolenaar  return ['delete me']
464e859312eSBram Moolenaarenddef
465e859312eSBram Moolenaardefcompile
466e859312eSBram Moolenaardelfunc DeletedFunc
467e859312eSBram Moolenaar
468257cc5eeSBram Moolenaardef ThrowFromDef()
469a72cfb80SBram Moolenaar  throw "getout" # comment
470257cc5eeSBram Moolenaarenddef
471257cc5eeSBram Moolenaar
472257cc5eeSBram Moolenaarfunc CatchInFunc()
473257cc5eeSBram Moolenaar  try
474257cc5eeSBram Moolenaar    call ThrowFromDef()
475257cc5eeSBram Moolenaar  catch
476257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
477257cc5eeSBram Moolenaar  endtry
478257cc5eeSBram Moolenaarendfunc
479257cc5eeSBram Moolenaar
480257cc5eeSBram Moolenaardef CatchInDef()
481257cc5eeSBram Moolenaar  try
482257cc5eeSBram Moolenaar    ThrowFromDef()
483257cc5eeSBram Moolenaar  catch
484257cc5eeSBram Moolenaar    g:thrown_def = v:exception
485257cc5eeSBram Moolenaar  endtry
486257cc5eeSBram Moolenaarenddef
487257cc5eeSBram Moolenaar
488f575adffSBram Moolenaardef ReturnFinally(): string
489f575adffSBram Moolenaar  try
490f575adffSBram Moolenaar    return 'intry'
491373863edSBram Moolenaar  finall
492f575adffSBram Moolenaar    g:in_finally = 'finally'
493f575adffSBram Moolenaar  endtry
494f575adffSBram Moolenaar  return 'end'
495f575adffSBram Moolenaarenddef
496f575adffSBram Moolenaar
497257cc5eeSBram Moolenaardef Test_try_catch_nested()
498257cc5eeSBram Moolenaar  CatchInFunc()
499257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
500257cc5eeSBram Moolenaar
501257cc5eeSBram Moolenaar  CatchInDef()
502257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
503f575adffSBram Moolenaar
504f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
505f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
506f575adffSBram Moolenaarenddef
507f575adffSBram Moolenaar
5089939f57bSBram Moolenaardef TryOne(): number
5099939f57bSBram Moolenaar  try
5109939f57bSBram Moolenaar    return 0
5119939f57bSBram Moolenaar  catch
5129939f57bSBram Moolenaar  endtry
5139939f57bSBram Moolenaar  return 0
5149939f57bSBram Moolenaarenddef
5159939f57bSBram Moolenaar
5169939f57bSBram Moolenaardef TryTwo(n: number): string
5179939f57bSBram Moolenaar  try
518cfcd011fSBram Moolenaar    var x = {}
5199939f57bSBram Moolenaar  catch
5209939f57bSBram Moolenaar  endtry
5219939f57bSBram Moolenaar  return 'text'
5229939f57bSBram Moolenaarenddef
5239939f57bSBram Moolenaar
5249939f57bSBram Moolenaardef Test_try_catch_twice()
5259939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
5269939f57bSBram Moolenaarenddef
5279939f57bSBram Moolenaar
528f575adffSBram Moolenaardef Test_try_catch_match()
529cfcd011fSBram Moolenaar  var seq = 'a'
530f575adffSBram Moolenaar  try
531f575adffSBram Moolenaar    throw 'something'
532f575adffSBram Moolenaar  catch /nothing/
533f575adffSBram Moolenaar    seq ..= 'x'
534f575adffSBram Moolenaar  catch /some/
535f575adffSBram Moolenaar    seq ..= 'b'
536f575adffSBram Moolenaar  catch /asdf/
537f575adffSBram Moolenaar    seq ..= 'x'
538e8c4abbbSBram Moolenaar  catch ?a\?sdf?
539e8c4abbbSBram Moolenaar    seq ..= 'y'
540f575adffSBram Moolenaar  finally
541f575adffSBram Moolenaar    seq ..= 'c'
542f575adffSBram Moolenaar  endtry
543f575adffSBram Moolenaar  assert_equal('abc', seq)
544257cc5eeSBram Moolenaarenddef
545257cc5eeSBram Moolenaar
546e8c4abbbSBram Moolenaardef Test_try_catch_fails()
547d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
548d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
549d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
550d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
551d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
552d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
553d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
554d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
55513106605SBram Moolenaar  CheckDefFailure(['if 1', 'endtry'], 'E171:')
556d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
557585fea7bSBram Moolenaar
558d2c61705SBram Moolenaar  CheckDefFailure(['throw'], 'E1015:')
559d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
560e8c4abbbSBram Moolenaarenddef
561e8c4abbbSBram Moolenaar
562006ad48bSBram Moolenaardef Test_throw_vimscript()
563f5be8cdbSBram Moolenaar  # only checks line continuation
564cfcd011fSBram Moolenaar  var lines =<< trim END
565006ad48bSBram Moolenaar      vim9script
566006ad48bSBram Moolenaar      try
567006ad48bSBram Moolenaar        throw 'one'
568006ad48bSBram Moolenaar              .. 'two'
569006ad48bSBram Moolenaar      catch
570006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
571006ad48bSBram Moolenaar      endtry
572006ad48bSBram Moolenaar  END
573006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
574006ad48bSBram Moolenaarenddef
575006ad48bSBram Moolenaar
576ed677f55SBram Moolenaardef Test_error_in_nested_function()
577ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
578cfcd011fSBram Moolenaar  var lines =<< trim END
579ed677f55SBram Moolenaar      vim9script
580ed677f55SBram Moolenaar      def Func()
581ed677f55SBram Moolenaar        Error()
582ed677f55SBram Moolenaar        g:test_var = 1
583ed677f55SBram Moolenaar      enddef
584ed677f55SBram Moolenaar      func Error() abort
585ed677f55SBram Moolenaar        eval [][0]
586ed677f55SBram Moolenaar      endfunc
587ed677f55SBram Moolenaar      Func()
588ed677f55SBram Moolenaar  END
589ed677f55SBram Moolenaar  g:test_var = 0
590ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
591ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
592ed677f55SBram Moolenaarenddef
593ed677f55SBram Moolenaar
59437c83711SBram Moolenaardef Test_cexpr_vimscript()
595f5be8cdbSBram Moolenaar  # only checks line continuation
59637c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
597cfcd011fSBram Moolenaar  var lines =<< trim END
59837c83711SBram Moolenaar      vim9script
59937c83711SBram Moolenaar      cexpr 'File'
60037c83711SBram Moolenaar                .. ' someFile' ..
60137c83711SBram Moolenaar                   ' line 19'
60237c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
60337c83711SBram Moolenaar  END
60437c83711SBram Moolenaar  CheckScriptSuccess(lines)
60537c83711SBram Moolenaar  set errorformat&
60637c83711SBram Moolenaarenddef
60737c83711SBram Moolenaar
608c9edd6b5SBram Moolenaardef Test_statusline_syntax()
609c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
610cfcd011fSBram Moolenaar  var lines =<< trim END
611c9edd6b5SBram Moolenaar      vim9script
612c9edd6b5SBram Moolenaar      func g:Status()
613c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
614c9edd6b5SBram Moolenaar      endfunc
615c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
616c9edd6b5SBram Moolenaar      redrawstatus
617c9edd6b5SBram Moolenaar      set laststatus statusline=
618c9edd6b5SBram Moolenaar  END
619c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
620c9edd6b5SBram Moolenaarenddef
621c9edd6b5SBram Moolenaar
622b209750bSBram Moolenaardef Test_list_vimscript()
623b209750bSBram Moolenaar  # checks line continuation and comments
624cfcd011fSBram Moolenaar  var lines =<< trim END
625b209750bSBram Moolenaar      vim9script
626cfcd011fSBram Moolenaar      var mylist = [
627b209750bSBram Moolenaar            'one',
628b209750bSBram Moolenaar            # comment
629b209750bSBram Moolenaar            'two', # empty line follows
630b209750bSBram Moolenaar
631b209750bSBram Moolenaar            'three',
632b209750bSBram Moolenaar            ]
633b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
634b209750bSBram Moolenaar  END
635b209750bSBram Moolenaar  CheckScriptSuccess(lines)
63666250c93SBram Moolenaar
63766250c93SBram Moolenaar  # check all lines from heredoc are kept
63866250c93SBram Moolenaar  lines =<< trim END
63966250c93SBram Moolenaar      # comment 1
64066250c93SBram Moolenaar      two
64166250c93SBram Moolenaar      # comment 3
64266250c93SBram Moolenaar
64366250c93SBram Moolenaar      five
64466250c93SBram Moolenaar      # comment 6
64566250c93SBram Moolenaar  END
64666250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
647b209750bSBram Moolenaarenddef
648b209750bSBram Moolenaar
6492a1381c3SBram Moolenaarif has('channel')
65040ee466cSBram Moolenaar  let someJob = test_null_job()
65140ee466cSBram Moolenaar
65240ee466cSBram Moolenaar  def FuncWithError()
65340ee466cSBram Moolenaar    echomsg g:someJob
65440ee466cSBram Moolenaar  enddef
65540ee466cSBram Moolenaar
65640ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
65740ee466cSBram Moolenaar    try
65840ee466cSBram Moolenaar      call FuncWithError()
65940ee466cSBram Moolenaar    catch
66040ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
66140ee466cSBram Moolenaar    endtry
66240ee466cSBram Moolenaar  endfunc
6632a1381c3SBram Moolenaarendif
66440ee466cSBram Moolenaar
6658a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
6668a7d6542SBram Moolenaar  vim9script
667cfcd011fSBram Moolenaar  var name: string = 'bob'
6688a7d6542SBram Moolenaar  def Concat(arg: string): string
6698a7d6542SBram Moolenaar    return name .. arg
6708a7d6542SBram Moolenaar  enddef
671227a69deSBram Moolenaar  g:result = Concat('bie')
672227a69deSBram Moolenaar  g:localname = name
6738a7d6542SBram Moolenaar
6748a7d6542SBram Moolenaar  export const CONST = 1234
675cfcd011fSBram Moolenaar  export var exported = 9876
676cfcd011fSBram Moolenaar  export var exp_name = 'John'
6778a7d6542SBram Moolenaar  export def Exported(): string
6788a7d6542SBram Moolenaar    return 'Exported'
6798a7d6542SBram Moolenaar  enddef
6808a7d6542SBram MoolenaarEND
6818a7d6542SBram Moolenaar
682b3ca9824SBram Moolenaardef Undo_export_script_lines()
683b3ca9824SBram Moolenaar  unlet g:result
684b3ca9824SBram Moolenaar  unlet g:localname
685b3ca9824SBram Moolenaarenddef
686b3ca9824SBram Moolenaar
6875269bd2aSBram Moolenaardef Test_vim9_import_export()
688cfcd011fSBram Moolenaar  var import_script_lines =<< trim END
6898a7d6542SBram Moolenaar    vim9script
6908a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
6918a7d6542SBram Moolenaar    g:imported = exported
6926e587dcbSBram Moolenaar    exported += 3
6936e587dcbSBram Moolenaar    g:imported_added = exported
6948a7d6542SBram Moolenaar    g:imported_func = Exported()
6956e587dcbSBram Moolenaar
69640f4f7a4SBram Moolenaar    def GetExported(): string
697cfcd011fSBram Moolenaar      var local_dict = #{ref: Exported}
69840f4f7a4SBram Moolenaar      return local_dict.ref()
69940f4f7a4SBram Moolenaar    enddef
70040f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
70140f4f7a4SBram Moolenaar
7026e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
7036e587dcbSBram Moolenaar    g:imported_name = exp_name
7046e587dcbSBram Moolenaar    exp_name ..= ' Doe'
7056e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
7065381c7a1SBram Moolenaar    g:imported_later = exported
7078a7d6542SBram Moolenaar  END
7088a7d6542SBram Moolenaar
7098a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
7108a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
7118a7d6542SBram Moolenaar
7128a7d6542SBram Moolenaar  source Ximport.vim
7138a7d6542SBram Moolenaar
7148a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
7158a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
7168a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
7176e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
7185381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
7198a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
72040f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
7216e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
7226e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
7238a7d6542SBram Moolenaar  assert_false(exists('g:name'))
7248a7d6542SBram Moolenaar
725b3ca9824SBram Moolenaar  Undo_export_script_lines()
7268a7d6542SBram Moolenaar  unlet g:imported
7276e587dcbSBram Moolenaar  unlet g:imported_added
7285381c7a1SBram Moolenaar  unlet g:imported_later
7298a7d6542SBram Moolenaar  unlet g:imported_func
7306e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
7318a7d6542SBram Moolenaar  delete('Ximport.vim')
732f2d5c240SBram Moolenaar
7331c991144SBram Moolenaar  # similar, with line breaks
734cfcd011fSBram Moolenaar  var import_line_break_script_lines =<< trim END
7351c991144SBram Moolenaar    vim9script
7361c991144SBram Moolenaar    import {
7371c991144SBram Moolenaar        exported,
7381c991144SBram Moolenaar        Exported,
7391c991144SBram Moolenaar        }
7401c991144SBram Moolenaar        from
7411c991144SBram Moolenaar        './Xexport.vim'
7421c991144SBram Moolenaar    g:imported = exported
7431c991144SBram Moolenaar    exported += 5
7441c991144SBram Moolenaar    g:imported_added = exported
7451c991144SBram Moolenaar    g:imported_func = Exported()
7461c991144SBram Moolenaar  END
7471c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
7481c991144SBram Moolenaar  source Ximport_lbr.vim
7491c991144SBram Moolenaar
7501c991144SBram Moolenaar  assert_equal(9876, g:imported)
7511c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
7521c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
7531c991144SBram Moolenaar
7541c991144SBram Moolenaar  # exported script not sourced again
7551c991144SBram Moolenaar  assert_false(exists('g:result'))
7561c991144SBram Moolenaar  unlet g:imported
7571c991144SBram Moolenaar  unlet g:imported_added
7581c991144SBram Moolenaar  unlet g:imported_func
7591c991144SBram Moolenaar  delete('Ximport_lbr.vim')
7601c991144SBram Moolenaar
7611c991144SBram Moolenaar  # import inside :def function
762cfcd011fSBram Moolenaar  var import_in_def_lines =<< trim END
7635381c7a1SBram Moolenaar    vim9script
7645381c7a1SBram Moolenaar    def ImportInDef()
7655381c7a1SBram Moolenaar      import exported from './Xexport.vim'
7665381c7a1SBram Moolenaar      g:imported = exported
7675381c7a1SBram Moolenaar      exported += 7
7685381c7a1SBram Moolenaar      g:imported_added = exported
7695381c7a1SBram Moolenaar    enddef
7705381c7a1SBram Moolenaar    ImportInDef()
7715381c7a1SBram Moolenaar  END
7725381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
7735381c7a1SBram Moolenaar  source Ximport2.vim
774f5be8cdbSBram Moolenaar  # TODO: this should be 9879
7755381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
7765381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
7775381c7a1SBram Moolenaar  unlet g:imported
7785381c7a1SBram Moolenaar  unlet g:imported_added
7795381c7a1SBram Moolenaar  delete('Ximport2.vim')
7805381c7a1SBram Moolenaar
781cfcd011fSBram Moolenaar  var import_star_as_lines =<< trim END
782f2d5c240SBram Moolenaar    vim9script
783f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
784f2d5c240SBram Moolenaar    def UseExport()
785f2d5c240SBram Moolenaar      g:imported = Export.exported
786f2d5c240SBram Moolenaar    enddef
787f2d5c240SBram Moolenaar    UseExport()
788f2d5c240SBram Moolenaar  END
789f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
790f2d5c240SBram Moolenaar  source Ximport.vim
7915381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
792f2d5c240SBram Moolenaar
793cfcd011fSBram Moolenaar  var import_star_as_lines_no_dot =<< trim END
794599c89c8SBram Moolenaar    vim9script
795599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
796599c89c8SBram Moolenaar    def Func()
797cfcd011fSBram Moolenaar      var dummy = 1
798cfcd011fSBram Moolenaar      var imported = Export + dummy
799599c89c8SBram Moolenaar    enddef
800822ba247SBram Moolenaar    defcompile
801599c89c8SBram Moolenaar  END
802599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
80344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
804599c89c8SBram Moolenaar
805cfcd011fSBram Moolenaar  var import_star_as_lines_dot_space =<< trim END
806599c89c8SBram Moolenaar    vim9script
807599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
808599c89c8SBram Moolenaar    def Func()
809cfcd011fSBram Moolenaar      var imported = Export . exported
810599c89c8SBram Moolenaar    enddef
811822ba247SBram Moolenaar    defcompile
812599c89c8SBram Moolenaar  END
813599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
81444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
815599c89c8SBram Moolenaar
816cfcd011fSBram Moolenaar  var import_star_as_lines_missing_name =<< trim END
817599c89c8SBram Moolenaar    vim9script
818599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
819599c89c8SBram Moolenaar    def Func()
820cfcd011fSBram Moolenaar      var imported = Export.
821599c89c8SBram Moolenaar    enddef
822822ba247SBram Moolenaar    defcompile
823599c89c8SBram Moolenaar  END
824599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
82544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
826599c89c8SBram Moolenaar
827cfcd011fSBram Moolenaar  var import_star_as_lbr_lines =<< trim END
8281c991144SBram Moolenaar    vim9script
8291c991144SBram Moolenaar    import *
8301c991144SBram Moolenaar        as Export
8311c991144SBram Moolenaar        from
8321c991144SBram Moolenaar        './Xexport.vim'
8331c991144SBram Moolenaar    def UseExport()
8341c991144SBram Moolenaar      g:imported = Export.exported
8351c991144SBram Moolenaar    enddef
8361c991144SBram Moolenaar    UseExport()
8371c991144SBram Moolenaar  END
8381c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
8391c991144SBram Moolenaar  source Ximport.vim
8401c991144SBram Moolenaar  assert_equal(9883, g:imported)
8411c991144SBram Moolenaar
842cfcd011fSBram Moolenaar  var import_star_lines =<< trim END
843f2d5c240SBram Moolenaar    vim9script
844f2d5c240SBram Moolenaar    import * from './Xexport.vim'
845f2d5c240SBram Moolenaar  END
846f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
84744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
848f2d5c240SBram Moolenaar
849f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
850cfcd011fSBram Moolenaar  var import_not_exported_lines =<< trim END
851fa29c8abSBram Moolenaar    vim9script
852fa29c8abSBram Moolenaar    import name from './Xexport.vim'
853fa29c8abSBram Moolenaar  END
854fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
85544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
856fa29c8abSBram Moolenaar
857f5be8cdbSBram Moolenaar  # try to import something that is already defined
858cfcd011fSBram Moolenaar  var import_already_defined =<< trim END
8595269bd2aSBram Moolenaar    vim9script
860cfcd011fSBram Moolenaar    var exported = 'something'
8615269bd2aSBram Moolenaar    import exported from './Xexport.vim'
8625269bd2aSBram Moolenaar  END
8635269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
86444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
8655269bd2aSBram Moolenaar
866f5be8cdbSBram Moolenaar  # try to import something that is already defined
8675269bd2aSBram Moolenaar  import_already_defined =<< trim END
8685269bd2aSBram Moolenaar    vim9script
869cfcd011fSBram Moolenaar    var exported = 'something'
8705269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
8715269bd2aSBram Moolenaar  END
8725269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
87344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
8745269bd2aSBram Moolenaar
875f5be8cdbSBram Moolenaar  # try to import something that is already defined
8765269bd2aSBram Moolenaar  import_already_defined =<< trim END
8775269bd2aSBram Moolenaar    vim9script
878cfcd011fSBram Moolenaar    var exported = 'something'
8795269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
8805269bd2aSBram Moolenaar  END
8815269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
88244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
8835269bd2aSBram Moolenaar
884f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
885cfcd011fSBram Moolenaar  var import_long_name_lines =<< trim END
886fa29c8abSBram Moolenaar    vim9script
887fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
888fa29c8abSBram Moolenaar  END
889fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
89044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
891fa29c8abSBram Moolenaar
892cfcd011fSBram Moolenaar  var import_no_from_lines =<< trim END
893fa29c8abSBram Moolenaar    vim9script
894fa29c8abSBram Moolenaar    import name './Xexport.vim'
895fa29c8abSBram Moolenaar  END
896fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
89744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
898fa29c8abSBram Moolenaar
899cfcd011fSBram Moolenaar  var import_invalid_string_lines =<< trim END
900fa29c8abSBram Moolenaar    vim9script
901fa29c8abSBram Moolenaar    import name from Xexport.vim
902fa29c8abSBram Moolenaar  END
903fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
90444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
905fa29c8abSBram Moolenaar
906cfcd011fSBram Moolenaar  var import_wrong_name_lines =<< trim END
907fa29c8abSBram Moolenaar    vim9script
908fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
909fa29c8abSBram Moolenaar  END
910fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
91144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
912fa29c8abSBram Moolenaar
913cfcd011fSBram Moolenaar  var import_missing_comma_lines =<< trim END
914fa29c8abSBram Moolenaar    vim9script
915fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
916fa29c8abSBram Moolenaar  END
9175269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
91844d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
919fa29c8abSBram Moolenaar
920f2d5c240SBram Moolenaar  delete('Ximport.vim')
9215269bd2aSBram Moolenaar  delete('Ximport3.vim')
9228a7d6542SBram Moolenaar  delete('Xexport.vim')
9238a7d6542SBram Moolenaar
924f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
925750802b5SBram Moolenaar  set cpo&vi
926cfcd011fSBram Moolenaar  var cpo_before = &cpo
927cfcd011fSBram Moolenaar  var lines =<< trim END
928750802b5SBram Moolenaar    vim9script
929750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
930750802b5SBram Moolenaar  END
931750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
932750802b5SBram Moolenaar  source Xvim9_script
933750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
934750802b5SBram Moolenaar  set cpo&vim
935750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
936750802b5SBram Moolenaar  delete('Xvim9_script')
937750802b5SBram Moolenaarenddef
938750802b5SBram Moolenaar
939803af686SBram Moolenaarfunc g:Trigger()
940803af686SBram Moolenaar  source Ximport.vim
941803af686SBram Moolenaar  return "echo 'yes'\<CR>"
942803af686SBram Moolenaarendfunc
943803af686SBram Moolenaar
944803af686SBram Moolenaardef Test_import_export_expr_map()
945803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
946cfcd011fSBram Moolenaar  var export_lines =<< trim END
947803af686SBram Moolenaar    vim9script
948803af686SBram Moolenaar    export def That(): string
949803af686SBram Moolenaar      return 'yes'
950803af686SBram Moolenaar    enddef
951803af686SBram Moolenaar  END
952803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
953803af686SBram Moolenaar
954cfcd011fSBram Moolenaar  var import_lines =<< trim END
955803af686SBram Moolenaar    vim9script
956803af686SBram Moolenaar    import That from './Xexport_that.vim'
957803af686SBram Moolenaar    assert_equal('yes', That())
958803af686SBram Moolenaar  END
959803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
960803af686SBram Moolenaar
961803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
962803af686SBram Moolenaar  feedkeys('trigger', "xt")
963803af686SBram Moolenaar
964730b2483SBram Moolenaar  delete('Xexport_that.vim')
965803af686SBram Moolenaar  delete('Ximport.vim')
966803af686SBram Moolenaar  nunmap trigger
967803af686SBram Moolenaarenddef
968803af686SBram Moolenaar
9698e1986e3SBram Moolenaardef Test_import_in_filetype()
9708e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
9718e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
972cfcd011fSBram Moolenaar  var export_lines =<< trim END
9738e1986e3SBram Moolenaar    vim9script
974cfcd011fSBram Moolenaar    export var That = 'yes'
9758e1986e3SBram Moolenaar  END
976730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
9778e1986e3SBram Moolenaar
978cfcd011fSBram Moolenaar  var import_lines =<< trim END
9798e1986e3SBram Moolenaar    vim9script
980730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
9818e1986e3SBram Moolenaar    assert_equal('yes', That)
9828e1986e3SBram Moolenaar    g:did_load_mytpe = 1
9838e1986e3SBram Moolenaar  END
9848e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
9858e1986e3SBram Moolenaar
986cfcd011fSBram Moolenaar  var save_rtp = &rtp
9878e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
9888e1986e3SBram Moolenaar
9898e1986e3SBram Moolenaar  filetype plugin on
9908e1986e3SBram Moolenaar  copen
9918e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
9928e1986e3SBram Moolenaar
9938e1986e3SBram Moolenaar  quit!
994730b2483SBram Moolenaar  delete('Xexport_ft.vim')
9958e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
9968e1986e3SBram Moolenaar  &rtp = save_rtp
9978e1986e3SBram Moolenaarenddef
9988e1986e3SBram Moolenaar
999efa94447SBram Moolenaardef Test_use_import_in_mapping()
1000cfcd011fSBram Moolenaar  var lines =<< trim END
1001efa94447SBram Moolenaar      vim9script
1002efa94447SBram Moolenaar      export def Funcx()
1003efa94447SBram Moolenaar        g:result = 42
1004efa94447SBram Moolenaar      enddef
1005efa94447SBram Moolenaar  END
1006efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1007efa94447SBram Moolenaar  lines =<< trim END
1008efa94447SBram Moolenaar      vim9script
1009efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1010b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1011efa94447SBram Moolenaar  END
1012efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1013efa94447SBram Moolenaar
1014efa94447SBram Moolenaar  source Xmapscript.vim
1015b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1016efa94447SBram Moolenaar  assert_equal(42, g:result)
1017efa94447SBram Moolenaar
1018efa94447SBram Moolenaar  unlet g:result
1019efa94447SBram Moolenaar  delete('XsomeExport.vim')
1020efa94447SBram Moolenaar  delete('Xmapscript.vim')
1021b3ca9824SBram Moolenaar  nunmap <F3>
1022efa94447SBram Moolenaarenddef
1023efa94447SBram Moolenaar
1024750802b5SBram Moolenaardef Test_vim9script_fails()
10258a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
10268a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1027cfcd011fSBram Moolenaar  CheckScriptFailure(['export var some = 123'], 'E1042:')
10289721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
1029cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1030750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1031750802b5SBram Moolenaar
1032cfcd011fSBram Moolenaar  CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1033c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1034c785b9a7SBram Moolenaar
1035e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1036e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
10378a7d6542SBram Moolenaarenddef
10388a7d6542SBram Moolenaar
1039f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1040101f4810SBram Moolenaar  CheckRunVimInTerminal
1041101f4810SBram Moolenaar
10429bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1043c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
10449bb3eb3eSBram Moolenaarendfunc
10459bb3eb3eSBram Moolenaar
1046c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1047cfcd011fSBram Moolenaar  var export =<< trim END
1048101f4810SBram Moolenaar    vim9script
1049101f4810SBram Moolenaar    export def Foo(): number
1050101f4810SBram Moolenaar        return 0
1051101f4810SBram Moolenaar    enddef
1052101f4810SBram Moolenaar  END
1053730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1054101f4810SBram Moolenaar
1055cfcd011fSBram Moolenaar  var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
10569bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
10579bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1058101f4810SBram Moolenaar
1059730b2483SBram Moolenaar  delete('XexportCmd.vim')
10609bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
10619bb3eb3eSBram Moolenaarenddef
1062101f4810SBram Moolenaar
10634c17ad94SBram Moolenaardef Test_vim9script_reload_import()
1064cfcd011fSBram Moolenaar  var lines =<< trim END
10658a7d6542SBram Moolenaar    vim9script
10668a7d6542SBram Moolenaar    const var = ''
1067cfcd011fSBram Moolenaar    var valone = 1234
10688a7d6542SBram Moolenaar    def MyFunc(arg: string)
10698a7d6542SBram Moolenaar       valone = 5678
10708a7d6542SBram Moolenaar    enddef
10718a7d6542SBram Moolenaar  END
1072cfcd011fSBram Moolenaar  var morelines =<< trim END
1073cfcd011fSBram Moolenaar    var valtwo = 222
10748a7d6542SBram Moolenaar    export def GetValtwo(): number
10758a7d6542SBram Moolenaar      return valtwo
10768a7d6542SBram Moolenaar    enddef
10778a7d6542SBram Moolenaar  END
107803afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
10798a7d6542SBram Moolenaar  source Xreload.vim
10808a7d6542SBram Moolenaar  source Xreload.vim
10818a7d6542SBram Moolenaar  source Xreload.vim
10828a7d6542SBram Moolenaar
1083cfcd011fSBram Moolenaar  var testlines =<< trim END
10848a7d6542SBram Moolenaar    vim9script
10858a7d6542SBram Moolenaar    def TheFunc()
10868a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
10878a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
10888a7d6542SBram Moolenaar    enddef
10898a7d6542SBram Moolenaar    TheFunc()
10908a7d6542SBram Moolenaar  END
10918a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
10928a7d6542SBram Moolenaar  source Ximport.vim
10938a7d6542SBram Moolenaar
1094f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1095f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
10968a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
10978a7d6542SBram Moolenaar  source Ximport.vim
10988a7d6542SBram Moolenaar
1099f5be8cdbSBram Moolenaar  # cannot declare a var twice
11008a7d6542SBram Moolenaar  lines =<< trim END
11018a7d6542SBram Moolenaar    vim9script
1102cfcd011fSBram Moolenaar    var valone = 1234
1103cfcd011fSBram Moolenaar    var valone = 5678
11048a7d6542SBram Moolenaar  END
11058a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
110644d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
11078a7d6542SBram Moolenaar
11088a7d6542SBram Moolenaar  delete('Xreload.vim')
11098a7d6542SBram Moolenaar  delete('Ximport.vim')
11108a7d6542SBram Moolenaarenddef
11118a7d6542SBram Moolenaar
111295006e3dSBram Moolenaardef s:RetSome(): string
111395006e3dSBram Moolenaar  return 'some'
111495006e3dSBram Moolenaarenddef
111595006e3dSBram Moolenaar
1116fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1117fe465a01SBram Moolenaar" script-local name.
1118fe465a01SBram Moolenaardef Test_vim9script_funcref()
1119cfcd011fSBram Moolenaar  var sortlines =<< trim END
1120fe465a01SBram Moolenaar      vim9script
1121fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1122bed36b93SBram Moolenaar        return i2 - i1
1123fe465a01SBram Moolenaar      enddef
1124fe465a01SBram Moolenaar
1125fe465a01SBram Moolenaar      export def FastSort(): list<number>
1126fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1127fe465a01SBram Moolenaar      enddef
1128fe465a01SBram Moolenaar  END
1129fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1130fe465a01SBram Moolenaar
1131cfcd011fSBram Moolenaar  var lines =<< trim END
1132fe465a01SBram Moolenaar    vim9script
1133fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1134fe465a01SBram Moolenaar    def Test()
1135fe465a01SBram Moolenaar      g:result = FastSort()
1136fe465a01SBram Moolenaar    enddef
1137fe465a01SBram Moolenaar    Test()
1138fe465a01SBram Moolenaar  END
1139fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1140fe465a01SBram Moolenaar
1141fe465a01SBram Moolenaar  source Xscript.vim
1142fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1143fe465a01SBram Moolenaar
1144fe465a01SBram Moolenaar  unlet g:result
1145fe465a01SBram Moolenaar  delete('Xsort.vim')
1146fe465a01SBram Moolenaar  delete('Xscript.vim')
114795006e3dSBram Moolenaar
1148cfcd011fSBram Moolenaar  var Funcref = function('s:RetSome')
114995006e3dSBram Moolenaar  assert_equal('some', Funcref())
1150fe465a01SBram Moolenaarenddef
1151fe465a01SBram Moolenaar
1152601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1153601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1154601e76acSBram Moolenaar" function reference.
1155c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1156cfcd011fSBram Moolenaar  var filterLines =<< trim END
1157c620c055SBram Moolenaar    vim9script
1158c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1159c620c055SBram Moolenaar      return idx % 2 == 1
1160c620c055SBram Moolenaar    enddef
1161c620c055SBram Moolenaar    export def FastFilter(): list<number>
1162c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1163c620c055SBram Moolenaar    enddef
1164601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1165601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1166601e76acSBram Moolenaar    enddef
1167c620c055SBram Moolenaar  END
1168c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1169c620c055SBram Moolenaar
1170cfcd011fSBram Moolenaar  var lines =<< trim END
1171c620c055SBram Moolenaar    vim9script
1172601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1173c620c055SBram Moolenaar    def Test()
1174cfcd011fSBram Moolenaar      var x: list<number> = FastFilter()
1175c620c055SBram Moolenaar    enddef
1176c620c055SBram Moolenaar    Test()
1177601e76acSBram Moolenaar    def TestDirect()
1178cfcd011fSBram Moolenaar      var x: list<number> = FastFilterDirect()
1179601e76acSBram Moolenaar    enddef
1180601e76acSBram Moolenaar    TestDirect()
1181c620c055SBram Moolenaar  END
1182601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1183c620c055SBram Moolenaar  delete('Xfilter.vim')
1184c620c055SBram Moolenaarenddef
1185c620c055SBram Moolenaar
11864c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
1187cfcd011fSBram Moolenaar  var first_lines =<< trim END
11884c17ad94SBram Moolenaar    vim9script
11894c17ad94SBram Moolenaar    def FuncYes(): string
11904c17ad94SBram Moolenaar      return 'yes'
11914c17ad94SBram Moolenaar    enddef
11924c17ad94SBram Moolenaar  END
1193cfcd011fSBram Moolenaar  var withno_lines =<< trim END
11944c17ad94SBram Moolenaar    def FuncNo(): string
11954c17ad94SBram Moolenaar      return 'no'
11964c17ad94SBram Moolenaar    enddef
11974c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
11984c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
11994c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
120003afdcf1SBram Moolenaar    enddef
120103afdcf1SBram Moolenaar  END
1202cfcd011fSBram Moolenaar  var nono_lines =<< trim END
120303afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
120403afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
120544d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
12064c17ad94SBram Moolenaar    enddef
12074c17ad94SBram Moolenaar  END
12084c17ad94SBram Moolenaar
12094c17ad94SBram Moolenaar  # FuncNo() is defined
121003afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12114c17ad94SBram Moolenaar  source Xreloaded.vim
12124c17ad94SBram Moolenaar  g:DoCheck(true)
12134c17ad94SBram Moolenaar
12144c17ad94SBram Moolenaar  # FuncNo() is not redefined
121503afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
12164c17ad94SBram Moolenaar  source Xreloaded.vim
121703afdcf1SBram Moolenaar  g:DoCheck()
12184c17ad94SBram Moolenaar
12194c17ad94SBram Moolenaar  # FuncNo() is back
122003afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12214c17ad94SBram Moolenaar  source Xreloaded.vim
122203afdcf1SBram Moolenaar  g:DoCheck()
12234c17ad94SBram Moolenaar
12244c17ad94SBram Moolenaar  delete('Xreloaded.vim')
12254c17ad94SBram Moolenaarenddef
12264c17ad94SBram Moolenaar
122789483d40SBram Moolenaardef Test_vim9script_reload_delvar()
122889483d40SBram Moolenaar  # write the script with a script-local variable
1229cfcd011fSBram Moolenaar  var lines =<< trim END
123089483d40SBram Moolenaar    vim9script
1231cfcd011fSBram Moolenaar    var name = 'string'
123289483d40SBram Moolenaar  END
123389483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
123489483d40SBram Moolenaar  source XreloadVar.vim
123589483d40SBram Moolenaar
123689483d40SBram Moolenaar  # now write the script using the same variable locally - works
123789483d40SBram Moolenaar  lines =<< trim END
123889483d40SBram Moolenaar    vim9script
123989483d40SBram Moolenaar    def Func()
1240cfcd011fSBram Moolenaar      var name = 'string'
124189483d40SBram Moolenaar    enddef
124289483d40SBram Moolenaar  END
124389483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
124489483d40SBram Moolenaar  source XreloadVar.vim
124589483d40SBram Moolenaar
124689483d40SBram Moolenaar  delete('XreloadVar.vim')
124789483d40SBram Moolenaarenddef
124889483d40SBram Moolenaar
12498a7d6542SBram Moolenaardef Test_import_absolute()
1250cfcd011fSBram Moolenaar  var import_lines = [
1251e6085c53SBram Moolenaar        'vim9script',
1252e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1253e6085c53SBram Moolenaar        'def UseExported()',
1254e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1255e6085c53SBram Moolenaar        '  exported = 8888',
1256e6085c53SBram Moolenaar        '  g:imported_after = exported',
1257e6085c53SBram Moolenaar        'enddef',
1258e6085c53SBram Moolenaar        'UseExported()',
1259e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1260e6085c53SBram Moolenaar        ]
12618a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
12628a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
12638a7d6542SBram Moolenaar
12648a7d6542SBram Moolenaar  source Ximport_abs.vim
12658a7d6542SBram Moolenaar
12668a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
12674e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1268675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1269675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1270675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1271675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1272675f716eSBram Moolenaar          'exported = 8888.*' ..
1273675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1274675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1275675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1276675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1277e6085c53SBram Moolenaar        g:import_disassembled)
1278b3ca9824SBram Moolenaar
1279b3ca9824SBram Moolenaar  Undo_export_script_lines()
12808a7d6542SBram Moolenaar  unlet g:imported_abs
12814e12a5dfSBram Moolenaar  unlet g:import_disassembled
12828a7d6542SBram Moolenaar
12838a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
12848a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
12858a7d6542SBram Moolenaarenddef
12868a7d6542SBram Moolenaar
12878a7d6542SBram Moolenaardef Test_import_rtp()
1288cfcd011fSBram Moolenaar  var import_lines = [
1289e6085c53SBram Moolenaar        'vim9script',
1290e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1291e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1292e6085c53SBram Moolenaar        ]
12938a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
12948a7d6542SBram Moolenaar  mkdir('import')
12958a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
12968a7d6542SBram Moolenaar
1297cfcd011fSBram Moolenaar  var save_rtp = &rtp
12988a7d6542SBram Moolenaar  &rtp = getcwd()
12998a7d6542SBram Moolenaar  source Ximport_rtp.vim
13008a7d6542SBram Moolenaar  &rtp = save_rtp
13018a7d6542SBram Moolenaar
13028a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
13038a7d6542SBram Moolenaar
1304b3ca9824SBram Moolenaar  Undo_export_script_lines()
1305b3ca9824SBram Moolenaar  unlet g:imported_rtp
13068a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
130789483d40SBram Moolenaar  delete('import', 'rf')
13088a7d6542SBram Moolenaarenddef
13098a7d6542SBram Moolenaar
131025e0f586SBram Moolenaardef Test_import_compile_error()
1311cfcd011fSBram Moolenaar  var export_lines = [
131225e0f586SBram Moolenaar        'vim9script',
131325e0f586SBram Moolenaar        'export def ExpFunc(): string',
131425e0f586SBram Moolenaar        '  return notDefined',
131525e0f586SBram Moolenaar        'enddef',
131625e0f586SBram Moolenaar        ]
131725e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
131825e0f586SBram Moolenaar
1319cfcd011fSBram Moolenaar  var import_lines = [
132025e0f586SBram Moolenaar        'vim9script',
132125e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
132225e0f586SBram Moolenaar        'def ImpFunc()',
132325e0f586SBram Moolenaar        '  echo ExpFunc()',
132425e0f586SBram Moolenaar        'enddef',
132525e0f586SBram Moolenaar        'defcompile',
132625e0f586SBram Moolenaar        ]
132725e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
132825e0f586SBram Moolenaar
132925e0f586SBram Moolenaar  try
133025e0f586SBram Moolenaar    source Ximport.vim
133125e0f586SBram Moolenaar  catch /E1001/
1332f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
13337707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
133425e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
133525e0f586SBram Moolenaar  endtry
133625e0f586SBram Moolenaar
133725e0f586SBram Moolenaar  delete('Xexported.vim')
133825e0f586SBram Moolenaar  delete('Ximport.vim')
133925e0f586SBram Moolenaarenddef
134025e0f586SBram Moolenaar
1341c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1342cfcd011fSBram Moolenaar  var lines = [
1343c4ce36d4SBram Moolenaar        'vim9script',
1344c4ce36d4SBram Moolenaar        'def Func()',
1345c4ce36d4SBram Moolenaar        '  eval [][0]',
1346c4ce36d4SBram Moolenaar        'enddef',
1347c4ce36d4SBram Moolenaar        'Func()',
1348c4ce36d4SBram Moolenaar        ]
1349c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1350c4ce36d4SBram Moolenaar
1351c4ce36d4SBram Moolenaar  for count in range(3)
1352c4ce36d4SBram Moolenaar    try
1353c4ce36d4SBram Moolenaar      source Xtestscript.vim
1354c4ce36d4SBram Moolenaar    catch /E684/
1355c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1356c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1357c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1358c4ce36d4SBram Moolenaar    endtry
1359c4ce36d4SBram Moolenaar  endfor
1360c4ce36d4SBram Moolenaar
1361c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1362c4ce36d4SBram Moolenaarenddef
1363c4ce36d4SBram Moolenaar
1364eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1365cfcd011fSBram Moolenaar  var export_lines =<< trim END
1366eef2102eSBram Moolenaar      vim9script
1367eef2102eSBram Moolenaar      export def Func()
1368eef2102eSBram Moolenaar        echo 'imported'
1369eef2102eSBram Moolenaar      enddef
1370eef2102eSBram Moolenaar  END
1371eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1372eef2102eSBram Moolenaar
1373cfcd011fSBram Moolenaar  var lines =<< trim END
1374eef2102eSBram Moolenaar    vim9script
1375eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1376eef2102eSBram Moolenaar    def Func()
1377eef2102eSBram Moolenaar      echo 'local to function'
1378eef2102eSBram Moolenaar    enddef
1379eef2102eSBram Moolenaar  END
1380eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1381eef2102eSBram Moolenaar
1382eef2102eSBram Moolenaar  lines =<< trim END
1383eef2102eSBram Moolenaar    vim9script
1384eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1385eef2102eSBram Moolenaar    def Outer()
1386eef2102eSBram Moolenaar      def Func()
1387eef2102eSBram Moolenaar        echo 'local to function'
1388eef2102eSBram Moolenaar      enddef
1389eef2102eSBram Moolenaar    enddef
1390eef2102eSBram Moolenaar    defcompile
1391eef2102eSBram Moolenaar  END
1392eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1393eef2102eSBram Moolenaar
1394eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1395eef2102eSBram Moolenaarenddef
1396eef2102eSBram Moolenaar
1397b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1398cfcd011fSBram Moolenaar  var lines =<< trim END
1399b9a2cac3SBram Moolenaar    vim9script
1400b9a2cac3SBram Moolenaar    def Func()
1401b9a2cac3SBram Moolenaar      echo 'one'
1402b9a2cac3SBram Moolenaar    enddef
1403b9a2cac3SBram Moolenaar    def Func()
1404b9a2cac3SBram Moolenaar      echo 'two'
1405b9a2cac3SBram Moolenaar    enddef
1406b9a2cac3SBram Moolenaar  END
1407b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1408fa211f3cSBram Moolenaar
1409fa211f3cSBram Moolenaar  lines =<< trim END
1410fa211f3cSBram Moolenaar    vim9script
1411fa211f3cSBram Moolenaar    def Foo(): string
1412fa211f3cSBram Moolenaar      return 'foo'
1413fa211f3cSBram Moolenaar      enddef
1414fa211f3cSBram Moolenaar    def Func()
1415cfcd011fSBram Moolenaar      var  Foo = {-> 'lambda'}
1416fa211f3cSBram Moolenaar    enddef
1417fa211f3cSBram Moolenaar    defcompile
1418fa211f3cSBram Moolenaar  END
1419fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1420b9a2cac3SBram Moolenaarenddef
1421b9a2cac3SBram Moolenaar
14228a7d6542SBram Moolenaardef Test_fixed_size_list()
1423f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
1424cfcd011fSBram Moolenaar  var l = [1, 2, 3, 4]
14258a7d6542SBram Moolenaar  l->remove(0)
14268a7d6542SBram Moolenaar  l->add(5)
14278a7d6542SBram Moolenaar  l->insert(99, 1)
14280f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
14298a7d6542SBram Moolenaarenddef
14308a7d6542SBram Moolenaar
1431ae616494SBram Moolenaardef Test_no_insert_xit()
1432d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1433d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1434d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1435d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1436d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1437ae616494SBram Moolenaar
1438ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1439ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1440ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1441ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1442f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1443f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1444f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1445f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1446f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1447ae616494SBram Moolenaarenddef
1448ae616494SBram Moolenaar
1449158906cfSBram Moolenaardef IfElse(what: number): string
1450cfcd011fSBram Moolenaar  var res = ''
1451158906cfSBram Moolenaar  if what == 1
1452158906cfSBram Moolenaar    res = "one"
1453158906cfSBram Moolenaar  elseif what == 2
1454158906cfSBram Moolenaar    res = "two"
1455a259d8d3SBram Moolenaar  else
1456158906cfSBram Moolenaar    res = "three"
1457a259d8d3SBram Moolenaar  endif
1458158906cfSBram Moolenaar  return res
1459a259d8d3SBram Moolenaarenddef
1460a259d8d3SBram Moolenaar
1461158906cfSBram Moolenaardef Test_if_elseif_else()
1462158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1463158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1464158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
14650f18b6d1SBram Moolenaarenddef
14660f18b6d1SBram Moolenaar
1467e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1468d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
1469d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
1470d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
1471d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1472d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
1473e8c4abbbSBram Moolenaarenddef
1474e8c4abbbSBram Moolenaar
14756d69bf60SBram Moolenaarlet g:bool_true = v:true
14766d69bf60SBram Moolenaarlet g:bool_false = v:false
14776d69bf60SBram Moolenaar
14786d69bf60SBram Moolenaardef Test_if_const_expr()
1479cfcd011fSBram Moolenaar  var res = false
14806d69bf60SBram Moolenaar  if true ? true : false
14816d69bf60SBram Moolenaar    res = true
14826d69bf60SBram Moolenaar  endif
14836d69bf60SBram Moolenaar  assert_equal(true, res)
14846d69bf60SBram Moolenaar
1485585fea7bSBram Moolenaar  g:glob = 2
1486585fea7bSBram Moolenaar  if false
14876797966dSBram Moolenaar    execute('g:glob = 3')
1488585fea7bSBram Moolenaar  endif
1489585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1490585fea7bSBram Moolenaar  if true
14916797966dSBram Moolenaar    execute('g:glob = 3')
1492585fea7bSBram Moolenaar  endif
1493585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1494585fea7bSBram Moolenaar
14956d69bf60SBram Moolenaar  res = false
14966d69bf60SBram Moolenaar  if g:bool_true ? true : false
14976d69bf60SBram Moolenaar    res = true
14986d69bf60SBram Moolenaar  endif
14996d69bf60SBram Moolenaar  assert_equal(true, res)
15006d69bf60SBram Moolenaar
15016d69bf60SBram Moolenaar  res = false
15026d69bf60SBram Moolenaar  if true ? g:bool_true : false
15036d69bf60SBram Moolenaar    res = true
15046d69bf60SBram Moolenaar  endif
15056d69bf60SBram Moolenaar  assert_equal(true, res)
15066d69bf60SBram Moolenaar
15076d69bf60SBram Moolenaar  res = false
15086d69bf60SBram Moolenaar  if true ? true : g:bool_false
15096d69bf60SBram Moolenaar    res = true
15106d69bf60SBram Moolenaar  endif
15116d69bf60SBram Moolenaar  assert_equal(true, res)
15126d69bf60SBram Moolenaar
15136d69bf60SBram Moolenaar  res = false
15146d69bf60SBram Moolenaar  if true ? false : true
15156d69bf60SBram Moolenaar    res = true
15166d69bf60SBram Moolenaar  endif
15176d69bf60SBram Moolenaar  assert_equal(false, res)
15186d69bf60SBram Moolenaar
15196d69bf60SBram Moolenaar  res = false
15206d69bf60SBram Moolenaar  if false ? false : true
15216d69bf60SBram Moolenaar    res = true
15226d69bf60SBram Moolenaar  endif
15236d69bf60SBram Moolenaar  assert_equal(true, res)
15246d69bf60SBram Moolenaar
15256d69bf60SBram Moolenaar  res = false
15266d69bf60SBram Moolenaar  if false ? true : false
15276d69bf60SBram Moolenaar    res = true
15286d69bf60SBram Moolenaar  endif
15296d69bf60SBram Moolenaar  assert_equal(false, res)
15306d69bf60SBram Moolenaar
15316d69bf60SBram Moolenaar  res = false
1532e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1533e8c4abbbSBram Moolenaar    res = true
1534e8c4abbbSBram Moolenaar  endif
1535e8c4abbbSBram Moolenaar  assert_equal(false, res)
1536e8c4abbbSBram Moolenaar
1537e8c4abbbSBram Moolenaar  res = false
15386d69bf60SBram Moolenaar  if true && true
15396d69bf60SBram Moolenaar    res = true
15406d69bf60SBram Moolenaar  endif
15416d69bf60SBram Moolenaar  assert_equal(true, res)
15426d69bf60SBram Moolenaar
15436d69bf60SBram Moolenaar  res = false
15446d69bf60SBram Moolenaar  if true && false
15456d69bf60SBram Moolenaar    res = true
15466d69bf60SBram Moolenaar  endif
15476d69bf60SBram Moolenaar  assert_equal(false, res)
15486d69bf60SBram Moolenaar
15496d69bf60SBram Moolenaar  res = false
15506d69bf60SBram Moolenaar  if g:bool_true && false
15516d69bf60SBram Moolenaar    res = true
15526d69bf60SBram Moolenaar  endif
15536d69bf60SBram Moolenaar  assert_equal(false, res)
15546d69bf60SBram Moolenaar
15556d69bf60SBram Moolenaar  res = false
15566d69bf60SBram Moolenaar  if true && g:bool_false
15576d69bf60SBram Moolenaar    res = true
15586d69bf60SBram Moolenaar  endif
15596d69bf60SBram Moolenaar  assert_equal(false, res)
15606d69bf60SBram Moolenaar
15616d69bf60SBram Moolenaar  res = false
15626d69bf60SBram Moolenaar  if false && false
15636d69bf60SBram Moolenaar    res = true
15646d69bf60SBram Moolenaar  endif
15656d69bf60SBram Moolenaar  assert_equal(false, res)
15666d69bf60SBram Moolenaar
15676d69bf60SBram Moolenaar  res = false
15686d69bf60SBram Moolenaar  if true || false
15696d69bf60SBram Moolenaar    res = true
15706d69bf60SBram Moolenaar  endif
15716d69bf60SBram Moolenaar  assert_equal(true, res)
15726d69bf60SBram Moolenaar
15736d69bf60SBram Moolenaar  res = false
15746d69bf60SBram Moolenaar  if g:bool_true || false
15756d69bf60SBram Moolenaar    res = true
15766d69bf60SBram Moolenaar  endif
15776d69bf60SBram Moolenaar  assert_equal(true, res)
15786d69bf60SBram Moolenaar
15796d69bf60SBram Moolenaar  res = false
15806d69bf60SBram Moolenaar  if true || g:bool_false
15816d69bf60SBram Moolenaar    res = true
15826d69bf60SBram Moolenaar  endif
15836d69bf60SBram Moolenaar  assert_equal(true, res)
15846d69bf60SBram Moolenaar
15856d69bf60SBram Moolenaar  res = false
15866d69bf60SBram Moolenaar  if false || false
15876d69bf60SBram Moolenaar    res = true
15886d69bf60SBram Moolenaar  endif
15896d69bf60SBram Moolenaar  assert_equal(false, res)
15903988f64fSBram Moolenaar
15913988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
15923988f64fSBram Moolenaar  if false | eval 0 | endif
15933988f64fSBram Moolenaar  if false | eval burp + 234 | endif
15943988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
15953988f64fSBram Moolenaar  if false
15963988f64fSBram Moolenaar    burp
15973988f64fSBram Moolenaar  endif
159880c34ca3SBram Moolenaarenddef
15996d69bf60SBram Moolenaar
160080c34ca3SBram Moolenaardef Test_if_const_expr_fails()
1601d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1602d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1603d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
1604d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
16056d69bf60SBram Moolenaarenddef
16066d69bf60SBram Moolenaar
160772abcf42SBram Moolenaardef RunNested(i: number): number
1608cfcd011fSBram Moolenaar  var x: number = 0
160972abcf42SBram Moolenaar  if i % 2
161072abcf42SBram Moolenaar    if 1
1611f5be8cdbSBram Moolenaar      # comment
161272abcf42SBram Moolenaar    else
1613f5be8cdbSBram Moolenaar      # comment
161472abcf42SBram Moolenaar    endif
161572abcf42SBram Moolenaar    x += 1
161672abcf42SBram Moolenaar  else
161772abcf42SBram Moolenaar    x += 1000
161872abcf42SBram Moolenaar  endif
161972abcf42SBram Moolenaar  return x
162072abcf42SBram Moolenaarenddef
162172abcf42SBram Moolenaar
162272abcf42SBram Moolenaardef Test_nested_if()
162372abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
162472abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
162572abcf42SBram Moolenaarenddef
162672abcf42SBram Moolenaar
1627ad39c094SBram Moolenaardef Test_execute_cmd()
1628ad39c094SBram Moolenaar  new
1629ad39c094SBram Moolenaar  setline(1, 'default')
1630d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
1631ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1632a72cfb80SBram Moolenaar
1633d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
1634a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1635a72cfb80SBram Moolenaar
1636cfcd011fSBram Moolenaar  var cmd1 = 'setline(1,'
1637cfcd011fSBram Moolenaar  var cmd2 = '"execute-var")'
1638a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1639ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1640a72cfb80SBram Moolenaar
1641d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
1642ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1643a72cfb80SBram Moolenaar
1644cfcd011fSBram Moolenaar  var cmd_first = 'call '
1645cfcd011fSBram Moolenaar  var cmd_last = 'setline(1, "execute-var-var")'
1646ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1647ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1648ad39c094SBram Moolenaar  bwipe!
1649585fea7bSBram Moolenaar
1650cfcd011fSBram Moolenaar  var n = true
16512d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
16522d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
16532d6b20d6SBram Moolenaar
1654e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
1655e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
1656e5abf7afSBram Moolenaar
1657d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
1658d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1659d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
1660ad39c094SBram Moolenaarenddef
1661ad39c094SBram Moolenaar
166247e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1663f5be8cdbSBram Moolenaar  # only checks line continuation
1664cfcd011fSBram Moolenaar  var lines =<< trim END
166547e880d6SBram Moolenaar      vim9script
166647e880d6SBram Moolenaar      execute 'g:someVar'
166747e880d6SBram Moolenaar                .. ' = ' ..
166847e880d6SBram Moolenaar                   '28'
166947e880d6SBram Moolenaar      assert_equal(28, g:someVar)
167047e880d6SBram Moolenaar      unlet g:someVar
167147e880d6SBram Moolenaar  END
167247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
167347e880d6SBram Moolenaarenddef
167447e880d6SBram Moolenaar
1675ad39c094SBram Moolenaardef Test_echo_cmd()
1676a72cfb80SBram Moolenaar  echo 'some' # comment
1677585fea7bSBram Moolenaar  echon 'thing'
1678ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1679ad39c094SBram Moolenaar
1680a72cfb80SBram Moolenaar  echo "some" # comment
1681a72cfb80SBram Moolenaar  echon "thing"
1682a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1683a72cfb80SBram Moolenaar
1684cfcd011fSBram Moolenaar  var str1 = 'some'
1685cfcd011fSBram Moolenaar  var str2 = 'more'
1686ad39c094SBram Moolenaar  echo str1 str2
1687ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1688a72cfb80SBram Moolenaar
1689d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1690ad39c094SBram Moolenaarenddef
1691ad39c094SBram Moolenaar
1692f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1693f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1694f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1695f93c7feaSBram Moolenaar  echo 'clear'
1696df069eecSBram Moolenaar  :1messages
1697f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1698f93c7feaSBram Moolenaar
1699d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1700f93c7feaSBram Moolenaarenddef
1701f93c7feaSBram Moolenaar
170247e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1703f5be8cdbSBram Moolenaar  # only checks line continuation
1704cfcd011fSBram Moolenaar  var lines =<< trim END
170547e880d6SBram Moolenaar      vim9script
170647e880d6SBram Moolenaar      echomsg 'here'
170747e880d6SBram Moolenaar                .. ' is ' ..
170847e880d6SBram Moolenaar                   'a message'
170947e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
171047e880d6SBram Moolenaar  END
171147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
171247e880d6SBram Moolenaarenddef
171347e880d6SBram Moolenaar
1714f93c7feaSBram Moolenaardef Test_echoerr_cmd()
171540ee466cSBram Moolenaar  try
171640ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
171740ee466cSBram Moolenaar  catch
171840ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
171940ee466cSBram Moolenaar  endtry
1720f93c7feaSBram Moolenaarenddef
1721f93c7feaSBram Moolenaar
172247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1723f5be8cdbSBram Moolenaar  # only checks line continuation
1724cfcd011fSBram Moolenaar  var lines =<< trim END
172547e880d6SBram Moolenaar      vim9script
172647e880d6SBram Moolenaar      try
172747e880d6SBram Moolenaar        echoerr 'this'
172847e880d6SBram Moolenaar                .. ' is ' ..
172947e880d6SBram Moolenaar                   'wrong'
173047e880d6SBram Moolenaar      catch
173147e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
173247e880d6SBram Moolenaar      endtry
173347e880d6SBram Moolenaar  END
173447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
173547e880d6SBram Moolenaarenddef
173647e880d6SBram Moolenaar
173741fe0617SBram Moolenaardef Test_for_outside_of_function()
1738cfcd011fSBram Moolenaar  var lines =<< trim END
173941fe0617SBram Moolenaar    vim9script
174041fe0617SBram Moolenaar    new
174141fe0617SBram Moolenaar    for var in range(0, 3)
174241fe0617SBram Moolenaar      append(line('$'), var)
174341fe0617SBram Moolenaar    endfor
174441fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
174541fe0617SBram Moolenaar    bwipe!
174641fe0617SBram Moolenaar  END
174741fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
174841fe0617SBram Moolenaar  source Xvim9for.vim
174941fe0617SBram Moolenaar  delete('Xvim9for.vim')
175041fe0617SBram Moolenaarenddef
17518a7d6542SBram Moolenaar
1752e8c4abbbSBram Moolenaardef Test_for_loop()
1753cfcd011fSBram Moolenaar  var result = ''
1754e8c4abbbSBram Moolenaar  for cnt in range(7)
1755e8c4abbbSBram Moolenaar    if cnt == 4
1756e8c4abbbSBram Moolenaar      break
1757e8c4abbbSBram Moolenaar    endif
1758e8c4abbbSBram Moolenaar    if cnt == 2
1759e8c4abbbSBram Moolenaar      continue
1760e8c4abbbSBram Moolenaar    endif
1761e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1762e8c4abbbSBram Moolenaar  endfor
1763e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
17640ad3e894SBram Moolenaar
1765cfcd011fSBram Moolenaar  var concat = ''
17660ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
17670ad3e894SBram Moolenaar    concat ..= str
17680ad3e894SBram Moolenaar  endfor
17690ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1770e8c4abbbSBram Moolenaarenddef
1771e8c4abbbSBram Moolenaar
1772e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1773675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1774675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1775cfcd011fSBram Moolenaar  CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
1776822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
1777451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
1778675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1779675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1780675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1781e8c4abbbSBram Moolenaarenddef
1782e8c4abbbSBram Moolenaar
1783d0df1aacSBram Moolenaardef Test_while_loop()
1784cfcd011fSBram Moolenaar  var result = ''
1785cfcd011fSBram Moolenaar  var cnt = 0
1786d0df1aacSBram Moolenaar  while cnt < 555
1787d0df1aacSBram Moolenaar    if cnt == 3
1788d0df1aacSBram Moolenaar      break
1789d0df1aacSBram Moolenaar    endif
1790d0df1aacSBram Moolenaar    cnt += 1
1791d0df1aacSBram Moolenaar    if cnt == 2
1792d0df1aacSBram Moolenaar      continue
1793d0df1aacSBram Moolenaar    endif
1794d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1795d0df1aacSBram Moolenaar  endwhile
1796d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1797d0df1aacSBram Moolenaarenddef
1798d0df1aacSBram Moolenaar
1799e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1800675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1801675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1802675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1803675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1804675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1805675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1806675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1807bd5da371SBram Moolenaarenddef
1808bd5da371SBram Moolenaar
18099645e2d9SBram Moolenaardef Test_interrupt_loop()
1810cfcd011fSBram Moolenaar  var caught = false
1811cfcd011fSBram Moolenaar  var x = 0
181297acfc78SBram Moolenaar  try
18139645e2d9SBram Moolenaar    while 1
18149645e2d9SBram Moolenaar      x += 1
18159645e2d9SBram Moolenaar      if x == 100
18169645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
18179645e2d9SBram Moolenaar      endif
18189645e2d9SBram Moolenaar    endwhile
181997acfc78SBram Moolenaar  catch
182097acfc78SBram Moolenaar    caught = true
182197acfc78SBram Moolenaar    assert_equal(100, x)
182297acfc78SBram Moolenaar  endtry
182397acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
182425859dd7SBram Moolenaar  # consume the CTRL-C
182525859dd7SBram Moolenaar  getchar(0)
18269645e2d9SBram Moolenaarenddef
182720431c9dSBram Moolenaar
18284fdae999SBram Moolenaardef Test_automatic_line_continuation()
1829cfcd011fSBram Moolenaar  var mylist = [
18304fdae999SBram Moolenaar      'one',
18314fdae999SBram Moolenaar      'two',
18324fdae999SBram Moolenaar      'three',
1833f5be8cdbSBram Moolenaar      ] # comment
18344fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
18354fdae999SBram Moolenaar
1836cfcd011fSBram Moolenaar  var mydict = {
18374fdae999SBram Moolenaar      'one': 1,
18384fdae999SBram Moolenaar      'two': 2,
18394fdae999SBram Moolenaar      'three':
18404fdae999SBram Moolenaar          3,
1841f5be8cdbSBram Moolenaar      } # comment
18424fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
18434fdae999SBram Moolenaar  mydict = #{
18442c330432SBram Moolenaar      one: 1,  # comment
18452c330432SBram Moolenaar      two:     # comment
18462c330432SBram Moolenaar           2,  # comment
18472c330432SBram Moolenaar      three: 3 # comment
18482c330432SBram Moolenaar      }
18492c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
18502c330432SBram Moolenaar  mydict = #{
18512c330432SBram Moolenaar      one: 1,
18524fdae999SBram Moolenaar      two:
18534fdae999SBram Moolenaar           2,
18542c330432SBram Moolenaar      three: 3
18554fdae999SBram Moolenaar      }
18564fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1857e6085c53SBram Moolenaar
1858e6085c53SBram Moolenaar  assert_equal(
1859e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1860e6085c53SBram Moolenaar        split('one two three')
1861e6085c53SBram Moolenaar        )
18624fdae999SBram Moolenaarenddef
18634fdae999SBram Moolenaar
18647a092245SBram Moolenaardef Test_vim9_comment()
18657a092245SBram Moolenaar  CheckScriptSuccess([
18667a092245SBram Moolenaar      'vim9script',
18677a092245SBram Moolenaar      '# something',
18687a092245SBram Moolenaar      ])
18697a092245SBram Moolenaar  CheckScriptFailure([
18707a092245SBram Moolenaar      'vim9script',
18717a092245SBram Moolenaar      ':# something',
18727a092245SBram Moolenaar      ], 'E488:')
18737a092245SBram Moolenaar  CheckScriptFailure([
18747a092245SBram Moolenaar      '# something',
18757a092245SBram Moolenaar      ], 'E488:')
18767a092245SBram Moolenaar  CheckScriptFailure([
18777a092245SBram Moolenaar      ':# something',
18787a092245SBram Moolenaar      ], 'E488:')
18797a092245SBram Moolenaar
18804a8d9f2eSBram Moolenaar  { # block start
18814a8d9f2eSBram Moolenaar  } # block end
18824a8d9f2eSBram Moolenaar  CheckDefFailure([
18834a8d9f2eSBram Moolenaar      '{# comment',
18844a8d9f2eSBram Moolenaar      ], 'E488:')
18854a8d9f2eSBram Moolenaar  CheckDefFailure([
18864a8d9f2eSBram Moolenaar      '{',
18874a8d9f2eSBram Moolenaar      '}# comment',
18884a8d9f2eSBram Moolenaar      ], 'E488:')
18894a8d9f2eSBram Moolenaar
18904a8d9f2eSBram Moolenaar  echo "yes" # comment
18914a8d9f2eSBram Moolenaar  CheckDefFailure([
18924a8d9f2eSBram Moolenaar      'echo "yes"# comment',
18934a8d9f2eSBram Moolenaar      ], 'E488:')
18947a092245SBram Moolenaar  CheckScriptSuccess([
18957a092245SBram Moolenaar      'vim9script',
18967a092245SBram Moolenaar      'echo "yes" # something',
18977a092245SBram Moolenaar      ])
18987a092245SBram Moolenaar  CheckScriptFailure([
18997a092245SBram Moolenaar      'vim9script',
19007a092245SBram Moolenaar      'echo "yes"# something',
19017a092245SBram Moolenaar      ], 'E121:')
19027a092245SBram Moolenaar  CheckScriptFailure([
19037a092245SBram Moolenaar      'vim9script',
19047a092245SBram Moolenaar      'echo# something',
19057a092245SBram Moolenaar      ], 'E121:')
19067a092245SBram Moolenaar  CheckScriptFailure([
19077a092245SBram Moolenaar      'echo "yes" # something',
19087a092245SBram Moolenaar      ], 'E121:')
19097a092245SBram Moolenaar
19104a8d9f2eSBram Moolenaar  exe "echo" # comment
19114a8d9f2eSBram Moolenaar  CheckDefFailure([
19124a8d9f2eSBram Moolenaar      'exe "echo"# comment',
19134a8d9f2eSBram Moolenaar      ], 'E488:')
19144a8d9f2eSBram Moolenaar  CheckScriptSuccess([
19154a8d9f2eSBram Moolenaar      'vim9script',
19164a8d9f2eSBram Moolenaar      'exe "echo" # something',
19174a8d9f2eSBram Moolenaar      ])
19184a8d9f2eSBram Moolenaar  CheckScriptFailure([
19194a8d9f2eSBram Moolenaar      'vim9script',
19204a8d9f2eSBram Moolenaar      'exe "echo"# something',
19214a8d9f2eSBram Moolenaar      ], 'E121:')
19224a8d9f2eSBram Moolenaar  CheckDefFailure([
19234a8d9f2eSBram Moolenaar      'exe # comment',
19244a8d9f2eSBram Moolenaar      ], 'E1015:')
19254a8d9f2eSBram Moolenaar  CheckScriptFailure([
19264a8d9f2eSBram Moolenaar      'vim9script',
19274a8d9f2eSBram Moolenaar      'exe# something',
19284a8d9f2eSBram Moolenaar      ], 'E121:')
19294a8d9f2eSBram Moolenaar  CheckScriptFailure([
19304a8d9f2eSBram Moolenaar      'exe "echo" # something',
19314a8d9f2eSBram Moolenaar      ], 'E121:')
19324a8d9f2eSBram Moolenaar
19337a092245SBram Moolenaar  CheckDefFailure([
19347a092245SBram Moolenaar      'try# comment',
19357a092245SBram Moolenaar      '  echo "yes"',
19367a092245SBram Moolenaar      'catch',
19377a092245SBram Moolenaar      'endtry',
19387a092245SBram Moolenaar      ], 'E488:')
19392c5ed4e3SBram Moolenaar  CheckScriptFailure([
19402c5ed4e3SBram Moolenaar      'vim9script',
19412c5ed4e3SBram Moolenaar      'try# comment',
19422c5ed4e3SBram Moolenaar      'echo "yes"',
19432c5ed4e3SBram Moolenaar      ], 'E488:')
19447a092245SBram Moolenaar  CheckDefFailure([
19457a092245SBram Moolenaar      'try',
1946a72cfb80SBram Moolenaar      '  throw#comment',
1947a72cfb80SBram Moolenaar      'catch',
1948a72cfb80SBram Moolenaar      'endtry',
1949a72cfb80SBram Moolenaar      ], 'E1015:')
1950a72cfb80SBram Moolenaar  CheckDefFailure([
1951a72cfb80SBram Moolenaar      'try',
1952a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1953a72cfb80SBram Moolenaar      'catch',
1954a72cfb80SBram Moolenaar      'endtry',
1955a72cfb80SBram Moolenaar      ], 'E488:')
1956a72cfb80SBram Moolenaar  CheckDefFailure([
1957a72cfb80SBram Moolenaar      'try',
19587a092245SBram Moolenaar      '  echo "yes"',
19597a092245SBram Moolenaar      'catch# comment',
19607a092245SBram Moolenaar      'endtry',
19617a092245SBram Moolenaar      ], 'E488:')
19622c5ed4e3SBram Moolenaar  CheckScriptFailure([
19632c5ed4e3SBram Moolenaar      'vim9script',
19642c5ed4e3SBram Moolenaar      'try',
19652c5ed4e3SBram Moolenaar      '  echo "yes"',
19662c5ed4e3SBram Moolenaar      'catch# comment',
19672c5ed4e3SBram Moolenaar      'endtry',
19682c5ed4e3SBram Moolenaar      ], 'E654:')
19692c5ed4e3SBram Moolenaar  CheckDefFailure([
19702c5ed4e3SBram Moolenaar      'try',
19712c5ed4e3SBram Moolenaar      '  echo "yes"',
19722c5ed4e3SBram Moolenaar      'catch /pat/# comment',
19732c5ed4e3SBram Moolenaar      'endtry',
19742c5ed4e3SBram Moolenaar      ], 'E488:')
19757a092245SBram Moolenaar  CheckDefFailure([
19767a092245SBram Moolenaar      'try',
19777a092245SBram Moolenaar      'echo "yes"',
19787a092245SBram Moolenaar      'catch',
19797a092245SBram Moolenaar      'endtry# comment',
19807a092245SBram Moolenaar      ], 'E488:')
19812c5ed4e3SBram Moolenaar  CheckScriptFailure([
19822c5ed4e3SBram Moolenaar      'vim9script',
19832c5ed4e3SBram Moolenaar      'try',
19842c5ed4e3SBram Moolenaar      '  echo "yes"',
19852c5ed4e3SBram Moolenaar      'catch',
19862c5ed4e3SBram Moolenaar      'endtry# comment',
19879b7bf9e9SBram Moolenaar      ], 'E488:')
19882c5ed4e3SBram Moolenaar
19892c5ed4e3SBram Moolenaar  CheckScriptSuccess([
19902c5ed4e3SBram Moolenaar      'vim9script',
19912c5ed4e3SBram Moolenaar      'hi # comment',
19922c5ed4e3SBram Moolenaar      ])
19932c5ed4e3SBram Moolenaar  CheckScriptFailure([
19942c5ed4e3SBram Moolenaar      'vim9script',
19952c5ed4e3SBram Moolenaar      'hi# comment',
19962c5ed4e3SBram Moolenaar      ], 'E416:')
19971966c248SBram Moolenaar  CheckScriptSuccess([
19981966c248SBram Moolenaar      'vim9script',
19991966c248SBram Moolenaar      'hi Search # comment',
20001966c248SBram Moolenaar      ])
20011966c248SBram Moolenaar  CheckScriptFailure([
20021966c248SBram Moolenaar      'vim9script',
20031966c248SBram Moolenaar      'hi Search# comment',
20041966c248SBram Moolenaar      ], 'E416:')
20051966c248SBram Moolenaar  CheckScriptSuccess([
20061966c248SBram Moolenaar      'vim9script',
20071966c248SBram Moolenaar      'hi link This Search # comment',
20081966c248SBram Moolenaar      ])
20091966c248SBram Moolenaar  CheckScriptFailure([
20101966c248SBram Moolenaar      'vim9script',
20111966c248SBram Moolenaar      'hi link This That# comment',
20121966c248SBram Moolenaar      ], 'E413:')
20131966c248SBram Moolenaar  CheckScriptSuccess([
20141966c248SBram Moolenaar      'vim9script',
20151966c248SBram Moolenaar      'hi clear This # comment',
20161966c248SBram Moolenaar      'hi clear # comment',
20171966c248SBram Moolenaar      ])
2018f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2019f5be8cdbSBram Moolenaar  # hi clear This# comment',
20201966c248SBram Moolenaar  CheckScriptFailure([
20211966c248SBram Moolenaar      'vim9script',
20221966c248SBram Moolenaar      'hi clear# comment',
20231966c248SBram Moolenaar      ], 'E416:')
20241966c248SBram Moolenaar
20251966c248SBram Moolenaar  CheckScriptSuccess([
20261966c248SBram Moolenaar      'vim9script',
20271966c248SBram Moolenaar      'hi Group term=bold',
20281966c248SBram Moolenaar      'match Group /todo/ # comment',
20291966c248SBram Moolenaar      ])
20301966c248SBram Moolenaar  CheckScriptFailure([
20311966c248SBram Moolenaar      'vim9script',
20321966c248SBram Moolenaar      'hi Group term=bold',
20331966c248SBram Moolenaar      'match Group /todo/# comment',
20341966c248SBram Moolenaar      ], 'E488:')
20351966c248SBram Moolenaar  CheckScriptSuccess([
20361966c248SBram Moolenaar      'vim9script',
20371966c248SBram Moolenaar      'match # comment',
20381966c248SBram Moolenaar      ])
20391966c248SBram Moolenaar  CheckScriptFailure([
20401966c248SBram Moolenaar      'vim9script',
20411966c248SBram Moolenaar      'match# comment',
20421966c248SBram Moolenaar      ], 'E475:')
20431966c248SBram Moolenaar  CheckScriptSuccess([
20441966c248SBram Moolenaar      'vim9script',
20451966c248SBram Moolenaar      'match none # comment',
20461966c248SBram Moolenaar      ])
20471966c248SBram Moolenaar  CheckScriptFailure([
20481966c248SBram Moolenaar      'vim9script',
20491966c248SBram Moolenaar      'match none# comment',
20501966c248SBram Moolenaar      ], 'E475:')
20511966c248SBram Moolenaar
20521966c248SBram Moolenaar  CheckScriptSuccess([
20531966c248SBram Moolenaar      'vim9script',
20541966c248SBram Moolenaar      'menutrans clear # comment',
20551966c248SBram Moolenaar      ])
20561966c248SBram Moolenaar  CheckScriptFailure([
20571966c248SBram Moolenaar      'vim9script',
20581966c248SBram Moolenaar      'menutrans clear# comment text',
20591966c248SBram Moolenaar      ], 'E474:')
20601966c248SBram Moolenaar
20611966c248SBram Moolenaar  CheckScriptSuccess([
20621966c248SBram Moolenaar      'vim9script',
20631966c248SBram Moolenaar      'syntax clear # comment',
20641966c248SBram Moolenaar      ])
20651966c248SBram Moolenaar  CheckScriptFailure([
20661966c248SBram Moolenaar      'vim9script',
20671966c248SBram Moolenaar      'syntax clear# comment text',
20681966c248SBram Moolenaar      ], 'E28:')
20691966c248SBram Moolenaar  CheckScriptSuccess([
20701966c248SBram Moolenaar      'vim9script',
20711966c248SBram Moolenaar      'syntax keyword Word some',
20721966c248SBram Moolenaar      'syntax clear Word # comment',
20731966c248SBram Moolenaar      ])
20741966c248SBram Moolenaar  CheckScriptFailure([
20751966c248SBram Moolenaar      'vim9script',
20761966c248SBram Moolenaar      'syntax keyword Word some',
20771966c248SBram Moolenaar      'syntax clear Word# comment text',
20781966c248SBram Moolenaar      ], 'E28:')
20791966c248SBram Moolenaar
20801966c248SBram Moolenaar  CheckScriptSuccess([
20811966c248SBram Moolenaar      'vim9script',
20821966c248SBram Moolenaar      'syntax list # comment',
20831966c248SBram Moolenaar      ])
20841966c248SBram Moolenaar  CheckScriptFailure([
20851966c248SBram Moolenaar      'vim9script',
20861966c248SBram Moolenaar      'syntax list# comment text',
20871966c248SBram Moolenaar      ], 'E28:')
20881966c248SBram Moolenaar
20891966c248SBram Moolenaar  CheckScriptSuccess([
20901966c248SBram Moolenaar      'vim9script',
20911966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
20921966c248SBram Moolenaar      ])
20931966c248SBram Moolenaar  CheckScriptFailure([
20941966c248SBram Moolenaar      'vim9script',
20951966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
20961966c248SBram Moolenaar      ], 'E475:')
20971966c248SBram Moolenaar
20981966c248SBram Moolenaar  CheckScriptSuccess([
20991966c248SBram Moolenaar      'vim9script',
21001966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
21011966c248SBram Moolenaar      ])
21021966c248SBram Moolenaar  CheckScriptFailure([
21031966c248SBram Moolenaar      'vim9script',
21041966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
21051966c248SBram Moolenaar      ], 'E789:')
21061966c248SBram Moolenaar
21071966c248SBram Moolenaar  CheckScriptSuccess([
21081966c248SBram Moolenaar      'vim9script',
21091966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
21101966c248SBram Moolenaar      ])
21111966c248SBram Moolenaar  CheckScriptFailure([
21121966c248SBram Moolenaar      'vim9script',
21131966c248SBram Moolenaar      'syntax match Word /pat/# comment',
21141966c248SBram Moolenaar      ], 'E402:')
21151966c248SBram Moolenaar
21161966c248SBram Moolenaar  CheckScriptSuccess([
21171966c248SBram Moolenaar      'vim9script',
21181966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
21191966c248SBram Moolenaar      ])
21201966c248SBram Moolenaar  CheckScriptFailure([
21211966c248SBram Moolenaar      'vim9script',
21221966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
21231966c248SBram Moolenaar      ], 'E475:')
21241966c248SBram Moolenaar  CheckScriptFailure([
21251966c248SBram Moolenaar      'vim9script',
21261966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
21271966c248SBram Moolenaar      ], 'E406:')
21281966c248SBram Moolenaar  CheckScriptFailure([
21291966c248SBram Moolenaar      'vim9script',
21301966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
21311966c248SBram Moolenaar      ], 'E475:')
21321966c248SBram Moolenaar
21331966c248SBram Moolenaar  CheckScriptSuccess([
21341966c248SBram Moolenaar      'vim9script',
21351966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
21361966c248SBram Moolenaar      ])
21371966c248SBram Moolenaar  CheckScriptFailure([
21381966c248SBram Moolenaar      'vim9script',
21391966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2140d032f34aSBram Moolenaar      ], 'E402:')
21411966c248SBram Moolenaar
21421966c248SBram Moolenaar  CheckScriptSuccess([
21431966c248SBram Moolenaar      'vim9script',
21441966c248SBram Moolenaar      'syntax sync # comment',
21451966c248SBram Moolenaar      ])
21461966c248SBram Moolenaar  CheckScriptFailure([
21471966c248SBram Moolenaar      'vim9script',
21481966c248SBram Moolenaar      'syntax sync# comment',
21491966c248SBram Moolenaar      ], 'E404:')
21501966c248SBram Moolenaar  CheckScriptSuccess([
21511966c248SBram Moolenaar      'vim9script',
21521966c248SBram Moolenaar      'syntax sync ccomment # comment',
21531966c248SBram Moolenaar      ])
21541966c248SBram Moolenaar  CheckScriptFailure([
21551966c248SBram Moolenaar      'vim9script',
21561966c248SBram Moolenaar      'syntax sync ccomment# comment',
21571966c248SBram Moolenaar      ], 'E404:')
21581966c248SBram Moolenaar
21591966c248SBram Moolenaar  CheckScriptSuccess([
21601966c248SBram Moolenaar      'vim9script',
21611966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
21621966c248SBram Moolenaar      ])
21631966c248SBram Moolenaar  CheckScriptFailure([
21641966c248SBram Moolenaar      'vim9script',
21651966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
21661966c248SBram Moolenaar      ], 'E475:')
2167a72cfb80SBram Moolenaar
2168a72cfb80SBram Moolenaar  CheckScriptSuccess([
2169a72cfb80SBram Moolenaar      'vim9script',
2170a72cfb80SBram Moolenaar      'command Echo echo # comment',
2171a72cfb80SBram Moolenaar      'command Echo # comment',
2172a72cfb80SBram Moolenaar      ])
2173a72cfb80SBram Moolenaar  CheckScriptFailure([
2174a72cfb80SBram Moolenaar      'vim9script',
2175a72cfb80SBram Moolenaar      'command Echo echo# comment',
2176a72cfb80SBram Moolenaar      'Echo',
2177a72cfb80SBram Moolenaar      ], 'E121:')
2178a72cfb80SBram Moolenaar  CheckScriptFailure([
2179a72cfb80SBram Moolenaar      'vim9script',
2180a72cfb80SBram Moolenaar      'command Echo# comment',
2181a72cfb80SBram Moolenaar      ], 'E182:')
2182a72cfb80SBram Moolenaar  CheckScriptFailure([
2183a72cfb80SBram Moolenaar      'vim9script',
2184a72cfb80SBram Moolenaar      'command Echo echo',
2185a72cfb80SBram Moolenaar      'command Echo# comment',
2186a72cfb80SBram Moolenaar      ], 'E182:')
2187a72cfb80SBram Moolenaar
2188a72cfb80SBram Moolenaar  CheckScriptSuccess([
2189a72cfb80SBram Moolenaar      'vim9script',
2190a72cfb80SBram Moolenaar      'function # comment',
2191a72cfb80SBram Moolenaar      ])
2192a72cfb80SBram Moolenaar  CheckScriptFailure([
2193a72cfb80SBram Moolenaar      'vim9script',
21949898107fSBram Moolenaar      'function " comment',
21959898107fSBram Moolenaar      ], 'E129:')
21969898107fSBram Moolenaar  CheckScriptFailure([
21979898107fSBram Moolenaar      'vim9script',
2198a72cfb80SBram Moolenaar      'function# comment',
2199a72cfb80SBram Moolenaar      ], 'E129:')
2200a72cfb80SBram Moolenaar  CheckScriptSuccess([
2201a72cfb80SBram Moolenaar      'vim9script',
2202a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2203a72cfb80SBram Moolenaar      ])
2204a72cfb80SBram Moolenaar  CheckScriptFailure([
2205a72cfb80SBram Moolenaar      'vim9script',
2206a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2207a72cfb80SBram Moolenaar      ], 'E488:')
2208a72cfb80SBram Moolenaar
2209a72cfb80SBram Moolenaar  CheckScriptSuccess([
2210a72cfb80SBram Moolenaar      'vim9script',
22114c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2212a72cfb80SBram Moolenaar      'endfunc',
22134c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2214a72cfb80SBram Moolenaar      ])
2215a72cfb80SBram Moolenaar  CheckScriptFailure([
2216a72cfb80SBram Moolenaar      'vim9script',
22174c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2218a72cfb80SBram Moolenaar      'endfunc',
22194c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2220a72cfb80SBram Moolenaar      ], 'E488:')
2221a72cfb80SBram Moolenaar
2222a72cfb80SBram Moolenaar  CheckScriptSuccess([
2223a72cfb80SBram Moolenaar      'vim9script',
2224a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2225a72cfb80SBram Moolenaar      ])
2226a72cfb80SBram Moolenaar  CheckScriptFailure([
2227a72cfb80SBram Moolenaar      'vim9script',
2228a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2229a72cfb80SBram Moolenaar      ], 'E488:')
2230e7e4838fSBram Moolenaar
2231e7e4838fSBram Moolenaar  CheckScriptFailure([
2232e7e4838fSBram Moolenaar      'def Test() " comment',
2233e7e4838fSBram Moolenaar      'enddef',
2234e7e4838fSBram Moolenaar      ], 'E488:')
2235e7e4838fSBram Moolenaar  CheckScriptFailure([
2236e7e4838fSBram Moolenaar      'vim9script',
2237e7e4838fSBram Moolenaar      'def Test() " comment',
2238e7e4838fSBram Moolenaar      'enddef',
2239e7e4838fSBram Moolenaar      ], 'E488:')
2240e7e4838fSBram Moolenaar
2241e7e4838fSBram Moolenaar  CheckScriptSuccess([
2242e7e4838fSBram Moolenaar      'func Test() " comment',
2243e7e4838fSBram Moolenaar      'endfunc',
2244e7e4838fSBram Moolenaar      ])
22459898107fSBram Moolenaar  CheckScriptSuccess([
2246e7e4838fSBram Moolenaar      'vim9script',
2247e7e4838fSBram Moolenaar      'func Test() " comment',
2248e7e4838fSBram Moolenaar      'endfunc',
22499898107fSBram Moolenaar      ])
2250e7e4838fSBram Moolenaar
2251e7e4838fSBram Moolenaar  CheckScriptSuccess([
2252e7e4838fSBram Moolenaar      'def Test() # comment',
2253e7e4838fSBram Moolenaar      'enddef',
2254e7e4838fSBram Moolenaar      ])
2255e7e4838fSBram Moolenaar  CheckScriptFailure([
2256e7e4838fSBram Moolenaar      'func Test() # comment',
2257e7e4838fSBram Moolenaar      'endfunc',
2258e7e4838fSBram Moolenaar      ], 'E488:')
22592c5ed4e3SBram Moolenaarenddef
22602c5ed4e3SBram Moolenaar
22612c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
22622c5ed4e3SBram Moolenaar  CheckCanRunGui
22632c5ed4e3SBram Moolenaar
22642c5ed4e3SBram Moolenaar  CheckScriptFailure([
22652c5ed4e3SBram Moolenaar      'vim9script',
22662c5ed4e3SBram Moolenaar      'gui#comment'
22672c5ed4e3SBram Moolenaar      ], 'E499:')
22682c5ed4e3SBram Moolenaar  CheckScriptFailure([
22692c5ed4e3SBram Moolenaar      'vim9script',
22702c5ed4e3SBram Moolenaar      'gui -f#comment'
22712c5ed4e3SBram Moolenaar      ], 'E499:')
22727a092245SBram Moolenaarenddef
22737a092245SBram Moolenaar
2274a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
22756797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
22766797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2277a26b9700SBram Moolenaar
2278a26b9700SBram Moolenaar  edit test.vim
2279a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2280a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2281a26b9700SBram Moolenaar
2282a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2283a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2284a26b9700SBram Moolenaar
2285a26b9700SBram Moolenaar  g:entered = 0
2286a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2287a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2288a26b9700SBram Moolenaar
2289a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2290a26b9700SBram Moolenaar
2291a26b9700SBram Moolenaar  au! TabEnter
2292a26b9700SBram Moolenaar  unlet g:entered
2293d72c1bf0SBram Moolenaar
2294d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2295d72c1bf0SBram Moolenaar      'vim9script',
22966797966dSBram Moolenaar      'g:var = 123',
2297e55b1c09SBram Moolenaar      'b:var = 456',
2298e55b1c09SBram Moolenaar      'w:var = 777',
2299e55b1c09SBram Moolenaar      't:var = 888',
2300d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2301d72c1bf0SBram Moolenaar      ])
2302d72c1bf0SBram Moolenaar
2303d72c1bf0SBram Moolenaar  CheckScriptFailure([
2304d72c1bf0SBram Moolenaar      'vim9script',
2305cfcd011fSBram Moolenaar      'let var = 123',
2306cfcd011fSBram Moolenaar      ], 'E1126: Cannot use :let in Vim9 script')
2307cfcd011fSBram Moolenaar
2308cfcd011fSBram Moolenaar  CheckScriptFailure([
2309cfcd011fSBram Moolenaar      'vim9script',
2310cfcd011fSBram Moolenaar      'var g:var = 123',
2311e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2312e55b1c09SBram Moolenaar
2313e55b1c09SBram Moolenaar  CheckScriptFailure([
2314e55b1c09SBram Moolenaar      'vim9script',
2315cfcd011fSBram Moolenaar      'var b:var = 123',
2316e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2317e55b1c09SBram Moolenaar
2318e55b1c09SBram Moolenaar  CheckScriptFailure([
2319e55b1c09SBram Moolenaar      'vim9script',
2320cfcd011fSBram Moolenaar      'var w:var = 123',
2321e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2322e55b1c09SBram Moolenaar
2323e55b1c09SBram Moolenaar  CheckScriptFailure([
2324e55b1c09SBram Moolenaar      'vim9script',
2325cfcd011fSBram Moolenaar      'var t:var = 123',
2326e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2327e55b1c09SBram Moolenaar
2328e55b1c09SBram Moolenaar  CheckScriptFailure([
2329e55b1c09SBram Moolenaar      'vim9script',
2330cfcd011fSBram Moolenaar      'var v:version = 123',
2331e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2332e55b1c09SBram Moolenaar
2333e55b1c09SBram Moolenaar  CheckScriptFailure([
2334e55b1c09SBram Moolenaar      'vim9script',
2335cfcd011fSBram Moolenaar      'var $VARIABLE = "text"',
2336e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
23376797966dSBram Moolenaar
23386797966dSBram Moolenaar  CheckScriptFailure([
23396797966dSBram Moolenaar      'vim9script',
23406797966dSBram Moolenaar      'g:var = 123',
234132e35117SBram Moolenaar      'unlet g:var# comment1',
2342d72c1bf0SBram Moolenaar      ], 'E108:')
2343d72c1bf0SBram Moolenaar
2344d72c1bf0SBram Moolenaar  CheckScriptFailure([
2345d72c1bf0SBram Moolenaar      'let g:var = 123',
2346d72c1bf0SBram Moolenaar      'unlet g:var # something',
2347d72c1bf0SBram Moolenaar      ], 'E488:')
2348faac4104SBram Moolenaar
2349faac4104SBram Moolenaar  CheckScriptSuccess([
2350faac4104SBram Moolenaar      'vim9script',
235132e35117SBram Moolenaar      'if 1 # comment2',
2352faac4104SBram Moolenaar      '  echo "yes"',
2353faac4104SBram Moolenaar      'elseif 2 #comment',
2354faac4104SBram Moolenaar      '  echo "no"',
2355faac4104SBram Moolenaar      'endif',
2356faac4104SBram Moolenaar      ])
2357faac4104SBram Moolenaar
2358faac4104SBram Moolenaar  CheckScriptFailure([
2359faac4104SBram Moolenaar      'vim9script',
236032e35117SBram Moolenaar      'if 1# comment3',
2361faac4104SBram Moolenaar      '  echo "yes"',
2362faac4104SBram Moolenaar      'endif',
2363faac4104SBram Moolenaar      ], 'E15:')
2364faac4104SBram Moolenaar
2365faac4104SBram Moolenaar  CheckScriptFailure([
2366faac4104SBram Moolenaar      'vim9script',
236732e35117SBram Moolenaar      'if 0 # comment4',
2368faac4104SBram Moolenaar      '  echo "yes"',
2369faac4104SBram Moolenaar      'elseif 2#comment',
2370faac4104SBram Moolenaar      '  echo "no"',
2371faac4104SBram Moolenaar      'endif',
2372faac4104SBram Moolenaar      ], 'E15:')
2373faac4104SBram Moolenaar
2374faac4104SBram Moolenaar  CheckScriptSuccess([
2375faac4104SBram Moolenaar      'vim9script',
2376cfcd011fSBram Moolenaar      'var v = 1 # comment5',
2377faac4104SBram Moolenaar      ])
2378faac4104SBram Moolenaar
2379faac4104SBram Moolenaar  CheckScriptFailure([
2380faac4104SBram Moolenaar      'vim9script',
2381cfcd011fSBram Moolenaar      'var v = 1# comment6',
238232e35117SBram Moolenaar      ], 'E15:')
2383faac4104SBram Moolenaar
2384faac4104SBram Moolenaar  CheckScriptSuccess([
2385faac4104SBram Moolenaar      'vim9script',
2386faac4104SBram Moolenaar      'new'
2387d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2388df069eecSBram Moolenaar      ':$',
2389faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2390faac4104SBram Moolenaar      'bwipe!',
2391faac4104SBram Moolenaar      ])
2392faac4104SBram Moolenaar
2393f5be8cdbSBram Moolenaar  CheckScriptFailure([
2394f5be8cdbSBram Moolenaar      'vim9script',
2395f5be8cdbSBram Moolenaar      'new'
2396d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2397f5be8cdbSBram Moolenaar      ':$',
2398f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2399f5be8cdbSBram Moolenaar      'bwipe!',
2400f5be8cdbSBram Moolenaar      ], 'E488:')
2401f5be8cdbSBram Moolenaar
2402f5be8cdbSBram Moolenaar  CheckScriptFailure([
2403f5be8cdbSBram Moolenaar      'vim9script',
2404f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2405f5be8cdbSBram Moolenaar      ], 'E477:')
2406a26b9700SBram Moolenaarenddef
2407a26b9700SBram Moolenaar
24087e5bd91dSBram Moolenaardef Test_finish()
2409cfcd011fSBram Moolenaar  var lines =<< trim END
24107e5bd91dSBram Moolenaar    vim9script
24116797966dSBram Moolenaar    g:res = 'one'
24127e5bd91dSBram Moolenaar    if v:false | finish | endif
24136797966dSBram Moolenaar    g:res = 'two'
24147e5bd91dSBram Moolenaar    finish
24156797966dSBram Moolenaar    g:res = 'three'
24167e5bd91dSBram Moolenaar  END
24177e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
24187e5bd91dSBram Moolenaar  source Xfinished
24197e5bd91dSBram Moolenaar  assert_equal('two', g:res)
24207e5bd91dSBram Moolenaar
24217e5bd91dSBram Moolenaar  unlet g:res
24227e5bd91dSBram Moolenaar  delete('Xfinished')
24237e5bd91dSBram Moolenaarenddef
24247e5bd91dSBram Moolenaar
2425a5d0077eSBram Moolenaardef Test_forward_declaration()
2426cfcd011fSBram Moolenaar  var lines =<< trim END
2427a5d0077eSBram Moolenaar    vim9script
2428a5d0077eSBram Moolenaar    def GetValue(): string
2429a5d0077eSBram Moolenaar      return theVal
2430a5d0077eSBram Moolenaar    enddef
2431cfcd011fSBram Moolenaar    var theVal = 'something'
2432822ba247SBram Moolenaar    g:initVal = GetValue()
2433a5d0077eSBram Moolenaar    theVal = 'else'
2434a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2435a5d0077eSBram Moolenaar  END
2436a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2437a5d0077eSBram Moolenaar  source Xforward
2438a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2439a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2440a5d0077eSBram Moolenaar
2441a5d0077eSBram Moolenaar  unlet g:initVal
2442a5d0077eSBram Moolenaar  unlet g:laterVal
2443a5d0077eSBram Moolenaar  delete('Xforward')
2444a5d0077eSBram Moolenaarenddef
2445a5d0077eSBram Moolenaar
24469721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
2447cfcd011fSBram Moolenaar  var legacy_lines =<< trim END
24489721fb4eSBram Moolenaar    source Xvim9_script.vim
24499721fb4eSBram Moolenaar
24509721fb4eSBram Moolenaar    call assert_false(exists('local'))
24519721fb4eSBram Moolenaar    call assert_false(exists('exported'))
24529721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
24539721fb4eSBram Moolenaar    call assert_equal('global', global)
24549721fb4eSBram Moolenaar    call assert_equal('global', g:global)
24559721fb4eSBram Moolenaar
24569721fb4eSBram Moolenaar    " imported variable becomes script-local
24579721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
24589721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
24599721fb4eSBram Moolenaar    call assert_false(exists('exported'))
24609721fb4eSBram Moolenaar
24619721fb4eSBram Moolenaar    " imported function becomes script-local
24629721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
24639721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
24649721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
24659721fb4eSBram Moolenaar  END
24669721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
24679721fb4eSBram Moolenaar
2468cfcd011fSBram Moolenaar  var vim9_lines =<< trim END
24699721fb4eSBram Moolenaar    vim9script
2470cfcd011fSBram Moolenaar    var local = 'local'
24719721fb4eSBram Moolenaar    g:global = 'global'
2472cfcd011fSBram Moolenaar    export var exported = 'exported'
24739721fb4eSBram Moolenaar    export def GetText(): string
24749721fb4eSBram Moolenaar       return 'text'
24759721fb4eSBram Moolenaar    enddef
24769721fb4eSBram Moolenaar  END
24779721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
24789721fb4eSBram Moolenaar
24799721fb4eSBram Moolenaar  source Xlegacy_script.vim
24809721fb4eSBram Moolenaar
24819721fb4eSBram Moolenaar  assert_equal('global', g:global)
2482f5be8cdbSBram Moolenaar  unlet g:global
24839721fb4eSBram Moolenaar
24849721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
24859721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
24869721fb4eSBram Moolenaarenddef
2487a5d0077eSBram Moolenaar
24887d699701SBram Moolenaarfunc Test_vim9script_not_global()
24897d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
24907d699701SBram Moolenaar  let vim9lines =<< trim END
24917d699701SBram Moolenaar    vim9script
2492cfcd011fSBram Moolenaar    var name = 'local'
24937d699701SBram Moolenaar    func TheFunc()
24947d699701SBram Moolenaar      echo 'local'
24957d699701SBram Moolenaar    endfunc
24967d699701SBram Moolenaar    def DefFunc()
24977d699701SBram Moolenaar      echo 'local'
24987d699701SBram Moolenaar    enddef
24997d699701SBram Moolenaar  END
25007d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
25017d699701SBram Moolenaar  source Xvim9script.vim
25027d699701SBram Moolenaar  try
25037d699701SBram Moolenaar    echo g:var
25047d699701SBram Moolenaar    assert_report('did not fail')
25057d699701SBram Moolenaar  catch /E121:/
25067d699701SBram Moolenaar    " caught
25077d699701SBram Moolenaar  endtry
25087d699701SBram Moolenaar  try
25097d699701SBram Moolenaar    call TheFunc()
25107d699701SBram Moolenaar    assert_report('did not fail')
25117d699701SBram Moolenaar  catch /E117:/
25127d699701SBram Moolenaar    " caught
25137d699701SBram Moolenaar  endtry
25147d699701SBram Moolenaar  try
25157d699701SBram Moolenaar    call DefFunc()
25167d699701SBram Moolenaar    assert_report('did not fail')
25177d699701SBram Moolenaar  catch /E117:/
25187d699701SBram Moolenaar    " caught
25197d699701SBram Moolenaar  endtry
25207d699701SBram Moolenaar
252125859dd7SBram Moolenaar  call delete('Xvim9script.vim')
25227d699701SBram Moolenaarendfunc
25237d699701SBram Moolenaar
2524eeb27bfeSBram Moolenaardef Test_vim9_copen()
2525eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2526eeb27bfeSBram Moolenaar  copen
2527eeb27bfeSBram Moolenaar  quit
2528eeb27bfeSBram Moolenaarenddef
2529eeb27bfeSBram Moolenaar
25302d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
25312d6b20d6SBram Moolenaardef Test_vim9_autoload()
2532cfcd011fSBram Moolenaar  var lines =<< trim END
25332d6b20d6SBram Moolenaar     vim9script
25342d6b20d6SBram Moolenaar     def foo#test()
25352d6b20d6SBram Moolenaar         echomsg getreg('"')
25362d6b20d6SBram Moolenaar     enddef
25372d6b20d6SBram Moolenaar  END
25382d6b20d6SBram Moolenaar
25392d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
25402d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
2541cfcd011fSBram Moolenaar  var save_rtp = &rtp
25422d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
25432d6b20d6SBram Moolenaar  augroup test
25442d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
25452d6b20d6SBram Moolenaar  augroup END
25462d6b20d6SBram Moolenaar
25472d6b20d6SBram Moolenaar  normal Y
25482d6b20d6SBram Moolenaar
25492d6b20d6SBram Moolenaar  augroup test
25502d6b20d6SBram Moolenaar    autocmd!
25512d6b20d6SBram Moolenaar  augroup END
25522d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
25532d6b20d6SBram Moolenaar  &rtp = save_rtp
25542d6b20d6SBram Moolenaarenddef
25552d6b20d6SBram Moolenaar
255677e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
255777e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
2558cfcd011fSBram Moolenaar  var lines =<< trim END
255977e5dcc3SBram Moolenaar      vim9script
256077e5dcc3SBram Moolenaar      def crash#func()
256177e5dcc3SBram Moolenaar          try
256277e5dcc3SBram Moolenaar              for x in List()
256377e5dcc3SBram Moolenaar              endfor
256477e5dcc3SBram Moolenaar          catch
256577e5dcc3SBram Moolenaar          endtry
256677e5dcc3SBram Moolenaar          g:ok = true
256777e5dcc3SBram Moolenaar      enddef
256877e5dcc3SBram Moolenaar      fu List()
256977e5dcc3SBram Moolenaar          invalid
257077e5dcc3SBram Moolenaar      endfu
257177e5dcc3SBram Moolenaar      try
257277e5dcc3SBram Moolenaar          invalid
257377e5dcc3SBram Moolenaar      catch /wontmatch/
257477e5dcc3SBram Moolenaar      endtry
257577e5dcc3SBram Moolenaar  END
257677e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
257777e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
257877e5dcc3SBram Moolenaar
257977e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
258077e5dcc3SBram Moolenaar  lines =<< trim END
258177e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
258277e5dcc3SBram Moolenaar    call crash#func()
258377e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
25849c4f5520SBram Moolenaar    qall!
258577e5dcc3SBram Moolenaar  END
258677e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
258777e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
258877e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
258977e5dcc3SBram Moolenaar
259077e5dcc3SBram Moolenaar  delete('Xdidit')
259177e5dcc3SBram Moolenaar  delete('Xscript')
259277e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
259377e5dcc3SBram Moolenaarenddef
259477e5dcc3SBram Moolenaar
259581e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
259681e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
259781e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
2598cfcd011fSBram Moolenaar  var lines =<< trim END
259981e17fbeSBram Moolenaar    let s:counter = 1
260081e17fbeSBram Moolenaar    def s:Func()
260181e17fbeSBram Moolenaar      au! CursorHold
260281e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
260381e17fbeSBram Moolenaar    enddef
260481e17fbeSBram Moolenaar    call s:Func()
260581e17fbeSBram Moolenaar    doau CursorHold
260681e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
260781e17fbeSBram Moolenaar    au! CursorHold
260881e17fbeSBram Moolenaar  END
260981e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
261081e17fbeSBram Moolenaarenddef
261181e17fbeSBram Moolenaar
26123896a105SBram Moolenaardef Test_cmdline_win()
26133896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
26143896a105SBram Moolenaar  # the command line window.
26153896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
2616cfcd011fSBram Moolenaar  var export_lines =<< trim END
26173896a105SBram Moolenaar    vim9script
2618cfcd011fSBram Moolenaar    export var That = 'yes'
26193896a105SBram Moolenaar  END
26203896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
2621cfcd011fSBram Moolenaar  var import_lines =<< trim END
26223896a105SBram Moolenaar    vim9script
26233896a105SBram Moolenaar    import That from './Xexport.vim'
26243896a105SBram Moolenaar  END
26253896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
2626cfcd011fSBram Moolenaar  var save_rtp = &rtp
26273896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
26283896a105SBram Moolenaar  syntax on
26293896a105SBram Moolenaar  augroup CmdWin
26303896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
26313896a105SBram Moolenaar  augroup END
26323896a105SBram Moolenaar  # this will open and also close the cmdline window
26333896a105SBram Moolenaar  feedkeys('q:', 'xt')
26343896a105SBram Moolenaar  assert_equal('yes', g:got_there)
26353896a105SBram Moolenaar
26363896a105SBram Moolenaar  augroup CmdWin
26373896a105SBram Moolenaar    au!
26383896a105SBram Moolenaar  augroup END
26393896a105SBram Moolenaar  &rtp = save_rtp
26403896a105SBram Moolenaar  delete('rtp', 'rf')
26413896a105SBram Moolenaarenddef
26423896a105SBram Moolenaar
2643e3d4685fSBram Moolenaardef Test_invalid_sid()
2644e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
264525859dd7SBram Moolenaar
26469c4f5520SBram Moolenaar  if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
2647d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
2648e3d4685fSBram Moolenaar  endif
2649e3d4685fSBram Moolenaar  delete('Xdidit')
2650e3d4685fSBram Moolenaarenddef
2651e3d4685fSBram Moolenaar
2652f0afd9e1SBram Moolenaardef Test_unset_any_variable()
2653cfcd011fSBram Moolenaar  var lines =<< trim END
2654cfcd011fSBram Moolenaar    var name: any
2655cfcd011fSBram Moolenaar    assert_equal(0, name)
2656f0afd9e1SBram Moolenaar  END
2657f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2658f0afd9e1SBram Moolenaarenddef
2659f0afd9e1SBram Moolenaar
26607e9210eaSBram Moolenaarfunc Test_define_func_at_command_line()
266158dbef33SBram Moolenaar  CheckRunVimInTerminal
266258dbef33SBram Moolenaar
26637e9210eaSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
26647e9210eaSBram Moolenaar  call Run_Test_define_func_at_command_line()
26657e9210eaSBram Moolenaarendfunc
26667e9210eaSBram Moolenaar
26677e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line()
26689c4f5520SBram Moolenaar  # run in a separate Vim instance to avoid the script context
2669cfcd011fSBram Moolenaar  var lines =<< trim END
26709c4f5520SBram Moolenaar    func CheckAndQuit()
26719c4f5520SBram Moolenaar      call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
26729c4f5520SBram Moolenaar      call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
26739c4f5520SBram Moolenaar    endfunc
26749c4f5520SBram Moolenaar  END
26759c4f5520SBram Moolenaar  writefile([''], 'Xdidcmd')
26769c4f5520SBram Moolenaar  writefile(lines, 'XcallFunc')
2677cfcd011fSBram Moolenaar  var buf = RunVimInTerminal('-S XcallFunc', #{rows: 6})
26789c4f5520SBram Moolenaar  # define Afunc() on the command line
26799c4f5520SBram Moolenaar  term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
26809c4f5520SBram Moolenaar  term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
26819c4f5520SBram Moolenaar  WaitForAssert({-> assert_equal(['errors: []'], readfile('Xdidcmd'))})
26829c4f5520SBram Moolenaar
26839c4f5520SBram Moolenaar  call StopVimInTerminal(buf)
26849c4f5520SBram Moolenaar  delete('XcallFunc')
26859c4f5520SBram Moolenaar  delete('Xdidcmd')
26869c4f5520SBram Moolenaarenddef
26879c4f5520SBram Moolenaar
2688fcdc5d83SBram Moolenaardef Test_script_var_scope()
2689fcdc5d83SBram Moolenaar  var lines =<< trim END
2690fcdc5d83SBram Moolenaar      vim9script
2691fcdc5d83SBram Moolenaar      if true
2692fcdc5d83SBram Moolenaar        if true
2693fcdc5d83SBram Moolenaar          var one = 'one'
2694fcdc5d83SBram Moolenaar          echo one
2695fcdc5d83SBram Moolenaar        endif
2696fcdc5d83SBram Moolenaar        echo one
2697fcdc5d83SBram Moolenaar      endif
2698fcdc5d83SBram Moolenaar  END
2699fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
2700fcdc5d83SBram Moolenaar
2701fcdc5d83SBram Moolenaar  lines =<< trim END
2702fcdc5d83SBram Moolenaar      vim9script
2703fcdc5d83SBram Moolenaar      if true
2704fcdc5d83SBram Moolenaar        if false
2705fcdc5d83SBram Moolenaar          var one = 'one'
2706fcdc5d83SBram Moolenaar          echo one
2707fcdc5d83SBram Moolenaar        else
2708fcdc5d83SBram Moolenaar          var one = 'one'
2709fcdc5d83SBram Moolenaar          echo one
2710fcdc5d83SBram Moolenaar        endif
2711fcdc5d83SBram Moolenaar        echo one
2712fcdc5d83SBram Moolenaar      endif
2713fcdc5d83SBram Moolenaar  END
2714fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 10)
2715fcdc5d83SBram Moolenaar
2716fcdc5d83SBram Moolenaar  lines =<< trim END
2717fcdc5d83SBram Moolenaar      vim9script
2718fcdc5d83SBram Moolenaar      while true
2719fcdc5d83SBram Moolenaar        var one = 'one'
2720fcdc5d83SBram Moolenaar        echo one
2721fcdc5d83SBram Moolenaar        break
2722fcdc5d83SBram Moolenaar      endwhile
2723fcdc5d83SBram Moolenaar      echo one
2724fcdc5d83SBram Moolenaar  END
2725fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 7)
2726fcdc5d83SBram Moolenaar
2727fcdc5d83SBram Moolenaar  lines =<< trim END
2728fcdc5d83SBram Moolenaar      vim9script
2729fcdc5d83SBram Moolenaar      for i in range(1)
2730fcdc5d83SBram Moolenaar        var one = 'one'
2731fcdc5d83SBram Moolenaar        echo one
2732fcdc5d83SBram Moolenaar      endfor
2733fcdc5d83SBram Moolenaar      echo one
2734fcdc5d83SBram Moolenaar  END
2735fcdc5d83SBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
2736*9becdf2bSBram Moolenaar
2737*9becdf2bSBram Moolenaar  lines =<< trim END
2738*9becdf2bSBram Moolenaar      vim9script
2739*9becdf2bSBram Moolenaar      {
2740*9becdf2bSBram Moolenaar        var one = 'one'
2741*9becdf2bSBram Moolenaar        assert_equal('one', one)
2742*9becdf2bSBram Moolenaar      }
2743*9becdf2bSBram Moolenaar      assert_false(exists('one'))
2744*9becdf2bSBram Moolenaar      assert_false(exists('s:one'))
2745*9becdf2bSBram Moolenaar  END
2746*9becdf2bSBram Moolenaar  CheckScriptSuccess(lines)
2747*9becdf2bSBram Moolenaar
2748*9becdf2bSBram Moolenaar  lines =<< trim END
2749*9becdf2bSBram Moolenaar      vim9script
2750*9becdf2bSBram Moolenaar      {
2751*9becdf2bSBram Moolenaar        var one = 'one'
2752*9becdf2bSBram Moolenaar        echo one
2753*9becdf2bSBram Moolenaar      }
2754*9becdf2bSBram Moolenaar      echo one
2755*9becdf2bSBram Moolenaar  END
2756*9becdf2bSBram Moolenaar  CheckScriptFailure(lines, 'E121:', 6)
2757fcdc5d83SBram Moolenaarenddef
2758fcdc5d83SBram Moolenaar
2759585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2760585fea7bSBram Moolenaardef Test_substitute_cmd()
2761585fea7bSBram Moolenaar  new
2762585fea7bSBram Moolenaar  setline(1, 'something')
2763585fea7bSBram Moolenaar  :substitute(some(other(
2764585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2765585fea7bSBram Moolenaar  bwipe!
2766585fea7bSBram Moolenaar
2767f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2768cfcd011fSBram Moolenaar  var lines =<< trim END
2769585fea7bSBram Moolenaar    vim9script
2770585fea7bSBram Moolenaar    new
2771585fea7bSBram Moolenaar    setline(1, 'something')
2772585fea7bSBram Moolenaar    :substitute(some(other(
2773585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2774585fea7bSBram Moolenaar    bwipe!
2775585fea7bSBram Moolenaar  END
2776585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2777585fea7bSBram Moolenaar  source Xvim9lines
2778585fea7bSBram Moolenaar
2779585fea7bSBram Moolenaar  delete('Xvim9lines')
2780585fea7bSBram Moolenaarenddef
2781585fea7bSBram Moolenaar
27828a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2783