18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4ad39c094SBram Moolenaarsource view_util.vim
5673660abSBram Moolenaar
68a7d6542SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message.
78a7d6542SBram Moolenaarfunc CheckDefFailure(lines, error)
8978d170bSBram Moolenaar  call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef')
98a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
108a7d6542SBram Moolenaar  call delete('Xdef')
118a7d6542SBram Moolenaarendfunc
128a7d6542SBram Moolenaar
137a092245SBram Moolenaardef CheckScriptFailure(lines: list<string>, error: string)
147a092245SBram Moolenaar  writefile(lines, 'Xdef')
157a092245SBram Moolenaar  assert_fails('so Xdef', error, lines)
167a092245SBram Moolenaar  delete('Xdef')
177a092245SBram Moolenaarenddef
187a092245SBram Moolenaar
197a092245SBram Moolenaardef CheckScriptSuccess(lines: list<string>)
207a092245SBram Moolenaar  writefile(lines, 'Xdef')
217a092245SBram Moolenaar  so Xdef
227a092245SBram Moolenaar  delete('Xdef')
237a092245SBram Moolenaarenddef
248a7d6542SBram Moolenaar
258a7d6542SBram Moolenaardef Test_syntax()
268a7d6542SBram Moolenaar  let var = 234
278a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
288a7d6542SBram Moolenaarenddef
298a7d6542SBram Moolenaar
306e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
316e587dcbSBram Moolenaarlet s:addToMe = 111
32401d9ffbSBram Moolenaarlet g:existing = 'yes'
33a8c17704SBram Moolenaarlet g:inc_counter = 1
34a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
356e587dcbSBram Moolenaar
368a7d6542SBram Moolenaardef Test_assignment()
378a7d6542SBram Moolenaar  let bool1: bool = true
388a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
398a7d6542SBram Moolenaar  let bool2: bool = false
408a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
418a7d6542SBram Moolenaar
420c2ca58eSBram Moolenaar  let list1: list<bool> = [false, true, false]
438a7d6542SBram Moolenaar  let list2: list<number> = [1, 2, 3]
440c2ca58eSBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
450c2ca58eSBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
460c2ca58eSBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
478a7d6542SBram Moolenaar
48436472f5SBram Moolenaar  let listS: list<string> = []
49436472f5SBram Moolenaar  let listN: list<number> = []
508a7d6542SBram Moolenaar
510c2ca58eSBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
528a7d6542SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
530c2ca58eSBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
540c2ca58eSBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
550c2ca58eSBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, tw: 0z02}
56b283a8a6SBram Moolenaar
579be61bbbSBram Moolenaar  let a: number = 6
589be61bbbSBram Moolenaar  assert_equal(6, a)
599be61bbbSBram Moolenaar
6042a480bfSBram Moolenaar  if has('channel')
6142a480bfSBram Moolenaar    let chan1: channel
62fbdd08edSBram Moolenaar    let job1: job
63f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
6442a480bfSBram Moolenaar  endif
65fbdd08edSBram Moolenaar  if has('float')
66fbdd08edSBram Moolenaar    let float1: float = 3.4
67fbdd08edSBram Moolenaar  endif
685deeb3f1SBram Moolenaar  let Funky1: func
695deeb3f1SBram Moolenaar  let Funky2: func = function('len')
705deeb3f1SBram Moolenaar  let Party2: func = funcref('Test_syntax')
7142a480bfSBram Moolenaar
72cb711abfSBram Moolenaar  # type becomes list<any>
7361a6d4e4SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
74cb711abfSBram Moolenaar  # type becomes dict<any>
755381c7a1SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
7661a6d4e4SBram Moolenaar
77401d9ffbSBram Moolenaar  g:newvar = 'new'
78401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
79401d9ffbSBram Moolenaar
80401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
81401d9ffbSBram Moolenaar  g:existing = 'no'
82401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
83401d9ffbSBram Moolenaar
84b283a8a6SBram Moolenaar  v:char = 'abc'
856e587dcbSBram Moolenaar  assert_equal('abc', v:char)
86b283a8a6SBram Moolenaar
87b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
886e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
89b283a8a6SBram Moolenaar  $ENVVAR = ''
906e587dcbSBram Moolenaar
91fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
92fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
93fd1823e0SBram Moolenaar  s:addToMe += 222
94fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
950bbf722aSBram Moolenaar  s:newVar = 'new'
960bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
97a8c17704SBram Moolenaar
98a8c17704SBram Moolenaar  set ts=7
99a8c17704SBram Moolenaar  &ts += 1
100a8c17704SBram Moolenaar  assert_equal(8, &ts)
10180c34ca3SBram Moolenaar  &ts -= 3
10280c34ca3SBram Moolenaar  assert_equal(5, &ts)
10380c34ca3SBram Moolenaar  &ts *= 2
10480c34ca3SBram Moolenaar  assert_equal(10, &ts)
10580c34ca3SBram Moolenaar  &ts /= 3
10680c34ca3SBram Moolenaar  assert_equal(3, &ts)
10780c34ca3SBram Moolenaar  set ts=10
10880c34ca3SBram Moolenaar  &ts %= 4
10980c34ca3SBram Moolenaar  assert_equal(2, &ts)
110a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
111a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
112a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
113cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
114585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
11580c34ca3SBram Moolenaar  &ts = 8
116a8c17704SBram Moolenaar
117a8c17704SBram Moolenaar  g:inc_counter += 1
118a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
119a8c17704SBram Moolenaar
120a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
121a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
122a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
123a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
124a8c17704SBram Moolenaar
125a8c17704SBram Moolenaar  @a = 'areg'
126a8c17704SBram Moolenaar  @a ..= 'add'
127a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
128a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
129a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
130e69f6d04SBram Moolenaar
131e69f6d04SBram Moolenaar  v:errmsg = 'none'
132e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
133e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
134e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
135e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
1365deeb3f1SBram Moolenaarenddef
1375deeb3f1SBram Moolenaar
138d3aac291SBram Moolenaardef Test_assignment_local()
139d3aac291SBram Moolenaar  " Test in a separated file in order not to the current buffer/window/tab is
140d3aac291SBram Moolenaar  " changed.
141d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
142d3aac291SBram Moolenaar    let b:existing = 'yes'
143d3aac291SBram Moolenaar    let w:existing = 'yes'
144d3aac291SBram Moolenaar    let t:existing = 'yes'
145d3aac291SBram Moolenaar
146d3aac291SBram Moolenaar    def Test_assignment_local_internal()
147d3aac291SBram Moolenaar      b:newvar = 'new'
148d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
149d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
150d3aac291SBram Moolenaar      b:existing = 'no'
151d3aac291SBram Moolenaar      assert_equal('no', b:existing)
152d3aac291SBram Moolenaar
153d3aac291SBram Moolenaar      w:newvar = 'new'
154d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
155d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
156d3aac291SBram Moolenaar      w:existing = 'no'
157d3aac291SBram Moolenaar      assert_equal('no', w:existing)
158d3aac291SBram Moolenaar
159d3aac291SBram Moolenaar      t:newvar = 'new'
160d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
161d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
162d3aac291SBram Moolenaar      t:existing = 'no'
163d3aac291SBram Moolenaar      assert_equal('no', t:existing)
164d3aac291SBram Moolenaar    enddef
165d3aac291SBram Moolenaar    call Test_assignment_local_internal()
166d3aac291SBram Moolenaar  END
167d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
168d3aac291SBram Moolenaarenddef
169d3aac291SBram Moolenaar
1705deeb3f1SBram Moolenaardef Test_assignment_default()
171e69f6d04SBram Moolenaar
172cb711abfSBram Moolenaar  # Test default values.
173e69f6d04SBram Moolenaar  let thebool: bool
174e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
175e69f6d04SBram Moolenaar
176e69f6d04SBram Moolenaar  let thenumber: number
177e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
178e69f6d04SBram Moolenaar
179e69f6d04SBram Moolenaar  if has('float')
180e69f6d04SBram Moolenaar    let thefloat: float
181e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
182e69f6d04SBram Moolenaar  endif
183e69f6d04SBram Moolenaar
184e69f6d04SBram Moolenaar  let thestring: string
185e69f6d04SBram Moolenaar  assert_equal('', thestring)
186e69f6d04SBram Moolenaar
187e69f6d04SBram Moolenaar  let theblob: blob
188e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
189e69f6d04SBram Moolenaar
1905deeb3f1SBram Moolenaar  let Thefunc: func
1915deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
192e69f6d04SBram Moolenaar
193e69f6d04SBram Moolenaar  let thelist: list<any>
194e69f6d04SBram Moolenaar  assert_equal([], thelist)
195e69f6d04SBram Moolenaar
196e69f6d04SBram Moolenaar  let thedict: dict<any>
197e69f6d04SBram Moolenaar  assert_equal({}, thedict)
198e69f6d04SBram Moolenaar
1992c869deeSBram Moolenaar  if has('channel')
200e69f6d04SBram Moolenaar    let thejob: job
201e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
202e69f6d04SBram Moolenaar
203e69f6d04SBram Moolenaar    let thechannel: channel
204e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
2052c869deeSBram Moolenaar  endif
206585fea7bSBram Moolenaar
207585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
208585fea7bSBram Moolenaar  assert_equal(5678, nr)
2098a7d6542SBram Moolenaarenddef
2108a7d6542SBram Moolenaar
211cab27678SBram Moolenaardef Mess(): string
212cab27678SBram Moolenaar  v:foldstart = 123
213cab27678SBram Moolenaar  return 'xxx'
214cab27678SBram Moolenaarenddef
215cab27678SBram Moolenaar
216d72c1bf0SBram Moolenaardef Test_assignment_failure()
2178a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
2188a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
2198a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
2208a7d6542SBram Moolenaar
2218a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
2228a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
2238a7d6542SBram Moolenaar
2249be61bbbSBram Moolenaar  call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
2259be61bbbSBram Moolenaar
226e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
2279be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
2289be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
2299be61bbbSBram Moolenaar
2309be61bbbSBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1065:')
2319be61bbbSBram Moolenaar
2329be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
2339be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
2349be61bbbSBram Moolenaar
2359be61bbbSBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016:')
236d3aac291SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1079:')
237d3aac291SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1078:')
238d3aac291SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1080:')
2399be61bbbSBram Moolenaar
2409be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
2419be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
2429be61bbbSBram Moolenaar
24333fa29cfSBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
24433fa29cfSBram Moolenaar
2458a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
2468a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
2478a7d6542SBram Moolenaar
2488a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
2498a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
2508a7d6542SBram Moolenaar
2518a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
2528a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
25342a480bfSBram Moolenaar
254d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
25542a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
256cab27678SBram Moolenaar
257cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
258cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
259d72c1bf0SBram Moolenaarenddef
260d72c1bf0SBram Moolenaar
261d72c1bf0SBram Moolenaardef Test_unlet()
262d72c1bf0SBram Moolenaar  g:somevar = 'yes'
263d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
264d72c1bf0SBram Moolenaar  unlet g:somevar
265d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
266d72c1bf0SBram Moolenaar  unlet! g:somevar
267d72c1bf0SBram Moolenaar
268d72c1bf0SBram Moolenaar  call CheckScriptFailure([
269d72c1bf0SBram Moolenaar        'vim9script',
270d72c1bf0SBram Moolenaar        'let svar = 123',
271d72c1bf0SBram Moolenaar        'unlet svar',
272d72c1bf0SBram Moolenaar        ], 'E1081:')
273d72c1bf0SBram Moolenaar  call CheckScriptFailure([
274d72c1bf0SBram Moolenaar        'vim9script',
275d72c1bf0SBram Moolenaar        'let svar = 123',
276d72c1bf0SBram Moolenaar        'unlet s:svar',
277d72c1bf0SBram Moolenaar        ], 'E1081:')
278d72c1bf0SBram Moolenaar  call CheckScriptFailure([
279d72c1bf0SBram Moolenaar        'vim9script',
280d72c1bf0SBram Moolenaar        'let svar = 123',
281d72c1bf0SBram Moolenaar        'def Func()',
282d72c1bf0SBram Moolenaar        '  unlet svar',
283d72c1bf0SBram Moolenaar        'enddef',
284d72c1bf0SBram Moolenaar        ], 'E1081:')
285d72c1bf0SBram Moolenaar  call CheckScriptFailure([
286d72c1bf0SBram Moolenaar        'vim9script',
287d72c1bf0SBram Moolenaar        'let svar = 123',
288d72c1bf0SBram Moolenaar        'def Func()',
289d72c1bf0SBram Moolenaar        '  unlet s:svar',
290d72c1bf0SBram Moolenaar        'enddef',
291d72c1bf0SBram Moolenaar        ], 'E1081:')
292*7bdaea6eSBram Moolenaar
293*7bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
294*7bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
295*7bdaea6eSBram Moolenaar  unlet $ENVVAR
296*7bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
297d72c1bf0SBram Moolenaarenddef
298599c89c8SBram Moolenaar
299599c89c8SBram Moolenaarfunc Test_wrong_type()
300599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
301599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
302599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
303599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
304599c89c8SBram Moolenaar
305599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
306599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
30742a480bfSBram Moolenaar
30842a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
30942a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
31042a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
31142a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
31242a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
31342a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
31442a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
31542a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
31642a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
31742a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
31842a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
3198a7d6542SBram Moolenaarendfunc
3208a7d6542SBram Moolenaar
3218a7d6542SBram Moolenaarfunc Test_const()
3228a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
3238a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
3248a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
3259be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
3268a7d6542SBram Moolenaarendfunc
3278a7d6542SBram Moolenaar
3288a7d6542SBram Moolenaardef Test_block()
3298a7d6542SBram Moolenaar  let outer = 1
3308a7d6542SBram Moolenaar  {
3318a7d6542SBram Moolenaar    let inner = 2
3328a7d6542SBram Moolenaar    assert_equal(1, outer)
3338a7d6542SBram Moolenaar    assert_equal(2, inner)
3348a7d6542SBram Moolenaar  }
3358a7d6542SBram Moolenaar  assert_equal(1, outer)
3368a7d6542SBram Moolenaarenddef
3378a7d6542SBram Moolenaar
3388a7d6542SBram Moolenaarfunc Test_block_failure()
3398a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
340585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
341585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
3428a7d6542SBram Moolenaarendfunc
3438a7d6542SBram Moolenaar
344585fea7bSBram Moolenaardef Test_cmd_modifier()
345585fea7bSBram Moolenaar  tab echo '0'
346585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
347585fea7bSBram Moolenaarenddef
348585fea7bSBram Moolenaar
3498a7d6542SBram Moolenaardef Test_try_catch()
3508a7d6542SBram Moolenaar  let l = []
3517a092245SBram Moolenaar  try # comment
3528a7d6542SBram Moolenaar    add(l, '1')
3538a7d6542SBram Moolenaar    throw 'wrong'
3548a7d6542SBram Moolenaar    add(l, '2')
3557a092245SBram Moolenaar  catch # comment
3568a7d6542SBram Moolenaar    add(l, v:exception)
3577a092245SBram Moolenaar  finally # comment
3588a7d6542SBram Moolenaar    add(l, '3')
3597a092245SBram Moolenaar  endtry # comment
3608a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
3618a7d6542SBram Moolenaarenddef
3628a7d6542SBram Moolenaar
363257cc5eeSBram Moolenaardef ThrowFromDef()
364257cc5eeSBram Moolenaar  throw 'getout'
365257cc5eeSBram Moolenaarenddef
366257cc5eeSBram Moolenaar
367257cc5eeSBram Moolenaarfunc CatchInFunc()
368257cc5eeSBram Moolenaar  try
369257cc5eeSBram Moolenaar    call ThrowFromDef()
370257cc5eeSBram Moolenaar  catch
371257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
372257cc5eeSBram Moolenaar  endtry
373257cc5eeSBram Moolenaarendfunc
374257cc5eeSBram Moolenaar
375257cc5eeSBram Moolenaardef CatchInDef()
376257cc5eeSBram Moolenaar  try
377257cc5eeSBram Moolenaar    ThrowFromDef()
378257cc5eeSBram Moolenaar  catch
379257cc5eeSBram Moolenaar    g:thrown_def = v:exception
380257cc5eeSBram Moolenaar  endtry
381257cc5eeSBram Moolenaarenddef
382257cc5eeSBram Moolenaar
383f575adffSBram Moolenaardef ReturnFinally(): string
384f575adffSBram Moolenaar  try
385f575adffSBram Moolenaar    return 'intry'
386f575adffSBram Moolenaar  finally
387f575adffSBram Moolenaar    g:in_finally = 'finally'
388f575adffSBram Moolenaar  endtry
389f575adffSBram Moolenaar  return 'end'
390f575adffSBram Moolenaarenddef
391f575adffSBram Moolenaar
392257cc5eeSBram Moolenaardef Test_try_catch_nested()
393257cc5eeSBram Moolenaar  CatchInFunc()
394257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
395257cc5eeSBram Moolenaar
396257cc5eeSBram Moolenaar  CatchInDef()
397257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
398f575adffSBram Moolenaar
399f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
400f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
401f575adffSBram Moolenaarenddef
402f575adffSBram Moolenaar
403f575adffSBram Moolenaardef Test_try_catch_match()
404f575adffSBram Moolenaar  let seq = 'a'
405f575adffSBram Moolenaar  try
406f575adffSBram Moolenaar    throw 'something'
407f575adffSBram Moolenaar  catch /nothing/
408f575adffSBram Moolenaar    seq ..= 'x'
409f575adffSBram Moolenaar  catch /some/
410f575adffSBram Moolenaar    seq ..= 'b'
411f575adffSBram Moolenaar  catch /asdf/
412f575adffSBram Moolenaar    seq ..= 'x'
413e8c4abbbSBram Moolenaar  catch ?a\?sdf?
414e8c4abbbSBram Moolenaar    seq ..= 'y'
415f575adffSBram Moolenaar  finally
416f575adffSBram Moolenaar    seq ..= 'c'
417f575adffSBram Moolenaar  endtry
418f575adffSBram Moolenaar  assert_equal('abc', seq)
419257cc5eeSBram Moolenaarenddef
420257cc5eeSBram Moolenaar
421e8c4abbbSBram Moolenaardef Test_try_catch_fails()
422e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
423e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
424e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
425585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
426585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
427585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
428585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
429585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
430585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
431585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
432585fea7bSBram Moolenaar
433585fea7bSBram Moolenaar  call CheckDefFailure(['throw'], 'E471:')
434585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
435e8c4abbbSBram Moolenaarenddef
436e8c4abbbSBram Moolenaar
4378a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
4388a7d6542SBram Moolenaar  vim9script
4398a7d6542SBram Moolenaar  let name: string = 'bob'
4408a7d6542SBram Moolenaar  def Concat(arg: string): string
4418a7d6542SBram Moolenaar    return name .. arg
4428a7d6542SBram Moolenaar  enddef
4438a7d6542SBram Moolenaar  let g:result = Concat('bie')
4448a7d6542SBram Moolenaar  let g:localname = name
4458a7d6542SBram Moolenaar
4468a7d6542SBram Moolenaar  export const CONST = 1234
4478a7d6542SBram Moolenaar  export let exported = 9876
4486e587dcbSBram Moolenaar  export let exp_name = 'John'
4498a7d6542SBram Moolenaar  export def Exported(): string
4508a7d6542SBram Moolenaar    return 'Exported'
4518a7d6542SBram Moolenaar  enddef
4528a7d6542SBram MoolenaarEND
4538a7d6542SBram Moolenaar
4545269bd2aSBram Moolenaardef Test_vim9_import_export()
4558a7d6542SBram Moolenaar  let import_script_lines =<< trim END
4568a7d6542SBram Moolenaar    vim9script
4578a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
4588a7d6542SBram Moolenaar    g:imported = exported
4596e587dcbSBram Moolenaar    exported += 3
4606e587dcbSBram Moolenaar    g:imported_added = exported
4618a7d6542SBram Moolenaar    g:imported_func = Exported()
4626e587dcbSBram Moolenaar
4636e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
4646e587dcbSBram Moolenaar    g:imported_name = exp_name
4656e587dcbSBram Moolenaar    exp_name ..= ' Doe'
4666e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
4675381c7a1SBram Moolenaar    g:imported_later = exported
4688a7d6542SBram Moolenaar  END
4698a7d6542SBram Moolenaar
4708a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
4718a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
4728a7d6542SBram Moolenaar
4738a7d6542SBram Moolenaar  source Ximport.vim
4748a7d6542SBram Moolenaar
4758a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
4768a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
4778a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
4786e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
4795381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
4808a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
4816e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
4826e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
4838a7d6542SBram Moolenaar  assert_false(exists('g:name'))
4848a7d6542SBram Moolenaar
4858a7d6542SBram Moolenaar  unlet g:result
4868a7d6542SBram Moolenaar  unlet g:localname
4878a7d6542SBram Moolenaar  unlet g:imported
4886e587dcbSBram Moolenaar  unlet g:imported_added
4895381c7a1SBram Moolenaar  unlet g:imported_later
4908a7d6542SBram Moolenaar  unlet g:imported_func
4916e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
4928a7d6542SBram Moolenaar  delete('Ximport.vim')
493f2d5c240SBram Moolenaar
4945381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
4955381c7a1SBram Moolenaar    vim9script
4965381c7a1SBram Moolenaar    def ImportInDef()
4975381c7a1SBram Moolenaar      import exported from './Xexport.vim'
4985381c7a1SBram Moolenaar      g:imported = exported
4995381c7a1SBram Moolenaar      exported += 7
5005381c7a1SBram Moolenaar      g:imported_added = exported
5015381c7a1SBram Moolenaar    enddef
5025381c7a1SBram Moolenaar    ImportInDef()
5035381c7a1SBram Moolenaar  END
5045381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
5055381c7a1SBram Moolenaar  source Ximport2.vim
5065381c7a1SBram Moolenaar  " TODO: this should be 9879
5075381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
5085381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
5095381c7a1SBram Moolenaar  unlet g:imported
5105381c7a1SBram Moolenaar  unlet g:imported_added
5115381c7a1SBram Moolenaar  delete('Ximport2.vim')
5125381c7a1SBram Moolenaar
513f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
514f2d5c240SBram Moolenaar    vim9script
515f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
516f2d5c240SBram Moolenaar    def UseExport()
517f2d5c240SBram Moolenaar      g:imported = Export.exported
518f2d5c240SBram Moolenaar    enddef
519f2d5c240SBram Moolenaar    UseExport()
520f2d5c240SBram Moolenaar  END
521f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
522f2d5c240SBram Moolenaar  source Ximport.vim
5235381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
524f2d5c240SBram Moolenaar
525599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
526599c89c8SBram Moolenaar    vim9script
527599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
528599c89c8SBram Moolenaar    def Func()
529599c89c8SBram Moolenaar      let dummy = 1
530599c89c8SBram Moolenaar      let imported = Export + dummy
531599c89c8SBram Moolenaar    enddef
532599c89c8SBram Moolenaar  END
533599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
534599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
535599c89c8SBram Moolenaar
536599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
537599c89c8SBram Moolenaar    vim9script
538599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
539599c89c8SBram Moolenaar    def Func()
540599c89c8SBram Moolenaar      let imported = Export . exported
541599c89c8SBram Moolenaar    enddef
542599c89c8SBram Moolenaar  END
543599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
544599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
545599c89c8SBram Moolenaar
546599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
547599c89c8SBram Moolenaar    vim9script
548599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
549599c89c8SBram Moolenaar    def Func()
550599c89c8SBram Moolenaar      let imported = Export.
551599c89c8SBram Moolenaar    enddef
552599c89c8SBram Moolenaar  END
553599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
554599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
555599c89c8SBram Moolenaar
556f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
557f2d5c240SBram Moolenaar    vim9script
558f2d5c240SBram Moolenaar    import * from './Xexport.vim'
559f2d5c240SBram Moolenaar    g:imported = exported
560f2d5c240SBram Moolenaar  END
561f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
562f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
563f2d5c240SBram Moolenaar
564fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
565fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
566fa29c8abSBram Moolenaar    vim9script
567fa29c8abSBram Moolenaar    import name from './Xexport.vim'
568fa29c8abSBram Moolenaar  END
569fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
570fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
571fa29c8abSBram Moolenaar
5725269bd2aSBram Moolenaar  " try to import something that is already defined
5735269bd2aSBram Moolenaar  let import_already_defined =<< trim END
5745269bd2aSBram Moolenaar    vim9script
5755269bd2aSBram Moolenaar    let exported = 'something'
5765269bd2aSBram Moolenaar    import exported from './Xexport.vim'
5775269bd2aSBram Moolenaar  END
5785269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5795269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5805269bd2aSBram Moolenaar
5815269bd2aSBram Moolenaar  " try to import something that is already defined
5825269bd2aSBram Moolenaar  import_already_defined =<< trim END
5835269bd2aSBram Moolenaar    vim9script
5845269bd2aSBram Moolenaar    let exported = 'something'
5855269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
5865269bd2aSBram Moolenaar  END
5875269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5885269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5895269bd2aSBram Moolenaar
5905269bd2aSBram Moolenaar  " try to import something that is already defined
5915269bd2aSBram Moolenaar  import_already_defined =<< trim END
5925269bd2aSBram Moolenaar    vim9script
5935269bd2aSBram Moolenaar    let exported = 'something'
5945269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
5955269bd2aSBram Moolenaar  END
5965269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5975269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5985269bd2aSBram Moolenaar
599fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
600fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
601fa29c8abSBram Moolenaar    vim9script
602fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
603fa29c8abSBram Moolenaar  END
604fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
605fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
606fa29c8abSBram Moolenaar
607fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
608fa29c8abSBram Moolenaar    vim9script
609fa29c8abSBram Moolenaar    import name './Xexport.vim'
610fa29c8abSBram Moolenaar  END
611fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
612fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
613fa29c8abSBram Moolenaar
614fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
615fa29c8abSBram Moolenaar    vim9script
616fa29c8abSBram Moolenaar    import name from Xexport.vim
617fa29c8abSBram Moolenaar  END
618fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
619fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
620fa29c8abSBram Moolenaar
621fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
622fa29c8abSBram Moolenaar    vim9script
623fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
624fa29c8abSBram Moolenaar  END
625fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
626fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
627fa29c8abSBram Moolenaar
628fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
629fa29c8abSBram Moolenaar    vim9script
630fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
631fa29c8abSBram Moolenaar  END
6325269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
6335269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
634fa29c8abSBram Moolenaar
635f2d5c240SBram Moolenaar  delete('Ximport.vim')
6365269bd2aSBram Moolenaar  delete('Ximport3.vim')
6378a7d6542SBram Moolenaar  delete('Xexport.vim')
6388a7d6542SBram Moolenaar
639750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
640750802b5SBram Moolenaar  set cpo&vi
641750802b5SBram Moolenaar  let cpo_before = &cpo
642750802b5SBram Moolenaar  let lines =<< trim END
643750802b5SBram Moolenaar    vim9script
644750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
645750802b5SBram Moolenaar  END
646750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
647750802b5SBram Moolenaar  source Xvim9_script
648750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
649750802b5SBram Moolenaar  set cpo&vim
650750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
651750802b5SBram Moolenaar  delete('Xvim9_script')
652750802b5SBram Moolenaarenddef
653750802b5SBram Moolenaar
654750802b5SBram Moolenaardef Test_vim9script_fails()
6558a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
6568a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
657750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
658f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
659750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
660750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
661750802b5SBram Moolenaar
662750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
663a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
6648a7d6542SBram Moolenaarenddef
6658a7d6542SBram Moolenaar
6668a7d6542SBram Moolenaardef Test_vim9script_reload()
6678a7d6542SBram Moolenaar  let lines =<< trim END
6688a7d6542SBram Moolenaar    vim9script
6698a7d6542SBram Moolenaar    const var = ''
6708a7d6542SBram Moolenaar    let valone = 1234
6718a7d6542SBram Moolenaar    def MyFunc(arg: string)
6728a7d6542SBram Moolenaar       valone = 5678
6738a7d6542SBram Moolenaar    enddef
6748a7d6542SBram Moolenaar  END
6758a7d6542SBram Moolenaar  let morelines =<< trim END
6768a7d6542SBram Moolenaar    let valtwo = 222
6778a7d6542SBram Moolenaar    export def GetValtwo(): number
6788a7d6542SBram Moolenaar      return valtwo
6798a7d6542SBram Moolenaar    enddef
6808a7d6542SBram Moolenaar  END
681675f716eSBram Moolenaar  writefile(lines + morelines,
682675f716eSBram Moolenaar            'Xreload.vim')
6838a7d6542SBram Moolenaar  source Xreload.vim
6848a7d6542SBram Moolenaar  source Xreload.vim
6858a7d6542SBram Moolenaar  source Xreload.vim
6868a7d6542SBram Moolenaar
6878a7d6542SBram Moolenaar  let testlines =<< trim END
6888a7d6542SBram Moolenaar    vim9script
6898a7d6542SBram Moolenaar    def TheFunc()
6908a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
6918a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
6928a7d6542SBram Moolenaar    enddef
6938a7d6542SBram Moolenaar    TheFunc()
6948a7d6542SBram Moolenaar  END
6958a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
6968a7d6542SBram Moolenaar  source Ximport.vim
6978a7d6542SBram Moolenaar
6988a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
6998a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
7008a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
7018a7d6542SBram Moolenaar  source Xreload.vim
7028a7d6542SBram Moolenaar  source Ximport.vim
7038a7d6542SBram Moolenaar
7048a7d6542SBram Moolenaar  " cannot declare a var twice
7058a7d6542SBram Moolenaar  lines =<< trim END
7068a7d6542SBram Moolenaar    vim9script
7078a7d6542SBram Moolenaar    let valone = 1234
7088a7d6542SBram Moolenaar    let valone = 5678
7098a7d6542SBram Moolenaar  END
7108a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
7118a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
7128a7d6542SBram Moolenaar
7138a7d6542SBram Moolenaar  delete('Xreload.vim')
7148a7d6542SBram Moolenaar  delete('Ximport.vim')
7158a7d6542SBram Moolenaarenddef
7168a7d6542SBram Moolenaar
7178a7d6542SBram Moolenaardef Test_import_absolute()
7188a7d6542SBram Moolenaar  let import_lines = [
719e6085c53SBram Moolenaar        'vim9script',
720e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
721e6085c53SBram Moolenaar        'def UseExported()',
722e6085c53SBram Moolenaar        '  g:imported_abs = exported',
723e6085c53SBram Moolenaar        '  exported = 8888',
724e6085c53SBram Moolenaar        '  g:imported_after = exported',
725e6085c53SBram Moolenaar        'enddef',
726e6085c53SBram Moolenaar        'UseExported()',
727e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
728e6085c53SBram Moolenaar        ]
7298a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
7308a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
7318a7d6542SBram Moolenaar
7328a7d6542SBram Moolenaar  source Ximport_abs.vim
7338a7d6542SBram Moolenaar
7348a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
7354e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
736675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
737675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
738675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
739675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
740675f716eSBram Moolenaar          'exported = 8888.*' ..
741675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
742675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
743675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
744675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
745e6085c53SBram Moolenaar        g:import_disassembled)
7468a7d6542SBram Moolenaar  unlet g:imported_abs
7474e12a5dfSBram Moolenaar  unlet g:import_disassembled
7488a7d6542SBram Moolenaar
7498a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
7508a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
7518a7d6542SBram Moolenaarenddef
7528a7d6542SBram Moolenaar
7538a7d6542SBram Moolenaardef Test_import_rtp()
7548a7d6542SBram Moolenaar  let import_lines = [
755e6085c53SBram Moolenaar        'vim9script',
756e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
757e6085c53SBram Moolenaar        'g:imported_rtp = exported',
758e6085c53SBram Moolenaar        ]
7598a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
7608a7d6542SBram Moolenaar  mkdir('import')
7618a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
7628a7d6542SBram Moolenaar
7638a7d6542SBram Moolenaar  let save_rtp = &rtp
7648a7d6542SBram Moolenaar  &rtp = getcwd()
7658a7d6542SBram Moolenaar  source Ximport_rtp.vim
7668a7d6542SBram Moolenaar  &rtp = save_rtp
7678a7d6542SBram Moolenaar
7688a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
7698a7d6542SBram Moolenaar  unlet g:imported_rtp
7708a7d6542SBram Moolenaar
7718a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
7728a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
7738a7d6542SBram Moolenaar  delete('import', 'd')
7748a7d6542SBram Moolenaarenddef
7758a7d6542SBram Moolenaar
7768a7d6542SBram Moolenaardef Test_fixed_size_list()
7778a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
7788a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
7798a7d6542SBram Moolenaar  l->remove(0)
7808a7d6542SBram Moolenaar  l->add(5)
7818a7d6542SBram Moolenaar  l->insert(99, 1)
7820f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
7838a7d6542SBram Moolenaarenddef
7848a7d6542SBram Moolenaar
785158906cfSBram Moolenaardef IfElse(what: number): string
786158906cfSBram Moolenaar  let res = ''
787158906cfSBram Moolenaar  if what == 1
788158906cfSBram Moolenaar    res = "one"
789158906cfSBram Moolenaar  elseif what == 2
790158906cfSBram Moolenaar    res = "two"
791a259d8d3SBram Moolenaar  else
792158906cfSBram Moolenaar    res = "three"
793a259d8d3SBram Moolenaar  endif
794158906cfSBram Moolenaar  return res
795a259d8d3SBram Moolenaarenddef
796a259d8d3SBram Moolenaar
797158906cfSBram Moolenaardef Test_if_elseif_else()
798158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
799158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
800158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
8010f18b6d1SBram Moolenaarenddef
8020f18b6d1SBram Moolenaar
803e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
804e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
805e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
806e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
807e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
808585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
809e8c4abbbSBram Moolenaarenddef
810e8c4abbbSBram Moolenaar
8116d69bf60SBram Moolenaarlet g:bool_true = v:true
8126d69bf60SBram Moolenaarlet g:bool_false = v:false
8136d69bf60SBram Moolenaar
8146d69bf60SBram Moolenaardef Test_if_const_expr()
8156d69bf60SBram Moolenaar  let res = false
8166d69bf60SBram Moolenaar  if true ? true : false
8176d69bf60SBram Moolenaar    res = true
8186d69bf60SBram Moolenaar  endif
8196d69bf60SBram Moolenaar  assert_equal(true, res)
8206d69bf60SBram Moolenaar
821585fea7bSBram Moolenaar  g:glob = 2
822585fea7bSBram Moolenaar  if false
823585fea7bSBram Moolenaar    execute('let g:glob = 3')
824585fea7bSBram Moolenaar  endif
825585fea7bSBram Moolenaar  assert_equal(2, g:glob)
826585fea7bSBram Moolenaar  if true
827585fea7bSBram Moolenaar    execute('let g:glob = 3')
828585fea7bSBram Moolenaar  endif
829585fea7bSBram Moolenaar  assert_equal(3, g:glob)
830585fea7bSBram Moolenaar
8316d69bf60SBram Moolenaar  res = false
8326d69bf60SBram Moolenaar  if g:bool_true ? true : false
8336d69bf60SBram Moolenaar    res = true
8346d69bf60SBram Moolenaar  endif
8356d69bf60SBram Moolenaar  assert_equal(true, res)
8366d69bf60SBram Moolenaar
8376d69bf60SBram Moolenaar  res = false
8386d69bf60SBram Moolenaar  if true ? g:bool_true : false
8396d69bf60SBram Moolenaar    res = true
8406d69bf60SBram Moolenaar  endif
8416d69bf60SBram Moolenaar  assert_equal(true, res)
8426d69bf60SBram Moolenaar
8436d69bf60SBram Moolenaar  res = false
8446d69bf60SBram Moolenaar  if true ? true : g:bool_false
8456d69bf60SBram Moolenaar    res = true
8466d69bf60SBram Moolenaar  endif
8476d69bf60SBram Moolenaar  assert_equal(true, res)
8486d69bf60SBram Moolenaar
8496d69bf60SBram Moolenaar  res = false
8506d69bf60SBram Moolenaar  if true ? false : true
8516d69bf60SBram Moolenaar    res = true
8526d69bf60SBram Moolenaar  endif
8536d69bf60SBram Moolenaar  assert_equal(false, res)
8546d69bf60SBram Moolenaar
8556d69bf60SBram Moolenaar  res = false
8566d69bf60SBram Moolenaar  if false ? false : true
8576d69bf60SBram Moolenaar    res = true
8586d69bf60SBram Moolenaar  endif
8596d69bf60SBram Moolenaar  assert_equal(true, res)
8606d69bf60SBram Moolenaar
8616d69bf60SBram Moolenaar  res = false
8626d69bf60SBram Moolenaar  if false ? true : false
8636d69bf60SBram Moolenaar    res = true
8646d69bf60SBram Moolenaar  endif
8656d69bf60SBram Moolenaar  assert_equal(false, res)
8666d69bf60SBram Moolenaar
8676d69bf60SBram Moolenaar  res = false
868e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
869e8c4abbbSBram Moolenaar    res = true
870e8c4abbbSBram Moolenaar  endif
871e8c4abbbSBram Moolenaar  assert_equal(false, res)
872e8c4abbbSBram Moolenaar
873e8c4abbbSBram Moolenaar  res = false
8746d69bf60SBram Moolenaar  if true && true
8756d69bf60SBram Moolenaar    res = true
8766d69bf60SBram Moolenaar  endif
8776d69bf60SBram Moolenaar  assert_equal(true, res)
8786d69bf60SBram Moolenaar
8796d69bf60SBram Moolenaar  res = false
8806d69bf60SBram Moolenaar  if true && false
8816d69bf60SBram Moolenaar    res = true
8826d69bf60SBram Moolenaar  endif
8836d69bf60SBram Moolenaar  assert_equal(false, res)
8846d69bf60SBram Moolenaar
8856d69bf60SBram Moolenaar  res = false
8866d69bf60SBram Moolenaar  if g:bool_true && false
8876d69bf60SBram Moolenaar    res = true
8886d69bf60SBram Moolenaar  endif
8896d69bf60SBram Moolenaar  assert_equal(false, res)
8906d69bf60SBram Moolenaar
8916d69bf60SBram Moolenaar  res = false
8926d69bf60SBram Moolenaar  if true && g:bool_false
8936d69bf60SBram Moolenaar    res = true
8946d69bf60SBram Moolenaar  endif
8956d69bf60SBram Moolenaar  assert_equal(false, res)
8966d69bf60SBram Moolenaar
8976d69bf60SBram Moolenaar  res = false
8986d69bf60SBram Moolenaar  if false && false
8996d69bf60SBram Moolenaar    res = true
9006d69bf60SBram Moolenaar  endif
9016d69bf60SBram Moolenaar  assert_equal(false, res)
9026d69bf60SBram Moolenaar
9036d69bf60SBram Moolenaar  res = false
9046d69bf60SBram Moolenaar  if true || false
9056d69bf60SBram Moolenaar    res = true
9066d69bf60SBram Moolenaar  endif
9076d69bf60SBram Moolenaar  assert_equal(true, res)
9086d69bf60SBram Moolenaar
9096d69bf60SBram Moolenaar  res = false
9106d69bf60SBram Moolenaar  if g:bool_true || false
9116d69bf60SBram Moolenaar    res = true
9126d69bf60SBram Moolenaar  endif
9136d69bf60SBram Moolenaar  assert_equal(true, res)
9146d69bf60SBram Moolenaar
9156d69bf60SBram Moolenaar  res = false
9166d69bf60SBram Moolenaar  if true || g:bool_false
9176d69bf60SBram Moolenaar    res = true
9186d69bf60SBram Moolenaar  endif
9196d69bf60SBram Moolenaar  assert_equal(true, res)
9206d69bf60SBram Moolenaar
9216d69bf60SBram Moolenaar  res = false
9226d69bf60SBram Moolenaar  if false || false
9236d69bf60SBram Moolenaar    res = true
9246d69bf60SBram Moolenaar  endif
9256d69bf60SBram Moolenaar  assert_equal(false, res)
92680c34ca3SBram Moolenaarenddef
9276d69bf60SBram Moolenaar
92880c34ca3SBram Moolenaardef Test_if_const_expr_fails()
92980c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
93080c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
931e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
932e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
9336d69bf60SBram Moolenaarenddef
9346d69bf60SBram Moolenaar
935ad39c094SBram Moolenaardef Test_execute_cmd()
936ad39c094SBram Moolenaar  new
937ad39c094SBram Moolenaar  setline(1, 'default')
938ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
939ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
940ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
941ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
942ad39c094SBram Moolenaar  execute cmd1 cmd2
943ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
944ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
945ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
946ad39c094SBram Moolenaar  let cmd_first = 'call '
947ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
948ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
949ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
950ad39c094SBram Moolenaar  bwipe!
951585fea7bSBram Moolenaar
952585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
953ad39c094SBram Moolenaarenddef
954ad39c094SBram Moolenaar
955ad39c094SBram Moolenaardef Test_echo_cmd()
956585fea7bSBram Moolenaar  echo 'some'
957585fea7bSBram Moolenaar  echon 'thing'
958ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
959ad39c094SBram Moolenaar
960ad39c094SBram Moolenaar  let str1 = 'some'
961ad39c094SBram Moolenaar  let str2 = 'more'
962ad39c094SBram Moolenaar  echo str1 str2
963ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
964ad39c094SBram Moolenaarenddef
965ad39c094SBram Moolenaar
96641fe0617SBram Moolenaardef Test_for_outside_of_function()
96741fe0617SBram Moolenaar  let lines =<< trim END
96841fe0617SBram Moolenaar    vim9script
96941fe0617SBram Moolenaar    new
97041fe0617SBram Moolenaar    for var in range(0, 3)
97141fe0617SBram Moolenaar      append(line('$'), var)
97241fe0617SBram Moolenaar    endfor
97341fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
97441fe0617SBram Moolenaar    bwipe!
97541fe0617SBram Moolenaar  END
97641fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
97741fe0617SBram Moolenaar  source Xvim9for.vim
97841fe0617SBram Moolenaar  delete('Xvim9for.vim')
97941fe0617SBram Moolenaarenddef
9808a7d6542SBram Moolenaar
981e8c4abbbSBram Moolenaardef Test_for_loop()
982e8c4abbbSBram Moolenaar  let result = ''
983e8c4abbbSBram Moolenaar  for cnt in range(7)
984e8c4abbbSBram Moolenaar    if cnt == 4
985e8c4abbbSBram Moolenaar      break
986e8c4abbbSBram Moolenaar    endif
987e8c4abbbSBram Moolenaar    if cnt == 2
988e8c4abbbSBram Moolenaar      continue
989e8c4abbbSBram Moolenaar    endif
990e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
991e8c4abbbSBram Moolenaar  endfor
992e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
993e8c4abbbSBram Moolenaarenddef
994e8c4abbbSBram Moolenaar
995e8c4abbbSBram Moolenaardef Test_for_loop_fails()
996675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
997675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
998675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
9996e949784SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef'], 'E1006:')
1000675f716eSBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1024:')
1001675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1002675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1003675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1004e8c4abbbSBram Moolenaarenddef
1005e8c4abbbSBram Moolenaar
1006d0df1aacSBram Moolenaardef Test_while_loop()
1007d0df1aacSBram Moolenaar  let result = ''
1008d0df1aacSBram Moolenaar  let cnt = 0
1009d0df1aacSBram Moolenaar  while cnt < 555
1010d0df1aacSBram Moolenaar    if cnt == 3
1011d0df1aacSBram Moolenaar      break
1012d0df1aacSBram Moolenaar    endif
1013d0df1aacSBram Moolenaar    cnt += 1
1014d0df1aacSBram Moolenaar    if cnt == 2
1015d0df1aacSBram Moolenaar      continue
1016d0df1aacSBram Moolenaar    endif
1017d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1018d0df1aacSBram Moolenaar  endwhile
1019d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1020d0df1aacSBram Moolenaarenddef
1021d0df1aacSBram Moolenaar
1022e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1023675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1024675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1025675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1026675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1027675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1028675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1029675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1030bd5da371SBram Moolenaarenddef
1031bd5da371SBram Moolenaar
10329645e2d9SBram Moolenaardef Test_interrupt_loop()
103397acfc78SBram Moolenaar  let caught = false
10349645e2d9SBram Moolenaar  let x = 0
103597acfc78SBram Moolenaar  try
10369645e2d9SBram Moolenaar    while 1
10379645e2d9SBram Moolenaar      x += 1
10389645e2d9SBram Moolenaar      if x == 100
10399645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
10409645e2d9SBram Moolenaar      endif
10419645e2d9SBram Moolenaar    endwhile
104297acfc78SBram Moolenaar  catch
104397acfc78SBram Moolenaar    caught = true
104497acfc78SBram Moolenaar    assert_equal(100, x)
104597acfc78SBram Moolenaar  endtry
104697acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
10479645e2d9SBram Moolenaarenddef
104820431c9dSBram Moolenaar
10494fdae999SBram Moolenaardef Test_automatic_line_continuation()
10504fdae999SBram Moolenaar  let mylist = [
10514fdae999SBram Moolenaar      'one',
10524fdae999SBram Moolenaar      'two',
10534fdae999SBram Moolenaar      'three',
10544fdae999SBram Moolenaar      ] " comment
10554fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
10564fdae999SBram Moolenaar
10574fdae999SBram Moolenaar  let mydict = {
10584fdae999SBram Moolenaar      'one': 1,
10594fdae999SBram Moolenaar      'two': 2,
10604fdae999SBram Moolenaar      'three':
10614fdae999SBram Moolenaar          3,
10624fdae999SBram Moolenaar      } " comment
10634fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
10644fdae999SBram Moolenaar  mydict = #{
10652c330432SBram Moolenaar      one: 1,  # comment
10662c330432SBram Moolenaar      two:     # comment
10672c330432SBram Moolenaar           2,  # comment
10682c330432SBram Moolenaar      three: 3 # comment
10692c330432SBram Moolenaar      }
10702c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
10712c330432SBram Moolenaar  mydict = #{
10722c330432SBram Moolenaar      one: 1,
10734fdae999SBram Moolenaar      two:
10744fdae999SBram Moolenaar           2,
10752c330432SBram Moolenaar      three: 3
10764fdae999SBram Moolenaar      }
10774fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1078e6085c53SBram Moolenaar
1079e6085c53SBram Moolenaar  assert_equal(
1080e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1081e6085c53SBram Moolenaar        split('one two three')
1082e6085c53SBram Moolenaar        )
10834fdae999SBram Moolenaarenddef
10844fdae999SBram Moolenaar
10857a092245SBram Moolenaardef Test_vim9_comment()
10867a092245SBram Moolenaar  CheckScriptSuccess([
10877a092245SBram Moolenaar      'vim9script',
10887a092245SBram Moolenaar      '# something',
10897a092245SBram Moolenaar      ])
10907a092245SBram Moolenaar  CheckScriptFailure([
10917a092245SBram Moolenaar      'vim9script',
10927a092245SBram Moolenaar      ':# something',
10937a092245SBram Moolenaar      ], 'E488:')
10947a092245SBram Moolenaar  CheckScriptFailure([
10957a092245SBram Moolenaar      '# something',
10967a092245SBram Moolenaar      ], 'E488:')
10977a092245SBram Moolenaar  CheckScriptFailure([
10987a092245SBram Moolenaar      ':# something',
10997a092245SBram Moolenaar      ], 'E488:')
11007a092245SBram Moolenaar
11014a8d9f2eSBram Moolenaar  { # block start
11024a8d9f2eSBram Moolenaar  } # block end
11034a8d9f2eSBram Moolenaar  CheckDefFailure([
11044a8d9f2eSBram Moolenaar      '{# comment',
11054a8d9f2eSBram Moolenaar      ], 'E488:')
11064a8d9f2eSBram Moolenaar  CheckDefFailure([
11074a8d9f2eSBram Moolenaar      '{',
11084a8d9f2eSBram Moolenaar      '}# comment',
11094a8d9f2eSBram Moolenaar      ], 'E488:')
11104a8d9f2eSBram Moolenaar
11114a8d9f2eSBram Moolenaar  echo "yes" # comment
11124a8d9f2eSBram Moolenaar  CheckDefFailure([
11134a8d9f2eSBram Moolenaar      'echo "yes"# comment',
11144a8d9f2eSBram Moolenaar      ], 'E488:')
11157a092245SBram Moolenaar  CheckScriptSuccess([
11167a092245SBram Moolenaar      'vim9script',
11177a092245SBram Moolenaar      'echo "yes" # something',
11187a092245SBram Moolenaar      ])
11197a092245SBram Moolenaar  CheckScriptFailure([
11207a092245SBram Moolenaar      'vim9script',
11217a092245SBram Moolenaar      'echo "yes"# something',
11227a092245SBram Moolenaar      ], 'E121:')
11237a092245SBram Moolenaar  CheckScriptFailure([
11247a092245SBram Moolenaar      'vim9script',
11257a092245SBram Moolenaar      'echo# something',
11267a092245SBram Moolenaar      ], 'E121:')
11277a092245SBram Moolenaar  CheckScriptFailure([
11287a092245SBram Moolenaar      'echo "yes" # something',
11297a092245SBram Moolenaar      ], 'E121:')
11307a092245SBram Moolenaar
11314a8d9f2eSBram Moolenaar  exe "echo" # comment
11324a8d9f2eSBram Moolenaar  CheckDefFailure([
11334a8d9f2eSBram Moolenaar      'exe "echo"# comment',
11344a8d9f2eSBram Moolenaar      ], 'E488:')
11354a8d9f2eSBram Moolenaar  CheckScriptSuccess([
11364a8d9f2eSBram Moolenaar      'vim9script',
11374a8d9f2eSBram Moolenaar      'exe "echo" # something',
11384a8d9f2eSBram Moolenaar      ])
11394a8d9f2eSBram Moolenaar  CheckScriptFailure([
11404a8d9f2eSBram Moolenaar      'vim9script',
11414a8d9f2eSBram Moolenaar      'exe "echo"# something',
11424a8d9f2eSBram Moolenaar      ], 'E121:')
11434a8d9f2eSBram Moolenaar  CheckDefFailure([
11444a8d9f2eSBram Moolenaar      'exe # comment',
11454a8d9f2eSBram Moolenaar      ], 'E1015:')
11464a8d9f2eSBram Moolenaar  CheckScriptFailure([
11474a8d9f2eSBram Moolenaar      'vim9script',
11484a8d9f2eSBram Moolenaar      'exe# something',
11494a8d9f2eSBram Moolenaar      ], 'E121:')
11504a8d9f2eSBram Moolenaar  CheckScriptFailure([
11514a8d9f2eSBram Moolenaar      'exe "echo" # something',
11524a8d9f2eSBram Moolenaar      ], 'E121:')
11534a8d9f2eSBram Moolenaar
11547a092245SBram Moolenaar  CheckDefFailure([
11557a092245SBram Moolenaar      'try# comment',
11567a092245SBram Moolenaar      'echo "yes"',
11577a092245SBram Moolenaar      'catch',
11587a092245SBram Moolenaar      'endtry',
11597a092245SBram Moolenaar      ], 'E488:')
11607a092245SBram Moolenaar  CheckDefFailure([
11617a092245SBram Moolenaar      'try',
11627a092245SBram Moolenaar      'echo "yes"',
11637a092245SBram Moolenaar      'catch# comment',
11647a092245SBram Moolenaar      'endtry',
11657a092245SBram Moolenaar      ], 'E488:')
11667a092245SBram Moolenaar  CheckDefFailure([
11677a092245SBram Moolenaar      'try',
11687a092245SBram Moolenaar      'echo "yes"',
11697a092245SBram Moolenaar      'catch',
11707a092245SBram Moolenaar      'endtry# comment',
11717a092245SBram Moolenaar      ], 'E488:')
11727a092245SBram Moolenaarenddef
11737a092245SBram Moolenaar
1174a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
1175a26b9700SBram Moolenaar  au TabEnter *.vim let g:entered = 1
1176a26b9700SBram Moolenaar  au TabEnter *.x let g:entered = 2
1177a26b9700SBram Moolenaar
1178a26b9700SBram Moolenaar  edit test.vim
1179a26b9700SBram Moolenaar  doautocmd TabEnter #comment
1180a26b9700SBram Moolenaar  assert_equal(1, g:entered)
1181a26b9700SBram Moolenaar
1182a26b9700SBram Moolenaar  doautocmd TabEnter f.x
1183a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1184a26b9700SBram Moolenaar
1185a26b9700SBram Moolenaar  g:entered = 0
1186a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
1187a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1188a26b9700SBram Moolenaar
1189a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
1190a26b9700SBram Moolenaar
1191a26b9700SBram Moolenaar  au! TabEnter
1192a26b9700SBram Moolenaar  unlet g:entered
1193d72c1bf0SBram Moolenaar
1194d72c1bf0SBram Moolenaar  CheckScriptSuccess([
1195d72c1bf0SBram Moolenaar      'vim9script',
1196d72c1bf0SBram Moolenaar      'let g:var = 123',
1197d72c1bf0SBram Moolenaar      'let w:var = 777',
1198d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
1199d72c1bf0SBram Moolenaar      ])
1200d72c1bf0SBram Moolenaar
1201d72c1bf0SBram Moolenaar  CheckScriptFailure([
1202d72c1bf0SBram Moolenaar      'vim9script',
1203d72c1bf0SBram Moolenaar      'let g:var = 123',
1204d72c1bf0SBram Moolenaar      'unlet g:var# comment',
1205d72c1bf0SBram Moolenaar      ], 'E108:')
1206d72c1bf0SBram Moolenaar
1207d72c1bf0SBram Moolenaar  CheckScriptFailure([
1208d72c1bf0SBram Moolenaar      'let g:var = 123',
1209d72c1bf0SBram Moolenaar      'unlet g:var # something',
1210d72c1bf0SBram Moolenaar      ], 'E488:')
1211a26b9700SBram Moolenaarenddef
1212a26b9700SBram Moolenaar
1213585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
1214585fea7bSBram Moolenaardef Test_substitute_cmd()
1215585fea7bSBram Moolenaar  new
1216585fea7bSBram Moolenaar  setline(1, 'something')
1217585fea7bSBram Moolenaar  :substitute(some(other(
1218585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
1219585fea7bSBram Moolenaar  bwipe!
1220585fea7bSBram Moolenaar
1221585fea7bSBram Moolenaar  " also when the context is Vim9 script
1222585fea7bSBram Moolenaar  let lines =<< trim END
1223585fea7bSBram Moolenaar    vim9script
1224585fea7bSBram Moolenaar    new
1225585fea7bSBram Moolenaar    setline(1, 'something')
1226585fea7bSBram Moolenaar    :substitute(some(other(
1227585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
1228585fea7bSBram Moolenaar    bwipe!
1229585fea7bSBram Moolenaar  END
1230585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
1231585fea7bSBram Moolenaar  source Xvim9lines
1232585fea7bSBram Moolenaar
1233585fea7bSBram Moolenaar  delete('Xvim9lines')
1234585fea7bSBram Moolenaarenddef
1235585fea7bSBram Moolenaar
12368a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1237