18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4ad39c094SBram Moolenaarsource view_util.vim
5673660abSBram Moolenaar
68a7d6542SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message.
78a7d6542SBram Moolenaarfunc CheckDefFailure(lines, error)
8978d170bSBram Moolenaar  call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef')
98a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
108a7d6542SBram Moolenaar  call delete('Xdef')
118a7d6542SBram Moolenaarendfunc
128a7d6542SBram Moolenaar
137a092245SBram Moolenaardef CheckScriptFailure(lines: list<string>, error: string)
147a092245SBram Moolenaar  writefile(lines, 'Xdef')
157a092245SBram Moolenaar  assert_fails('so Xdef', error, lines)
167a092245SBram Moolenaar  delete('Xdef')
177a092245SBram Moolenaarenddef
187a092245SBram Moolenaar
197a092245SBram Moolenaardef CheckScriptSuccess(lines: list<string>)
207a092245SBram Moolenaar  writefile(lines, 'Xdef')
217a092245SBram Moolenaar  so Xdef
227a092245SBram Moolenaar  delete('Xdef')
237a092245SBram Moolenaarenddef
248a7d6542SBram Moolenaar
258a7d6542SBram Moolenaardef Test_syntax()
268a7d6542SBram Moolenaar  let var = 234
278a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
288a7d6542SBram Moolenaarenddef
298a7d6542SBram Moolenaar
306e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
316e587dcbSBram Moolenaarlet s:addToMe = 111
32401d9ffbSBram Moolenaarlet g:existing = 'yes'
33a8c17704SBram Moolenaarlet g:inc_counter = 1
34a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
356e587dcbSBram Moolenaar
368a7d6542SBram Moolenaardef Test_assignment()
378a7d6542SBram Moolenaar  let bool1: bool = true
388a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
398a7d6542SBram Moolenaar  let bool2: bool = false
408a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
418a7d6542SBram Moolenaar
420c2ca58eSBram Moolenaar  let list1: list<bool> = [false, true, false]
438a7d6542SBram Moolenaar  let list2: list<number> = [1, 2, 3]
440c2ca58eSBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
450c2ca58eSBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
460c2ca58eSBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
478a7d6542SBram Moolenaar
48436472f5SBram Moolenaar  let listS: list<string> = []
49436472f5SBram Moolenaar  let listN: list<number> = []
508a7d6542SBram Moolenaar
510c2ca58eSBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
528a7d6542SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
530c2ca58eSBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
540c2ca58eSBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
550c2ca58eSBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, tw: 0z02}
56b283a8a6SBram Moolenaar
579be61bbbSBram Moolenaar  let a: number = 6
589be61bbbSBram Moolenaar  assert_equal(6, a)
599be61bbbSBram Moolenaar
6042a480bfSBram Moolenaar  if has('channel')
6142a480bfSBram Moolenaar    let chan1: channel
62fbdd08edSBram Moolenaar    let job1: job
63f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
6442a480bfSBram Moolenaar  endif
65fbdd08edSBram Moolenaar  if has('float')
66fbdd08edSBram Moolenaar    let float1: float = 3.4
67fbdd08edSBram Moolenaar  endif
685deeb3f1SBram Moolenaar  let Funky1: func
695deeb3f1SBram Moolenaar  let Funky2: func = function('len')
705deeb3f1SBram Moolenaar  let Party2: func = funcref('Test_syntax')
7142a480bfSBram Moolenaar
72cb711abfSBram Moolenaar  # type becomes list<any>
7361a6d4e4SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
74cb711abfSBram Moolenaar  # type becomes dict<any>
755381c7a1SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
7661a6d4e4SBram Moolenaar
77401d9ffbSBram Moolenaar  g:newvar = 'new'
78401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
79401d9ffbSBram Moolenaar
80401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
81401d9ffbSBram Moolenaar  g:existing = 'no'
82401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
83401d9ffbSBram Moolenaar
84b283a8a6SBram Moolenaar  v:char = 'abc'
856e587dcbSBram Moolenaar  assert_equal('abc', v:char)
86b283a8a6SBram Moolenaar
87b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
886e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
89b283a8a6SBram Moolenaar  $ENVVAR = ''
906e587dcbSBram Moolenaar
91fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
92fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
93fd1823e0SBram Moolenaar  s:addToMe += 222
94fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
950bbf722aSBram Moolenaar  s:newVar = 'new'
960bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
97a8c17704SBram Moolenaar
98a8c17704SBram Moolenaar  set ts=7
99a8c17704SBram Moolenaar  &ts += 1
100a8c17704SBram Moolenaar  assert_equal(8, &ts)
10180c34ca3SBram Moolenaar  &ts -= 3
10280c34ca3SBram Moolenaar  assert_equal(5, &ts)
10380c34ca3SBram Moolenaar  &ts *= 2
10480c34ca3SBram Moolenaar  assert_equal(10, &ts)
10580c34ca3SBram Moolenaar  &ts /= 3
10680c34ca3SBram Moolenaar  assert_equal(3, &ts)
10780c34ca3SBram Moolenaar  set ts=10
10880c34ca3SBram Moolenaar  &ts %= 4
10980c34ca3SBram Moolenaar  assert_equal(2, &ts)
110a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
111a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
112a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
113cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
114585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
11580c34ca3SBram Moolenaar  &ts = 8
116a8c17704SBram Moolenaar
117a8c17704SBram Moolenaar  g:inc_counter += 1
118a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
119a8c17704SBram Moolenaar
120a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
121a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
122a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
123a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
124a8c17704SBram Moolenaar
125a8c17704SBram Moolenaar  @a = 'areg'
126a8c17704SBram Moolenaar  @a ..= 'add'
127a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
128a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
129a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
130e69f6d04SBram Moolenaar
131e69f6d04SBram Moolenaar  v:errmsg = 'none'
132e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
133e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
134e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
135e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
1365deeb3f1SBram Moolenaarenddef
1375deeb3f1SBram Moolenaar
1385deeb3f1SBram Moolenaardef Test_assignment_default()
139e69f6d04SBram Moolenaar
140cb711abfSBram Moolenaar  # Test default values.
141e69f6d04SBram Moolenaar  let thebool: bool
142e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
143e69f6d04SBram Moolenaar
144e69f6d04SBram Moolenaar  let thenumber: number
145e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
146e69f6d04SBram Moolenaar
147e69f6d04SBram Moolenaar  if has('float')
148e69f6d04SBram Moolenaar    let thefloat: float
149e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
150e69f6d04SBram Moolenaar  endif
151e69f6d04SBram Moolenaar
152e69f6d04SBram Moolenaar  let thestring: string
153e69f6d04SBram Moolenaar  assert_equal('', thestring)
154e69f6d04SBram Moolenaar
155e69f6d04SBram Moolenaar  let theblob: blob
156e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
157e69f6d04SBram Moolenaar
1585deeb3f1SBram Moolenaar  let Thefunc: func
1595deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
160e69f6d04SBram Moolenaar
161e69f6d04SBram Moolenaar  let thelist: list<any>
162e69f6d04SBram Moolenaar  assert_equal([], thelist)
163e69f6d04SBram Moolenaar
164e69f6d04SBram Moolenaar  let thedict: dict<any>
165e69f6d04SBram Moolenaar  assert_equal({}, thedict)
166e69f6d04SBram Moolenaar
1672c869deeSBram Moolenaar  if has('channel')
168e69f6d04SBram Moolenaar    let thejob: job
169e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
170e69f6d04SBram Moolenaar
171e69f6d04SBram Moolenaar    let thechannel: channel
172e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
1732c869deeSBram Moolenaar  endif
174585fea7bSBram Moolenaar
175585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
176585fea7bSBram Moolenaar  assert_equal(5678, nr)
1778a7d6542SBram Moolenaarenddef
1788a7d6542SBram Moolenaar
179cab27678SBram Moolenaardef Mess(): string
180cab27678SBram Moolenaar  v:foldstart = 123
181cab27678SBram Moolenaar  return 'xxx'
182cab27678SBram Moolenaarenddef
183cab27678SBram Moolenaar
1848a7d6542SBram Moolenaarfunc Test_assignment_failure()
1858a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
1868a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
1878a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
1888a7d6542SBram Moolenaar
1898a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
1908a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
1918a7d6542SBram Moolenaar
1929be61bbbSBram Moolenaar  call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
1939be61bbbSBram Moolenaar
194e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
1959be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
1969be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
1979be61bbbSBram Moolenaar
1989be61bbbSBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1065:')
1999be61bbbSBram Moolenaar
2009be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
2019be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
2029be61bbbSBram Moolenaar
2039be61bbbSBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016:')
2049be61bbbSBram Moolenaar
2059be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
2069be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
2079be61bbbSBram Moolenaar
20833fa29cfSBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
20933fa29cfSBram Moolenaar
2108a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
2118a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
2128a7d6542SBram Moolenaar
2138a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
2148a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
2158a7d6542SBram Moolenaar
2168a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
2178a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
21842a480bfSBram Moolenaar
219d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
22042a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
221cab27678SBram Moolenaar
222cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
223cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
224599c89c8SBram Moolenaarendfunc
225599c89c8SBram Moolenaar
226599c89c8SBram Moolenaarfunc Test_wrong_type()
227599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
228599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
229599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
230599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
231599c89c8SBram Moolenaar
232599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
233599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
23442a480bfSBram Moolenaar
23542a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
23642a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
23742a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
23842a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
23942a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
24042a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
24142a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
24242a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
24342a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
24442a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
24542a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
2468a7d6542SBram Moolenaarendfunc
2478a7d6542SBram Moolenaar
2488a7d6542SBram Moolenaarfunc Test_const()
2498a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
2508a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
2518a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
2529be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
2538a7d6542SBram Moolenaarendfunc
2548a7d6542SBram Moolenaar
2558a7d6542SBram Moolenaardef Test_block()
2568a7d6542SBram Moolenaar  let outer = 1
2578a7d6542SBram Moolenaar  {
2588a7d6542SBram Moolenaar    let inner = 2
2598a7d6542SBram Moolenaar    assert_equal(1, outer)
2608a7d6542SBram Moolenaar    assert_equal(2, inner)
2618a7d6542SBram Moolenaar  }
2628a7d6542SBram Moolenaar  assert_equal(1, outer)
2638a7d6542SBram Moolenaarenddef
2648a7d6542SBram Moolenaar
2658a7d6542SBram Moolenaarfunc Test_block_failure()
2668a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
267585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
268585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
2698a7d6542SBram Moolenaarendfunc
2708a7d6542SBram Moolenaar
271585fea7bSBram Moolenaardef Test_cmd_modifier()
272585fea7bSBram Moolenaar  tab echo '0'
273585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
274585fea7bSBram Moolenaarenddef
275585fea7bSBram Moolenaar
2768a7d6542SBram Moolenaardef Test_try_catch()
2778a7d6542SBram Moolenaar  let l = []
2787a092245SBram Moolenaar  try # comment
2798a7d6542SBram Moolenaar    add(l, '1')
2808a7d6542SBram Moolenaar    throw 'wrong'
2818a7d6542SBram Moolenaar    add(l, '2')
2827a092245SBram Moolenaar  catch # comment
2838a7d6542SBram Moolenaar    add(l, v:exception)
2847a092245SBram Moolenaar  finally # comment
2858a7d6542SBram Moolenaar    add(l, '3')
2867a092245SBram Moolenaar  endtry # comment
2878a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
2888a7d6542SBram Moolenaarenddef
2898a7d6542SBram Moolenaar
290257cc5eeSBram Moolenaardef ThrowFromDef()
291257cc5eeSBram Moolenaar  throw 'getout'
292257cc5eeSBram Moolenaarenddef
293257cc5eeSBram Moolenaar
294257cc5eeSBram Moolenaarfunc CatchInFunc()
295257cc5eeSBram Moolenaar  try
296257cc5eeSBram Moolenaar    call ThrowFromDef()
297257cc5eeSBram Moolenaar  catch
298257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
299257cc5eeSBram Moolenaar  endtry
300257cc5eeSBram Moolenaarendfunc
301257cc5eeSBram Moolenaar
302257cc5eeSBram Moolenaardef CatchInDef()
303257cc5eeSBram Moolenaar  try
304257cc5eeSBram Moolenaar    ThrowFromDef()
305257cc5eeSBram Moolenaar  catch
306257cc5eeSBram Moolenaar    g:thrown_def = v:exception
307257cc5eeSBram Moolenaar  endtry
308257cc5eeSBram Moolenaarenddef
309257cc5eeSBram Moolenaar
310f575adffSBram Moolenaardef ReturnFinally(): string
311f575adffSBram Moolenaar  try
312f575adffSBram Moolenaar    return 'intry'
313f575adffSBram Moolenaar  finally
314f575adffSBram Moolenaar    g:in_finally = 'finally'
315f575adffSBram Moolenaar  endtry
316f575adffSBram Moolenaar  return 'end'
317f575adffSBram Moolenaarenddef
318f575adffSBram Moolenaar
319257cc5eeSBram Moolenaardef Test_try_catch_nested()
320257cc5eeSBram Moolenaar  CatchInFunc()
321257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
322257cc5eeSBram Moolenaar
323257cc5eeSBram Moolenaar  CatchInDef()
324257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
325f575adffSBram Moolenaar
326f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
327f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
328f575adffSBram Moolenaarenddef
329f575adffSBram Moolenaar
330f575adffSBram Moolenaardef Test_try_catch_match()
331f575adffSBram Moolenaar  let seq = 'a'
332f575adffSBram Moolenaar  try
333f575adffSBram Moolenaar    throw 'something'
334f575adffSBram Moolenaar  catch /nothing/
335f575adffSBram Moolenaar    seq ..= 'x'
336f575adffSBram Moolenaar  catch /some/
337f575adffSBram Moolenaar    seq ..= 'b'
338f575adffSBram Moolenaar  catch /asdf/
339f575adffSBram Moolenaar    seq ..= 'x'
340e8c4abbbSBram Moolenaar  catch ?a\?sdf?
341e8c4abbbSBram Moolenaar    seq ..= 'y'
342f575adffSBram Moolenaar  finally
343f575adffSBram Moolenaar    seq ..= 'c'
344f575adffSBram Moolenaar  endtry
345f575adffSBram Moolenaar  assert_equal('abc', seq)
346257cc5eeSBram Moolenaarenddef
347257cc5eeSBram Moolenaar
348e8c4abbbSBram Moolenaardef Test_try_catch_fails()
349e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
350e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
351e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
352585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
353585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
354585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
355585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
356585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
357585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
358585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
359585fea7bSBram Moolenaar
360585fea7bSBram Moolenaar  call CheckDefFailure(['throw'], 'E471:')
361585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
362e8c4abbbSBram Moolenaarenddef
363e8c4abbbSBram Moolenaar
3648a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
3658a7d6542SBram Moolenaar  vim9script
3668a7d6542SBram Moolenaar  let name: string = 'bob'
3678a7d6542SBram Moolenaar  def Concat(arg: string): string
3688a7d6542SBram Moolenaar    return name .. arg
3698a7d6542SBram Moolenaar  enddef
3708a7d6542SBram Moolenaar  let g:result = Concat('bie')
3718a7d6542SBram Moolenaar  let g:localname = name
3728a7d6542SBram Moolenaar
3738a7d6542SBram Moolenaar  export const CONST = 1234
3748a7d6542SBram Moolenaar  export let exported = 9876
3756e587dcbSBram Moolenaar  export let exp_name = 'John'
3768a7d6542SBram Moolenaar  export def Exported(): string
3778a7d6542SBram Moolenaar    return 'Exported'
3788a7d6542SBram Moolenaar  enddef
3798a7d6542SBram MoolenaarEND
3808a7d6542SBram Moolenaar
3815269bd2aSBram Moolenaardef Test_vim9_import_export()
3828a7d6542SBram Moolenaar  let import_script_lines =<< trim END
3838a7d6542SBram Moolenaar    vim9script
3848a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
3858a7d6542SBram Moolenaar    g:imported = exported
3866e587dcbSBram Moolenaar    exported += 3
3876e587dcbSBram Moolenaar    g:imported_added = exported
3888a7d6542SBram Moolenaar    g:imported_func = Exported()
3896e587dcbSBram Moolenaar
3906e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
3916e587dcbSBram Moolenaar    g:imported_name = exp_name
3926e587dcbSBram Moolenaar    exp_name ..= ' Doe'
3936e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
3945381c7a1SBram Moolenaar    g:imported_later = exported
3958a7d6542SBram Moolenaar  END
3968a7d6542SBram Moolenaar
3978a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
3988a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
3998a7d6542SBram Moolenaar
4008a7d6542SBram Moolenaar  source Ximport.vim
4018a7d6542SBram Moolenaar
4028a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
4038a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
4048a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
4056e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
4065381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
4078a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
4086e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
4096e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
4108a7d6542SBram Moolenaar  assert_false(exists('g:name'))
4118a7d6542SBram Moolenaar
4128a7d6542SBram Moolenaar  unlet g:result
4138a7d6542SBram Moolenaar  unlet g:localname
4148a7d6542SBram Moolenaar  unlet g:imported
4156e587dcbSBram Moolenaar  unlet g:imported_added
4165381c7a1SBram Moolenaar  unlet g:imported_later
4178a7d6542SBram Moolenaar  unlet g:imported_func
4186e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
4198a7d6542SBram Moolenaar  delete('Ximport.vim')
420f2d5c240SBram Moolenaar
4215381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
4225381c7a1SBram Moolenaar    vim9script
4235381c7a1SBram Moolenaar    def ImportInDef()
4245381c7a1SBram Moolenaar      import exported from './Xexport.vim'
4255381c7a1SBram Moolenaar      g:imported = exported
4265381c7a1SBram Moolenaar      exported += 7
4275381c7a1SBram Moolenaar      g:imported_added = exported
4285381c7a1SBram Moolenaar    enddef
4295381c7a1SBram Moolenaar    ImportInDef()
4305381c7a1SBram Moolenaar  END
4315381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
4325381c7a1SBram Moolenaar  source Ximport2.vim
4335381c7a1SBram Moolenaar  " TODO: this should be 9879
4345381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
4355381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
4365381c7a1SBram Moolenaar  unlet g:imported
4375381c7a1SBram Moolenaar  unlet g:imported_added
4385381c7a1SBram Moolenaar  delete('Ximport2.vim')
4395381c7a1SBram Moolenaar
440f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
441f2d5c240SBram Moolenaar    vim9script
442f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
443f2d5c240SBram Moolenaar    def UseExport()
444f2d5c240SBram Moolenaar      g:imported = Export.exported
445f2d5c240SBram Moolenaar    enddef
446f2d5c240SBram Moolenaar    UseExport()
447f2d5c240SBram Moolenaar  END
448f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
449f2d5c240SBram Moolenaar  source Ximport.vim
4505381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
451f2d5c240SBram Moolenaar
452599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
453599c89c8SBram Moolenaar    vim9script
454599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
455599c89c8SBram Moolenaar    def Func()
456599c89c8SBram Moolenaar      let dummy = 1
457599c89c8SBram Moolenaar      let imported = Export + dummy
458599c89c8SBram Moolenaar    enddef
459599c89c8SBram Moolenaar  END
460599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
461599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
462599c89c8SBram Moolenaar
463599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
464599c89c8SBram Moolenaar    vim9script
465599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
466599c89c8SBram Moolenaar    def Func()
467599c89c8SBram Moolenaar      let imported = Export . exported
468599c89c8SBram Moolenaar    enddef
469599c89c8SBram Moolenaar  END
470599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
471599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
472599c89c8SBram Moolenaar
473599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
474599c89c8SBram Moolenaar    vim9script
475599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
476599c89c8SBram Moolenaar    def Func()
477599c89c8SBram Moolenaar      let imported = Export.
478599c89c8SBram Moolenaar    enddef
479599c89c8SBram Moolenaar  END
480599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
481599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
482599c89c8SBram Moolenaar
483f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
484f2d5c240SBram Moolenaar    vim9script
485f2d5c240SBram Moolenaar    import * from './Xexport.vim'
486f2d5c240SBram Moolenaar    g:imported = exported
487f2d5c240SBram Moolenaar  END
488f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
489f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
490f2d5c240SBram Moolenaar
491fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
492fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
493fa29c8abSBram Moolenaar    vim9script
494fa29c8abSBram Moolenaar    import name from './Xexport.vim'
495fa29c8abSBram Moolenaar  END
496fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
497fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
498fa29c8abSBram Moolenaar
4995269bd2aSBram Moolenaar  " try to import something that is already defined
5005269bd2aSBram Moolenaar  let import_already_defined =<< trim END
5015269bd2aSBram Moolenaar    vim9script
5025269bd2aSBram Moolenaar    let exported = 'something'
5035269bd2aSBram Moolenaar    import exported from './Xexport.vim'
5045269bd2aSBram Moolenaar  END
5055269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5065269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5075269bd2aSBram Moolenaar
5085269bd2aSBram Moolenaar  " try to import something that is already defined
5095269bd2aSBram Moolenaar  import_already_defined =<< trim END
5105269bd2aSBram Moolenaar    vim9script
5115269bd2aSBram Moolenaar    let exported = 'something'
5125269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
5135269bd2aSBram Moolenaar  END
5145269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5155269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5165269bd2aSBram Moolenaar
5175269bd2aSBram Moolenaar  " try to import something that is already defined
5185269bd2aSBram Moolenaar  import_already_defined =<< trim END
5195269bd2aSBram Moolenaar    vim9script
5205269bd2aSBram Moolenaar    let exported = 'something'
5215269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
5225269bd2aSBram Moolenaar  END
5235269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5245269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5255269bd2aSBram Moolenaar
526fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
527fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
528fa29c8abSBram Moolenaar    vim9script
529fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
530fa29c8abSBram Moolenaar  END
531fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
532fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
533fa29c8abSBram Moolenaar
534fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
535fa29c8abSBram Moolenaar    vim9script
536fa29c8abSBram Moolenaar    import name './Xexport.vim'
537fa29c8abSBram Moolenaar  END
538fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
539fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
540fa29c8abSBram Moolenaar
541fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
542fa29c8abSBram Moolenaar    vim9script
543fa29c8abSBram Moolenaar    import name from Xexport.vim
544fa29c8abSBram Moolenaar  END
545fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
546fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
547fa29c8abSBram Moolenaar
548fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
549fa29c8abSBram Moolenaar    vim9script
550fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
551fa29c8abSBram Moolenaar  END
552fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
553fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
554fa29c8abSBram Moolenaar
555fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
556fa29c8abSBram Moolenaar    vim9script
557fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
558fa29c8abSBram Moolenaar  END
5595269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
5605269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
561fa29c8abSBram Moolenaar
562f2d5c240SBram Moolenaar  delete('Ximport.vim')
5635269bd2aSBram Moolenaar  delete('Ximport3.vim')
5648a7d6542SBram Moolenaar  delete('Xexport.vim')
5658a7d6542SBram Moolenaar
566750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
567750802b5SBram Moolenaar  set cpo&vi
568750802b5SBram Moolenaar  let cpo_before = &cpo
569750802b5SBram Moolenaar  let lines =<< trim END
570750802b5SBram Moolenaar    vim9script
571750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
572750802b5SBram Moolenaar  END
573750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
574750802b5SBram Moolenaar  source Xvim9_script
575750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
576750802b5SBram Moolenaar  set cpo&vim
577750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
578750802b5SBram Moolenaar  delete('Xvim9_script')
579750802b5SBram Moolenaarenddef
580750802b5SBram Moolenaar
581750802b5SBram Moolenaardef Test_vim9script_fails()
5828a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
5838a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
584750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
585f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
586750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
587750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
588750802b5SBram Moolenaar
589750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
590750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
5918a7d6542SBram Moolenaarenddef
5928a7d6542SBram Moolenaar
5938a7d6542SBram Moolenaardef Test_vim9script_reload()
5948a7d6542SBram Moolenaar  let lines =<< trim END
5958a7d6542SBram Moolenaar    vim9script
5968a7d6542SBram Moolenaar    const var = ''
5978a7d6542SBram Moolenaar    let valone = 1234
5988a7d6542SBram Moolenaar    def MyFunc(arg: string)
5998a7d6542SBram Moolenaar       valone = 5678
6008a7d6542SBram Moolenaar    enddef
6018a7d6542SBram Moolenaar  END
6028a7d6542SBram Moolenaar  let morelines =<< trim END
6038a7d6542SBram Moolenaar    let valtwo = 222
6048a7d6542SBram Moolenaar    export def GetValtwo(): number
6058a7d6542SBram Moolenaar      return valtwo
6068a7d6542SBram Moolenaar    enddef
6078a7d6542SBram Moolenaar  END
608675f716eSBram Moolenaar  writefile(lines + morelines,
609675f716eSBram Moolenaar            'Xreload.vim')
6108a7d6542SBram Moolenaar  source Xreload.vim
6118a7d6542SBram Moolenaar  source Xreload.vim
6128a7d6542SBram Moolenaar  source Xreload.vim
6138a7d6542SBram Moolenaar
6148a7d6542SBram Moolenaar  let testlines =<< trim END
6158a7d6542SBram Moolenaar    vim9script
6168a7d6542SBram Moolenaar    def TheFunc()
6178a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
6188a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
6198a7d6542SBram Moolenaar    enddef
6208a7d6542SBram Moolenaar    TheFunc()
6218a7d6542SBram Moolenaar  END
6228a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
6238a7d6542SBram Moolenaar  source Ximport.vim
6248a7d6542SBram Moolenaar
6258a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
6268a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
6278a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
6288a7d6542SBram Moolenaar  source Xreload.vim
6298a7d6542SBram Moolenaar  source Ximport.vim
6308a7d6542SBram Moolenaar
6318a7d6542SBram Moolenaar  " cannot declare a var twice
6328a7d6542SBram Moolenaar  lines =<< trim END
6338a7d6542SBram Moolenaar    vim9script
6348a7d6542SBram Moolenaar    let valone = 1234
6358a7d6542SBram Moolenaar    let valone = 5678
6368a7d6542SBram Moolenaar  END
6378a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
6388a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
6398a7d6542SBram Moolenaar
6408a7d6542SBram Moolenaar  delete('Xreload.vim')
6418a7d6542SBram Moolenaar  delete('Ximport.vim')
6428a7d6542SBram Moolenaarenddef
6438a7d6542SBram Moolenaar
6448a7d6542SBram Moolenaardef Test_import_absolute()
6458a7d6542SBram Moolenaar  let import_lines = [
646e6085c53SBram Moolenaar        'vim9script',
647e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
648e6085c53SBram Moolenaar        'def UseExported()',
649e6085c53SBram Moolenaar        '  g:imported_abs = exported',
650e6085c53SBram Moolenaar        '  exported = 8888',
651e6085c53SBram Moolenaar        '  g:imported_after = exported',
652e6085c53SBram Moolenaar        'enddef',
653e6085c53SBram Moolenaar        'UseExported()',
654e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
655e6085c53SBram Moolenaar        ]
6568a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
6578a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
6588a7d6542SBram Moolenaar
6598a7d6542SBram Moolenaar  source Ximport_abs.vim
6608a7d6542SBram Moolenaar
6618a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
6624e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
663675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
664675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
665675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
666675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
667675f716eSBram Moolenaar          'exported = 8888.*' ..
668675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
669675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
670675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
671675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
672e6085c53SBram Moolenaar        g:import_disassembled)
6738a7d6542SBram Moolenaar  unlet g:imported_abs
6744e12a5dfSBram Moolenaar  unlet g:import_disassembled
6758a7d6542SBram Moolenaar
6768a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
6778a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
6788a7d6542SBram Moolenaarenddef
6798a7d6542SBram Moolenaar
6808a7d6542SBram Moolenaardef Test_import_rtp()
6818a7d6542SBram Moolenaar  let import_lines = [
682e6085c53SBram Moolenaar        'vim9script',
683e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
684e6085c53SBram Moolenaar        'g:imported_rtp = exported',
685e6085c53SBram Moolenaar        ]
6868a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
6878a7d6542SBram Moolenaar  mkdir('import')
6888a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
6898a7d6542SBram Moolenaar
6908a7d6542SBram Moolenaar  let save_rtp = &rtp
6918a7d6542SBram Moolenaar  &rtp = getcwd()
6928a7d6542SBram Moolenaar  source Ximport_rtp.vim
6938a7d6542SBram Moolenaar  &rtp = save_rtp
6948a7d6542SBram Moolenaar
6958a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
6968a7d6542SBram Moolenaar  unlet g:imported_rtp
6978a7d6542SBram Moolenaar
6988a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
6998a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
7008a7d6542SBram Moolenaar  delete('import', 'd')
7018a7d6542SBram Moolenaarenddef
7028a7d6542SBram Moolenaar
7038a7d6542SBram Moolenaardef Test_fixed_size_list()
7048a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
7058a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
7068a7d6542SBram Moolenaar  l->remove(0)
7078a7d6542SBram Moolenaar  l->add(5)
7088a7d6542SBram Moolenaar  l->insert(99, 1)
7090f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
7108a7d6542SBram Moolenaarenddef
7118a7d6542SBram Moolenaar
712158906cfSBram Moolenaardef IfElse(what: number): string
713158906cfSBram Moolenaar  let res = ''
714158906cfSBram Moolenaar  if what == 1
715158906cfSBram Moolenaar    res = "one"
716158906cfSBram Moolenaar  elseif what == 2
717158906cfSBram Moolenaar    res = "two"
718a259d8d3SBram Moolenaar  else
719158906cfSBram Moolenaar    res = "three"
720a259d8d3SBram Moolenaar  endif
721158906cfSBram Moolenaar  return res
722a259d8d3SBram Moolenaarenddef
723a259d8d3SBram Moolenaar
724158906cfSBram Moolenaardef Test_if_elseif_else()
725158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
726158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
727158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
7280f18b6d1SBram Moolenaarenddef
7290f18b6d1SBram Moolenaar
730e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
731e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
732e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
733e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
734e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
735585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
736e8c4abbbSBram Moolenaarenddef
737e8c4abbbSBram Moolenaar
7386d69bf60SBram Moolenaarlet g:bool_true = v:true
7396d69bf60SBram Moolenaarlet g:bool_false = v:false
7406d69bf60SBram Moolenaar
7416d69bf60SBram Moolenaardef Test_if_const_expr()
7426d69bf60SBram Moolenaar  let res = false
7436d69bf60SBram Moolenaar  if true ? true : false
7446d69bf60SBram Moolenaar    res = true
7456d69bf60SBram Moolenaar  endif
7466d69bf60SBram Moolenaar  assert_equal(true, res)
7476d69bf60SBram Moolenaar
748585fea7bSBram Moolenaar  g:glob = 2
749585fea7bSBram Moolenaar  if false
750585fea7bSBram Moolenaar    execute('let g:glob = 3')
751585fea7bSBram Moolenaar  endif
752585fea7bSBram Moolenaar  assert_equal(2, g:glob)
753585fea7bSBram Moolenaar  if true
754585fea7bSBram Moolenaar    execute('let g:glob = 3')
755585fea7bSBram Moolenaar  endif
756585fea7bSBram Moolenaar  assert_equal(3, g:glob)
757585fea7bSBram Moolenaar
7586d69bf60SBram Moolenaar  res = false
7596d69bf60SBram Moolenaar  if g:bool_true ? true : false
7606d69bf60SBram Moolenaar    res = true
7616d69bf60SBram Moolenaar  endif
7626d69bf60SBram Moolenaar  assert_equal(true, res)
7636d69bf60SBram Moolenaar
7646d69bf60SBram Moolenaar  res = false
7656d69bf60SBram Moolenaar  if true ? g:bool_true : false
7666d69bf60SBram Moolenaar    res = true
7676d69bf60SBram Moolenaar  endif
7686d69bf60SBram Moolenaar  assert_equal(true, res)
7696d69bf60SBram Moolenaar
7706d69bf60SBram Moolenaar  res = false
7716d69bf60SBram Moolenaar  if true ? true : g:bool_false
7726d69bf60SBram Moolenaar    res = true
7736d69bf60SBram Moolenaar  endif
7746d69bf60SBram Moolenaar  assert_equal(true, res)
7756d69bf60SBram Moolenaar
7766d69bf60SBram Moolenaar  res = false
7776d69bf60SBram Moolenaar  if true ? false : true
7786d69bf60SBram Moolenaar    res = true
7796d69bf60SBram Moolenaar  endif
7806d69bf60SBram Moolenaar  assert_equal(false, res)
7816d69bf60SBram Moolenaar
7826d69bf60SBram Moolenaar  res = false
7836d69bf60SBram Moolenaar  if false ? false : true
7846d69bf60SBram Moolenaar    res = true
7856d69bf60SBram Moolenaar  endif
7866d69bf60SBram Moolenaar  assert_equal(true, res)
7876d69bf60SBram Moolenaar
7886d69bf60SBram Moolenaar  res = false
7896d69bf60SBram Moolenaar  if false ? true : false
7906d69bf60SBram Moolenaar    res = true
7916d69bf60SBram Moolenaar  endif
7926d69bf60SBram Moolenaar  assert_equal(false, res)
7936d69bf60SBram Moolenaar
7946d69bf60SBram Moolenaar  res = false
795e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
796e8c4abbbSBram Moolenaar    res = true
797e8c4abbbSBram Moolenaar  endif
798e8c4abbbSBram Moolenaar  assert_equal(false, res)
799e8c4abbbSBram Moolenaar
800e8c4abbbSBram Moolenaar  res = false
8016d69bf60SBram Moolenaar  if true && true
8026d69bf60SBram Moolenaar    res = true
8036d69bf60SBram Moolenaar  endif
8046d69bf60SBram Moolenaar  assert_equal(true, res)
8056d69bf60SBram Moolenaar
8066d69bf60SBram Moolenaar  res = false
8076d69bf60SBram Moolenaar  if true && false
8086d69bf60SBram Moolenaar    res = true
8096d69bf60SBram Moolenaar  endif
8106d69bf60SBram Moolenaar  assert_equal(false, res)
8116d69bf60SBram Moolenaar
8126d69bf60SBram Moolenaar  res = false
8136d69bf60SBram Moolenaar  if g:bool_true && false
8146d69bf60SBram Moolenaar    res = true
8156d69bf60SBram Moolenaar  endif
8166d69bf60SBram Moolenaar  assert_equal(false, res)
8176d69bf60SBram Moolenaar
8186d69bf60SBram Moolenaar  res = false
8196d69bf60SBram Moolenaar  if true && g:bool_false
8206d69bf60SBram Moolenaar    res = true
8216d69bf60SBram Moolenaar  endif
8226d69bf60SBram Moolenaar  assert_equal(false, res)
8236d69bf60SBram Moolenaar
8246d69bf60SBram Moolenaar  res = false
8256d69bf60SBram Moolenaar  if false && false
8266d69bf60SBram Moolenaar    res = true
8276d69bf60SBram Moolenaar  endif
8286d69bf60SBram Moolenaar  assert_equal(false, res)
8296d69bf60SBram Moolenaar
8306d69bf60SBram Moolenaar  res = false
8316d69bf60SBram Moolenaar  if true || false
8326d69bf60SBram Moolenaar    res = true
8336d69bf60SBram Moolenaar  endif
8346d69bf60SBram Moolenaar  assert_equal(true, res)
8356d69bf60SBram Moolenaar
8366d69bf60SBram Moolenaar  res = false
8376d69bf60SBram Moolenaar  if g:bool_true || false
8386d69bf60SBram Moolenaar    res = true
8396d69bf60SBram Moolenaar  endif
8406d69bf60SBram Moolenaar  assert_equal(true, res)
8416d69bf60SBram Moolenaar
8426d69bf60SBram Moolenaar  res = false
8436d69bf60SBram Moolenaar  if true || g:bool_false
8446d69bf60SBram Moolenaar    res = true
8456d69bf60SBram Moolenaar  endif
8466d69bf60SBram Moolenaar  assert_equal(true, res)
8476d69bf60SBram Moolenaar
8486d69bf60SBram Moolenaar  res = false
8496d69bf60SBram Moolenaar  if false || false
8506d69bf60SBram Moolenaar    res = true
8516d69bf60SBram Moolenaar  endif
8526d69bf60SBram Moolenaar  assert_equal(false, res)
85380c34ca3SBram Moolenaarenddef
8546d69bf60SBram Moolenaar
85580c34ca3SBram Moolenaardef Test_if_const_expr_fails()
85680c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
85780c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
858e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
859e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
8606d69bf60SBram Moolenaarenddef
8616d69bf60SBram Moolenaar
862ad39c094SBram Moolenaardef Test_execute_cmd()
863ad39c094SBram Moolenaar  new
864ad39c094SBram Moolenaar  setline(1, 'default')
865ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
866ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
867ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
868ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
869ad39c094SBram Moolenaar  execute cmd1 cmd2
870ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
871ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
872ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
873ad39c094SBram Moolenaar  let cmd_first = 'call '
874ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
875ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
876ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
877ad39c094SBram Moolenaar  bwipe!
878585fea7bSBram Moolenaar
879585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
880ad39c094SBram Moolenaarenddef
881ad39c094SBram Moolenaar
882ad39c094SBram Moolenaardef Test_echo_cmd()
883585fea7bSBram Moolenaar  echo 'some'
884585fea7bSBram Moolenaar  echon 'thing'
885ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
886ad39c094SBram Moolenaar
887ad39c094SBram Moolenaar  let str1 = 'some'
888ad39c094SBram Moolenaar  let str2 = 'more'
889ad39c094SBram Moolenaar  echo str1 str2
890ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
891ad39c094SBram Moolenaarenddef
892ad39c094SBram Moolenaar
89341fe0617SBram Moolenaardef Test_for_outside_of_function()
89441fe0617SBram Moolenaar  let lines =<< trim END
89541fe0617SBram Moolenaar    vim9script
89641fe0617SBram Moolenaar    new
89741fe0617SBram Moolenaar    for var in range(0, 3)
89841fe0617SBram Moolenaar      append(line('$'), var)
89941fe0617SBram Moolenaar    endfor
90041fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
90141fe0617SBram Moolenaar    bwipe!
90241fe0617SBram Moolenaar  END
90341fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
90441fe0617SBram Moolenaar  source Xvim9for.vim
90541fe0617SBram Moolenaar  delete('Xvim9for.vim')
90641fe0617SBram Moolenaarenddef
9078a7d6542SBram Moolenaar
908e8c4abbbSBram Moolenaardef Test_for_loop()
909e8c4abbbSBram Moolenaar  let result = ''
910e8c4abbbSBram Moolenaar  for cnt in range(7)
911e8c4abbbSBram Moolenaar    if cnt == 4
912e8c4abbbSBram Moolenaar      break
913e8c4abbbSBram Moolenaar    endif
914e8c4abbbSBram Moolenaar    if cnt == 2
915e8c4abbbSBram Moolenaar      continue
916e8c4abbbSBram Moolenaar    endif
917e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
918e8c4abbbSBram Moolenaar  endfor
919e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
920e8c4abbbSBram Moolenaarenddef
921e8c4abbbSBram Moolenaar
922e8c4abbbSBram Moolenaardef Test_for_loop_fails()
923675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
924675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
925675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
9266e949784SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef'], 'E1006:')
927675f716eSBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1024:')
928675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
929675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
930675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
931e8c4abbbSBram Moolenaarenddef
932e8c4abbbSBram Moolenaar
933d0df1aacSBram Moolenaardef Test_while_loop()
934d0df1aacSBram Moolenaar  let result = ''
935d0df1aacSBram Moolenaar  let cnt = 0
936d0df1aacSBram Moolenaar  while cnt < 555
937d0df1aacSBram Moolenaar    if cnt == 3
938d0df1aacSBram Moolenaar      break
939d0df1aacSBram Moolenaar    endif
940d0df1aacSBram Moolenaar    cnt += 1
941d0df1aacSBram Moolenaar    if cnt == 2
942d0df1aacSBram Moolenaar      continue
943d0df1aacSBram Moolenaar    endif
944d0df1aacSBram Moolenaar    result ..= cnt .. '_'
945d0df1aacSBram Moolenaar  endwhile
946d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
947d0df1aacSBram Moolenaarenddef
948d0df1aacSBram Moolenaar
949e8c4abbbSBram Moolenaardef Test_while_loop_fails()
950675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
951675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
952675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
953675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
954675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
955675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
956675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
957bd5da371SBram Moolenaarenddef
958bd5da371SBram Moolenaar
9599645e2d9SBram Moolenaardef Test_interrupt_loop()
96097acfc78SBram Moolenaar  let caught = false
9619645e2d9SBram Moolenaar  let x = 0
96297acfc78SBram Moolenaar  try
9639645e2d9SBram Moolenaar    while 1
9649645e2d9SBram Moolenaar      x += 1
9659645e2d9SBram Moolenaar      if x == 100
9669645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
9679645e2d9SBram Moolenaar      endif
9689645e2d9SBram Moolenaar    endwhile
96997acfc78SBram Moolenaar  catch
97097acfc78SBram Moolenaar    caught = true
97197acfc78SBram Moolenaar    assert_equal(100, x)
97297acfc78SBram Moolenaar  endtry
97397acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
9749645e2d9SBram Moolenaarenddef
97520431c9dSBram Moolenaar
9764fdae999SBram Moolenaardef Test_automatic_line_continuation()
9774fdae999SBram Moolenaar  let mylist = [
9784fdae999SBram Moolenaar      'one',
9794fdae999SBram Moolenaar      'two',
9804fdae999SBram Moolenaar      'three',
9814fdae999SBram Moolenaar      ] " comment
9824fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
9834fdae999SBram Moolenaar
9844fdae999SBram Moolenaar  let mydict = {
9854fdae999SBram Moolenaar      'one': 1,
9864fdae999SBram Moolenaar      'two': 2,
9874fdae999SBram Moolenaar      'three':
9884fdae999SBram Moolenaar          3,
9894fdae999SBram Moolenaar      } " comment
9904fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
9914fdae999SBram Moolenaar  mydict = #{
9922c330432SBram Moolenaar      one: 1,  # comment
9932c330432SBram Moolenaar      two:     # comment
9942c330432SBram Moolenaar           2,  # comment
9952c330432SBram Moolenaar      three: 3 # comment
9962c330432SBram Moolenaar      }
9972c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
9982c330432SBram Moolenaar  mydict = #{
9992c330432SBram Moolenaar      one: 1,
10004fdae999SBram Moolenaar      two:
10014fdae999SBram Moolenaar           2,
10022c330432SBram Moolenaar      three: 3
10034fdae999SBram Moolenaar      }
10044fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1005e6085c53SBram Moolenaar
1006e6085c53SBram Moolenaar  assert_equal(
1007e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1008e6085c53SBram Moolenaar        split('one two three')
1009e6085c53SBram Moolenaar        )
10104fdae999SBram Moolenaarenddef
10114fdae999SBram Moolenaar
10127a092245SBram Moolenaardef Test_vim9_comment()
10137a092245SBram Moolenaar  CheckScriptSuccess([
10147a092245SBram Moolenaar      'vim9script',
10157a092245SBram Moolenaar      '# something',
10167a092245SBram Moolenaar      ])
10177a092245SBram Moolenaar  CheckScriptFailure([
10187a092245SBram Moolenaar      'vim9script',
10197a092245SBram Moolenaar      ':# something',
10207a092245SBram Moolenaar      ], 'E488:')
10217a092245SBram Moolenaar  CheckScriptFailure([
10227a092245SBram Moolenaar      '# something',
10237a092245SBram Moolenaar      ], 'E488:')
10247a092245SBram Moolenaar  CheckScriptFailure([
10257a092245SBram Moolenaar      ':# something',
10267a092245SBram Moolenaar      ], 'E488:')
10277a092245SBram Moolenaar
1028*4a8d9f2eSBram Moolenaar  { # block start
1029*4a8d9f2eSBram Moolenaar  } # block end
1030*4a8d9f2eSBram Moolenaar  CheckDefFailure([
1031*4a8d9f2eSBram Moolenaar      '{# comment',
1032*4a8d9f2eSBram Moolenaar      ], 'E488:')
1033*4a8d9f2eSBram Moolenaar  CheckDefFailure([
1034*4a8d9f2eSBram Moolenaar      '{',
1035*4a8d9f2eSBram Moolenaar      '}# comment',
1036*4a8d9f2eSBram Moolenaar      ], 'E488:')
1037*4a8d9f2eSBram Moolenaar
1038*4a8d9f2eSBram Moolenaar  echo "yes" # comment
1039*4a8d9f2eSBram Moolenaar  CheckDefFailure([
1040*4a8d9f2eSBram Moolenaar      'echo "yes"# comment',
1041*4a8d9f2eSBram Moolenaar      ], 'E488:')
10427a092245SBram Moolenaar  CheckScriptSuccess([
10437a092245SBram Moolenaar      'vim9script',
10447a092245SBram Moolenaar      'echo "yes" # something',
10457a092245SBram Moolenaar      ])
10467a092245SBram Moolenaar  CheckScriptFailure([
10477a092245SBram Moolenaar      'vim9script',
10487a092245SBram Moolenaar      'echo "yes"# something',
10497a092245SBram Moolenaar      ], 'E121:')
10507a092245SBram Moolenaar  CheckScriptFailure([
10517a092245SBram Moolenaar      'vim9script',
10527a092245SBram Moolenaar      'echo# something',
10537a092245SBram Moolenaar      ], 'E121:')
10547a092245SBram Moolenaar  CheckScriptFailure([
10557a092245SBram Moolenaar      'echo "yes" # something',
10567a092245SBram Moolenaar      ], 'E121:')
10577a092245SBram Moolenaar
1058*4a8d9f2eSBram Moolenaar  exe "echo" # comment
1059*4a8d9f2eSBram Moolenaar  CheckDefFailure([
1060*4a8d9f2eSBram Moolenaar      'exe "echo"# comment',
1061*4a8d9f2eSBram Moolenaar      ], 'E488:')
1062*4a8d9f2eSBram Moolenaar  CheckScriptSuccess([
1063*4a8d9f2eSBram Moolenaar      'vim9script',
1064*4a8d9f2eSBram Moolenaar      'exe "echo" # something',
1065*4a8d9f2eSBram Moolenaar      ])
1066*4a8d9f2eSBram Moolenaar  CheckScriptFailure([
1067*4a8d9f2eSBram Moolenaar      'vim9script',
1068*4a8d9f2eSBram Moolenaar      'exe "echo"# something',
1069*4a8d9f2eSBram Moolenaar      ], 'E121:')
1070*4a8d9f2eSBram Moolenaar  CheckDefFailure([
1071*4a8d9f2eSBram Moolenaar      'exe # comment',
1072*4a8d9f2eSBram Moolenaar      ], 'E1015:')
1073*4a8d9f2eSBram Moolenaar  CheckScriptFailure([
1074*4a8d9f2eSBram Moolenaar      'vim9script',
1075*4a8d9f2eSBram Moolenaar      'exe# something',
1076*4a8d9f2eSBram Moolenaar      ], 'E121:')
1077*4a8d9f2eSBram Moolenaar  CheckScriptFailure([
1078*4a8d9f2eSBram Moolenaar      'exe "echo" # something',
1079*4a8d9f2eSBram Moolenaar      ], 'E121:')
1080*4a8d9f2eSBram Moolenaar
10817a092245SBram Moolenaar  CheckDefFailure([
10827a092245SBram Moolenaar      'try# comment',
10837a092245SBram Moolenaar      'echo "yes"',
10847a092245SBram Moolenaar      'catch',
10857a092245SBram Moolenaar      'endtry',
10867a092245SBram Moolenaar      ], 'E488:')
10877a092245SBram Moolenaar  CheckDefFailure([
10887a092245SBram Moolenaar      'try',
10897a092245SBram Moolenaar      'echo "yes"',
10907a092245SBram Moolenaar      'catch# comment',
10917a092245SBram Moolenaar      'endtry',
10927a092245SBram Moolenaar      ], 'E488:')
10937a092245SBram Moolenaar  CheckDefFailure([
10947a092245SBram Moolenaar      'try',
10957a092245SBram Moolenaar      'echo "yes"',
10967a092245SBram Moolenaar      'catch',
10977a092245SBram Moolenaar      'endtry# comment',
10987a092245SBram Moolenaar      ], 'E488:')
10997a092245SBram Moolenaarenddef
11007a092245SBram Moolenaar
1101585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
1102585fea7bSBram Moolenaardef Test_substitute_cmd()
1103585fea7bSBram Moolenaar  new
1104585fea7bSBram Moolenaar  setline(1, 'something')
1105585fea7bSBram Moolenaar  :substitute(some(other(
1106585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
1107585fea7bSBram Moolenaar  bwipe!
1108585fea7bSBram Moolenaar
1109585fea7bSBram Moolenaar  " also when the context is Vim9 script
1110585fea7bSBram Moolenaar  let lines =<< trim END
1111585fea7bSBram Moolenaar    vim9script
1112585fea7bSBram Moolenaar    new
1113585fea7bSBram Moolenaar    setline(1, 'something')
1114585fea7bSBram Moolenaar    :substitute(some(other(
1115585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
1116585fea7bSBram Moolenaar    bwipe!
1117585fea7bSBram Moolenaar  END
1118585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
1119585fea7bSBram Moolenaar  source Xvim9lines
1120585fea7bSBram Moolenaar
1121585fea7bSBram Moolenaar  delete('Xvim9lines')
1122585fea7bSBram Moolenaarenddef
1123585fea7bSBram Moolenaar
11248a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1125