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
260c2ca58eSBram Moolenaar  let list1: list<bool> = [false, true, false]
278a7d6542SBram Moolenaar  let list2: list<number> = [1, 2, 3]
280c2ca58eSBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
290c2ca58eSBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
300c2ca58eSBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
318a7d6542SBram Moolenaar
32436472f5SBram Moolenaar  let listS: list<string> = []
33436472f5SBram Moolenaar  let listN: list<number> = []
348a7d6542SBram Moolenaar
350c2ca58eSBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
368a7d6542SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
370c2ca58eSBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
380c2ca58eSBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
390c2ca58eSBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, tw: 0z02}
40b283a8a6SBram Moolenaar
41f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string'], 'E1069:')
42f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string = "x"'], 'E1069:')
431cc2a94fSBram Moolenaar  call CheckDefFailure(['let a:string = "x"'], 'E1069:')
44f93c7feaSBram Moolenaar
459be61bbbSBram Moolenaar  let a: number = 6
469be61bbbSBram Moolenaar  assert_equal(6, a)
479be61bbbSBram Moolenaar
4842a480bfSBram Moolenaar  if has('channel')
4942a480bfSBram Moolenaar    let chan1: channel
50fbdd08edSBram Moolenaar    let job1: job
51f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
5242a480bfSBram Moolenaar  endif
53fbdd08edSBram Moolenaar  if has('float')
54fbdd08edSBram Moolenaar    let float1: float = 3.4
55fbdd08edSBram Moolenaar  endif
565deeb3f1SBram Moolenaar  let Funky1: func
575deeb3f1SBram Moolenaar  let Funky2: func = function('len')
584c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
5942a480bfSBram Moolenaar
60cb711abfSBram Moolenaar  # type becomes list<any>
6161a6d4e4SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
62cb711abfSBram Moolenaar  # type becomes dict<any>
635381c7a1SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
6461a6d4e4SBram Moolenaar
65401d9ffbSBram Moolenaar  g:newvar = 'new'
66401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
67401d9ffbSBram Moolenaar
68401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
69401d9ffbSBram Moolenaar  g:existing = 'no'
70401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
71401d9ffbSBram Moolenaar
72b283a8a6SBram Moolenaar  v:char = 'abc'
736e587dcbSBram Moolenaar  assert_equal('abc', v:char)
74b283a8a6SBram Moolenaar
75b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
766e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
77b283a8a6SBram Moolenaar  $ENVVAR = ''
786e587dcbSBram Moolenaar
79fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
80fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
81fd1823e0SBram Moolenaar  s:addToMe += 222
82fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
830bbf722aSBram Moolenaar  s:newVar = 'new'
840bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
85a8c17704SBram Moolenaar
86a8c17704SBram Moolenaar  set ts=7
87a8c17704SBram Moolenaar  &ts += 1
88a8c17704SBram Moolenaar  assert_equal(8, &ts)
8980c34ca3SBram Moolenaar  &ts -= 3
9080c34ca3SBram Moolenaar  assert_equal(5, &ts)
9180c34ca3SBram Moolenaar  &ts *= 2
9280c34ca3SBram Moolenaar  assert_equal(10, &ts)
9380c34ca3SBram Moolenaar  &ts /= 3
9480c34ca3SBram Moolenaar  assert_equal(3, &ts)
9580c34ca3SBram Moolenaar  set ts=10
9680c34ca3SBram Moolenaar  &ts %= 4
9780c34ca3SBram Moolenaar  assert_equal(2, &ts)
98a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
99a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
100a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = [7]'], 'E1013:')
101a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
102a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = "xx"'], 'E1013:')
103a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
104a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
105a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
106cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
107585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
10880c34ca3SBram Moolenaar  &ts = 8
109a8c17704SBram Moolenaar
110a8c17704SBram Moolenaar  g:inc_counter += 1
111a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
112a8c17704SBram Moolenaar
113a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
114a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
115a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
116a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
117a8c17704SBram Moolenaar
118a8c17704SBram Moolenaar  @a = 'areg'
119a8c17704SBram Moolenaar  @a ..= 'add'
120a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
121a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
122a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
123e69f6d04SBram Moolenaar
124e69f6d04SBram Moolenaar  v:errmsg = 'none'
125e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
126e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
127e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
128e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
1295deeb3f1SBram Moolenaarenddef
1305deeb3f1SBram Moolenaar
131d3aac291SBram Moolenaardef Test_assignment_local()
132d3aac291SBram Moolenaar  " Test in a separated file in order not to the current buffer/window/tab is
133d3aac291SBram Moolenaar  " changed.
134d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
135d3aac291SBram Moolenaar    let b:existing = 'yes'
136d3aac291SBram Moolenaar    let w:existing = 'yes'
137d3aac291SBram Moolenaar    let t:existing = 'yes'
138d3aac291SBram Moolenaar
139d3aac291SBram Moolenaar    def Test_assignment_local_internal()
140d3aac291SBram Moolenaar      b:newvar = 'new'
141d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
142d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
143d3aac291SBram Moolenaar      b:existing = 'no'
144d3aac291SBram Moolenaar      assert_equal('no', b:existing)
145396f3138SBram Moolenaar      b:existing ..= 'NO'
146396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
147d3aac291SBram Moolenaar
148d3aac291SBram Moolenaar      w:newvar = 'new'
149d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
150d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
151d3aac291SBram Moolenaar      w:existing = 'no'
152d3aac291SBram Moolenaar      assert_equal('no', w:existing)
153396f3138SBram Moolenaar      w:existing ..= 'NO'
154396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
155d3aac291SBram Moolenaar
156d3aac291SBram Moolenaar      t:newvar = 'new'
157d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
158d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
159d3aac291SBram Moolenaar      t:existing = 'no'
160d3aac291SBram Moolenaar      assert_equal('no', t:existing)
161396f3138SBram Moolenaar      t:existing ..= 'NO'
162396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
163d3aac291SBram Moolenaar    enddef
164d3aac291SBram Moolenaar    call Test_assignment_local_internal()
165d3aac291SBram Moolenaar  END
166d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
167d3aac291SBram Moolenaarenddef
168d3aac291SBram Moolenaar
1695deeb3f1SBram Moolenaardef Test_assignment_default()
170e69f6d04SBram Moolenaar
171cb711abfSBram Moolenaar  # Test default values.
172e69f6d04SBram Moolenaar  let thebool: bool
173e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
174e69f6d04SBram Moolenaar
175e69f6d04SBram Moolenaar  let thenumber: number
176e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
177e69f6d04SBram Moolenaar
178e69f6d04SBram Moolenaar  if has('float')
179e69f6d04SBram Moolenaar    let thefloat: float
180e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
181e69f6d04SBram Moolenaar  endif
182e69f6d04SBram Moolenaar
183e69f6d04SBram Moolenaar  let thestring: string
184e69f6d04SBram Moolenaar  assert_equal('', thestring)
185e69f6d04SBram Moolenaar
186e69f6d04SBram Moolenaar  let theblob: blob
187e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
188e69f6d04SBram Moolenaar
1895deeb3f1SBram Moolenaar  let Thefunc: func
1905deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
191e69f6d04SBram Moolenaar
192e69f6d04SBram Moolenaar  let thelist: list<any>
193e69f6d04SBram Moolenaar  assert_equal([], thelist)
194e69f6d04SBram Moolenaar
195e69f6d04SBram Moolenaar  let thedict: dict<any>
196e69f6d04SBram Moolenaar  assert_equal({}, thedict)
197e69f6d04SBram Moolenaar
1982c869deeSBram Moolenaar  if has('channel')
199e69f6d04SBram Moolenaar    let thejob: job
200e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
201e69f6d04SBram Moolenaar
202e69f6d04SBram Moolenaar    let thechannel: channel
203e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
2042c869deeSBram Moolenaar  endif
205585fea7bSBram Moolenaar
206585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
207585fea7bSBram Moolenaar  assert_equal(5678, nr)
2088a7d6542SBram Moolenaarenddef
2098a7d6542SBram Moolenaar
210cab27678SBram Moolenaardef Mess(): string
211cab27678SBram Moolenaar  v:foldstart = 123
212cab27678SBram Moolenaar  return 'xxx'
213cab27678SBram Moolenaarenddef
214cab27678SBram Moolenaar
215d72c1bf0SBram Moolenaardef Test_assignment_failure()
2168a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
2178a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
2188a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
2198a7d6542SBram Moolenaar
2208a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
2218a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
2228a7d6542SBram Moolenaar
2239be61bbbSBram Moolenaar  call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
2249be61bbbSBram Moolenaar
225e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
2269be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
2279be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
2289be61bbbSBram Moolenaar
2299be61bbbSBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1065:')
2309be61bbbSBram Moolenaar
2319be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
2329be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
2339be61bbbSBram Moolenaar
2349be61bbbSBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016:')
235d3aac291SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1079:')
236d3aac291SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1078:')
237d3aac291SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1080:')
2389be61bbbSBram Moolenaar
2399be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
2409be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
2419be61bbbSBram Moolenaar
24233fa29cfSBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
24333fa29cfSBram Moolenaar
2448a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
2458a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
2468a7d6542SBram Moolenaar
2478a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
2488a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
2498a7d6542SBram Moolenaar
2508a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
2518a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
25242a480bfSBram Moolenaar
253d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
25442a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
255cab27678SBram Moolenaar
256cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
257cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
258d72c1bf0SBram Moolenaarenddef
259d72c1bf0SBram Moolenaar
260d72c1bf0SBram Moolenaardef Test_unlet()
261d72c1bf0SBram Moolenaar  g:somevar = 'yes'
262d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
263d72c1bf0SBram Moolenaar  unlet g:somevar
264d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
265d72c1bf0SBram Moolenaar  unlet! g:somevar
266d72c1bf0SBram Moolenaar
267d72c1bf0SBram Moolenaar  call CheckScriptFailure([
268d72c1bf0SBram Moolenaar        'vim9script',
269d72c1bf0SBram Moolenaar        'let svar = 123',
270d72c1bf0SBram Moolenaar        'unlet svar',
271d72c1bf0SBram Moolenaar        ], 'E1081:')
272d72c1bf0SBram Moolenaar  call CheckScriptFailure([
273d72c1bf0SBram Moolenaar        'vim9script',
274d72c1bf0SBram Moolenaar        'let svar = 123',
275d72c1bf0SBram Moolenaar        'unlet s:svar',
276d72c1bf0SBram Moolenaar        ], 'E1081:')
277d72c1bf0SBram Moolenaar  call CheckScriptFailure([
278d72c1bf0SBram Moolenaar        'vim9script',
279d72c1bf0SBram Moolenaar        'let svar = 123',
280d72c1bf0SBram Moolenaar        'def Func()',
281d72c1bf0SBram Moolenaar        '  unlet svar',
282d72c1bf0SBram Moolenaar        'enddef',
283d72c1bf0SBram Moolenaar        ], 'E1081:')
284d72c1bf0SBram Moolenaar  call CheckScriptFailure([
285d72c1bf0SBram Moolenaar        'vim9script',
286d72c1bf0SBram Moolenaar        'let svar = 123',
287d72c1bf0SBram Moolenaar        'def Func()',
288d72c1bf0SBram Moolenaar        '  unlet s:svar',
289d72c1bf0SBram Moolenaar        'enddef',
290d72c1bf0SBram Moolenaar        ], 'E1081:')
2917bdaea6eSBram Moolenaar
2927bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
2937bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
2947bdaea6eSBram Moolenaar  unlet $ENVVAR
2957bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
296d72c1bf0SBram Moolenaarenddef
297599c89c8SBram Moolenaar
2984c17ad94SBram Moolenaardef Test_delfunction()
2994c17ad94SBram Moolenaar  " Check function is defined in script namespace
3004c17ad94SBram Moolenaar  CheckScriptSuccess([
3014c17ad94SBram Moolenaar      'vim9script',
3024c17ad94SBram Moolenaar      'func CheckMe()',
3034c17ad94SBram Moolenaar      '  return 123',
3044c17ad94SBram Moolenaar      'endfunc',
3054c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
3064c17ad94SBram Moolenaar      ])
3074c17ad94SBram Moolenaar
3084c17ad94SBram Moolenaar  " Check function in script namespace cannot be deleted
3094c17ad94SBram Moolenaar  CheckScriptFailure([
3104c17ad94SBram Moolenaar      'vim9script',
3114c17ad94SBram Moolenaar      'func DeleteMe1()',
3124c17ad94SBram Moolenaar      'endfunc',
3134c17ad94SBram Moolenaar      'delfunction DeleteMe1',
3144c17ad94SBram Moolenaar      ], 'E1084:')
3154c17ad94SBram Moolenaar  CheckScriptFailure([
3164c17ad94SBram Moolenaar      'vim9script',
3174c17ad94SBram Moolenaar      'func DeleteMe2()',
3184c17ad94SBram Moolenaar      'endfunc',
3194c17ad94SBram Moolenaar      'def DoThat()',
3204c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
3214c17ad94SBram Moolenaar      'enddef',
3224c17ad94SBram Moolenaar      'DoThat()',
3234c17ad94SBram Moolenaar      ], 'E1084:')
3244c17ad94SBram Moolenaar  CheckScriptFailure([
3254c17ad94SBram Moolenaar      'vim9script',
3264c17ad94SBram Moolenaar      'def DeleteMe3()',
3274c17ad94SBram Moolenaar      'enddef',
3284c17ad94SBram Moolenaar      'delfunction DeleteMe3',
3294c17ad94SBram Moolenaar      ], 'E1084:')
3304c17ad94SBram Moolenaar  CheckScriptFailure([
3314c17ad94SBram Moolenaar      'vim9script',
3324c17ad94SBram Moolenaar      'def DeleteMe4()',
3334c17ad94SBram Moolenaar      'enddef',
3344c17ad94SBram Moolenaar      'def DoThat()',
3354c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
3364c17ad94SBram Moolenaar      'enddef',
3374c17ad94SBram Moolenaar      'DoThat()',
3384c17ad94SBram Moolenaar      ], 'E1084:')
3394c17ad94SBram Moolenaarenddef
3404c17ad94SBram Moolenaar
341599c89c8SBram Moolenaarfunc Test_wrong_type()
342599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
343599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
344599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
345599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
346599c89c8SBram Moolenaar
347599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
348599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
34942a480bfSBram Moolenaar
35042a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
35142a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
35242a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
35342a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
35442a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
35542a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
35642a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
35742a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
35842a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
35942a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
36042a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
361a0a9f43aSBram Moolenaar
362a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
363a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
3648a7d6542SBram Moolenaarendfunc
3658a7d6542SBram Moolenaar
3668a7d6542SBram Moolenaarfunc Test_const()
3678a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
3688a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
3698a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
3709be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
3718a7d6542SBram Moolenaarendfunc
3728a7d6542SBram Moolenaar
3738a7d6542SBram Moolenaardef Test_block()
3748a7d6542SBram Moolenaar  let outer = 1
3758a7d6542SBram Moolenaar  {
3768a7d6542SBram Moolenaar    let inner = 2
3778a7d6542SBram Moolenaar    assert_equal(1, outer)
3788a7d6542SBram Moolenaar    assert_equal(2, inner)
3798a7d6542SBram Moolenaar  }
3808a7d6542SBram Moolenaar  assert_equal(1, outer)
3818a7d6542SBram Moolenaarenddef
3828a7d6542SBram Moolenaar
3838a7d6542SBram Moolenaarfunc Test_block_failure()
3848a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
385585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
386585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
3878a7d6542SBram Moolenaarendfunc
3888a7d6542SBram Moolenaar
389585fea7bSBram Moolenaardef Test_cmd_modifier()
390585fea7bSBram Moolenaar  tab echo '0'
391585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
392585fea7bSBram Moolenaarenddef
393585fea7bSBram Moolenaar
3948a7d6542SBram Moolenaardef Test_try_catch()
3958a7d6542SBram Moolenaar  let l = []
3967a092245SBram Moolenaar  try # comment
3978a7d6542SBram Moolenaar    add(l, '1')
3988a7d6542SBram Moolenaar    throw 'wrong'
3998a7d6542SBram Moolenaar    add(l, '2')
4007a092245SBram Moolenaar  catch # comment
4018a7d6542SBram Moolenaar    add(l, v:exception)
4027a092245SBram Moolenaar  finally # comment
4038a7d6542SBram Moolenaar    add(l, '3')
4047a092245SBram Moolenaar  endtry # comment
4058a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
4068a7d6542SBram Moolenaarenddef
4078a7d6542SBram Moolenaar
408257cc5eeSBram Moolenaardef ThrowFromDef()
409a72cfb80SBram Moolenaar  throw "getout" # comment
410257cc5eeSBram Moolenaarenddef
411257cc5eeSBram Moolenaar
412257cc5eeSBram Moolenaarfunc CatchInFunc()
413257cc5eeSBram Moolenaar  try
414257cc5eeSBram Moolenaar    call ThrowFromDef()
415257cc5eeSBram Moolenaar  catch
416257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
417257cc5eeSBram Moolenaar  endtry
418257cc5eeSBram Moolenaarendfunc
419257cc5eeSBram Moolenaar
420257cc5eeSBram Moolenaardef CatchInDef()
421257cc5eeSBram Moolenaar  try
422257cc5eeSBram Moolenaar    ThrowFromDef()
423257cc5eeSBram Moolenaar  catch
424257cc5eeSBram Moolenaar    g:thrown_def = v:exception
425257cc5eeSBram Moolenaar  endtry
426257cc5eeSBram Moolenaarenddef
427257cc5eeSBram Moolenaar
428f575adffSBram Moolenaardef ReturnFinally(): string
429f575adffSBram Moolenaar  try
430f575adffSBram Moolenaar    return 'intry'
431f575adffSBram Moolenaar  finally
432f575adffSBram Moolenaar    g:in_finally = 'finally'
433f575adffSBram Moolenaar  endtry
434f575adffSBram Moolenaar  return 'end'
435f575adffSBram Moolenaarenddef
436f575adffSBram Moolenaar
437257cc5eeSBram Moolenaardef Test_try_catch_nested()
438257cc5eeSBram Moolenaar  CatchInFunc()
439257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
440257cc5eeSBram Moolenaar
441257cc5eeSBram Moolenaar  CatchInDef()
442257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
443f575adffSBram Moolenaar
444f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
445f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
446f575adffSBram Moolenaarenddef
447f575adffSBram Moolenaar
448f575adffSBram Moolenaardef Test_try_catch_match()
449f575adffSBram Moolenaar  let seq = 'a'
450f575adffSBram Moolenaar  try
451f575adffSBram Moolenaar    throw 'something'
452f575adffSBram Moolenaar  catch /nothing/
453f575adffSBram Moolenaar    seq ..= 'x'
454f575adffSBram Moolenaar  catch /some/
455f575adffSBram Moolenaar    seq ..= 'b'
456f575adffSBram Moolenaar  catch /asdf/
457f575adffSBram Moolenaar    seq ..= 'x'
458e8c4abbbSBram Moolenaar  catch ?a\?sdf?
459e8c4abbbSBram Moolenaar    seq ..= 'y'
460f575adffSBram Moolenaar  finally
461f575adffSBram Moolenaar    seq ..= 'c'
462f575adffSBram Moolenaar  endtry
463f575adffSBram Moolenaar  assert_equal('abc', seq)
464257cc5eeSBram Moolenaarenddef
465257cc5eeSBram Moolenaar
466e8c4abbbSBram Moolenaardef Test_try_catch_fails()
467e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
468e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
469e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
470585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
471585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
472585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
473585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
474585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
475585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
476585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
477585fea7bSBram Moolenaar
478a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
479585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
480e8c4abbbSBram Moolenaarenddef
481e8c4abbbSBram Moolenaar
4822a1381c3SBram Moolenaarif has('channel')
48340ee466cSBram Moolenaar  let someJob = test_null_job()
48440ee466cSBram Moolenaar
48540ee466cSBram Moolenaar  def FuncWithError()
48640ee466cSBram Moolenaar    echomsg g:someJob
48740ee466cSBram Moolenaar  enddef
48840ee466cSBram Moolenaar
48940ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
49040ee466cSBram Moolenaar    try
49140ee466cSBram Moolenaar      call FuncWithError()
49240ee466cSBram Moolenaar    catch
49340ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
49440ee466cSBram Moolenaar    endtry
49540ee466cSBram Moolenaar  endfunc
4962a1381c3SBram Moolenaarendif
49740ee466cSBram Moolenaar
4988a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
4998a7d6542SBram Moolenaar  vim9script
5008a7d6542SBram Moolenaar  let name: string = 'bob'
5018a7d6542SBram Moolenaar  def Concat(arg: string): string
5028a7d6542SBram Moolenaar    return name .. arg
5038a7d6542SBram Moolenaar  enddef
504227a69deSBram Moolenaar  g:result = Concat('bie')
505227a69deSBram Moolenaar  g:localname = name
5068a7d6542SBram Moolenaar
5078a7d6542SBram Moolenaar  export const CONST = 1234
5088a7d6542SBram Moolenaar  export let exported = 9876
5096e587dcbSBram Moolenaar  export let exp_name = 'John'
5108a7d6542SBram Moolenaar  export def Exported(): string
5118a7d6542SBram Moolenaar    return 'Exported'
5128a7d6542SBram Moolenaar  enddef
5138a7d6542SBram MoolenaarEND
5148a7d6542SBram Moolenaar
5155269bd2aSBram Moolenaardef Test_vim9_import_export()
5168a7d6542SBram Moolenaar  let import_script_lines =<< trim END
5178a7d6542SBram Moolenaar    vim9script
5188a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
5198a7d6542SBram Moolenaar    g:imported = exported
5206e587dcbSBram Moolenaar    exported += 3
5216e587dcbSBram Moolenaar    g:imported_added = exported
5228a7d6542SBram Moolenaar    g:imported_func = Exported()
5236e587dcbSBram Moolenaar
5246e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
5256e587dcbSBram Moolenaar    g:imported_name = exp_name
5266e587dcbSBram Moolenaar    exp_name ..= ' Doe'
5276e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
5285381c7a1SBram Moolenaar    g:imported_later = exported
5298a7d6542SBram Moolenaar  END
5308a7d6542SBram Moolenaar
5318a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
5328a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
5338a7d6542SBram Moolenaar
5348a7d6542SBram Moolenaar  source Ximport.vim
5358a7d6542SBram Moolenaar
5368a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
5378a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
5388a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
5396e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
5405381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
5418a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
5426e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
5436e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
5448a7d6542SBram Moolenaar  assert_false(exists('g:name'))
5458a7d6542SBram Moolenaar
5468a7d6542SBram Moolenaar  unlet g:result
5478a7d6542SBram Moolenaar  unlet g:localname
5488a7d6542SBram Moolenaar  unlet g:imported
5496e587dcbSBram Moolenaar  unlet g:imported_added
5505381c7a1SBram Moolenaar  unlet g:imported_later
5518a7d6542SBram Moolenaar  unlet g:imported_func
5526e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
5538a7d6542SBram Moolenaar  delete('Ximport.vim')
554f2d5c240SBram Moolenaar
5555381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
5565381c7a1SBram Moolenaar    vim9script
5575381c7a1SBram Moolenaar    def ImportInDef()
5585381c7a1SBram Moolenaar      import exported from './Xexport.vim'
5595381c7a1SBram Moolenaar      g:imported = exported
5605381c7a1SBram Moolenaar      exported += 7
5615381c7a1SBram Moolenaar      g:imported_added = exported
5625381c7a1SBram Moolenaar    enddef
5635381c7a1SBram Moolenaar    ImportInDef()
5645381c7a1SBram Moolenaar  END
5655381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
5665381c7a1SBram Moolenaar  source Ximport2.vim
5675381c7a1SBram Moolenaar  " TODO: this should be 9879
5685381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
5695381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
5705381c7a1SBram Moolenaar  unlet g:imported
5715381c7a1SBram Moolenaar  unlet g:imported_added
5725381c7a1SBram Moolenaar  delete('Ximport2.vim')
5735381c7a1SBram Moolenaar
574f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
575f2d5c240SBram Moolenaar    vim9script
576f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
577f2d5c240SBram Moolenaar    def UseExport()
578f2d5c240SBram Moolenaar      g:imported = Export.exported
579f2d5c240SBram Moolenaar    enddef
580f2d5c240SBram Moolenaar    UseExport()
581f2d5c240SBram Moolenaar  END
582f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
583f2d5c240SBram Moolenaar  source Ximport.vim
5845381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
585f2d5c240SBram Moolenaar
586599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
587599c89c8SBram Moolenaar    vim9script
588599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
589599c89c8SBram Moolenaar    def Func()
590599c89c8SBram Moolenaar      let dummy = 1
591599c89c8SBram Moolenaar      let imported = Export + dummy
592599c89c8SBram Moolenaar    enddef
593599c89c8SBram Moolenaar  END
594599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
595599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
596599c89c8SBram Moolenaar
597599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
598599c89c8SBram Moolenaar    vim9script
599599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
600599c89c8SBram Moolenaar    def Func()
601599c89c8SBram Moolenaar      let imported = Export . exported
602599c89c8SBram Moolenaar    enddef
603599c89c8SBram Moolenaar  END
604599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
605599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
606599c89c8SBram Moolenaar
607599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
608599c89c8SBram Moolenaar    vim9script
609599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
610599c89c8SBram Moolenaar    def Func()
611599c89c8SBram Moolenaar      let imported = Export.
612599c89c8SBram Moolenaar    enddef
613599c89c8SBram Moolenaar  END
614599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
615599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
616599c89c8SBram Moolenaar
617f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
618f2d5c240SBram Moolenaar    vim9script
619f2d5c240SBram Moolenaar    import * from './Xexport.vim'
620f2d5c240SBram Moolenaar  END
621f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
622f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
623f2d5c240SBram Moolenaar
624fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
625fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
626fa29c8abSBram Moolenaar    vim9script
627fa29c8abSBram Moolenaar    import name from './Xexport.vim'
628fa29c8abSBram Moolenaar  END
629fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
630fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
631fa29c8abSBram Moolenaar
6325269bd2aSBram Moolenaar  " try to import something that is already defined
6335269bd2aSBram Moolenaar  let import_already_defined =<< trim END
6345269bd2aSBram Moolenaar    vim9script
6355269bd2aSBram Moolenaar    let exported = 'something'
6365269bd2aSBram Moolenaar    import exported from './Xexport.vim'
6375269bd2aSBram Moolenaar  END
6385269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6395269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6405269bd2aSBram Moolenaar
6415269bd2aSBram Moolenaar  " try to import something that is already defined
6425269bd2aSBram Moolenaar  import_already_defined =<< trim END
6435269bd2aSBram Moolenaar    vim9script
6445269bd2aSBram Moolenaar    let exported = 'something'
6455269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
6465269bd2aSBram Moolenaar  END
6475269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6485269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6495269bd2aSBram Moolenaar
6505269bd2aSBram Moolenaar  " try to import something that is already defined
6515269bd2aSBram Moolenaar  import_already_defined =<< trim END
6525269bd2aSBram Moolenaar    vim9script
6535269bd2aSBram Moolenaar    let exported = 'something'
6545269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
6555269bd2aSBram Moolenaar  END
6565269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
6575269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
6585269bd2aSBram Moolenaar
659fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
660fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
661fa29c8abSBram Moolenaar    vim9script
662fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
663fa29c8abSBram Moolenaar  END
664fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
665fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
666fa29c8abSBram Moolenaar
667fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
668fa29c8abSBram Moolenaar    vim9script
669fa29c8abSBram Moolenaar    import name './Xexport.vim'
670fa29c8abSBram Moolenaar  END
671fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
672fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
673fa29c8abSBram Moolenaar
674fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
675fa29c8abSBram Moolenaar    vim9script
676fa29c8abSBram Moolenaar    import name from Xexport.vim
677fa29c8abSBram Moolenaar  END
678fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
679fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
680fa29c8abSBram Moolenaar
681fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
682fa29c8abSBram Moolenaar    vim9script
683fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
684fa29c8abSBram Moolenaar  END
685fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
686fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
687fa29c8abSBram Moolenaar
688fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
689fa29c8abSBram Moolenaar    vim9script
690fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
691fa29c8abSBram Moolenaar  END
6925269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
6935269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
694fa29c8abSBram Moolenaar
695f2d5c240SBram Moolenaar  delete('Ximport.vim')
6965269bd2aSBram Moolenaar  delete('Ximport3.vim')
6978a7d6542SBram Moolenaar  delete('Xexport.vim')
6988a7d6542SBram Moolenaar
699750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
700750802b5SBram Moolenaar  set cpo&vi
701750802b5SBram Moolenaar  let cpo_before = &cpo
702750802b5SBram Moolenaar  let lines =<< trim END
703750802b5SBram Moolenaar    vim9script
704750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
705750802b5SBram Moolenaar  END
706750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
707750802b5SBram Moolenaar  source Xvim9_script
708750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
709750802b5SBram Moolenaar  set cpo&vim
710750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
711750802b5SBram Moolenaar  delete('Xvim9_script')
712750802b5SBram Moolenaarenddef
713750802b5SBram Moolenaar
714750802b5SBram Moolenaardef Test_vim9script_fails()
7158a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
7168a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
717750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
718f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
719750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
720750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
721750802b5SBram Moolenaar
722750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
723a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
7248a7d6542SBram Moolenaarenddef
7258a7d6542SBram Moolenaar
7264c17ad94SBram Moolenaardef Test_vim9script_reload_import()
7278a7d6542SBram Moolenaar  let lines =<< trim END
7288a7d6542SBram Moolenaar    vim9script
7298a7d6542SBram Moolenaar    const var = ''
7308a7d6542SBram Moolenaar    let valone = 1234
7318a7d6542SBram Moolenaar    def MyFunc(arg: string)
7328a7d6542SBram Moolenaar       valone = 5678
7338a7d6542SBram Moolenaar    enddef
7348a7d6542SBram Moolenaar  END
7358a7d6542SBram Moolenaar  let morelines =<< trim END
7368a7d6542SBram Moolenaar    let valtwo = 222
7378a7d6542SBram Moolenaar    export def GetValtwo(): number
7388a7d6542SBram Moolenaar      return valtwo
7398a7d6542SBram Moolenaar    enddef
7408a7d6542SBram Moolenaar  END
74103afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
7428a7d6542SBram Moolenaar  source Xreload.vim
7438a7d6542SBram Moolenaar  source Xreload.vim
7448a7d6542SBram Moolenaar  source Xreload.vim
7458a7d6542SBram Moolenaar
7468a7d6542SBram Moolenaar  let testlines =<< trim END
7478a7d6542SBram Moolenaar    vim9script
7488a7d6542SBram Moolenaar    def TheFunc()
7498a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
7508a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
7518a7d6542SBram Moolenaar    enddef
7528a7d6542SBram Moolenaar    TheFunc()
7538a7d6542SBram Moolenaar  END
7548a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
7558a7d6542SBram Moolenaar  source Ximport.vim
7568a7d6542SBram Moolenaar
75703afdcf1SBram Moolenaar  " Test that when not using "morelines" GetValtwo() and valtwo are still
75803afdcf1SBram Moolenaar  " defined, because import doesn't reload a script.
7598a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
7608a7d6542SBram Moolenaar  source Ximport.vim
7618a7d6542SBram Moolenaar
7628a7d6542SBram Moolenaar  " cannot declare a var twice
7638a7d6542SBram Moolenaar  lines =<< trim END
7648a7d6542SBram Moolenaar    vim9script
7658a7d6542SBram Moolenaar    let valone = 1234
7668a7d6542SBram Moolenaar    let valone = 5678
7678a7d6542SBram Moolenaar  END
7688a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
7698a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
7708a7d6542SBram Moolenaar
7718a7d6542SBram Moolenaar  delete('Xreload.vim')
7728a7d6542SBram Moolenaar  delete('Ximport.vim')
7738a7d6542SBram Moolenaarenddef
7748a7d6542SBram Moolenaar
7754c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
7764c17ad94SBram Moolenaar  let first_lines =<< trim END
7774c17ad94SBram Moolenaar    vim9script
7784c17ad94SBram Moolenaar    def FuncYes(): string
7794c17ad94SBram Moolenaar      return 'yes'
7804c17ad94SBram Moolenaar    enddef
7814c17ad94SBram Moolenaar  END
78203afdcf1SBram Moolenaar  let withno_lines =<< trim END
7834c17ad94SBram Moolenaar    def FuncNo(): string
7844c17ad94SBram Moolenaar      return 'no'
7854c17ad94SBram Moolenaar    enddef
7864c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
7874c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
7884c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
78903afdcf1SBram Moolenaar    enddef
79003afdcf1SBram Moolenaar  END
79103afdcf1SBram Moolenaar  let nono_lines =<< trim END
79203afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
79303afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
7944c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
7954c17ad94SBram Moolenaar    enddef
7964c17ad94SBram Moolenaar  END
7974c17ad94SBram Moolenaar
7984c17ad94SBram Moolenaar  # FuncNo() is defined
79903afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
8004c17ad94SBram Moolenaar  source Xreloaded.vim
8014c17ad94SBram Moolenaar  g:DoCheck(true)
8024c17ad94SBram Moolenaar
8034c17ad94SBram Moolenaar  # FuncNo() is not redefined
80403afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
8054c17ad94SBram Moolenaar  source Xreloaded.vim
80603afdcf1SBram Moolenaar  g:DoCheck()
8074c17ad94SBram Moolenaar
8084c17ad94SBram Moolenaar  # FuncNo() is back
80903afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
8104c17ad94SBram Moolenaar  source Xreloaded.vim
81103afdcf1SBram Moolenaar  g:DoCheck()
8124c17ad94SBram Moolenaar
8134c17ad94SBram Moolenaar  delete('Xreloaded.vim')
8144c17ad94SBram Moolenaarenddef
8154c17ad94SBram Moolenaar
81689483d40SBram Moolenaardef Test_vim9script_reload_delvar()
81789483d40SBram Moolenaar  # write the script with a script-local variable
81889483d40SBram Moolenaar  let lines =<< trim END
81989483d40SBram Moolenaar    vim9script
82089483d40SBram Moolenaar    let var = 'string'
82189483d40SBram Moolenaar  END
82289483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
82389483d40SBram Moolenaar  source XreloadVar.vim
82489483d40SBram Moolenaar
82589483d40SBram Moolenaar  # now write the script using the same variable locally - works
82689483d40SBram Moolenaar  lines =<< trim END
82789483d40SBram Moolenaar    vim9script
82889483d40SBram Moolenaar    def Func()
82989483d40SBram Moolenaar      let var = 'string'
83089483d40SBram Moolenaar    enddef
83189483d40SBram Moolenaar  END
83289483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
83389483d40SBram Moolenaar  source XreloadVar.vim
83489483d40SBram Moolenaar
83589483d40SBram Moolenaar  delete('XreloadVar.vim')
83689483d40SBram Moolenaarenddef
83789483d40SBram Moolenaar
8388a7d6542SBram Moolenaardef Test_import_absolute()
8398a7d6542SBram Moolenaar  let import_lines = [
840e6085c53SBram Moolenaar        'vim9script',
841e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
842e6085c53SBram Moolenaar        'def UseExported()',
843e6085c53SBram Moolenaar        '  g:imported_abs = exported',
844e6085c53SBram Moolenaar        '  exported = 8888',
845e6085c53SBram Moolenaar        '  g:imported_after = exported',
846e6085c53SBram Moolenaar        'enddef',
847e6085c53SBram Moolenaar        'UseExported()',
848e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
849e6085c53SBram Moolenaar        ]
8508a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
8518a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
8528a7d6542SBram Moolenaar
8538a7d6542SBram Moolenaar  source Ximport_abs.vim
8548a7d6542SBram Moolenaar
8558a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
8564e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
857675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
858675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
859675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
860675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
861675f716eSBram Moolenaar          'exported = 8888.*' ..
862675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
863675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
864675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
865675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
866e6085c53SBram Moolenaar        g:import_disassembled)
8678a7d6542SBram Moolenaar  unlet g:imported_abs
8684e12a5dfSBram Moolenaar  unlet g:import_disassembled
8698a7d6542SBram Moolenaar
8708a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
8718a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
8728a7d6542SBram Moolenaarenddef
8738a7d6542SBram Moolenaar
8748a7d6542SBram Moolenaardef Test_import_rtp()
8758a7d6542SBram Moolenaar  let import_lines = [
876e6085c53SBram Moolenaar        'vim9script',
877e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
878e6085c53SBram Moolenaar        'g:imported_rtp = exported',
879e6085c53SBram Moolenaar        ]
8808a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
8818a7d6542SBram Moolenaar  mkdir('import')
8828a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
8838a7d6542SBram Moolenaar
8848a7d6542SBram Moolenaar  let save_rtp = &rtp
8858a7d6542SBram Moolenaar  &rtp = getcwd()
8868a7d6542SBram Moolenaar  source Ximport_rtp.vim
8878a7d6542SBram Moolenaar  &rtp = save_rtp
8888a7d6542SBram Moolenaar
8898a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
8908a7d6542SBram Moolenaar  unlet g:imported_rtp
8918a7d6542SBram Moolenaar
8928a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
89389483d40SBram Moolenaar  delete('import', 'rf')
8948a7d6542SBram Moolenaarenddef
8958a7d6542SBram Moolenaar
8968a7d6542SBram Moolenaardef Test_fixed_size_list()
8978a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
8988a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
8998a7d6542SBram Moolenaar  l->remove(0)
9008a7d6542SBram Moolenaar  l->add(5)
9018a7d6542SBram Moolenaar  l->insert(99, 1)
9020f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
9038a7d6542SBram Moolenaarenddef
9048a7d6542SBram Moolenaar
905158906cfSBram Moolenaardef IfElse(what: number): string
906158906cfSBram Moolenaar  let res = ''
907158906cfSBram Moolenaar  if what == 1
908158906cfSBram Moolenaar    res = "one"
909158906cfSBram Moolenaar  elseif what == 2
910158906cfSBram Moolenaar    res = "two"
911a259d8d3SBram Moolenaar  else
912158906cfSBram Moolenaar    res = "three"
913a259d8d3SBram Moolenaar  endif
914158906cfSBram Moolenaar  return res
915a259d8d3SBram Moolenaarenddef
916a259d8d3SBram Moolenaar
917158906cfSBram Moolenaardef Test_if_elseif_else()
918158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
919158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
920158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
9210f18b6d1SBram Moolenaarenddef
9220f18b6d1SBram Moolenaar
923e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
924e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
925e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
926e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
927e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
928585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
929e8c4abbbSBram Moolenaarenddef
930e8c4abbbSBram Moolenaar
9316d69bf60SBram Moolenaarlet g:bool_true = v:true
9326d69bf60SBram Moolenaarlet g:bool_false = v:false
9336d69bf60SBram Moolenaar
9346d69bf60SBram Moolenaardef Test_if_const_expr()
9356d69bf60SBram Moolenaar  let res = false
9366d69bf60SBram Moolenaar  if true ? true : false
9376d69bf60SBram Moolenaar    res = true
9386d69bf60SBram Moolenaar  endif
9396d69bf60SBram Moolenaar  assert_equal(true, res)
9406d69bf60SBram Moolenaar
941585fea7bSBram Moolenaar  g:glob = 2
942585fea7bSBram Moolenaar  if false
943585fea7bSBram Moolenaar    execute('let g:glob = 3')
944585fea7bSBram Moolenaar  endif
945585fea7bSBram Moolenaar  assert_equal(2, g:glob)
946585fea7bSBram Moolenaar  if true
947585fea7bSBram Moolenaar    execute('let g:glob = 3')
948585fea7bSBram Moolenaar  endif
949585fea7bSBram Moolenaar  assert_equal(3, g:glob)
950585fea7bSBram Moolenaar
9516d69bf60SBram Moolenaar  res = false
9526d69bf60SBram Moolenaar  if g:bool_true ? true : false
9536d69bf60SBram Moolenaar    res = true
9546d69bf60SBram Moolenaar  endif
9556d69bf60SBram Moolenaar  assert_equal(true, res)
9566d69bf60SBram Moolenaar
9576d69bf60SBram Moolenaar  res = false
9586d69bf60SBram Moolenaar  if true ? g:bool_true : false
9596d69bf60SBram Moolenaar    res = true
9606d69bf60SBram Moolenaar  endif
9616d69bf60SBram Moolenaar  assert_equal(true, res)
9626d69bf60SBram Moolenaar
9636d69bf60SBram Moolenaar  res = false
9646d69bf60SBram Moolenaar  if true ? true : g:bool_false
9656d69bf60SBram Moolenaar    res = true
9666d69bf60SBram Moolenaar  endif
9676d69bf60SBram Moolenaar  assert_equal(true, res)
9686d69bf60SBram Moolenaar
9696d69bf60SBram Moolenaar  res = false
9706d69bf60SBram Moolenaar  if true ? false : true
9716d69bf60SBram Moolenaar    res = true
9726d69bf60SBram Moolenaar  endif
9736d69bf60SBram Moolenaar  assert_equal(false, res)
9746d69bf60SBram Moolenaar
9756d69bf60SBram Moolenaar  res = false
9766d69bf60SBram Moolenaar  if false ? false : true
9776d69bf60SBram Moolenaar    res = true
9786d69bf60SBram Moolenaar  endif
9796d69bf60SBram Moolenaar  assert_equal(true, res)
9806d69bf60SBram Moolenaar
9816d69bf60SBram Moolenaar  res = false
9826d69bf60SBram Moolenaar  if false ? true : false
9836d69bf60SBram Moolenaar    res = true
9846d69bf60SBram Moolenaar  endif
9856d69bf60SBram Moolenaar  assert_equal(false, res)
9866d69bf60SBram Moolenaar
9876d69bf60SBram Moolenaar  res = false
988e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
989e8c4abbbSBram Moolenaar    res = true
990e8c4abbbSBram Moolenaar  endif
991e8c4abbbSBram Moolenaar  assert_equal(false, res)
992e8c4abbbSBram Moolenaar
993e8c4abbbSBram Moolenaar  res = false
9946d69bf60SBram Moolenaar  if true && true
9956d69bf60SBram Moolenaar    res = true
9966d69bf60SBram Moolenaar  endif
9976d69bf60SBram Moolenaar  assert_equal(true, res)
9986d69bf60SBram Moolenaar
9996d69bf60SBram Moolenaar  res = false
10006d69bf60SBram Moolenaar  if true && false
10016d69bf60SBram Moolenaar    res = true
10026d69bf60SBram Moolenaar  endif
10036d69bf60SBram Moolenaar  assert_equal(false, res)
10046d69bf60SBram Moolenaar
10056d69bf60SBram Moolenaar  res = false
10066d69bf60SBram Moolenaar  if g:bool_true && false
10076d69bf60SBram Moolenaar    res = true
10086d69bf60SBram Moolenaar  endif
10096d69bf60SBram Moolenaar  assert_equal(false, res)
10106d69bf60SBram Moolenaar
10116d69bf60SBram Moolenaar  res = false
10126d69bf60SBram Moolenaar  if true && g:bool_false
10136d69bf60SBram Moolenaar    res = true
10146d69bf60SBram Moolenaar  endif
10156d69bf60SBram Moolenaar  assert_equal(false, res)
10166d69bf60SBram Moolenaar
10176d69bf60SBram Moolenaar  res = false
10186d69bf60SBram Moolenaar  if false && false
10196d69bf60SBram Moolenaar    res = true
10206d69bf60SBram Moolenaar  endif
10216d69bf60SBram Moolenaar  assert_equal(false, res)
10226d69bf60SBram Moolenaar
10236d69bf60SBram Moolenaar  res = false
10246d69bf60SBram Moolenaar  if true || false
10256d69bf60SBram Moolenaar    res = true
10266d69bf60SBram Moolenaar  endif
10276d69bf60SBram Moolenaar  assert_equal(true, res)
10286d69bf60SBram Moolenaar
10296d69bf60SBram Moolenaar  res = false
10306d69bf60SBram Moolenaar  if g:bool_true || false
10316d69bf60SBram Moolenaar    res = true
10326d69bf60SBram Moolenaar  endif
10336d69bf60SBram Moolenaar  assert_equal(true, res)
10346d69bf60SBram Moolenaar
10356d69bf60SBram Moolenaar  res = false
10366d69bf60SBram Moolenaar  if true || g:bool_false
10376d69bf60SBram Moolenaar    res = true
10386d69bf60SBram Moolenaar  endif
10396d69bf60SBram Moolenaar  assert_equal(true, res)
10406d69bf60SBram Moolenaar
10416d69bf60SBram Moolenaar  res = false
10426d69bf60SBram Moolenaar  if false || false
10436d69bf60SBram Moolenaar    res = true
10446d69bf60SBram Moolenaar  endif
10456d69bf60SBram Moolenaar  assert_equal(false, res)
104680c34ca3SBram Moolenaarenddef
10476d69bf60SBram Moolenaar
104880c34ca3SBram Moolenaardef Test_if_const_expr_fails()
104980c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
105080c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1051e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1052e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
10536d69bf60SBram Moolenaarenddef
10546d69bf60SBram Moolenaar
1055ad39c094SBram Moolenaardef Test_execute_cmd()
1056ad39c094SBram Moolenaar  new
1057ad39c094SBram Moolenaar  setline(1, 'default')
1058ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1059ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1060a72cfb80SBram Moolenaar
1061a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1062a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1063a72cfb80SBram Moolenaar
1064ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1065ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1066a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1067ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1068a72cfb80SBram Moolenaar
1069ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1070ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1071a72cfb80SBram Moolenaar
1072ad39c094SBram Moolenaar  let cmd_first = 'call '
1073ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1074ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1075ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1076ad39c094SBram Moolenaar  bwipe!
1077585fea7bSBram Moolenaar
1078585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1079a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1080ad39c094SBram Moolenaarenddef
1081ad39c094SBram Moolenaar
1082ad39c094SBram Moolenaardef Test_echo_cmd()
1083a72cfb80SBram Moolenaar  echo 'some' # comment
1084585fea7bSBram Moolenaar  echon 'thing'
1085ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1086ad39c094SBram Moolenaar
1087a72cfb80SBram Moolenaar  echo "some" # comment
1088a72cfb80SBram Moolenaar  echon "thing"
1089a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1090a72cfb80SBram Moolenaar
1091ad39c094SBram Moolenaar  let str1 = 'some'
1092ad39c094SBram Moolenaar  let str2 = 'more'
1093ad39c094SBram Moolenaar  echo str1 str2
1094ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1095a72cfb80SBram Moolenaar
1096a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1097ad39c094SBram Moolenaarenddef
1098ad39c094SBram Moolenaar
1099f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1100f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1101f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1102f93c7feaSBram Moolenaar  echo 'clear'
1103f93c7feaSBram Moolenaar  1messages
1104f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1105f93c7feaSBram Moolenaar
1106f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1107f93c7feaSBram Moolenaarenddef
1108f93c7feaSBram Moolenaar
1109f93c7feaSBram Moolenaardef Test_echoerr_cmd()
111040ee466cSBram Moolenaar  try
111140ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
111240ee466cSBram Moolenaar  catch
111340ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
111440ee466cSBram Moolenaar  endtry
1115f93c7feaSBram Moolenaarenddef
1116f93c7feaSBram Moolenaar
111741fe0617SBram Moolenaardef Test_for_outside_of_function()
111841fe0617SBram Moolenaar  let lines =<< trim END
111941fe0617SBram Moolenaar    vim9script
112041fe0617SBram Moolenaar    new
112141fe0617SBram Moolenaar    for var in range(0, 3)
112241fe0617SBram Moolenaar      append(line('$'), var)
112341fe0617SBram Moolenaar    endfor
112441fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
112541fe0617SBram Moolenaar    bwipe!
112641fe0617SBram Moolenaar  END
112741fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
112841fe0617SBram Moolenaar  source Xvim9for.vim
112941fe0617SBram Moolenaar  delete('Xvim9for.vim')
113041fe0617SBram Moolenaarenddef
11318a7d6542SBram Moolenaar
1132e8c4abbbSBram Moolenaardef Test_for_loop()
1133e8c4abbbSBram Moolenaar  let result = ''
1134e8c4abbbSBram Moolenaar  for cnt in range(7)
1135e8c4abbbSBram Moolenaar    if cnt == 4
1136e8c4abbbSBram Moolenaar      break
1137e8c4abbbSBram Moolenaar    endif
1138e8c4abbbSBram Moolenaar    if cnt == 2
1139e8c4abbbSBram Moolenaar      continue
1140e8c4abbbSBram Moolenaar    endif
1141e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1142e8c4abbbSBram Moolenaar  endfor
1143e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
1144e8c4abbbSBram Moolenaarenddef
1145e8c4abbbSBram Moolenaar
1146e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1147675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1148675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1149675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
11506e949784SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef'], 'E1006:')
1151675f716eSBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1024:')
1152675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1153675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1154675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1155e8c4abbbSBram Moolenaarenddef
1156e8c4abbbSBram Moolenaar
1157d0df1aacSBram Moolenaardef Test_while_loop()
1158d0df1aacSBram Moolenaar  let result = ''
1159d0df1aacSBram Moolenaar  let cnt = 0
1160d0df1aacSBram Moolenaar  while cnt < 555
1161d0df1aacSBram Moolenaar    if cnt == 3
1162d0df1aacSBram Moolenaar      break
1163d0df1aacSBram Moolenaar    endif
1164d0df1aacSBram Moolenaar    cnt += 1
1165d0df1aacSBram Moolenaar    if cnt == 2
1166d0df1aacSBram Moolenaar      continue
1167d0df1aacSBram Moolenaar    endif
1168d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1169d0df1aacSBram Moolenaar  endwhile
1170d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1171d0df1aacSBram Moolenaarenddef
1172d0df1aacSBram Moolenaar
1173e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1174675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1175675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1176675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1177675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1178675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1179675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1180675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1181bd5da371SBram Moolenaarenddef
1182bd5da371SBram Moolenaar
11839645e2d9SBram Moolenaardef Test_interrupt_loop()
118497acfc78SBram Moolenaar  let caught = false
11859645e2d9SBram Moolenaar  let x = 0
118697acfc78SBram Moolenaar  try
11879645e2d9SBram Moolenaar    while 1
11889645e2d9SBram Moolenaar      x += 1
11899645e2d9SBram Moolenaar      if x == 100
11909645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
11919645e2d9SBram Moolenaar      endif
11929645e2d9SBram Moolenaar    endwhile
119397acfc78SBram Moolenaar  catch
119497acfc78SBram Moolenaar    caught = true
119597acfc78SBram Moolenaar    assert_equal(100, x)
119697acfc78SBram Moolenaar  endtry
119797acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
11989645e2d9SBram Moolenaarenddef
119920431c9dSBram Moolenaar
12004fdae999SBram Moolenaardef Test_automatic_line_continuation()
12014fdae999SBram Moolenaar  let mylist = [
12024fdae999SBram Moolenaar      'one',
12034fdae999SBram Moolenaar      'two',
12044fdae999SBram Moolenaar      'three',
12054fdae999SBram Moolenaar      ] " comment
12064fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
12074fdae999SBram Moolenaar
12084fdae999SBram Moolenaar  let mydict = {
12094fdae999SBram Moolenaar      'one': 1,
12104fdae999SBram Moolenaar      'two': 2,
12114fdae999SBram Moolenaar      'three':
12124fdae999SBram Moolenaar          3,
12134fdae999SBram Moolenaar      } " comment
12144fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
12154fdae999SBram Moolenaar  mydict = #{
12162c330432SBram Moolenaar      one: 1,  # comment
12172c330432SBram Moolenaar      two:     # comment
12182c330432SBram Moolenaar           2,  # comment
12192c330432SBram Moolenaar      three: 3 # comment
12202c330432SBram Moolenaar      }
12212c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
12222c330432SBram Moolenaar  mydict = #{
12232c330432SBram Moolenaar      one: 1,
12244fdae999SBram Moolenaar      two:
12254fdae999SBram Moolenaar           2,
12262c330432SBram Moolenaar      three: 3
12274fdae999SBram Moolenaar      }
12284fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1229e6085c53SBram Moolenaar
1230e6085c53SBram Moolenaar  assert_equal(
1231e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1232e6085c53SBram Moolenaar        split('one two three')
1233e6085c53SBram Moolenaar        )
12344fdae999SBram Moolenaarenddef
12354fdae999SBram Moolenaar
12367a092245SBram Moolenaardef Test_vim9_comment()
12377a092245SBram Moolenaar  CheckScriptSuccess([
12387a092245SBram Moolenaar      'vim9script',
12397a092245SBram Moolenaar      '# something',
12407a092245SBram Moolenaar      ])
12417a092245SBram Moolenaar  CheckScriptFailure([
12427a092245SBram Moolenaar      'vim9script',
12437a092245SBram Moolenaar      ':# something',
12447a092245SBram Moolenaar      ], 'E488:')
12457a092245SBram Moolenaar  CheckScriptFailure([
12467a092245SBram Moolenaar      '# something',
12477a092245SBram Moolenaar      ], 'E488:')
12487a092245SBram Moolenaar  CheckScriptFailure([
12497a092245SBram Moolenaar      ':# something',
12507a092245SBram Moolenaar      ], 'E488:')
12517a092245SBram Moolenaar
12524a8d9f2eSBram Moolenaar  { # block start
12534a8d9f2eSBram Moolenaar  } # block end
12544a8d9f2eSBram Moolenaar  CheckDefFailure([
12554a8d9f2eSBram Moolenaar      '{# comment',
12564a8d9f2eSBram Moolenaar      ], 'E488:')
12574a8d9f2eSBram Moolenaar  CheckDefFailure([
12584a8d9f2eSBram Moolenaar      '{',
12594a8d9f2eSBram Moolenaar      '}# comment',
12604a8d9f2eSBram Moolenaar      ], 'E488:')
12614a8d9f2eSBram Moolenaar
12624a8d9f2eSBram Moolenaar  echo "yes" # comment
12634a8d9f2eSBram Moolenaar  CheckDefFailure([
12644a8d9f2eSBram Moolenaar      'echo "yes"# comment',
12654a8d9f2eSBram Moolenaar      ], 'E488:')
12667a092245SBram Moolenaar  CheckScriptSuccess([
12677a092245SBram Moolenaar      'vim9script',
12687a092245SBram Moolenaar      'echo "yes" # something',
12697a092245SBram Moolenaar      ])
12707a092245SBram Moolenaar  CheckScriptFailure([
12717a092245SBram Moolenaar      'vim9script',
12727a092245SBram Moolenaar      'echo "yes"# something',
12737a092245SBram Moolenaar      ], 'E121:')
12747a092245SBram Moolenaar  CheckScriptFailure([
12757a092245SBram Moolenaar      'vim9script',
12767a092245SBram Moolenaar      'echo# something',
12777a092245SBram Moolenaar      ], 'E121:')
12787a092245SBram Moolenaar  CheckScriptFailure([
12797a092245SBram Moolenaar      'echo "yes" # something',
12807a092245SBram Moolenaar      ], 'E121:')
12817a092245SBram Moolenaar
12824a8d9f2eSBram Moolenaar  exe "echo" # comment
12834a8d9f2eSBram Moolenaar  CheckDefFailure([
12844a8d9f2eSBram Moolenaar      'exe "echo"# comment',
12854a8d9f2eSBram Moolenaar      ], 'E488:')
12864a8d9f2eSBram Moolenaar  CheckScriptSuccess([
12874a8d9f2eSBram Moolenaar      'vim9script',
12884a8d9f2eSBram Moolenaar      'exe "echo" # something',
12894a8d9f2eSBram Moolenaar      ])
12904a8d9f2eSBram Moolenaar  CheckScriptFailure([
12914a8d9f2eSBram Moolenaar      'vim9script',
12924a8d9f2eSBram Moolenaar      'exe "echo"# something',
12934a8d9f2eSBram Moolenaar      ], 'E121:')
12944a8d9f2eSBram Moolenaar  CheckDefFailure([
12954a8d9f2eSBram Moolenaar      'exe # comment',
12964a8d9f2eSBram Moolenaar      ], 'E1015:')
12974a8d9f2eSBram Moolenaar  CheckScriptFailure([
12984a8d9f2eSBram Moolenaar      'vim9script',
12994a8d9f2eSBram Moolenaar      'exe# something',
13004a8d9f2eSBram Moolenaar      ], 'E121:')
13014a8d9f2eSBram Moolenaar  CheckScriptFailure([
13024a8d9f2eSBram Moolenaar      'exe "echo" # something',
13034a8d9f2eSBram Moolenaar      ], 'E121:')
13044a8d9f2eSBram Moolenaar
13057a092245SBram Moolenaar  CheckDefFailure([
13067a092245SBram Moolenaar      'try# comment',
13077a092245SBram Moolenaar      '  echo "yes"',
13087a092245SBram Moolenaar      'catch',
13097a092245SBram Moolenaar      'endtry',
13107a092245SBram Moolenaar      ], 'E488:')
13112c5ed4e3SBram Moolenaar  CheckScriptFailure([
13122c5ed4e3SBram Moolenaar      'vim9script',
13132c5ed4e3SBram Moolenaar      'try# comment',
13142c5ed4e3SBram Moolenaar      'echo "yes"',
13152c5ed4e3SBram Moolenaar      ], 'E488:')
13167a092245SBram Moolenaar  CheckDefFailure([
13177a092245SBram Moolenaar      'try',
1318a72cfb80SBram Moolenaar      '  throw#comment',
1319a72cfb80SBram Moolenaar      'catch',
1320a72cfb80SBram Moolenaar      'endtry',
1321a72cfb80SBram Moolenaar      ], 'E1015:')
1322a72cfb80SBram Moolenaar  CheckDefFailure([
1323a72cfb80SBram Moolenaar      'try',
1324a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1325a72cfb80SBram Moolenaar      'catch',
1326a72cfb80SBram Moolenaar      'endtry',
1327a72cfb80SBram Moolenaar      ], 'E488:')
1328a72cfb80SBram Moolenaar  CheckDefFailure([
1329a72cfb80SBram Moolenaar      'try',
13307a092245SBram Moolenaar      '  echo "yes"',
13317a092245SBram Moolenaar      'catch# comment',
13327a092245SBram Moolenaar      'endtry',
13337a092245SBram Moolenaar      ], 'E488:')
13342c5ed4e3SBram Moolenaar  CheckScriptFailure([
13352c5ed4e3SBram Moolenaar      'vim9script',
13362c5ed4e3SBram Moolenaar      'try',
13372c5ed4e3SBram Moolenaar      '  echo "yes"',
13382c5ed4e3SBram Moolenaar      'catch# comment',
13392c5ed4e3SBram Moolenaar      'endtry',
13402c5ed4e3SBram Moolenaar      ], 'E654:')
13412c5ed4e3SBram Moolenaar  CheckDefFailure([
13422c5ed4e3SBram Moolenaar      'try',
13432c5ed4e3SBram Moolenaar      '  echo "yes"',
13442c5ed4e3SBram Moolenaar      'catch /pat/# comment',
13452c5ed4e3SBram Moolenaar      'endtry',
13462c5ed4e3SBram Moolenaar      ], 'E488:')
13477a092245SBram Moolenaar  CheckDefFailure([
13487a092245SBram Moolenaar      'try',
13497a092245SBram Moolenaar      'echo "yes"',
13507a092245SBram Moolenaar      'catch',
13517a092245SBram Moolenaar      'endtry# comment',
13527a092245SBram Moolenaar      ], 'E488:')
13532c5ed4e3SBram Moolenaar  CheckScriptFailure([
13542c5ed4e3SBram Moolenaar      'vim9script',
13552c5ed4e3SBram Moolenaar      'try',
13562c5ed4e3SBram Moolenaar      '  echo "yes"',
13572c5ed4e3SBram Moolenaar      'catch',
13582c5ed4e3SBram Moolenaar      'endtry# comment',
13592c5ed4e3SBram Moolenaar      ], 'E600:')
13602c5ed4e3SBram Moolenaar
13612c5ed4e3SBram Moolenaar  CheckScriptSuccess([
13622c5ed4e3SBram Moolenaar      'vim9script',
13632c5ed4e3SBram Moolenaar      'hi # comment',
13642c5ed4e3SBram Moolenaar      ])
13652c5ed4e3SBram Moolenaar  CheckScriptFailure([
13662c5ed4e3SBram Moolenaar      'vim9script',
13672c5ed4e3SBram Moolenaar      'hi# comment',
13682c5ed4e3SBram Moolenaar      ], 'E416:')
13691966c248SBram Moolenaar  CheckScriptSuccess([
13701966c248SBram Moolenaar      'vim9script',
13711966c248SBram Moolenaar      'hi Search # comment',
13721966c248SBram Moolenaar      ])
13731966c248SBram Moolenaar  CheckScriptFailure([
13741966c248SBram Moolenaar      'vim9script',
13751966c248SBram Moolenaar      'hi Search# comment',
13761966c248SBram Moolenaar      ], 'E416:')
13771966c248SBram Moolenaar  CheckScriptSuccess([
13781966c248SBram Moolenaar      'vim9script',
13791966c248SBram Moolenaar      'hi link This Search # comment',
13801966c248SBram Moolenaar      ])
13811966c248SBram Moolenaar  CheckScriptFailure([
13821966c248SBram Moolenaar      'vim9script',
13831966c248SBram Moolenaar      'hi link This That# comment',
13841966c248SBram Moolenaar      ], 'E413:')
13851966c248SBram Moolenaar  CheckScriptSuccess([
13861966c248SBram Moolenaar      'vim9script',
13871966c248SBram Moolenaar      'hi clear This # comment',
13881966c248SBram Moolenaar      'hi clear # comment',
13891966c248SBram Moolenaar      ])
13901966c248SBram Moolenaar  " not tested, because it doesn't give an error but a warning:
13911966c248SBram Moolenaar  " hi clear This# comment',
13921966c248SBram Moolenaar  CheckScriptFailure([
13931966c248SBram Moolenaar      'vim9script',
13941966c248SBram Moolenaar      'hi clear# comment',
13951966c248SBram Moolenaar      ], 'E416:')
13961966c248SBram Moolenaar
13971966c248SBram Moolenaar  CheckScriptSuccess([
13981966c248SBram Moolenaar      'vim9script',
13991966c248SBram Moolenaar      'hi Group term=bold',
14001966c248SBram Moolenaar      'match Group /todo/ # comment',
14011966c248SBram Moolenaar      ])
14021966c248SBram Moolenaar  CheckScriptFailure([
14031966c248SBram Moolenaar      'vim9script',
14041966c248SBram Moolenaar      'hi Group term=bold',
14051966c248SBram Moolenaar      'match Group /todo/# comment',
14061966c248SBram Moolenaar      ], 'E488:')
14071966c248SBram Moolenaar  CheckScriptSuccess([
14081966c248SBram Moolenaar      'vim9script',
14091966c248SBram Moolenaar      'match # comment',
14101966c248SBram Moolenaar      ])
14111966c248SBram Moolenaar  CheckScriptFailure([
14121966c248SBram Moolenaar      'vim9script',
14131966c248SBram Moolenaar      'match# comment',
14141966c248SBram Moolenaar      ], 'E475:')
14151966c248SBram Moolenaar  CheckScriptSuccess([
14161966c248SBram Moolenaar      'vim9script',
14171966c248SBram Moolenaar      'match none # comment',
14181966c248SBram Moolenaar      ])
14191966c248SBram Moolenaar  CheckScriptFailure([
14201966c248SBram Moolenaar      'vim9script',
14211966c248SBram Moolenaar      'match none# comment',
14221966c248SBram Moolenaar      ], 'E475:')
14231966c248SBram Moolenaar
14241966c248SBram Moolenaar  CheckScriptSuccess([
14251966c248SBram Moolenaar      'vim9script',
14261966c248SBram Moolenaar      'menutrans clear # comment',
14271966c248SBram Moolenaar      ])
14281966c248SBram Moolenaar  CheckScriptFailure([
14291966c248SBram Moolenaar      'vim9script',
14301966c248SBram Moolenaar      'menutrans clear# comment text',
14311966c248SBram Moolenaar      ], 'E474:')
14321966c248SBram Moolenaar
14331966c248SBram Moolenaar  CheckScriptSuccess([
14341966c248SBram Moolenaar      'vim9script',
14351966c248SBram Moolenaar      'syntax clear # comment',
14361966c248SBram Moolenaar      ])
14371966c248SBram Moolenaar  CheckScriptFailure([
14381966c248SBram Moolenaar      'vim9script',
14391966c248SBram Moolenaar      'syntax clear# comment text',
14401966c248SBram Moolenaar      ], 'E28:')
14411966c248SBram Moolenaar  CheckScriptSuccess([
14421966c248SBram Moolenaar      'vim9script',
14431966c248SBram Moolenaar      'syntax keyword Word some',
14441966c248SBram Moolenaar      'syntax clear Word # comment',
14451966c248SBram Moolenaar      ])
14461966c248SBram Moolenaar  CheckScriptFailure([
14471966c248SBram Moolenaar      'vim9script',
14481966c248SBram Moolenaar      'syntax keyword Word some',
14491966c248SBram Moolenaar      'syntax clear Word# comment text',
14501966c248SBram Moolenaar      ], 'E28:')
14511966c248SBram Moolenaar
14521966c248SBram Moolenaar  CheckScriptSuccess([
14531966c248SBram Moolenaar      'vim9script',
14541966c248SBram Moolenaar      'syntax list # comment',
14551966c248SBram Moolenaar      ])
14561966c248SBram Moolenaar  CheckScriptFailure([
14571966c248SBram Moolenaar      'vim9script',
14581966c248SBram Moolenaar      'syntax list# comment text',
14591966c248SBram Moolenaar      ], 'E28:')
14601966c248SBram Moolenaar
14611966c248SBram Moolenaar  CheckScriptSuccess([
14621966c248SBram Moolenaar      'vim9script',
14631966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
14641966c248SBram Moolenaar      ])
14651966c248SBram Moolenaar  CheckScriptFailure([
14661966c248SBram Moolenaar      'vim9script',
14671966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
14681966c248SBram Moolenaar      ], 'E475:')
14691966c248SBram Moolenaar
14701966c248SBram Moolenaar  CheckScriptSuccess([
14711966c248SBram Moolenaar      'vim9script',
14721966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
14731966c248SBram Moolenaar      ])
14741966c248SBram Moolenaar  CheckScriptFailure([
14751966c248SBram Moolenaar      'vim9script',
14761966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
14771966c248SBram Moolenaar      ], 'E789:')
14781966c248SBram Moolenaar
14791966c248SBram Moolenaar  CheckScriptSuccess([
14801966c248SBram Moolenaar      'vim9script',
14811966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
14821966c248SBram Moolenaar      ])
14831966c248SBram Moolenaar  CheckScriptFailure([
14841966c248SBram Moolenaar      'vim9script',
14851966c248SBram Moolenaar      'syntax match Word /pat/# comment',
14861966c248SBram Moolenaar      ], 'E402:')
14871966c248SBram Moolenaar
14881966c248SBram Moolenaar  CheckScriptSuccess([
14891966c248SBram Moolenaar      'vim9script',
14901966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
14911966c248SBram Moolenaar      ])
14921966c248SBram Moolenaar  CheckScriptFailure([
14931966c248SBram Moolenaar      'vim9script',
14941966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
14951966c248SBram Moolenaar      ], 'E475:')
14961966c248SBram Moolenaar  CheckScriptFailure([
14971966c248SBram Moolenaar      'vim9script',
14981966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
14991966c248SBram Moolenaar      ], 'E406:')
15001966c248SBram Moolenaar  CheckScriptFailure([
15011966c248SBram Moolenaar      'vim9script',
15021966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
15031966c248SBram Moolenaar      ], 'E475:')
15041966c248SBram Moolenaar
15051966c248SBram Moolenaar  CheckScriptSuccess([
15061966c248SBram Moolenaar      'vim9script',
15071966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
15081966c248SBram Moolenaar      ])
15091966c248SBram Moolenaar  CheckScriptFailure([
15101966c248SBram Moolenaar      'vim9script',
15111966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
15121966c248SBram Moolenaar      ], 'E475:')
15131966c248SBram Moolenaar
15141966c248SBram Moolenaar  CheckScriptSuccess([
15151966c248SBram Moolenaar      'vim9script',
15161966c248SBram Moolenaar      'syntax sync # comment',
15171966c248SBram Moolenaar      ])
15181966c248SBram Moolenaar  CheckScriptFailure([
15191966c248SBram Moolenaar      'vim9script',
15201966c248SBram Moolenaar      'syntax sync# comment',
15211966c248SBram Moolenaar      ], 'E404:')
15221966c248SBram Moolenaar  CheckScriptSuccess([
15231966c248SBram Moolenaar      'vim9script',
15241966c248SBram Moolenaar      'syntax sync ccomment # comment',
15251966c248SBram Moolenaar      ])
15261966c248SBram Moolenaar  CheckScriptFailure([
15271966c248SBram Moolenaar      'vim9script',
15281966c248SBram Moolenaar      'syntax sync ccomment# comment',
15291966c248SBram Moolenaar      ], 'E404:')
15301966c248SBram Moolenaar
15311966c248SBram Moolenaar  CheckScriptSuccess([
15321966c248SBram Moolenaar      'vim9script',
15331966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
15341966c248SBram Moolenaar      ])
15351966c248SBram Moolenaar  CheckScriptFailure([
15361966c248SBram Moolenaar      'vim9script',
15371966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
15381966c248SBram Moolenaar      ], 'E475:')
1539a72cfb80SBram Moolenaar
1540a72cfb80SBram Moolenaar  CheckScriptSuccess([
1541a72cfb80SBram Moolenaar      'vim9script',
1542a72cfb80SBram Moolenaar      'command Echo echo # comment',
1543a72cfb80SBram Moolenaar      'command Echo # comment',
1544a72cfb80SBram Moolenaar      ])
1545a72cfb80SBram Moolenaar  CheckScriptFailure([
1546a72cfb80SBram Moolenaar      'vim9script',
1547a72cfb80SBram Moolenaar      'command Echo echo# comment',
1548a72cfb80SBram Moolenaar      'Echo',
1549a72cfb80SBram Moolenaar      ], 'E121:')
1550a72cfb80SBram Moolenaar  CheckScriptFailure([
1551a72cfb80SBram Moolenaar      'vim9script',
1552a72cfb80SBram Moolenaar      'command Echo# comment',
1553a72cfb80SBram Moolenaar      ], 'E182:')
1554a72cfb80SBram Moolenaar  CheckScriptFailure([
1555a72cfb80SBram Moolenaar      'vim9script',
1556a72cfb80SBram Moolenaar      'command Echo echo',
1557a72cfb80SBram Moolenaar      'command Echo# comment',
1558a72cfb80SBram Moolenaar      ], 'E182:')
1559a72cfb80SBram Moolenaar
1560a72cfb80SBram Moolenaar  CheckScriptSuccess([
1561a72cfb80SBram Moolenaar      'vim9script',
1562a72cfb80SBram Moolenaar      'function # comment',
1563a72cfb80SBram Moolenaar      ])
1564a72cfb80SBram Moolenaar  CheckScriptFailure([
1565a72cfb80SBram Moolenaar      'vim9script',
1566a72cfb80SBram Moolenaar      'function# comment',
1567a72cfb80SBram Moolenaar      ], 'E129:')
1568a72cfb80SBram Moolenaar  CheckScriptSuccess([
1569a72cfb80SBram Moolenaar      'vim9script',
1570a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
1571a72cfb80SBram Moolenaar      ])
1572a72cfb80SBram Moolenaar  CheckScriptFailure([
1573a72cfb80SBram Moolenaar      'vim9script',
1574a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
1575a72cfb80SBram Moolenaar      ], 'E488:')
1576a72cfb80SBram Moolenaar
1577a72cfb80SBram Moolenaar  CheckScriptSuccess([
1578a72cfb80SBram Moolenaar      'vim9script',
15794c17ad94SBram Moolenaar      'func g:DeleteMeA()',
1580a72cfb80SBram Moolenaar      'endfunc',
15814c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
1582a72cfb80SBram Moolenaar      ])
1583a72cfb80SBram Moolenaar  CheckScriptFailure([
1584a72cfb80SBram Moolenaar      'vim9script',
15854c17ad94SBram Moolenaar      'func g:DeleteMeB()',
1586a72cfb80SBram Moolenaar      'endfunc',
15874c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
1588a72cfb80SBram Moolenaar      ], 'E488:')
1589a72cfb80SBram Moolenaar
1590a72cfb80SBram Moolenaar  CheckScriptSuccess([
1591a72cfb80SBram Moolenaar      'vim9script',
1592a72cfb80SBram Moolenaar      'call execute("ls") # comment',
1593a72cfb80SBram Moolenaar      ])
1594a72cfb80SBram Moolenaar  CheckScriptFailure([
1595a72cfb80SBram Moolenaar      'vim9script',
1596a72cfb80SBram Moolenaar      'call execute("ls")# comment',
1597a72cfb80SBram Moolenaar      ], 'E488:')
15982c5ed4e3SBram Moolenaarenddef
15992c5ed4e3SBram Moolenaar
16002c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
16012c5ed4e3SBram Moolenaar  CheckCanRunGui
16022c5ed4e3SBram Moolenaar
16032c5ed4e3SBram Moolenaar  CheckScriptFailure([
16042c5ed4e3SBram Moolenaar      'vim9script',
16052c5ed4e3SBram Moolenaar      'gui#comment'
16062c5ed4e3SBram Moolenaar      ], 'E499:')
16072c5ed4e3SBram Moolenaar  CheckScriptFailure([
16082c5ed4e3SBram Moolenaar      'vim9script',
16092c5ed4e3SBram Moolenaar      'gui -f#comment'
16102c5ed4e3SBram Moolenaar      ], 'E499:')
16117a092245SBram Moolenaarenddef
16127a092245SBram Moolenaar
1613a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
1614a26b9700SBram Moolenaar  au TabEnter *.vim let g:entered = 1
1615a26b9700SBram Moolenaar  au TabEnter *.x let g:entered = 2
1616a26b9700SBram Moolenaar
1617a26b9700SBram Moolenaar  edit test.vim
1618a26b9700SBram Moolenaar  doautocmd TabEnter #comment
1619a26b9700SBram Moolenaar  assert_equal(1, g:entered)
1620a26b9700SBram Moolenaar
1621a26b9700SBram Moolenaar  doautocmd TabEnter f.x
1622a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1623a26b9700SBram Moolenaar
1624a26b9700SBram Moolenaar  g:entered = 0
1625a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
1626a26b9700SBram Moolenaar  assert_equal(2, g:entered)
1627a26b9700SBram Moolenaar
1628a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
1629a26b9700SBram Moolenaar
1630a26b9700SBram Moolenaar  au! TabEnter
1631a26b9700SBram Moolenaar  unlet g:entered
1632d72c1bf0SBram Moolenaar
1633d72c1bf0SBram Moolenaar  CheckScriptSuccess([
1634d72c1bf0SBram Moolenaar      'vim9script',
1635d72c1bf0SBram Moolenaar      'let g:var = 123',
1636d72c1bf0SBram Moolenaar      'let w:var = 777',
1637d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
1638d72c1bf0SBram Moolenaar      ])
1639d72c1bf0SBram Moolenaar
1640d72c1bf0SBram Moolenaar  CheckScriptFailure([
1641d72c1bf0SBram Moolenaar      'vim9script',
1642d72c1bf0SBram Moolenaar      'let g:var = 123',
164332e35117SBram Moolenaar      'unlet g:var# comment1',
1644d72c1bf0SBram Moolenaar      ], 'E108:')
1645d72c1bf0SBram Moolenaar
1646d72c1bf0SBram Moolenaar  CheckScriptFailure([
1647d72c1bf0SBram Moolenaar      'let g:var = 123',
1648d72c1bf0SBram Moolenaar      'unlet g:var # something',
1649d72c1bf0SBram Moolenaar      ], 'E488:')
1650faac4104SBram Moolenaar
1651faac4104SBram Moolenaar  CheckScriptSuccess([
1652faac4104SBram Moolenaar      'vim9script',
165332e35117SBram Moolenaar      'if 1 # comment2',
1654faac4104SBram Moolenaar      '  echo "yes"',
1655faac4104SBram Moolenaar      'elseif 2 #comment',
1656faac4104SBram Moolenaar      '  echo "no"',
1657faac4104SBram Moolenaar      'endif',
1658faac4104SBram Moolenaar      ])
1659faac4104SBram Moolenaar
1660faac4104SBram Moolenaar  CheckScriptFailure([
1661faac4104SBram Moolenaar      'vim9script',
166232e35117SBram Moolenaar      'if 1# comment3',
1663faac4104SBram Moolenaar      '  echo "yes"',
1664faac4104SBram Moolenaar      'endif',
1665faac4104SBram Moolenaar      ], 'E15:')
1666faac4104SBram Moolenaar
1667faac4104SBram Moolenaar  CheckScriptFailure([
1668faac4104SBram Moolenaar      'vim9script',
166932e35117SBram Moolenaar      'if 0 # comment4',
1670faac4104SBram Moolenaar      '  echo "yes"',
1671faac4104SBram Moolenaar      'elseif 2#comment',
1672faac4104SBram Moolenaar      '  echo "no"',
1673faac4104SBram Moolenaar      'endif',
1674faac4104SBram Moolenaar      ], 'E15:')
1675faac4104SBram Moolenaar
1676faac4104SBram Moolenaar  CheckScriptSuccess([
1677faac4104SBram Moolenaar      'vim9script',
167832e35117SBram Moolenaar      'let v = 1 # comment5',
1679faac4104SBram Moolenaar      ])
1680faac4104SBram Moolenaar
1681faac4104SBram Moolenaar  CheckScriptFailure([
1682faac4104SBram Moolenaar      'vim9script',
168332e35117SBram Moolenaar      'let v = 1# comment6',
168432e35117SBram Moolenaar      ], 'E15:')
1685faac4104SBram Moolenaar
1686faac4104SBram Moolenaar  CheckScriptFailure([
1687faac4104SBram Moolenaar      'vim9script',
168832e35117SBram Moolenaar      'let v:version',
168932e35117SBram Moolenaar      ], 'E1091:')
1690faac4104SBram Moolenaar
1691faac4104SBram Moolenaar  CheckScriptSuccess([
1692faac4104SBram Moolenaar      'vim9script',
1693faac4104SBram Moolenaar      'new'
1694faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
1695faac4104SBram Moolenaar      '$',
1696faac4104SBram Moolenaar      'dsearch /pat/ #comment',
1697faac4104SBram Moolenaar      'bwipe!',
1698faac4104SBram Moolenaar      ])
1699faac4104SBram Moolenaar
1700faac4104SBram Moolenaar  CheckScriptFailure([
1701faac4104SBram Moolenaar      'vim9script',
1702faac4104SBram Moolenaar      'new'
1703faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
1704faac4104SBram Moolenaar      '$',
1705faac4104SBram Moolenaar      'dsearch /pat/#comment',
1706faac4104SBram Moolenaar      'bwipe!',
1707faac4104SBram Moolenaar      ], 'E488:')
1708a26b9700SBram Moolenaarenddef
1709a26b9700SBram Moolenaar
17107e5bd91dSBram Moolenaardef Test_finish()
17117e5bd91dSBram Moolenaar  let lines =<< trim END
17127e5bd91dSBram Moolenaar    vim9script
17137e5bd91dSBram Moolenaar    let g:res = 'one'
17147e5bd91dSBram Moolenaar    if v:false | finish | endif
17157e5bd91dSBram Moolenaar    let g:res = 'two'
17167e5bd91dSBram Moolenaar    finish
17177e5bd91dSBram Moolenaar    let g:res = 'three'
17187e5bd91dSBram Moolenaar  END
17197e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
17207e5bd91dSBram Moolenaar  source Xfinished
17217e5bd91dSBram Moolenaar  assert_equal('two', g:res)
17227e5bd91dSBram Moolenaar
17237e5bd91dSBram Moolenaar  unlet g:res
17247e5bd91dSBram Moolenaar  delete('Xfinished')
17257e5bd91dSBram Moolenaarenddef
17267e5bd91dSBram Moolenaar
172732e35117SBram Moolenaardef Test_let_func_call()
172832e35117SBram Moolenaar  let lines =<< trim END
172932e35117SBram Moolenaar    vim9script
173032e35117SBram Moolenaar    func GetValue()
173132e35117SBram Moolenaar      if exists('g:count')
173232e35117SBram Moolenaar        let g:count += 1
173332e35117SBram Moolenaar      else
173432e35117SBram Moolenaar        let g:count = 1
173532e35117SBram Moolenaar      endif
173632e35117SBram Moolenaar      return 'this'
173732e35117SBram Moolenaar    endfunc
173832e35117SBram Moolenaar    let val: string = GetValue()
1739*df671b46SBram Moolenaar    " env var is always a string
1740*df671b46SBram Moolenaar    let env = $TERM
174132e35117SBram Moolenaar  END
174232e35117SBram Moolenaar  writefile(lines, 'Xfinished')
174332e35117SBram Moolenaar  source Xfinished
1744a5d0077eSBram Moolenaar  " GetValue() is not called during discovery phase
174532e35117SBram Moolenaar  assert_equal(1, g:count)
174632e35117SBram Moolenaar
174732e35117SBram Moolenaar  unlet g:count
174832e35117SBram Moolenaar  delete('Xfinished')
174932e35117SBram Moolenaarenddef
175032e35117SBram Moolenaar
175132e35117SBram Moolenaardef Test_let_missing_type()
175232e35117SBram Moolenaar  let lines =<< trim END
175332e35117SBram Moolenaar    vim9script
175432e35117SBram Moolenaar    func GetValue()
175532e35117SBram Moolenaar      return 'this'
175632e35117SBram Moolenaar    endfunc
175732e35117SBram Moolenaar    let val = GetValue()
175832e35117SBram Moolenaar  END
1759227a69deSBram Moolenaar  CheckScriptFailure(lines, 'E1091:')
176032e35117SBram Moolenaar
1761227a69deSBram Moolenaar  lines =<< trim END
1762227a69deSBram Moolenaar    vim9script
1763*df671b46SBram Moolenaar    func GetValue()
1764*df671b46SBram Moolenaar      return 'this'
1765*df671b46SBram Moolenaar    endfunc
1766*df671b46SBram Moolenaar    let val = [GetValue()]
1767*df671b46SBram Moolenaar  END
1768*df671b46SBram Moolenaar  CheckScriptFailure(lines, 'E1091:')
1769*df671b46SBram Moolenaar
1770*df671b46SBram Moolenaar  lines =<< trim END
1771*df671b46SBram Moolenaar    vim9script
1772*df671b46SBram Moolenaar    func GetValue()
1773*df671b46SBram Moolenaar      return 'this'
1774*df671b46SBram Moolenaar    endfunc
1775*df671b46SBram Moolenaar    let val = {GetValue(): 123}
1776*df671b46SBram Moolenaar  END
1777*df671b46SBram Moolenaar  CheckScriptFailure(lines, 'E1091:')
1778*df671b46SBram Moolenaar
1779*df671b46SBram Moolenaar  lines =<< trim END
1780*df671b46SBram Moolenaar    vim9script
1781*df671b46SBram Moolenaar    func GetValue()
1782*df671b46SBram Moolenaar      return 'this'
1783*df671b46SBram Moolenaar    endfunc
1784*df671b46SBram Moolenaar    let val = {'a': GetValue()}
1785*df671b46SBram Moolenaar  END
1786*df671b46SBram Moolenaar  CheckScriptFailure(lines, 'E1091:')
1787*df671b46SBram Moolenaar
1788*df671b46SBram Moolenaar  lines =<< trim END
1789*df671b46SBram Moolenaar    vim9script
1790*df671b46SBram Moolenaar    let var = g:unknown
1791227a69deSBram Moolenaar  END
1792227a69deSBram Moolenaar  CheckScriptFailure(lines, 'E1091:')
1793227a69deSBram Moolenaar
1794227a69deSBram Moolenaar  " TODO: eventually this would work
1795227a69deSBram Moolenaar  lines =<< trim END
1796227a69deSBram Moolenaar    vim9script
1797227a69deSBram Moolenaar    let var = has('eval')
1798227a69deSBram Moolenaar  END
1799227a69deSBram Moolenaar  CheckScriptFailure(lines, 'E1091:')
1800227a69deSBram Moolenaar
1801227a69deSBram Moolenaar  " TODO: eventually this would work
1802227a69deSBram Moolenaar  lines =<< trim END
1803227a69deSBram Moolenaar    vim9script
1804227a69deSBram Moolenaar    let var = len('string')
1805227a69deSBram Moolenaar  END
1806227a69deSBram Moolenaar  CheckScriptFailure(lines, 'E1091:')
1807227a69deSBram Moolenaar
1808227a69deSBram Moolenaar  lines =<< trim END
1809227a69deSBram Moolenaar    vim9script
1810227a69deSBram Moolenaar    let nr: number = 123
1811227a69deSBram Moolenaar    let var = nr
1812227a69deSBram Moolenaar  END
1813227a69deSBram Moolenaar  CheckScriptFailure(lines, 'E1091:')
181432e35117SBram Moolenaarenddef
181532e35117SBram Moolenaar
1816a5d0077eSBram Moolenaardef Test_forward_declaration()
1817a5d0077eSBram Moolenaar  let lines =<< trim END
1818a5d0077eSBram Moolenaar    vim9script
1819a5d0077eSBram Moolenaar    g:initVal = GetValue()
1820a5d0077eSBram Moolenaar    def GetValue(): string
1821a5d0077eSBram Moolenaar      return theVal
1822a5d0077eSBram Moolenaar    enddef
1823a5d0077eSBram Moolenaar    let theVal = 'something'
1824a5d0077eSBram Moolenaar    theVal = 'else'
1825a5d0077eSBram Moolenaar    g:laterVal = GetValue()
1826a5d0077eSBram Moolenaar  END
1827a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
1828a5d0077eSBram Moolenaar  source Xforward
1829a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
1830a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
1831a5d0077eSBram Moolenaar
1832a5d0077eSBram Moolenaar  unlet g:initVal
1833a5d0077eSBram Moolenaar  unlet g:laterVal
1834a5d0077eSBram Moolenaar  delete('Xforward')
1835a5d0077eSBram Moolenaarenddef
1836a5d0077eSBram Moolenaar
1837a5d0077eSBram Moolenaar
1838585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
1839585fea7bSBram Moolenaardef Test_substitute_cmd()
1840585fea7bSBram Moolenaar  new
1841585fea7bSBram Moolenaar  setline(1, 'something')
1842585fea7bSBram Moolenaar  :substitute(some(other(
1843585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
1844585fea7bSBram Moolenaar  bwipe!
1845585fea7bSBram Moolenaar
1846585fea7bSBram Moolenaar  " also when the context is Vim9 script
1847585fea7bSBram Moolenaar  let lines =<< trim END
1848585fea7bSBram Moolenaar    vim9script
1849585fea7bSBram Moolenaar    new
1850585fea7bSBram Moolenaar    setline(1, 'something')
1851585fea7bSBram Moolenaar    :substitute(some(other(
1852585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
1853585fea7bSBram Moolenaar    bwipe!
1854585fea7bSBram Moolenaar  END
1855585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
1856585fea7bSBram Moolenaar  source Xvim9lines
1857585fea7bSBram Moolenaar
1858585fea7bSBram Moolenaar  delete('Xvim9lines')
1859585fea7bSBram Moolenaarenddef
1860585fea7bSBram Moolenaar
18618a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1862