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
625deeb3f1SBram Moolenaar  let Funky1: func
635deeb3f1SBram Moolenaar  let Funky2: func = function('len')
645deeb3f1SBram 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:')
1305deeb3f1SBram Moolenaarenddef
1315deeb3f1SBram Moolenaar
1325deeb3f1SBram 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
1525deeb3f1SBram Moolenaar  let Thefunc: func
1535deeb3f1SBram 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
173cab27678SBram Moolenaardef Mess(): string
174cab27678SBram Moolenaar  v:foldstart = 123
175cab27678SBram Moolenaar  return 'xxx'
176cab27678SBram Moolenaarenddef
177cab27678SBram Moolenaar
1788a7d6542SBram Moolenaarfunc Test_assignment_failure()
1798a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
1808a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
1818a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
1828a7d6542SBram Moolenaar
1838a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
1848a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
1858a7d6542SBram Moolenaar
1869be61bbbSBram Moolenaar  call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
1879be61bbbSBram Moolenaar
188e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
1899be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
1909be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
1919be61bbbSBram Moolenaar
1929be61bbbSBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1065:')
1939be61bbbSBram Moolenaar
1949be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
1959be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
1969be61bbbSBram Moolenaar
1979be61bbbSBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016:')
1989be61bbbSBram Moolenaar
1999be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
2009be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
2019be61bbbSBram Moolenaar
20233fa29cfSBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
20333fa29cfSBram Moolenaar
2048a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
2058a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
2068a7d6542SBram Moolenaar
2078a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
2088a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
2098a7d6542SBram Moolenaar
2108a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
2118a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
21242a480bfSBram Moolenaar
213d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
21442a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
215cab27678SBram Moolenaar
216cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
217cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
218599c89c8SBram Moolenaarendfunc
219599c89c8SBram Moolenaar
220599c89c8SBram Moolenaarfunc Test_wrong_type()
221599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
222599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
223599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
224599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
225599c89c8SBram Moolenaar
226599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
227599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
22842a480bfSBram Moolenaar
22942a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
23042a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
23142a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
23242a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
23342a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
23442a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
23542a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
23642a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
23742a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
23842a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
23942a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
2408a7d6542SBram Moolenaarendfunc
2418a7d6542SBram Moolenaar
2428a7d6542SBram Moolenaarfunc Test_const()
2438a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
2448a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
2458a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
2469be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
2478a7d6542SBram Moolenaarendfunc
2488a7d6542SBram Moolenaar
2498a7d6542SBram Moolenaardef Test_block()
2508a7d6542SBram Moolenaar  let outer = 1
2518a7d6542SBram Moolenaar  {
2528a7d6542SBram Moolenaar    let inner = 2
2538a7d6542SBram Moolenaar    assert_equal(1, outer)
2548a7d6542SBram Moolenaar    assert_equal(2, inner)
2558a7d6542SBram Moolenaar  }
2568a7d6542SBram Moolenaar  assert_equal(1, outer)
2578a7d6542SBram Moolenaarenddef
2588a7d6542SBram Moolenaar
2598a7d6542SBram Moolenaarfunc Test_block_failure()
2608a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
261585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
262585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
2638a7d6542SBram Moolenaarendfunc
2648a7d6542SBram Moolenaar
265585fea7bSBram Moolenaardef Test_cmd_modifier()
266585fea7bSBram Moolenaar  tab echo '0'
267585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
268585fea7bSBram Moolenaarenddef
269585fea7bSBram Moolenaar
2708a7d6542SBram Moolenaardef Test_try_catch()
2718a7d6542SBram Moolenaar  let l = []
2728a7d6542SBram Moolenaar  try
2738a7d6542SBram Moolenaar    add(l, '1')
2748a7d6542SBram Moolenaar    throw 'wrong'
2758a7d6542SBram Moolenaar    add(l, '2')
2768a7d6542SBram Moolenaar  catch
2778a7d6542SBram Moolenaar    add(l, v:exception)
2788a7d6542SBram Moolenaar  finally
2798a7d6542SBram Moolenaar    add(l, '3')
2808a7d6542SBram Moolenaar  endtry
2818a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
2828a7d6542SBram Moolenaarenddef
2838a7d6542SBram Moolenaar
284257cc5eeSBram Moolenaardef ThrowFromDef()
285257cc5eeSBram Moolenaar  throw 'getout'
286257cc5eeSBram Moolenaarenddef
287257cc5eeSBram Moolenaar
288257cc5eeSBram Moolenaarfunc CatchInFunc()
289257cc5eeSBram Moolenaar  try
290257cc5eeSBram Moolenaar    call ThrowFromDef()
291257cc5eeSBram Moolenaar  catch
292257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
293257cc5eeSBram Moolenaar  endtry
294257cc5eeSBram Moolenaarendfunc
295257cc5eeSBram Moolenaar
296257cc5eeSBram Moolenaardef CatchInDef()
297257cc5eeSBram Moolenaar  try
298257cc5eeSBram Moolenaar    ThrowFromDef()
299257cc5eeSBram Moolenaar  catch
300257cc5eeSBram Moolenaar    g:thrown_def = v:exception
301257cc5eeSBram Moolenaar  endtry
302257cc5eeSBram Moolenaarenddef
303257cc5eeSBram Moolenaar
304f575adffSBram Moolenaardef ReturnFinally(): string
305f575adffSBram Moolenaar  try
306f575adffSBram Moolenaar    return 'intry'
307f575adffSBram Moolenaar  finally
308f575adffSBram Moolenaar    g:in_finally = 'finally'
309f575adffSBram Moolenaar  endtry
310f575adffSBram Moolenaar  return 'end'
311f575adffSBram Moolenaarenddef
312f575adffSBram Moolenaar
313257cc5eeSBram Moolenaardef Test_try_catch_nested()
314257cc5eeSBram Moolenaar  CatchInFunc()
315257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
316257cc5eeSBram Moolenaar
317257cc5eeSBram Moolenaar  CatchInDef()
318257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
319f575adffSBram Moolenaar
320f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
321f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
322f575adffSBram Moolenaarenddef
323f575adffSBram Moolenaar
324f575adffSBram Moolenaardef Test_try_catch_match()
325f575adffSBram Moolenaar  let seq = 'a'
326f575adffSBram Moolenaar  try
327f575adffSBram Moolenaar    throw 'something'
328f575adffSBram Moolenaar  catch /nothing/
329f575adffSBram Moolenaar    seq ..= 'x'
330f575adffSBram Moolenaar  catch /some/
331f575adffSBram Moolenaar    seq ..= 'b'
332f575adffSBram Moolenaar  catch /asdf/
333f575adffSBram Moolenaar    seq ..= 'x'
334e8c4abbbSBram Moolenaar  catch ?a\?sdf?
335e8c4abbbSBram Moolenaar    seq ..= 'y'
336f575adffSBram Moolenaar  finally
337f575adffSBram Moolenaar    seq ..= 'c'
338f575adffSBram Moolenaar  endtry
339f575adffSBram Moolenaar  assert_equal('abc', seq)
340257cc5eeSBram Moolenaarenddef
341257cc5eeSBram Moolenaar
342e8c4abbbSBram Moolenaardef Test_try_catch_fails()
343e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
344e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
345e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
346585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
347585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
348585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
349585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
350585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
351585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
352585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
353585fea7bSBram Moolenaar
354585fea7bSBram Moolenaar  call CheckDefFailure(['throw'], 'E471:')
355585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
356e8c4abbbSBram Moolenaarenddef
357e8c4abbbSBram Moolenaar
3588a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
3598a7d6542SBram Moolenaar  vim9script
3608a7d6542SBram Moolenaar  let name: string = 'bob'
3618a7d6542SBram Moolenaar  def Concat(arg: string): string
3628a7d6542SBram Moolenaar    return name .. arg
3638a7d6542SBram Moolenaar  enddef
3648a7d6542SBram Moolenaar  let g:result = Concat('bie')
3658a7d6542SBram Moolenaar  let g:localname = name
3668a7d6542SBram Moolenaar
3678a7d6542SBram Moolenaar  export const CONST = 1234
3688a7d6542SBram Moolenaar  export let exported = 9876
3696e587dcbSBram Moolenaar  export let exp_name = 'John'
3708a7d6542SBram Moolenaar  export def Exported(): string
3718a7d6542SBram Moolenaar    return 'Exported'
3728a7d6542SBram Moolenaar  enddef
3738a7d6542SBram MoolenaarEND
3748a7d6542SBram Moolenaar
3755269bd2aSBram Moolenaardef Test_vim9_import_export()
3768a7d6542SBram Moolenaar  let import_script_lines =<< trim END
3778a7d6542SBram Moolenaar    vim9script
3788a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
3798a7d6542SBram Moolenaar    g:imported = exported
3806e587dcbSBram Moolenaar    exported += 3
3816e587dcbSBram Moolenaar    g:imported_added = exported
3828a7d6542SBram Moolenaar    g:imported_func = Exported()
3836e587dcbSBram Moolenaar
3846e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
3856e587dcbSBram Moolenaar    g:imported_name = exp_name
3866e587dcbSBram Moolenaar    exp_name ..= ' Doe'
3876e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
3885381c7a1SBram Moolenaar    g:imported_later = exported
3898a7d6542SBram Moolenaar  END
3908a7d6542SBram Moolenaar
3918a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
3928a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
3938a7d6542SBram Moolenaar
3948a7d6542SBram Moolenaar  source Ximport.vim
3958a7d6542SBram Moolenaar
3968a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
3978a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
3988a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
3996e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
4005381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
4018a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
4026e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
4036e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
4048a7d6542SBram Moolenaar  assert_false(exists('g:name'))
4058a7d6542SBram Moolenaar
4068a7d6542SBram Moolenaar  unlet g:result
4078a7d6542SBram Moolenaar  unlet g:localname
4088a7d6542SBram Moolenaar  unlet g:imported
4096e587dcbSBram Moolenaar  unlet g:imported_added
4105381c7a1SBram Moolenaar  unlet g:imported_later
4118a7d6542SBram Moolenaar  unlet g:imported_func
4126e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
4138a7d6542SBram Moolenaar  delete('Ximport.vim')
414f2d5c240SBram Moolenaar
4155381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
4165381c7a1SBram Moolenaar    vim9script
4175381c7a1SBram Moolenaar    def ImportInDef()
4185381c7a1SBram Moolenaar      import exported from './Xexport.vim'
4195381c7a1SBram Moolenaar      g:imported = exported
4205381c7a1SBram Moolenaar      exported += 7
4215381c7a1SBram Moolenaar      g:imported_added = exported
4225381c7a1SBram Moolenaar    enddef
4235381c7a1SBram Moolenaar    ImportInDef()
4245381c7a1SBram Moolenaar  END
4255381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
4265381c7a1SBram Moolenaar  source Ximport2.vim
4275381c7a1SBram Moolenaar  " TODO: this should be 9879
4285381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
4295381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
4305381c7a1SBram Moolenaar  unlet g:imported
4315381c7a1SBram Moolenaar  unlet g:imported_added
4325381c7a1SBram Moolenaar  delete('Ximport2.vim')
4335381c7a1SBram Moolenaar
434f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
435f2d5c240SBram Moolenaar    vim9script
436f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
437f2d5c240SBram Moolenaar    def UseExport()
438f2d5c240SBram Moolenaar      g:imported = Export.exported
439f2d5c240SBram Moolenaar    enddef
440f2d5c240SBram Moolenaar    UseExport()
441f2d5c240SBram Moolenaar  END
442f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
443f2d5c240SBram Moolenaar  source Ximport.vim
4445381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
445f2d5c240SBram Moolenaar
446599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
447599c89c8SBram Moolenaar    vim9script
448599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
449599c89c8SBram Moolenaar    def Func()
450599c89c8SBram Moolenaar      let dummy = 1
451599c89c8SBram Moolenaar      let imported = Export + dummy
452599c89c8SBram Moolenaar    enddef
453599c89c8SBram Moolenaar  END
454599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
455599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
456599c89c8SBram Moolenaar
457599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
458599c89c8SBram Moolenaar    vim9script
459599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
460599c89c8SBram Moolenaar    def Func()
461599c89c8SBram Moolenaar      let imported = Export . exported
462599c89c8SBram Moolenaar    enddef
463599c89c8SBram Moolenaar  END
464599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
465599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
466599c89c8SBram Moolenaar
467599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
468599c89c8SBram Moolenaar    vim9script
469599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
470599c89c8SBram Moolenaar    def Func()
471599c89c8SBram Moolenaar      let imported = Export.
472599c89c8SBram Moolenaar    enddef
473599c89c8SBram Moolenaar  END
474599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
475599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
476599c89c8SBram Moolenaar
477f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
478f2d5c240SBram Moolenaar    vim9script
479f2d5c240SBram Moolenaar    import * from './Xexport.vim'
480f2d5c240SBram Moolenaar    g:imported = exported
481f2d5c240SBram Moolenaar  END
482f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
483f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
484f2d5c240SBram Moolenaar
485fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
486fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
487fa29c8abSBram Moolenaar    vim9script
488fa29c8abSBram Moolenaar    import name from './Xexport.vim'
489fa29c8abSBram Moolenaar  END
490fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
491fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
492fa29c8abSBram Moolenaar
4935269bd2aSBram Moolenaar  " try to import something that is already defined
4945269bd2aSBram Moolenaar  let import_already_defined =<< trim END
4955269bd2aSBram Moolenaar    vim9script
4965269bd2aSBram Moolenaar    let exported = 'something'
4975269bd2aSBram Moolenaar    import exported from './Xexport.vim'
4985269bd2aSBram Moolenaar  END
4995269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5005269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5015269bd2aSBram Moolenaar
5025269bd2aSBram Moolenaar  " try to import something that is already defined
5035269bd2aSBram Moolenaar  import_already_defined =<< trim END
5045269bd2aSBram Moolenaar    vim9script
5055269bd2aSBram Moolenaar    let exported = 'something'
5065269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
5075269bd2aSBram Moolenaar  END
5085269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5095269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5105269bd2aSBram Moolenaar
5115269bd2aSBram Moolenaar  " try to import something that is already defined
5125269bd2aSBram Moolenaar  import_already_defined =<< trim END
5135269bd2aSBram Moolenaar    vim9script
5145269bd2aSBram Moolenaar    let exported = 'something'
5155269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
5165269bd2aSBram Moolenaar  END
5175269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5185269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5195269bd2aSBram Moolenaar
520fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
521fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
522fa29c8abSBram Moolenaar    vim9script
523fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
524fa29c8abSBram Moolenaar  END
525fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
526fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
527fa29c8abSBram Moolenaar
528fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
529fa29c8abSBram Moolenaar    vim9script
530fa29c8abSBram Moolenaar    import name './Xexport.vim'
531fa29c8abSBram Moolenaar  END
532fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
533fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
534fa29c8abSBram Moolenaar
535fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
536fa29c8abSBram Moolenaar    vim9script
537fa29c8abSBram Moolenaar    import name from Xexport.vim
538fa29c8abSBram Moolenaar  END
539fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
540fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
541fa29c8abSBram Moolenaar
542fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
543fa29c8abSBram Moolenaar    vim9script
544fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
545fa29c8abSBram Moolenaar  END
546fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
547fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
548fa29c8abSBram Moolenaar
549fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
550fa29c8abSBram Moolenaar    vim9script
551fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
552fa29c8abSBram Moolenaar  END
5535269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
5545269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
555fa29c8abSBram Moolenaar
556f2d5c240SBram Moolenaar  delete('Ximport.vim')
5575269bd2aSBram Moolenaar  delete('Ximport3.vim')
5588a7d6542SBram Moolenaar  delete('Xexport.vim')
5598a7d6542SBram Moolenaar
560750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
561750802b5SBram Moolenaar  set cpo&vi
562750802b5SBram Moolenaar  let cpo_before = &cpo
563750802b5SBram Moolenaar  let lines =<< trim END
564750802b5SBram Moolenaar    vim9script
565750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
566750802b5SBram Moolenaar  END
567750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
568750802b5SBram Moolenaar  source Xvim9_script
569750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
570750802b5SBram Moolenaar  set cpo&vim
571750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
572750802b5SBram Moolenaar  delete('Xvim9_script')
573750802b5SBram Moolenaarenddef
574750802b5SBram Moolenaar
575750802b5SBram Moolenaardef Test_vim9script_fails()
5768a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
5778a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
578750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
579f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
580750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
581750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
582750802b5SBram Moolenaar
583750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
584750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
5858a7d6542SBram Moolenaarenddef
5868a7d6542SBram Moolenaar
5878a7d6542SBram Moolenaardef Test_vim9script_reload()
5888a7d6542SBram Moolenaar  let lines =<< trim END
5898a7d6542SBram Moolenaar    vim9script
5908a7d6542SBram Moolenaar    const var = ''
5918a7d6542SBram Moolenaar    let valone = 1234
5928a7d6542SBram Moolenaar    def MyFunc(arg: string)
5938a7d6542SBram Moolenaar       valone = 5678
5948a7d6542SBram Moolenaar    enddef
5958a7d6542SBram Moolenaar  END
5968a7d6542SBram Moolenaar  let morelines =<< trim END
5978a7d6542SBram Moolenaar    let valtwo = 222
5988a7d6542SBram Moolenaar    export def GetValtwo(): number
5998a7d6542SBram Moolenaar      return valtwo
6008a7d6542SBram Moolenaar    enddef
6018a7d6542SBram Moolenaar  END
602675f716eSBram Moolenaar  writefile(lines + morelines,
603675f716eSBram Moolenaar            'Xreload.vim')
6048a7d6542SBram Moolenaar  source Xreload.vim
6058a7d6542SBram Moolenaar  source Xreload.vim
6068a7d6542SBram Moolenaar  source Xreload.vim
6078a7d6542SBram Moolenaar
6088a7d6542SBram Moolenaar  let testlines =<< trim END
6098a7d6542SBram Moolenaar    vim9script
6108a7d6542SBram Moolenaar    def TheFunc()
6118a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
6128a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
6138a7d6542SBram Moolenaar    enddef
6148a7d6542SBram Moolenaar    TheFunc()
6158a7d6542SBram Moolenaar  END
6168a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
6178a7d6542SBram Moolenaar  source Ximport.vim
6188a7d6542SBram Moolenaar
6198a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
6208a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
6218a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
6228a7d6542SBram Moolenaar  source Xreload.vim
6238a7d6542SBram Moolenaar  source Ximport.vim
6248a7d6542SBram Moolenaar
6258a7d6542SBram Moolenaar  " cannot declare a var twice
6268a7d6542SBram Moolenaar  lines =<< trim END
6278a7d6542SBram Moolenaar    vim9script
6288a7d6542SBram Moolenaar    let valone = 1234
6298a7d6542SBram Moolenaar    let valone = 5678
6308a7d6542SBram Moolenaar  END
6318a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
6328a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
6338a7d6542SBram Moolenaar
6348a7d6542SBram Moolenaar  delete('Xreload.vim')
6358a7d6542SBram Moolenaar  delete('Ximport.vim')
6368a7d6542SBram Moolenaarenddef
6378a7d6542SBram Moolenaar
6388a7d6542SBram Moolenaardef Test_import_absolute()
6398a7d6542SBram Moolenaar  let import_lines = [
640e6085c53SBram Moolenaar        'vim9script',
641e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
642e6085c53SBram Moolenaar        'def UseExported()',
643e6085c53SBram Moolenaar        '  g:imported_abs = exported',
644e6085c53SBram Moolenaar        '  exported = 8888',
645e6085c53SBram Moolenaar        '  g:imported_after = exported',
646e6085c53SBram Moolenaar        'enddef',
647e6085c53SBram Moolenaar        'UseExported()',
648e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
649e6085c53SBram Moolenaar        ]
6508a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
6518a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
6528a7d6542SBram Moolenaar
6538a7d6542SBram Moolenaar  source Ximport_abs.vim
6548a7d6542SBram Moolenaar
6558a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
6564e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
657675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
658675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
659675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
660675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
661675f716eSBram Moolenaar          'exported = 8888.*' ..
662675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
663675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
664675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
665675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
666e6085c53SBram Moolenaar        g:import_disassembled)
6678a7d6542SBram Moolenaar  unlet g:imported_abs
6684e12a5dfSBram Moolenaar  unlet g:import_disassembled
6698a7d6542SBram Moolenaar
6708a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
6718a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
6728a7d6542SBram Moolenaarenddef
6738a7d6542SBram Moolenaar
6748a7d6542SBram Moolenaardef Test_import_rtp()
6758a7d6542SBram Moolenaar  let import_lines = [
676e6085c53SBram Moolenaar        'vim9script',
677e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
678e6085c53SBram Moolenaar        'g:imported_rtp = exported',
679e6085c53SBram Moolenaar        ]
6808a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
6818a7d6542SBram Moolenaar  mkdir('import')
6828a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
6838a7d6542SBram Moolenaar
6848a7d6542SBram Moolenaar  let save_rtp = &rtp
6858a7d6542SBram Moolenaar  &rtp = getcwd()
6868a7d6542SBram Moolenaar  source Ximport_rtp.vim
6878a7d6542SBram Moolenaar  &rtp = save_rtp
6888a7d6542SBram Moolenaar
6898a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
6908a7d6542SBram Moolenaar  unlet g:imported_rtp
6918a7d6542SBram Moolenaar
6928a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
6938a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
6948a7d6542SBram Moolenaar  delete('import', 'd')
6958a7d6542SBram Moolenaarenddef
6968a7d6542SBram Moolenaar
6978a7d6542SBram Moolenaardef Test_fixed_size_list()
6988a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
6998a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
7008a7d6542SBram Moolenaar  l->remove(0)
7018a7d6542SBram Moolenaar  l->add(5)
7028a7d6542SBram Moolenaar  l->insert(99, 1)
7030f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
7048a7d6542SBram Moolenaarenddef
7058a7d6542SBram Moolenaar
706158906cfSBram Moolenaardef IfElse(what: number): string
707158906cfSBram Moolenaar  let res = ''
708158906cfSBram Moolenaar  if what == 1
709158906cfSBram Moolenaar    res = "one"
710158906cfSBram Moolenaar  elseif what == 2
711158906cfSBram Moolenaar    res = "two"
712a259d8d3SBram Moolenaar  else
713158906cfSBram Moolenaar    res = "three"
714a259d8d3SBram Moolenaar  endif
715158906cfSBram Moolenaar  return res
716a259d8d3SBram Moolenaarenddef
717a259d8d3SBram Moolenaar
718158906cfSBram Moolenaardef Test_if_elseif_else()
719158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
720158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
721158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
7220f18b6d1SBram Moolenaarenddef
7230f18b6d1SBram Moolenaar
724e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
725e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
726e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
727e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
728e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
729585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
730e8c4abbbSBram Moolenaarenddef
731e8c4abbbSBram Moolenaar
7326d69bf60SBram Moolenaarlet g:bool_true = v:true
7336d69bf60SBram Moolenaarlet g:bool_false = v:false
7346d69bf60SBram Moolenaar
7356d69bf60SBram Moolenaardef Test_if_const_expr()
7366d69bf60SBram Moolenaar  let res = false
7376d69bf60SBram Moolenaar  if true ? true : false
7386d69bf60SBram Moolenaar    res = true
7396d69bf60SBram Moolenaar  endif
7406d69bf60SBram Moolenaar  assert_equal(true, res)
7416d69bf60SBram Moolenaar
742585fea7bSBram Moolenaar  g:glob = 2
743585fea7bSBram Moolenaar  if false
744585fea7bSBram Moolenaar    execute('let g:glob = 3')
745585fea7bSBram Moolenaar  endif
746585fea7bSBram Moolenaar  assert_equal(2, g:glob)
747585fea7bSBram Moolenaar  if true
748585fea7bSBram Moolenaar    execute('let g:glob = 3')
749585fea7bSBram Moolenaar  endif
750585fea7bSBram Moolenaar  assert_equal(3, g:glob)
751585fea7bSBram Moolenaar
7526d69bf60SBram Moolenaar  res = false
7536d69bf60SBram Moolenaar  if g:bool_true ? true : false
7546d69bf60SBram Moolenaar    res = true
7556d69bf60SBram Moolenaar  endif
7566d69bf60SBram Moolenaar  assert_equal(true, res)
7576d69bf60SBram Moolenaar
7586d69bf60SBram Moolenaar  res = false
7596d69bf60SBram Moolenaar  if true ? g:bool_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 ? true : g:bool_false
7666d69bf60SBram Moolenaar    res = true
7676d69bf60SBram Moolenaar  endif
7686d69bf60SBram Moolenaar  assert_equal(true, res)
7696d69bf60SBram Moolenaar
7706d69bf60SBram Moolenaar  res = false
7716d69bf60SBram Moolenaar  if true ? false : true
7726d69bf60SBram Moolenaar    res = true
7736d69bf60SBram Moolenaar  endif
7746d69bf60SBram Moolenaar  assert_equal(false, res)
7756d69bf60SBram Moolenaar
7766d69bf60SBram Moolenaar  res = false
7776d69bf60SBram Moolenaar  if false ? false : true
7786d69bf60SBram Moolenaar    res = true
7796d69bf60SBram Moolenaar  endif
7806d69bf60SBram Moolenaar  assert_equal(true, res)
7816d69bf60SBram Moolenaar
7826d69bf60SBram Moolenaar  res = false
7836d69bf60SBram Moolenaar  if false ? true : false
7846d69bf60SBram Moolenaar    res = true
7856d69bf60SBram Moolenaar  endif
7866d69bf60SBram Moolenaar  assert_equal(false, res)
7876d69bf60SBram Moolenaar
7886d69bf60SBram Moolenaar  res = false
789e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
790e8c4abbbSBram Moolenaar    res = true
791e8c4abbbSBram Moolenaar  endif
792e8c4abbbSBram Moolenaar  assert_equal(false, res)
793e8c4abbbSBram Moolenaar
794e8c4abbbSBram Moolenaar  res = false
7956d69bf60SBram Moolenaar  if true && true
7966d69bf60SBram Moolenaar    res = true
7976d69bf60SBram Moolenaar  endif
7986d69bf60SBram Moolenaar  assert_equal(true, res)
7996d69bf60SBram Moolenaar
8006d69bf60SBram Moolenaar  res = false
8016d69bf60SBram Moolenaar  if true && false
8026d69bf60SBram Moolenaar    res = true
8036d69bf60SBram Moolenaar  endif
8046d69bf60SBram Moolenaar  assert_equal(false, res)
8056d69bf60SBram Moolenaar
8066d69bf60SBram Moolenaar  res = false
8076d69bf60SBram Moolenaar  if g:bool_true && false
8086d69bf60SBram Moolenaar    res = true
8096d69bf60SBram Moolenaar  endif
8106d69bf60SBram Moolenaar  assert_equal(false, res)
8116d69bf60SBram Moolenaar
8126d69bf60SBram Moolenaar  res = false
8136d69bf60SBram Moolenaar  if true && g:bool_false
8146d69bf60SBram Moolenaar    res = true
8156d69bf60SBram Moolenaar  endif
8166d69bf60SBram Moolenaar  assert_equal(false, res)
8176d69bf60SBram Moolenaar
8186d69bf60SBram Moolenaar  res = false
8196d69bf60SBram Moolenaar  if false && false
8206d69bf60SBram Moolenaar    res = true
8216d69bf60SBram Moolenaar  endif
8226d69bf60SBram Moolenaar  assert_equal(false, res)
8236d69bf60SBram Moolenaar
8246d69bf60SBram Moolenaar  res = false
8256d69bf60SBram Moolenaar  if true || false
8266d69bf60SBram Moolenaar    res = true
8276d69bf60SBram Moolenaar  endif
8286d69bf60SBram Moolenaar  assert_equal(true, res)
8296d69bf60SBram Moolenaar
8306d69bf60SBram Moolenaar  res = false
8316d69bf60SBram Moolenaar  if g:bool_true || false
8326d69bf60SBram Moolenaar    res = true
8336d69bf60SBram Moolenaar  endif
8346d69bf60SBram Moolenaar  assert_equal(true, res)
8356d69bf60SBram Moolenaar
8366d69bf60SBram Moolenaar  res = false
8376d69bf60SBram Moolenaar  if true || g:bool_false
8386d69bf60SBram Moolenaar    res = true
8396d69bf60SBram Moolenaar  endif
8406d69bf60SBram Moolenaar  assert_equal(true, res)
8416d69bf60SBram Moolenaar
8426d69bf60SBram Moolenaar  res = false
8436d69bf60SBram Moolenaar  if false || false
8446d69bf60SBram Moolenaar    res = true
8456d69bf60SBram Moolenaar  endif
8466d69bf60SBram Moolenaar  assert_equal(false, res)
84780c34ca3SBram Moolenaarenddef
8486d69bf60SBram Moolenaar
84980c34ca3SBram Moolenaardef Test_if_const_expr_fails()
85080c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
85180c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
852e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
853e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
8546d69bf60SBram Moolenaarenddef
8556d69bf60SBram Moolenaar
856ad39c094SBram Moolenaardef Test_execute_cmd()
857ad39c094SBram Moolenaar  new
858ad39c094SBram Moolenaar  setline(1, 'default')
859ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
860ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
861ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
862ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
863ad39c094SBram Moolenaar  execute cmd1 cmd2
864ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
865ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
866ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
867ad39c094SBram Moolenaar  let cmd_first = 'call '
868ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
869ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
870ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
871ad39c094SBram Moolenaar  bwipe!
872585fea7bSBram Moolenaar
873585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
874ad39c094SBram Moolenaarenddef
875ad39c094SBram Moolenaar
876ad39c094SBram Moolenaardef Test_echo_cmd()
877585fea7bSBram Moolenaar  echo 'some'
878585fea7bSBram Moolenaar  echon 'thing'
879ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
880ad39c094SBram Moolenaar
881ad39c094SBram Moolenaar  let str1 = 'some'
882ad39c094SBram Moolenaar  let str2 = 'more'
883ad39c094SBram Moolenaar  echo str1 str2
884ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
885ad39c094SBram Moolenaarenddef
886ad39c094SBram Moolenaar
88741fe0617SBram Moolenaardef Test_for_outside_of_function()
88841fe0617SBram Moolenaar  let lines =<< trim END
88941fe0617SBram Moolenaar    vim9script
89041fe0617SBram Moolenaar    new
89141fe0617SBram Moolenaar    for var in range(0, 3)
89241fe0617SBram Moolenaar      append(line('$'), var)
89341fe0617SBram Moolenaar    endfor
89441fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
89541fe0617SBram Moolenaar    bwipe!
89641fe0617SBram Moolenaar  END
89741fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
89841fe0617SBram Moolenaar  source Xvim9for.vim
89941fe0617SBram Moolenaar  delete('Xvim9for.vim')
90041fe0617SBram Moolenaarenddef
9018a7d6542SBram Moolenaar
902e8c4abbbSBram Moolenaardef Test_for_loop()
903e8c4abbbSBram Moolenaar  let result = ''
904e8c4abbbSBram Moolenaar  for cnt in range(7)
905e8c4abbbSBram Moolenaar    if cnt == 4
906e8c4abbbSBram Moolenaar      break
907e8c4abbbSBram Moolenaar    endif
908e8c4abbbSBram Moolenaar    if cnt == 2
909e8c4abbbSBram Moolenaar      continue
910e8c4abbbSBram Moolenaar    endif
911e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
912e8c4abbbSBram Moolenaar  endfor
913e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
914e8c4abbbSBram Moolenaarenddef
915e8c4abbbSBram Moolenaar
916e8c4abbbSBram Moolenaardef Test_for_loop_fails()
917675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
918675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
919675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
920*6e949784SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef'], 'E1006:')
921675f716eSBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1024:')
922675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
923675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
924675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
925e8c4abbbSBram Moolenaarenddef
926e8c4abbbSBram Moolenaar
927d0df1aacSBram Moolenaardef Test_while_loop()
928d0df1aacSBram Moolenaar  let result = ''
929d0df1aacSBram Moolenaar  let cnt = 0
930d0df1aacSBram Moolenaar  while cnt < 555
931d0df1aacSBram Moolenaar    if cnt == 3
932d0df1aacSBram Moolenaar      break
933d0df1aacSBram Moolenaar    endif
934d0df1aacSBram Moolenaar    cnt += 1
935d0df1aacSBram Moolenaar    if cnt == 2
936d0df1aacSBram Moolenaar      continue
937d0df1aacSBram Moolenaar    endif
938d0df1aacSBram Moolenaar    result ..= cnt .. '_'
939d0df1aacSBram Moolenaar  endwhile
940d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
941d0df1aacSBram Moolenaarenddef
942d0df1aacSBram Moolenaar
943e8c4abbbSBram Moolenaardef Test_while_loop_fails()
944675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
945675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
946675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
947675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
948675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
949675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
950675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
951bd5da371SBram Moolenaarenddef
952bd5da371SBram Moolenaar
9539645e2d9SBram Moolenaardef Test_interrupt_loop()
95497acfc78SBram Moolenaar  let caught = false
9559645e2d9SBram Moolenaar  let x = 0
95697acfc78SBram Moolenaar  try
9579645e2d9SBram Moolenaar    while 1
9589645e2d9SBram Moolenaar      x += 1
9599645e2d9SBram Moolenaar      if x == 100
9609645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
9619645e2d9SBram Moolenaar      endif
9629645e2d9SBram Moolenaar    endwhile
96397acfc78SBram Moolenaar  catch
96497acfc78SBram Moolenaar    caught = true
96597acfc78SBram Moolenaar    assert_equal(100, x)
96697acfc78SBram Moolenaar  endtry
96797acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
9689645e2d9SBram Moolenaarenddef
96920431c9dSBram Moolenaar
9704fdae999SBram Moolenaardef Test_automatic_line_continuation()
9714fdae999SBram Moolenaar  let mylist = [
9724fdae999SBram Moolenaar      'one',
9734fdae999SBram Moolenaar      'two',
9744fdae999SBram Moolenaar      'three',
9754fdae999SBram Moolenaar      ] " comment
9764fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
9774fdae999SBram Moolenaar
9784fdae999SBram Moolenaar  let mydict = {
9794fdae999SBram Moolenaar      'one': 1,
9804fdae999SBram Moolenaar      'two': 2,
9814fdae999SBram Moolenaar      'three':
9824fdae999SBram Moolenaar          3,
9834fdae999SBram Moolenaar      } " comment
9844fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
9854fdae999SBram Moolenaar  mydict = #{
9862c330432SBram Moolenaar      one: 1,  # comment
9872c330432SBram Moolenaar      two:     # comment
9882c330432SBram Moolenaar           2,  # comment
9892c330432SBram Moolenaar      three: 3 # comment
9902c330432SBram Moolenaar      }
9912c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
9922c330432SBram Moolenaar  mydict = #{
9932c330432SBram Moolenaar      one: 1,
9944fdae999SBram Moolenaar      two:
9954fdae999SBram Moolenaar           2,
9962c330432SBram Moolenaar      three: 3
9974fdae999SBram Moolenaar      }
9984fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
999e6085c53SBram Moolenaar
1000e6085c53SBram Moolenaar  assert_equal(
1001e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1002e6085c53SBram Moolenaar        split('one two three')
1003e6085c53SBram Moolenaar        )
10044fdae999SBram Moolenaarenddef
10054fdae999SBram Moolenaar
1006585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
1007585fea7bSBram Moolenaardef Test_substitute_cmd()
1008585fea7bSBram Moolenaar  new
1009585fea7bSBram Moolenaar  setline(1, 'something')
1010585fea7bSBram Moolenaar  :substitute(some(other(
1011585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
1012585fea7bSBram Moolenaar  bwipe!
1013585fea7bSBram Moolenaar
1014585fea7bSBram Moolenaar  " also when the context is Vim9 script
1015585fea7bSBram Moolenaar  let lines =<< trim END
1016585fea7bSBram Moolenaar    vim9script
1017585fea7bSBram Moolenaar    new
1018585fea7bSBram Moolenaar    setline(1, 'something')
1019585fea7bSBram Moolenaar    :substitute(some(other(
1020585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
1021585fea7bSBram Moolenaar    bwipe!
1022585fea7bSBram Moolenaar  END
1023585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
1024585fea7bSBram Moolenaar  source Xvim9lines
1025585fea7bSBram Moolenaar
1026585fea7bSBram Moolenaar  delete('Xvim9lines')
1027585fea7bSBram Moolenaarenddef
1028585fea7bSBram Moolenaar
10298a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1030