18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
78a7d6542SBram Moolenaar
88a7d6542SBram Moolenaardef Test_syntax()
98a7d6542SBram Moolenaar  let var = 234
108a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
118a7d6542SBram Moolenaarenddef
128a7d6542SBram Moolenaar
136e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
146e587dcbSBram Moolenaarlet s:addToMe = 111
15401d9ffbSBram Moolenaarlet g:existing = 'yes'
16a8c17704SBram Moolenaarlet g:inc_counter = 1
17a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
18a6e67e4fSBram Moolenaarlet g:alist = [7]
19a6e67e4fSBram Moolenaarlet g:astring = 'text'
20f0b9f43cSBram Moolenaarlet g:anumber = 123
216e587dcbSBram Moolenaar
228a7d6542SBram Moolenaardef Test_assignment()
238a7d6542SBram Moolenaar  let bool1: bool = true
248a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
258a7d6542SBram Moolenaar  let bool2: bool = false
268a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
278a7d6542SBram Moolenaar
28f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string'], 'E1069:')
29f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string = "x"'], 'E1069:')
301cc2a94fSBram Moolenaar  call CheckDefFailure(['let a:string = "x"'], 'E1069:')
31f93c7feaSBram Moolenaar
324cdb13ceSBram Moolenaar  let nr: number = 1234
334cdb13ceSBram Moolenaar  call CheckDefFailure(['let nr: number = "asdf"'], 'E1013:')
344cdb13ceSBram Moolenaar
35b209750bSBram Moolenaar  let a: number = 6 #comment
369be61bbbSBram Moolenaar  assert_equal(6, a)
379be61bbbSBram Moolenaar
3842a480bfSBram Moolenaar  if has('channel')
3942a480bfSBram Moolenaar    let chan1: channel
40fbdd08edSBram Moolenaar    let job1: job
41f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
4242a480bfSBram Moolenaar  endif
43fbdd08edSBram Moolenaar  if has('float')
44fbdd08edSBram Moolenaar    let float1: float = 3.4
45fbdd08edSBram Moolenaar  endif
465deeb3f1SBram Moolenaar  let Funky1: func
475deeb3f1SBram Moolenaar  let Funky2: func = function('len')
484c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
4942a480bfSBram Moolenaar
50b209750bSBram Moolenaar  g:newvar = 'new'  #comment
51401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
52401d9ffbSBram Moolenaar
53401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
54401d9ffbSBram Moolenaar  g:existing = 'no'
55401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
56401d9ffbSBram Moolenaar
57b283a8a6SBram Moolenaar  v:char = 'abc'
586e587dcbSBram Moolenaar  assert_equal('abc', v:char)
59b283a8a6SBram Moolenaar
60b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
616e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
62b283a8a6SBram Moolenaar  $ENVVAR = ''
636e587dcbSBram Moolenaar
64fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
65fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
66fd1823e0SBram Moolenaar  s:addToMe += 222
67fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
680bbf722aSBram Moolenaar  s:newVar = 'new'
690bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
70a8c17704SBram Moolenaar
71a8c17704SBram Moolenaar  set ts=7
72a8c17704SBram Moolenaar  &ts += 1
73a8c17704SBram Moolenaar  assert_equal(8, &ts)
7480c34ca3SBram Moolenaar  &ts -= 3
7580c34ca3SBram Moolenaar  assert_equal(5, &ts)
7680c34ca3SBram Moolenaar  &ts *= 2
7780c34ca3SBram Moolenaar  assert_equal(10, &ts)
7880c34ca3SBram Moolenaar  &ts /= 3
7980c34ca3SBram Moolenaar  assert_equal(3, &ts)
8080c34ca3SBram Moolenaar  set ts=10
8180c34ca3SBram Moolenaar  &ts %= 4
8280c34ca3SBram Moolenaar  assert_equal(2, &ts)
83a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
84a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
85a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = [7]'], 'E1013:')
86a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
87a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = "xx"'], 'E1013:')
88a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
89a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
90a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
91cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
92585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
9380c34ca3SBram Moolenaar  &ts = 8
94a8c17704SBram Moolenaar
95a8c17704SBram Moolenaar  g:inc_counter += 1
96a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
97a8c17704SBram Moolenaar
98a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
99a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
100a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
101a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
102a8c17704SBram Moolenaar
103a8c17704SBram Moolenaar  @a = 'areg'
104a8c17704SBram Moolenaar  @a ..= 'add'
105a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
106a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
107a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
108e69f6d04SBram Moolenaar
109e69f6d04SBram Moolenaar  v:errmsg = 'none'
110e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
111e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
112e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
113e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
1145deeb3f1SBram Moolenaarenddef
1155deeb3f1SBram Moolenaar
1163b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
1173b74b6b4SBram Moolenaar  let lines =<< trim END
1183b74b6b4SBram Moolenaar      vim9script
1193b74b6b4SBram Moolenaar
120f5be8cdbSBram Moolenaar      # single character variable declarations work
1213b74b6b4SBram Moolenaar      let a: string
1223b74b6b4SBram Moolenaar      let b: number
1233b74b6b4SBram Moolenaar      let l: list<any>
1243b74b6b4SBram Moolenaar      let s: string
1253b74b6b4SBram Moolenaar      let t: number
1263b74b6b4SBram Moolenaar      let v: number
1273b74b6b4SBram Moolenaar      let w: number
1283b74b6b4SBram Moolenaar
129f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
1303b74b6b4SBram Moolenaar      a = 'script-a'
1313b74b6b4SBram Moolenaar      b = 111
1323b74b6b4SBram Moolenaar      l = [1, 2, 3]
1333b74b6b4SBram Moolenaar      s = 'script-s'
1343b74b6b4SBram Moolenaar      t = 222
1353b74b6b4SBram Moolenaar      v = 333
1363b74b6b4SBram Moolenaar      w = 444
1373b74b6b4SBram Moolenaar
1383b74b6b4SBram Moolenaar      assert_equal('script-a', a)
1393b74b6b4SBram Moolenaar      assert_equal(111, b)
1403b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
1413b74b6b4SBram Moolenaar      assert_equal('script-s', s)
1423b74b6b4SBram Moolenaar      assert_equal(222, t)
1433b74b6b4SBram Moolenaar      assert_equal(333, v)
1443b74b6b4SBram Moolenaar      assert_equal(444, w)
1453b74b6b4SBram Moolenaar  END
1463b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
1473b74b6b4SBram Moolenaar  source Xsinglechar
1483b74b6b4SBram Moolenaar  delete('Xsinglechar')
1493b74b6b4SBram Moolenaarenddef
1503b74b6b4SBram Moolenaar
15184370087SBram Moolenaardef Test_assignment_list()
15284370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
15384370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
15484370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
15584370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
15684370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
15784370087SBram Moolenaar
15884370087SBram Moolenaar  let listS: list<string> = []
15984370087SBram Moolenaar  let listN: list<number> = []
16084370087SBram Moolenaar
16184370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
16284370087SBram Moolenaar  list2[-1] = 99
16384370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
16484370087SBram Moolenaar  list2[-2] = 88
16584370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
16684370087SBram Moolenaar  list2[-3] = 77
16784370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
16884370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
169c5b1c20bSBram Moolenaar  call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
17084370087SBram Moolenaar
17184370087SBram Moolenaar  # type becomes list<any>
17284370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
17384370087SBram Moolenaarenddef
17484370087SBram Moolenaar
175b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
176b31be3f9SBram Moolenaar  let lines =<< trim END
177b31be3f9SBram Moolenaar    vim9script
178b31be3f9SBram Moolenaar    let v1: number
179b31be3f9SBram Moolenaar    let v2: number
180b31be3f9SBram Moolenaar    let v3: number
181b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
182b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
183b31be3f9SBram Moolenaar  END
184b31be3f9SBram Moolenaar  call CheckScriptSuccess(lines)
185b31be3f9SBram Moolenaarenddef
186b31be3f9SBram Moolenaar
18784370087SBram Moolenaardef Test_assignment_dict()
18884370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
18984370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
19084370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
19184370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
19274fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
19384370087SBram Moolenaar
194f5be8cdbSBram Moolenaar  # overwrite
195c785b9a7SBram Moolenaar  dict3['key'] = 'another'
196c785b9a7SBram Moolenaar
19784370087SBram Moolenaar  call CheckDefExecFailure(['let dd = {}', 'dd[""] = 6'], 'E713:')
19884370087SBram Moolenaar
19984370087SBram Moolenaar  # type becomes dict<any>
20084370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
20184370087SBram Moolenaarenddef
20284370087SBram Moolenaar
203d3aac291SBram Moolenaardef Test_assignment_local()
204f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
205f5be8cdbSBram Moolenaar  # changed.
206d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
207d3aac291SBram Moolenaar    let b:existing = 'yes'
208d3aac291SBram Moolenaar    let w:existing = 'yes'
209d3aac291SBram Moolenaar    let t:existing = 'yes'
210d3aac291SBram Moolenaar
211d3aac291SBram Moolenaar    def Test_assignment_local_internal()
212d3aac291SBram Moolenaar      b:newvar = 'new'
213d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
214d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
215d3aac291SBram Moolenaar      b:existing = 'no'
216d3aac291SBram Moolenaar      assert_equal('no', b:existing)
217396f3138SBram Moolenaar      b:existing ..= 'NO'
218396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
219d3aac291SBram Moolenaar
220d3aac291SBram Moolenaar      w:newvar = 'new'
221d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
222d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
223d3aac291SBram Moolenaar      w:existing = 'no'
224d3aac291SBram Moolenaar      assert_equal('no', w:existing)
225396f3138SBram Moolenaar      w:existing ..= 'NO'
226396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
227d3aac291SBram Moolenaar
228d3aac291SBram Moolenaar      t:newvar = 'new'
229d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
230d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
231d3aac291SBram Moolenaar      t:existing = 'no'
232d3aac291SBram Moolenaar      assert_equal('no', t:existing)
233396f3138SBram Moolenaar      t:existing ..= 'NO'
234396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
235d3aac291SBram Moolenaar    enddef
236d3aac291SBram Moolenaar    call Test_assignment_local_internal()
237d3aac291SBram Moolenaar  END
238d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
239d3aac291SBram Moolenaarenddef
240d3aac291SBram Moolenaar
2415deeb3f1SBram Moolenaardef Test_assignment_default()
242e69f6d04SBram Moolenaar
243cb711abfSBram Moolenaar  # Test default values.
244e69f6d04SBram Moolenaar  let thebool: bool
245e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
246e69f6d04SBram Moolenaar
247e69f6d04SBram Moolenaar  let thenumber: number
248e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
249e69f6d04SBram Moolenaar
250e69f6d04SBram Moolenaar  if has('float')
251e69f6d04SBram Moolenaar    let thefloat: float
252e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
253e69f6d04SBram Moolenaar  endif
254e69f6d04SBram Moolenaar
255e69f6d04SBram Moolenaar  let thestring: string
256e69f6d04SBram Moolenaar  assert_equal('', thestring)
257e69f6d04SBram Moolenaar
258e69f6d04SBram Moolenaar  let theblob: blob
259e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
260e69f6d04SBram Moolenaar
2615deeb3f1SBram Moolenaar  let Thefunc: func
2625deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
263e69f6d04SBram Moolenaar
264e69f6d04SBram Moolenaar  let thelist: list<any>
265e69f6d04SBram Moolenaar  assert_equal([], thelist)
266e69f6d04SBram Moolenaar
267e69f6d04SBram Moolenaar  let thedict: dict<any>
268e69f6d04SBram Moolenaar  assert_equal({}, thedict)
269e69f6d04SBram Moolenaar
2702c869deeSBram Moolenaar  if has('channel')
271e69f6d04SBram Moolenaar    let thejob: job
272e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
273e69f6d04SBram Moolenaar
274e69f6d04SBram Moolenaar    let thechannel: channel
275e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
276c785b9a7SBram Moolenaar
277c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
278f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
279c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
280c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
281c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
282c785b9a7SBram Moolenaar    endif
2832c869deeSBram Moolenaar  endif
284585fea7bSBram Moolenaar
285585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
286585fea7bSBram Moolenaar  assert_equal(5678, nr)
2878a7d6542SBram Moolenaarenddef
2888a7d6542SBram Moolenaar
28947a519a9SBram Moolenaardef Test_assignment_var_list()
29047a519a9SBram Moolenaar  let v1: string
29147a519a9SBram Moolenaar  let v2: string
2929af78769SBram Moolenaar  let vrem: list<string>
2939af78769SBram Moolenaar  [v1] = ['aaa']
2949af78769SBram Moolenaar  assert_equal('aaa', v1)
2959af78769SBram Moolenaar
29647a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
29747a519a9SBram Moolenaar  assert_equal('one', v1)
29847a519a9SBram Moolenaar  assert_equal('two', v2)
2999af78769SBram Moolenaar
3009af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
3019af78769SBram Moolenaar  assert_equal('one', v1)
3029af78769SBram Moolenaar  assert_equal('two', v2)
3039af78769SBram Moolenaar  assert_equal([], vrem)
3049af78769SBram Moolenaar
3059af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
3069af78769SBram Moolenaar  assert_equal('one', v1)
3079af78769SBram Moolenaar  assert_equal('two', v2)
3089af78769SBram Moolenaar  assert_equal(['three'], vrem)
30947a519a9SBram Moolenaarenddef
31047a519a9SBram Moolenaar
311cab27678SBram Moolenaardef Mess(): string
312cab27678SBram Moolenaar  v:foldstart = 123
313cab27678SBram Moolenaar  return 'xxx'
314cab27678SBram Moolenaarenddef
315cab27678SBram Moolenaar
316d72c1bf0SBram Moolenaardef Test_assignment_failure()
3178a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
3188a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
3198a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
3208a7d6542SBram Moolenaar
321*63be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
322*63be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
323*63be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
324*63be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
325*63be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
326*63be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
327*63be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
328*63be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
329*63be3d4bSBram Moolenaar
3308a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
3318a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
3328a7d6542SBram Moolenaar
3339b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
3349af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
3359af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
3369af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
3379af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
3389af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
3399af78769SBram Moolenaar                            'let y: number',
3409af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
3419af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
3429af78769SBram Moolenaar                            'let y: number',
3439af78769SBram Moolenaar                            'let z: list<number>',
3449af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
3459be61bbbSBram Moolenaar
346e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
3479be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
3489be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
3499be61bbbSBram Moolenaar
350e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
3519be61bbbSBram Moolenaar
3529be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
3539be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
3549be61bbbSBram Moolenaar
355e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
356e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
357e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
358e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
3599be61bbbSBram Moolenaar
3609be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
3619be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
3629be61bbbSBram Moolenaar
363822ba247SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
36433fa29cfSBram Moolenaar
3658a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
3668a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
3678a7d6542SBram Moolenaar
3688a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
3698a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
3708a7d6542SBram Moolenaar
3718a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
3728a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
37342a480bfSBram Moolenaar
374d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
37542a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
376cab27678SBram Moolenaar
377cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
378cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
379d72c1bf0SBram Moolenaarenddef
380d72c1bf0SBram Moolenaar
381d72c1bf0SBram Moolenaardef Test_unlet()
382d72c1bf0SBram Moolenaar  g:somevar = 'yes'
383d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
384d72c1bf0SBram Moolenaar  unlet g:somevar
385d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
386d72c1bf0SBram Moolenaar  unlet! g:somevar
387d72c1bf0SBram Moolenaar
388d72c1bf0SBram Moolenaar  call CheckScriptFailure([
389d72c1bf0SBram Moolenaar        'vim9script',
390d72c1bf0SBram Moolenaar        'let svar = 123',
391d72c1bf0SBram Moolenaar        'unlet svar',
392d72c1bf0SBram Moolenaar        ], 'E1081:')
393d72c1bf0SBram Moolenaar  call CheckScriptFailure([
394d72c1bf0SBram Moolenaar        'vim9script',
395d72c1bf0SBram Moolenaar        'let svar = 123',
396d72c1bf0SBram Moolenaar        'unlet s:svar',
397d72c1bf0SBram Moolenaar        ], 'E1081:')
398d72c1bf0SBram Moolenaar  call CheckScriptFailure([
399d72c1bf0SBram Moolenaar        'vim9script',
400d72c1bf0SBram Moolenaar        'let svar = 123',
401d72c1bf0SBram Moolenaar        'def Func()',
402d72c1bf0SBram Moolenaar        '  unlet svar',
403d72c1bf0SBram Moolenaar        'enddef',
404822ba247SBram Moolenaar        'defcompile',
405d72c1bf0SBram Moolenaar        ], 'E1081:')
406d72c1bf0SBram Moolenaar  call CheckScriptFailure([
407d72c1bf0SBram Moolenaar        'vim9script',
408d72c1bf0SBram Moolenaar        'let svar = 123',
409d72c1bf0SBram Moolenaar        'def Func()',
410d72c1bf0SBram Moolenaar        '  unlet s:svar',
411d72c1bf0SBram Moolenaar        'enddef',
412822ba247SBram Moolenaar        'defcompile',
413d72c1bf0SBram Moolenaar        ], 'E1081:')
4147bdaea6eSBram Moolenaar
4157bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
4167bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
4177bdaea6eSBram Moolenaar  unlet $ENVVAR
4187bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
419d72c1bf0SBram Moolenaarenddef
420599c89c8SBram Moolenaar
4214c17ad94SBram Moolenaardef Test_delfunction()
422f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
4234c17ad94SBram Moolenaar  CheckScriptSuccess([
4244c17ad94SBram Moolenaar      'vim9script',
4254c17ad94SBram Moolenaar      'func CheckMe()',
4264c17ad94SBram Moolenaar      '  return 123',
4274c17ad94SBram Moolenaar      'endfunc',
4284c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
4294c17ad94SBram Moolenaar      ])
4304c17ad94SBram Moolenaar
431f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
4324c17ad94SBram Moolenaar  CheckScriptFailure([
4334c17ad94SBram Moolenaar      'vim9script',
4344c17ad94SBram Moolenaar      'func DeleteMe1()',
4354c17ad94SBram Moolenaar      'endfunc',
4364c17ad94SBram Moolenaar      'delfunction DeleteMe1',
4374c17ad94SBram Moolenaar      ], 'E1084:')
4384c17ad94SBram Moolenaar  CheckScriptFailure([
4394c17ad94SBram Moolenaar      'vim9script',
4404c17ad94SBram Moolenaar      'func DeleteMe2()',
4414c17ad94SBram Moolenaar      'endfunc',
4424c17ad94SBram Moolenaar      'def DoThat()',
4434c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
4444c17ad94SBram Moolenaar      'enddef',
4454c17ad94SBram Moolenaar      'DoThat()',
4464c17ad94SBram Moolenaar      ], 'E1084:')
4474c17ad94SBram Moolenaar  CheckScriptFailure([
4484c17ad94SBram Moolenaar      'vim9script',
4494c17ad94SBram Moolenaar      'def DeleteMe3()',
4504c17ad94SBram Moolenaar      'enddef',
4514c17ad94SBram Moolenaar      'delfunction DeleteMe3',
4524c17ad94SBram Moolenaar      ], 'E1084:')
4534c17ad94SBram Moolenaar  CheckScriptFailure([
4544c17ad94SBram Moolenaar      'vim9script',
4554c17ad94SBram Moolenaar      'def DeleteMe4()',
4564c17ad94SBram Moolenaar      'enddef',
4574c17ad94SBram Moolenaar      'def DoThat()',
4584c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
4594c17ad94SBram Moolenaar      'enddef',
4604c17ad94SBram Moolenaar      'DoThat()',
4614c17ad94SBram Moolenaar      ], 'E1084:')
4624c17ad94SBram Moolenaarenddef
4634c17ad94SBram Moolenaar
464599c89c8SBram Moolenaarfunc Test_wrong_type()
465599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
466599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
467599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
468599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
469599c89c8SBram Moolenaar
470599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
471599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
47242a480bfSBram Moolenaar
47342a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
47442a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
47542a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
47642a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
47742a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
47842a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
47942a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
48042a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
48142a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
48242a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
48342a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
484a0a9f43aSBram Moolenaar
485a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
486a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
4878a7d6542SBram Moolenaarendfunc
4888a7d6542SBram Moolenaar
4898a7d6542SBram Moolenaarfunc Test_const()
4908a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
4918a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
4928a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
4939be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
4948a7d6542SBram Moolenaarendfunc
4958a7d6542SBram Moolenaar
496df069eecSBram Moolenaardef Test_range_no_colon()
497df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
498df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
499df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
500df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
501df069eecSBram Moolenaarenddef
502df069eecSBram Moolenaar
503df069eecSBram Moolenaar
5048a7d6542SBram Moolenaardef Test_block()
5058a7d6542SBram Moolenaar  let outer = 1
5068a7d6542SBram Moolenaar  {
5078a7d6542SBram Moolenaar    let inner = 2
5088a7d6542SBram Moolenaar    assert_equal(1, outer)
5098a7d6542SBram Moolenaar    assert_equal(2, inner)
5108a7d6542SBram Moolenaar  }
5118a7d6542SBram Moolenaar  assert_equal(1, outer)
5128a7d6542SBram Moolenaarenddef
5138a7d6542SBram Moolenaar
5148a7d6542SBram Moolenaarfunc Test_block_failure()
5158a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
516585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
517585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
5188a7d6542SBram Moolenaarendfunc
5198a7d6542SBram Moolenaar
520585fea7bSBram Moolenaardef Test_cmd_modifier()
521585fea7bSBram Moolenaar  tab echo '0'
522585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
523585fea7bSBram Moolenaarenddef
524585fea7bSBram Moolenaar
525d032f34aSBram Moolenaarfunc g:NoSuchFunc()
526d032f34aSBram Moolenaar  echo 'none'
527d032f34aSBram Moolenaarendfunc
528d032f34aSBram Moolenaar
5298a7d6542SBram Moolenaardef Test_try_catch()
5308a7d6542SBram Moolenaar  let l = []
5317a092245SBram Moolenaar  try # comment
5328a7d6542SBram Moolenaar    add(l, '1')
5338a7d6542SBram Moolenaar    throw 'wrong'
5348a7d6542SBram Moolenaar    add(l, '2')
5357a092245SBram Moolenaar  catch # comment
5368a7d6542SBram Moolenaar    add(l, v:exception)
5377a092245SBram Moolenaar  finally # comment
5388a7d6542SBram Moolenaar    add(l, '3')
5397a092245SBram Moolenaar  endtry # comment
5408a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
54168d130c6SBram Moolenaar
542e859312eSBram Moolenaar  l = []
543e859312eSBram Moolenaar  try
544e859312eSBram Moolenaar    try
545e859312eSBram Moolenaar      add(l, '1')
546e859312eSBram Moolenaar      throw 'wrong'
547e859312eSBram Moolenaar      add(l, '2')
548e859312eSBram Moolenaar    catch /right/
549e859312eSBram Moolenaar      add(l, v:exception)
550e859312eSBram Moolenaar    endtry
551e859312eSBram Moolenaar  catch /wrong/
552e859312eSBram Moolenaar    add(l, 'caught')
553e859312eSBram Moolenaar  finally
554e859312eSBram Moolenaar    add(l, 'finally')
555e859312eSBram Moolenaar  endtry
556e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
557e859312eSBram Moolenaar
55868d130c6SBram Moolenaar  let n: number
55968d130c6SBram Moolenaar  try
56068d130c6SBram Moolenaar    n = l[3]
56168d130c6SBram Moolenaar  catch /E684:/
56268d130c6SBram Moolenaar    n = 99
56368d130c6SBram Moolenaar  endtry
56468d130c6SBram Moolenaar  assert_equal(99, n)
56568d130c6SBram Moolenaar
56668d130c6SBram Moolenaar  try
56768d130c6SBram Moolenaar    n = g:astring[3]
56868d130c6SBram Moolenaar  catch /E714:/
56968d130c6SBram Moolenaar    n = 77
57068d130c6SBram Moolenaar  endtry
57168d130c6SBram Moolenaar  assert_equal(77, n)
57268d130c6SBram Moolenaar
57368d130c6SBram Moolenaar  try
57468d130c6SBram Moolenaar    n = l[g:astring]
57568d130c6SBram Moolenaar  catch /E39:/
57668d130c6SBram Moolenaar    n = 77
57768d130c6SBram Moolenaar  endtry
57868d130c6SBram Moolenaar  assert_equal(77, n)
57968d130c6SBram Moolenaar
58068d130c6SBram Moolenaar  try
58168d130c6SBram Moolenaar    n = s:does_not_exist
58268d130c6SBram Moolenaar  catch /E121:/
583f0b9f43cSBram Moolenaar    n = 111
584f0b9f43cSBram Moolenaar  endtry
585f0b9f43cSBram Moolenaar  assert_equal(111, n)
586f0b9f43cSBram Moolenaar
587f0b9f43cSBram Moolenaar  try
588f0b9f43cSBram Moolenaar    n = g:does_not_exist
589f0b9f43cSBram Moolenaar  catch /E121:/
59068d130c6SBram Moolenaar    n = 121
59168d130c6SBram Moolenaar  endtry
59268d130c6SBram Moolenaar  assert_equal(121, n)
59368d130c6SBram Moolenaar
59468d130c6SBram Moolenaar  let d = #{one: 1}
59568d130c6SBram Moolenaar  try
59668d130c6SBram Moolenaar    n = d[g:astring]
59768d130c6SBram Moolenaar  catch /E716:/
59868d130c6SBram Moolenaar    n = 222
59968d130c6SBram Moolenaar  endtry
60068d130c6SBram Moolenaar  assert_equal(222, n)
601f0b9f43cSBram Moolenaar
602f0b9f43cSBram Moolenaar  try
603f0b9f43cSBram Moolenaar    n = -g:astring
604f0b9f43cSBram Moolenaar  catch /E39:/
605f0b9f43cSBram Moolenaar    n = 233
606f0b9f43cSBram Moolenaar  endtry
607f0b9f43cSBram Moolenaar  assert_equal(233, n)
608f0b9f43cSBram Moolenaar
609f0b9f43cSBram Moolenaar  try
610f0b9f43cSBram Moolenaar    n = +g:astring
611f0b9f43cSBram Moolenaar  catch /E1030:/
612f0b9f43cSBram Moolenaar    n = 244
613f0b9f43cSBram Moolenaar  endtry
614f0b9f43cSBram Moolenaar  assert_equal(244, n)
615f0b9f43cSBram Moolenaar
616f0b9f43cSBram Moolenaar  try
617f0b9f43cSBram Moolenaar    n = +g:alist
618f0b9f43cSBram Moolenaar  catch /E745:/
619f0b9f43cSBram Moolenaar    n = 255
620f0b9f43cSBram Moolenaar  endtry
621f0b9f43cSBram Moolenaar  assert_equal(255, n)
622f0b9f43cSBram Moolenaar
623f0b9f43cSBram Moolenaar  let nd: dict<any>
624f0b9f43cSBram Moolenaar  try
625f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
626f0b9f43cSBram Moolenaar  catch /E1029:/
627f0b9f43cSBram Moolenaar    n = 266
628f0b9f43cSBram Moolenaar  endtry
629f0b9f43cSBram Moolenaar  assert_equal(266, n)
630f0b9f43cSBram Moolenaar
631f0b9f43cSBram Moolenaar  try
632f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
633f0b9f43cSBram Moolenaar  catch /E1093:/
634f0b9f43cSBram Moolenaar    n = 277
635f0b9f43cSBram Moolenaar  endtry
636f0b9f43cSBram Moolenaar  assert_equal(277, n)
637f0b9f43cSBram Moolenaar
638e859312eSBram Moolenaar  try
639e859312eSBram Moolenaar    &ts = g:astring
640e859312eSBram Moolenaar  catch /E1029:/
641e859312eSBram Moolenaar    n = 288
642e859312eSBram Moolenaar  endtry
643e859312eSBram Moolenaar  assert_equal(288, n)
644e859312eSBram Moolenaar
645e859312eSBram Moolenaar  try
646e859312eSBram Moolenaar    &backspace = 'asdf'
647e859312eSBram Moolenaar  catch /E474:/
648e859312eSBram Moolenaar    n = 299
649e859312eSBram Moolenaar  endtry
650e859312eSBram Moolenaar  assert_equal(299, n)
651e859312eSBram Moolenaar
652e859312eSBram Moolenaar  l = [1]
653e859312eSBram Moolenaar  try
654e859312eSBram Moolenaar    l[3] = 3
655e859312eSBram Moolenaar  catch /E684:/
656e859312eSBram Moolenaar    n = 300
657e859312eSBram Moolenaar  endtry
658e859312eSBram Moolenaar  assert_equal(300, n)
659e859312eSBram Moolenaar
660e859312eSBram Moolenaar  try
661e859312eSBram Moolenaar    d[''] = 3
662e859312eSBram Moolenaar  catch /E713:/
663e859312eSBram Moolenaar    n = 311
664e859312eSBram Moolenaar  endtry
665e859312eSBram Moolenaar  assert_equal(311, n)
666e859312eSBram Moolenaar
667e859312eSBram Moolenaar  try
668e859312eSBram Moolenaar    unlet g:does_not_exist
669e859312eSBram Moolenaar  catch /E108:/
670e859312eSBram Moolenaar    n = 322
671e859312eSBram Moolenaar  endtry
672e859312eSBram Moolenaar  assert_equal(322, n)
673e859312eSBram Moolenaar
674e859312eSBram Moolenaar  try
675e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
676e859312eSBram Moolenaar  catch /E721:/
677e859312eSBram Moolenaar    n = 333
678e859312eSBram Moolenaar  endtry
679e859312eSBram Moolenaar  assert_equal(333, n)
680e859312eSBram Moolenaar
681e859312eSBram Moolenaar  try
682e859312eSBram Moolenaar    l = DeletedFunc()
683e859312eSBram Moolenaar  catch /E933:/
684e859312eSBram Moolenaar    n = 344
685e859312eSBram Moolenaar  endtry
686e859312eSBram Moolenaar  assert_equal(344, n)
687d032f34aSBram Moolenaar
688d032f34aSBram Moolenaar  try
689d032f34aSBram Moolenaar    echo len(v:true)
690d032f34aSBram Moolenaar  catch /E701:/
691d032f34aSBram Moolenaar    n = 355
692d032f34aSBram Moolenaar  endtry
693d032f34aSBram Moolenaar  assert_equal(355, n)
694d032f34aSBram Moolenaar
695d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
696d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
697d032f34aSBram Moolenaar  try
698d032f34aSBram Moolenaar    echo P()
699d032f34aSBram Moolenaar  catch /E117:/
700d032f34aSBram Moolenaar    n = 366
701d032f34aSBram Moolenaar  endtry
702d032f34aSBram Moolenaar  assert_equal(366, n)
703d032f34aSBram Moolenaar
704d032f34aSBram Moolenaar  try
705d032f34aSBram Moolenaar    echo g:NoSuchFunc()
706d032f34aSBram Moolenaar  catch /E117:/
707d032f34aSBram Moolenaar    n = 377
708d032f34aSBram Moolenaar  endtry
709d032f34aSBram Moolenaar  assert_equal(377, n)
710d032f34aSBram Moolenaar
711d032f34aSBram Moolenaar  try
712d032f34aSBram Moolenaar    echo g:alist + 4
713d032f34aSBram Moolenaar  catch /E745:/
714d032f34aSBram Moolenaar    n = 388
715d032f34aSBram Moolenaar  endtry
716d032f34aSBram Moolenaar  assert_equal(388, n)
717d032f34aSBram Moolenaar
718d032f34aSBram Moolenaar  try
719d032f34aSBram Moolenaar    echo 4 + g:alist
720d032f34aSBram Moolenaar  catch /E745:/
721d032f34aSBram Moolenaar    n = 399
722d032f34aSBram Moolenaar  endtry
723d032f34aSBram Moolenaar  assert_equal(399, n)
724d032f34aSBram Moolenaar
725d032f34aSBram Moolenaar  try
726d032f34aSBram Moolenaar    echo g:alist.member
727d032f34aSBram Moolenaar  catch /E715:/
728d032f34aSBram Moolenaar    n = 400
729d032f34aSBram Moolenaar  endtry
730d032f34aSBram Moolenaar  assert_equal(400, n)
731d032f34aSBram Moolenaar
732d032f34aSBram Moolenaar  try
733d032f34aSBram Moolenaar    echo d.member
734d032f34aSBram Moolenaar  catch /E716:/
735d032f34aSBram Moolenaar    n = 411
736d032f34aSBram Moolenaar  endtry
737d032f34aSBram Moolenaar  assert_equal(411, n)
7388a7d6542SBram Moolenaarenddef
7398a7d6542SBram Moolenaar
740e859312eSBram Moolenaardef DeletedFunc(): list<any>
741e859312eSBram Moolenaar  return ['delete me']
742e859312eSBram Moolenaarenddef
743e859312eSBram Moolenaardefcompile
744e859312eSBram Moolenaardelfunc DeletedFunc
745e859312eSBram Moolenaar
746257cc5eeSBram Moolenaardef ThrowFromDef()
747a72cfb80SBram Moolenaar  throw "getout" # comment
748257cc5eeSBram Moolenaarenddef
749257cc5eeSBram Moolenaar
750257cc5eeSBram Moolenaarfunc CatchInFunc()
751257cc5eeSBram Moolenaar  try
752257cc5eeSBram Moolenaar    call ThrowFromDef()
753257cc5eeSBram Moolenaar  catch
754257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
755257cc5eeSBram Moolenaar  endtry
756257cc5eeSBram Moolenaarendfunc
757257cc5eeSBram Moolenaar
758257cc5eeSBram Moolenaardef CatchInDef()
759257cc5eeSBram Moolenaar  try
760257cc5eeSBram Moolenaar    ThrowFromDef()
761257cc5eeSBram Moolenaar  catch
762257cc5eeSBram Moolenaar    g:thrown_def = v:exception
763257cc5eeSBram Moolenaar  endtry
764257cc5eeSBram Moolenaarenddef
765257cc5eeSBram Moolenaar
766f575adffSBram Moolenaardef ReturnFinally(): string
767f575adffSBram Moolenaar  try
768f575adffSBram Moolenaar    return 'intry'
769f575adffSBram Moolenaar  finally
770f575adffSBram Moolenaar    g:in_finally = 'finally'
771f575adffSBram Moolenaar  endtry
772f575adffSBram Moolenaar  return 'end'
773f575adffSBram Moolenaarenddef
774f575adffSBram Moolenaar
775257cc5eeSBram Moolenaardef Test_try_catch_nested()
776257cc5eeSBram Moolenaar  CatchInFunc()
777257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
778257cc5eeSBram Moolenaar
779257cc5eeSBram Moolenaar  CatchInDef()
780257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
781f575adffSBram Moolenaar
782f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
783f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
784f575adffSBram Moolenaarenddef
785f575adffSBram Moolenaar
786f575adffSBram Moolenaardef Test_try_catch_match()
787f575adffSBram Moolenaar  let seq = 'a'
788f575adffSBram Moolenaar  try
789f575adffSBram Moolenaar    throw 'something'
790f575adffSBram Moolenaar  catch /nothing/
791f575adffSBram Moolenaar    seq ..= 'x'
792f575adffSBram Moolenaar  catch /some/
793f575adffSBram Moolenaar    seq ..= 'b'
794f575adffSBram Moolenaar  catch /asdf/
795f575adffSBram Moolenaar    seq ..= 'x'
796e8c4abbbSBram Moolenaar  catch ?a\?sdf?
797e8c4abbbSBram Moolenaar    seq ..= 'y'
798f575adffSBram Moolenaar  finally
799f575adffSBram Moolenaar    seq ..= 'c'
800f575adffSBram Moolenaar  endtry
801f575adffSBram Moolenaar  assert_equal('abc', seq)
802257cc5eeSBram Moolenaarenddef
803257cc5eeSBram Moolenaar
804e8c4abbbSBram Moolenaardef Test_try_catch_fails()
805e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
806e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
807e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
808585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
809585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
810585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
811585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
812585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
813585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
814585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
815585fea7bSBram Moolenaar
816a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
817585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
818e8c4abbbSBram Moolenaarenddef
819e8c4abbbSBram Moolenaar
820006ad48bSBram Moolenaardef Test_throw_vimscript()
821f5be8cdbSBram Moolenaar  # only checks line continuation
822006ad48bSBram Moolenaar  let lines =<< trim END
823006ad48bSBram Moolenaar      vim9script
824006ad48bSBram Moolenaar      try
825006ad48bSBram Moolenaar        throw 'one'
826006ad48bSBram Moolenaar              .. 'two'
827006ad48bSBram Moolenaar      catch
828006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
829006ad48bSBram Moolenaar      endtry
830006ad48bSBram Moolenaar  END
831006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
832006ad48bSBram Moolenaarenddef
833006ad48bSBram Moolenaar
83437c83711SBram Moolenaardef Test_cexpr_vimscript()
835f5be8cdbSBram Moolenaar  # only checks line continuation
83637c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
83737c83711SBram Moolenaar  let lines =<< trim END
83837c83711SBram Moolenaar      vim9script
83937c83711SBram Moolenaar      cexpr 'File'
84037c83711SBram Moolenaar                .. ' someFile' ..
84137c83711SBram Moolenaar                   ' line 19'
84237c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
84337c83711SBram Moolenaar  END
84437c83711SBram Moolenaar  CheckScriptSuccess(lines)
84537c83711SBram Moolenaar  set errorformat&
84637c83711SBram Moolenaarenddef
84737c83711SBram Moolenaar
848b209750bSBram Moolenaardef Test_list_vimscript()
849b209750bSBram Moolenaar  # checks line continuation and comments
850b209750bSBram Moolenaar  let lines =<< trim END
851b209750bSBram Moolenaar      vim9script
852b209750bSBram Moolenaar      let mylist = [
853b209750bSBram Moolenaar            'one',
854b209750bSBram Moolenaar            # comment
855b209750bSBram Moolenaar            'two', # empty line follows
856b209750bSBram Moolenaar
857b209750bSBram Moolenaar            'three',
858b209750bSBram Moolenaar            ]
859b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
860b209750bSBram Moolenaar  END
861b209750bSBram Moolenaar  CheckScriptSuccess(lines)
862b209750bSBram Moolenaarenddef
863b209750bSBram Moolenaar
8642a1381c3SBram Moolenaarif has('channel')
86540ee466cSBram Moolenaar  let someJob = test_null_job()
86640ee466cSBram Moolenaar
86740ee466cSBram Moolenaar  def FuncWithError()
86840ee466cSBram Moolenaar    echomsg g:someJob
86940ee466cSBram Moolenaar  enddef
87040ee466cSBram Moolenaar
87140ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
87240ee466cSBram Moolenaar    try
87340ee466cSBram Moolenaar      call FuncWithError()
87440ee466cSBram Moolenaar    catch
87540ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
87640ee466cSBram Moolenaar    endtry
87740ee466cSBram Moolenaar  endfunc
8782a1381c3SBram Moolenaarendif
87940ee466cSBram Moolenaar
8808a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
8818a7d6542SBram Moolenaar  vim9script
8828a7d6542SBram Moolenaar  let name: string = 'bob'
8838a7d6542SBram Moolenaar  def Concat(arg: string): string
8848a7d6542SBram Moolenaar    return name .. arg
8858a7d6542SBram Moolenaar  enddef
886227a69deSBram Moolenaar  g:result = Concat('bie')
887227a69deSBram Moolenaar  g:localname = name
8888a7d6542SBram Moolenaar
8898a7d6542SBram Moolenaar  export const CONST = 1234
8908a7d6542SBram Moolenaar  export let exported = 9876
8916e587dcbSBram Moolenaar  export let exp_name = 'John'
8928a7d6542SBram Moolenaar  export def Exported(): string
8938a7d6542SBram Moolenaar    return 'Exported'
8948a7d6542SBram Moolenaar  enddef
8958a7d6542SBram MoolenaarEND
8968a7d6542SBram Moolenaar
8975269bd2aSBram Moolenaardef Test_vim9_import_export()
8988a7d6542SBram Moolenaar  let import_script_lines =<< trim END
8998a7d6542SBram Moolenaar    vim9script
9008a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
9018a7d6542SBram Moolenaar    g:imported = exported
9026e587dcbSBram Moolenaar    exported += 3
9036e587dcbSBram Moolenaar    g:imported_added = exported
9048a7d6542SBram Moolenaar    g:imported_func = Exported()
9056e587dcbSBram Moolenaar
9066e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
9076e587dcbSBram Moolenaar    g:imported_name = exp_name
9086e587dcbSBram Moolenaar    exp_name ..= ' Doe'
9096e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
9105381c7a1SBram Moolenaar    g:imported_later = exported
9118a7d6542SBram Moolenaar  END
9128a7d6542SBram Moolenaar
9138a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
9148a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
9158a7d6542SBram Moolenaar
9168a7d6542SBram Moolenaar  source Ximport.vim
9178a7d6542SBram Moolenaar
9188a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
9198a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
9208a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
9216e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
9225381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
9238a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
9246e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
9256e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
9268a7d6542SBram Moolenaar  assert_false(exists('g:name'))
9278a7d6542SBram Moolenaar
9288a7d6542SBram Moolenaar  unlet g:result
9298a7d6542SBram Moolenaar  unlet g:localname
9308a7d6542SBram Moolenaar  unlet g:imported
9316e587dcbSBram Moolenaar  unlet g:imported_added
9325381c7a1SBram Moolenaar  unlet g:imported_later
9338a7d6542SBram Moolenaar  unlet g:imported_func
9346e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
9358a7d6542SBram Moolenaar  delete('Ximport.vim')
936f2d5c240SBram Moolenaar
9371c991144SBram Moolenaar  # similar, with line breaks
9381c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
9391c991144SBram Moolenaar    vim9script
9401c991144SBram Moolenaar    import {
9411c991144SBram Moolenaar        exported,
9421c991144SBram Moolenaar        Exported,
9431c991144SBram Moolenaar        }
9441c991144SBram Moolenaar        from
9451c991144SBram Moolenaar        './Xexport.vim'
9461c991144SBram Moolenaar    g:imported = exported
9471c991144SBram Moolenaar    exported += 5
9481c991144SBram Moolenaar    g:imported_added = exported
9491c991144SBram Moolenaar    g:imported_func = Exported()
9501c991144SBram Moolenaar  END
9511c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
9521c991144SBram Moolenaar  source Ximport_lbr.vim
9531c991144SBram Moolenaar
9541c991144SBram Moolenaar  assert_equal(9876, g:imported)
9551c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
9561c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
9571c991144SBram Moolenaar
9581c991144SBram Moolenaar  # exported script not sourced again
9591c991144SBram Moolenaar  assert_false(exists('g:result'))
9601c991144SBram Moolenaar  unlet g:imported
9611c991144SBram Moolenaar  unlet g:imported_added
9621c991144SBram Moolenaar  unlet g:imported_func
9631c991144SBram Moolenaar  delete('Ximport_lbr.vim')
9641c991144SBram Moolenaar
9651c991144SBram Moolenaar  # import inside :def function
9665381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
9675381c7a1SBram Moolenaar    vim9script
9685381c7a1SBram Moolenaar    def ImportInDef()
9695381c7a1SBram Moolenaar      import exported from './Xexport.vim'
9705381c7a1SBram Moolenaar      g:imported = exported
9715381c7a1SBram Moolenaar      exported += 7
9725381c7a1SBram Moolenaar      g:imported_added = exported
9735381c7a1SBram Moolenaar    enddef
9745381c7a1SBram Moolenaar    ImportInDef()
9755381c7a1SBram Moolenaar  END
9765381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
9775381c7a1SBram Moolenaar  source Ximport2.vim
978f5be8cdbSBram Moolenaar  # TODO: this should be 9879
9795381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
9805381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
9815381c7a1SBram Moolenaar  unlet g:imported
9825381c7a1SBram Moolenaar  unlet g:imported_added
9835381c7a1SBram Moolenaar  delete('Ximport2.vim')
9845381c7a1SBram Moolenaar
985f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
986f2d5c240SBram Moolenaar    vim9script
987f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
988f2d5c240SBram Moolenaar    def UseExport()
989f2d5c240SBram Moolenaar      g:imported = Export.exported
990f2d5c240SBram Moolenaar    enddef
991f2d5c240SBram Moolenaar    UseExport()
992f2d5c240SBram Moolenaar  END
993f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
994f2d5c240SBram Moolenaar  source Ximport.vim
9955381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
996f2d5c240SBram Moolenaar
997599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
998599c89c8SBram Moolenaar    vim9script
999599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1000599c89c8SBram Moolenaar    def Func()
1001599c89c8SBram Moolenaar      let dummy = 1
1002599c89c8SBram Moolenaar      let imported = Export + dummy
1003599c89c8SBram Moolenaar    enddef
1004822ba247SBram Moolenaar    defcompile
1005599c89c8SBram Moolenaar  END
1006599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1007599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1008599c89c8SBram Moolenaar
1009599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1010599c89c8SBram Moolenaar    vim9script
1011599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1012599c89c8SBram Moolenaar    def Func()
1013599c89c8SBram Moolenaar      let imported = Export . exported
1014599c89c8SBram Moolenaar    enddef
1015822ba247SBram Moolenaar    defcompile
1016599c89c8SBram Moolenaar  END
1017599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1018599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1019599c89c8SBram Moolenaar
1020599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1021599c89c8SBram Moolenaar    vim9script
1022599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1023599c89c8SBram Moolenaar    def Func()
1024599c89c8SBram Moolenaar      let imported = Export.
1025599c89c8SBram Moolenaar    enddef
1026822ba247SBram Moolenaar    defcompile
1027599c89c8SBram Moolenaar  END
1028599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1029599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1030599c89c8SBram Moolenaar
10311c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
10321c991144SBram Moolenaar    vim9script
10331c991144SBram Moolenaar    import *
10341c991144SBram Moolenaar        as Export
10351c991144SBram Moolenaar        from
10361c991144SBram Moolenaar        './Xexport.vim'
10371c991144SBram Moolenaar    def UseExport()
10381c991144SBram Moolenaar      g:imported = Export.exported
10391c991144SBram Moolenaar    enddef
10401c991144SBram Moolenaar    UseExport()
10411c991144SBram Moolenaar  END
10421c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
10431c991144SBram Moolenaar  source Ximport.vim
10441c991144SBram Moolenaar  assert_equal(9883, g:imported)
10451c991144SBram Moolenaar
1046f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1047f2d5c240SBram Moolenaar    vim9script
1048f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1049f2d5c240SBram Moolenaar  END
1050f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1051f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1052f2d5c240SBram Moolenaar
1053f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1054fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1055fa29c8abSBram Moolenaar    vim9script
1056fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1057fa29c8abSBram Moolenaar  END
1058fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1059fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1060fa29c8abSBram Moolenaar
1061f5be8cdbSBram Moolenaar  # try to import something that is already defined
10625269bd2aSBram Moolenaar  let import_already_defined =<< trim END
10635269bd2aSBram Moolenaar    vim9script
10645269bd2aSBram Moolenaar    let exported = 'something'
10655269bd2aSBram Moolenaar    import exported from './Xexport.vim'
10665269bd2aSBram Moolenaar  END
10675269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
10685269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
10695269bd2aSBram Moolenaar
1070f5be8cdbSBram Moolenaar  # try to import something that is already defined
10715269bd2aSBram Moolenaar  import_already_defined =<< trim END
10725269bd2aSBram Moolenaar    vim9script
10735269bd2aSBram Moolenaar    let exported = 'something'
10745269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
10755269bd2aSBram Moolenaar  END
10765269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
10775269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
10785269bd2aSBram Moolenaar
1079f5be8cdbSBram Moolenaar  # try to import something that is already defined
10805269bd2aSBram Moolenaar  import_already_defined =<< trim END
10815269bd2aSBram Moolenaar    vim9script
10825269bd2aSBram Moolenaar    let exported = 'something'
10835269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
10845269bd2aSBram Moolenaar  END
10855269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
10865269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
10875269bd2aSBram Moolenaar
1088f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1089fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1090fa29c8abSBram Moolenaar    vim9script
1091fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1092fa29c8abSBram Moolenaar  END
1093fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1094fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1095fa29c8abSBram Moolenaar
1096fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1097fa29c8abSBram Moolenaar    vim9script
1098fa29c8abSBram Moolenaar    import name './Xexport.vim'
1099fa29c8abSBram Moolenaar  END
1100fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1101fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1102fa29c8abSBram Moolenaar
1103fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1104fa29c8abSBram Moolenaar    vim9script
1105fa29c8abSBram Moolenaar    import name from Xexport.vim
1106fa29c8abSBram Moolenaar  END
1107fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1108fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1109fa29c8abSBram Moolenaar
1110fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1111fa29c8abSBram Moolenaar    vim9script
1112fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1113fa29c8abSBram Moolenaar  END
1114fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1115fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1116fa29c8abSBram Moolenaar
1117fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1118fa29c8abSBram Moolenaar    vim9script
1119fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1120fa29c8abSBram Moolenaar  END
11215269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
11225269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1123fa29c8abSBram Moolenaar
1124f2d5c240SBram Moolenaar  delete('Ximport.vim')
11255269bd2aSBram Moolenaar  delete('Ximport3.vim')
11268a7d6542SBram Moolenaar  delete('Xexport.vim')
11278a7d6542SBram Moolenaar
1128f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1129750802b5SBram Moolenaar  set cpo&vi
1130750802b5SBram Moolenaar  let cpo_before = &cpo
1131750802b5SBram Moolenaar  let lines =<< trim END
1132750802b5SBram Moolenaar    vim9script
1133750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1134750802b5SBram Moolenaar  END
1135750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1136750802b5SBram Moolenaar  source Xvim9_script
1137750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1138750802b5SBram Moolenaar  set cpo&vim
1139750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1140750802b5SBram Moolenaar  delete('Xvim9_script')
1141750802b5SBram Moolenaarenddef
1142750802b5SBram Moolenaar
1143750802b5SBram Moolenaardef Test_vim9script_fails()
11448a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
11458a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1146750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
11479721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
11489b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1149750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1150750802b5SBram Moolenaar
1151c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1152c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1153c785b9a7SBram Moolenaar
1154750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1155a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
11568a7d6542SBram Moolenaarenddef
11578a7d6542SBram Moolenaar
1158f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1159101f4810SBram Moolenaar  CheckRunVimInTerminal
1160101f4810SBram Moolenaar
11619bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1162c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
11639bb3eb3eSBram Moolenaarendfunc
11649bb3eb3eSBram Moolenaar
1165c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1166101f4810SBram Moolenaar  let export =<< trim END
1167101f4810SBram Moolenaar    vim9script
1168101f4810SBram Moolenaar    export def Foo(): number
1169101f4810SBram Moolenaar        return 0
1170101f4810SBram Moolenaar    enddef
1171101f4810SBram Moolenaar  END
11729bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
1173101f4810SBram Moolenaar
11749bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
11759bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
11769bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1177101f4810SBram Moolenaar
11789bb3eb3eSBram Moolenaar  delete('Xexport.vim')
11799bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
11809bb3eb3eSBram Moolenaarenddef
1181101f4810SBram Moolenaar
11824c17ad94SBram Moolenaardef Test_vim9script_reload_import()
11838a7d6542SBram Moolenaar  let lines =<< trim END
11848a7d6542SBram Moolenaar    vim9script
11858a7d6542SBram Moolenaar    const var = ''
11868a7d6542SBram Moolenaar    let valone = 1234
11878a7d6542SBram Moolenaar    def MyFunc(arg: string)
11888a7d6542SBram Moolenaar       valone = 5678
11898a7d6542SBram Moolenaar    enddef
11908a7d6542SBram Moolenaar  END
11918a7d6542SBram Moolenaar  let morelines =<< trim END
11928a7d6542SBram Moolenaar    let valtwo = 222
11938a7d6542SBram Moolenaar    export def GetValtwo(): number
11948a7d6542SBram Moolenaar      return valtwo
11958a7d6542SBram Moolenaar    enddef
11968a7d6542SBram Moolenaar  END
119703afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
11988a7d6542SBram Moolenaar  source Xreload.vim
11998a7d6542SBram Moolenaar  source Xreload.vim
12008a7d6542SBram Moolenaar  source Xreload.vim
12018a7d6542SBram Moolenaar
12028a7d6542SBram Moolenaar  let testlines =<< trim END
12038a7d6542SBram Moolenaar    vim9script
12048a7d6542SBram Moolenaar    def TheFunc()
12058a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
12068a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
12078a7d6542SBram Moolenaar    enddef
12088a7d6542SBram Moolenaar    TheFunc()
12098a7d6542SBram Moolenaar  END
12108a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
12118a7d6542SBram Moolenaar  source Ximport.vim
12128a7d6542SBram Moolenaar
1213f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1214f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
12158a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
12168a7d6542SBram Moolenaar  source Ximport.vim
12178a7d6542SBram Moolenaar
1218f5be8cdbSBram Moolenaar  # cannot declare a var twice
12198a7d6542SBram Moolenaar  lines =<< trim END
12208a7d6542SBram Moolenaar    vim9script
12218a7d6542SBram Moolenaar    let valone = 1234
12228a7d6542SBram Moolenaar    let valone = 5678
12238a7d6542SBram Moolenaar  END
12248a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
12258a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
12268a7d6542SBram Moolenaar
12278a7d6542SBram Moolenaar  delete('Xreload.vim')
12288a7d6542SBram Moolenaar  delete('Ximport.vim')
12298a7d6542SBram Moolenaarenddef
12308a7d6542SBram Moolenaar
1231fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1232fe465a01SBram Moolenaar" script-local name.
1233fe465a01SBram Moolenaardef Test_vim9script_funcref()
1234fe465a01SBram Moolenaar  let sortlines =<< trim END
1235fe465a01SBram Moolenaar      vim9script
1236fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1237bed36b93SBram Moolenaar        return i2 - i1
1238fe465a01SBram Moolenaar      enddef
1239fe465a01SBram Moolenaar
1240fe465a01SBram Moolenaar      export def FastSort(): list<number>
1241fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1242fe465a01SBram Moolenaar      enddef
1243fe465a01SBram Moolenaar  END
1244fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1245fe465a01SBram Moolenaar
1246fe465a01SBram Moolenaar  let lines =<< trim END
1247fe465a01SBram Moolenaar    vim9script
1248fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1249fe465a01SBram Moolenaar    def Test()
1250fe465a01SBram Moolenaar      g:result = FastSort()
1251fe465a01SBram Moolenaar    enddef
1252fe465a01SBram Moolenaar    Test()
1253fe465a01SBram Moolenaar  END
1254fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1255fe465a01SBram Moolenaar
1256fe465a01SBram Moolenaar  source Xscript.vim
1257fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1258fe465a01SBram Moolenaar
1259fe465a01SBram Moolenaar  unlet g:result
1260fe465a01SBram Moolenaar  delete('Xsort.vim')
1261fe465a01SBram Moolenaar  delete('Xscript.vim')
1262fe465a01SBram Moolenaarenddef
1263fe465a01SBram Moolenaar
1264c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1265c620c055SBram Moolenaar" script where FastFilter() is called from.
1266c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1267c620c055SBram Moolenaar  let filterLines =<< trim END
1268c620c055SBram Moolenaar    vim9script
1269c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1270c620c055SBram Moolenaar      return idx % 2 == 1
1271c620c055SBram Moolenaar    enddef
1272c620c055SBram Moolenaar    export def FastFilter(): list<number>
1273c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1274c620c055SBram Moolenaar    enddef
1275c620c055SBram Moolenaar  END
1276c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1277c620c055SBram Moolenaar
1278c620c055SBram Moolenaar  let lines =<< trim END
1279c620c055SBram Moolenaar    vim9script
1280c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1281c620c055SBram Moolenaar    def Test()
1282c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1283c620c055SBram Moolenaar    enddef
1284c620c055SBram Moolenaar    Test()
1285c620c055SBram Moolenaar  END
1286c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1287c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1288c620c055SBram Moolenaar
1289c620c055SBram Moolenaar  delete('Xfilter.vim')
1290c620c055SBram Moolenaar  delete('Ximport.vim')
1291c620c055SBram Moolenaarenddef
1292c620c055SBram Moolenaar
12934c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
12944c17ad94SBram Moolenaar  let first_lines =<< trim END
12954c17ad94SBram Moolenaar    vim9script
12964c17ad94SBram Moolenaar    def FuncYes(): string
12974c17ad94SBram Moolenaar      return 'yes'
12984c17ad94SBram Moolenaar    enddef
12994c17ad94SBram Moolenaar  END
130003afdcf1SBram Moolenaar  let withno_lines =<< trim END
13014c17ad94SBram Moolenaar    def FuncNo(): string
13024c17ad94SBram Moolenaar      return 'no'
13034c17ad94SBram Moolenaar    enddef
13044c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
13054c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
13064c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
130703afdcf1SBram Moolenaar    enddef
130803afdcf1SBram Moolenaar  END
130903afdcf1SBram Moolenaar  let nono_lines =<< trim END
131003afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
131103afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
13124c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
13134c17ad94SBram Moolenaar    enddef
13144c17ad94SBram Moolenaar  END
13154c17ad94SBram Moolenaar
13164c17ad94SBram Moolenaar  # FuncNo() is defined
131703afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13184c17ad94SBram Moolenaar  source Xreloaded.vim
13194c17ad94SBram Moolenaar  g:DoCheck(true)
13204c17ad94SBram Moolenaar
13214c17ad94SBram Moolenaar  # FuncNo() is not redefined
132203afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
13234c17ad94SBram Moolenaar  source Xreloaded.vim
132403afdcf1SBram Moolenaar  g:DoCheck()
13254c17ad94SBram Moolenaar
13264c17ad94SBram Moolenaar  # FuncNo() is back
132703afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13284c17ad94SBram Moolenaar  source Xreloaded.vim
132903afdcf1SBram Moolenaar  g:DoCheck()
13304c17ad94SBram Moolenaar
13314c17ad94SBram Moolenaar  delete('Xreloaded.vim')
13324c17ad94SBram Moolenaarenddef
13334c17ad94SBram Moolenaar
133489483d40SBram Moolenaardef Test_vim9script_reload_delvar()
133589483d40SBram Moolenaar  # write the script with a script-local variable
133689483d40SBram Moolenaar  let lines =<< trim END
133789483d40SBram Moolenaar    vim9script
133889483d40SBram Moolenaar    let var = 'string'
133989483d40SBram Moolenaar  END
134089483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
134189483d40SBram Moolenaar  source XreloadVar.vim
134289483d40SBram Moolenaar
134389483d40SBram Moolenaar  # now write the script using the same variable locally - works
134489483d40SBram Moolenaar  lines =<< trim END
134589483d40SBram Moolenaar    vim9script
134689483d40SBram Moolenaar    def Func()
134789483d40SBram Moolenaar      let var = 'string'
134889483d40SBram Moolenaar    enddef
134989483d40SBram Moolenaar  END
135089483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
135189483d40SBram Moolenaar  source XreloadVar.vim
135289483d40SBram Moolenaar
135389483d40SBram Moolenaar  delete('XreloadVar.vim')
135489483d40SBram Moolenaarenddef
135589483d40SBram Moolenaar
13568a7d6542SBram Moolenaardef Test_import_absolute()
13578a7d6542SBram Moolenaar  let import_lines = [
1358e6085c53SBram Moolenaar        'vim9script',
1359e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1360e6085c53SBram Moolenaar        'def UseExported()',
1361e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1362e6085c53SBram Moolenaar        '  exported = 8888',
1363e6085c53SBram Moolenaar        '  g:imported_after = exported',
1364e6085c53SBram Moolenaar        'enddef',
1365e6085c53SBram Moolenaar        'UseExported()',
1366e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1367e6085c53SBram Moolenaar        ]
13688a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
13698a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
13708a7d6542SBram Moolenaar
13718a7d6542SBram Moolenaar  source Ximport_abs.vim
13728a7d6542SBram Moolenaar
13738a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
13744e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1375675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1376675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1377675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1378675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1379675f716eSBram Moolenaar          'exported = 8888.*' ..
1380675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1381675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1382675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1383675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1384e6085c53SBram Moolenaar        g:import_disassembled)
13858a7d6542SBram Moolenaar  unlet g:imported_abs
13864e12a5dfSBram Moolenaar  unlet g:import_disassembled
13878a7d6542SBram Moolenaar
13888a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
13898a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
13908a7d6542SBram Moolenaarenddef
13918a7d6542SBram Moolenaar
13928a7d6542SBram Moolenaardef Test_import_rtp()
13938a7d6542SBram Moolenaar  let import_lines = [
1394e6085c53SBram Moolenaar        'vim9script',
1395e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1396e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1397e6085c53SBram Moolenaar        ]
13988a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
13998a7d6542SBram Moolenaar  mkdir('import')
14008a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
14018a7d6542SBram Moolenaar
14028a7d6542SBram Moolenaar  let save_rtp = &rtp
14038a7d6542SBram Moolenaar  &rtp = getcwd()
14048a7d6542SBram Moolenaar  source Ximport_rtp.vim
14058a7d6542SBram Moolenaar  &rtp = save_rtp
14068a7d6542SBram Moolenaar
14078a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
14088a7d6542SBram Moolenaar  unlet g:imported_rtp
14098a7d6542SBram Moolenaar
14108a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
141189483d40SBram Moolenaar  delete('import', 'rf')
14128a7d6542SBram Moolenaarenddef
14138a7d6542SBram Moolenaar
141425e0f586SBram Moolenaardef Test_import_compile_error()
141525e0f586SBram Moolenaar  let export_lines = [
141625e0f586SBram Moolenaar        'vim9script',
141725e0f586SBram Moolenaar        'export def ExpFunc(): string',
141825e0f586SBram Moolenaar        '  return notDefined',
141925e0f586SBram Moolenaar        'enddef',
142025e0f586SBram Moolenaar        ]
142125e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
142225e0f586SBram Moolenaar
142325e0f586SBram Moolenaar  let import_lines = [
142425e0f586SBram Moolenaar        'vim9script',
142525e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
142625e0f586SBram Moolenaar        'def ImpFunc()',
142725e0f586SBram Moolenaar        '  echo ExpFunc()',
142825e0f586SBram Moolenaar        'enddef',
142925e0f586SBram Moolenaar        'defcompile',
143025e0f586SBram Moolenaar        ]
143125e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
143225e0f586SBram Moolenaar
143325e0f586SBram Moolenaar  try
143425e0f586SBram Moolenaar    source Ximport.vim
143525e0f586SBram Moolenaar  catch /E1001/
1436f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
143725e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
143825e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
143925e0f586SBram Moolenaar  endtry
144025e0f586SBram Moolenaar
144125e0f586SBram Moolenaar  delete('Xexported.vim')
144225e0f586SBram Moolenaar  delete('Ximport.vim')
144325e0f586SBram Moolenaarenddef
144425e0f586SBram Moolenaar
14458a7d6542SBram Moolenaardef Test_fixed_size_list()
1446f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
14478a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
14488a7d6542SBram Moolenaar  l->remove(0)
14498a7d6542SBram Moolenaar  l->add(5)
14508a7d6542SBram Moolenaar  l->insert(99, 1)
14510f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
14528a7d6542SBram Moolenaarenddef
14538a7d6542SBram Moolenaar
1454158906cfSBram Moolenaardef IfElse(what: number): string
1455158906cfSBram Moolenaar  let res = ''
1456158906cfSBram Moolenaar  if what == 1
1457158906cfSBram Moolenaar    res = "one"
1458158906cfSBram Moolenaar  elseif what == 2
1459158906cfSBram Moolenaar    res = "two"
1460a259d8d3SBram Moolenaar  else
1461158906cfSBram Moolenaar    res = "three"
1462a259d8d3SBram Moolenaar  endif
1463158906cfSBram Moolenaar  return res
1464a259d8d3SBram Moolenaarenddef
1465a259d8d3SBram Moolenaar
1466158906cfSBram Moolenaardef Test_if_elseif_else()
1467158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1468158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1469158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
14700f18b6d1SBram Moolenaarenddef
14710f18b6d1SBram Moolenaar
1472e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1473e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1474e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1475e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1476e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1477585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1478e8c4abbbSBram Moolenaarenddef
1479e8c4abbbSBram Moolenaar
14806d69bf60SBram Moolenaarlet g:bool_true = v:true
14816d69bf60SBram Moolenaarlet g:bool_false = v:false
14826d69bf60SBram Moolenaar
14836d69bf60SBram Moolenaardef Test_if_const_expr()
14846d69bf60SBram Moolenaar  let res = false
14856d69bf60SBram Moolenaar  if true ? true : false
14866d69bf60SBram Moolenaar    res = true
14876d69bf60SBram Moolenaar  endif
14886d69bf60SBram Moolenaar  assert_equal(true, res)
14896d69bf60SBram Moolenaar
1490585fea7bSBram Moolenaar  g:glob = 2
1491585fea7bSBram Moolenaar  if false
14926797966dSBram Moolenaar    execute('g:glob = 3')
1493585fea7bSBram Moolenaar  endif
1494585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1495585fea7bSBram Moolenaar  if true
14966797966dSBram Moolenaar    execute('g:glob = 3')
1497585fea7bSBram Moolenaar  endif
1498585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1499585fea7bSBram Moolenaar
15006d69bf60SBram Moolenaar  res = false
15016d69bf60SBram Moolenaar  if g:bool_true ? true : false
15026d69bf60SBram Moolenaar    res = true
15036d69bf60SBram Moolenaar  endif
15046d69bf60SBram Moolenaar  assert_equal(true, res)
15056d69bf60SBram Moolenaar
15066d69bf60SBram Moolenaar  res = false
15076d69bf60SBram Moolenaar  if true ? g:bool_true : false
15086d69bf60SBram Moolenaar    res = true
15096d69bf60SBram Moolenaar  endif
15106d69bf60SBram Moolenaar  assert_equal(true, res)
15116d69bf60SBram Moolenaar
15126d69bf60SBram Moolenaar  res = false
15136d69bf60SBram Moolenaar  if true ? true : g:bool_false
15146d69bf60SBram Moolenaar    res = true
15156d69bf60SBram Moolenaar  endif
15166d69bf60SBram Moolenaar  assert_equal(true, res)
15176d69bf60SBram Moolenaar
15186d69bf60SBram Moolenaar  res = false
15196d69bf60SBram Moolenaar  if true ? false : true
15206d69bf60SBram Moolenaar    res = true
15216d69bf60SBram Moolenaar  endif
15226d69bf60SBram Moolenaar  assert_equal(false, res)
15236d69bf60SBram Moolenaar
15246d69bf60SBram Moolenaar  res = false
15256d69bf60SBram Moolenaar  if false ? false : true
15266d69bf60SBram Moolenaar    res = true
15276d69bf60SBram Moolenaar  endif
15286d69bf60SBram Moolenaar  assert_equal(true, res)
15296d69bf60SBram Moolenaar
15306d69bf60SBram Moolenaar  res = false
15316d69bf60SBram Moolenaar  if false ? true : false
15326d69bf60SBram Moolenaar    res = true
15336d69bf60SBram Moolenaar  endif
15346d69bf60SBram Moolenaar  assert_equal(false, res)
15356d69bf60SBram Moolenaar
15366d69bf60SBram Moolenaar  res = false
1537e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1538e8c4abbbSBram Moolenaar    res = true
1539e8c4abbbSBram Moolenaar  endif
1540e8c4abbbSBram Moolenaar  assert_equal(false, res)
1541e8c4abbbSBram Moolenaar
1542e8c4abbbSBram Moolenaar  res = false
15436d69bf60SBram Moolenaar  if true && true
15446d69bf60SBram Moolenaar    res = true
15456d69bf60SBram Moolenaar  endif
15466d69bf60SBram Moolenaar  assert_equal(true, res)
15476d69bf60SBram Moolenaar
15486d69bf60SBram Moolenaar  res = false
15496d69bf60SBram Moolenaar  if true && false
15506d69bf60SBram Moolenaar    res = true
15516d69bf60SBram Moolenaar  endif
15526d69bf60SBram Moolenaar  assert_equal(false, res)
15536d69bf60SBram Moolenaar
15546d69bf60SBram Moolenaar  res = false
15556d69bf60SBram Moolenaar  if g:bool_true && false
15566d69bf60SBram Moolenaar    res = true
15576d69bf60SBram Moolenaar  endif
15586d69bf60SBram Moolenaar  assert_equal(false, res)
15596d69bf60SBram Moolenaar
15606d69bf60SBram Moolenaar  res = false
15616d69bf60SBram Moolenaar  if true && g:bool_false
15626d69bf60SBram Moolenaar    res = true
15636d69bf60SBram Moolenaar  endif
15646d69bf60SBram Moolenaar  assert_equal(false, res)
15656d69bf60SBram Moolenaar
15666d69bf60SBram Moolenaar  res = false
15676d69bf60SBram Moolenaar  if false && false
15686d69bf60SBram Moolenaar    res = true
15696d69bf60SBram Moolenaar  endif
15706d69bf60SBram Moolenaar  assert_equal(false, res)
15716d69bf60SBram Moolenaar
15726d69bf60SBram Moolenaar  res = false
15736d69bf60SBram Moolenaar  if true || false
15746d69bf60SBram Moolenaar    res = true
15756d69bf60SBram Moolenaar  endif
15766d69bf60SBram Moolenaar  assert_equal(true, res)
15776d69bf60SBram Moolenaar
15786d69bf60SBram Moolenaar  res = false
15796d69bf60SBram Moolenaar  if g:bool_true || false
15806d69bf60SBram Moolenaar    res = true
15816d69bf60SBram Moolenaar  endif
15826d69bf60SBram Moolenaar  assert_equal(true, res)
15836d69bf60SBram Moolenaar
15846d69bf60SBram Moolenaar  res = false
15856d69bf60SBram Moolenaar  if true || g:bool_false
15866d69bf60SBram Moolenaar    res = true
15876d69bf60SBram Moolenaar  endif
15886d69bf60SBram Moolenaar  assert_equal(true, res)
15896d69bf60SBram Moolenaar
15906d69bf60SBram Moolenaar  res = false
15916d69bf60SBram Moolenaar  if false || false
15926d69bf60SBram Moolenaar    res = true
15936d69bf60SBram Moolenaar  endif
15946d69bf60SBram Moolenaar  assert_equal(false, res)
159580c34ca3SBram Moolenaarenddef
15966d69bf60SBram Moolenaar
159780c34ca3SBram Moolenaardef Test_if_const_expr_fails()
159880c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
159980c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1600e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1601e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
16026d69bf60SBram Moolenaarenddef
16036d69bf60SBram Moolenaar
160472abcf42SBram Moolenaardef RunNested(i: number): number
160572abcf42SBram Moolenaar  let x: number = 0
160672abcf42SBram Moolenaar  if i % 2
160772abcf42SBram Moolenaar    if 1
1608f5be8cdbSBram Moolenaar      # comment
160972abcf42SBram Moolenaar    else
1610f5be8cdbSBram Moolenaar      # comment
161172abcf42SBram Moolenaar    endif
161272abcf42SBram Moolenaar    x += 1
161372abcf42SBram Moolenaar  else
161472abcf42SBram Moolenaar    x += 1000
161572abcf42SBram Moolenaar  endif
161672abcf42SBram Moolenaar  return x
161772abcf42SBram Moolenaarenddef
161872abcf42SBram Moolenaar
161972abcf42SBram Moolenaardef Test_nested_if()
162072abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
162172abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
162272abcf42SBram Moolenaarenddef
162372abcf42SBram Moolenaar
1624ad39c094SBram Moolenaardef Test_execute_cmd()
1625ad39c094SBram Moolenaar  new
1626ad39c094SBram Moolenaar  setline(1, 'default')
1627ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1628ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1629a72cfb80SBram Moolenaar
1630a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1631a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1632a72cfb80SBram Moolenaar
1633ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1634ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1635a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1636ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1637a72cfb80SBram Moolenaar
1638ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1639ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1640a72cfb80SBram Moolenaar
1641ad39c094SBram Moolenaar  let cmd_first = 'call '
1642ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1643ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1644ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1645ad39c094SBram Moolenaar  bwipe!
1646585fea7bSBram Moolenaar
1647585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1648a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1649ad39c094SBram Moolenaarenddef
1650ad39c094SBram Moolenaar
165147e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1652f5be8cdbSBram Moolenaar  # only checks line continuation
165347e880d6SBram Moolenaar  let lines =<< trim END
165447e880d6SBram Moolenaar      vim9script
165547e880d6SBram Moolenaar      execute 'g:someVar'
165647e880d6SBram Moolenaar                .. ' = ' ..
165747e880d6SBram Moolenaar                   '28'
165847e880d6SBram Moolenaar      assert_equal(28, g:someVar)
165947e880d6SBram Moolenaar      unlet g:someVar
166047e880d6SBram Moolenaar  END
166147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
166247e880d6SBram Moolenaarenddef
166347e880d6SBram Moolenaar
1664ad39c094SBram Moolenaardef Test_echo_cmd()
1665a72cfb80SBram Moolenaar  echo 'some' # comment
1666585fea7bSBram Moolenaar  echon 'thing'
1667ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1668ad39c094SBram Moolenaar
1669a72cfb80SBram Moolenaar  echo "some" # comment
1670a72cfb80SBram Moolenaar  echon "thing"
1671a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1672a72cfb80SBram Moolenaar
1673ad39c094SBram Moolenaar  let str1 = 'some'
1674ad39c094SBram Moolenaar  let str2 = 'more'
1675ad39c094SBram Moolenaar  echo str1 str2
1676ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1677a72cfb80SBram Moolenaar
1678a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1679ad39c094SBram Moolenaarenddef
1680ad39c094SBram Moolenaar
1681f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1682f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1683f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1684f93c7feaSBram Moolenaar  echo 'clear'
1685df069eecSBram Moolenaar  :1messages
1686f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1687f93c7feaSBram Moolenaar
1688f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1689f93c7feaSBram Moolenaarenddef
1690f93c7feaSBram Moolenaar
169147e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1692f5be8cdbSBram Moolenaar  # only checks line continuation
169347e880d6SBram Moolenaar  let lines =<< trim END
169447e880d6SBram Moolenaar      vim9script
169547e880d6SBram Moolenaar      echomsg 'here'
169647e880d6SBram Moolenaar                .. ' is ' ..
169747e880d6SBram Moolenaar                   'a message'
169847e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
169947e880d6SBram Moolenaar  END
170047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
170147e880d6SBram Moolenaarenddef
170247e880d6SBram Moolenaar
1703f93c7feaSBram Moolenaardef Test_echoerr_cmd()
170440ee466cSBram Moolenaar  try
170540ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
170640ee466cSBram Moolenaar  catch
170740ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
170840ee466cSBram Moolenaar  endtry
1709f93c7feaSBram Moolenaarenddef
1710f93c7feaSBram Moolenaar
171147e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1712f5be8cdbSBram Moolenaar  # only checks line continuation
171347e880d6SBram Moolenaar  let lines =<< trim END
171447e880d6SBram Moolenaar      vim9script
171547e880d6SBram Moolenaar      try
171647e880d6SBram Moolenaar        echoerr 'this'
171747e880d6SBram Moolenaar                .. ' is ' ..
171847e880d6SBram Moolenaar                   'wrong'
171947e880d6SBram Moolenaar      catch
172047e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
172147e880d6SBram Moolenaar      endtry
172247e880d6SBram Moolenaar  END
172347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
172447e880d6SBram Moolenaarenddef
172547e880d6SBram Moolenaar
172641fe0617SBram Moolenaardef Test_for_outside_of_function()
172741fe0617SBram Moolenaar  let lines =<< trim END
172841fe0617SBram Moolenaar    vim9script
172941fe0617SBram Moolenaar    new
173041fe0617SBram Moolenaar    for var in range(0, 3)
173141fe0617SBram Moolenaar      append(line('$'), var)
173241fe0617SBram Moolenaar    endfor
173341fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
173441fe0617SBram Moolenaar    bwipe!
173541fe0617SBram Moolenaar  END
173641fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
173741fe0617SBram Moolenaar  source Xvim9for.vim
173841fe0617SBram Moolenaar  delete('Xvim9for.vim')
173941fe0617SBram Moolenaarenddef
17408a7d6542SBram Moolenaar
1741e8c4abbbSBram Moolenaardef Test_for_loop()
1742e8c4abbbSBram Moolenaar  let result = ''
1743e8c4abbbSBram Moolenaar  for cnt in range(7)
1744e8c4abbbSBram Moolenaar    if cnt == 4
1745e8c4abbbSBram Moolenaar      break
1746e8c4abbbSBram Moolenaar    endif
1747e8c4abbbSBram Moolenaar    if cnt == 2
1748e8c4abbbSBram Moolenaar      continue
1749e8c4abbbSBram Moolenaar    endif
1750e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1751e8c4abbbSBram Moolenaar  endfor
1752e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
17530ad3e894SBram Moolenaar
17540ad3e894SBram Moolenaar  let concat = ''
17550ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
17560ad3e894SBram Moolenaar    concat ..= str
17570ad3e894SBram Moolenaar  endfor
17580ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1759e8c4abbbSBram Moolenaarenddef
1760e8c4abbbSBram Moolenaar
1761e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1762675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1763675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1764675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1765822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
17660ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
1767675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1768675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1769675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1770e8c4abbbSBram Moolenaarenddef
1771e8c4abbbSBram Moolenaar
1772d0df1aacSBram Moolenaardef Test_while_loop()
1773d0df1aacSBram Moolenaar  let result = ''
1774d0df1aacSBram Moolenaar  let cnt = 0
1775d0df1aacSBram Moolenaar  while cnt < 555
1776d0df1aacSBram Moolenaar    if cnt == 3
1777d0df1aacSBram Moolenaar      break
1778d0df1aacSBram Moolenaar    endif
1779d0df1aacSBram Moolenaar    cnt += 1
1780d0df1aacSBram Moolenaar    if cnt == 2
1781d0df1aacSBram Moolenaar      continue
1782d0df1aacSBram Moolenaar    endif
1783d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1784d0df1aacSBram Moolenaar  endwhile
1785d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1786d0df1aacSBram Moolenaarenddef
1787d0df1aacSBram Moolenaar
1788e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1789675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1790675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1791675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1792675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1793675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1794675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1795675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1796bd5da371SBram Moolenaarenddef
1797bd5da371SBram Moolenaar
17989645e2d9SBram Moolenaardef Test_interrupt_loop()
179997acfc78SBram Moolenaar  let caught = false
18009645e2d9SBram Moolenaar  let x = 0
180197acfc78SBram Moolenaar  try
18029645e2d9SBram Moolenaar    while 1
18039645e2d9SBram Moolenaar      x += 1
18049645e2d9SBram Moolenaar      if x == 100
18059645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
18069645e2d9SBram Moolenaar      endif
18079645e2d9SBram Moolenaar    endwhile
180897acfc78SBram Moolenaar  catch
180997acfc78SBram Moolenaar    caught = true
181097acfc78SBram Moolenaar    assert_equal(100, x)
181197acfc78SBram Moolenaar  endtry
181297acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
18139645e2d9SBram Moolenaarenddef
181420431c9dSBram Moolenaar
18154fdae999SBram Moolenaardef Test_automatic_line_continuation()
18164fdae999SBram Moolenaar  let mylist = [
18174fdae999SBram Moolenaar      'one',
18184fdae999SBram Moolenaar      'two',
18194fdae999SBram Moolenaar      'three',
1820f5be8cdbSBram Moolenaar      ] # comment
18214fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
18224fdae999SBram Moolenaar
18234fdae999SBram Moolenaar  let mydict = {
18244fdae999SBram Moolenaar      'one': 1,
18254fdae999SBram Moolenaar      'two': 2,
18264fdae999SBram Moolenaar      'three':
18274fdae999SBram Moolenaar          3,
1828f5be8cdbSBram Moolenaar      } # comment
18294fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
18304fdae999SBram Moolenaar  mydict = #{
18312c330432SBram Moolenaar      one: 1,  # comment
18322c330432SBram Moolenaar      two:     # comment
18332c330432SBram Moolenaar           2,  # comment
18342c330432SBram Moolenaar      three: 3 # comment
18352c330432SBram Moolenaar      }
18362c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
18372c330432SBram Moolenaar  mydict = #{
18382c330432SBram Moolenaar      one: 1,
18394fdae999SBram Moolenaar      two:
18404fdae999SBram Moolenaar           2,
18412c330432SBram Moolenaar      three: 3
18424fdae999SBram Moolenaar      }
18434fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1844e6085c53SBram Moolenaar
1845e6085c53SBram Moolenaar  assert_equal(
1846e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1847e6085c53SBram Moolenaar        split('one two three')
1848e6085c53SBram Moolenaar        )
18494fdae999SBram Moolenaarenddef
18504fdae999SBram Moolenaar
18517a092245SBram Moolenaardef Test_vim9_comment()
18527a092245SBram Moolenaar  CheckScriptSuccess([
18537a092245SBram Moolenaar      'vim9script',
18547a092245SBram Moolenaar      '# something',
18557a092245SBram Moolenaar      ])
18567a092245SBram Moolenaar  CheckScriptFailure([
18577a092245SBram Moolenaar      'vim9script',
18587a092245SBram Moolenaar      ':# something',
18597a092245SBram Moolenaar      ], 'E488:')
18607a092245SBram Moolenaar  CheckScriptFailure([
18617a092245SBram Moolenaar      '# something',
18627a092245SBram Moolenaar      ], 'E488:')
18637a092245SBram Moolenaar  CheckScriptFailure([
18647a092245SBram Moolenaar      ':# something',
18657a092245SBram Moolenaar      ], 'E488:')
18667a092245SBram Moolenaar
18674a8d9f2eSBram Moolenaar  { # block start
18684a8d9f2eSBram Moolenaar  } # block end
18694a8d9f2eSBram Moolenaar  CheckDefFailure([
18704a8d9f2eSBram Moolenaar      '{# comment',
18714a8d9f2eSBram Moolenaar      ], 'E488:')
18724a8d9f2eSBram Moolenaar  CheckDefFailure([
18734a8d9f2eSBram Moolenaar      '{',
18744a8d9f2eSBram Moolenaar      '}# comment',
18754a8d9f2eSBram Moolenaar      ], 'E488:')
18764a8d9f2eSBram Moolenaar
18774a8d9f2eSBram Moolenaar  echo "yes" # comment
18784a8d9f2eSBram Moolenaar  CheckDefFailure([
18794a8d9f2eSBram Moolenaar      'echo "yes"# comment',
18804a8d9f2eSBram Moolenaar      ], 'E488:')
18817a092245SBram Moolenaar  CheckScriptSuccess([
18827a092245SBram Moolenaar      'vim9script',
18837a092245SBram Moolenaar      'echo "yes" # something',
18847a092245SBram Moolenaar      ])
18857a092245SBram Moolenaar  CheckScriptFailure([
18867a092245SBram Moolenaar      'vim9script',
18877a092245SBram Moolenaar      'echo "yes"# something',
18887a092245SBram Moolenaar      ], 'E121:')
18897a092245SBram Moolenaar  CheckScriptFailure([
18907a092245SBram Moolenaar      'vim9script',
18917a092245SBram Moolenaar      'echo# something',
18927a092245SBram Moolenaar      ], 'E121:')
18937a092245SBram Moolenaar  CheckScriptFailure([
18947a092245SBram Moolenaar      'echo "yes" # something',
18957a092245SBram Moolenaar      ], 'E121:')
18967a092245SBram Moolenaar
18974a8d9f2eSBram Moolenaar  exe "echo" # comment
18984a8d9f2eSBram Moolenaar  CheckDefFailure([
18994a8d9f2eSBram Moolenaar      'exe "echo"# comment',
19004a8d9f2eSBram Moolenaar      ], 'E488:')
19014a8d9f2eSBram Moolenaar  CheckScriptSuccess([
19024a8d9f2eSBram Moolenaar      'vim9script',
19034a8d9f2eSBram Moolenaar      'exe "echo" # something',
19044a8d9f2eSBram Moolenaar      ])
19054a8d9f2eSBram Moolenaar  CheckScriptFailure([
19064a8d9f2eSBram Moolenaar      'vim9script',
19074a8d9f2eSBram Moolenaar      'exe "echo"# something',
19084a8d9f2eSBram Moolenaar      ], 'E121:')
19094a8d9f2eSBram Moolenaar  CheckDefFailure([
19104a8d9f2eSBram Moolenaar      'exe # comment',
19114a8d9f2eSBram Moolenaar      ], 'E1015:')
19124a8d9f2eSBram Moolenaar  CheckScriptFailure([
19134a8d9f2eSBram Moolenaar      'vim9script',
19144a8d9f2eSBram Moolenaar      'exe# something',
19154a8d9f2eSBram Moolenaar      ], 'E121:')
19164a8d9f2eSBram Moolenaar  CheckScriptFailure([
19174a8d9f2eSBram Moolenaar      'exe "echo" # something',
19184a8d9f2eSBram Moolenaar      ], 'E121:')
19194a8d9f2eSBram Moolenaar
19207a092245SBram Moolenaar  CheckDefFailure([
19217a092245SBram Moolenaar      'try# comment',
19227a092245SBram Moolenaar      '  echo "yes"',
19237a092245SBram Moolenaar      'catch',
19247a092245SBram Moolenaar      'endtry',
19257a092245SBram Moolenaar      ], 'E488:')
19262c5ed4e3SBram Moolenaar  CheckScriptFailure([
19272c5ed4e3SBram Moolenaar      'vim9script',
19282c5ed4e3SBram Moolenaar      'try# comment',
19292c5ed4e3SBram Moolenaar      'echo "yes"',
19302c5ed4e3SBram Moolenaar      ], 'E488:')
19317a092245SBram Moolenaar  CheckDefFailure([
19327a092245SBram Moolenaar      'try',
1933a72cfb80SBram Moolenaar      '  throw#comment',
1934a72cfb80SBram Moolenaar      'catch',
1935a72cfb80SBram Moolenaar      'endtry',
1936a72cfb80SBram Moolenaar      ], 'E1015:')
1937a72cfb80SBram Moolenaar  CheckDefFailure([
1938a72cfb80SBram Moolenaar      'try',
1939a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1940a72cfb80SBram Moolenaar      'catch',
1941a72cfb80SBram Moolenaar      'endtry',
1942a72cfb80SBram Moolenaar      ], 'E488:')
1943a72cfb80SBram Moolenaar  CheckDefFailure([
1944a72cfb80SBram Moolenaar      'try',
19457a092245SBram Moolenaar      '  echo "yes"',
19467a092245SBram Moolenaar      'catch# comment',
19477a092245SBram Moolenaar      'endtry',
19487a092245SBram Moolenaar      ], 'E488:')
19492c5ed4e3SBram Moolenaar  CheckScriptFailure([
19502c5ed4e3SBram Moolenaar      'vim9script',
19512c5ed4e3SBram Moolenaar      'try',
19522c5ed4e3SBram Moolenaar      '  echo "yes"',
19532c5ed4e3SBram Moolenaar      'catch# comment',
19542c5ed4e3SBram Moolenaar      'endtry',
19552c5ed4e3SBram Moolenaar      ], 'E654:')
19562c5ed4e3SBram Moolenaar  CheckDefFailure([
19572c5ed4e3SBram Moolenaar      'try',
19582c5ed4e3SBram Moolenaar      '  echo "yes"',
19592c5ed4e3SBram Moolenaar      'catch /pat/# comment',
19602c5ed4e3SBram Moolenaar      'endtry',
19612c5ed4e3SBram Moolenaar      ], 'E488:')
19627a092245SBram Moolenaar  CheckDefFailure([
19637a092245SBram Moolenaar      'try',
19647a092245SBram Moolenaar      'echo "yes"',
19657a092245SBram Moolenaar      'catch',
19667a092245SBram Moolenaar      'endtry# comment',
19677a092245SBram Moolenaar      ], 'E488:')
19682c5ed4e3SBram Moolenaar  CheckScriptFailure([
19692c5ed4e3SBram Moolenaar      'vim9script',
19702c5ed4e3SBram Moolenaar      'try',
19712c5ed4e3SBram Moolenaar      '  echo "yes"',
19722c5ed4e3SBram Moolenaar      'catch',
19732c5ed4e3SBram Moolenaar      'endtry# comment',
19749b7bf9e9SBram Moolenaar      ], 'E488:')
19752c5ed4e3SBram Moolenaar
19762c5ed4e3SBram Moolenaar  CheckScriptSuccess([
19772c5ed4e3SBram Moolenaar      'vim9script',
19782c5ed4e3SBram Moolenaar      'hi # comment',
19792c5ed4e3SBram Moolenaar      ])
19802c5ed4e3SBram Moolenaar  CheckScriptFailure([
19812c5ed4e3SBram Moolenaar      'vim9script',
19822c5ed4e3SBram Moolenaar      'hi# comment',
19832c5ed4e3SBram Moolenaar      ], 'E416:')
19841966c248SBram Moolenaar  CheckScriptSuccess([
19851966c248SBram Moolenaar      'vim9script',
19861966c248SBram Moolenaar      'hi Search # comment',
19871966c248SBram Moolenaar      ])
19881966c248SBram Moolenaar  CheckScriptFailure([
19891966c248SBram Moolenaar      'vim9script',
19901966c248SBram Moolenaar      'hi Search# comment',
19911966c248SBram Moolenaar      ], 'E416:')
19921966c248SBram Moolenaar  CheckScriptSuccess([
19931966c248SBram Moolenaar      'vim9script',
19941966c248SBram Moolenaar      'hi link This Search # comment',
19951966c248SBram Moolenaar      ])
19961966c248SBram Moolenaar  CheckScriptFailure([
19971966c248SBram Moolenaar      'vim9script',
19981966c248SBram Moolenaar      'hi link This That# comment',
19991966c248SBram Moolenaar      ], 'E413:')
20001966c248SBram Moolenaar  CheckScriptSuccess([
20011966c248SBram Moolenaar      'vim9script',
20021966c248SBram Moolenaar      'hi clear This # comment',
20031966c248SBram Moolenaar      'hi clear # comment',
20041966c248SBram Moolenaar      ])
2005f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2006f5be8cdbSBram Moolenaar  # hi clear This# comment',
20071966c248SBram Moolenaar  CheckScriptFailure([
20081966c248SBram Moolenaar      'vim9script',
20091966c248SBram Moolenaar      'hi clear# comment',
20101966c248SBram Moolenaar      ], 'E416:')
20111966c248SBram Moolenaar
20121966c248SBram Moolenaar  CheckScriptSuccess([
20131966c248SBram Moolenaar      'vim9script',
20141966c248SBram Moolenaar      'hi Group term=bold',
20151966c248SBram Moolenaar      'match Group /todo/ # comment',
20161966c248SBram Moolenaar      ])
20171966c248SBram Moolenaar  CheckScriptFailure([
20181966c248SBram Moolenaar      'vim9script',
20191966c248SBram Moolenaar      'hi Group term=bold',
20201966c248SBram Moolenaar      'match Group /todo/# comment',
20211966c248SBram Moolenaar      ], 'E488:')
20221966c248SBram Moolenaar  CheckScriptSuccess([
20231966c248SBram Moolenaar      'vim9script',
20241966c248SBram Moolenaar      'match # comment',
20251966c248SBram Moolenaar      ])
20261966c248SBram Moolenaar  CheckScriptFailure([
20271966c248SBram Moolenaar      'vim9script',
20281966c248SBram Moolenaar      'match# comment',
20291966c248SBram Moolenaar      ], 'E475:')
20301966c248SBram Moolenaar  CheckScriptSuccess([
20311966c248SBram Moolenaar      'vim9script',
20321966c248SBram Moolenaar      'match none # comment',
20331966c248SBram Moolenaar      ])
20341966c248SBram Moolenaar  CheckScriptFailure([
20351966c248SBram Moolenaar      'vim9script',
20361966c248SBram Moolenaar      'match none# comment',
20371966c248SBram Moolenaar      ], 'E475:')
20381966c248SBram Moolenaar
20391966c248SBram Moolenaar  CheckScriptSuccess([
20401966c248SBram Moolenaar      'vim9script',
20411966c248SBram Moolenaar      'menutrans clear # comment',
20421966c248SBram Moolenaar      ])
20431966c248SBram Moolenaar  CheckScriptFailure([
20441966c248SBram Moolenaar      'vim9script',
20451966c248SBram Moolenaar      'menutrans clear# comment text',
20461966c248SBram Moolenaar      ], 'E474:')
20471966c248SBram Moolenaar
20481966c248SBram Moolenaar  CheckScriptSuccess([
20491966c248SBram Moolenaar      'vim9script',
20501966c248SBram Moolenaar      'syntax clear # comment',
20511966c248SBram Moolenaar      ])
20521966c248SBram Moolenaar  CheckScriptFailure([
20531966c248SBram Moolenaar      'vim9script',
20541966c248SBram Moolenaar      'syntax clear# comment text',
20551966c248SBram Moolenaar      ], 'E28:')
20561966c248SBram Moolenaar  CheckScriptSuccess([
20571966c248SBram Moolenaar      'vim9script',
20581966c248SBram Moolenaar      'syntax keyword Word some',
20591966c248SBram Moolenaar      'syntax clear Word # comment',
20601966c248SBram Moolenaar      ])
20611966c248SBram Moolenaar  CheckScriptFailure([
20621966c248SBram Moolenaar      'vim9script',
20631966c248SBram Moolenaar      'syntax keyword Word some',
20641966c248SBram Moolenaar      'syntax clear Word# comment text',
20651966c248SBram Moolenaar      ], 'E28:')
20661966c248SBram Moolenaar
20671966c248SBram Moolenaar  CheckScriptSuccess([
20681966c248SBram Moolenaar      'vim9script',
20691966c248SBram Moolenaar      'syntax list # comment',
20701966c248SBram Moolenaar      ])
20711966c248SBram Moolenaar  CheckScriptFailure([
20721966c248SBram Moolenaar      'vim9script',
20731966c248SBram Moolenaar      'syntax list# comment text',
20741966c248SBram Moolenaar      ], 'E28:')
20751966c248SBram Moolenaar
20761966c248SBram Moolenaar  CheckScriptSuccess([
20771966c248SBram Moolenaar      'vim9script',
20781966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
20791966c248SBram Moolenaar      ])
20801966c248SBram Moolenaar  CheckScriptFailure([
20811966c248SBram Moolenaar      'vim9script',
20821966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
20831966c248SBram Moolenaar      ], 'E475:')
20841966c248SBram Moolenaar
20851966c248SBram Moolenaar  CheckScriptSuccess([
20861966c248SBram Moolenaar      'vim9script',
20871966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
20881966c248SBram Moolenaar      ])
20891966c248SBram Moolenaar  CheckScriptFailure([
20901966c248SBram Moolenaar      'vim9script',
20911966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
20921966c248SBram Moolenaar      ], 'E789:')
20931966c248SBram Moolenaar
20941966c248SBram Moolenaar  CheckScriptSuccess([
20951966c248SBram Moolenaar      'vim9script',
20961966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
20971966c248SBram Moolenaar      ])
20981966c248SBram Moolenaar  CheckScriptFailure([
20991966c248SBram Moolenaar      'vim9script',
21001966c248SBram Moolenaar      'syntax match Word /pat/# comment',
21011966c248SBram Moolenaar      ], 'E402:')
21021966c248SBram Moolenaar
21031966c248SBram Moolenaar  CheckScriptSuccess([
21041966c248SBram Moolenaar      'vim9script',
21051966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
21061966c248SBram Moolenaar      ])
21071966c248SBram Moolenaar  CheckScriptFailure([
21081966c248SBram Moolenaar      'vim9script',
21091966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
21101966c248SBram Moolenaar      ], 'E475:')
21111966c248SBram Moolenaar  CheckScriptFailure([
21121966c248SBram Moolenaar      'vim9script',
21131966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
21141966c248SBram Moolenaar      ], 'E406:')
21151966c248SBram Moolenaar  CheckScriptFailure([
21161966c248SBram Moolenaar      'vim9script',
21171966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
21181966c248SBram Moolenaar      ], 'E475:')
21191966c248SBram Moolenaar
21201966c248SBram Moolenaar  CheckScriptSuccess([
21211966c248SBram Moolenaar      'vim9script',
21221966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
21231966c248SBram Moolenaar      ])
21241966c248SBram Moolenaar  CheckScriptFailure([
21251966c248SBram Moolenaar      'vim9script',
21261966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2127d032f34aSBram Moolenaar      ], 'E402:')
21281966c248SBram Moolenaar
21291966c248SBram Moolenaar  CheckScriptSuccess([
21301966c248SBram Moolenaar      'vim9script',
21311966c248SBram Moolenaar      'syntax sync # comment',
21321966c248SBram Moolenaar      ])
21331966c248SBram Moolenaar  CheckScriptFailure([
21341966c248SBram Moolenaar      'vim9script',
21351966c248SBram Moolenaar      'syntax sync# comment',
21361966c248SBram Moolenaar      ], 'E404:')
21371966c248SBram Moolenaar  CheckScriptSuccess([
21381966c248SBram Moolenaar      'vim9script',
21391966c248SBram Moolenaar      'syntax sync ccomment # comment',
21401966c248SBram Moolenaar      ])
21411966c248SBram Moolenaar  CheckScriptFailure([
21421966c248SBram Moolenaar      'vim9script',
21431966c248SBram Moolenaar      'syntax sync ccomment# comment',
21441966c248SBram Moolenaar      ], 'E404:')
21451966c248SBram Moolenaar
21461966c248SBram Moolenaar  CheckScriptSuccess([
21471966c248SBram Moolenaar      'vim9script',
21481966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
21491966c248SBram Moolenaar      ])
21501966c248SBram Moolenaar  CheckScriptFailure([
21511966c248SBram Moolenaar      'vim9script',
21521966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
21531966c248SBram Moolenaar      ], 'E475:')
2154a72cfb80SBram Moolenaar
2155a72cfb80SBram Moolenaar  CheckScriptSuccess([
2156a72cfb80SBram Moolenaar      'vim9script',
2157a72cfb80SBram Moolenaar      'command Echo echo # comment',
2158a72cfb80SBram Moolenaar      'command Echo # comment',
2159a72cfb80SBram Moolenaar      ])
2160a72cfb80SBram Moolenaar  CheckScriptFailure([
2161a72cfb80SBram Moolenaar      'vim9script',
2162a72cfb80SBram Moolenaar      'command Echo echo# comment',
2163a72cfb80SBram Moolenaar      'Echo',
2164a72cfb80SBram Moolenaar      ], 'E121:')
2165a72cfb80SBram Moolenaar  CheckScriptFailure([
2166a72cfb80SBram Moolenaar      'vim9script',
2167a72cfb80SBram Moolenaar      'command Echo# comment',
2168a72cfb80SBram Moolenaar      ], 'E182:')
2169a72cfb80SBram Moolenaar  CheckScriptFailure([
2170a72cfb80SBram Moolenaar      'vim9script',
2171a72cfb80SBram Moolenaar      'command Echo echo',
2172a72cfb80SBram Moolenaar      'command Echo# comment',
2173a72cfb80SBram Moolenaar      ], 'E182:')
2174a72cfb80SBram Moolenaar
2175a72cfb80SBram Moolenaar  CheckScriptSuccess([
2176a72cfb80SBram Moolenaar      'vim9script',
2177a72cfb80SBram Moolenaar      'function # comment',
2178a72cfb80SBram Moolenaar      ])
2179a72cfb80SBram Moolenaar  CheckScriptFailure([
2180a72cfb80SBram Moolenaar      'vim9script',
2181a72cfb80SBram Moolenaar      'function# comment',
2182a72cfb80SBram Moolenaar      ], 'E129:')
2183a72cfb80SBram Moolenaar  CheckScriptSuccess([
2184a72cfb80SBram Moolenaar      'vim9script',
2185a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2186a72cfb80SBram Moolenaar      ])
2187a72cfb80SBram Moolenaar  CheckScriptFailure([
2188a72cfb80SBram Moolenaar      'vim9script',
2189a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2190a72cfb80SBram Moolenaar      ], 'E488:')
2191a72cfb80SBram Moolenaar
2192a72cfb80SBram Moolenaar  CheckScriptSuccess([
2193a72cfb80SBram Moolenaar      'vim9script',
21944c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2195a72cfb80SBram Moolenaar      'endfunc',
21964c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2197a72cfb80SBram Moolenaar      ])
2198a72cfb80SBram Moolenaar  CheckScriptFailure([
2199a72cfb80SBram Moolenaar      'vim9script',
22004c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2201a72cfb80SBram Moolenaar      'endfunc',
22024c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2203a72cfb80SBram Moolenaar      ], 'E488:')
2204a72cfb80SBram Moolenaar
2205a72cfb80SBram Moolenaar  CheckScriptSuccess([
2206a72cfb80SBram Moolenaar      'vim9script',
2207a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2208a72cfb80SBram Moolenaar      ])
2209a72cfb80SBram Moolenaar  CheckScriptFailure([
2210a72cfb80SBram Moolenaar      'vim9script',
2211a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2212a72cfb80SBram Moolenaar      ], 'E488:')
2213e7e4838fSBram Moolenaar
2214e7e4838fSBram Moolenaar  CheckScriptFailure([
2215e7e4838fSBram Moolenaar      'def Test() " comment',
2216e7e4838fSBram Moolenaar      'enddef',
2217e7e4838fSBram Moolenaar      ], 'E488:')
2218e7e4838fSBram Moolenaar  CheckScriptFailure([
2219e7e4838fSBram Moolenaar      'vim9script',
2220e7e4838fSBram Moolenaar      'def Test() " comment',
2221e7e4838fSBram Moolenaar      'enddef',
2222e7e4838fSBram Moolenaar      ], 'E488:')
2223e7e4838fSBram Moolenaar
2224e7e4838fSBram Moolenaar  CheckScriptSuccess([
2225e7e4838fSBram Moolenaar      'func Test() " comment',
2226e7e4838fSBram Moolenaar      'endfunc',
2227e7e4838fSBram Moolenaar      ])
2228e7e4838fSBram Moolenaar  CheckScriptFailure([
2229e7e4838fSBram Moolenaar      'vim9script',
2230e7e4838fSBram Moolenaar      'func Test() " comment',
2231e7e4838fSBram Moolenaar      'endfunc',
2232e7e4838fSBram Moolenaar      ], 'E488:')
2233e7e4838fSBram Moolenaar
2234e7e4838fSBram Moolenaar  CheckScriptSuccess([
2235e7e4838fSBram Moolenaar      'def Test() # comment',
2236e7e4838fSBram Moolenaar      'enddef',
2237e7e4838fSBram Moolenaar      ])
2238e7e4838fSBram Moolenaar  CheckScriptFailure([
2239e7e4838fSBram Moolenaar      'func Test() # comment',
2240e7e4838fSBram Moolenaar      'endfunc',
2241e7e4838fSBram Moolenaar      ], 'E488:')
22422c5ed4e3SBram Moolenaarenddef
22432c5ed4e3SBram Moolenaar
22442c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
22452c5ed4e3SBram Moolenaar  CheckCanRunGui
22462c5ed4e3SBram Moolenaar
22472c5ed4e3SBram Moolenaar  CheckScriptFailure([
22482c5ed4e3SBram Moolenaar      'vim9script',
22492c5ed4e3SBram Moolenaar      'gui#comment'
22502c5ed4e3SBram Moolenaar      ], 'E499:')
22512c5ed4e3SBram Moolenaar  CheckScriptFailure([
22522c5ed4e3SBram Moolenaar      'vim9script',
22532c5ed4e3SBram Moolenaar      'gui -f#comment'
22542c5ed4e3SBram Moolenaar      ], 'E499:')
22557a092245SBram Moolenaarenddef
22567a092245SBram Moolenaar
2257a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
22586797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
22596797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2260a26b9700SBram Moolenaar
2261a26b9700SBram Moolenaar  edit test.vim
2262a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2263a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2264a26b9700SBram Moolenaar
2265a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2266a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2267a26b9700SBram Moolenaar
2268a26b9700SBram Moolenaar  g:entered = 0
2269a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2270a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2271a26b9700SBram Moolenaar
2272a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2273a26b9700SBram Moolenaar
2274a26b9700SBram Moolenaar  au! TabEnter
2275a26b9700SBram Moolenaar  unlet g:entered
2276d72c1bf0SBram Moolenaar
2277d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2278d72c1bf0SBram Moolenaar      'vim9script',
22796797966dSBram Moolenaar      'g:var = 123',
2280e55b1c09SBram Moolenaar      'b:var = 456',
2281e55b1c09SBram Moolenaar      'w:var = 777',
2282e55b1c09SBram Moolenaar      't:var = 888',
2283d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2284d72c1bf0SBram Moolenaar      ])
2285d72c1bf0SBram Moolenaar
2286d72c1bf0SBram Moolenaar  CheckScriptFailure([
2287d72c1bf0SBram Moolenaar      'vim9script',
2288d72c1bf0SBram Moolenaar      'let g:var = 123',
2289e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2290e55b1c09SBram Moolenaar
2291e55b1c09SBram Moolenaar  CheckScriptFailure([
2292e55b1c09SBram Moolenaar      'vim9script',
2293e55b1c09SBram Moolenaar      'let b:var = 123',
2294e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2295e55b1c09SBram Moolenaar
2296e55b1c09SBram Moolenaar  CheckScriptFailure([
2297e55b1c09SBram Moolenaar      'vim9script',
2298e55b1c09SBram Moolenaar      'let w:var = 123',
2299e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2300e55b1c09SBram Moolenaar
2301e55b1c09SBram Moolenaar  CheckScriptFailure([
2302e55b1c09SBram Moolenaar      'vim9script',
2303e55b1c09SBram Moolenaar      'let t:var = 123',
2304e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2305e55b1c09SBram Moolenaar
2306e55b1c09SBram Moolenaar  CheckScriptFailure([
2307e55b1c09SBram Moolenaar      'vim9script',
2308e55b1c09SBram Moolenaar      'let v:version = 123',
2309e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2310e55b1c09SBram Moolenaar
2311e55b1c09SBram Moolenaar  CheckScriptFailure([
2312e55b1c09SBram Moolenaar      'vim9script',
2313e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2314e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
23156797966dSBram Moolenaar
23166797966dSBram Moolenaar  CheckScriptFailure([
23176797966dSBram Moolenaar      'vim9script',
23186797966dSBram Moolenaar      'g:var = 123',
231932e35117SBram Moolenaar      'unlet g:var# comment1',
2320d72c1bf0SBram Moolenaar      ], 'E108:')
2321d72c1bf0SBram Moolenaar
2322d72c1bf0SBram Moolenaar  CheckScriptFailure([
2323d72c1bf0SBram Moolenaar      'let g:var = 123',
2324d72c1bf0SBram Moolenaar      'unlet g:var # something',
2325d72c1bf0SBram Moolenaar      ], 'E488:')
2326faac4104SBram Moolenaar
2327faac4104SBram Moolenaar  CheckScriptSuccess([
2328faac4104SBram Moolenaar      'vim9script',
232932e35117SBram Moolenaar      'if 1 # comment2',
2330faac4104SBram Moolenaar      '  echo "yes"',
2331faac4104SBram Moolenaar      'elseif 2 #comment',
2332faac4104SBram Moolenaar      '  echo "no"',
2333faac4104SBram Moolenaar      'endif',
2334faac4104SBram Moolenaar      ])
2335faac4104SBram Moolenaar
2336faac4104SBram Moolenaar  CheckScriptFailure([
2337faac4104SBram Moolenaar      'vim9script',
233832e35117SBram Moolenaar      'if 1# comment3',
2339faac4104SBram Moolenaar      '  echo "yes"',
2340faac4104SBram Moolenaar      'endif',
2341faac4104SBram Moolenaar      ], 'E15:')
2342faac4104SBram Moolenaar
2343faac4104SBram Moolenaar  CheckScriptFailure([
2344faac4104SBram Moolenaar      'vim9script',
234532e35117SBram Moolenaar      'if 0 # comment4',
2346faac4104SBram Moolenaar      '  echo "yes"',
2347faac4104SBram Moolenaar      'elseif 2#comment',
2348faac4104SBram Moolenaar      '  echo "no"',
2349faac4104SBram Moolenaar      'endif',
2350faac4104SBram Moolenaar      ], 'E15:')
2351faac4104SBram Moolenaar
2352faac4104SBram Moolenaar  CheckScriptSuccess([
2353faac4104SBram Moolenaar      'vim9script',
235432e35117SBram Moolenaar      'let v = 1 # comment5',
2355faac4104SBram Moolenaar      ])
2356faac4104SBram Moolenaar
2357faac4104SBram Moolenaar  CheckScriptFailure([
2358faac4104SBram Moolenaar      'vim9script',
235932e35117SBram Moolenaar      'let v = 1# comment6',
236032e35117SBram Moolenaar      ], 'E15:')
2361faac4104SBram Moolenaar
2362faac4104SBram Moolenaar  CheckScriptSuccess([
2363faac4104SBram Moolenaar      'vim9script',
2364faac4104SBram Moolenaar      'new'
2365faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2366df069eecSBram Moolenaar      ':$',
2367faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2368faac4104SBram Moolenaar      'bwipe!',
2369faac4104SBram Moolenaar      ])
2370faac4104SBram Moolenaar
2371f5be8cdbSBram Moolenaar  CheckScriptFailure([
2372f5be8cdbSBram Moolenaar      'vim9script',
2373f5be8cdbSBram Moolenaar      'new'
2374f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2375f5be8cdbSBram Moolenaar      ':$',
2376f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2377f5be8cdbSBram Moolenaar      'bwipe!',
2378f5be8cdbSBram Moolenaar      ], 'E488:')
2379f5be8cdbSBram Moolenaar
2380f5be8cdbSBram Moolenaar  CheckScriptFailure([
2381f5be8cdbSBram Moolenaar      'vim9script',
2382f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2383f5be8cdbSBram Moolenaar      ], 'E477:')
2384a26b9700SBram Moolenaarenddef
2385a26b9700SBram Moolenaar
23867e5bd91dSBram Moolenaardef Test_finish()
23877e5bd91dSBram Moolenaar  let lines =<< trim END
23887e5bd91dSBram Moolenaar    vim9script
23896797966dSBram Moolenaar    g:res = 'one'
23907e5bd91dSBram Moolenaar    if v:false | finish | endif
23916797966dSBram Moolenaar    g:res = 'two'
23927e5bd91dSBram Moolenaar    finish
23936797966dSBram Moolenaar    g:res = 'three'
23947e5bd91dSBram Moolenaar  END
23957e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
23967e5bd91dSBram Moolenaar  source Xfinished
23977e5bd91dSBram Moolenaar  assert_equal('two', g:res)
23987e5bd91dSBram Moolenaar
23997e5bd91dSBram Moolenaar  unlet g:res
24007e5bd91dSBram Moolenaar  delete('Xfinished')
24017e5bd91dSBram Moolenaarenddef
24027e5bd91dSBram Moolenaar
240332e35117SBram Moolenaardef Test_let_func_call()
240432e35117SBram Moolenaar  let lines =<< trim END
240532e35117SBram Moolenaar    vim9script
240632e35117SBram Moolenaar    func GetValue()
240732e35117SBram Moolenaar      if exists('g:count')
240832e35117SBram Moolenaar        let g:count += 1
240932e35117SBram Moolenaar      else
241032e35117SBram Moolenaar        let g:count = 1
241132e35117SBram Moolenaar      endif
241232e35117SBram Moolenaar      return 'this'
241332e35117SBram Moolenaar    endfunc
241432e35117SBram Moolenaar    let val: string = GetValue()
2415f5be8cdbSBram Moolenaar    # env var is always a string
2416df671b46SBram Moolenaar    let env = $TERM
241732e35117SBram Moolenaar  END
241832e35117SBram Moolenaar  writefile(lines, 'Xfinished')
241932e35117SBram Moolenaar  source Xfinished
2420f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
242132e35117SBram Moolenaar  assert_equal(1, g:count)
242232e35117SBram Moolenaar
242332e35117SBram Moolenaar  unlet g:count
242432e35117SBram Moolenaar  delete('Xfinished')
242532e35117SBram Moolenaarenddef
242632e35117SBram Moolenaar
242732e35117SBram Moolenaardef Test_let_missing_type()
242832e35117SBram Moolenaar  let lines =<< trim END
242932e35117SBram Moolenaar    vim9script
2430df671b46SBram Moolenaar    let var = g:unknown
2431227a69deSBram Moolenaar  END
2432822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2433227a69deSBram Moolenaar
2434227a69deSBram Moolenaar  lines =<< trim END
2435227a69deSBram Moolenaar    vim9script
2436227a69deSBram Moolenaar    let nr: number = 123
2437227a69deSBram Moolenaar    let var = nr
2438227a69deSBram Moolenaar  END
2439822ba247SBram Moolenaar  CheckScriptSuccess(lines)
244032e35117SBram Moolenaarenddef
244132e35117SBram Moolenaar
2442c82a5b5dSBram Moolenaardef Test_let_declaration()
2443c82a5b5dSBram Moolenaar  let lines =<< trim END
2444c82a5b5dSBram Moolenaar    vim9script
2445c82a5b5dSBram Moolenaar    let var: string
2446c82a5b5dSBram Moolenaar    g:var_uninit = var
2447c82a5b5dSBram Moolenaar    var = 'text'
2448c82a5b5dSBram Moolenaar    g:var_test = var
2449f5be8cdbSBram Moolenaar    # prefixing s: is optional
2450984dddbeSBram Moolenaar    s:var = 'prefixed'
2451984dddbeSBram Moolenaar    g:var_prefixed = s:var
2452984dddbeSBram Moolenaar
2453984dddbeSBram Moolenaar    let s:other: number
2454984dddbeSBram Moolenaar    other = 1234
2455984dddbeSBram Moolenaar    g:other_var = other
2456c82a5b5dSBram Moolenaar  END
2457c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2458c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2459c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2460984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2461984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2462c82a5b5dSBram Moolenaar
2463c82a5b5dSBram Moolenaar  unlet g:var_uninit
2464c82a5b5dSBram Moolenaar  unlet g:var_test
2465984dddbeSBram Moolenaar  unlet g:var_prefixed
2466984dddbeSBram Moolenaar  unlet g:other_var
2467c82a5b5dSBram Moolenaarenddef
2468c82a5b5dSBram Moolenaar
2469c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2470c5b1c20bSBram Moolenaar  let lines =<< trim END
2471c5b1c20bSBram Moolenaar    vim9script
2472c5b1c20bSBram Moolenaar    const var: string
2473c5b1c20bSBram Moolenaar  END
2474c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2475c5b1c20bSBram Moolenaar
2476c5b1c20bSBram Moolenaar  lines =<< trim END
2477c5b1c20bSBram Moolenaar    vim9script
2478c5b1c20bSBram Moolenaar    let 9var: string
2479c5b1c20bSBram Moolenaar  END
2480c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2481c5b1c20bSBram Moolenaarenddef
2482c5b1c20bSBram Moolenaar
248334db91f7SBram Moolenaardef Test_let_type_check()
248434db91f7SBram Moolenaar  let lines =<< trim END
248534db91f7SBram Moolenaar    vim9script
248634db91f7SBram Moolenaar    let var: string
248734db91f7SBram Moolenaar    var = 1234
248834db91f7SBram Moolenaar  END
248934db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2490984dddbeSBram Moolenaar
2491984dddbeSBram Moolenaar  lines =<< trim END
2492984dddbeSBram Moolenaar    vim9script
2493984dddbeSBram Moolenaar    let var:string
2494984dddbeSBram Moolenaar  END
2495984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2496c5b1c20bSBram Moolenaar
2497c5b1c20bSBram Moolenaar  lines =<< trim END
2498c5b1c20bSBram Moolenaar    vim9script
2499c5b1c20bSBram Moolenaar    let var: asdf
2500c5b1c20bSBram Moolenaar  END
2501c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
250234db91f7SBram Moolenaarenddef
250334db91f7SBram Moolenaar
2504a5d0077eSBram Moolenaardef Test_forward_declaration()
2505a5d0077eSBram Moolenaar  let lines =<< trim END
2506a5d0077eSBram Moolenaar    vim9script
2507a5d0077eSBram Moolenaar    def GetValue(): string
2508a5d0077eSBram Moolenaar      return theVal
2509a5d0077eSBram Moolenaar    enddef
2510a5d0077eSBram Moolenaar    let theVal = 'something'
2511822ba247SBram Moolenaar    g:initVal = GetValue()
2512a5d0077eSBram Moolenaar    theVal = 'else'
2513a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2514a5d0077eSBram Moolenaar  END
2515a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2516a5d0077eSBram Moolenaar  source Xforward
2517a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2518a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2519a5d0077eSBram Moolenaar
2520a5d0077eSBram Moolenaar  unlet g:initVal
2521a5d0077eSBram Moolenaar  unlet g:laterVal
2522a5d0077eSBram Moolenaar  delete('Xforward')
2523a5d0077eSBram Moolenaarenddef
2524a5d0077eSBram Moolenaar
25259721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
25269721fb4eSBram Moolenaar  let legacy_lines =<< trim END
25279721fb4eSBram Moolenaar    source Xvim9_script.vim
25289721fb4eSBram Moolenaar
25299721fb4eSBram Moolenaar    call assert_false(exists('local'))
25309721fb4eSBram Moolenaar    call assert_false(exists('exported'))
25319721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
25329721fb4eSBram Moolenaar    call assert_equal('global', global)
25339721fb4eSBram Moolenaar    call assert_equal('global', g:global)
25349721fb4eSBram Moolenaar
25359721fb4eSBram Moolenaar    " imported variable becomes script-local
25369721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
25379721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
25389721fb4eSBram Moolenaar    call assert_false(exists('exported'))
25399721fb4eSBram Moolenaar
25409721fb4eSBram Moolenaar    " imported function becomes script-local
25419721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
25429721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
25439721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
25449721fb4eSBram Moolenaar  END
25459721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
25469721fb4eSBram Moolenaar
25479721fb4eSBram Moolenaar  let vim9_lines =<< trim END
25489721fb4eSBram Moolenaar    vim9script
25499721fb4eSBram Moolenaar    let local = 'local'
25509721fb4eSBram Moolenaar    g:global = 'global'
25519721fb4eSBram Moolenaar    export let exported = 'exported'
25529721fb4eSBram Moolenaar    export def GetText(): string
25539721fb4eSBram Moolenaar       return 'text'
25549721fb4eSBram Moolenaar    enddef
25559721fb4eSBram Moolenaar  END
25569721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
25579721fb4eSBram Moolenaar
25589721fb4eSBram Moolenaar  source Xlegacy_script.vim
25599721fb4eSBram Moolenaar
25609721fb4eSBram Moolenaar  assert_equal('global', g:global)
2561f5be8cdbSBram Moolenaar  unlet g:global
25629721fb4eSBram Moolenaar
25639721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
25649721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
25659721fb4eSBram Moolenaarenddef
2566a5d0077eSBram Moolenaar
2567eeb27bfeSBram Moolenaardef Test_vim9_copen()
2568eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2569eeb27bfeSBram Moolenaar  copen
2570eeb27bfeSBram Moolenaar  quit
2571eeb27bfeSBram Moolenaarenddef
2572eeb27bfeSBram Moolenaar
2573585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2574585fea7bSBram Moolenaardef Test_substitute_cmd()
2575585fea7bSBram Moolenaar  new
2576585fea7bSBram Moolenaar  setline(1, 'something')
2577585fea7bSBram Moolenaar  :substitute(some(other(
2578585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2579585fea7bSBram Moolenaar  bwipe!
2580585fea7bSBram Moolenaar
2581f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2582585fea7bSBram Moolenaar  let lines =<< trim END
2583585fea7bSBram Moolenaar    vim9script
2584585fea7bSBram Moolenaar    new
2585585fea7bSBram Moolenaar    setline(1, 'something')
2586585fea7bSBram Moolenaar    :substitute(some(other(
2587585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2588585fea7bSBram Moolenaar    bwipe!
2589585fea7bSBram Moolenaar  END
2590585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2591585fea7bSBram Moolenaar  source Xvim9lines
2592585fea7bSBram Moolenaar
2593585fea7bSBram Moolenaar  delete('Xvim9lines')
2594585fea7bSBram Moolenaarenddef
2595585fea7bSBram Moolenaar
25968a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2597