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
138a7d6542SBram Moolenaarfunc CheckScriptFailure(lines, error)
148a7d6542SBram Moolenaar  call writefile(a:lines, 'Xdef')
158a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
168a7d6542SBram Moolenaar  call delete('Xdef')
178a7d6542SBram Moolenaarendfunc
188a7d6542SBram Moolenaar
198a7d6542SBram Moolenaardef Test_syntax()
208a7d6542SBram Moolenaar  let var = 234
218a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
228a7d6542SBram Moolenaarenddef
238a7d6542SBram Moolenaar
246e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
256e587dcbSBram Moolenaarlet s:addToMe = 111
26401d9ffbSBram Moolenaarlet g:existing = 'yes'
27a8c17704SBram Moolenaarlet g:inc_counter = 1
28a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
296e587dcbSBram Moolenaar
308a7d6542SBram Moolenaardef Test_assignment()
318a7d6542SBram Moolenaar  let bool1: bool = true
328a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
338a7d6542SBram Moolenaar  let bool2: bool = false
348a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
358a7d6542SBram Moolenaar
360c2ca58eSBram Moolenaar  let list1: list<bool> = [false, true, false]
378a7d6542SBram Moolenaar  let list2: list<number> = [1, 2, 3]
380c2ca58eSBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
390c2ca58eSBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
400c2ca58eSBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
418a7d6542SBram Moolenaar
42436472f5SBram Moolenaar  let listS: list<string> = []
43436472f5SBram Moolenaar  let listN: list<number> = []
448a7d6542SBram Moolenaar
450c2ca58eSBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
468a7d6542SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
470c2ca58eSBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
480c2ca58eSBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
490c2ca58eSBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, tw: 0z02}
50b283a8a6SBram Moolenaar
519be61bbbSBram Moolenaar  let a: number = 6
529be61bbbSBram Moolenaar  assert_equal(6, a)
539be61bbbSBram Moolenaar
5442a480bfSBram Moolenaar  if has('channel')
5542a480bfSBram Moolenaar    let chan1: channel
56fbdd08edSBram Moolenaar    let job1: job
57f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
5842a480bfSBram Moolenaar  endif
59fbdd08edSBram Moolenaar  if has('float')
60fbdd08edSBram Moolenaar    let float1: float = 3.4
61fbdd08edSBram Moolenaar  endif
62*5deeb3f1SBram Moolenaar  let Funky1: func
63*5deeb3f1SBram Moolenaar  let Funky2: func = function('len')
64*5deeb3f1SBram Moolenaar  let Party2: func = funcref('Test_syntax')
6542a480bfSBram Moolenaar
6661a6d4e4SBram Moolenaar  " type becomes list<any>
6761a6d4e4SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
685381c7a1SBram Moolenaar  " type becomes dict<any>
695381c7a1SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
7061a6d4e4SBram Moolenaar
71401d9ffbSBram Moolenaar  g:newvar = 'new'
72401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
73401d9ffbSBram Moolenaar
74401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
75401d9ffbSBram Moolenaar  g:existing = 'no'
76401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
77401d9ffbSBram Moolenaar
78b283a8a6SBram Moolenaar  v:char = 'abc'
796e587dcbSBram Moolenaar  assert_equal('abc', v:char)
80b283a8a6SBram Moolenaar
81b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
826e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
83b283a8a6SBram Moolenaar  $ENVVAR = ''
846e587dcbSBram Moolenaar
85fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
86fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
87fd1823e0SBram Moolenaar  s:addToMe += 222
88fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
890bbf722aSBram Moolenaar  s:newVar = 'new'
900bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
91a8c17704SBram Moolenaar
92a8c17704SBram Moolenaar  set ts=7
93a8c17704SBram Moolenaar  &ts += 1
94a8c17704SBram Moolenaar  assert_equal(8, &ts)
9580c34ca3SBram Moolenaar  &ts -= 3
9680c34ca3SBram Moolenaar  assert_equal(5, &ts)
9780c34ca3SBram Moolenaar  &ts *= 2
9880c34ca3SBram Moolenaar  assert_equal(10, &ts)
9980c34ca3SBram Moolenaar  &ts /= 3
10080c34ca3SBram Moolenaar  assert_equal(3, &ts)
10180c34ca3SBram Moolenaar  set ts=10
10280c34ca3SBram Moolenaar  &ts %= 4
10380c34ca3SBram Moolenaar  assert_equal(2, &ts)
104a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
105a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
106a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
107585fea7bSBram Moolenaar  " test freeing ISN_STOREOPT
108585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
10980c34ca3SBram Moolenaar  &ts = 8
110a8c17704SBram Moolenaar
111a8c17704SBram Moolenaar  g:inc_counter += 1
112a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
113a8c17704SBram Moolenaar
114a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
115a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
116a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
117a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
118a8c17704SBram Moolenaar
119a8c17704SBram Moolenaar  @a = 'areg'
120a8c17704SBram Moolenaar  @a ..= 'add'
121a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
122a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
123a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
124e69f6d04SBram Moolenaar
125e69f6d04SBram Moolenaar  v:errmsg = 'none'
126e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
127e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
128e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
129e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
130*5deeb3f1SBram Moolenaarenddef
131*5deeb3f1SBram Moolenaar
132*5deeb3f1SBram Moolenaardef Test_assignment_default()
133e69f6d04SBram Moolenaar
134e69f6d04SBram Moolenaar  " Test default values.
135e69f6d04SBram Moolenaar  let thebool: bool
136e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
137e69f6d04SBram Moolenaar
138e69f6d04SBram Moolenaar  let thenumber: number
139e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
140e69f6d04SBram Moolenaar
141e69f6d04SBram Moolenaar  if has('float')
142e69f6d04SBram Moolenaar    let thefloat: float
143e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
144e69f6d04SBram Moolenaar  endif
145e69f6d04SBram Moolenaar
146e69f6d04SBram Moolenaar  let thestring: string
147e69f6d04SBram Moolenaar  assert_equal('', thestring)
148e69f6d04SBram Moolenaar
149e69f6d04SBram Moolenaar  let theblob: blob
150e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
151e69f6d04SBram Moolenaar
152*5deeb3f1SBram Moolenaar  let Thefunc: func
153*5deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
154e69f6d04SBram Moolenaar
155e69f6d04SBram Moolenaar  let thelist: list<any>
156e69f6d04SBram Moolenaar  assert_equal([], thelist)
157e69f6d04SBram Moolenaar
158e69f6d04SBram Moolenaar  let thedict: dict<any>
159e69f6d04SBram Moolenaar  assert_equal({}, thedict)
160e69f6d04SBram Moolenaar
1612c869deeSBram Moolenaar  if has('channel')
162e69f6d04SBram Moolenaar    let thejob: job
163e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
164e69f6d04SBram Moolenaar
165e69f6d04SBram Moolenaar    let thechannel: channel
166e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
1672c869deeSBram Moolenaar  endif
168585fea7bSBram Moolenaar
169585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
170585fea7bSBram Moolenaar  assert_equal(5678, nr)
1718a7d6542SBram Moolenaarenddef
1728a7d6542SBram Moolenaar
1738a7d6542SBram Moolenaarfunc Test_assignment_failure()
1748a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
1758a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
1768a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
1778a7d6542SBram Moolenaar
1788a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
1798a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
1808a7d6542SBram Moolenaar
1819be61bbbSBram Moolenaar  call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
1829be61bbbSBram Moolenaar
183e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
1849be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
1859be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
1869be61bbbSBram Moolenaar
1879be61bbbSBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1065:')
1889be61bbbSBram Moolenaar
1899be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
1909be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
1919be61bbbSBram Moolenaar
1929be61bbbSBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016:')
1939be61bbbSBram Moolenaar
1949be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
1959be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
1969be61bbbSBram Moolenaar
19733fa29cfSBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
19833fa29cfSBram Moolenaar
1998a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
2008a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
2018a7d6542SBram Moolenaar
2028a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
2038a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
2048a7d6542SBram Moolenaar
2058a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
2068a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
20742a480bfSBram Moolenaar
208d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
20942a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
210599c89c8SBram Moolenaarendfunc
211599c89c8SBram Moolenaar
212599c89c8SBram Moolenaarfunc Test_wrong_type()
213599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
214599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
215599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
216599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
217599c89c8SBram Moolenaar
218599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
219599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
22042a480bfSBram Moolenaar
22142a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
22242a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
22342a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
22442a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
22542a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
22642a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
22742a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
22842a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
22942a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
23042a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
23142a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
2328a7d6542SBram Moolenaarendfunc
2338a7d6542SBram Moolenaar
2348a7d6542SBram Moolenaarfunc Test_const()
2358a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
2368a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
2378a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
2389be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
2398a7d6542SBram Moolenaarendfunc
2408a7d6542SBram Moolenaar
2418a7d6542SBram Moolenaardef Test_block()
2428a7d6542SBram Moolenaar  let outer = 1
2438a7d6542SBram Moolenaar  {
2448a7d6542SBram Moolenaar    let inner = 2
2458a7d6542SBram Moolenaar    assert_equal(1, outer)
2468a7d6542SBram Moolenaar    assert_equal(2, inner)
2478a7d6542SBram Moolenaar  }
2488a7d6542SBram Moolenaar  assert_equal(1, outer)
2498a7d6542SBram Moolenaarenddef
2508a7d6542SBram Moolenaar
2518a7d6542SBram Moolenaarfunc Test_block_failure()
2528a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
253585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
254585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
2558a7d6542SBram Moolenaarendfunc
2568a7d6542SBram Moolenaar
257585fea7bSBram Moolenaardef Test_cmd_modifier()
258585fea7bSBram Moolenaar  tab echo '0'
259585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
260585fea7bSBram Moolenaarenddef
261585fea7bSBram Moolenaar
262585fea7bSBram Moolenaar
2638a7d6542SBram Moolenaardef Test_try_catch()
2648a7d6542SBram Moolenaar  let l = []
2658a7d6542SBram Moolenaar  try
2668a7d6542SBram Moolenaar    add(l, '1')
2678a7d6542SBram Moolenaar    throw 'wrong'
2688a7d6542SBram Moolenaar    add(l, '2')
2698a7d6542SBram Moolenaar  catch
2708a7d6542SBram Moolenaar    add(l, v:exception)
2718a7d6542SBram Moolenaar  finally
2728a7d6542SBram Moolenaar    add(l, '3')
2738a7d6542SBram Moolenaar  endtry
2748a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
2758a7d6542SBram Moolenaarenddef
2768a7d6542SBram Moolenaar
277257cc5eeSBram Moolenaardef ThrowFromDef()
278257cc5eeSBram Moolenaar  throw 'getout'
279257cc5eeSBram Moolenaarenddef
280257cc5eeSBram Moolenaar
281257cc5eeSBram Moolenaarfunc CatchInFunc()
282257cc5eeSBram Moolenaar  try
283257cc5eeSBram Moolenaar    call ThrowFromDef()
284257cc5eeSBram Moolenaar  catch
285257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
286257cc5eeSBram Moolenaar  endtry
287257cc5eeSBram Moolenaarendfunc
288257cc5eeSBram Moolenaar
289257cc5eeSBram Moolenaardef CatchInDef()
290257cc5eeSBram Moolenaar  try
291257cc5eeSBram Moolenaar    ThrowFromDef()
292257cc5eeSBram Moolenaar  catch
293257cc5eeSBram Moolenaar    g:thrown_def = v:exception
294257cc5eeSBram Moolenaar  endtry
295257cc5eeSBram Moolenaarenddef
296257cc5eeSBram Moolenaar
297f575adffSBram Moolenaardef ReturnFinally(): string
298f575adffSBram Moolenaar  try
299f575adffSBram Moolenaar    return 'intry'
300f575adffSBram Moolenaar  finally
301f575adffSBram Moolenaar    g:in_finally = 'finally'
302f575adffSBram Moolenaar  endtry
303f575adffSBram Moolenaar  return 'end'
304f575adffSBram Moolenaarenddef
305f575adffSBram Moolenaar
306257cc5eeSBram Moolenaardef Test_try_catch_nested()
307257cc5eeSBram Moolenaar  CatchInFunc()
308257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
309257cc5eeSBram Moolenaar
310257cc5eeSBram Moolenaar  CatchInDef()
311257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
312f575adffSBram Moolenaar
313f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
314f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
315f575adffSBram Moolenaarenddef
316f575adffSBram Moolenaar
317f575adffSBram Moolenaardef Test_try_catch_match()
318f575adffSBram Moolenaar  let seq = 'a'
319f575adffSBram Moolenaar  try
320f575adffSBram Moolenaar    throw 'something'
321f575adffSBram Moolenaar  catch /nothing/
322f575adffSBram Moolenaar    seq ..= 'x'
323f575adffSBram Moolenaar  catch /some/
324f575adffSBram Moolenaar    seq ..= 'b'
325f575adffSBram Moolenaar  catch /asdf/
326f575adffSBram Moolenaar    seq ..= 'x'
327e8c4abbbSBram Moolenaar  catch ?a\?sdf?
328e8c4abbbSBram Moolenaar    seq ..= 'y'
329f575adffSBram Moolenaar  finally
330f575adffSBram Moolenaar    seq ..= 'c'
331f575adffSBram Moolenaar  endtry
332f575adffSBram Moolenaar  assert_equal('abc', seq)
333257cc5eeSBram Moolenaarenddef
334257cc5eeSBram Moolenaar
335e8c4abbbSBram Moolenaardef Test_try_catch_fails()
336e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
337e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
338e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
339585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
340585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
341585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
342585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
343585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
344585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
345585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
346585fea7bSBram Moolenaar
347585fea7bSBram Moolenaar  call CheckDefFailure(['throw'], 'E471:')
348585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
349e8c4abbbSBram Moolenaarenddef
350e8c4abbbSBram Moolenaar
3518a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
3528a7d6542SBram Moolenaar  vim9script
3538a7d6542SBram Moolenaar  let name: string = 'bob'
3548a7d6542SBram Moolenaar  def Concat(arg: string): string
3558a7d6542SBram Moolenaar    return name .. arg
3568a7d6542SBram Moolenaar  enddef
3578a7d6542SBram Moolenaar  let g:result = Concat('bie')
3588a7d6542SBram Moolenaar  let g:localname = name
3598a7d6542SBram Moolenaar
3608a7d6542SBram Moolenaar  export const CONST = 1234
3618a7d6542SBram Moolenaar  export let exported = 9876
3626e587dcbSBram Moolenaar  export let exp_name = 'John'
3638a7d6542SBram Moolenaar  export def Exported(): string
3648a7d6542SBram Moolenaar    return 'Exported'
3658a7d6542SBram Moolenaar  enddef
3668a7d6542SBram MoolenaarEND
3678a7d6542SBram Moolenaar
3685269bd2aSBram Moolenaardef Test_vim9_import_export()
3698a7d6542SBram Moolenaar  let import_script_lines =<< trim END
3708a7d6542SBram Moolenaar    vim9script
3718a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
3728a7d6542SBram Moolenaar    g:imported = exported
3736e587dcbSBram Moolenaar    exported += 3
3746e587dcbSBram Moolenaar    g:imported_added = exported
3758a7d6542SBram Moolenaar    g:imported_func = Exported()
3766e587dcbSBram Moolenaar
3776e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
3786e587dcbSBram Moolenaar    g:imported_name = exp_name
3796e587dcbSBram Moolenaar    exp_name ..= ' Doe'
3806e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
3815381c7a1SBram Moolenaar    g:imported_later = exported
3828a7d6542SBram Moolenaar  END
3838a7d6542SBram Moolenaar
3848a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
3858a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
3868a7d6542SBram Moolenaar
3878a7d6542SBram Moolenaar  source Ximport.vim
3888a7d6542SBram Moolenaar
3898a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
3908a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
3918a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
3926e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
3935381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
3948a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
3956e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
3966e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
3978a7d6542SBram Moolenaar  assert_false(exists('g:name'))
3988a7d6542SBram Moolenaar
3998a7d6542SBram Moolenaar  unlet g:result
4008a7d6542SBram Moolenaar  unlet g:localname
4018a7d6542SBram Moolenaar  unlet g:imported
4026e587dcbSBram Moolenaar  unlet g:imported_added
4035381c7a1SBram Moolenaar  unlet g:imported_later
4048a7d6542SBram Moolenaar  unlet g:imported_func
4056e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
4068a7d6542SBram Moolenaar  delete('Ximport.vim')
407f2d5c240SBram Moolenaar
4085381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
4095381c7a1SBram Moolenaar    vim9script
4105381c7a1SBram Moolenaar    def ImportInDef()
4115381c7a1SBram Moolenaar      import exported from './Xexport.vim'
4125381c7a1SBram Moolenaar      g:imported = exported
4135381c7a1SBram Moolenaar      exported += 7
4145381c7a1SBram Moolenaar      g:imported_added = exported
4155381c7a1SBram Moolenaar    enddef
4165381c7a1SBram Moolenaar    ImportInDef()
4175381c7a1SBram Moolenaar  END
4185381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
4195381c7a1SBram Moolenaar  source Ximport2.vim
4205381c7a1SBram Moolenaar  " TODO: this should be 9879
4215381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
4225381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
4235381c7a1SBram Moolenaar  unlet g:imported
4245381c7a1SBram Moolenaar  unlet g:imported_added
4255381c7a1SBram Moolenaar  delete('Ximport2.vim')
4265381c7a1SBram Moolenaar
427f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
428f2d5c240SBram Moolenaar    vim9script
429f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
430f2d5c240SBram Moolenaar    def UseExport()
431f2d5c240SBram Moolenaar      g:imported = Export.exported
432f2d5c240SBram Moolenaar    enddef
433f2d5c240SBram Moolenaar    UseExport()
434f2d5c240SBram Moolenaar  END
435f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
436f2d5c240SBram Moolenaar  source Ximport.vim
4375381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
438f2d5c240SBram Moolenaar
439599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
440599c89c8SBram Moolenaar    vim9script
441599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
442599c89c8SBram Moolenaar    def Func()
443599c89c8SBram Moolenaar      let dummy = 1
444599c89c8SBram Moolenaar      let imported = Export + dummy
445599c89c8SBram Moolenaar    enddef
446599c89c8SBram Moolenaar  END
447599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
448599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
449599c89c8SBram Moolenaar
450599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
451599c89c8SBram Moolenaar    vim9script
452599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
453599c89c8SBram Moolenaar    def Func()
454599c89c8SBram Moolenaar      let imported = Export . exported
455599c89c8SBram Moolenaar    enddef
456599c89c8SBram Moolenaar  END
457599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
458599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
459599c89c8SBram Moolenaar
460599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
461599c89c8SBram Moolenaar    vim9script
462599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
463599c89c8SBram Moolenaar    def Func()
464599c89c8SBram Moolenaar      let imported = Export.
465599c89c8SBram Moolenaar    enddef
466599c89c8SBram Moolenaar  END
467599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
468599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
469599c89c8SBram Moolenaar
470f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
471f2d5c240SBram Moolenaar    vim9script
472f2d5c240SBram Moolenaar    import * from './Xexport.vim'
473f2d5c240SBram Moolenaar    g:imported = exported
474f2d5c240SBram Moolenaar  END
475f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
476f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
477f2d5c240SBram Moolenaar
478fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
479fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
480fa29c8abSBram Moolenaar    vim9script
481fa29c8abSBram Moolenaar    import name from './Xexport.vim'
482fa29c8abSBram Moolenaar  END
483fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
484fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
485fa29c8abSBram Moolenaar
4865269bd2aSBram Moolenaar  " try to import something that is already defined
4875269bd2aSBram Moolenaar  let import_already_defined =<< trim END
4885269bd2aSBram Moolenaar    vim9script
4895269bd2aSBram Moolenaar    let exported = 'something'
4905269bd2aSBram Moolenaar    import exported from './Xexport.vim'
4915269bd2aSBram Moolenaar  END
4925269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
4935269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
4945269bd2aSBram Moolenaar
4955269bd2aSBram Moolenaar  " try to import something that is already defined
4965269bd2aSBram Moolenaar  import_already_defined =<< trim END
4975269bd2aSBram Moolenaar    vim9script
4985269bd2aSBram Moolenaar    let exported = 'something'
4995269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
5005269bd2aSBram Moolenaar  END
5015269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5025269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5035269bd2aSBram Moolenaar
5045269bd2aSBram Moolenaar  " try to import something that is already defined
5055269bd2aSBram Moolenaar  import_already_defined =<< trim END
5065269bd2aSBram Moolenaar    vim9script
5075269bd2aSBram Moolenaar    let exported = 'something'
5085269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
5095269bd2aSBram Moolenaar  END
5105269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5115269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5125269bd2aSBram Moolenaar
513fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
514fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
515fa29c8abSBram Moolenaar    vim9script
516fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
517fa29c8abSBram Moolenaar  END
518fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
519fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
520fa29c8abSBram Moolenaar
521fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
522fa29c8abSBram Moolenaar    vim9script
523fa29c8abSBram Moolenaar    import name './Xexport.vim'
524fa29c8abSBram Moolenaar  END
525fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
526fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
527fa29c8abSBram Moolenaar
528fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
529fa29c8abSBram Moolenaar    vim9script
530fa29c8abSBram Moolenaar    import name from Xexport.vim
531fa29c8abSBram Moolenaar  END
532fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
533fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
534fa29c8abSBram Moolenaar
535fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
536fa29c8abSBram Moolenaar    vim9script
537fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
538fa29c8abSBram Moolenaar  END
539fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
540fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
541fa29c8abSBram Moolenaar
542fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
543fa29c8abSBram Moolenaar    vim9script
544fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
545fa29c8abSBram Moolenaar  END
5465269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
5475269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
548fa29c8abSBram Moolenaar
549f2d5c240SBram Moolenaar  delete('Ximport.vim')
5505269bd2aSBram Moolenaar  delete('Ximport3.vim')
5518a7d6542SBram Moolenaar  delete('Xexport.vim')
5528a7d6542SBram Moolenaar
553750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
554750802b5SBram Moolenaar  set cpo&vi
555750802b5SBram Moolenaar  let cpo_before = &cpo
556750802b5SBram Moolenaar  let lines =<< trim END
557750802b5SBram Moolenaar    vim9script
558750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
559750802b5SBram Moolenaar  END
560750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
561750802b5SBram Moolenaar  source Xvim9_script
562750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
563750802b5SBram Moolenaar  set cpo&vim
564750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
565750802b5SBram Moolenaar  delete('Xvim9_script')
566750802b5SBram Moolenaarenddef
567750802b5SBram Moolenaar
568750802b5SBram Moolenaardef Test_vim9script_fails()
5698a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
5708a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
571750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
572f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
573750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
574750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
575750802b5SBram Moolenaar
576750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
577750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
5788a7d6542SBram Moolenaarenddef
5798a7d6542SBram Moolenaar
5808a7d6542SBram Moolenaardef Test_vim9script_reload()
5818a7d6542SBram Moolenaar  let lines =<< trim END
5828a7d6542SBram Moolenaar    vim9script
5838a7d6542SBram Moolenaar    const var = ''
5848a7d6542SBram Moolenaar    let valone = 1234
5858a7d6542SBram Moolenaar    def MyFunc(arg: string)
5868a7d6542SBram Moolenaar       valone = 5678
5878a7d6542SBram Moolenaar    enddef
5888a7d6542SBram Moolenaar  END
5898a7d6542SBram Moolenaar  let morelines =<< trim END
5908a7d6542SBram Moolenaar    let valtwo = 222
5918a7d6542SBram Moolenaar    export def GetValtwo(): number
5928a7d6542SBram Moolenaar      return valtwo
5938a7d6542SBram Moolenaar    enddef
5948a7d6542SBram Moolenaar  END
5958a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
5968a7d6542SBram Moolenaar  source Xreload.vim
5978a7d6542SBram Moolenaar  source Xreload.vim
5988a7d6542SBram Moolenaar  source Xreload.vim
5998a7d6542SBram Moolenaar
6008a7d6542SBram Moolenaar  let testlines =<< trim END
6018a7d6542SBram Moolenaar    vim9script
6028a7d6542SBram Moolenaar    def TheFunc()
6038a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
6048a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
6058a7d6542SBram Moolenaar    enddef
6068a7d6542SBram Moolenaar    TheFunc()
6078a7d6542SBram Moolenaar  END
6088a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
6098a7d6542SBram Moolenaar  source Ximport.vim
6108a7d6542SBram Moolenaar
6118a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
6128a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
6138a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
6148a7d6542SBram Moolenaar  source Xreload.vim
6158a7d6542SBram Moolenaar  source Ximport.vim
6168a7d6542SBram Moolenaar
6178a7d6542SBram Moolenaar  " cannot declare a var twice
6188a7d6542SBram Moolenaar  lines =<< trim END
6198a7d6542SBram Moolenaar    vim9script
6208a7d6542SBram Moolenaar    let valone = 1234
6218a7d6542SBram Moolenaar    let valone = 5678
6228a7d6542SBram Moolenaar  END
6238a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
6248a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
6258a7d6542SBram Moolenaar
6268a7d6542SBram Moolenaar  delete('Xreload.vim')
6278a7d6542SBram Moolenaar  delete('Ximport.vim')
6288a7d6542SBram Moolenaarenddef
6298a7d6542SBram Moolenaar
6308a7d6542SBram Moolenaardef Test_import_absolute()
6318a7d6542SBram Moolenaar  let import_lines = [
6328a7d6542SBram Moolenaar        \ 'vim9script',
6338a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
634b283a8a6SBram Moolenaar        \ 'def UseExported()',
6358a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
6364e12a5dfSBram Moolenaar        \ '  exported = 8888',
6374e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
638b283a8a6SBram Moolenaar        \ 'enddef',
639b283a8a6SBram Moolenaar        \ 'UseExported()',
6404e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
6418a7d6542SBram Moolenaar        \ ]
6428a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
6438a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
6448a7d6542SBram Moolenaar
6458a7d6542SBram Moolenaar  source Ximport_abs.vim
6468a7d6542SBram Moolenaar
6478a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
6484e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
649b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
650b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
651b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
6524e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
6534e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
6544e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
6554e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
6564e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
6574e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
6584e12a5dfSBram Moolenaar        \, g:import_disassembled)
6598a7d6542SBram Moolenaar  unlet g:imported_abs
6604e12a5dfSBram Moolenaar  unlet g:import_disassembled
6618a7d6542SBram Moolenaar
6628a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
6638a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
6648a7d6542SBram Moolenaarenddef
6658a7d6542SBram Moolenaar
6668a7d6542SBram Moolenaardef Test_import_rtp()
6678a7d6542SBram Moolenaar  let import_lines = [
6688a7d6542SBram Moolenaar        \ 'vim9script',
6698a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
6708a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
6718a7d6542SBram Moolenaar        \ ]
6728a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
6738a7d6542SBram Moolenaar  mkdir('import')
6748a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
6758a7d6542SBram Moolenaar
6768a7d6542SBram Moolenaar  let save_rtp = &rtp
6778a7d6542SBram Moolenaar  &rtp = getcwd()
6788a7d6542SBram Moolenaar  source Ximport_rtp.vim
6798a7d6542SBram Moolenaar  &rtp = save_rtp
6808a7d6542SBram Moolenaar
6818a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
6828a7d6542SBram Moolenaar  unlet g:imported_rtp
6838a7d6542SBram Moolenaar
6848a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
6858a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
6868a7d6542SBram Moolenaar  delete('import', 'd')
6878a7d6542SBram Moolenaarenddef
6888a7d6542SBram Moolenaar
6898a7d6542SBram Moolenaardef Test_fixed_size_list()
6908a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
6918a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
6928a7d6542SBram Moolenaar  l->remove(0)
6938a7d6542SBram Moolenaar  l->add(5)
6948a7d6542SBram Moolenaar  l->insert(99, 1)
6950f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
6968a7d6542SBram Moolenaarenddef
6978a7d6542SBram Moolenaar
698158906cfSBram Moolenaardef IfElse(what: number): string
699158906cfSBram Moolenaar  let res = ''
700158906cfSBram Moolenaar  if what == 1
701158906cfSBram Moolenaar    res = "one"
702158906cfSBram Moolenaar  elseif what == 2
703158906cfSBram Moolenaar    res = "two"
704a259d8d3SBram Moolenaar  else
705158906cfSBram Moolenaar    res = "three"
706a259d8d3SBram Moolenaar  endif
707158906cfSBram Moolenaar  return res
708a259d8d3SBram Moolenaarenddef
709a259d8d3SBram Moolenaar
710158906cfSBram Moolenaardef Test_if_elseif_else()
711158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
712158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
713158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
7140f18b6d1SBram Moolenaarenddef
7150f18b6d1SBram Moolenaar
716e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
717e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
718e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
719e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
720e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
721585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
722e8c4abbbSBram Moolenaarenddef
723e8c4abbbSBram Moolenaar
7246d69bf60SBram Moolenaarlet g:bool_true = v:true
7256d69bf60SBram Moolenaarlet g:bool_false = v:false
7266d69bf60SBram Moolenaar
7276d69bf60SBram Moolenaardef Test_if_const_expr()
7286d69bf60SBram Moolenaar  let res = false
7296d69bf60SBram Moolenaar  if true ? true : false
7306d69bf60SBram Moolenaar    res = true
7316d69bf60SBram Moolenaar  endif
7326d69bf60SBram Moolenaar  assert_equal(true, res)
7336d69bf60SBram Moolenaar
734585fea7bSBram Moolenaar  g:glob = 2
735585fea7bSBram Moolenaar  if false
736585fea7bSBram Moolenaar    execute('let g:glob = 3')
737585fea7bSBram Moolenaar  endif
738585fea7bSBram Moolenaar  assert_equal(2, g:glob)
739585fea7bSBram Moolenaar  if true
740585fea7bSBram Moolenaar    execute('let g:glob = 3')
741585fea7bSBram Moolenaar  endif
742585fea7bSBram Moolenaar  assert_equal(3, g:glob)
743585fea7bSBram Moolenaar
7446d69bf60SBram Moolenaar  res = false
7456d69bf60SBram Moolenaar  if g:bool_true ? true : false
7466d69bf60SBram Moolenaar    res = true
7476d69bf60SBram Moolenaar  endif
7486d69bf60SBram Moolenaar  assert_equal(true, res)
7496d69bf60SBram Moolenaar
7506d69bf60SBram Moolenaar  res = false
7516d69bf60SBram Moolenaar  if true ? g:bool_true : false
7526d69bf60SBram Moolenaar    res = true
7536d69bf60SBram Moolenaar  endif
7546d69bf60SBram Moolenaar  assert_equal(true, res)
7556d69bf60SBram Moolenaar
7566d69bf60SBram Moolenaar  res = false
7576d69bf60SBram Moolenaar  if true ? true : g:bool_false
7586d69bf60SBram Moolenaar    res = true
7596d69bf60SBram Moolenaar  endif
7606d69bf60SBram Moolenaar  assert_equal(true, res)
7616d69bf60SBram Moolenaar
7626d69bf60SBram Moolenaar  res = false
7636d69bf60SBram Moolenaar  if true ? false : true
7646d69bf60SBram Moolenaar    res = true
7656d69bf60SBram Moolenaar  endif
7666d69bf60SBram Moolenaar  assert_equal(false, res)
7676d69bf60SBram Moolenaar
7686d69bf60SBram Moolenaar  res = false
7696d69bf60SBram Moolenaar  if false ? false : true
7706d69bf60SBram Moolenaar    res = true
7716d69bf60SBram Moolenaar  endif
7726d69bf60SBram Moolenaar  assert_equal(true, res)
7736d69bf60SBram Moolenaar
7746d69bf60SBram Moolenaar  res = false
7756d69bf60SBram Moolenaar  if false ? true : false
7766d69bf60SBram Moolenaar    res = true
7776d69bf60SBram Moolenaar  endif
7786d69bf60SBram Moolenaar  assert_equal(false, res)
7796d69bf60SBram Moolenaar
7806d69bf60SBram Moolenaar  res = false
781e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
782e8c4abbbSBram Moolenaar    res = true
783e8c4abbbSBram Moolenaar  endif
784e8c4abbbSBram Moolenaar  assert_equal(false, res)
785e8c4abbbSBram Moolenaar
786e8c4abbbSBram Moolenaar  res = false
7876d69bf60SBram Moolenaar  if true && true
7886d69bf60SBram Moolenaar    res = true
7896d69bf60SBram Moolenaar  endif
7906d69bf60SBram Moolenaar  assert_equal(true, res)
7916d69bf60SBram Moolenaar
7926d69bf60SBram Moolenaar  res = false
7936d69bf60SBram Moolenaar  if true && false
7946d69bf60SBram Moolenaar    res = true
7956d69bf60SBram Moolenaar  endif
7966d69bf60SBram Moolenaar  assert_equal(false, res)
7976d69bf60SBram Moolenaar
7986d69bf60SBram Moolenaar  res = false
7996d69bf60SBram Moolenaar  if g:bool_true && false
8006d69bf60SBram Moolenaar    res = true
8016d69bf60SBram Moolenaar  endif
8026d69bf60SBram Moolenaar  assert_equal(false, res)
8036d69bf60SBram Moolenaar
8046d69bf60SBram Moolenaar  res = false
8056d69bf60SBram Moolenaar  if true && g:bool_false
8066d69bf60SBram Moolenaar    res = true
8076d69bf60SBram Moolenaar  endif
8086d69bf60SBram Moolenaar  assert_equal(false, res)
8096d69bf60SBram Moolenaar
8106d69bf60SBram Moolenaar  res = false
8116d69bf60SBram Moolenaar  if false && false
8126d69bf60SBram Moolenaar    res = true
8136d69bf60SBram Moolenaar  endif
8146d69bf60SBram Moolenaar  assert_equal(false, res)
8156d69bf60SBram Moolenaar
8166d69bf60SBram Moolenaar  res = false
8176d69bf60SBram Moolenaar  if true || false
8186d69bf60SBram Moolenaar    res = true
8196d69bf60SBram Moolenaar  endif
8206d69bf60SBram Moolenaar  assert_equal(true, res)
8216d69bf60SBram Moolenaar
8226d69bf60SBram Moolenaar  res = false
8236d69bf60SBram Moolenaar  if g:bool_true || false
8246d69bf60SBram Moolenaar    res = true
8256d69bf60SBram Moolenaar  endif
8266d69bf60SBram Moolenaar  assert_equal(true, res)
8276d69bf60SBram Moolenaar
8286d69bf60SBram Moolenaar  res = false
8296d69bf60SBram Moolenaar  if true || g:bool_false
8306d69bf60SBram Moolenaar    res = true
8316d69bf60SBram Moolenaar  endif
8326d69bf60SBram Moolenaar  assert_equal(true, res)
8336d69bf60SBram Moolenaar
8346d69bf60SBram Moolenaar  res = false
8356d69bf60SBram Moolenaar  if false || false
8366d69bf60SBram Moolenaar    res = true
8376d69bf60SBram Moolenaar  endif
8386d69bf60SBram Moolenaar  assert_equal(false, res)
83980c34ca3SBram Moolenaarenddef
8406d69bf60SBram Moolenaar
84180c34ca3SBram Moolenaardef Test_if_const_expr_fails()
84280c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
84380c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
844e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
845e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
8466d69bf60SBram Moolenaarenddef
8476d69bf60SBram Moolenaar
848ad39c094SBram Moolenaardef Test_execute_cmd()
849ad39c094SBram Moolenaar  new
850ad39c094SBram Moolenaar  setline(1, 'default')
851ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
852ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
853ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
854ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
855ad39c094SBram Moolenaar  execute cmd1 cmd2
856ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
857ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
858ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
859ad39c094SBram Moolenaar  let cmd_first = 'call '
860ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
861ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
862ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
863ad39c094SBram Moolenaar  bwipe!
864585fea7bSBram Moolenaar
865585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
866ad39c094SBram Moolenaarenddef
867ad39c094SBram Moolenaar
868ad39c094SBram Moolenaardef Test_echo_cmd()
869585fea7bSBram Moolenaar  echo 'some'
870585fea7bSBram Moolenaar  echon 'thing'
871ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
872ad39c094SBram Moolenaar
873ad39c094SBram Moolenaar  let str1 = 'some'
874ad39c094SBram Moolenaar  let str2 = 'more'
875ad39c094SBram Moolenaar  echo str1 str2
876ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
877ad39c094SBram Moolenaarenddef
878ad39c094SBram Moolenaar
87941fe0617SBram Moolenaardef Test_for_outside_of_function()
88041fe0617SBram Moolenaar  let lines =<< trim END
88141fe0617SBram Moolenaar    vim9script
88241fe0617SBram Moolenaar    new
88341fe0617SBram Moolenaar    for var in range(0, 3)
88441fe0617SBram Moolenaar      append(line('$'), var)
88541fe0617SBram Moolenaar    endfor
88641fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
88741fe0617SBram Moolenaar    bwipe!
88841fe0617SBram Moolenaar  END
88941fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
89041fe0617SBram Moolenaar  source Xvim9for.vim
89141fe0617SBram Moolenaar  delete('Xvim9for.vim')
89241fe0617SBram Moolenaarenddef
8938a7d6542SBram Moolenaar
894e8c4abbbSBram Moolenaardef Test_for_loop()
895e8c4abbbSBram Moolenaar  let result = ''
896e8c4abbbSBram Moolenaar  for cnt in range(7)
897e8c4abbbSBram Moolenaar    if cnt == 4
898e8c4abbbSBram Moolenaar      break
899e8c4abbbSBram Moolenaar    endif
900e8c4abbbSBram Moolenaar    if cnt == 2
901e8c4abbbSBram Moolenaar      continue
902e8c4abbbSBram Moolenaar    endif
903e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
904e8c4abbbSBram Moolenaar  endfor
905e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
906e8c4abbbSBram Moolenaarenddef
907e8c4abbbSBram Moolenaar
908e8c4abbbSBram Moolenaardef Test_for_loop_fails()
909e8c4abbbSBram Moolenaar  call CheckDefFailure(['for # in range(5)'], 'E690:')
910e8c4abbbSBram Moolenaar  call CheckDefFailure(['for i In range(5)'], 'E690:')
911e8c4abbbSBram Moolenaar  call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
912e8c4abbbSBram Moolenaar  call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:')
913e8c4abbbSBram Moolenaar  call CheckDefFailure(['for i in "text"'], 'E1024:')
914e8c4abbbSBram Moolenaar  call CheckDefFailure(['for i in xxx'], 'E1001:')
915e8c4abbbSBram Moolenaar  call CheckDefFailure(['endfor'], 'E588:')
916585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
917e8c4abbbSBram Moolenaarenddef
918e8c4abbbSBram Moolenaar
919d0df1aacSBram Moolenaardef Test_while_loop()
920d0df1aacSBram Moolenaar  let result = ''
921d0df1aacSBram Moolenaar  let cnt = 0
922d0df1aacSBram Moolenaar  while cnt < 555
923d0df1aacSBram Moolenaar    if cnt == 3
924d0df1aacSBram Moolenaar      break
925d0df1aacSBram Moolenaar    endif
926d0df1aacSBram Moolenaar    cnt += 1
927d0df1aacSBram Moolenaar    if cnt == 2
928d0df1aacSBram Moolenaar      continue
929d0df1aacSBram Moolenaar    endif
930d0df1aacSBram Moolenaar    result ..= cnt .. '_'
931d0df1aacSBram Moolenaar  endwhile
932d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
933d0df1aacSBram Moolenaarenddef
934d0df1aacSBram Moolenaar
935e8c4abbbSBram Moolenaardef Test_while_loop_fails()
936e8c4abbbSBram Moolenaar  call CheckDefFailure(['while xxx'], 'E1001:')
937e8c4abbbSBram Moolenaar  call CheckDefFailure(['endwhile'], 'E588:')
938e8c4abbbSBram Moolenaar  call CheckDefFailure(['continue'], 'E586:')
939e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'continue'], 'E586:')
940e8c4abbbSBram Moolenaar  call CheckDefFailure(['break'], 'E587:')
941e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'break'], 'E587:')
942585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'echo 3'], 'E170:')
943bd5da371SBram Moolenaarenddef
944bd5da371SBram Moolenaar
9459645e2d9SBram Moolenaardef Test_interrupt_loop()
94697acfc78SBram Moolenaar  let caught = false
9479645e2d9SBram Moolenaar  let x = 0
94897acfc78SBram Moolenaar  try
9499645e2d9SBram Moolenaar    while 1
9509645e2d9SBram Moolenaar      x += 1
9519645e2d9SBram Moolenaar      if x == 100
9529645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
9539645e2d9SBram Moolenaar      endif
9549645e2d9SBram Moolenaar    endwhile
95597acfc78SBram Moolenaar  catch
95697acfc78SBram Moolenaar    caught = true
95797acfc78SBram Moolenaar    assert_equal(100, x)
95897acfc78SBram Moolenaar  endtry
95997acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
9609645e2d9SBram Moolenaarenddef
96120431c9dSBram Moolenaar
9627d941ee0SBram Moolenaar
963585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
964585fea7bSBram Moolenaardef Test_substitute_cmd()
965585fea7bSBram Moolenaar  new
966585fea7bSBram Moolenaar  setline(1, 'something')
967585fea7bSBram Moolenaar  :substitute(some(other(
968585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
969585fea7bSBram Moolenaar  bwipe!
970585fea7bSBram Moolenaar
971585fea7bSBram Moolenaar  " also when the context is Vim9 script
972585fea7bSBram Moolenaar  let lines =<< trim END
973585fea7bSBram Moolenaar    vim9script
974585fea7bSBram Moolenaar    new
975585fea7bSBram Moolenaar    setline(1, 'something')
976585fea7bSBram Moolenaar    :substitute(some(other(
977585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
978585fea7bSBram Moolenaar    bwipe!
979585fea7bSBram Moolenaar  END
980585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
981585fea7bSBram Moolenaar  source Xvim9lines
982585fea7bSBram Moolenaar
983585fea7bSBram Moolenaar  delete('Xvim9lines')
984585fea7bSBram Moolenaarenddef
985585fea7bSBram Moolenaar
9868a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
987