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
216*d72c1bf0SBram 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:')
259*d72c1bf0SBram Moolenaarenddef
260*d72c1bf0SBram Moolenaar
261*d72c1bf0SBram Moolenaardef Test_unlet()
262*d72c1bf0SBram Moolenaar  g:somevar = 'yes'
263*d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
264*d72c1bf0SBram Moolenaar  unlet g:somevar
265*d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
266*d72c1bf0SBram Moolenaar  unlet! g:somevar
267*d72c1bf0SBram Moolenaar
268*d72c1bf0SBram Moolenaar  call CheckScriptFailure([
269*d72c1bf0SBram Moolenaar        'vim9script',
270*d72c1bf0SBram Moolenaar        'let svar = 123',
271*d72c1bf0SBram Moolenaar        'unlet svar',
272*d72c1bf0SBram Moolenaar        ], 'E1081:')
273*d72c1bf0SBram Moolenaar  call CheckScriptFailure([
274*d72c1bf0SBram Moolenaar        'vim9script',
275*d72c1bf0SBram Moolenaar        'let svar = 123',
276*d72c1bf0SBram Moolenaar        'unlet s:svar',
277*d72c1bf0SBram Moolenaar        ], 'E1081:')
278*d72c1bf0SBram Moolenaar  call CheckScriptFailure([
279*d72c1bf0SBram Moolenaar        'vim9script',
280*d72c1bf0SBram Moolenaar        'let svar = 123',
281*d72c1bf0SBram Moolenaar        'def Func()',
282*d72c1bf0SBram Moolenaar        '  unlet svar',
283*d72c1bf0SBram Moolenaar        'enddef',
284*d72c1bf0SBram Moolenaar        ], 'E1081:')
285*d72c1bf0SBram Moolenaar  call CheckScriptFailure([
286*d72c1bf0SBram Moolenaar        'vim9script',
287*d72c1bf0SBram Moolenaar        'let svar = 123',
288*d72c1bf0SBram Moolenaar        'def Func()',
289*d72c1bf0SBram Moolenaar        '  unlet s:svar',
290*d72c1bf0SBram Moolenaar        'enddef',
291*d72c1bf0SBram Moolenaar        ], 'E1081:')
292*d72c1bf0SBram Moolenaarenddef
293599c89c8SBram Moolenaar
294599c89c8SBram Moolenaarfunc Test_wrong_type()
295599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
296599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
297599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
298599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
299599c89c8SBram Moolenaar
300599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
301599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
30242a480bfSBram Moolenaar
30342a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
30442a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
30542a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
30642a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
30742a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
30842a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
30942a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
31042a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
31142a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
31242a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
31342a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
3148a7d6542SBram Moolenaarendfunc
3158a7d6542SBram Moolenaar
3168a7d6542SBram Moolenaarfunc Test_const()
3178a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
3188a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
3198a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
3209be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
3218a7d6542SBram Moolenaarendfunc
3228a7d6542SBram Moolenaar
3238a7d6542SBram Moolenaardef Test_block()
3248a7d6542SBram Moolenaar  let outer = 1
3258a7d6542SBram Moolenaar  {
3268a7d6542SBram Moolenaar    let inner = 2
3278a7d6542SBram Moolenaar    assert_equal(1, outer)
3288a7d6542SBram Moolenaar    assert_equal(2, inner)
3298a7d6542SBram Moolenaar  }
3308a7d6542SBram Moolenaar  assert_equal(1, outer)
3318a7d6542SBram Moolenaarenddef
3328a7d6542SBram Moolenaar
3338a7d6542SBram Moolenaarfunc Test_block_failure()
3348a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
335585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
336585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
3378a7d6542SBram Moolenaarendfunc
3388a7d6542SBram Moolenaar
339585fea7bSBram Moolenaardef Test_cmd_modifier()
340585fea7bSBram Moolenaar  tab echo '0'
341585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
342585fea7bSBram Moolenaarenddef
343585fea7bSBram Moolenaar
3448a7d6542SBram Moolenaardef Test_try_catch()
3458a7d6542SBram Moolenaar  let l = []
3467a092245SBram Moolenaar  try # comment
3478a7d6542SBram Moolenaar    add(l, '1')
3488a7d6542SBram Moolenaar    throw 'wrong'
3498a7d6542SBram Moolenaar    add(l, '2')
3507a092245SBram Moolenaar  catch # comment
3518a7d6542SBram Moolenaar    add(l, v:exception)
3527a092245SBram Moolenaar  finally # comment
3538a7d6542SBram Moolenaar    add(l, '3')
3547a092245SBram Moolenaar  endtry # comment
3558a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
3568a7d6542SBram Moolenaarenddef
3578a7d6542SBram Moolenaar
358257cc5eeSBram Moolenaardef ThrowFromDef()
359257cc5eeSBram Moolenaar  throw 'getout'
360257cc5eeSBram Moolenaarenddef
361257cc5eeSBram Moolenaar
362257cc5eeSBram Moolenaarfunc CatchInFunc()
363257cc5eeSBram Moolenaar  try
364257cc5eeSBram Moolenaar    call ThrowFromDef()
365257cc5eeSBram Moolenaar  catch
366257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
367257cc5eeSBram Moolenaar  endtry
368257cc5eeSBram Moolenaarendfunc
369257cc5eeSBram Moolenaar
370257cc5eeSBram Moolenaardef CatchInDef()
371257cc5eeSBram Moolenaar  try
372257cc5eeSBram Moolenaar    ThrowFromDef()
373257cc5eeSBram Moolenaar  catch
374257cc5eeSBram Moolenaar    g:thrown_def = v:exception
375257cc5eeSBram Moolenaar  endtry
376257cc5eeSBram Moolenaarenddef
377257cc5eeSBram Moolenaar
378f575adffSBram Moolenaardef ReturnFinally(): string
379f575adffSBram Moolenaar  try
380f575adffSBram Moolenaar    return 'intry'
381f575adffSBram Moolenaar  finally
382f575adffSBram Moolenaar    g:in_finally = 'finally'
383f575adffSBram Moolenaar  endtry
384f575adffSBram Moolenaar  return 'end'
385f575adffSBram Moolenaarenddef
386f575adffSBram Moolenaar
387257cc5eeSBram Moolenaardef Test_try_catch_nested()
388257cc5eeSBram Moolenaar  CatchInFunc()
389257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
390257cc5eeSBram Moolenaar
391257cc5eeSBram Moolenaar  CatchInDef()
392257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
393f575adffSBram Moolenaar
394f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
395f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
396f575adffSBram Moolenaarenddef
397f575adffSBram Moolenaar
398f575adffSBram Moolenaardef Test_try_catch_match()
399f575adffSBram Moolenaar  let seq = 'a'
400f575adffSBram Moolenaar  try
401f575adffSBram Moolenaar    throw 'something'
402f575adffSBram Moolenaar  catch /nothing/
403f575adffSBram Moolenaar    seq ..= 'x'
404f575adffSBram Moolenaar  catch /some/
405f575adffSBram Moolenaar    seq ..= 'b'
406f575adffSBram Moolenaar  catch /asdf/
407f575adffSBram Moolenaar    seq ..= 'x'
408e8c4abbbSBram Moolenaar  catch ?a\?sdf?
409e8c4abbbSBram Moolenaar    seq ..= 'y'
410f575adffSBram Moolenaar  finally
411f575adffSBram Moolenaar    seq ..= 'c'
412f575adffSBram Moolenaar  endtry
413f575adffSBram Moolenaar  assert_equal('abc', seq)
414257cc5eeSBram Moolenaarenddef
415257cc5eeSBram Moolenaar
416e8c4abbbSBram Moolenaardef Test_try_catch_fails()
417e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
418e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
419e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
420585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
421585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
422585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
423585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
424585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
425585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
426585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
427585fea7bSBram Moolenaar
428585fea7bSBram Moolenaar  call CheckDefFailure(['throw'], 'E471:')
429585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
430e8c4abbbSBram Moolenaarenddef
431e8c4abbbSBram Moolenaar
4328a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
4338a7d6542SBram Moolenaar  vim9script
4348a7d6542SBram Moolenaar  let name: string = 'bob'
4358a7d6542SBram Moolenaar  def Concat(arg: string): string
4368a7d6542SBram Moolenaar    return name .. arg
4378a7d6542SBram Moolenaar  enddef
4388a7d6542SBram Moolenaar  let g:result = Concat('bie')
4398a7d6542SBram Moolenaar  let g:localname = name
4408a7d6542SBram Moolenaar
4418a7d6542SBram Moolenaar  export const CONST = 1234
4428a7d6542SBram Moolenaar  export let exported = 9876
4436e587dcbSBram Moolenaar  export let exp_name = 'John'
4448a7d6542SBram Moolenaar  export def Exported(): string
4458a7d6542SBram Moolenaar    return 'Exported'
4468a7d6542SBram Moolenaar  enddef
4478a7d6542SBram MoolenaarEND
4488a7d6542SBram Moolenaar
4495269bd2aSBram Moolenaardef Test_vim9_import_export()
4508a7d6542SBram Moolenaar  let import_script_lines =<< trim END
4518a7d6542SBram Moolenaar    vim9script
4528a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
4538a7d6542SBram Moolenaar    g:imported = exported
4546e587dcbSBram Moolenaar    exported += 3
4556e587dcbSBram Moolenaar    g:imported_added = exported
4568a7d6542SBram Moolenaar    g:imported_func = Exported()
4576e587dcbSBram Moolenaar
4586e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
4596e587dcbSBram Moolenaar    g:imported_name = exp_name
4606e587dcbSBram Moolenaar    exp_name ..= ' Doe'
4616e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
4625381c7a1SBram Moolenaar    g:imported_later = exported
4638a7d6542SBram Moolenaar  END
4648a7d6542SBram Moolenaar
4658a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
4668a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
4678a7d6542SBram Moolenaar
4688a7d6542SBram Moolenaar  source Ximport.vim
4698a7d6542SBram Moolenaar
4708a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
4718a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
4728a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
4736e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
4745381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
4758a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
4766e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
4776e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
4788a7d6542SBram Moolenaar  assert_false(exists('g:name'))
4798a7d6542SBram Moolenaar
4808a7d6542SBram Moolenaar  unlet g:result
4818a7d6542SBram Moolenaar  unlet g:localname
4828a7d6542SBram Moolenaar  unlet g:imported
4836e587dcbSBram Moolenaar  unlet g:imported_added
4845381c7a1SBram Moolenaar  unlet g:imported_later
4858a7d6542SBram Moolenaar  unlet g:imported_func
4866e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
4878a7d6542SBram Moolenaar  delete('Ximport.vim')
488f2d5c240SBram Moolenaar
4895381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
4905381c7a1SBram Moolenaar    vim9script
4915381c7a1SBram Moolenaar    def ImportInDef()
4925381c7a1SBram Moolenaar      import exported from './Xexport.vim'
4935381c7a1SBram Moolenaar      g:imported = exported
4945381c7a1SBram Moolenaar      exported += 7
4955381c7a1SBram Moolenaar      g:imported_added = exported
4965381c7a1SBram Moolenaar    enddef
4975381c7a1SBram Moolenaar    ImportInDef()
4985381c7a1SBram Moolenaar  END
4995381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
5005381c7a1SBram Moolenaar  source Ximport2.vim
5015381c7a1SBram Moolenaar  " TODO: this should be 9879
5025381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
5035381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
5045381c7a1SBram Moolenaar  unlet g:imported
5055381c7a1SBram Moolenaar  unlet g:imported_added
5065381c7a1SBram Moolenaar  delete('Ximport2.vim')
5075381c7a1SBram Moolenaar
508f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
509f2d5c240SBram Moolenaar    vim9script
510f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
511f2d5c240SBram Moolenaar    def UseExport()
512f2d5c240SBram Moolenaar      g:imported = Export.exported
513f2d5c240SBram Moolenaar    enddef
514f2d5c240SBram Moolenaar    UseExport()
515f2d5c240SBram Moolenaar  END
516f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
517f2d5c240SBram Moolenaar  source Ximport.vim
5185381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
519f2d5c240SBram Moolenaar
520599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
521599c89c8SBram Moolenaar    vim9script
522599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
523599c89c8SBram Moolenaar    def Func()
524599c89c8SBram Moolenaar      let dummy = 1
525599c89c8SBram Moolenaar      let imported = Export + dummy
526599c89c8SBram Moolenaar    enddef
527599c89c8SBram Moolenaar  END
528599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
529599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
530599c89c8SBram Moolenaar
531599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
532599c89c8SBram Moolenaar    vim9script
533599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
534599c89c8SBram Moolenaar    def Func()
535599c89c8SBram Moolenaar      let imported = Export . exported
536599c89c8SBram Moolenaar    enddef
537599c89c8SBram Moolenaar  END
538599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
539599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
540599c89c8SBram Moolenaar
541599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
542599c89c8SBram Moolenaar    vim9script
543599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
544599c89c8SBram Moolenaar    def Func()
545599c89c8SBram Moolenaar      let imported = Export.
546599c89c8SBram Moolenaar    enddef
547599c89c8SBram Moolenaar  END
548599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
549599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
550599c89c8SBram Moolenaar
551f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
552f2d5c240SBram Moolenaar    vim9script
553f2d5c240SBram Moolenaar    import * from './Xexport.vim'
554f2d5c240SBram Moolenaar    g:imported = exported
555f2d5c240SBram Moolenaar  END
556f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
557f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
558f2d5c240SBram Moolenaar
559fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
560fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
561fa29c8abSBram Moolenaar    vim9script
562fa29c8abSBram Moolenaar    import name from './Xexport.vim'
563fa29c8abSBram Moolenaar  END
564fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
565fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
566fa29c8abSBram Moolenaar
5675269bd2aSBram Moolenaar  " try to import something that is already defined
5685269bd2aSBram Moolenaar  let import_already_defined =<< trim END
5695269bd2aSBram Moolenaar    vim9script
5705269bd2aSBram Moolenaar    let exported = 'something'
5715269bd2aSBram Moolenaar    import exported from './Xexport.vim'
5725269bd2aSBram Moolenaar  END
5735269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5745269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5755269bd2aSBram Moolenaar
5765269bd2aSBram Moolenaar  " try to import something that is already defined
5775269bd2aSBram Moolenaar  import_already_defined =<< trim END
5785269bd2aSBram Moolenaar    vim9script
5795269bd2aSBram Moolenaar    let exported = 'something'
5805269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
5815269bd2aSBram Moolenaar  END
5825269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5835269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5845269bd2aSBram Moolenaar
5855269bd2aSBram Moolenaar  " try to import something that is already defined
5865269bd2aSBram Moolenaar  import_already_defined =<< trim END
5875269bd2aSBram Moolenaar    vim9script
5885269bd2aSBram Moolenaar    let exported = 'something'
5895269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
5905269bd2aSBram Moolenaar  END
5915269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5925269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5935269bd2aSBram Moolenaar
594fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
595fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
596fa29c8abSBram Moolenaar    vim9script
597fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
598fa29c8abSBram Moolenaar  END
599fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
600fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
601fa29c8abSBram Moolenaar
602fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
603fa29c8abSBram Moolenaar    vim9script
604fa29c8abSBram Moolenaar    import name './Xexport.vim'
605fa29c8abSBram Moolenaar  END
606fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
607fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
608fa29c8abSBram Moolenaar
609fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
610fa29c8abSBram Moolenaar    vim9script
611fa29c8abSBram Moolenaar    import name from Xexport.vim
612fa29c8abSBram Moolenaar  END
613fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
614fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
615fa29c8abSBram Moolenaar
616fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
617fa29c8abSBram Moolenaar    vim9script
618fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
619fa29c8abSBram Moolenaar  END
620fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
621fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
622fa29c8abSBram Moolenaar
623fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
624fa29c8abSBram Moolenaar    vim9script
625fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
626fa29c8abSBram Moolenaar  END
6275269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
6285269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
629fa29c8abSBram Moolenaar
630f2d5c240SBram Moolenaar  delete('Ximport.vim')
6315269bd2aSBram Moolenaar  delete('Ximport3.vim')
6328a7d6542SBram Moolenaar  delete('Xexport.vim')
6338a7d6542SBram Moolenaar
634750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
635750802b5SBram Moolenaar  set cpo&vi
636750802b5SBram Moolenaar  let cpo_before = &cpo
637750802b5SBram Moolenaar  let lines =<< trim END
638750802b5SBram Moolenaar    vim9script
639750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
640750802b5SBram Moolenaar  END
641750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
642750802b5SBram Moolenaar  source Xvim9_script
643750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
644750802b5SBram Moolenaar  set cpo&vim
645750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
646750802b5SBram Moolenaar  delete('Xvim9_script')
647750802b5SBram Moolenaarenddef
648750802b5SBram Moolenaar
649750802b5SBram Moolenaardef Test_vim9script_fails()
6508a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
6518a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
652750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
653f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
654750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
655750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
656750802b5SBram Moolenaar
657750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
658a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
6598a7d6542SBram Moolenaarenddef
6608a7d6542SBram Moolenaar
6618a7d6542SBram Moolenaardef Test_vim9script_reload()
6628a7d6542SBram Moolenaar  let lines =<< trim END
6638a7d6542SBram Moolenaar    vim9script
6648a7d6542SBram Moolenaar    const var = ''
6658a7d6542SBram Moolenaar    let valone = 1234
6668a7d6542SBram Moolenaar    def MyFunc(arg: string)
6678a7d6542SBram Moolenaar       valone = 5678
6688a7d6542SBram Moolenaar    enddef
6698a7d6542SBram Moolenaar  END
6708a7d6542SBram Moolenaar  let morelines =<< trim END
6718a7d6542SBram Moolenaar    let valtwo = 222
6728a7d6542SBram Moolenaar    export def GetValtwo(): number
6738a7d6542SBram Moolenaar      return valtwo
6748a7d6542SBram Moolenaar    enddef
6758a7d6542SBram Moolenaar  END
676675f716eSBram Moolenaar  writefile(lines + morelines,
677675f716eSBram Moolenaar            'Xreload.vim')
6788a7d6542SBram Moolenaar  source Xreload.vim
6798a7d6542SBram Moolenaar  source Xreload.vim
6808a7d6542SBram Moolenaar  source Xreload.vim
6818a7d6542SBram Moolenaar
6828a7d6542SBram Moolenaar  let testlines =<< trim END
6838a7d6542SBram Moolenaar    vim9script
6848a7d6542SBram Moolenaar    def TheFunc()
6858a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
6868a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
6878a7d6542SBram Moolenaar    enddef
6888a7d6542SBram Moolenaar    TheFunc()
6898a7d6542SBram Moolenaar  END
6908a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
6918a7d6542SBram Moolenaar  source Ximport.vim
6928a7d6542SBram Moolenaar
6938a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
6948a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
6958a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
6968a7d6542SBram Moolenaar  source Xreload.vim
6978a7d6542SBram Moolenaar  source Ximport.vim
6988a7d6542SBram Moolenaar
6998a7d6542SBram Moolenaar  " cannot declare a var twice
7008a7d6542SBram Moolenaar  lines =<< trim END
7018a7d6542SBram Moolenaar    vim9script
7028a7d6542SBram Moolenaar    let valone = 1234
7038a7d6542SBram Moolenaar    let valone = 5678
7048a7d6542SBram Moolenaar  END
7058a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
7068a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
7078a7d6542SBram Moolenaar
7088a7d6542SBram Moolenaar  delete('Xreload.vim')
7098a7d6542SBram Moolenaar  delete('Ximport.vim')
7108a7d6542SBram Moolenaarenddef
7118a7d6542SBram Moolenaar
7128a7d6542SBram Moolenaardef Test_import_absolute()
7138a7d6542SBram Moolenaar  let import_lines = [
714e6085c53SBram Moolenaar        'vim9script',
715e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
716e6085c53SBram Moolenaar        'def UseExported()',
717e6085c53SBram Moolenaar        '  g:imported_abs = exported',
718e6085c53SBram Moolenaar        '  exported = 8888',
719e6085c53SBram Moolenaar        '  g:imported_after = exported',
720e6085c53SBram Moolenaar        'enddef',
721e6085c53SBram Moolenaar        'UseExported()',
722e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
723e6085c53SBram Moolenaar        ]
7248a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
7258a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
7268a7d6542SBram Moolenaar
7278a7d6542SBram Moolenaar  source Ximport_abs.vim
7288a7d6542SBram Moolenaar
7298a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
7304e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
731675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
732675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
733675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
734675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
735675f716eSBram Moolenaar          'exported = 8888.*' ..
736675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
737675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
738675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
739675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
740e6085c53SBram Moolenaar        g:import_disassembled)
7418a7d6542SBram Moolenaar  unlet g:imported_abs
7424e12a5dfSBram Moolenaar  unlet g:import_disassembled
7438a7d6542SBram Moolenaar
7448a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
7458a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
7468a7d6542SBram Moolenaarenddef
7478a7d6542SBram Moolenaar
7488a7d6542SBram Moolenaardef Test_import_rtp()
7498a7d6542SBram Moolenaar  let import_lines = [
750e6085c53SBram Moolenaar        'vim9script',
751e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
752e6085c53SBram Moolenaar        'g:imported_rtp = exported',
753e6085c53SBram Moolenaar        ]
7548a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
7558a7d6542SBram Moolenaar  mkdir('import')
7568a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
7578a7d6542SBram Moolenaar
7588a7d6542SBram Moolenaar  let save_rtp = &rtp
7598a7d6542SBram Moolenaar  &rtp = getcwd()
7608a7d6542SBram Moolenaar  source Ximport_rtp.vim
7618a7d6542SBram Moolenaar  &rtp = save_rtp
7628a7d6542SBram Moolenaar
7638a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
7648a7d6542SBram Moolenaar  unlet g:imported_rtp
7658a7d6542SBram Moolenaar
7668a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
7678a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
7688a7d6542SBram Moolenaar  delete('import', 'd')
7698a7d6542SBram Moolenaarenddef
7708a7d6542SBram Moolenaar
7718a7d6542SBram Moolenaardef Test_fixed_size_list()
7728a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
7738a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
7748a7d6542SBram Moolenaar  l->remove(0)
7758a7d6542SBram Moolenaar  l->add(5)
7768a7d6542SBram Moolenaar  l->insert(99, 1)
7770f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
7788a7d6542SBram Moolenaarenddef
7798a7d6542SBram Moolenaar
780158906cfSBram Moolenaardef IfElse(what: number): string
781158906cfSBram Moolenaar  let res = ''
782158906cfSBram Moolenaar  if what == 1
783158906cfSBram Moolenaar    res = "one"
784158906cfSBram Moolenaar  elseif what == 2
785158906cfSBram Moolenaar    res = "two"
786a259d8d3SBram Moolenaar  else
787158906cfSBram Moolenaar    res = "three"
788a259d8d3SBram Moolenaar  endif
789158906cfSBram Moolenaar  return res
790a259d8d3SBram Moolenaarenddef
791a259d8d3SBram Moolenaar
792158906cfSBram Moolenaardef Test_if_elseif_else()
793158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
794158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
795158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
7960f18b6d1SBram Moolenaarenddef
7970f18b6d1SBram Moolenaar
798e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
799e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
800e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
801e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
802e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
803585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
804e8c4abbbSBram Moolenaarenddef
805e8c4abbbSBram Moolenaar
8066d69bf60SBram Moolenaarlet g:bool_true = v:true
8076d69bf60SBram Moolenaarlet g:bool_false = v:false
8086d69bf60SBram Moolenaar
8096d69bf60SBram Moolenaardef Test_if_const_expr()
8106d69bf60SBram Moolenaar  let res = false
8116d69bf60SBram Moolenaar  if true ? true : false
8126d69bf60SBram Moolenaar    res = true
8136d69bf60SBram Moolenaar  endif
8146d69bf60SBram Moolenaar  assert_equal(true, res)
8156d69bf60SBram Moolenaar
816585fea7bSBram Moolenaar  g:glob = 2
817585fea7bSBram Moolenaar  if false
818585fea7bSBram Moolenaar    execute('let g:glob = 3')
819585fea7bSBram Moolenaar  endif
820585fea7bSBram Moolenaar  assert_equal(2, g:glob)
821585fea7bSBram Moolenaar  if true
822585fea7bSBram Moolenaar    execute('let g:glob = 3')
823585fea7bSBram Moolenaar  endif
824585fea7bSBram Moolenaar  assert_equal(3, g:glob)
825585fea7bSBram Moolenaar
8266d69bf60SBram Moolenaar  res = false
8276d69bf60SBram Moolenaar  if g:bool_true ? true : false
8286d69bf60SBram Moolenaar    res = true
8296d69bf60SBram Moolenaar  endif
8306d69bf60SBram Moolenaar  assert_equal(true, res)
8316d69bf60SBram Moolenaar
8326d69bf60SBram Moolenaar  res = false
8336d69bf60SBram Moolenaar  if true ? g:bool_true : false
8346d69bf60SBram Moolenaar    res = true
8356d69bf60SBram Moolenaar  endif
8366d69bf60SBram Moolenaar  assert_equal(true, res)
8376d69bf60SBram Moolenaar
8386d69bf60SBram Moolenaar  res = false
8396d69bf60SBram Moolenaar  if true ? true : g:bool_false
8406d69bf60SBram Moolenaar    res = true
8416d69bf60SBram Moolenaar  endif
8426d69bf60SBram Moolenaar  assert_equal(true, res)
8436d69bf60SBram Moolenaar
8446d69bf60SBram Moolenaar  res = false
8456d69bf60SBram Moolenaar  if true ? false : true
8466d69bf60SBram Moolenaar    res = true
8476d69bf60SBram Moolenaar  endif
8486d69bf60SBram Moolenaar  assert_equal(false, res)
8496d69bf60SBram Moolenaar
8506d69bf60SBram Moolenaar  res = false
8516d69bf60SBram Moolenaar  if false ? false : true
8526d69bf60SBram Moolenaar    res = true
8536d69bf60SBram Moolenaar  endif
8546d69bf60SBram Moolenaar  assert_equal(true, res)
8556d69bf60SBram Moolenaar
8566d69bf60SBram Moolenaar  res = false
8576d69bf60SBram Moolenaar  if false ? true : false
8586d69bf60SBram Moolenaar    res = true
8596d69bf60SBram Moolenaar  endif
8606d69bf60SBram Moolenaar  assert_equal(false, res)
8616d69bf60SBram Moolenaar
8626d69bf60SBram Moolenaar  res = false
863e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
864e8c4abbbSBram Moolenaar    res = true
865e8c4abbbSBram Moolenaar  endif
866e8c4abbbSBram Moolenaar  assert_equal(false, res)
867e8c4abbbSBram Moolenaar
868e8c4abbbSBram Moolenaar  res = false
8696d69bf60SBram Moolenaar  if true && true
8706d69bf60SBram Moolenaar    res = true
8716d69bf60SBram Moolenaar  endif
8726d69bf60SBram Moolenaar  assert_equal(true, res)
8736d69bf60SBram Moolenaar
8746d69bf60SBram Moolenaar  res = false
8756d69bf60SBram Moolenaar  if true && false
8766d69bf60SBram Moolenaar    res = true
8776d69bf60SBram Moolenaar  endif
8786d69bf60SBram Moolenaar  assert_equal(false, res)
8796d69bf60SBram Moolenaar
8806d69bf60SBram Moolenaar  res = false
8816d69bf60SBram Moolenaar  if g:bool_true && false
8826d69bf60SBram Moolenaar    res = true
8836d69bf60SBram Moolenaar  endif
8846d69bf60SBram Moolenaar  assert_equal(false, res)
8856d69bf60SBram Moolenaar
8866d69bf60SBram Moolenaar  res = false
8876d69bf60SBram Moolenaar  if true && g:bool_false
8886d69bf60SBram Moolenaar    res = true
8896d69bf60SBram Moolenaar  endif
8906d69bf60SBram Moolenaar  assert_equal(false, res)
8916d69bf60SBram Moolenaar
8926d69bf60SBram Moolenaar  res = false
8936d69bf60SBram Moolenaar  if false && false
8946d69bf60SBram Moolenaar    res = true
8956d69bf60SBram Moolenaar  endif
8966d69bf60SBram Moolenaar  assert_equal(false, res)
8976d69bf60SBram Moolenaar
8986d69bf60SBram Moolenaar  res = false
8996d69bf60SBram Moolenaar  if true || false
9006d69bf60SBram Moolenaar    res = true
9016d69bf60SBram Moolenaar  endif
9026d69bf60SBram Moolenaar  assert_equal(true, res)
9036d69bf60SBram Moolenaar
9046d69bf60SBram Moolenaar  res = false
9056d69bf60SBram Moolenaar  if g:bool_true || false
9066d69bf60SBram Moolenaar    res = true
9076d69bf60SBram Moolenaar  endif
9086d69bf60SBram Moolenaar  assert_equal(true, res)
9096d69bf60SBram Moolenaar
9106d69bf60SBram Moolenaar  res = false
9116d69bf60SBram Moolenaar  if true || g:bool_false
9126d69bf60SBram Moolenaar    res = true
9136d69bf60SBram Moolenaar  endif
9146d69bf60SBram Moolenaar  assert_equal(true, res)
9156d69bf60SBram Moolenaar
9166d69bf60SBram Moolenaar  res = false
9176d69bf60SBram Moolenaar  if false || false
9186d69bf60SBram Moolenaar    res = true
9196d69bf60SBram Moolenaar  endif
9206d69bf60SBram Moolenaar  assert_equal(false, res)
92180c34ca3SBram Moolenaarenddef
9226d69bf60SBram Moolenaar
92380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
92480c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
92580c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
926e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
927e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
9286d69bf60SBram Moolenaarenddef
9296d69bf60SBram Moolenaar
930ad39c094SBram Moolenaardef Test_execute_cmd()
931ad39c094SBram Moolenaar  new
932ad39c094SBram Moolenaar  setline(1, 'default')
933ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
934ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
935ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
936ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
937ad39c094SBram Moolenaar  execute cmd1 cmd2
938ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
939ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
940ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
941ad39c094SBram Moolenaar  let cmd_first = 'call '
942ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
943ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
944ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
945ad39c094SBram Moolenaar  bwipe!
946585fea7bSBram Moolenaar
947585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
948ad39c094SBram Moolenaarenddef
949ad39c094SBram Moolenaar
950ad39c094SBram Moolenaardef Test_echo_cmd()
951585fea7bSBram Moolenaar  echo 'some'
952585fea7bSBram Moolenaar  echon 'thing'
953ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
954ad39c094SBram Moolenaar
955ad39c094SBram Moolenaar  let str1 = 'some'
956ad39c094SBram Moolenaar  let str2 = 'more'
957ad39c094SBram Moolenaar  echo str1 str2
958ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
959ad39c094SBram Moolenaarenddef
960ad39c094SBram Moolenaar
96141fe0617SBram Moolenaardef Test_for_outside_of_function()
96241fe0617SBram Moolenaar  let lines =<< trim END
96341fe0617SBram Moolenaar    vim9script
96441fe0617SBram Moolenaar    new
96541fe0617SBram Moolenaar    for var in range(0, 3)
96641fe0617SBram Moolenaar      append(line('$'), var)
96741fe0617SBram Moolenaar    endfor
96841fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
96941fe0617SBram Moolenaar    bwipe!
97041fe0617SBram Moolenaar  END
97141fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
97241fe0617SBram Moolenaar  source Xvim9for.vim
97341fe0617SBram Moolenaar  delete('Xvim9for.vim')
97441fe0617SBram Moolenaarenddef
9758a7d6542SBram Moolenaar
976e8c4abbbSBram Moolenaardef Test_for_loop()
977e8c4abbbSBram Moolenaar  let result = ''
978e8c4abbbSBram Moolenaar  for cnt in range(7)
979e8c4abbbSBram Moolenaar    if cnt == 4
980e8c4abbbSBram Moolenaar      break
981e8c4abbbSBram Moolenaar    endif
982e8c4abbbSBram Moolenaar    if cnt == 2
983e8c4abbbSBram Moolenaar      continue
984e8c4abbbSBram Moolenaar    endif
985e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
986e8c4abbbSBram Moolenaar  endfor
987e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
988e8c4abbbSBram Moolenaarenddef
989e8c4abbbSBram Moolenaar
990e8c4abbbSBram Moolenaardef Test_for_loop_fails()
991675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
992675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
993675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
9946e949784SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef'], 'E1006:')
995675f716eSBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1024:')
996675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
997675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
998675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
999e8c4abbbSBram Moolenaarenddef
1000e8c4abbbSBram Moolenaar
1001d0df1aacSBram Moolenaardef Test_while_loop()
1002d0df1aacSBram Moolenaar  let result = ''
1003d0df1aacSBram Moolenaar  let cnt = 0
1004d0df1aacSBram Moolenaar  while cnt < 555
1005d0df1aacSBram Moolenaar    if cnt == 3
1006d0df1aacSBram Moolenaar      break
1007d0df1aacSBram Moolenaar    endif
1008d0df1aacSBram Moolenaar    cnt += 1
1009d0df1aacSBram Moolenaar    if cnt == 2
1010d0df1aacSBram Moolenaar      continue
1011d0df1aacSBram Moolenaar    endif
1012d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1013d0df1aacSBram Moolenaar  endwhile
1014d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1015d0df1aacSBram Moolenaarenddef
1016d0df1aacSBram Moolenaar
1017e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1018675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1019675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1020675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1021675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1022675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1023675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1024675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1025bd5da371SBram Moolenaarenddef
1026bd5da371SBram Moolenaar
10279645e2d9SBram Moolenaardef Test_interrupt_loop()
102897acfc78SBram Moolenaar  let caught = false
10299645e2d9SBram Moolenaar  let x = 0
103097acfc78SBram Moolenaar  try
10319645e2d9SBram Moolenaar    while 1
10329645e2d9SBram Moolenaar      x += 1
10339645e2d9SBram Moolenaar      if x == 100
10349645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
10359645e2d9SBram Moolenaar      endif
10369645e2d9SBram Moolenaar    endwhile
103797acfc78SBram Moolenaar  catch
103897acfc78SBram Moolenaar    caught = true
103997acfc78SBram Moolenaar    assert_equal(100, x)
104097acfc78SBram Moolenaar  endtry
104197acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
10429645e2d9SBram Moolenaarenddef
104320431c9dSBram Moolenaar
10444fdae999SBram Moolenaardef Test_automatic_line_continuation()
10454fdae999SBram Moolenaar  let mylist = [
10464fdae999SBram Moolenaar      'one',
10474fdae999SBram Moolenaar      'two',
10484fdae999SBram Moolenaar      'three',
10494fdae999SBram Moolenaar      ] " comment
10504fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
10514fdae999SBram Moolenaar
10524fdae999SBram Moolenaar  let mydict = {
10534fdae999SBram Moolenaar      'one': 1,
10544fdae999SBram Moolenaar      'two': 2,
10554fdae999SBram Moolenaar      'three':
10564fdae999SBram Moolenaar          3,
10574fdae999SBram Moolenaar      } " comment
10584fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
10594fdae999SBram Moolenaar  mydict = #{
10602c330432SBram Moolenaar      one: 1,  # comment
10612c330432SBram Moolenaar      two:     # comment
10622c330432SBram Moolenaar           2,  # comment
10632c330432SBram Moolenaar      three: 3 # comment
10642c330432SBram Moolenaar      }
10652c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
10662c330432SBram Moolenaar  mydict = #{
10672c330432SBram Moolenaar      one: 1,
10684fdae999SBram Moolenaar      two:
10694fdae999SBram Moolenaar           2,
10702c330432SBram Moolenaar      three: 3
10714fdae999SBram Moolenaar      }
10724fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1073e6085c53SBram Moolenaar
1074e6085c53SBram Moolenaar  assert_equal(
1075e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1076e6085c53SBram Moolenaar        split('one two three')
1077e6085c53SBram Moolenaar        )
10784fdae999SBram Moolenaarenddef
10794fdae999SBram Moolenaar
10807a092245SBram Moolenaardef Test_vim9_comment()
10817a092245SBram Moolenaar  CheckScriptSuccess([
10827a092245SBram Moolenaar      'vim9script',
10837a092245SBram Moolenaar      '# something',
10847a092245SBram Moolenaar      ])
10857a092245SBram Moolenaar  CheckScriptFailure([
10867a092245SBram Moolenaar      'vim9script',
10877a092245SBram Moolenaar      ':# something',
10887a092245SBram Moolenaar      ], 'E488:')
10897a092245SBram Moolenaar  CheckScriptFailure([
10907a092245SBram Moolenaar      '# something',
10917a092245SBram Moolenaar      ], 'E488:')
10927a092245SBram Moolenaar  CheckScriptFailure([
10937a092245SBram Moolenaar      ':# something',
10947a092245SBram Moolenaar      ], 'E488:')
10957a092245SBram Moolenaar
10964a8d9f2eSBram Moolenaar  { # block start
10974a8d9f2eSBram Moolenaar  } # block end
10984a8d9f2eSBram Moolenaar  CheckDefFailure([
10994a8d9f2eSBram Moolenaar      '{# comment',
11004a8d9f2eSBram Moolenaar      ], 'E488:')
11014a8d9f2eSBram Moolenaar  CheckDefFailure([
11024a8d9f2eSBram Moolenaar      '{',
11034a8d9f2eSBram Moolenaar      '}# comment',
11044a8d9f2eSBram Moolenaar      ], 'E488:')
11054a8d9f2eSBram Moolenaar
11064a8d9f2eSBram Moolenaar  echo "yes" # comment
11074a8d9f2eSBram Moolenaar  CheckDefFailure([
11084a8d9f2eSBram Moolenaar      'echo "yes"# comment',
11094a8d9f2eSBram Moolenaar      ], 'E488:')
11107a092245SBram Moolenaar  CheckScriptSuccess([
11117a092245SBram Moolenaar      'vim9script',
11127a092245SBram Moolenaar      'echo "yes" # something',
11137a092245SBram Moolenaar      ])
11147a092245SBram Moolenaar  CheckScriptFailure([
11157a092245SBram Moolenaar      'vim9script',
11167a092245SBram Moolenaar      'echo "yes"# something',
11177a092245SBram Moolenaar      ], 'E121:')
11187a092245SBram Moolenaar  CheckScriptFailure([
11197a092245SBram Moolenaar      'vim9script',
11207a092245SBram Moolenaar      'echo# something',
11217a092245SBram Moolenaar      ], 'E121:')
11227a092245SBram Moolenaar  CheckScriptFailure([
11237a092245SBram Moolenaar      'echo "yes" # something',
11247a092245SBram Moolenaar      ], 'E121:')
11257a092245SBram Moolenaar
11264a8d9f2eSBram Moolenaar  exe "echo" # comment
11274a8d9f2eSBram Moolenaar  CheckDefFailure([
11284a8d9f2eSBram Moolenaar      'exe "echo"# comment',
11294a8d9f2eSBram Moolenaar      ], 'E488:')
11304a8d9f2eSBram Moolenaar  CheckScriptSuccess([
11314a8d9f2eSBram Moolenaar      'vim9script',
11324a8d9f2eSBram Moolenaar      'exe "echo" # something',
11334a8d9f2eSBram Moolenaar      ])
11344a8d9f2eSBram Moolenaar  CheckScriptFailure([
11354a8d9f2eSBram Moolenaar      'vim9script',
11364a8d9f2eSBram Moolenaar      'exe "echo"# something',
11374a8d9f2eSBram Moolenaar      ], 'E121:')
11384a8d9f2eSBram Moolenaar  CheckDefFailure([
11394a8d9f2eSBram Moolenaar      'exe # comment',
11404a8d9f2eSBram Moolenaar      ], 'E1015:')
11414a8d9f2eSBram Moolenaar  CheckScriptFailure([
11424a8d9f2eSBram Moolenaar      'vim9script',
11434a8d9f2eSBram Moolenaar      'exe# something',
11444a8d9f2eSBram Moolenaar      ], 'E121:')
11454a8d9f2eSBram Moolenaar  CheckScriptFailure([
11464a8d9f2eSBram Moolenaar      'exe "echo" # something',
11474a8d9f2eSBram Moolenaar      ], 'E121:')
11484a8d9f2eSBram Moolenaar
11497a092245SBram Moolenaar  CheckDefFailure([
11507a092245SBram Moolenaar      'try# comment',
11517a092245SBram Moolenaar      'echo "yes"',
11527a092245SBram Moolenaar      'catch',
11537a092245SBram Moolenaar      'endtry',
11547a092245SBram Moolenaar      ], 'E488:')
11557a092245SBram Moolenaar  CheckDefFailure([
11567a092245SBram Moolenaar      'try',
11577a092245SBram Moolenaar      'echo "yes"',
11587a092245SBram Moolenaar      'catch# comment',
11597a092245SBram Moolenaar      'endtry',
11607a092245SBram Moolenaar      ], 'E488:')
11617a092245SBram Moolenaar  CheckDefFailure([
11627a092245SBram Moolenaar      'try',
11637a092245SBram Moolenaar      'echo "yes"',
11647a092245SBram Moolenaar      'catch',
11657a092245SBram Moolenaar      'endtry# comment',
11667a092245SBram Moolenaar      ], 'E488:')
11677a092245SBram Moolenaarenddef
11687a092245SBram Moolenaar
1169a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
1170a26b9700SBram Moolenaar  au TabEnter *.vim let g:entered = 1
1171a26b9700SBram Moolenaar  au TabEnter *.x let g:entered = 2
1172a26b9700SBram Moolenaar
1173a26b9700SBram Moolenaar  edit test.vim
1174a26b9700SBram Moolenaar  doautocmd TabEnter #comment
1175a26b9700SBram Moolenaar  assert_equal(1, g:entered)
1176a26b9700SBram Moolenaar
1177a26b9700SBram Moolenaar  doautocmd TabEnter f.x
1178a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1179a26b9700SBram Moolenaar
1180a26b9700SBram Moolenaar  g:entered = 0
1181a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
1182a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1183a26b9700SBram Moolenaar
1184a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
1185a26b9700SBram Moolenaar
1186a26b9700SBram Moolenaar  au! TabEnter
1187a26b9700SBram Moolenaar  unlet g:entered
1188*d72c1bf0SBram Moolenaar
1189*d72c1bf0SBram Moolenaar  CheckScriptSuccess([
1190*d72c1bf0SBram Moolenaar      'vim9script',
1191*d72c1bf0SBram Moolenaar      'let g:var = 123',
1192*d72c1bf0SBram Moolenaar      'let w:var = 777',
1193*d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
1194*d72c1bf0SBram Moolenaar      ])
1195*d72c1bf0SBram Moolenaar
1196*d72c1bf0SBram Moolenaar  CheckScriptFailure([
1197*d72c1bf0SBram Moolenaar      'vim9script',
1198*d72c1bf0SBram Moolenaar      'let g:var = 123',
1199*d72c1bf0SBram Moolenaar      'unlet g:var# comment',
1200*d72c1bf0SBram Moolenaar      ], 'E108:')
1201*d72c1bf0SBram Moolenaar
1202*d72c1bf0SBram Moolenaar  CheckScriptFailure([
1203*d72c1bf0SBram Moolenaar      'let g:var = 123',
1204*d72c1bf0SBram Moolenaar      'unlet g:var # something',
1205*d72c1bf0SBram Moolenaar      ], 'E488:')
1206a26b9700SBram Moolenaarenddef
1207a26b9700SBram Moolenaar
1208585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
1209585fea7bSBram Moolenaardef Test_substitute_cmd()
1210585fea7bSBram Moolenaar  new
1211585fea7bSBram Moolenaar  setline(1, 'something')
1212585fea7bSBram Moolenaar  :substitute(some(other(
1213585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
1214585fea7bSBram Moolenaar  bwipe!
1215585fea7bSBram Moolenaar
1216585fea7bSBram Moolenaar  " also when the context is Vim9 script
1217585fea7bSBram Moolenaar  let lines =<< trim END
1218585fea7bSBram Moolenaar    vim9script
1219585fea7bSBram Moolenaar    new
1220585fea7bSBram Moolenaar    setline(1, 'something')
1221585fea7bSBram Moolenaar    :substitute(some(other(
1222585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
1223585fea7bSBram Moolenaar    bwipe!
1224585fea7bSBram Moolenaar  END
1225585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
1226585fea7bSBram Moolenaar  source Xvim9lines
1227585fea7bSBram Moolenaar
1228585fea7bSBram Moolenaar  delete('Xvim9lines')
1229585fea7bSBram Moolenaarenddef
1230585fea7bSBram Moolenaar
12318a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1232