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
138*d3aac291SBram Moolenaardef Test_assignment_local()
139*d3aac291SBram Moolenaar  " Test in a separated file in order not to the current buffer/window/tab is
140*d3aac291SBram Moolenaar  " changed.
141*d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
142*d3aac291SBram Moolenaar    let b:existing = 'yes'
143*d3aac291SBram Moolenaar    let w:existing = 'yes'
144*d3aac291SBram Moolenaar    let t:existing = 'yes'
145*d3aac291SBram Moolenaar
146*d3aac291SBram Moolenaar    def Test_assignment_local_internal()
147*d3aac291SBram Moolenaar      b:newvar = 'new'
148*d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
149*d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
150*d3aac291SBram Moolenaar      b:existing = 'no'
151*d3aac291SBram Moolenaar      assert_equal('no', b:existing)
152*d3aac291SBram Moolenaar
153*d3aac291SBram Moolenaar      w:newvar = 'new'
154*d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
155*d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
156*d3aac291SBram Moolenaar      w:existing = 'no'
157*d3aac291SBram Moolenaar      assert_equal('no', w:existing)
158*d3aac291SBram Moolenaar
159*d3aac291SBram Moolenaar      t:newvar = 'new'
160*d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
161*d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
162*d3aac291SBram Moolenaar      t:existing = 'no'
163*d3aac291SBram Moolenaar      assert_equal('no', t:existing)
164*d3aac291SBram Moolenaar    enddef
165*d3aac291SBram Moolenaar    call Test_assignment_local_internal()
166*d3aac291SBram Moolenaar  END
167*d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
168*d3aac291SBram Moolenaarenddef
169*d3aac291SBram 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
2168a7d6542SBram Moolenaarfunc 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:')
236*d3aac291SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1079:')
237*d3aac291SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1078:')
238*d3aac291SBram 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:')
244*d3aac291SBram Moolenaar  " TODO: implement this error
245*d3aac291SBram Moolenaar  "call CheckScriptFailure(['vim9script', 'let svar = 123', 'unlet svar'], 'E1050:')
246*d3aac291SBram Moolenaar  "call CheckScriptFailure(['vim9script', 'let svar = 123', 'unlet s:svar'], 'E1050:')
24733fa29cfSBram Moolenaar
2488a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
2498a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
2508a7d6542SBram Moolenaar
2518a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
2528a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
2538a7d6542SBram Moolenaar
2548a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
2558a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
25642a480bfSBram Moolenaar
257d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
25842a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
259cab27678SBram Moolenaar
260cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
261cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
262599c89c8SBram Moolenaarendfunc
263599c89c8SBram Moolenaar
264599c89c8SBram Moolenaarfunc Test_wrong_type()
265599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
266599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
267599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
268599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
269599c89c8SBram Moolenaar
270599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
271599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
27242a480bfSBram Moolenaar
27342a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
27442a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
27542a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
27642a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
27742a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
27842a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
27942a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
28042a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
28142a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
28242a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
28342a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
2848a7d6542SBram Moolenaarendfunc
2858a7d6542SBram Moolenaar
2868a7d6542SBram Moolenaarfunc Test_const()
2878a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
2888a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
2898a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
2909be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
2918a7d6542SBram Moolenaarendfunc
2928a7d6542SBram Moolenaar
2938a7d6542SBram Moolenaardef Test_block()
2948a7d6542SBram Moolenaar  let outer = 1
2958a7d6542SBram Moolenaar  {
2968a7d6542SBram Moolenaar    let inner = 2
2978a7d6542SBram Moolenaar    assert_equal(1, outer)
2988a7d6542SBram Moolenaar    assert_equal(2, inner)
2998a7d6542SBram Moolenaar  }
3008a7d6542SBram Moolenaar  assert_equal(1, outer)
3018a7d6542SBram Moolenaarenddef
3028a7d6542SBram Moolenaar
3038a7d6542SBram Moolenaarfunc Test_block_failure()
3048a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
305585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
306585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
3078a7d6542SBram Moolenaarendfunc
3088a7d6542SBram Moolenaar
309585fea7bSBram Moolenaardef Test_cmd_modifier()
310585fea7bSBram Moolenaar  tab echo '0'
311585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
312585fea7bSBram Moolenaarenddef
313585fea7bSBram Moolenaar
3148a7d6542SBram Moolenaardef Test_try_catch()
3158a7d6542SBram Moolenaar  let l = []
3167a092245SBram Moolenaar  try # comment
3178a7d6542SBram Moolenaar    add(l, '1')
3188a7d6542SBram Moolenaar    throw 'wrong'
3198a7d6542SBram Moolenaar    add(l, '2')
3207a092245SBram Moolenaar  catch # comment
3218a7d6542SBram Moolenaar    add(l, v:exception)
3227a092245SBram Moolenaar  finally # comment
3238a7d6542SBram Moolenaar    add(l, '3')
3247a092245SBram Moolenaar  endtry # comment
3258a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
3268a7d6542SBram Moolenaarenddef
3278a7d6542SBram Moolenaar
328257cc5eeSBram Moolenaardef ThrowFromDef()
329257cc5eeSBram Moolenaar  throw 'getout'
330257cc5eeSBram Moolenaarenddef
331257cc5eeSBram Moolenaar
332257cc5eeSBram Moolenaarfunc CatchInFunc()
333257cc5eeSBram Moolenaar  try
334257cc5eeSBram Moolenaar    call ThrowFromDef()
335257cc5eeSBram Moolenaar  catch
336257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
337257cc5eeSBram Moolenaar  endtry
338257cc5eeSBram Moolenaarendfunc
339257cc5eeSBram Moolenaar
340257cc5eeSBram Moolenaardef CatchInDef()
341257cc5eeSBram Moolenaar  try
342257cc5eeSBram Moolenaar    ThrowFromDef()
343257cc5eeSBram Moolenaar  catch
344257cc5eeSBram Moolenaar    g:thrown_def = v:exception
345257cc5eeSBram Moolenaar  endtry
346257cc5eeSBram Moolenaarenddef
347257cc5eeSBram Moolenaar
348f575adffSBram Moolenaardef ReturnFinally(): string
349f575adffSBram Moolenaar  try
350f575adffSBram Moolenaar    return 'intry'
351f575adffSBram Moolenaar  finally
352f575adffSBram Moolenaar    g:in_finally = 'finally'
353f575adffSBram Moolenaar  endtry
354f575adffSBram Moolenaar  return 'end'
355f575adffSBram Moolenaarenddef
356f575adffSBram Moolenaar
357257cc5eeSBram Moolenaardef Test_try_catch_nested()
358257cc5eeSBram Moolenaar  CatchInFunc()
359257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
360257cc5eeSBram Moolenaar
361257cc5eeSBram Moolenaar  CatchInDef()
362257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
363f575adffSBram Moolenaar
364f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
365f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
366f575adffSBram Moolenaarenddef
367f575adffSBram Moolenaar
368f575adffSBram Moolenaardef Test_try_catch_match()
369f575adffSBram Moolenaar  let seq = 'a'
370f575adffSBram Moolenaar  try
371f575adffSBram Moolenaar    throw 'something'
372f575adffSBram Moolenaar  catch /nothing/
373f575adffSBram Moolenaar    seq ..= 'x'
374f575adffSBram Moolenaar  catch /some/
375f575adffSBram Moolenaar    seq ..= 'b'
376f575adffSBram Moolenaar  catch /asdf/
377f575adffSBram Moolenaar    seq ..= 'x'
378e8c4abbbSBram Moolenaar  catch ?a\?sdf?
379e8c4abbbSBram Moolenaar    seq ..= 'y'
380f575adffSBram Moolenaar  finally
381f575adffSBram Moolenaar    seq ..= 'c'
382f575adffSBram Moolenaar  endtry
383f575adffSBram Moolenaar  assert_equal('abc', seq)
384257cc5eeSBram Moolenaarenddef
385257cc5eeSBram Moolenaar
386e8c4abbbSBram Moolenaardef Test_try_catch_fails()
387e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
388e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
389e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
390585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
391585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
392585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
393585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
394585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
395585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
396585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
397585fea7bSBram Moolenaar
398585fea7bSBram Moolenaar  call CheckDefFailure(['throw'], 'E471:')
399585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
400e8c4abbbSBram Moolenaarenddef
401e8c4abbbSBram Moolenaar
4028a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
4038a7d6542SBram Moolenaar  vim9script
4048a7d6542SBram Moolenaar  let name: string = 'bob'
4058a7d6542SBram Moolenaar  def Concat(arg: string): string
4068a7d6542SBram Moolenaar    return name .. arg
4078a7d6542SBram Moolenaar  enddef
4088a7d6542SBram Moolenaar  let g:result = Concat('bie')
4098a7d6542SBram Moolenaar  let g:localname = name
4108a7d6542SBram Moolenaar
4118a7d6542SBram Moolenaar  export const CONST = 1234
4128a7d6542SBram Moolenaar  export let exported = 9876
4136e587dcbSBram Moolenaar  export let exp_name = 'John'
4148a7d6542SBram Moolenaar  export def Exported(): string
4158a7d6542SBram Moolenaar    return 'Exported'
4168a7d6542SBram Moolenaar  enddef
4178a7d6542SBram MoolenaarEND
4188a7d6542SBram Moolenaar
4195269bd2aSBram Moolenaardef Test_vim9_import_export()
4208a7d6542SBram Moolenaar  let import_script_lines =<< trim END
4218a7d6542SBram Moolenaar    vim9script
4228a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
4238a7d6542SBram Moolenaar    g:imported = exported
4246e587dcbSBram Moolenaar    exported += 3
4256e587dcbSBram Moolenaar    g:imported_added = exported
4268a7d6542SBram Moolenaar    g:imported_func = Exported()
4276e587dcbSBram Moolenaar
4286e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
4296e587dcbSBram Moolenaar    g:imported_name = exp_name
4306e587dcbSBram Moolenaar    exp_name ..= ' Doe'
4316e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
4325381c7a1SBram Moolenaar    g:imported_later = exported
4338a7d6542SBram Moolenaar  END
4348a7d6542SBram Moolenaar
4358a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
4368a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
4378a7d6542SBram Moolenaar
4388a7d6542SBram Moolenaar  source Ximport.vim
4398a7d6542SBram Moolenaar
4408a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
4418a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
4428a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
4436e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
4445381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
4458a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
4466e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
4476e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
4488a7d6542SBram Moolenaar  assert_false(exists('g:name'))
4498a7d6542SBram Moolenaar
4508a7d6542SBram Moolenaar  unlet g:result
4518a7d6542SBram Moolenaar  unlet g:localname
4528a7d6542SBram Moolenaar  unlet g:imported
4536e587dcbSBram Moolenaar  unlet g:imported_added
4545381c7a1SBram Moolenaar  unlet g:imported_later
4558a7d6542SBram Moolenaar  unlet g:imported_func
4566e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
4578a7d6542SBram Moolenaar  delete('Ximport.vim')
458f2d5c240SBram Moolenaar
4595381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
4605381c7a1SBram Moolenaar    vim9script
4615381c7a1SBram Moolenaar    def ImportInDef()
4625381c7a1SBram Moolenaar      import exported from './Xexport.vim'
4635381c7a1SBram Moolenaar      g:imported = exported
4645381c7a1SBram Moolenaar      exported += 7
4655381c7a1SBram Moolenaar      g:imported_added = exported
4665381c7a1SBram Moolenaar    enddef
4675381c7a1SBram Moolenaar    ImportInDef()
4685381c7a1SBram Moolenaar  END
4695381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
4705381c7a1SBram Moolenaar  source Ximport2.vim
4715381c7a1SBram Moolenaar  " TODO: this should be 9879
4725381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
4735381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
4745381c7a1SBram Moolenaar  unlet g:imported
4755381c7a1SBram Moolenaar  unlet g:imported_added
4765381c7a1SBram Moolenaar  delete('Ximport2.vim')
4775381c7a1SBram Moolenaar
478f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
479f2d5c240SBram Moolenaar    vim9script
480f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
481f2d5c240SBram Moolenaar    def UseExport()
482f2d5c240SBram Moolenaar      g:imported = Export.exported
483f2d5c240SBram Moolenaar    enddef
484f2d5c240SBram Moolenaar    UseExport()
485f2d5c240SBram Moolenaar  END
486f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
487f2d5c240SBram Moolenaar  source Ximport.vim
4885381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
489f2d5c240SBram Moolenaar
490599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
491599c89c8SBram Moolenaar    vim9script
492599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
493599c89c8SBram Moolenaar    def Func()
494599c89c8SBram Moolenaar      let dummy = 1
495599c89c8SBram Moolenaar      let imported = Export + dummy
496599c89c8SBram Moolenaar    enddef
497599c89c8SBram Moolenaar  END
498599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
499599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
500599c89c8SBram Moolenaar
501599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
502599c89c8SBram Moolenaar    vim9script
503599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
504599c89c8SBram Moolenaar    def Func()
505599c89c8SBram Moolenaar      let imported = Export . exported
506599c89c8SBram Moolenaar    enddef
507599c89c8SBram Moolenaar  END
508599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
509599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
510599c89c8SBram Moolenaar
511599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
512599c89c8SBram Moolenaar    vim9script
513599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
514599c89c8SBram Moolenaar    def Func()
515599c89c8SBram Moolenaar      let imported = Export.
516599c89c8SBram Moolenaar    enddef
517599c89c8SBram Moolenaar  END
518599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
519599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
520599c89c8SBram Moolenaar
521f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
522f2d5c240SBram Moolenaar    vim9script
523f2d5c240SBram Moolenaar    import * from './Xexport.vim'
524f2d5c240SBram Moolenaar    g:imported = exported
525f2d5c240SBram Moolenaar  END
526f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
527f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
528f2d5c240SBram Moolenaar
529fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
530fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
531fa29c8abSBram Moolenaar    vim9script
532fa29c8abSBram Moolenaar    import name from './Xexport.vim'
533fa29c8abSBram Moolenaar  END
534fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
535fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
536fa29c8abSBram Moolenaar
5375269bd2aSBram Moolenaar  " try to import something that is already defined
5385269bd2aSBram Moolenaar  let import_already_defined =<< trim END
5395269bd2aSBram Moolenaar    vim9script
5405269bd2aSBram Moolenaar    let exported = 'something'
5415269bd2aSBram Moolenaar    import exported from './Xexport.vim'
5425269bd2aSBram Moolenaar  END
5435269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5445269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5455269bd2aSBram Moolenaar
5465269bd2aSBram Moolenaar  " try to import something that is already defined
5475269bd2aSBram Moolenaar  import_already_defined =<< trim END
5485269bd2aSBram Moolenaar    vim9script
5495269bd2aSBram Moolenaar    let exported = 'something'
5505269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
5515269bd2aSBram Moolenaar  END
5525269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5535269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5545269bd2aSBram Moolenaar
5555269bd2aSBram Moolenaar  " try to import something that is already defined
5565269bd2aSBram Moolenaar  import_already_defined =<< trim END
5575269bd2aSBram Moolenaar    vim9script
5585269bd2aSBram Moolenaar    let exported = 'something'
5595269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
5605269bd2aSBram Moolenaar  END
5615269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5625269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5635269bd2aSBram Moolenaar
564fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
565fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
566fa29c8abSBram Moolenaar    vim9script
567fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
568fa29c8abSBram Moolenaar  END
569fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
570fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
571fa29c8abSBram Moolenaar
572fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
573fa29c8abSBram Moolenaar    vim9script
574fa29c8abSBram Moolenaar    import name './Xexport.vim'
575fa29c8abSBram Moolenaar  END
576fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
577fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
578fa29c8abSBram Moolenaar
579fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
580fa29c8abSBram Moolenaar    vim9script
581fa29c8abSBram Moolenaar    import name from Xexport.vim
582fa29c8abSBram Moolenaar  END
583fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
584fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
585fa29c8abSBram Moolenaar
586fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
587fa29c8abSBram Moolenaar    vim9script
588fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
589fa29c8abSBram Moolenaar  END
590fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
591fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
592fa29c8abSBram Moolenaar
593fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
594fa29c8abSBram Moolenaar    vim9script
595fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
596fa29c8abSBram Moolenaar  END
5975269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
5985269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
599fa29c8abSBram Moolenaar
600f2d5c240SBram Moolenaar  delete('Ximport.vim')
6015269bd2aSBram Moolenaar  delete('Ximport3.vim')
6028a7d6542SBram Moolenaar  delete('Xexport.vim')
6038a7d6542SBram Moolenaar
604750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
605750802b5SBram Moolenaar  set cpo&vi
606750802b5SBram Moolenaar  let cpo_before = &cpo
607750802b5SBram Moolenaar  let lines =<< trim END
608750802b5SBram Moolenaar    vim9script
609750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
610750802b5SBram Moolenaar  END
611750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
612750802b5SBram Moolenaar  source Xvim9_script
613750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
614750802b5SBram Moolenaar  set cpo&vim
615750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
616750802b5SBram Moolenaar  delete('Xvim9_script')
617750802b5SBram Moolenaarenddef
618750802b5SBram Moolenaar
619750802b5SBram Moolenaardef Test_vim9script_fails()
6208a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
6218a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
622750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
623f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
624750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
625750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
626750802b5SBram Moolenaar
627750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
628a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
6298a7d6542SBram Moolenaarenddef
6308a7d6542SBram Moolenaar
6318a7d6542SBram Moolenaardef Test_vim9script_reload()
6328a7d6542SBram Moolenaar  let lines =<< trim END
6338a7d6542SBram Moolenaar    vim9script
6348a7d6542SBram Moolenaar    const var = ''
6358a7d6542SBram Moolenaar    let valone = 1234
6368a7d6542SBram Moolenaar    def MyFunc(arg: string)
6378a7d6542SBram Moolenaar       valone = 5678
6388a7d6542SBram Moolenaar    enddef
6398a7d6542SBram Moolenaar  END
6408a7d6542SBram Moolenaar  let morelines =<< trim END
6418a7d6542SBram Moolenaar    let valtwo = 222
6428a7d6542SBram Moolenaar    export def GetValtwo(): number
6438a7d6542SBram Moolenaar      return valtwo
6448a7d6542SBram Moolenaar    enddef
6458a7d6542SBram Moolenaar  END
646675f716eSBram Moolenaar  writefile(lines + morelines,
647675f716eSBram Moolenaar            'Xreload.vim')
6488a7d6542SBram Moolenaar  source Xreload.vim
6498a7d6542SBram Moolenaar  source Xreload.vim
6508a7d6542SBram Moolenaar  source Xreload.vim
6518a7d6542SBram Moolenaar
6528a7d6542SBram Moolenaar  let testlines =<< trim END
6538a7d6542SBram Moolenaar    vim9script
6548a7d6542SBram Moolenaar    def TheFunc()
6558a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
6568a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
6578a7d6542SBram Moolenaar    enddef
6588a7d6542SBram Moolenaar    TheFunc()
6598a7d6542SBram Moolenaar  END
6608a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
6618a7d6542SBram Moolenaar  source Ximport.vim
6628a7d6542SBram Moolenaar
6638a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
6648a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
6658a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
6668a7d6542SBram Moolenaar  source Xreload.vim
6678a7d6542SBram Moolenaar  source Ximport.vim
6688a7d6542SBram Moolenaar
6698a7d6542SBram Moolenaar  " cannot declare a var twice
6708a7d6542SBram Moolenaar  lines =<< trim END
6718a7d6542SBram Moolenaar    vim9script
6728a7d6542SBram Moolenaar    let valone = 1234
6738a7d6542SBram Moolenaar    let valone = 5678
6748a7d6542SBram Moolenaar  END
6758a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
6768a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
6778a7d6542SBram Moolenaar
6788a7d6542SBram Moolenaar  delete('Xreload.vim')
6798a7d6542SBram Moolenaar  delete('Ximport.vim')
6808a7d6542SBram Moolenaarenddef
6818a7d6542SBram Moolenaar
6828a7d6542SBram Moolenaardef Test_import_absolute()
6838a7d6542SBram Moolenaar  let import_lines = [
684e6085c53SBram Moolenaar        'vim9script',
685e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
686e6085c53SBram Moolenaar        'def UseExported()',
687e6085c53SBram Moolenaar        '  g:imported_abs = exported',
688e6085c53SBram Moolenaar        '  exported = 8888',
689e6085c53SBram Moolenaar        '  g:imported_after = exported',
690e6085c53SBram Moolenaar        'enddef',
691e6085c53SBram Moolenaar        'UseExported()',
692e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
693e6085c53SBram Moolenaar        ]
6948a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
6958a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
6968a7d6542SBram Moolenaar
6978a7d6542SBram Moolenaar  source Ximport_abs.vim
6988a7d6542SBram Moolenaar
6998a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
7004e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
701675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
702675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
703675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
704675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
705675f716eSBram Moolenaar          'exported = 8888.*' ..
706675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
707675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
708675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
709675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
710e6085c53SBram Moolenaar        g:import_disassembled)
7118a7d6542SBram Moolenaar  unlet g:imported_abs
7124e12a5dfSBram Moolenaar  unlet g:import_disassembled
7138a7d6542SBram Moolenaar
7148a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
7158a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
7168a7d6542SBram Moolenaarenddef
7178a7d6542SBram Moolenaar
7188a7d6542SBram Moolenaardef Test_import_rtp()
7198a7d6542SBram Moolenaar  let import_lines = [
720e6085c53SBram Moolenaar        'vim9script',
721e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
722e6085c53SBram Moolenaar        'g:imported_rtp = exported',
723e6085c53SBram Moolenaar        ]
7248a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
7258a7d6542SBram Moolenaar  mkdir('import')
7268a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
7278a7d6542SBram Moolenaar
7288a7d6542SBram Moolenaar  let save_rtp = &rtp
7298a7d6542SBram Moolenaar  &rtp = getcwd()
7308a7d6542SBram Moolenaar  source Ximport_rtp.vim
7318a7d6542SBram Moolenaar  &rtp = save_rtp
7328a7d6542SBram Moolenaar
7338a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
7348a7d6542SBram Moolenaar  unlet g:imported_rtp
7358a7d6542SBram Moolenaar
7368a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
7378a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
7388a7d6542SBram Moolenaar  delete('import', 'd')
7398a7d6542SBram Moolenaarenddef
7408a7d6542SBram Moolenaar
7418a7d6542SBram Moolenaardef Test_fixed_size_list()
7428a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
7438a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
7448a7d6542SBram Moolenaar  l->remove(0)
7458a7d6542SBram Moolenaar  l->add(5)
7468a7d6542SBram Moolenaar  l->insert(99, 1)
7470f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
7488a7d6542SBram Moolenaarenddef
7498a7d6542SBram Moolenaar
750158906cfSBram Moolenaardef IfElse(what: number): string
751158906cfSBram Moolenaar  let res = ''
752158906cfSBram Moolenaar  if what == 1
753158906cfSBram Moolenaar    res = "one"
754158906cfSBram Moolenaar  elseif what == 2
755158906cfSBram Moolenaar    res = "two"
756a259d8d3SBram Moolenaar  else
757158906cfSBram Moolenaar    res = "three"
758a259d8d3SBram Moolenaar  endif
759158906cfSBram Moolenaar  return res
760a259d8d3SBram Moolenaarenddef
761a259d8d3SBram Moolenaar
762158906cfSBram Moolenaardef Test_if_elseif_else()
763158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
764158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
765158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
7660f18b6d1SBram Moolenaarenddef
7670f18b6d1SBram Moolenaar
768e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
769e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
770e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
771e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
772e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
773585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
774e8c4abbbSBram Moolenaarenddef
775e8c4abbbSBram Moolenaar
7766d69bf60SBram Moolenaarlet g:bool_true = v:true
7776d69bf60SBram Moolenaarlet g:bool_false = v:false
7786d69bf60SBram Moolenaar
7796d69bf60SBram Moolenaardef Test_if_const_expr()
7806d69bf60SBram Moolenaar  let res = false
7816d69bf60SBram Moolenaar  if true ? true : false
7826d69bf60SBram Moolenaar    res = true
7836d69bf60SBram Moolenaar  endif
7846d69bf60SBram Moolenaar  assert_equal(true, res)
7856d69bf60SBram Moolenaar
786585fea7bSBram Moolenaar  g:glob = 2
787585fea7bSBram Moolenaar  if false
788585fea7bSBram Moolenaar    execute('let g:glob = 3')
789585fea7bSBram Moolenaar  endif
790585fea7bSBram Moolenaar  assert_equal(2, g:glob)
791585fea7bSBram Moolenaar  if true
792585fea7bSBram Moolenaar    execute('let g:glob = 3')
793585fea7bSBram Moolenaar  endif
794585fea7bSBram Moolenaar  assert_equal(3, g:glob)
795585fea7bSBram Moolenaar
7966d69bf60SBram Moolenaar  res = false
7976d69bf60SBram Moolenaar  if g:bool_true ? true : false
7986d69bf60SBram Moolenaar    res = true
7996d69bf60SBram Moolenaar  endif
8006d69bf60SBram Moolenaar  assert_equal(true, res)
8016d69bf60SBram Moolenaar
8026d69bf60SBram Moolenaar  res = false
8036d69bf60SBram Moolenaar  if true ? g:bool_true : false
8046d69bf60SBram Moolenaar    res = true
8056d69bf60SBram Moolenaar  endif
8066d69bf60SBram Moolenaar  assert_equal(true, res)
8076d69bf60SBram Moolenaar
8086d69bf60SBram Moolenaar  res = false
8096d69bf60SBram Moolenaar  if true ? true : g:bool_false
8106d69bf60SBram Moolenaar    res = true
8116d69bf60SBram Moolenaar  endif
8126d69bf60SBram Moolenaar  assert_equal(true, res)
8136d69bf60SBram Moolenaar
8146d69bf60SBram Moolenaar  res = false
8156d69bf60SBram Moolenaar  if true ? false : true
8166d69bf60SBram Moolenaar    res = true
8176d69bf60SBram Moolenaar  endif
8186d69bf60SBram Moolenaar  assert_equal(false, res)
8196d69bf60SBram Moolenaar
8206d69bf60SBram Moolenaar  res = false
8216d69bf60SBram Moolenaar  if false ? false : true
8226d69bf60SBram Moolenaar    res = true
8236d69bf60SBram Moolenaar  endif
8246d69bf60SBram Moolenaar  assert_equal(true, res)
8256d69bf60SBram Moolenaar
8266d69bf60SBram Moolenaar  res = false
8276d69bf60SBram Moolenaar  if false ? true : false
8286d69bf60SBram Moolenaar    res = true
8296d69bf60SBram Moolenaar  endif
8306d69bf60SBram Moolenaar  assert_equal(false, res)
8316d69bf60SBram Moolenaar
8326d69bf60SBram Moolenaar  res = false
833e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
834e8c4abbbSBram Moolenaar    res = true
835e8c4abbbSBram Moolenaar  endif
836e8c4abbbSBram Moolenaar  assert_equal(false, res)
837e8c4abbbSBram Moolenaar
838e8c4abbbSBram Moolenaar  res = false
8396d69bf60SBram Moolenaar  if true && true
8406d69bf60SBram Moolenaar    res = true
8416d69bf60SBram Moolenaar  endif
8426d69bf60SBram Moolenaar  assert_equal(true, res)
8436d69bf60SBram Moolenaar
8446d69bf60SBram Moolenaar  res = false
8456d69bf60SBram Moolenaar  if true && false
8466d69bf60SBram Moolenaar    res = true
8476d69bf60SBram Moolenaar  endif
8486d69bf60SBram Moolenaar  assert_equal(false, res)
8496d69bf60SBram Moolenaar
8506d69bf60SBram Moolenaar  res = false
8516d69bf60SBram Moolenaar  if g:bool_true && false
8526d69bf60SBram Moolenaar    res = true
8536d69bf60SBram Moolenaar  endif
8546d69bf60SBram Moolenaar  assert_equal(false, res)
8556d69bf60SBram Moolenaar
8566d69bf60SBram Moolenaar  res = false
8576d69bf60SBram Moolenaar  if true && g:bool_false
8586d69bf60SBram Moolenaar    res = true
8596d69bf60SBram Moolenaar  endif
8606d69bf60SBram Moolenaar  assert_equal(false, res)
8616d69bf60SBram Moolenaar
8626d69bf60SBram Moolenaar  res = false
8636d69bf60SBram Moolenaar  if false && false
8646d69bf60SBram Moolenaar    res = true
8656d69bf60SBram Moolenaar  endif
8666d69bf60SBram Moolenaar  assert_equal(false, res)
8676d69bf60SBram Moolenaar
8686d69bf60SBram Moolenaar  res = false
8696d69bf60SBram Moolenaar  if true || false
8706d69bf60SBram Moolenaar    res = true
8716d69bf60SBram Moolenaar  endif
8726d69bf60SBram Moolenaar  assert_equal(true, res)
8736d69bf60SBram Moolenaar
8746d69bf60SBram Moolenaar  res = false
8756d69bf60SBram Moolenaar  if g:bool_true || false
8766d69bf60SBram Moolenaar    res = true
8776d69bf60SBram Moolenaar  endif
8786d69bf60SBram Moolenaar  assert_equal(true, res)
8796d69bf60SBram Moolenaar
8806d69bf60SBram Moolenaar  res = false
8816d69bf60SBram Moolenaar  if true || g:bool_false
8826d69bf60SBram Moolenaar    res = true
8836d69bf60SBram Moolenaar  endif
8846d69bf60SBram Moolenaar  assert_equal(true, res)
8856d69bf60SBram Moolenaar
8866d69bf60SBram Moolenaar  res = false
8876d69bf60SBram Moolenaar  if false || false
8886d69bf60SBram Moolenaar    res = true
8896d69bf60SBram Moolenaar  endif
8906d69bf60SBram Moolenaar  assert_equal(false, res)
89180c34ca3SBram Moolenaarenddef
8926d69bf60SBram Moolenaar
89380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
89480c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
89580c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
896e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
897e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
8986d69bf60SBram Moolenaarenddef
8996d69bf60SBram Moolenaar
900ad39c094SBram Moolenaardef Test_execute_cmd()
901ad39c094SBram Moolenaar  new
902ad39c094SBram Moolenaar  setline(1, 'default')
903ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
904ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
905ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
906ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
907ad39c094SBram Moolenaar  execute cmd1 cmd2
908ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
909ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
910ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
911ad39c094SBram Moolenaar  let cmd_first = 'call '
912ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
913ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
914ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
915ad39c094SBram Moolenaar  bwipe!
916585fea7bSBram Moolenaar
917585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
918ad39c094SBram Moolenaarenddef
919ad39c094SBram Moolenaar
920ad39c094SBram Moolenaardef Test_echo_cmd()
921585fea7bSBram Moolenaar  echo 'some'
922585fea7bSBram Moolenaar  echon 'thing'
923ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
924ad39c094SBram Moolenaar
925ad39c094SBram Moolenaar  let str1 = 'some'
926ad39c094SBram Moolenaar  let str2 = 'more'
927ad39c094SBram Moolenaar  echo str1 str2
928ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
929ad39c094SBram Moolenaarenddef
930ad39c094SBram Moolenaar
93141fe0617SBram Moolenaardef Test_for_outside_of_function()
93241fe0617SBram Moolenaar  let lines =<< trim END
93341fe0617SBram Moolenaar    vim9script
93441fe0617SBram Moolenaar    new
93541fe0617SBram Moolenaar    for var in range(0, 3)
93641fe0617SBram Moolenaar      append(line('$'), var)
93741fe0617SBram Moolenaar    endfor
93841fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
93941fe0617SBram Moolenaar    bwipe!
94041fe0617SBram Moolenaar  END
94141fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
94241fe0617SBram Moolenaar  source Xvim9for.vim
94341fe0617SBram Moolenaar  delete('Xvim9for.vim')
94441fe0617SBram Moolenaarenddef
9458a7d6542SBram Moolenaar
946e8c4abbbSBram Moolenaardef Test_for_loop()
947e8c4abbbSBram Moolenaar  let result = ''
948e8c4abbbSBram Moolenaar  for cnt in range(7)
949e8c4abbbSBram Moolenaar    if cnt == 4
950e8c4abbbSBram Moolenaar      break
951e8c4abbbSBram Moolenaar    endif
952e8c4abbbSBram Moolenaar    if cnt == 2
953e8c4abbbSBram Moolenaar      continue
954e8c4abbbSBram Moolenaar    endif
955e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
956e8c4abbbSBram Moolenaar  endfor
957e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
958e8c4abbbSBram Moolenaarenddef
959e8c4abbbSBram Moolenaar
960e8c4abbbSBram Moolenaardef Test_for_loop_fails()
961675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
962675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
963675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
9646e949784SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef'], 'E1006:')
965675f716eSBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1024:')
966675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
967675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
968675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
969e8c4abbbSBram Moolenaarenddef
970e8c4abbbSBram Moolenaar
971d0df1aacSBram Moolenaardef Test_while_loop()
972d0df1aacSBram Moolenaar  let result = ''
973d0df1aacSBram Moolenaar  let cnt = 0
974d0df1aacSBram Moolenaar  while cnt < 555
975d0df1aacSBram Moolenaar    if cnt == 3
976d0df1aacSBram Moolenaar      break
977d0df1aacSBram Moolenaar    endif
978d0df1aacSBram Moolenaar    cnt += 1
979d0df1aacSBram Moolenaar    if cnt == 2
980d0df1aacSBram Moolenaar      continue
981d0df1aacSBram Moolenaar    endif
982d0df1aacSBram Moolenaar    result ..= cnt .. '_'
983d0df1aacSBram Moolenaar  endwhile
984d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
985d0df1aacSBram Moolenaarenddef
986d0df1aacSBram Moolenaar
987e8c4abbbSBram Moolenaardef Test_while_loop_fails()
988675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
989675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
990675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
991675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
992675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
993675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
994675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
995bd5da371SBram Moolenaarenddef
996bd5da371SBram Moolenaar
9979645e2d9SBram Moolenaardef Test_interrupt_loop()
99897acfc78SBram Moolenaar  let caught = false
9999645e2d9SBram Moolenaar  let x = 0
100097acfc78SBram Moolenaar  try
10019645e2d9SBram Moolenaar    while 1
10029645e2d9SBram Moolenaar      x += 1
10039645e2d9SBram Moolenaar      if x == 100
10049645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
10059645e2d9SBram Moolenaar      endif
10069645e2d9SBram Moolenaar    endwhile
100797acfc78SBram Moolenaar  catch
100897acfc78SBram Moolenaar    caught = true
100997acfc78SBram Moolenaar    assert_equal(100, x)
101097acfc78SBram Moolenaar  endtry
101197acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
10129645e2d9SBram Moolenaarenddef
101320431c9dSBram Moolenaar
10144fdae999SBram Moolenaardef Test_automatic_line_continuation()
10154fdae999SBram Moolenaar  let mylist = [
10164fdae999SBram Moolenaar      'one',
10174fdae999SBram Moolenaar      'two',
10184fdae999SBram Moolenaar      'three',
10194fdae999SBram Moolenaar      ] " comment
10204fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
10214fdae999SBram Moolenaar
10224fdae999SBram Moolenaar  let mydict = {
10234fdae999SBram Moolenaar      'one': 1,
10244fdae999SBram Moolenaar      'two': 2,
10254fdae999SBram Moolenaar      'three':
10264fdae999SBram Moolenaar          3,
10274fdae999SBram Moolenaar      } " comment
10284fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
10294fdae999SBram Moolenaar  mydict = #{
10302c330432SBram Moolenaar      one: 1,  # comment
10312c330432SBram Moolenaar      two:     # comment
10322c330432SBram Moolenaar           2,  # comment
10332c330432SBram Moolenaar      three: 3 # comment
10342c330432SBram Moolenaar      }
10352c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
10362c330432SBram Moolenaar  mydict = #{
10372c330432SBram Moolenaar      one: 1,
10384fdae999SBram Moolenaar      two:
10394fdae999SBram Moolenaar           2,
10402c330432SBram Moolenaar      three: 3
10414fdae999SBram Moolenaar      }
10424fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1043e6085c53SBram Moolenaar
1044e6085c53SBram Moolenaar  assert_equal(
1045e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1046e6085c53SBram Moolenaar        split('one two three')
1047e6085c53SBram Moolenaar        )
10484fdae999SBram Moolenaarenddef
10494fdae999SBram Moolenaar
10507a092245SBram Moolenaardef Test_vim9_comment()
10517a092245SBram Moolenaar  CheckScriptSuccess([
10527a092245SBram Moolenaar      'vim9script',
10537a092245SBram Moolenaar      '# something',
10547a092245SBram Moolenaar      ])
10557a092245SBram Moolenaar  CheckScriptFailure([
10567a092245SBram Moolenaar      'vim9script',
10577a092245SBram Moolenaar      ':# something',
10587a092245SBram Moolenaar      ], 'E488:')
10597a092245SBram Moolenaar  CheckScriptFailure([
10607a092245SBram Moolenaar      '# something',
10617a092245SBram Moolenaar      ], 'E488:')
10627a092245SBram Moolenaar  CheckScriptFailure([
10637a092245SBram Moolenaar      ':# something',
10647a092245SBram Moolenaar      ], 'E488:')
10657a092245SBram Moolenaar
10664a8d9f2eSBram Moolenaar  { # block start
10674a8d9f2eSBram Moolenaar  } # block end
10684a8d9f2eSBram Moolenaar  CheckDefFailure([
10694a8d9f2eSBram Moolenaar      '{# comment',
10704a8d9f2eSBram Moolenaar      ], 'E488:')
10714a8d9f2eSBram Moolenaar  CheckDefFailure([
10724a8d9f2eSBram Moolenaar      '{',
10734a8d9f2eSBram Moolenaar      '}# comment',
10744a8d9f2eSBram Moolenaar      ], 'E488:')
10754a8d9f2eSBram Moolenaar
10764a8d9f2eSBram Moolenaar  echo "yes" # comment
10774a8d9f2eSBram Moolenaar  CheckDefFailure([
10784a8d9f2eSBram Moolenaar      'echo "yes"# comment',
10794a8d9f2eSBram Moolenaar      ], 'E488:')
10807a092245SBram Moolenaar  CheckScriptSuccess([
10817a092245SBram Moolenaar      'vim9script',
10827a092245SBram Moolenaar      'echo "yes" # something',
10837a092245SBram Moolenaar      ])
10847a092245SBram Moolenaar  CheckScriptFailure([
10857a092245SBram Moolenaar      'vim9script',
10867a092245SBram Moolenaar      'echo "yes"# something',
10877a092245SBram Moolenaar      ], 'E121:')
10887a092245SBram Moolenaar  CheckScriptFailure([
10897a092245SBram Moolenaar      'vim9script',
10907a092245SBram Moolenaar      'echo# something',
10917a092245SBram Moolenaar      ], 'E121:')
10927a092245SBram Moolenaar  CheckScriptFailure([
10937a092245SBram Moolenaar      'echo "yes" # something',
10947a092245SBram Moolenaar      ], 'E121:')
10957a092245SBram Moolenaar
10964a8d9f2eSBram Moolenaar  exe "echo" # comment
10974a8d9f2eSBram Moolenaar  CheckDefFailure([
10984a8d9f2eSBram Moolenaar      'exe "echo"# comment',
10994a8d9f2eSBram Moolenaar      ], 'E488:')
11004a8d9f2eSBram Moolenaar  CheckScriptSuccess([
11014a8d9f2eSBram Moolenaar      'vim9script',
11024a8d9f2eSBram Moolenaar      'exe "echo" # something',
11034a8d9f2eSBram Moolenaar      ])
11044a8d9f2eSBram Moolenaar  CheckScriptFailure([
11054a8d9f2eSBram Moolenaar      'vim9script',
11064a8d9f2eSBram Moolenaar      'exe "echo"# something',
11074a8d9f2eSBram Moolenaar      ], 'E121:')
11084a8d9f2eSBram Moolenaar  CheckDefFailure([
11094a8d9f2eSBram Moolenaar      'exe # comment',
11104a8d9f2eSBram Moolenaar      ], 'E1015:')
11114a8d9f2eSBram Moolenaar  CheckScriptFailure([
11124a8d9f2eSBram Moolenaar      'vim9script',
11134a8d9f2eSBram Moolenaar      'exe# something',
11144a8d9f2eSBram Moolenaar      ], 'E121:')
11154a8d9f2eSBram Moolenaar  CheckScriptFailure([
11164a8d9f2eSBram Moolenaar      'exe "echo" # something',
11174a8d9f2eSBram Moolenaar      ], 'E121:')
11184a8d9f2eSBram Moolenaar
11197a092245SBram Moolenaar  CheckDefFailure([
11207a092245SBram Moolenaar      'try# comment',
11217a092245SBram Moolenaar      'echo "yes"',
11227a092245SBram Moolenaar      'catch',
11237a092245SBram Moolenaar      'endtry',
11247a092245SBram Moolenaar      ], 'E488:')
11257a092245SBram Moolenaar  CheckDefFailure([
11267a092245SBram Moolenaar      'try',
11277a092245SBram Moolenaar      'echo "yes"',
11287a092245SBram Moolenaar      'catch# comment',
11297a092245SBram Moolenaar      'endtry',
11307a092245SBram Moolenaar      ], 'E488:')
11317a092245SBram Moolenaar  CheckDefFailure([
11327a092245SBram Moolenaar      'try',
11337a092245SBram Moolenaar      'echo "yes"',
11347a092245SBram Moolenaar      'catch',
11357a092245SBram Moolenaar      'endtry# comment',
11367a092245SBram Moolenaar      ], 'E488:')
11377a092245SBram Moolenaarenddef
11387a092245SBram Moolenaar
1139a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
1140a26b9700SBram Moolenaar  au TabEnter *.vim let g:entered = 1
1141a26b9700SBram Moolenaar  au TabEnter *.x let g:entered = 2
1142a26b9700SBram Moolenaar
1143a26b9700SBram Moolenaar  edit test.vim
1144a26b9700SBram Moolenaar  doautocmd TabEnter #comment
1145a26b9700SBram Moolenaar  assert_equal(1, g:entered)
1146a26b9700SBram Moolenaar
1147a26b9700SBram Moolenaar  doautocmd TabEnter f.x
1148a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1149a26b9700SBram Moolenaar
1150a26b9700SBram Moolenaar  g:entered = 0
1151a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
1152a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1153a26b9700SBram Moolenaar
1154a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
1155a26b9700SBram Moolenaar
1156a26b9700SBram Moolenaar  au! TabEnter
1157a26b9700SBram Moolenaar  unlet g:entered
1158a26b9700SBram Moolenaarenddef
1159a26b9700SBram Moolenaar
1160585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
1161585fea7bSBram Moolenaardef Test_substitute_cmd()
1162585fea7bSBram Moolenaar  new
1163585fea7bSBram Moolenaar  setline(1, 'something')
1164585fea7bSBram Moolenaar  :substitute(some(other(
1165585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
1166585fea7bSBram Moolenaar  bwipe!
1167585fea7bSBram Moolenaar
1168585fea7bSBram Moolenaar  " also when the context is Vim9 script
1169585fea7bSBram Moolenaar  let lines =<< trim END
1170585fea7bSBram Moolenaar    vim9script
1171585fea7bSBram Moolenaar    new
1172585fea7bSBram Moolenaar    setline(1, 'something')
1173585fea7bSBram Moolenaar    :substitute(some(other(
1174585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
1175585fea7bSBram Moolenaar    bwipe!
1176585fea7bSBram Moolenaar  END
1177585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
1178585fea7bSBram Moolenaar  source Xvim9lines
1179585fea7bSBram Moolenaar
1180585fea7bSBram Moolenaar  delete('Xvim9lines')
1181585fea7bSBram Moolenaarenddef
1182585fea7bSBram Moolenaar
11838a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1184