18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4ad39c094SBram Moolenaarsource view_util.vim
5cfe435d7SBram Moolenaarsource vim9.vim
68a7d6542SBram Moolenaar
78a7d6542SBram Moolenaardef Test_syntax()
88a7d6542SBram Moolenaar  let var = 234
98a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
108a7d6542SBram Moolenaarenddef
118a7d6542SBram Moolenaar
126e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
136e587dcbSBram Moolenaarlet s:addToMe = 111
14401d9ffbSBram Moolenaarlet g:existing = 'yes'
15a8c17704SBram Moolenaarlet g:inc_counter = 1
16a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
17a6e67e4fSBram Moolenaarlet g:alist = [7]
18a6e67e4fSBram Moolenaarlet g:astring = 'text'
196e587dcbSBram Moolenaar
208a7d6542SBram Moolenaardef Test_assignment()
218a7d6542SBram Moolenaar  let bool1: bool = true
228a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
238a7d6542SBram Moolenaar  let bool2: bool = false
248a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
258a7d6542SBram Moolenaar
26f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string'], 'E1069:')
27f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string = "x"'], 'E1069:')
281cc2a94fSBram Moolenaar  call CheckDefFailure(['let a:string = "x"'], 'E1069:')
29f93c7feaSBram Moolenaar
309be61bbbSBram Moolenaar  let a: number = 6
319be61bbbSBram Moolenaar  assert_equal(6, a)
329be61bbbSBram Moolenaar
3342a480bfSBram Moolenaar  if has('channel')
3442a480bfSBram Moolenaar    let chan1: channel
35fbdd08edSBram Moolenaar    let job1: job
36f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
3742a480bfSBram Moolenaar  endif
38fbdd08edSBram Moolenaar  if has('float')
39fbdd08edSBram Moolenaar    let float1: float = 3.4
40fbdd08edSBram Moolenaar  endif
415deeb3f1SBram Moolenaar  let Funky1: func
425deeb3f1SBram Moolenaar  let Funky2: func = function('len')
434c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
4442a480bfSBram Moolenaar
45401d9ffbSBram Moolenaar  g:newvar = 'new'
46401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
47401d9ffbSBram Moolenaar
48401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
49401d9ffbSBram Moolenaar  g:existing = 'no'
50401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
51401d9ffbSBram Moolenaar
52b283a8a6SBram Moolenaar  v:char = 'abc'
536e587dcbSBram Moolenaar  assert_equal('abc', v:char)
54b283a8a6SBram Moolenaar
55b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
566e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
57b283a8a6SBram Moolenaar  $ENVVAR = ''
586e587dcbSBram Moolenaar
59fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
60fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
61fd1823e0SBram Moolenaar  s:addToMe += 222
62fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
630bbf722aSBram Moolenaar  s:newVar = 'new'
640bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
65a8c17704SBram Moolenaar
66a8c17704SBram Moolenaar  set ts=7
67a8c17704SBram Moolenaar  &ts += 1
68a8c17704SBram Moolenaar  assert_equal(8, &ts)
6980c34ca3SBram Moolenaar  &ts -= 3
7080c34ca3SBram Moolenaar  assert_equal(5, &ts)
7180c34ca3SBram Moolenaar  &ts *= 2
7280c34ca3SBram Moolenaar  assert_equal(10, &ts)
7380c34ca3SBram Moolenaar  &ts /= 3
7480c34ca3SBram Moolenaar  assert_equal(3, &ts)
7580c34ca3SBram Moolenaar  set ts=10
7680c34ca3SBram Moolenaar  &ts %= 4
7780c34ca3SBram Moolenaar  assert_equal(2, &ts)
78a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
79a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
80a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = [7]'], 'E1013:')
81a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
82a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = "xx"'], 'E1013:')
83a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
84a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
85a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
86cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
87585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
8880c34ca3SBram Moolenaar  &ts = 8
89a8c17704SBram Moolenaar
90a8c17704SBram Moolenaar  g:inc_counter += 1
91a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
92a8c17704SBram Moolenaar
93a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
94a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
95a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
96a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
97a8c17704SBram Moolenaar
98a8c17704SBram Moolenaar  @a = 'areg'
99a8c17704SBram Moolenaar  @a ..= 'add'
100a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
101a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
102a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
103e69f6d04SBram Moolenaar
104e69f6d04SBram Moolenaar  v:errmsg = 'none'
105e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
106e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
107e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
108e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
1095deeb3f1SBram Moolenaarenddef
1105deeb3f1SBram Moolenaar
11184370087SBram Moolenaardef Test_assignment_list()
11284370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
11384370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
11484370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
11584370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
11684370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
11784370087SBram Moolenaar
11884370087SBram Moolenaar  let listS: list<string> = []
11984370087SBram Moolenaar  let listN: list<number> = []
12084370087SBram Moolenaar
12184370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
12284370087SBram Moolenaar  list2[-1] = 99
12384370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
12484370087SBram Moolenaar  list2[-2] = 88
12584370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
12684370087SBram Moolenaar  list2[-3] = 77
12784370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
12884370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
12984370087SBram Moolenaar
13084370087SBram Moolenaar  # type becomes list<any>
13184370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
13284370087SBram Moolenaarenddef
13384370087SBram Moolenaar
13484370087SBram Moolenaardef Test_assignment_dict()
13584370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
13684370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
13784370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
13884370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
139*74fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
14084370087SBram Moolenaar
14184370087SBram Moolenaar  call CheckDefExecFailure(['let dd = {}', 'dd[""] = 6'], 'E713:')
14284370087SBram Moolenaar
14384370087SBram Moolenaar  # type becomes dict<any>
14484370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
14584370087SBram Moolenaarenddef
14684370087SBram Moolenaar
147d3aac291SBram Moolenaardef Test_assignment_local()
148d3aac291SBram Moolenaar  " Test in a separated file in order not to the current buffer/window/tab is
149d3aac291SBram Moolenaar  " changed.
150d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
151d3aac291SBram Moolenaar    let b:existing = 'yes'
152d3aac291SBram Moolenaar    let w:existing = 'yes'
153d3aac291SBram Moolenaar    let t:existing = 'yes'
154d3aac291SBram Moolenaar
155d3aac291SBram Moolenaar    def Test_assignment_local_internal()
156d3aac291SBram Moolenaar      b:newvar = 'new'
157d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
158d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
159d3aac291SBram Moolenaar      b:existing = 'no'
160d3aac291SBram Moolenaar      assert_equal('no', b:existing)
161396f3138SBram Moolenaar      b:existing ..= 'NO'
162396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
163d3aac291SBram Moolenaar
164d3aac291SBram Moolenaar      w:newvar = 'new'
165d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
166d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
167d3aac291SBram Moolenaar      w:existing = 'no'
168d3aac291SBram Moolenaar      assert_equal('no', w:existing)
169396f3138SBram Moolenaar      w:existing ..= 'NO'
170396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
171d3aac291SBram Moolenaar
172d3aac291SBram Moolenaar      t:newvar = 'new'
173d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
174d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
175d3aac291SBram Moolenaar      t:existing = 'no'
176d3aac291SBram Moolenaar      assert_equal('no', t:existing)
177396f3138SBram Moolenaar      t:existing ..= 'NO'
178396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
179d3aac291SBram Moolenaar    enddef
180d3aac291SBram Moolenaar    call Test_assignment_local_internal()
181d3aac291SBram Moolenaar  END
182d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
183d3aac291SBram Moolenaarenddef
184d3aac291SBram Moolenaar
1855deeb3f1SBram Moolenaardef Test_assignment_default()
186e69f6d04SBram Moolenaar
187cb711abfSBram Moolenaar  # Test default values.
188e69f6d04SBram Moolenaar  let thebool: bool
189e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
190e69f6d04SBram Moolenaar
191e69f6d04SBram Moolenaar  let thenumber: number
192e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
193e69f6d04SBram Moolenaar
194e69f6d04SBram Moolenaar  if has('float')
195e69f6d04SBram Moolenaar    let thefloat: float
196e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
197e69f6d04SBram Moolenaar  endif
198e69f6d04SBram Moolenaar
199e69f6d04SBram Moolenaar  let thestring: string
200e69f6d04SBram Moolenaar  assert_equal('', thestring)
201e69f6d04SBram Moolenaar
202e69f6d04SBram Moolenaar  let theblob: blob
203e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
204e69f6d04SBram Moolenaar
2055deeb3f1SBram Moolenaar  let Thefunc: func
2065deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
207e69f6d04SBram Moolenaar
208e69f6d04SBram Moolenaar  let thelist: list<any>
209e69f6d04SBram Moolenaar  assert_equal([], thelist)
210e69f6d04SBram Moolenaar
211e69f6d04SBram Moolenaar  let thedict: dict<any>
212e69f6d04SBram Moolenaar  assert_equal({}, thedict)
213e69f6d04SBram Moolenaar
2142c869deeSBram Moolenaar  if has('channel')
215e69f6d04SBram Moolenaar    let thejob: job
216e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
217e69f6d04SBram Moolenaar
218e69f6d04SBram Moolenaar    let thechannel: channel
219e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
2202c869deeSBram Moolenaar  endif
221585fea7bSBram Moolenaar
222585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
223585fea7bSBram Moolenaar  assert_equal(5678, nr)
2248a7d6542SBram Moolenaarenddef
2258a7d6542SBram Moolenaar
226cab27678SBram Moolenaardef Mess(): string
227cab27678SBram Moolenaar  v:foldstart = 123
228cab27678SBram Moolenaar  return 'xxx'
229cab27678SBram Moolenaarenddef
230cab27678SBram Moolenaar
231d72c1bf0SBram Moolenaardef Test_assignment_failure()
2328a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
2338a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
2348a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
2358a7d6542SBram Moolenaar
2368a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
2378a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
2388a7d6542SBram Moolenaar
2399be61bbbSBram Moolenaar  call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
2409be61bbbSBram Moolenaar
241e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
2429be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
2439be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
2449be61bbbSBram Moolenaar
2459be61bbbSBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1065:')
2469be61bbbSBram Moolenaar
2479be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
2489be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
2499be61bbbSBram Moolenaar
2509be61bbbSBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016:')
251d3aac291SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1079:')
252d3aac291SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1078:')
253d3aac291SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1080:')
2549be61bbbSBram Moolenaar
2559be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
2569be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
2579be61bbbSBram Moolenaar
25833fa29cfSBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
25933fa29cfSBram Moolenaar
2608a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
2618a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
2628a7d6542SBram Moolenaar
2638a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
2648a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
2658a7d6542SBram Moolenaar
2668a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
2678a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
26842a480bfSBram Moolenaar
269d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
27042a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
271cab27678SBram Moolenaar
272cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
273cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
274d72c1bf0SBram Moolenaarenddef
275d72c1bf0SBram Moolenaar
276d72c1bf0SBram Moolenaardef Test_unlet()
277d72c1bf0SBram Moolenaar  g:somevar = 'yes'
278d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
279d72c1bf0SBram Moolenaar  unlet g:somevar
280d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
281d72c1bf0SBram Moolenaar  unlet! g:somevar
282d72c1bf0SBram Moolenaar
283d72c1bf0SBram Moolenaar  call CheckScriptFailure([
284d72c1bf0SBram Moolenaar        'vim9script',
285d72c1bf0SBram Moolenaar        'let svar = 123',
286d72c1bf0SBram Moolenaar        'unlet svar',
287d72c1bf0SBram Moolenaar        ], 'E1081:')
288d72c1bf0SBram Moolenaar  call CheckScriptFailure([
289d72c1bf0SBram Moolenaar        'vim9script',
290d72c1bf0SBram Moolenaar        'let svar = 123',
291d72c1bf0SBram Moolenaar        'unlet s:svar',
292d72c1bf0SBram Moolenaar        ], 'E1081:')
293d72c1bf0SBram Moolenaar  call CheckScriptFailure([
294d72c1bf0SBram Moolenaar        'vim9script',
295d72c1bf0SBram Moolenaar        'let svar = 123',
296d72c1bf0SBram Moolenaar        'def Func()',
297d72c1bf0SBram Moolenaar        '  unlet svar',
298d72c1bf0SBram Moolenaar        'enddef',
299d72c1bf0SBram Moolenaar        ], 'E1081:')
300d72c1bf0SBram Moolenaar  call CheckScriptFailure([
301d72c1bf0SBram Moolenaar        'vim9script',
302d72c1bf0SBram Moolenaar        'let svar = 123',
303d72c1bf0SBram Moolenaar        'def Func()',
304d72c1bf0SBram Moolenaar        '  unlet s:svar',
305d72c1bf0SBram Moolenaar        'enddef',
306d72c1bf0SBram Moolenaar        ], 'E1081:')
3077bdaea6eSBram Moolenaar
3087bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
3097bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
3107bdaea6eSBram Moolenaar  unlet $ENVVAR
3117bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
312d72c1bf0SBram Moolenaarenddef
313599c89c8SBram Moolenaar
3144c17ad94SBram Moolenaardef Test_delfunction()
3154c17ad94SBram Moolenaar  " Check function is defined in script namespace
3164c17ad94SBram Moolenaar  CheckScriptSuccess([
3174c17ad94SBram Moolenaar      'vim9script',
3184c17ad94SBram Moolenaar      'func CheckMe()',
3194c17ad94SBram Moolenaar      '  return 123',
3204c17ad94SBram Moolenaar      'endfunc',
3214c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
3224c17ad94SBram Moolenaar      ])
3234c17ad94SBram Moolenaar
3244c17ad94SBram Moolenaar  " Check function in script namespace cannot be deleted
3254c17ad94SBram Moolenaar  CheckScriptFailure([
3264c17ad94SBram Moolenaar      'vim9script',
3274c17ad94SBram Moolenaar      'func DeleteMe1()',
3284c17ad94SBram Moolenaar      'endfunc',
3294c17ad94SBram Moolenaar      'delfunction DeleteMe1',
3304c17ad94SBram Moolenaar      ], 'E1084:')
3314c17ad94SBram Moolenaar  CheckScriptFailure([
3324c17ad94SBram Moolenaar      'vim9script',
3334c17ad94SBram Moolenaar      'func DeleteMe2()',
3344c17ad94SBram Moolenaar      'endfunc',
3354c17ad94SBram Moolenaar      'def DoThat()',
3364c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
3374c17ad94SBram Moolenaar      'enddef',
3384c17ad94SBram Moolenaar      'DoThat()',
3394c17ad94SBram Moolenaar      ], 'E1084:')
3404c17ad94SBram Moolenaar  CheckScriptFailure([
3414c17ad94SBram Moolenaar      'vim9script',
3424c17ad94SBram Moolenaar      'def DeleteMe3()',
3434c17ad94SBram Moolenaar      'enddef',
3444c17ad94SBram Moolenaar      'delfunction DeleteMe3',
3454c17ad94SBram Moolenaar      ], 'E1084:')
3464c17ad94SBram Moolenaar  CheckScriptFailure([
3474c17ad94SBram Moolenaar      'vim9script',
3484c17ad94SBram Moolenaar      'def DeleteMe4()',
3494c17ad94SBram Moolenaar      'enddef',
3504c17ad94SBram Moolenaar      'def DoThat()',
3514c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
3524c17ad94SBram Moolenaar      'enddef',
3534c17ad94SBram Moolenaar      'DoThat()',
3544c17ad94SBram Moolenaar      ], 'E1084:')
3554c17ad94SBram Moolenaarenddef
3564c17ad94SBram Moolenaar
357599c89c8SBram Moolenaarfunc Test_wrong_type()
358599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
359599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
360599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
361599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
362599c89c8SBram Moolenaar
363599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
364599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
36542a480bfSBram Moolenaar
36642a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
36742a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
36842a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
36942a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
37042a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
37142a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
37242a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
37342a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
37442a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
37542a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
37642a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
377a0a9f43aSBram Moolenaar
378a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
379a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
3808a7d6542SBram Moolenaarendfunc
3818a7d6542SBram Moolenaar
3828a7d6542SBram Moolenaarfunc Test_const()
3838a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
3848a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
3858a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
3869be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
3878a7d6542SBram Moolenaarendfunc
3888a7d6542SBram Moolenaar
3898a7d6542SBram Moolenaardef Test_block()
3908a7d6542SBram Moolenaar  let outer = 1
3918a7d6542SBram Moolenaar  {
3928a7d6542SBram Moolenaar    let inner = 2
3938a7d6542SBram Moolenaar    assert_equal(1, outer)
3948a7d6542SBram Moolenaar    assert_equal(2, inner)
3958a7d6542SBram Moolenaar  }
3968a7d6542SBram Moolenaar  assert_equal(1, outer)
3978a7d6542SBram Moolenaarenddef
3988a7d6542SBram Moolenaar
3998a7d6542SBram Moolenaarfunc Test_block_failure()
4008a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
401585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
402585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
4038a7d6542SBram Moolenaarendfunc
4048a7d6542SBram Moolenaar
405585fea7bSBram Moolenaardef Test_cmd_modifier()
406585fea7bSBram Moolenaar  tab echo '0'
407585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
408585fea7bSBram Moolenaarenddef
409585fea7bSBram Moolenaar
4108a7d6542SBram Moolenaardef Test_try_catch()
4118a7d6542SBram Moolenaar  let l = []
4127a092245SBram Moolenaar  try # comment
4138a7d6542SBram Moolenaar    add(l, '1')
4148a7d6542SBram Moolenaar    throw 'wrong'
4158a7d6542SBram Moolenaar    add(l, '2')
4167a092245SBram Moolenaar  catch # comment
4178a7d6542SBram Moolenaar    add(l, v:exception)
4187a092245SBram Moolenaar  finally # comment
4198a7d6542SBram Moolenaar    add(l, '3')
4207a092245SBram Moolenaar  endtry # comment
4218a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
4228a7d6542SBram Moolenaarenddef
4238a7d6542SBram Moolenaar
424257cc5eeSBram Moolenaardef ThrowFromDef()
425a72cfb80SBram Moolenaar  throw "getout" # comment
426257cc5eeSBram Moolenaarenddef
427257cc5eeSBram Moolenaar
428257cc5eeSBram Moolenaarfunc CatchInFunc()
429257cc5eeSBram Moolenaar  try
430257cc5eeSBram Moolenaar    call ThrowFromDef()
431257cc5eeSBram Moolenaar  catch
432257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
433257cc5eeSBram Moolenaar  endtry
434257cc5eeSBram Moolenaarendfunc
435257cc5eeSBram Moolenaar
436257cc5eeSBram Moolenaardef CatchInDef()
437257cc5eeSBram Moolenaar  try
438257cc5eeSBram Moolenaar    ThrowFromDef()
439257cc5eeSBram Moolenaar  catch
440257cc5eeSBram Moolenaar    g:thrown_def = v:exception
441257cc5eeSBram Moolenaar  endtry
442257cc5eeSBram Moolenaarenddef
443257cc5eeSBram Moolenaar
444f575adffSBram Moolenaardef ReturnFinally(): string
445f575adffSBram Moolenaar  try
446f575adffSBram Moolenaar    return 'intry'
447f575adffSBram Moolenaar  finally
448f575adffSBram Moolenaar    g:in_finally = 'finally'
449f575adffSBram Moolenaar  endtry
450f575adffSBram Moolenaar  return 'end'
451f575adffSBram Moolenaarenddef
452f575adffSBram Moolenaar
453257cc5eeSBram Moolenaardef Test_try_catch_nested()
454257cc5eeSBram Moolenaar  CatchInFunc()
455257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
456257cc5eeSBram Moolenaar
457257cc5eeSBram Moolenaar  CatchInDef()
458257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
459f575adffSBram Moolenaar
460f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
461f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
462f575adffSBram Moolenaarenddef
463f575adffSBram Moolenaar
464f575adffSBram Moolenaardef Test_try_catch_match()
465f575adffSBram Moolenaar  let seq = 'a'
466f575adffSBram Moolenaar  try
467f575adffSBram Moolenaar    throw 'something'
468f575adffSBram Moolenaar  catch /nothing/
469f575adffSBram Moolenaar    seq ..= 'x'
470f575adffSBram Moolenaar  catch /some/
471f575adffSBram Moolenaar    seq ..= 'b'
472f575adffSBram Moolenaar  catch /asdf/
473f575adffSBram Moolenaar    seq ..= 'x'
474e8c4abbbSBram Moolenaar  catch ?a\?sdf?
475e8c4abbbSBram Moolenaar    seq ..= 'y'
476f575adffSBram Moolenaar  finally
477f575adffSBram Moolenaar    seq ..= 'c'
478f575adffSBram Moolenaar  endtry
479f575adffSBram Moolenaar  assert_equal('abc', seq)
480257cc5eeSBram Moolenaarenddef
481257cc5eeSBram Moolenaar
482e8c4abbbSBram Moolenaardef Test_try_catch_fails()
483e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
484e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
485e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
486585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
487585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
488585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
489585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
490585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
491585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
492585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
493585fea7bSBram Moolenaar
494a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
495585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
496e8c4abbbSBram Moolenaarenddef
497e8c4abbbSBram Moolenaar
4982a1381c3SBram Moolenaarif has('channel')
49940ee466cSBram Moolenaar  let someJob = test_null_job()
50040ee466cSBram Moolenaar
50140ee466cSBram Moolenaar  def FuncWithError()
50240ee466cSBram Moolenaar    echomsg g:someJob
50340ee466cSBram Moolenaar  enddef
50440ee466cSBram Moolenaar
50540ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
50640ee466cSBram Moolenaar    try
50740ee466cSBram Moolenaar      call FuncWithError()
50840ee466cSBram Moolenaar    catch
50940ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
51040ee466cSBram Moolenaar    endtry
51140ee466cSBram Moolenaar  endfunc
5122a1381c3SBram Moolenaarendif
51340ee466cSBram Moolenaar
5148a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
5158a7d6542SBram Moolenaar  vim9script
5168a7d6542SBram Moolenaar  let name: string = 'bob'
5178a7d6542SBram Moolenaar  def Concat(arg: string): string
5188a7d6542SBram Moolenaar    return name .. arg
5198a7d6542SBram Moolenaar  enddef
520227a69deSBram Moolenaar  g:result = Concat('bie')
521227a69deSBram Moolenaar  g:localname = name
5228a7d6542SBram Moolenaar
5238a7d6542SBram Moolenaar  export const CONST = 1234
5248a7d6542SBram Moolenaar  export let exported = 9876
5256e587dcbSBram Moolenaar  export let exp_name = 'John'
5268a7d6542SBram Moolenaar  export def Exported(): string
5278a7d6542SBram Moolenaar    return 'Exported'
5288a7d6542SBram Moolenaar  enddef
5298a7d6542SBram MoolenaarEND
5308a7d6542SBram Moolenaar
5315269bd2aSBram Moolenaardef Test_vim9_import_export()
5328a7d6542SBram Moolenaar  let import_script_lines =<< trim END
5338a7d6542SBram Moolenaar    vim9script
5348a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
5358a7d6542SBram Moolenaar    g:imported = exported
5366e587dcbSBram Moolenaar    exported += 3
5376e587dcbSBram Moolenaar    g:imported_added = exported
5388a7d6542SBram Moolenaar    g:imported_func = Exported()
5396e587dcbSBram Moolenaar
5406e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
5416e587dcbSBram Moolenaar    g:imported_name = exp_name
5426e587dcbSBram Moolenaar    exp_name ..= ' Doe'
5436e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
5445381c7a1SBram Moolenaar    g:imported_later = exported
5458a7d6542SBram Moolenaar  END
5468a7d6542SBram Moolenaar
5478a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
5488a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
5498a7d6542SBram Moolenaar
5508a7d6542SBram Moolenaar  source Ximport.vim
5518a7d6542SBram Moolenaar
5528a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
5538a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
5548a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
5556e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
5565381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
5578a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
5586e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
5596e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
5608a7d6542SBram Moolenaar  assert_false(exists('g:name'))
5618a7d6542SBram Moolenaar
5628a7d6542SBram Moolenaar  unlet g:result
5638a7d6542SBram Moolenaar  unlet g:localname
5648a7d6542SBram Moolenaar  unlet g:imported
5656e587dcbSBram Moolenaar  unlet g:imported_added
5665381c7a1SBram Moolenaar  unlet g:imported_later
5678a7d6542SBram Moolenaar  unlet g:imported_func
5686e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
5698a7d6542SBram Moolenaar  delete('Ximport.vim')
570f2d5c240SBram Moolenaar
5715381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
5725381c7a1SBram Moolenaar    vim9script
5735381c7a1SBram Moolenaar    def ImportInDef()
5745381c7a1SBram Moolenaar      import exported from './Xexport.vim'
5755381c7a1SBram Moolenaar      g:imported = exported
5765381c7a1SBram Moolenaar      exported += 7
5775381c7a1SBram Moolenaar      g:imported_added = exported
5785381c7a1SBram Moolenaar    enddef
5795381c7a1SBram Moolenaar    ImportInDef()
5805381c7a1SBram Moolenaar  END
5815381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
5825381c7a1SBram Moolenaar  source Ximport2.vim
5835381c7a1SBram Moolenaar  " TODO: this should be 9879
5845381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
5855381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
5865381c7a1SBram Moolenaar  unlet g:imported
5875381c7a1SBram Moolenaar  unlet g:imported_added
5885381c7a1SBram Moolenaar  delete('Ximport2.vim')
5895381c7a1SBram Moolenaar
590f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
591f2d5c240SBram Moolenaar    vim9script
592f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
593f2d5c240SBram Moolenaar    def UseExport()
594f2d5c240SBram Moolenaar      g:imported = Export.exported
595f2d5c240SBram Moolenaar    enddef
596f2d5c240SBram Moolenaar    UseExport()
597f2d5c240SBram Moolenaar  END
598f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
599f2d5c240SBram Moolenaar  source Ximport.vim
6005381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
601f2d5c240SBram Moolenaar
602599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
603599c89c8SBram Moolenaar    vim9script
604599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
605599c89c8SBram Moolenaar    def Func()
606599c89c8SBram Moolenaar      let dummy = 1
607599c89c8SBram Moolenaar      let imported = Export + dummy
608599c89c8SBram Moolenaar    enddef
609599c89c8SBram Moolenaar  END
610599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
611599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
612599c89c8SBram Moolenaar
613599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
614599c89c8SBram Moolenaar    vim9script
615599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
616599c89c8SBram Moolenaar    def Func()
617599c89c8SBram Moolenaar      let imported = Export . exported
618599c89c8SBram Moolenaar    enddef
619599c89c8SBram Moolenaar  END
620599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
621599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
622599c89c8SBram Moolenaar
623599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
624599c89c8SBram Moolenaar    vim9script
625599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
626599c89c8SBram Moolenaar    def Func()
627599c89c8SBram Moolenaar      let imported = Export.
628599c89c8SBram Moolenaar    enddef
629599c89c8SBram Moolenaar  END
630599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
631599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
632599c89c8SBram Moolenaar
633f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
634f2d5c240SBram Moolenaar    vim9script
635f2d5c240SBram Moolenaar    import * from './Xexport.vim'
636f2d5c240SBram Moolenaar  END
637f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
638f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
639f2d5c240SBram Moolenaar
640fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
641fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
642fa29c8abSBram Moolenaar    vim9script
643fa29c8abSBram Moolenaar    import name from './Xexport.vim'
644fa29c8abSBram Moolenaar  END
645fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
646fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
647fa29c8abSBram Moolenaar
6485269bd2aSBram Moolenaar  " try to import something that is already defined
6495269bd2aSBram Moolenaar  let import_already_defined =<< trim END
6505269bd2aSBram Moolenaar    vim9script
6515269bd2aSBram Moolenaar    let exported = 'something'
6525269bd2aSBram Moolenaar    import exported from './Xexport.vim'
6535269bd2aSBram Moolenaar  END
6545269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6555269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6565269bd2aSBram Moolenaar
6575269bd2aSBram Moolenaar  " try to import something that is already defined
6585269bd2aSBram Moolenaar  import_already_defined =<< trim END
6595269bd2aSBram Moolenaar    vim9script
6605269bd2aSBram Moolenaar    let exported = 'something'
6615269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
6625269bd2aSBram Moolenaar  END
6635269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6645269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6655269bd2aSBram Moolenaar
6665269bd2aSBram Moolenaar  " try to import something that is already defined
6675269bd2aSBram Moolenaar  import_already_defined =<< trim END
6685269bd2aSBram Moolenaar    vim9script
6695269bd2aSBram Moolenaar    let exported = 'something'
6705269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
6715269bd2aSBram Moolenaar  END
6725269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6735269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6745269bd2aSBram Moolenaar
675fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
676fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
677fa29c8abSBram Moolenaar    vim9script
678fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
679fa29c8abSBram Moolenaar  END
680fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
681fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
682fa29c8abSBram Moolenaar
683fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
684fa29c8abSBram Moolenaar    vim9script
685fa29c8abSBram Moolenaar    import name './Xexport.vim'
686fa29c8abSBram Moolenaar  END
687fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
688fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
689fa29c8abSBram Moolenaar
690fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
691fa29c8abSBram Moolenaar    vim9script
692fa29c8abSBram Moolenaar    import name from Xexport.vim
693fa29c8abSBram Moolenaar  END
694fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
695fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
696fa29c8abSBram Moolenaar
697fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
698fa29c8abSBram Moolenaar    vim9script
699fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
700fa29c8abSBram Moolenaar  END
701fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
702fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
703fa29c8abSBram Moolenaar
704fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
705fa29c8abSBram Moolenaar    vim9script
706fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
707fa29c8abSBram Moolenaar  END
7085269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
7095269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
710fa29c8abSBram Moolenaar
711f2d5c240SBram Moolenaar  delete('Ximport.vim')
7125269bd2aSBram Moolenaar  delete('Ximport3.vim')
7138a7d6542SBram Moolenaar  delete('Xexport.vim')
7148a7d6542SBram Moolenaar
715750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
716750802b5SBram Moolenaar  set cpo&vi
717750802b5SBram Moolenaar  let cpo_before = &cpo
718750802b5SBram Moolenaar  let lines =<< trim END
719750802b5SBram Moolenaar    vim9script
720750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
721750802b5SBram Moolenaar  END
722750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
723750802b5SBram Moolenaar  source Xvim9_script
724750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
725750802b5SBram Moolenaar  set cpo&vim
726750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
727750802b5SBram Moolenaar  delete('Xvim9_script')
728750802b5SBram Moolenaarenddef
729750802b5SBram Moolenaar
730750802b5SBram Moolenaardef Test_vim9script_fails()
7318a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
7328a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
733750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
734f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
735750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
736750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
737750802b5SBram Moolenaar
738750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
739a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
7408a7d6542SBram Moolenaarenddef
7418a7d6542SBram Moolenaar
7424c17ad94SBram Moolenaardef Test_vim9script_reload_import()
7438a7d6542SBram Moolenaar  let lines =<< trim END
7448a7d6542SBram Moolenaar    vim9script
7458a7d6542SBram Moolenaar    const var = ''
7468a7d6542SBram Moolenaar    let valone = 1234
7478a7d6542SBram Moolenaar    def MyFunc(arg: string)
7488a7d6542SBram Moolenaar       valone = 5678
7498a7d6542SBram Moolenaar    enddef
7508a7d6542SBram Moolenaar  END
7518a7d6542SBram Moolenaar  let morelines =<< trim END
7528a7d6542SBram Moolenaar    let valtwo = 222
7538a7d6542SBram Moolenaar    export def GetValtwo(): number
7548a7d6542SBram Moolenaar      return valtwo
7558a7d6542SBram Moolenaar    enddef
7568a7d6542SBram Moolenaar  END
75703afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
7588a7d6542SBram Moolenaar  source Xreload.vim
7598a7d6542SBram Moolenaar  source Xreload.vim
7608a7d6542SBram Moolenaar  source Xreload.vim
7618a7d6542SBram Moolenaar
7628a7d6542SBram Moolenaar  let testlines =<< trim END
7638a7d6542SBram Moolenaar    vim9script
7648a7d6542SBram Moolenaar    def TheFunc()
7658a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
7668a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
7678a7d6542SBram Moolenaar    enddef
7688a7d6542SBram Moolenaar    TheFunc()
7698a7d6542SBram Moolenaar  END
7708a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
7718a7d6542SBram Moolenaar  source Ximport.vim
7728a7d6542SBram Moolenaar
77303afdcf1SBram Moolenaar  " Test that when not using "morelines" GetValtwo() and valtwo are still
77403afdcf1SBram Moolenaar  " defined, because import doesn't reload a script.
7758a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
7768a7d6542SBram Moolenaar  source Ximport.vim
7778a7d6542SBram Moolenaar
7788a7d6542SBram Moolenaar  " cannot declare a var twice
7798a7d6542SBram Moolenaar  lines =<< trim END
7808a7d6542SBram Moolenaar    vim9script
7818a7d6542SBram Moolenaar    let valone = 1234
7828a7d6542SBram Moolenaar    let valone = 5678
7838a7d6542SBram Moolenaar  END
7848a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
7858a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
7868a7d6542SBram Moolenaar
7878a7d6542SBram Moolenaar  delete('Xreload.vim')
7888a7d6542SBram Moolenaar  delete('Ximport.vim')
7898a7d6542SBram Moolenaarenddef
7908a7d6542SBram Moolenaar
7914c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
7924c17ad94SBram Moolenaar  let first_lines =<< trim END
7934c17ad94SBram Moolenaar    vim9script
7944c17ad94SBram Moolenaar    def FuncYes(): string
7954c17ad94SBram Moolenaar      return 'yes'
7964c17ad94SBram Moolenaar    enddef
7974c17ad94SBram Moolenaar  END
79803afdcf1SBram Moolenaar  let withno_lines =<< trim END
7994c17ad94SBram Moolenaar    def FuncNo(): string
8004c17ad94SBram Moolenaar      return 'no'
8014c17ad94SBram Moolenaar    enddef
8024c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
8034c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
8044c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
80503afdcf1SBram Moolenaar    enddef
80603afdcf1SBram Moolenaar  END
80703afdcf1SBram Moolenaar  let nono_lines =<< trim END
80803afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
80903afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
8104c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
8114c17ad94SBram Moolenaar    enddef
8124c17ad94SBram Moolenaar  END
8134c17ad94SBram Moolenaar
8144c17ad94SBram Moolenaar  # FuncNo() is defined
81503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
8164c17ad94SBram Moolenaar  source Xreloaded.vim
8174c17ad94SBram Moolenaar  g:DoCheck(true)
8184c17ad94SBram Moolenaar
8194c17ad94SBram Moolenaar  # FuncNo() is not redefined
82003afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
8214c17ad94SBram Moolenaar  source Xreloaded.vim
82203afdcf1SBram Moolenaar  g:DoCheck()
8234c17ad94SBram Moolenaar
8244c17ad94SBram Moolenaar  # FuncNo() is back
82503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
8264c17ad94SBram Moolenaar  source Xreloaded.vim
82703afdcf1SBram Moolenaar  g:DoCheck()
8284c17ad94SBram Moolenaar
8294c17ad94SBram Moolenaar  delete('Xreloaded.vim')
8304c17ad94SBram Moolenaarenddef
8314c17ad94SBram Moolenaar
83289483d40SBram Moolenaardef Test_vim9script_reload_delvar()
83389483d40SBram Moolenaar  # write the script with a script-local variable
83489483d40SBram Moolenaar  let lines =<< trim END
83589483d40SBram Moolenaar    vim9script
83689483d40SBram Moolenaar    let var = 'string'
83789483d40SBram Moolenaar  END
83889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
83989483d40SBram Moolenaar  source XreloadVar.vim
84089483d40SBram Moolenaar
84189483d40SBram Moolenaar  # now write the script using the same variable locally - works
84289483d40SBram Moolenaar  lines =<< trim END
84389483d40SBram Moolenaar    vim9script
84489483d40SBram Moolenaar    def Func()
84589483d40SBram Moolenaar      let var = 'string'
84689483d40SBram Moolenaar    enddef
84789483d40SBram Moolenaar  END
84889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
84989483d40SBram Moolenaar  source XreloadVar.vim
85089483d40SBram Moolenaar
85189483d40SBram Moolenaar  delete('XreloadVar.vim')
85289483d40SBram Moolenaarenddef
85389483d40SBram Moolenaar
8548a7d6542SBram Moolenaardef Test_import_absolute()
8558a7d6542SBram Moolenaar  let import_lines = [
856e6085c53SBram Moolenaar        'vim9script',
857e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
858e6085c53SBram Moolenaar        'def UseExported()',
859e6085c53SBram Moolenaar        '  g:imported_abs = exported',
860e6085c53SBram Moolenaar        '  exported = 8888',
861e6085c53SBram Moolenaar        '  g:imported_after = exported',
862e6085c53SBram Moolenaar        'enddef',
863e6085c53SBram Moolenaar        'UseExported()',
864e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
865e6085c53SBram Moolenaar        ]
8668a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
8678a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
8688a7d6542SBram Moolenaar
8698a7d6542SBram Moolenaar  source Ximport_abs.vim
8708a7d6542SBram Moolenaar
8718a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
8724e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
873675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
874675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
875675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
876675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
877675f716eSBram Moolenaar          'exported = 8888.*' ..
878675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
879675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
880675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
881675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
882e6085c53SBram Moolenaar        g:import_disassembled)
8838a7d6542SBram Moolenaar  unlet g:imported_abs
8844e12a5dfSBram Moolenaar  unlet g:import_disassembled
8858a7d6542SBram Moolenaar
8868a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
8878a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
8888a7d6542SBram Moolenaarenddef
8898a7d6542SBram Moolenaar
8908a7d6542SBram Moolenaardef Test_import_rtp()
8918a7d6542SBram Moolenaar  let import_lines = [
892e6085c53SBram Moolenaar        'vim9script',
893e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
894e6085c53SBram Moolenaar        'g:imported_rtp = exported',
895e6085c53SBram Moolenaar        ]
8968a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
8978a7d6542SBram Moolenaar  mkdir('import')
8988a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
8998a7d6542SBram Moolenaar
9008a7d6542SBram Moolenaar  let save_rtp = &rtp
9018a7d6542SBram Moolenaar  &rtp = getcwd()
9028a7d6542SBram Moolenaar  source Ximport_rtp.vim
9038a7d6542SBram Moolenaar  &rtp = save_rtp
9048a7d6542SBram Moolenaar
9058a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
9068a7d6542SBram Moolenaar  unlet g:imported_rtp
9078a7d6542SBram Moolenaar
9088a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
90989483d40SBram Moolenaar  delete('import', 'rf')
9108a7d6542SBram Moolenaarenddef
9118a7d6542SBram Moolenaar
9128a7d6542SBram Moolenaardef Test_fixed_size_list()
9138a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
9148a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
9158a7d6542SBram Moolenaar  l->remove(0)
9168a7d6542SBram Moolenaar  l->add(5)
9178a7d6542SBram Moolenaar  l->insert(99, 1)
9180f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
9198a7d6542SBram Moolenaarenddef
9208a7d6542SBram Moolenaar
921158906cfSBram Moolenaardef IfElse(what: number): string
922158906cfSBram Moolenaar  let res = ''
923158906cfSBram Moolenaar  if what == 1
924158906cfSBram Moolenaar    res = "one"
925158906cfSBram Moolenaar  elseif what == 2
926158906cfSBram Moolenaar    res = "two"
927a259d8d3SBram Moolenaar  else
928158906cfSBram Moolenaar    res = "three"
929a259d8d3SBram Moolenaar  endif
930158906cfSBram Moolenaar  return res
931a259d8d3SBram Moolenaarenddef
932a259d8d3SBram Moolenaar
933158906cfSBram Moolenaardef Test_if_elseif_else()
934158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
935158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
936158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
9370f18b6d1SBram Moolenaarenddef
9380f18b6d1SBram Moolenaar
939e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
940e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
941e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
942e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
943e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
944585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
945e8c4abbbSBram Moolenaarenddef
946e8c4abbbSBram Moolenaar
9476d69bf60SBram Moolenaarlet g:bool_true = v:true
9486d69bf60SBram Moolenaarlet g:bool_false = v:false
9496d69bf60SBram Moolenaar
9506d69bf60SBram Moolenaardef Test_if_const_expr()
9516d69bf60SBram Moolenaar  let res = false
9526d69bf60SBram Moolenaar  if true ? true : false
9536d69bf60SBram Moolenaar    res = true
9546d69bf60SBram Moolenaar  endif
9556d69bf60SBram Moolenaar  assert_equal(true, res)
9566d69bf60SBram Moolenaar
957585fea7bSBram Moolenaar  g:glob = 2
958585fea7bSBram Moolenaar  if false
959585fea7bSBram Moolenaar    execute('let g:glob = 3')
960585fea7bSBram Moolenaar  endif
961585fea7bSBram Moolenaar  assert_equal(2, g:glob)
962585fea7bSBram Moolenaar  if true
963585fea7bSBram Moolenaar    execute('let g:glob = 3')
964585fea7bSBram Moolenaar  endif
965585fea7bSBram Moolenaar  assert_equal(3, g:glob)
966585fea7bSBram Moolenaar
9676d69bf60SBram Moolenaar  res = false
9686d69bf60SBram Moolenaar  if g:bool_true ? true : false
9696d69bf60SBram Moolenaar    res = true
9706d69bf60SBram Moolenaar  endif
9716d69bf60SBram Moolenaar  assert_equal(true, res)
9726d69bf60SBram Moolenaar
9736d69bf60SBram Moolenaar  res = false
9746d69bf60SBram Moolenaar  if true ? g:bool_true : false
9756d69bf60SBram Moolenaar    res = true
9766d69bf60SBram Moolenaar  endif
9776d69bf60SBram Moolenaar  assert_equal(true, res)
9786d69bf60SBram Moolenaar
9796d69bf60SBram Moolenaar  res = false
9806d69bf60SBram Moolenaar  if true ? true : g:bool_false
9816d69bf60SBram Moolenaar    res = true
9826d69bf60SBram Moolenaar  endif
9836d69bf60SBram Moolenaar  assert_equal(true, res)
9846d69bf60SBram Moolenaar
9856d69bf60SBram Moolenaar  res = false
9866d69bf60SBram Moolenaar  if true ? false : true
9876d69bf60SBram Moolenaar    res = true
9886d69bf60SBram Moolenaar  endif
9896d69bf60SBram Moolenaar  assert_equal(false, res)
9906d69bf60SBram Moolenaar
9916d69bf60SBram Moolenaar  res = false
9926d69bf60SBram Moolenaar  if false ? false : true
9936d69bf60SBram Moolenaar    res = true
9946d69bf60SBram Moolenaar  endif
9956d69bf60SBram Moolenaar  assert_equal(true, res)
9966d69bf60SBram Moolenaar
9976d69bf60SBram Moolenaar  res = false
9986d69bf60SBram Moolenaar  if false ? true : false
9996d69bf60SBram Moolenaar    res = true
10006d69bf60SBram Moolenaar  endif
10016d69bf60SBram Moolenaar  assert_equal(false, res)
10026d69bf60SBram Moolenaar
10036d69bf60SBram Moolenaar  res = false
1004e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1005e8c4abbbSBram Moolenaar    res = true
1006e8c4abbbSBram Moolenaar  endif
1007e8c4abbbSBram Moolenaar  assert_equal(false, res)
1008e8c4abbbSBram Moolenaar
1009e8c4abbbSBram Moolenaar  res = false
10106d69bf60SBram Moolenaar  if true && true
10116d69bf60SBram Moolenaar    res = true
10126d69bf60SBram Moolenaar  endif
10136d69bf60SBram Moolenaar  assert_equal(true, res)
10146d69bf60SBram Moolenaar
10156d69bf60SBram Moolenaar  res = false
10166d69bf60SBram Moolenaar  if true && false
10176d69bf60SBram Moolenaar    res = true
10186d69bf60SBram Moolenaar  endif
10196d69bf60SBram Moolenaar  assert_equal(false, res)
10206d69bf60SBram Moolenaar
10216d69bf60SBram Moolenaar  res = false
10226d69bf60SBram Moolenaar  if g:bool_true && false
10236d69bf60SBram Moolenaar    res = true
10246d69bf60SBram Moolenaar  endif
10256d69bf60SBram Moolenaar  assert_equal(false, res)
10266d69bf60SBram Moolenaar
10276d69bf60SBram Moolenaar  res = false
10286d69bf60SBram Moolenaar  if true && g:bool_false
10296d69bf60SBram Moolenaar    res = true
10306d69bf60SBram Moolenaar  endif
10316d69bf60SBram Moolenaar  assert_equal(false, res)
10326d69bf60SBram Moolenaar
10336d69bf60SBram Moolenaar  res = false
10346d69bf60SBram Moolenaar  if false && false
10356d69bf60SBram Moolenaar    res = true
10366d69bf60SBram Moolenaar  endif
10376d69bf60SBram Moolenaar  assert_equal(false, res)
10386d69bf60SBram Moolenaar
10396d69bf60SBram Moolenaar  res = false
10406d69bf60SBram Moolenaar  if true || false
10416d69bf60SBram Moolenaar    res = true
10426d69bf60SBram Moolenaar  endif
10436d69bf60SBram Moolenaar  assert_equal(true, res)
10446d69bf60SBram Moolenaar
10456d69bf60SBram Moolenaar  res = false
10466d69bf60SBram Moolenaar  if g:bool_true || false
10476d69bf60SBram Moolenaar    res = true
10486d69bf60SBram Moolenaar  endif
10496d69bf60SBram Moolenaar  assert_equal(true, res)
10506d69bf60SBram Moolenaar
10516d69bf60SBram Moolenaar  res = false
10526d69bf60SBram Moolenaar  if true || g:bool_false
10536d69bf60SBram Moolenaar    res = true
10546d69bf60SBram Moolenaar  endif
10556d69bf60SBram Moolenaar  assert_equal(true, res)
10566d69bf60SBram Moolenaar
10576d69bf60SBram Moolenaar  res = false
10586d69bf60SBram Moolenaar  if false || false
10596d69bf60SBram Moolenaar    res = true
10606d69bf60SBram Moolenaar  endif
10616d69bf60SBram Moolenaar  assert_equal(false, res)
106280c34ca3SBram Moolenaarenddef
10636d69bf60SBram Moolenaar
106480c34ca3SBram Moolenaardef Test_if_const_expr_fails()
106580c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
106680c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1067e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1068e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
10696d69bf60SBram Moolenaarenddef
10706d69bf60SBram Moolenaar
1071ad39c094SBram Moolenaardef Test_execute_cmd()
1072ad39c094SBram Moolenaar  new
1073ad39c094SBram Moolenaar  setline(1, 'default')
1074ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1075ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1076a72cfb80SBram Moolenaar
1077a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1078a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1079a72cfb80SBram Moolenaar
1080ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1081ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1082a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1083ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1084a72cfb80SBram Moolenaar
1085ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1086ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1087a72cfb80SBram Moolenaar
1088ad39c094SBram Moolenaar  let cmd_first = 'call '
1089ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1090ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1091ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1092ad39c094SBram Moolenaar  bwipe!
1093585fea7bSBram Moolenaar
1094585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1095a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1096ad39c094SBram Moolenaarenddef
1097ad39c094SBram Moolenaar
1098ad39c094SBram Moolenaardef Test_echo_cmd()
1099a72cfb80SBram Moolenaar  echo 'some' # comment
1100585fea7bSBram Moolenaar  echon 'thing'
1101ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1102ad39c094SBram Moolenaar
1103a72cfb80SBram Moolenaar  echo "some" # comment
1104a72cfb80SBram Moolenaar  echon "thing"
1105a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1106a72cfb80SBram Moolenaar
1107ad39c094SBram Moolenaar  let str1 = 'some'
1108ad39c094SBram Moolenaar  let str2 = 'more'
1109ad39c094SBram Moolenaar  echo str1 str2
1110ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1111a72cfb80SBram Moolenaar
1112a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1113ad39c094SBram Moolenaarenddef
1114ad39c094SBram Moolenaar
1115f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1116f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1117f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1118f93c7feaSBram Moolenaar  echo 'clear'
1119f93c7feaSBram Moolenaar  1messages
1120f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1121f93c7feaSBram Moolenaar
1122f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1123f93c7feaSBram Moolenaarenddef
1124f93c7feaSBram Moolenaar
1125f93c7feaSBram Moolenaardef Test_echoerr_cmd()
112640ee466cSBram Moolenaar  try
112740ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
112840ee466cSBram Moolenaar  catch
112940ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
113040ee466cSBram Moolenaar  endtry
1131f93c7feaSBram Moolenaarenddef
1132f93c7feaSBram Moolenaar
113341fe0617SBram Moolenaardef Test_for_outside_of_function()
113441fe0617SBram Moolenaar  let lines =<< trim END
113541fe0617SBram Moolenaar    vim9script
113641fe0617SBram Moolenaar    new
113741fe0617SBram Moolenaar    for var in range(0, 3)
113841fe0617SBram Moolenaar      append(line('$'), var)
113941fe0617SBram Moolenaar    endfor
114041fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
114141fe0617SBram Moolenaar    bwipe!
114241fe0617SBram Moolenaar  END
114341fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
114441fe0617SBram Moolenaar  source Xvim9for.vim
114541fe0617SBram Moolenaar  delete('Xvim9for.vim')
114641fe0617SBram Moolenaarenddef
11478a7d6542SBram Moolenaar
1148e8c4abbbSBram Moolenaardef Test_for_loop()
1149e8c4abbbSBram Moolenaar  let result = ''
1150e8c4abbbSBram Moolenaar  for cnt in range(7)
1151e8c4abbbSBram Moolenaar    if cnt == 4
1152e8c4abbbSBram Moolenaar      break
1153e8c4abbbSBram Moolenaar    endif
1154e8c4abbbSBram Moolenaar    if cnt == 2
1155e8c4abbbSBram Moolenaar      continue
1156e8c4abbbSBram Moolenaar    endif
1157e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1158e8c4abbbSBram Moolenaar  endfor
1159e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
1160e8c4abbbSBram Moolenaarenddef
1161e8c4abbbSBram Moolenaar
1162e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1163675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1164675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1165675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
11666e949784SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef'], 'E1006:')
1167675f716eSBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1024:')
1168675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1169675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1170675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1171e8c4abbbSBram Moolenaarenddef
1172e8c4abbbSBram Moolenaar
1173d0df1aacSBram Moolenaardef Test_while_loop()
1174d0df1aacSBram Moolenaar  let result = ''
1175d0df1aacSBram Moolenaar  let cnt = 0
1176d0df1aacSBram Moolenaar  while cnt < 555
1177d0df1aacSBram Moolenaar    if cnt == 3
1178d0df1aacSBram Moolenaar      break
1179d0df1aacSBram Moolenaar    endif
1180d0df1aacSBram Moolenaar    cnt += 1
1181d0df1aacSBram Moolenaar    if cnt == 2
1182d0df1aacSBram Moolenaar      continue
1183d0df1aacSBram Moolenaar    endif
1184d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1185d0df1aacSBram Moolenaar  endwhile
1186d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1187d0df1aacSBram Moolenaarenddef
1188d0df1aacSBram Moolenaar
1189e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1190675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1191675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1192675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1193675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1194675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1195675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1196675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1197bd5da371SBram Moolenaarenddef
1198bd5da371SBram Moolenaar
11999645e2d9SBram Moolenaardef Test_interrupt_loop()
120097acfc78SBram Moolenaar  let caught = false
12019645e2d9SBram Moolenaar  let x = 0
120297acfc78SBram Moolenaar  try
12039645e2d9SBram Moolenaar    while 1
12049645e2d9SBram Moolenaar      x += 1
12059645e2d9SBram Moolenaar      if x == 100
12069645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
12079645e2d9SBram Moolenaar      endif
12089645e2d9SBram Moolenaar    endwhile
120997acfc78SBram Moolenaar  catch
121097acfc78SBram Moolenaar    caught = true
121197acfc78SBram Moolenaar    assert_equal(100, x)
121297acfc78SBram Moolenaar  endtry
121397acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
12149645e2d9SBram Moolenaarenddef
121520431c9dSBram Moolenaar
12164fdae999SBram Moolenaardef Test_automatic_line_continuation()
12174fdae999SBram Moolenaar  let mylist = [
12184fdae999SBram Moolenaar      'one',
12194fdae999SBram Moolenaar      'two',
12204fdae999SBram Moolenaar      'three',
12214fdae999SBram Moolenaar      ] " comment
12224fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
12234fdae999SBram Moolenaar
12244fdae999SBram Moolenaar  let mydict = {
12254fdae999SBram Moolenaar      'one': 1,
12264fdae999SBram Moolenaar      'two': 2,
12274fdae999SBram Moolenaar      'three':
12284fdae999SBram Moolenaar          3,
12294fdae999SBram Moolenaar      } " comment
12304fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
12314fdae999SBram Moolenaar  mydict = #{
12322c330432SBram Moolenaar      one: 1,  # comment
12332c330432SBram Moolenaar      two:     # comment
12342c330432SBram Moolenaar           2,  # comment
12352c330432SBram Moolenaar      three: 3 # comment
12362c330432SBram Moolenaar      }
12372c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
12382c330432SBram Moolenaar  mydict = #{
12392c330432SBram Moolenaar      one: 1,
12404fdae999SBram Moolenaar      two:
12414fdae999SBram Moolenaar           2,
12422c330432SBram Moolenaar      three: 3
12434fdae999SBram Moolenaar      }
12444fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1245e6085c53SBram Moolenaar
1246e6085c53SBram Moolenaar  assert_equal(
1247e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1248e6085c53SBram Moolenaar        split('one two three')
1249e6085c53SBram Moolenaar        )
12504fdae999SBram Moolenaarenddef
12514fdae999SBram Moolenaar
12527a092245SBram Moolenaardef Test_vim9_comment()
12537a092245SBram Moolenaar  CheckScriptSuccess([
12547a092245SBram Moolenaar      'vim9script',
12557a092245SBram Moolenaar      '# something',
12567a092245SBram Moolenaar      ])
12577a092245SBram Moolenaar  CheckScriptFailure([
12587a092245SBram Moolenaar      'vim9script',
12597a092245SBram Moolenaar      ':# something',
12607a092245SBram Moolenaar      ], 'E488:')
12617a092245SBram Moolenaar  CheckScriptFailure([
12627a092245SBram Moolenaar      '# something',
12637a092245SBram Moolenaar      ], 'E488:')
12647a092245SBram Moolenaar  CheckScriptFailure([
12657a092245SBram Moolenaar      ':# something',
12667a092245SBram Moolenaar      ], 'E488:')
12677a092245SBram Moolenaar
12684a8d9f2eSBram Moolenaar  { # block start
12694a8d9f2eSBram Moolenaar  } # block end
12704a8d9f2eSBram Moolenaar  CheckDefFailure([
12714a8d9f2eSBram Moolenaar      '{# comment',
12724a8d9f2eSBram Moolenaar      ], 'E488:')
12734a8d9f2eSBram Moolenaar  CheckDefFailure([
12744a8d9f2eSBram Moolenaar      '{',
12754a8d9f2eSBram Moolenaar      '}# comment',
12764a8d9f2eSBram Moolenaar      ], 'E488:')
12774a8d9f2eSBram Moolenaar
12784a8d9f2eSBram Moolenaar  echo "yes" # comment
12794a8d9f2eSBram Moolenaar  CheckDefFailure([
12804a8d9f2eSBram Moolenaar      'echo "yes"# comment',
12814a8d9f2eSBram Moolenaar      ], 'E488:')
12827a092245SBram Moolenaar  CheckScriptSuccess([
12837a092245SBram Moolenaar      'vim9script',
12847a092245SBram Moolenaar      'echo "yes" # something',
12857a092245SBram Moolenaar      ])
12867a092245SBram Moolenaar  CheckScriptFailure([
12877a092245SBram Moolenaar      'vim9script',
12887a092245SBram Moolenaar      'echo "yes"# something',
12897a092245SBram Moolenaar      ], 'E121:')
12907a092245SBram Moolenaar  CheckScriptFailure([
12917a092245SBram Moolenaar      'vim9script',
12927a092245SBram Moolenaar      'echo# something',
12937a092245SBram Moolenaar      ], 'E121:')
12947a092245SBram Moolenaar  CheckScriptFailure([
12957a092245SBram Moolenaar      'echo "yes" # something',
12967a092245SBram Moolenaar      ], 'E121:')
12977a092245SBram Moolenaar
12984a8d9f2eSBram Moolenaar  exe "echo" # comment
12994a8d9f2eSBram Moolenaar  CheckDefFailure([
13004a8d9f2eSBram Moolenaar      'exe "echo"# comment',
13014a8d9f2eSBram Moolenaar      ], 'E488:')
13024a8d9f2eSBram Moolenaar  CheckScriptSuccess([
13034a8d9f2eSBram Moolenaar      'vim9script',
13044a8d9f2eSBram Moolenaar      'exe "echo" # something',
13054a8d9f2eSBram Moolenaar      ])
13064a8d9f2eSBram Moolenaar  CheckScriptFailure([
13074a8d9f2eSBram Moolenaar      'vim9script',
13084a8d9f2eSBram Moolenaar      'exe "echo"# something',
13094a8d9f2eSBram Moolenaar      ], 'E121:')
13104a8d9f2eSBram Moolenaar  CheckDefFailure([
13114a8d9f2eSBram Moolenaar      'exe # comment',
13124a8d9f2eSBram Moolenaar      ], 'E1015:')
13134a8d9f2eSBram Moolenaar  CheckScriptFailure([
13144a8d9f2eSBram Moolenaar      'vim9script',
13154a8d9f2eSBram Moolenaar      'exe# something',
13164a8d9f2eSBram Moolenaar      ], 'E121:')
13174a8d9f2eSBram Moolenaar  CheckScriptFailure([
13184a8d9f2eSBram Moolenaar      'exe "echo" # something',
13194a8d9f2eSBram Moolenaar      ], 'E121:')
13204a8d9f2eSBram Moolenaar
13217a092245SBram Moolenaar  CheckDefFailure([
13227a092245SBram Moolenaar      'try# comment',
13237a092245SBram Moolenaar      '  echo "yes"',
13247a092245SBram Moolenaar      'catch',
13257a092245SBram Moolenaar      'endtry',
13267a092245SBram Moolenaar      ], 'E488:')
13272c5ed4e3SBram Moolenaar  CheckScriptFailure([
13282c5ed4e3SBram Moolenaar      'vim9script',
13292c5ed4e3SBram Moolenaar      'try# comment',
13302c5ed4e3SBram Moolenaar      'echo "yes"',
13312c5ed4e3SBram Moolenaar      ], 'E488:')
13327a092245SBram Moolenaar  CheckDefFailure([
13337a092245SBram Moolenaar      'try',
1334a72cfb80SBram Moolenaar      '  throw#comment',
1335a72cfb80SBram Moolenaar      'catch',
1336a72cfb80SBram Moolenaar      'endtry',
1337a72cfb80SBram Moolenaar      ], 'E1015:')
1338a72cfb80SBram Moolenaar  CheckDefFailure([
1339a72cfb80SBram Moolenaar      'try',
1340a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1341a72cfb80SBram Moolenaar      'catch',
1342a72cfb80SBram Moolenaar      'endtry',
1343a72cfb80SBram Moolenaar      ], 'E488:')
1344a72cfb80SBram Moolenaar  CheckDefFailure([
1345a72cfb80SBram Moolenaar      'try',
13467a092245SBram Moolenaar      '  echo "yes"',
13477a092245SBram Moolenaar      'catch# comment',
13487a092245SBram Moolenaar      'endtry',
13497a092245SBram Moolenaar      ], 'E488:')
13502c5ed4e3SBram Moolenaar  CheckScriptFailure([
13512c5ed4e3SBram Moolenaar      'vim9script',
13522c5ed4e3SBram Moolenaar      'try',
13532c5ed4e3SBram Moolenaar      '  echo "yes"',
13542c5ed4e3SBram Moolenaar      'catch# comment',
13552c5ed4e3SBram Moolenaar      'endtry',
13562c5ed4e3SBram Moolenaar      ], 'E654:')
13572c5ed4e3SBram Moolenaar  CheckDefFailure([
13582c5ed4e3SBram Moolenaar      'try',
13592c5ed4e3SBram Moolenaar      '  echo "yes"',
13602c5ed4e3SBram Moolenaar      'catch /pat/# comment',
13612c5ed4e3SBram Moolenaar      'endtry',
13622c5ed4e3SBram Moolenaar      ], 'E488:')
13637a092245SBram Moolenaar  CheckDefFailure([
13647a092245SBram Moolenaar      'try',
13657a092245SBram Moolenaar      'echo "yes"',
13667a092245SBram Moolenaar      'catch',
13677a092245SBram Moolenaar      'endtry# comment',
13687a092245SBram Moolenaar      ], 'E488:')
13692c5ed4e3SBram Moolenaar  CheckScriptFailure([
13702c5ed4e3SBram Moolenaar      'vim9script',
13712c5ed4e3SBram Moolenaar      'try',
13722c5ed4e3SBram Moolenaar      '  echo "yes"',
13732c5ed4e3SBram Moolenaar      'catch',
13742c5ed4e3SBram Moolenaar      'endtry# comment',
13752c5ed4e3SBram Moolenaar      ], 'E600:')
13762c5ed4e3SBram Moolenaar
13772c5ed4e3SBram Moolenaar  CheckScriptSuccess([
13782c5ed4e3SBram Moolenaar      'vim9script',
13792c5ed4e3SBram Moolenaar      'hi # comment',
13802c5ed4e3SBram Moolenaar      ])
13812c5ed4e3SBram Moolenaar  CheckScriptFailure([
13822c5ed4e3SBram Moolenaar      'vim9script',
13832c5ed4e3SBram Moolenaar      'hi# comment',
13842c5ed4e3SBram Moolenaar      ], 'E416:')
13851966c248SBram Moolenaar  CheckScriptSuccess([
13861966c248SBram Moolenaar      'vim9script',
13871966c248SBram Moolenaar      'hi Search # comment',
13881966c248SBram Moolenaar      ])
13891966c248SBram Moolenaar  CheckScriptFailure([
13901966c248SBram Moolenaar      'vim9script',
13911966c248SBram Moolenaar      'hi Search# comment',
13921966c248SBram Moolenaar      ], 'E416:')
13931966c248SBram Moolenaar  CheckScriptSuccess([
13941966c248SBram Moolenaar      'vim9script',
13951966c248SBram Moolenaar      'hi link This Search # comment',
13961966c248SBram Moolenaar      ])
13971966c248SBram Moolenaar  CheckScriptFailure([
13981966c248SBram Moolenaar      'vim9script',
13991966c248SBram Moolenaar      'hi link This That# comment',
14001966c248SBram Moolenaar      ], 'E413:')
14011966c248SBram Moolenaar  CheckScriptSuccess([
14021966c248SBram Moolenaar      'vim9script',
14031966c248SBram Moolenaar      'hi clear This # comment',
14041966c248SBram Moolenaar      'hi clear # comment',
14051966c248SBram Moolenaar      ])
14061966c248SBram Moolenaar  " not tested, because it doesn't give an error but a warning:
14071966c248SBram Moolenaar  " hi clear This# comment',
14081966c248SBram Moolenaar  CheckScriptFailure([
14091966c248SBram Moolenaar      'vim9script',
14101966c248SBram Moolenaar      'hi clear# comment',
14111966c248SBram Moolenaar      ], 'E416:')
14121966c248SBram Moolenaar
14131966c248SBram Moolenaar  CheckScriptSuccess([
14141966c248SBram Moolenaar      'vim9script',
14151966c248SBram Moolenaar      'hi Group term=bold',
14161966c248SBram Moolenaar      'match Group /todo/ # comment',
14171966c248SBram Moolenaar      ])
14181966c248SBram Moolenaar  CheckScriptFailure([
14191966c248SBram Moolenaar      'vim9script',
14201966c248SBram Moolenaar      'hi Group term=bold',
14211966c248SBram Moolenaar      'match Group /todo/# comment',
14221966c248SBram Moolenaar      ], 'E488:')
14231966c248SBram Moolenaar  CheckScriptSuccess([
14241966c248SBram Moolenaar      'vim9script',
14251966c248SBram Moolenaar      'match # comment',
14261966c248SBram Moolenaar      ])
14271966c248SBram Moolenaar  CheckScriptFailure([
14281966c248SBram Moolenaar      'vim9script',
14291966c248SBram Moolenaar      'match# comment',
14301966c248SBram Moolenaar      ], 'E475:')
14311966c248SBram Moolenaar  CheckScriptSuccess([
14321966c248SBram Moolenaar      'vim9script',
14331966c248SBram Moolenaar      'match none # comment',
14341966c248SBram Moolenaar      ])
14351966c248SBram Moolenaar  CheckScriptFailure([
14361966c248SBram Moolenaar      'vim9script',
14371966c248SBram Moolenaar      'match none# comment',
14381966c248SBram Moolenaar      ], 'E475:')
14391966c248SBram Moolenaar
14401966c248SBram Moolenaar  CheckScriptSuccess([
14411966c248SBram Moolenaar      'vim9script',
14421966c248SBram Moolenaar      'menutrans clear # comment',
14431966c248SBram Moolenaar      ])
14441966c248SBram Moolenaar  CheckScriptFailure([
14451966c248SBram Moolenaar      'vim9script',
14461966c248SBram Moolenaar      'menutrans clear# comment text',
14471966c248SBram Moolenaar      ], 'E474:')
14481966c248SBram Moolenaar
14491966c248SBram Moolenaar  CheckScriptSuccess([
14501966c248SBram Moolenaar      'vim9script',
14511966c248SBram Moolenaar      'syntax clear # comment',
14521966c248SBram Moolenaar      ])
14531966c248SBram Moolenaar  CheckScriptFailure([
14541966c248SBram Moolenaar      'vim9script',
14551966c248SBram Moolenaar      'syntax clear# comment text',
14561966c248SBram Moolenaar      ], 'E28:')
14571966c248SBram Moolenaar  CheckScriptSuccess([
14581966c248SBram Moolenaar      'vim9script',
14591966c248SBram Moolenaar      'syntax keyword Word some',
14601966c248SBram Moolenaar      'syntax clear Word # comment',
14611966c248SBram Moolenaar      ])
14621966c248SBram Moolenaar  CheckScriptFailure([
14631966c248SBram Moolenaar      'vim9script',
14641966c248SBram Moolenaar      'syntax keyword Word some',
14651966c248SBram Moolenaar      'syntax clear Word# comment text',
14661966c248SBram Moolenaar      ], 'E28:')
14671966c248SBram Moolenaar
14681966c248SBram Moolenaar  CheckScriptSuccess([
14691966c248SBram Moolenaar      'vim9script',
14701966c248SBram Moolenaar      'syntax list # comment',
14711966c248SBram Moolenaar      ])
14721966c248SBram Moolenaar  CheckScriptFailure([
14731966c248SBram Moolenaar      'vim9script',
14741966c248SBram Moolenaar      'syntax list# comment text',
14751966c248SBram Moolenaar      ], 'E28:')
14761966c248SBram Moolenaar
14771966c248SBram Moolenaar  CheckScriptSuccess([
14781966c248SBram Moolenaar      'vim9script',
14791966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
14801966c248SBram Moolenaar      ])
14811966c248SBram Moolenaar  CheckScriptFailure([
14821966c248SBram Moolenaar      'vim9script',
14831966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
14841966c248SBram Moolenaar      ], 'E475:')
14851966c248SBram Moolenaar
14861966c248SBram Moolenaar  CheckScriptSuccess([
14871966c248SBram Moolenaar      'vim9script',
14881966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
14891966c248SBram Moolenaar      ])
14901966c248SBram Moolenaar  CheckScriptFailure([
14911966c248SBram Moolenaar      'vim9script',
14921966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
14931966c248SBram Moolenaar      ], 'E789:')
14941966c248SBram Moolenaar
14951966c248SBram Moolenaar  CheckScriptSuccess([
14961966c248SBram Moolenaar      'vim9script',
14971966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
14981966c248SBram Moolenaar      ])
14991966c248SBram Moolenaar  CheckScriptFailure([
15001966c248SBram Moolenaar      'vim9script',
15011966c248SBram Moolenaar      'syntax match Word /pat/# comment',
15021966c248SBram Moolenaar      ], 'E402:')
15031966c248SBram Moolenaar
15041966c248SBram Moolenaar  CheckScriptSuccess([
15051966c248SBram Moolenaar      'vim9script',
15061966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
15071966c248SBram Moolenaar      ])
15081966c248SBram Moolenaar  CheckScriptFailure([
15091966c248SBram Moolenaar      'vim9script',
15101966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
15111966c248SBram Moolenaar      ], 'E475:')
15121966c248SBram Moolenaar  CheckScriptFailure([
15131966c248SBram Moolenaar      'vim9script',
15141966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
15151966c248SBram Moolenaar      ], 'E406:')
15161966c248SBram Moolenaar  CheckScriptFailure([
15171966c248SBram Moolenaar      'vim9script',
15181966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
15191966c248SBram Moolenaar      ], 'E475:')
15201966c248SBram Moolenaar
15211966c248SBram Moolenaar  CheckScriptSuccess([
15221966c248SBram Moolenaar      'vim9script',
15231966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
15241966c248SBram Moolenaar      ])
15251966c248SBram Moolenaar  CheckScriptFailure([
15261966c248SBram Moolenaar      'vim9script',
15271966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
15281966c248SBram Moolenaar      ], 'E475:')
15291966c248SBram Moolenaar
15301966c248SBram Moolenaar  CheckScriptSuccess([
15311966c248SBram Moolenaar      'vim9script',
15321966c248SBram Moolenaar      'syntax sync # comment',
15331966c248SBram Moolenaar      ])
15341966c248SBram Moolenaar  CheckScriptFailure([
15351966c248SBram Moolenaar      'vim9script',
15361966c248SBram Moolenaar      'syntax sync# comment',
15371966c248SBram Moolenaar      ], 'E404:')
15381966c248SBram Moolenaar  CheckScriptSuccess([
15391966c248SBram Moolenaar      'vim9script',
15401966c248SBram Moolenaar      'syntax sync ccomment # comment',
15411966c248SBram Moolenaar      ])
15421966c248SBram Moolenaar  CheckScriptFailure([
15431966c248SBram Moolenaar      'vim9script',
15441966c248SBram Moolenaar      'syntax sync ccomment# comment',
15451966c248SBram Moolenaar      ], 'E404:')
15461966c248SBram Moolenaar
15471966c248SBram Moolenaar  CheckScriptSuccess([
15481966c248SBram Moolenaar      'vim9script',
15491966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
15501966c248SBram Moolenaar      ])
15511966c248SBram Moolenaar  CheckScriptFailure([
15521966c248SBram Moolenaar      'vim9script',
15531966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
15541966c248SBram Moolenaar      ], 'E475:')
1555a72cfb80SBram Moolenaar
1556a72cfb80SBram Moolenaar  CheckScriptSuccess([
1557a72cfb80SBram Moolenaar      'vim9script',
1558a72cfb80SBram Moolenaar      'command Echo echo # comment',
1559a72cfb80SBram Moolenaar      'command Echo # comment',
1560a72cfb80SBram Moolenaar      ])
1561a72cfb80SBram Moolenaar  CheckScriptFailure([
1562a72cfb80SBram Moolenaar      'vim9script',
1563a72cfb80SBram Moolenaar      'command Echo echo# comment',
1564a72cfb80SBram Moolenaar      'Echo',
1565a72cfb80SBram Moolenaar      ], 'E121:')
1566a72cfb80SBram Moolenaar  CheckScriptFailure([
1567a72cfb80SBram Moolenaar      'vim9script',
1568a72cfb80SBram Moolenaar      'command Echo# comment',
1569a72cfb80SBram Moolenaar      ], 'E182:')
1570a72cfb80SBram Moolenaar  CheckScriptFailure([
1571a72cfb80SBram Moolenaar      'vim9script',
1572a72cfb80SBram Moolenaar      'command Echo echo',
1573a72cfb80SBram Moolenaar      'command Echo# comment',
1574a72cfb80SBram Moolenaar      ], 'E182:')
1575a72cfb80SBram Moolenaar
1576a72cfb80SBram Moolenaar  CheckScriptSuccess([
1577a72cfb80SBram Moolenaar      'vim9script',
1578a72cfb80SBram Moolenaar      'function # comment',
1579a72cfb80SBram Moolenaar      ])
1580a72cfb80SBram Moolenaar  CheckScriptFailure([
1581a72cfb80SBram Moolenaar      'vim9script',
1582a72cfb80SBram Moolenaar      'function# comment',
1583a72cfb80SBram Moolenaar      ], 'E129:')
1584a72cfb80SBram Moolenaar  CheckScriptSuccess([
1585a72cfb80SBram Moolenaar      'vim9script',
1586a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
1587a72cfb80SBram Moolenaar      ])
1588a72cfb80SBram Moolenaar  CheckScriptFailure([
1589a72cfb80SBram Moolenaar      'vim9script',
1590a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
1591a72cfb80SBram Moolenaar      ], 'E488:')
1592a72cfb80SBram Moolenaar
1593a72cfb80SBram Moolenaar  CheckScriptSuccess([
1594a72cfb80SBram Moolenaar      'vim9script',
15954c17ad94SBram Moolenaar      'func g:DeleteMeA()',
1596a72cfb80SBram Moolenaar      'endfunc',
15974c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
1598a72cfb80SBram Moolenaar      ])
1599a72cfb80SBram Moolenaar  CheckScriptFailure([
1600a72cfb80SBram Moolenaar      'vim9script',
16014c17ad94SBram Moolenaar      'func g:DeleteMeB()',
1602a72cfb80SBram Moolenaar      'endfunc',
16034c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
1604a72cfb80SBram Moolenaar      ], 'E488:')
1605a72cfb80SBram Moolenaar
1606a72cfb80SBram Moolenaar  CheckScriptSuccess([
1607a72cfb80SBram Moolenaar      'vim9script',
1608a72cfb80SBram Moolenaar      'call execute("ls") # comment',
1609a72cfb80SBram Moolenaar      ])
1610a72cfb80SBram Moolenaar  CheckScriptFailure([
1611a72cfb80SBram Moolenaar      'vim9script',
1612a72cfb80SBram Moolenaar      'call execute("ls")# comment',
1613a72cfb80SBram Moolenaar      ], 'E488:')
16142c5ed4e3SBram Moolenaarenddef
16152c5ed4e3SBram Moolenaar
16162c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
16172c5ed4e3SBram Moolenaar  CheckCanRunGui
16182c5ed4e3SBram Moolenaar
16192c5ed4e3SBram Moolenaar  CheckScriptFailure([
16202c5ed4e3SBram Moolenaar      'vim9script',
16212c5ed4e3SBram Moolenaar      'gui#comment'
16222c5ed4e3SBram Moolenaar      ], 'E499:')
16232c5ed4e3SBram Moolenaar  CheckScriptFailure([
16242c5ed4e3SBram Moolenaar      'vim9script',
16252c5ed4e3SBram Moolenaar      'gui -f#comment'
16262c5ed4e3SBram Moolenaar      ], 'E499:')
16277a092245SBram Moolenaarenddef
16287a092245SBram Moolenaar
1629a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
1630a26b9700SBram Moolenaar  au TabEnter *.vim let g:entered = 1
1631a26b9700SBram Moolenaar  au TabEnter *.x let g:entered = 2
1632a26b9700SBram Moolenaar
1633a26b9700SBram Moolenaar  edit test.vim
1634a26b9700SBram Moolenaar  doautocmd TabEnter #comment
1635a26b9700SBram Moolenaar  assert_equal(1, g:entered)
1636a26b9700SBram Moolenaar
1637a26b9700SBram Moolenaar  doautocmd TabEnter f.x
1638a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1639a26b9700SBram Moolenaar
1640a26b9700SBram Moolenaar  g:entered = 0
1641a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
1642a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1643a26b9700SBram Moolenaar
1644a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
1645a26b9700SBram Moolenaar
1646a26b9700SBram Moolenaar  au! TabEnter
1647a26b9700SBram Moolenaar  unlet g:entered
1648d72c1bf0SBram Moolenaar
1649d72c1bf0SBram Moolenaar  CheckScriptSuccess([
1650d72c1bf0SBram Moolenaar      'vim9script',
1651d72c1bf0SBram Moolenaar      'let g:var = 123',
1652d72c1bf0SBram Moolenaar      'let w:var = 777',
1653d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
1654d72c1bf0SBram Moolenaar      ])
1655d72c1bf0SBram Moolenaar
1656d72c1bf0SBram Moolenaar  CheckScriptFailure([
1657d72c1bf0SBram Moolenaar      'vim9script',
1658d72c1bf0SBram Moolenaar      'let g:var = 123',
165932e35117SBram Moolenaar      'unlet g:var# comment1',
1660d72c1bf0SBram Moolenaar      ], 'E108:')
1661d72c1bf0SBram Moolenaar
1662d72c1bf0SBram Moolenaar  CheckScriptFailure([
1663d72c1bf0SBram Moolenaar      'let g:var = 123',
1664d72c1bf0SBram Moolenaar      'unlet g:var # something',
1665d72c1bf0SBram Moolenaar      ], 'E488:')
1666faac4104SBram Moolenaar
1667faac4104SBram Moolenaar  CheckScriptSuccess([
1668faac4104SBram Moolenaar      'vim9script',
166932e35117SBram Moolenaar      'if 1 # comment2',
1670faac4104SBram Moolenaar      '  echo "yes"',
1671faac4104SBram Moolenaar      'elseif 2 #comment',
1672faac4104SBram Moolenaar      '  echo "no"',
1673faac4104SBram Moolenaar      'endif',
1674faac4104SBram Moolenaar      ])
1675faac4104SBram Moolenaar
1676faac4104SBram Moolenaar  CheckScriptFailure([
1677faac4104SBram Moolenaar      'vim9script',
167832e35117SBram Moolenaar      'if 1# comment3',
1679faac4104SBram Moolenaar      '  echo "yes"',
1680faac4104SBram Moolenaar      'endif',
1681faac4104SBram Moolenaar      ], 'E15:')
1682faac4104SBram Moolenaar
1683faac4104SBram Moolenaar  CheckScriptFailure([
1684faac4104SBram Moolenaar      'vim9script',
168532e35117SBram Moolenaar      'if 0 # comment4',
1686faac4104SBram Moolenaar      '  echo "yes"',
1687faac4104SBram Moolenaar      'elseif 2#comment',
1688faac4104SBram Moolenaar      '  echo "no"',
1689faac4104SBram Moolenaar      'endif',
1690faac4104SBram Moolenaar      ], 'E15:')
1691faac4104SBram Moolenaar
1692faac4104SBram Moolenaar  CheckScriptSuccess([
1693faac4104SBram Moolenaar      'vim9script',
169432e35117SBram Moolenaar      'let v = 1 # comment5',
1695faac4104SBram Moolenaar      ])
1696faac4104SBram Moolenaar
1697faac4104SBram Moolenaar  CheckScriptFailure([
1698faac4104SBram Moolenaar      'vim9script',
169932e35117SBram Moolenaar      'let v = 1# comment6',
170032e35117SBram Moolenaar      ], 'E15:')
1701faac4104SBram Moolenaar
1702faac4104SBram Moolenaar  CheckScriptFailure([
1703faac4104SBram Moolenaar      'vim9script',
170432e35117SBram Moolenaar      'let v:version',
170532e35117SBram Moolenaar      ], 'E1091:')
1706faac4104SBram Moolenaar
1707faac4104SBram Moolenaar  CheckScriptSuccess([
1708faac4104SBram Moolenaar      'vim9script',
1709faac4104SBram Moolenaar      'new'
1710faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
1711faac4104SBram Moolenaar      '$',
1712faac4104SBram Moolenaar      'dsearch /pat/ #comment',
1713faac4104SBram Moolenaar      'bwipe!',
1714faac4104SBram Moolenaar      ])
1715faac4104SBram Moolenaar
1716faac4104SBram Moolenaar  CheckScriptFailure([
1717faac4104SBram Moolenaar      'vim9script',
1718faac4104SBram Moolenaar      'new'
1719faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
1720faac4104SBram Moolenaar      '$',
1721faac4104SBram Moolenaar      'dsearch /pat/#comment',
1722faac4104SBram Moolenaar      'bwipe!',
1723faac4104SBram Moolenaar      ], 'E488:')
1724*74fae513SBram Moolenaar
1725*74fae513SBram Moolenaar  CheckScriptFailure([
1726*74fae513SBram Moolenaar      'vim9script',
1727*74fae513SBram Moolenaar      'func! SomeFunc()',
1728*74fae513SBram Moolenaar      ], 'E477:')
1729a26b9700SBram Moolenaarenddef
1730a26b9700SBram Moolenaar
17317e5bd91dSBram Moolenaardef Test_finish()
17327e5bd91dSBram Moolenaar  let lines =<< trim END
17337e5bd91dSBram Moolenaar    vim9script
17347e5bd91dSBram Moolenaar    let g:res = 'one'
17357e5bd91dSBram Moolenaar    if v:false | finish | endif
17367e5bd91dSBram Moolenaar    let g:res = 'two'
17377e5bd91dSBram Moolenaar    finish
17387e5bd91dSBram Moolenaar    let g:res = 'three'
17397e5bd91dSBram Moolenaar  END
17407e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
17417e5bd91dSBram Moolenaar  source Xfinished
17427e5bd91dSBram Moolenaar  assert_equal('two', g:res)
17437e5bd91dSBram Moolenaar
17447e5bd91dSBram Moolenaar  unlet g:res
17457e5bd91dSBram Moolenaar  delete('Xfinished')
17467e5bd91dSBram Moolenaarenddef
17477e5bd91dSBram Moolenaar
174832e35117SBram Moolenaardef Test_let_func_call()
174932e35117SBram Moolenaar  let lines =<< trim END
175032e35117SBram Moolenaar    vim9script
175132e35117SBram Moolenaar    func GetValue()
175232e35117SBram Moolenaar      if exists('g:count')
175332e35117SBram Moolenaar        let g:count += 1
175432e35117SBram Moolenaar      else
175532e35117SBram Moolenaar        let g:count = 1
175632e35117SBram Moolenaar      endif
175732e35117SBram Moolenaar      return 'this'
175832e35117SBram Moolenaar    endfunc
175932e35117SBram Moolenaar    let val: string = GetValue()
1760df671b46SBram Moolenaar    " env var is always a string
1761df671b46SBram Moolenaar    let env = $TERM
176232e35117SBram Moolenaar  END
176332e35117SBram Moolenaar  writefile(lines, 'Xfinished')
176432e35117SBram Moolenaar  source Xfinished
1765a5d0077eSBram Moolenaar  " GetValue() is not called during discovery phase
176632e35117SBram Moolenaar  assert_equal(1, g:count)
176732e35117SBram Moolenaar
176832e35117SBram Moolenaar  unlet g:count
176932e35117SBram Moolenaar  delete('Xfinished')
177032e35117SBram Moolenaarenddef
177132e35117SBram Moolenaar
177232e35117SBram Moolenaardef Test_let_missing_type()
177332e35117SBram Moolenaar  let lines =<< trim END
177432e35117SBram Moolenaar    vim9script
177532e35117SBram Moolenaar    func GetValue()
177632e35117SBram Moolenaar      return 'this'
177732e35117SBram Moolenaar    endfunc
177832e35117SBram Moolenaar    let val = GetValue()
177932e35117SBram Moolenaar  END
1780227a69deSBram Moolenaar  CheckScriptFailure(lines, 'E1091:')
178132e35117SBram Moolenaar
1782227a69deSBram Moolenaar  lines =<< trim END
1783227a69deSBram Moolenaar    vim9script
1784df671b46SBram Moolenaar    func GetValue()
1785df671b46SBram Moolenaar      return 'this'
1786df671b46SBram Moolenaar    endfunc
1787df671b46SBram Moolenaar    let val = [GetValue()]
1788df671b46SBram Moolenaar  END
1789df671b46SBram Moolenaar  CheckScriptFailure(lines, 'E1091:')
1790df671b46SBram Moolenaar
1791df671b46SBram Moolenaar  lines =<< trim END
1792df671b46SBram Moolenaar    vim9script
1793df671b46SBram Moolenaar    func GetValue()
1794df671b46SBram Moolenaar      return 'this'
1795df671b46SBram Moolenaar    endfunc
1796df671b46SBram Moolenaar    let val = {GetValue(): 123}
1797df671b46SBram Moolenaar  END
1798df671b46SBram Moolenaar  CheckScriptFailure(lines, 'E1091:')
1799df671b46SBram Moolenaar
1800df671b46SBram Moolenaar  lines =<< trim END
1801df671b46SBram Moolenaar    vim9script
1802df671b46SBram Moolenaar    func GetValue()
1803df671b46SBram Moolenaar      return 'this'
1804df671b46SBram Moolenaar    endfunc
1805df671b46SBram Moolenaar    let val = {'a': GetValue()}
1806df671b46SBram Moolenaar  END
1807df671b46SBram Moolenaar  CheckScriptFailure(lines, 'E1091:')
1808df671b46SBram Moolenaar
1809df671b46SBram Moolenaar  lines =<< trim END
1810df671b46SBram Moolenaar    vim9script
1811df671b46SBram Moolenaar    let var = g:unknown
1812227a69deSBram Moolenaar  END
1813227a69deSBram Moolenaar  CheckScriptFailure(lines, 'E1091:')
1814227a69deSBram Moolenaar
1815227a69deSBram Moolenaar  " TODO: eventually this would work
1816227a69deSBram Moolenaar  lines =<< trim END
1817227a69deSBram Moolenaar    vim9script
1818227a69deSBram Moolenaar    let var = has('eval')
1819227a69deSBram Moolenaar  END
1820227a69deSBram Moolenaar  CheckScriptFailure(lines, 'E1091:')
1821227a69deSBram Moolenaar
1822227a69deSBram Moolenaar  " TODO: eventually this would work
1823227a69deSBram Moolenaar  lines =<< trim END
1824227a69deSBram Moolenaar    vim9script
1825227a69deSBram Moolenaar    let var = len('string')
1826227a69deSBram Moolenaar  END
1827227a69deSBram Moolenaar  CheckScriptFailure(lines, 'E1091:')
1828227a69deSBram Moolenaar
1829227a69deSBram Moolenaar  lines =<< trim END
1830227a69deSBram Moolenaar    vim9script
1831227a69deSBram Moolenaar    let nr: number = 123
1832227a69deSBram Moolenaar    let var = nr
1833227a69deSBram Moolenaar  END
1834227a69deSBram Moolenaar  CheckScriptFailure(lines, 'E1091:')
183532e35117SBram Moolenaarenddef
183632e35117SBram Moolenaar
1837a5d0077eSBram Moolenaardef Test_forward_declaration()
1838a5d0077eSBram Moolenaar  let lines =<< trim END
1839a5d0077eSBram Moolenaar    vim9script
1840a5d0077eSBram Moolenaar    g:initVal = GetValue()
1841a5d0077eSBram Moolenaar    def GetValue(): string
1842a5d0077eSBram Moolenaar      return theVal
1843a5d0077eSBram Moolenaar    enddef
1844a5d0077eSBram Moolenaar    let theVal = 'something'
1845a5d0077eSBram Moolenaar    theVal = 'else'
1846a5d0077eSBram Moolenaar    g:laterVal = GetValue()
1847a5d0077eSBram Moolenaar  END
1848a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
1849a5d0077eSBram Moolenaar  source Xforward
1850a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
1851a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
1852a5d0077eSBram Moolenaar
1853a5d0077eSBram Moolenaar  unlet g:initVal
1854a5d0077eSBram Moolenaar  unlet g:laterVal
1855a5d0077eSBram Moolenaar  delete('Xforward')
1856a5d0077eSBram Moolenaarenddef
1857a5d0077eSBram Moolenaar
1858a5d0077eSBram Moolenaar
1859585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
1860585fea7bSBram Moolenaardef Test_substitute_cmd()
1861585fea7bSBram Moolenaar  new
1862585fea7bSBram Moolenaar  setline(1, 'something')
1863585fea7bSBram Moolenaar  :substitute(some(other(
1864585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
1865585fea7bSBram Moolenaar  bwipe!
1866585fea7bSBram Moolenaar
1867585fea7bSBram Moolenaar  " also when the context is Vim9 script
1868585fea7bSBram Moolenaar  let lines =<< trim END
1869585fea7bSBram Moolenaar    vim9script
1870585fea7bSBram Moolenaar    new
1871585fea7bSBram Moolenaar    setline(1, 'something')
1872585fea7bSBram Moolenaar    :substitute(some(other(
1873585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
1874585fea7bSBram Moolenaar    bwipe!
1875585fea7bSBram Moolenaar  END
1876585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
1877585fea7bSBram Moolenaar  source Xvim9lines
1878585fea7bSBram Moolenaar
1879585fea7bSBram Moolenaar  delete('Xvim9lines')
1880585fea7bSBram Moolenaarenddef
1881585fea7bSBram Moolenaar
18828a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1883