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
32163be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
32263be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
32363be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
32463be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
32563be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
32663be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
32763be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
32863be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
32963be3d4bSBram 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:')
37943e969d3SBram Moolenaar
38043e969d3SBram Moolenaar  call CheckDefFailure(['w:foo: number = 10'],
38143e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 1')
38243e969d3SBram Moolenaar  call CheckDefFailure(['t:foo: bool = true'],
38343e969d3SBram Moolenaar                       'E488: Trailing characters: : bool = true')
38443e969d3SBram Moolenaar  call CheckDefFailure(['b:foo: string = "x"'],
38543e969d3SBram Moolenaar                       'E488: Trailing characters: : string = "x"')
38643e969d3SBram Moolenaar  call CheckDefFailure(['g:foo: number = 123'],
38743e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 123')
388d72c1bf0SBram Moolenaarenddef
389d72c1bf0SBram Moolenaar
390d72c1bf0SBram Moolenaardef Test_unlet()
391d72c1bf0SBram Moolenaar  g:somevar = 'yes'
392d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
393d72c1bf0SBram Moolenaar  unlet g:somevar
394d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
395d72c1bf0SBram Moolenaar  unlet! g:somevar
396d72c1bf0SBram Moolenaar
397d72c1bf0SBram Moolenaar  call CheckScriptFailure([
398d72c1bf0SBram Moolenaar        'vim9script',
399d72c1bf0SBram Moolenaar        'let svar = 123',
400d72c1bf0SBram Moolenaar        'unlet svar',
401d72c1bf0SBram Moolenaar        ], 'E1081:')
402d72c1bf0SBram Moolenaar  call CheckScriptFailure([
403d72c1bf0SBram Moolenaar        'vim9script',
404d72c1bf0SBram Moolenaar        'let svar = 123',
405d72c1bf0SBram Moolenaar        'unlet s:svar',
406d72c1bf0SBram Moolenaar        ], 'E1081:')
407d72c1bf0SBram Moolenaar  call CheckScriptFailure([
408d72c1bf0SBram Moolenaar        'vim9script',
409d72c1bf0SBram Moolenaar        'let svar = 123',
410d72c1bf0SBram Moolenaar        'def Func()',
411d72c1bf0SBram Moolenaar        '  unlet svar',
412d72c1bf0SBram Moolenaar        'enddef',
413822ba247SBram Moolenaar        'defcompile',
414d72c1bf0SBram Moolenaar        ], 'E1081:')
415d72c1bf0SBram Moolenaar  call CheckScriptFailure([
416d72c1bf0SBram Moolenaar        'vim9script',
417d72c1bf0SBram Moolenaar        'let svar = 123',
418d72c1bf0SBram Moolenaar        'def Func()',
419d72c1bf0SBram Moolenaar        '  unlet s:svar',
420d72c1bf0SBram Moolenaar        'enddef',
421822ba247SBram Moolenaar        'defcompile',
422d72c1bf0SBram Moolenaar        ], 'E1081:')
4237bdaea6eSBram Moolenaar
4247bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
4257bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
4267bdaea6eSBram Moolenaar  unlet $ENVVAR
4277bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
428d72c1bf0SBram Moolenaarenddef
429599c89c8SBram Moolenaar
4304c17ad94SBram Moolenaardef Test_delfunction()
431f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
4324c17ad94SBram Moolenaar  CheckScriptSuccess([
4334c17ad94SBram Moolenaar      'vim9script',
4344c17ad94SBram Moolenaar      'func CheckMe()',
4354c17ad94SBram Moolenaar      '  return 123',
4364c17ad94SBram Moolenaar      'endfunc',
4374c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
4384c17ad94SBram Moolenaar      ])
4394c17ad94SBram Moolenaar
440f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
4414c17ad94SBram Moolenaar  CheckScriptFailure([
4424c17ad94SBram Moolenaar      'vim9script',
4434c17ad94SBram Moolenaar      'func DeleteMe1()',
4444c17ad94SBram Moolenaar      'endfunc',
4454c17ad94SBram Moolenaar      'delfunction DeleteMe1',
4464c17ad94SBram Moolenaar      ], 'E1084:')
4474c17ad94SBram Moolenaar  CheckScriptFailure([
4484c17ad94SBram Moolenaar      'vim9script',
4494c17ad94SBram Moolenaar      'func DeleteMe2()',
4504c17ad94SBram Moolenaar      'endfunc',
4514c17ad94SBram Moolenaar      'def DoThat()',
4524c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
4534c17ad94SBram Moolenaar      'enddef',
4544c17ad94SBram Moolenaar      'DoThat()',
4554c17ad94SBram Moolenaar      ], 'E1084:')
4564c17ad94SBram Moolenaar  CheckScriptFailure([
4574c17ad94SBram Moolenaar      'vim9script',
4584c17ad94SBram Moolenaar      'def DeleteMe3()',
4594c17ad94SBram Moolenaar      'enddef',
4604c17ad94SBram Moolenaar      'delfunction DeleteMe3',
4614c17ad94SBram Moolenaar      ], 'E1084:')
4624c17ad94SBram Moolenaar  CheckScriptFailure([
4634c17ad94SBram Moolenaar      'vim9script',
4644c17ad94SBram Moolenaar      'def DeleteMe4()',
4654c17ad94SBram Moolenaar      'enddef',
4664c17ad94SBram Moolenaar      'def DoThat()',
4674c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
4684c17ad94SBram Moolenaar      'enddef',
4694c17ad94SBram Moolenaar      'DoThat()',
4704c17ad94SBram Moolenaar      ], 'E1084:')
4714c17ad94SBram Moolenaarenddef
4724c17ad94SBram Moolenaar
473599c89c8SBram Moolenaarfunc Test_wrong_type()
474599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
475599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
476599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
477599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
478599c89c8SBram Moolenaar
479599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
480599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
48142a480bfSBram Moolenaar
48242a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
48342a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
48442a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
48542a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
48642a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
48742a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
48842a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
48942a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
49042a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
49142a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
49242a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
493a0a9f43aSBram Moolenaar
494a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
495a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
4968a7d6542SBram Moolenaarendfunc
4978a7d6542SBram Moolenaar
4988a7d6542SBram Moolenaarfunc Test_const()
4998a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
5008a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
5018a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
5029be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
5038a7d6542SBram Moolenaarendfunc
5048a7d6542SBram Moolenaar
505df069eecSBram Moolenaardef Test_range_no_colon()
506df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
507df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
508df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
509df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
510df069eecSBram Moolenaarenddef
511df069eecSBram Moolenaar
512df069eecSBram Moolenaar
5138a7d6542SBram Moolenaardef Test_block()
5148a7d6542SBram Moolenaar  let outer = 1
5158a7d6542SBram Moolenaar  {
5168a7d6542SBram Moolenaar    let inner = 2
5178a7d6542SBram Moolenaar    assert_equal(1, outer)
5188a7d6542SBram Moolenaar    assert_equal(2, inner)
5198a7d6542SBram Moolenaar  }
5208a7d6542SBram Moolenaar  assert_equal(1, outer)
5218a7d6542SBram Moolenaarenddef
5228a7d6542SBram Moolenaar
5238a7d6542SBram Moolenaarfunc Test_block_failure()
5248a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
525585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
526585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
5278a7d6542SBram Moolenaarendfunc
5288a7d6542SBram Moolenaar
529585fea7bSBram Moolenaardef Test_cmd_modifier()
530585fea7bSBram Moolenaar  tab echo '0'
531585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
532585fea7bSBram Moolenaarenddef
533585fea7bSBram Moolenaar
534d032f34aSBram Moolenaarfunc g:NoSuchFunc()
535d032f34aSBram Moolenaar  echo 'none'
536d032f34aSBram Moolenaarendfunc
537d032f34aSBram Moolenaar
5388a7d6542SBram Moolenaardef Test_try_catch()
5398a7d6542SBram Moolenaar  let l = []
5407a092245SBram Moolenaar  try # comment
5418a7d6542SBram Moolenaar    add(l, '1')
5428a7d6542SBram Moolenaar    throw 'wrong'
5438a7d6542SBram Moolenaar    add(l, '2')
5447a092245SBram Moolenaar  catch # comment
5458a7d6542SBram Moolenaar    add(l, v:exception)
5467a092245SBram Moolenaar  finally # comment
5478a7d6542SBram Moolenaar    add(l, '3')
5487a092245SBram Moolenaar  endtry # comment
5498a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
55068d130c6SBram Moolenaar
551e859312eSBram Moolenaar  l = []
552e859312eSBram Moolenaar  try
553e859312eSBram Moolenaar    try
554e859312eSBram Moolenaar      add(l, '1')
555e859312eSBram Moolenaar      throw 'wrong'
556e859312eSBram Moolenaar      add(l, '2')
557e859312eSBram Moolenaar    catch /right/
558e859312eSBram Moolenaar      add(l, v:exception)
559e859312eSBram Moolenaar    endtry
560e859312eSBram Moolenaar  catch /wrong/
561e859312eSBram Moolenaar    add(l, 'caught')
562e859312eSBram Moolenaar  finally
563e859312eSBram Moolenaar    add(l, 'finally')
564e859312eSBram Moolenaar  endtry
565e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
566e859312eSBram Moolenaar
56768d130c6SBram Moolenaar  let n: number
56868d130c6SBram Moolenaar  try
56968d130c6SBram Moolenaar    n = l[3]
57068d130c6SBram Moolenaar  catch /E684:/
57168d130c6SBram Moolenaar    n = 99
57268d130c6SBram Moolenaar  endtry
57368d130c6SBram Moolenaar  assert_equal(99, n)
57468d130c6SBram Moolenaar
57568d130c6SBram Moolenaar  try
57668d130c6SBram Moolenaar    n = g:astring[3]
57768d130c6SBram Moolenaar  catch /E714:/
57868d130c6SBram Moolenaar    n = 77
57968d130c6SBram Moolenaar  endtry
58068d130c6SBram Moolenaar  assert_equal(77, n)
58168d130c6SBram Moolenaar
58268d130c6SBram Moolenaar  try
58368d130c6SBram Moolenaar    n = l[g:astring]
58468d130c6SBram Moolenaar  catch /E39:/
58568d130c6SBram Moolenaar    n = 77
58668d130c6SBram Moolenaar  endtry
58768d130c6SBram Moolenaar  assert_equal(77, n)
58868d130c6SBram Moolenaar
58968d130c6SBram Moolenaar  try
59068d130c6SBram Moolenaar    n = s:does_not_exist
59168d130c6SBram Moolenaar  catch /E121:/
592f0b9f43cSBram Moolenaar    n = 111
593f0b9f43cSBram Moolenaar  endtry
594f0b9f43cSBram Moolenaar  assert_equal(111, n)
595f0b9f43cSBram Moolenaar
596f0b9f43cSBram Moolenaar  try
597f0b9f43cSBram Moolenaar    n = g:does_not_exist
598f0b9f43cSBram Moolenaar  catch /E121:/
59968d130c6SBram Moolenaar    n = 121
60068d130c6SBram Moolenaar  endtry
60168d130c6SBram Moolenaar  assert_equal(121, n)
60268d130c6SBram Moolenaar
60368d130c6SBram Moolenaar  let d = #{one: 1}
60468d130c6SBram Moolenaar  try
60568d130c6SBram Moolenaar    n = d[g:astring]
60668d130c6SBram Moolenaar  catch /E716:/
60768d130c6SBram Moolenaar    n = 222
60868d130c6SBram Moolenaar  endtry
60968d130c6SBram Moolenaar  assert_equal(222, n)
610f0b9f43cSBram Moolenaar
611f0b9f43cSBram Moolenaar  try
612f0b9f43cSBram Moolenaar    n = -g:astring
613f0b9f43cSBram Moolenaar  catch /E39:/
614f0b9f43cSBram Moolenaar    n = 233
615f0b9f43cSBram Moolenaar  endtry
616f0b9f43cSBram Moolenaar  assert_equal(233, n)
617f0b9f43cSBram Moolenaar
618f0b9f43cSBram Moolenaar  try
619f0b9f43cSBram Moolenaar    n = +g:astring
620f0b9f43cSBram Moolenaar  catch /E1030:/
621f0b9f43cSBram Moolenaar    n = 244
622f0b9f43cSBram Moolenaar  endtry
623f0b9f43cSBram Moolenaar  assert_equal(244, n)
624f0b9f43cSBram Moolenaar
625f0b9f43cSBram Moolenaar  try
626f0b9f43cSBram Moolenaar    n = +g:alist
627f0b9f43cSBram Moolenaar  catch /E745:/
628f0b9f43cSBram Moolenaar    n = 255
629f0b9f43cSBram Moolenaar  endtry
630f0b9f43cSBram Moolenaar  assert_equal(255, n)
631f0b9f43cSBram Moolenaar
632f0b9f43cSBram Moolenaar  let nd: dict<any>
633f0b9f43cSBram Moolenaar  try
634f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
635f0b9f43cSBram Moolenaar  catch /E1029:/
636f0b9f43cSBram Moolenaar    n = 266
637f0b9f43cSBram Moolenaar  endtry
638f0b9f43cSBram Moolenaar  assert_equal(266, n)
639f0b9f43cSBram Moolenaar
640f0b9f43cSBram Moolenaar  try
641f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
642f0b9f43cSBram Moolenaar  catch /E1093:/
643f0b9f43cSBram Moolenaar    n = 277
644f0b9f43cSBram Moolenaar  endtry
645f0b9f43cSBram Moolenaar  assert_equal(277, n)
646f0b9f43cSBram Moolenaar
647e859312eSBram Moolenaar  try
648e859312eSBram Moolenaar    &ts = g:astring
649e859312eSBram Moolenaar  catch /E1029:/
650e859312eSBram Moolenaar    n = 288
651e859312eSBram Moolenaar  endtry
652e859312eSBram Moolenaar  assert_equal(288, n)
653e859312eSBram Moolenaar
654e859312eSBram Moolenaar  try
655e859312eSBram Moolenaar    &backspace = 'asdf'
656e859312eSBram Moolenaar  catch /E474:/
657e859312eSBram Moolenaar    n = 299
658e859312eSBram Moolenaar  endtry
659e859312eSBram Moolenaar  assert_equal(299, n)
660e859312eSBram Moolenaar
661e859312eSBram Moolenaar  l = [1]
662e859312eSBram Moolenaar  try
663e859312eSBram Moolenaar    l[3] = 3
664e859312eSBram Moolenaar  catch /E684:/
665e859312eSBram Moolenaar    n = 300
666e859312eSBram Moolenaar  endtry
667e859312eSBram Moolenaar  assert_equal(300, n)
668e859312eSBram Moolenaar
669e859312eSBram Moolenaar  try
670e859312eSBram Moolenaar    d[''] = 3
671e859312eSBram Moolenaar  catch /E713:/
672e859312eSBram Moolenaar    n = 311
673e859312eSBram Moolenaar  endtry
674e859312eSBram Moolenaar  assert_equal(311, n)
675e859312eSBram Moolenaar
676e859312eSBram Moolenaar  try
677e859312eSBram Moolenaar    unlet g:does_not_exist
678e859312eSBram Moolenaar  catch /E108:/
679e859312eSBram Moolenaar    n = 322
680e859312eSBram Moolenaar  endtry
681e859312eSBram Moolenaar  assert_equal(322, n)
682e859312eSBram Moolenaar
683e859312eSBram Moolenaar  try
684e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
685e859312eSBram Moolenaar  catch /E721:/
686e859312eSBram Moolenaar    n = 333
687e859312eSBram Moolenaar  endtry
688e859312eSBram Moolenaar  assert_equal(333, n)
689e859312eSBram Moolenaar
690e859312eSBram Moolenaar  try
691e859312eSBram Moolenaar    l = DeletedFunc()
692e859312eSBram Moolenaar  catch /E933:/
693e859312eSBram Moolenaar    n = 344
694e859312eSBram Moolenaar  endtry
695e859312eSBram Moolenaar  assert_equal(344, n)
696d032f34aSBram Moolenaar
697d032f34aSBram Moolenaar  try
698d032f34aSBram Moolenaar    echo len(v:true)
699d032f34aSBram Moolenaar  catch /E701:/
700d032f34aSBram Moolenaar    n = 355
701d032f34aSBram Moolenaar  endtry
702d032f34aSBram Moolenaar  assert_equal(355, n)
703d032f34aSBram Moolenaar
704d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
705d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
706d032f34aSBram Moolenaar  try
707d032f34aSBram Moolenaar    echo P()
708d032f34aSBram Moolenaar  catch /E117:/
709d032f34aSBram Moolenaar    n = 366
710d032f34aSBram Moolenaar  endtry
711d032f34aSBram Moolenaar  assert_equal(366, n)
712d032f34aSBram Moolenaar
713d032f34aSBram Moolenaar  try
714d032f34aSBram Moolenaar    echo g:NoSuchFunc()
715d032f34aSBram Moolenaar  catch /E117:/
716d032f34aSBram Moolenaar    n = 377
717d032f34aSBram Moolenaar  endtry
718d032f34aSBram Moolenaar  assert_equal(377, n)
719d032f34aSBram Moolenaar
720d032f34aSBram Moolenaar  try
721d032f34aSBram Moolenaar    echo g:alist + 4
722d032f34aSBram Moolenaar  catch /E745:/
723d032f34aSBram Moolenaar    n = 388
724d032f34aSBram Moolenaar  endtry
725d032f34aSBram Moolenaar  assert_equal(388, n)
726d032f34aSBram Moolenaar
727d032f34aSBram Moolenaar  try
728d032f34aSBram Moolenaar    echo 4 + g:alist
729d032f34aSBram Moolenaar  catch /E745:/
730d032f34aSBram Moolenaar    n = 399
731d032f34aSBram Moolenaar  endtry
732d032f34aSBram Moolenaar  assert_equal(399, n)
733d032f34aSBram Moolenaar
734d032f34aSBram Moolenaar  try
735d032f34aSBram Moolenaar    echo g:alist.member
736d032f34aSBram Moolenaar  catch /E715:/
737d032f34aSBram Moolenaar    n = 400
738d032f34aSBram Moolenaar  endtry
739d032f34aSBram Moolenaar  assert_equal(400, n)
740d032f34aSBram Moolenaar
741d032f34aSBram Moolenaar  try
742d032f34aSBram Moolenaar    echo d.member
743d032f34aSBram Moolenaar  catch /E716:/
744d032f34aSBram Moolenaar    n = 411
745d032f34aSBram Moolenaar  endtry
746d032f34aSBram Moolenaar  assert_equal(411, n)
7478a7d6542SBram Moolenaarenddef
7488a7d6542SBram Moolenaar
749e859312eSBram Moolenaardef DeletedFunc(): list<any>
750e859312eSBram Moolenaar  return ['delete me']
751e859312eSBram Moolenaarenddef
752e859312eSBram Moolenaardefcompile
753e859312eSBram Moolenaardelfunc DeletedFunc
754e859312eSBram Moolenaar
755257cc5eeSBram Moolenaardef ThrowFromDef()
756a72cfb80SBram Moolenaar  throw "getout" # comment
757257cc5eeSBram Moolenaarenddef
758257cc5eeSBram Moolenaar
759257cc5eeSBram Moolenaarfunc CatchInFunc()
760257cc5eeSBram Moolenaar  try
761257cc5eeSBram Moolenaar    call ThrowFromDef()
762257cc5eeSBram Moolenaar  catch
763257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
764257cc5eeSBram Moolenaar  endtry
765257cc5eeSBram Moolenaarendfunc
766257cc5eeSBram Moolenaar
767257cc5eeSBram Moolenaardef CatchInDef()
768257cc5eeSBram Moolenaar  try
769257cc5eeSBram Moolenaar    ThrowFromDef()
770257cc5eeSBram Moolenaar  catch
771257cc5eeSBram Moolenaar    g:thrown_def = v:exception
772257cc5eeSBram Moolenaar  endtry
773257cc5eeSBram Moolenaarenddef
774257cc5eeSBram Moolenaar
775f575adffSBram Moolenaardef ReturnFinally(): string
776f575adffSBram Moolenaar  try
777f575adffSBram Moolenaar    return 'intry'
778f575adffSBram Moolenaar  finally
779f575adffSBram Moolenaar    g:in_finally = 'finally'
780f575adffSBram Moolenaar  endtry
781f575adffSBram Moolenaar  return 'end'
782f575adffSBram Moolenaarenddef
783f575adffSBram Moolenaar
784257cc5eeSBram Moolenaardef Test_try_catch_nested()
785257cc5eeSBram Moolenaar  CatchInFunc()
786257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
787257cc5eeSBram Moolenaar
788257cc5eeSBram Moolenaar  CatchInDef()
789257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
790f575adffSBram Moolenaar
791f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
792f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
793f575adffSBram Moolenaarenddef
794f575adffSBram Moolenaar
795f575adffSBram Moolenaardef Test_try_catch_match()
796f575adffSBram Moolenaar  let seq = 'a'
797f575adffSBram Moolenaar  try
798f575adffSBram Moolenaar    throw 'something'
799f575adffSBram Moolenaar  catch /nothing/
800f575adffSBram Moolenaar    seq ..= 'x'
801f575adffSBram Moolenaar  catch /some/
802f575adffSBram Moolenaar    seq ..= 'b'
803f575adffSBram Moolenaar  catch /asdf/
804f575adffSBram Moolenaar    seq ..= 'x'
805e8c4abbbSBram Moolenaar  catch ?a\?sdf?
806e8c4abbbSBram Moolenaar    seq ..= 'y'
807f575adffSBram Moolenaar  finally
808f575adffSBram Moolenaar    seq ..= 'c'
809f575adffSBram Moolenaar  endtry
810f575adffSBram Moolenaar  assert_equal('abc', seq)
811257cc5eeSBram Moolenaarenddef
812257cc5eeSBram Moolenaar
813e8c4abbbSBram Moolenaardef Test_try_catch_fails()
814e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
815e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
816e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
817585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
818585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
819585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
820585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
821585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
822585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
823585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
824585fea7bSBram Moolenaar
825a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
826585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
827e8c4abbbSBram Moolenaarenddef
828e8c4abbbSBram Moolenaar
829006ad48bSBram Moolenaardef Test_throw_vimscript()
830f5be8cdbSBram Moolenaar  # only checks line continuation
831006ad48bSBram Moolenaar  let lines =<< trim END
832006ad48bSBram Moolenaar      vim9script
833006ad48bSBram Moolenaar      try
834006ad48bSBram Moolenaar        throw 'one'
835006ad48bSBram Moolenaar              .. 'two'
836006ad48bSBram Moolenaar      catch
837006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
838006ad48bSBram Moolenaar      endtry
839006ad48bSBram Moolenaar  END
840006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
841006ad48bSBram Moolenaarenddef
842006ad48bSBram Moolenaar
84337c83711SBram Moolenaardef Test_cexpr_vimscript()
844f5be8cdbSBram Moolenaar  # only checks line continuation
84537c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
84637c83711SBram Moolenaar  let lines =<< trim END
84737c83711SBram Moolenaar      vim9script
84837c83711SBram Moolenaar      cexpr 'File'
84937c83711SBram Moolenaar                .. ' someFile' ..
85037c83711SBram Moolenaar                   ' line 19'
85137c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
85237c83711SBram Moolenaar  END
85337c83711SBram Moolenaar  CheckScriptSuccess(lines)
85437c83711SBram Moolenaar  set errorformat&
85537c83711SBram Moolenaarenddef
85637c83711SBram Moolenaar
857b209750bSBram Moolenaardef Test_list_vimscript()
858b209750bSBram Moolenaar  # checks line continuation and comments
859b209750bSBram Moolenaar  let lines =<< trim END
860b209750bSBram Moolenaar      vim9script
861b209750bSBram Moolenaar      let mylist = [
862b209750bSBram Moolenaar            'one',
863b209750bSBram Moolenaar            # comment
864b209750bSBram Moolenaar            'two', # empty line follows
865b209750bSBram Moolenaar
866b209750bSBram Moolenaar            'three',
867b209750bSBram Moolenaar            ]
868b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
869b209750bSBram Moolenaar  END
870b209750bSBram Moolenaar  CheckScriptSuccess(lines)
871b209750bSBram Moolenaarenddef
872b209750bSBram Moolenaar
8732a1381c3SBram Moolenaarif has('channel')
87440ee466cSBram Moolenaar  let someJob = test_null_job()
87540ee466cSBram Moolenaar
87640ee466cSBram Moolenaar  def FuncWithError()
87740ee466cSBram Moolenaar    echomsg g:someJob
87840ee466cSBram Moolenaar  enddef
87940ee466cSBram Moolenaar
88040ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
88140ee466cSBram Moolenaar    try
88240ee466cSBram Moolenaar      call FuncWithError()
88340ee466cSBram Moolenaar    catch
88440ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
88540ee466cSBram Moolenaar    endtry
88640ee466cSBram Moolenaar  endfunc
8872a1381c3SBram Moolenaarendif
88840ee466cSBram Moolenaar
8898a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
8908a7d6542SBram Moolenaar  vim9script
8918a7d6542SBram Moolenaar  let name: string = 'bob'
8928a7d6542SBram Moolenaar  def Concat(arg: string): string
8938a7d6542SBram Moolenaar    return name .. arg
8948a7d6542SBram Moolenaar  enddef
895227a69deSBram Moolenaar  g:result = Concat('bie')
896227a69deSBram Moolenaar  g:localname = name
8978a7d6542SBram Moolenaar
8988a7d6542SBram Moolenaar  export const CONST = 1234
8998a7d6542SBram Moolenaar  export let exported = 9876
9006e587dcbSBram Moolenaar  export let exp_name = 'John'
9018a7d6542SBram Moolenaar  export def Exported(): string
9028a7d6542SBram Moolenaar    return 'Exported'
9038a7d6542SBram Moolenaar  enddef
9048a7d6542SBram MoolenaarEND
9058a7d6542SBram Moolenaar
9065269bd2aSBram Moolenaardef Test_vim9_import_export()
9078a7d6542SBram Moolenaar  let import_script_lines =<< trim END
9088a7d6542SBram Moolenaar    vim9script
9098a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
9108a7d6542SBram Moolenaar    g:imported = exported
9116e587dcbSBram Moolenaar    exported += 3
9126e587dcbSBram Moolenaar    g:imported_added = exported
9138a7d6542SBram Moolenaar    g:imported_func = Exported()
9146e587dcbSBram Moolenaar
915*40f4f7a4SBram Moolenaar    def GetExported(): string
916*40f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
917*40f4f7a4SBram Moolenaar      return local_dict.ref()
918*40f4f7a4SBram Moolenaar    enddef
919*40f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
920*40f4f7a4SBram Moolenaar
9216e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
9226e587dcbSBram Moolenaar    g:imported_name = exp_name
9236e587dcbSBram Moolenaar    exp_name ..= ' Doe'
9246e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
9255381c7a1SBram Moolenaar    g:imported_later = exported
9268a7d6542SBram Moolenaar  END
9278a7d6542SBram Moolenaar
9288a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
9298a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
9308a7d6542SBram Moolenaar
9318a7d6542SBram Moolenaar  source Ximport.vim
9328a7d6542SBram Moolenaar
9338a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
9348a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
9358a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
9366e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
9375381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
9388a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
939*40f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
9406e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
9416e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
9428a7d6542SBram Moolenaar  assert_false(exists('g:name'))
9438a7d6542SBram Moolenaar
9448a7d6542SBram Moolenaar  unlet g:result
9458a7d6542SBram Moolenaar  unlet g:localname
9468a7d6542SBram Moolenaar  unlet g:imported
9476e587dcbSBram Moolenaar  unlet g:imported_added
9485381c7a1SBram Moolenaar  unlet g:imported_later
9498a7d6542SBram Moolenaar  unlet g:imported_func
9506e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
9518a7d6542SBram Moolenaar  delete('Ximport.vim')
952f2d5c240SBram Moolenaar
9531c991144SBram Moolenaar  # similar, with line breaks
9541c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
9551c991144SBram Moolenaar    vim9script
9561c991144SBram Moolenaar    import {
9571c991144SBram Moolenaar        exported,
9581c991144SBram Moolenaar        Exported,
9591c991144SBram Moolenaar        }
9601c991144SBram Moolenaar        from
9611c991144SBram Moolenaar        './Xexport.vim'
9621c991144SBram Moolenaar    g:imported = exported
9631c991144SBram Moolenaar    exported += 5
9641c991144SBram Moolenaar    g:imported_added = exported
9651c991144SBram Moolenaar    g:imported_func = Exported()
9661c991144SBram Moolenaar  END
9671c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
9681c991144SBram Moolenaar  source Ximport_lbr.vim
9691c991144SBram Moolenaar
9701c991144SBram Moolenaar  assert_equal(9876, g:imported)
9711c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
9721c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
9731c991144SBram Moolenaar
9741c991144SBram Moolenaar  # exported script not sourced again
9751c991144SBram Moolenaar  assert_false(exists('g:result'))
9761c991144SBram Moolenaar  unlet g:imported
9771c991144SBram Moolenaar  unlet g:imported_added
9781c991144SBram Moolenaar  unlet g:imported_func
9791c991144SBram Moolenaar  delete('Ximport_lbr.vim')
9801c991144SBram Moolenaar
9811c991144SBram Moolenaar  # import inside :def function
9825381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
9835381c7a1SBram Moolenaar    vim9script
9845381c7a1SBram Moolenaar    def ImportInDef()
9855381c7a1SBram Moolenaar      import exported from './Xexport.vim'
9865381c7a1SBram Moolenaar      g:imported = exported
9875381c7a1SBram Moolenaar      exported += 7
9885381c7a1SBram Moolenaar      g:imported_added = exported
9895381c7a1SBram Moolenaar    enddef
9905381c7a1SBram Moolenaar    ImportInDef()
9915381c7a1SBram Moolenaar  END
9925381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
9935381c7a1SBram Moolenaar  source Ximport2.vim
994f5be8cdbSBram Moolenaar  # TODO: this should be 9879
9955381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
9965381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
9975381c7a1SBram Moolenaar  unlet g:imported
9985381c7a1SBram Moolenaar  unlet g:imported_added
9995381c7a1SBram Moolenaar  delete('Ximport2.vim')
10005381c7a1SBram Moolenaar
1001f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1002f2d5c240SBram Moolenaar    vim9script
1003f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1004f2d5c240SBram Moolenaar    def UseExport()
1005f2d5c240SBram Moolenaar      g:imported = Export.exported
1006f2d5c240SBram Moolenaar    enddef
1007f2d5c240SBram Moolenaar    UseExport()
1008f2d5c240SBram Moolenaar  END
1009f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1010f2d5c240SBram Moolenaar  source Ximport.vim
10115381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1012f2d5c240SBram Moolenaar
1013599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1014599c89c8SBram Moolenaar    vim9script
1015599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1016599c89c8SBram Moolenaar    def Func()
1017599c89c8SBram Moolenaar      let dummy = 1
1018599c89c8SBram Moolenaar      let imported = Export + dummy
1019599c89c8SBram Moolenaar    enddef
1020822ba247SBram Moolenaar    defcompile
1021599c89c8SBram Moolenaar  END
1022599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1023599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1024599c89c8SBram Moolenaar
1025599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1026599c89c8SBram Moolenaar    vim9script
1027599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1028599c89c8SBram Moolenaar    def Func()
1029599c89c8SBram Moolenaar      let imported = Export . exported
1030599c89c8SBram Moolenaar    enddef
1031822ba247SBram Moolenaar    defcompile
1032599c89c8SBram Moolenaar  END
1033599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1034599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1035599c89c8SBram Moolenaar
1036599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1037599c89c8SBram Moolenaar    vim9script
1038599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1039599c89c8SBram Moolenaar    def Func()
1040599c89c8SBram Moolenaar      let imported = Export.
1041599c89c8SBram Moolenaar    enddef
1042822ba247SBram Moolenaar    defcompile
1043599c89c8SBram Moolenaar  END
1044599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1045599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1046599c89c8SBram Moolenaar
10471c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
10481c991144SBram Moolenaar    vim9script
10491c991144SBram Moolenaar    import *
10501c991144SBram Moolenaar        as Export
10511c991144SBram Moolenaar        from
10521c991144SBram Moolenaar        './Xexport.vim'
10531c991144SBram Moolenaar    def UseExport()
10541c991144SBram Moolenaar      g:imported = Export.exported
10551c991144SBram Moolenaar    enddef
10561c991144SBram Moolenaar    UseExport()
10571c991144SBram Moolenaar  END
10581c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
10591c991144SBram Moolenaar  source Ximport.vim
10601c991144SBram Moolenaar  assert_equal(9883, g:imported)
10611c991144SBram Moolenaar
1062f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1063f2d5c240SBram Moolenaar    vim9script
1064f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1065f2d5c240SBram Moolenaar  END
1066f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1067f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1068f2d5c240SBram Moolenaar
1069f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1070fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1071fa29c8abSBram Moolenaar    vim9script
1072fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1073fa29c8abSBram Moolenaar  END
1074fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1075fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1076fa29c8abSBram Moolenaar
1077f5be8cdbSBram Moolenaar  # try to import something that is already defined
10785269bd2aSBram Moolenaar  let import_already_defined =<< trim END
10795269bd2aSBram Moolenaar    vim9script
10805269bd2aSBram Moolenaar    let exported = 'something'
10815269bd2aSBram Moolenaar    import exported from './Xexport.vim'
10825269bd2aSBram Moolenaar  END
10835269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
10845269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
10855269bd2aSBram Moolenaar
1086f5be8cdbSBram Moolenaar  # try to import something that is already defined
10875269bd2aSBram Moolenaar  import_already_defined =<< trim END
10885269bd2aSBram Moolenaar    vim9script
10895269bd2aSBram Moolenaar    let exported = 'something'
10905269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
10915269bd2aSBram Moolenaar  END
10925269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
10935269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
10945269bd2aSBram Moolenaar
1095f5be8cdbSBram Moolenaar  # try to import something that is already defined
10965269bd2aSBram Moolenaar  import_already_defined =<< trim END
10975269bd2aSBram Moolenaar    vim9script
10985269bd2aSBram Moolenaar    let exported = 'something'
10995269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
11005269bd2aSBram Moolenaar  END
11015269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
11025269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
11035269bd2aSBram Moolenaar
1104f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1105fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1106fa29c8abSBram Moolenaar    vim9script
1107fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1108fa29c8abSBram Moolenaar  END
1109fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1110fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1111fa29c8abSBram Moolenaar
1112fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1113fa29c8abSBram Moolenaar    vim9script
1114fa29c8abSBram Moolenaar    import name './Xexport.vim'
1115fa29c8abSBram Moolenaar  END
1116fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1117fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1118fa29c8abSBram Moolenaar
1119fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1120fa29c8abSBram Moolenaar    vim9script
1121fa29c8abSBram Moolenaar    import name from Xexport.vim
1122fa29c8abSBram Moolenaar  END
1123fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1124fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1125fa29c8abSBram Moolenaar
1126fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1127fa29c8abSBram Moolenaar    vim9script
1128fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1129fa29c8abSBram Moolenaar  END
1130fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1131fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1132fa29c8abSBram Moolenaar
1133fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1134fa29c8abSBram Moolenaar    vim9script
1135fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1136fa29c8abSBram Moolenaar  END
11375269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
11385269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1139fa29c8abSBram Moolenaar
1140f2d5c240SBram Moolenaar  delete('Ximport.vim')
11415269bd2aSBram Moolenaar  delete('Ximport3.vim')
11428a7d6542SBram Moolenaar  delete('Xexport.vim')
11438a7d6542SBram Moolenaar
1144f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1145750802b5SBram Moolenaar  set cpo&vi
1146750802b5SBram Moolenaar  let cpo_before = &cpo
1147750802b5SBram Moolenaar  let lines =<< trim END
1148750802b5SBram Moolenaar    vim9script
1149750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1150750802b5SBram Moolenaar  END
1151750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1152750802b5SBram Moolenaar  source Xvim9_script
1153750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1154750802b5SBram Moolenaar  set cpo&vim
1155750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1156750802b5SBram Moolenaar  delete('Xvim9_script')
1157750802b5SBram Moolenaarenddef
1158750802b5SBram Moolenaar
1159750802b5SBram Moolenaardef Test_vim9script_fails()
11608a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
11618a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1162750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
11639721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
11649b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1165750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1166750802b5SBram Moolenaar
1167c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1168c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1169c785b9a7SBram Moolenaar
1170750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1171a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
11728a7d6542SBram Moolenaarenddef
11738a7d6542SBram Moolenaar
1174f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1175101f4810SBram Moolenaar  CheckRunVimInTerminal
1176101f4810SBram Moolenaar
11779bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1178c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
11799bb3eb3eSBram Moolenaarendfunc
11809bb3eb3eSBram Moolenaar
1181c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1182101f4810SBram Moolenaar  let export =<< trim END
1183101f4810SBram Moolenaar    vim9script
1184101f4810SBram Moolenaar    export def Foo(): number
1185101f4810SBram Moolenaar        return 0
1186101f4810SBram Moolenaar    enddef
1187101f4810SBram Moolenaar  END
11889bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
1189101f4810SBram Moolenaar
11909bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
11919bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
11929bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1193101f4810SBram Moolenaar
11949bb3eb3eSBram Moolenaar  delete('Xexport.vim')
11959bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
11969bb3eb3eSBram Moolenaarenddef
1197101f4810SBram Moolenaar
11984c17ad94SBram Moolenaardef Test_vim9script_reload_import()
11998a7d6542SBram Moolenaar  let lines =<< trim END
12008a7d6542SBram Moolenaar    vim9script
12018a7d6542SBram Moolenaar    const var = ''
12028a7d6542SBram Moolenaar    let valone = 1234
12038a7d6542SBram Moolenaar    def MyFunc(arg: string)
12048a7d6542SBram Moolenaar       valone = 5678
12058a7d6542SBram Moolenaar    enddef
12068a7d6542SBram Moolenaar  END
12078a7d6542SBram Moolenaar  let morelines =<< trim END
12088a7d6542SBram Moolenaar    let valtwo = 222
12098a7d6542SBram Moolenaar    export def GetValtwo(): number
12108a7d6542SBram Moolenaar      return valtwo
12118a7d6542SBram Moolenaar    enddef
12128a7d6542SBram Moolenaar  END
121303afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
12148a7d6542SBram Moolenaar  source Xreload.vim
12158a7d6542SBram Moolenaar  source Xreload.vim
12168a7d6542SBram Moolenaar  source Xreload.vim
12178a7d6542SBram Moolenaar
12188a7d6542SBram Moolenaar  let testlines =<< trim END
12198a7d6542SBram Moolenaar    vim9script
12208a7d6542SBram Moolenaar    def TheFunc()
12218a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
12228a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
12238a7d6542SBram Moolenaar    enddef
12248a7d6542SBram Moolenaar    TheFunc()
12258a7d6542SBram Moolenaar  END
12268a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
12278a7d6542SBram Moolenaar  source Ximport.vim
12288a7d6542SBram Moolenaar
1229f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1230f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
12318a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
12328a7d6542SBram Moolenaar  source Ximport.vim
12338a7d6542SBram Moolenaar
1234f5be8cdbSBram Moolenaar  # cannot declare a var twice
12358a7d6542SBram Moolenaar  lines =<< trim END
12368a7d6542SBram Moolenaar    vim9script
12378a7d6542SBram Moolenaar    let valone = 1234
12388a7d6542SBram Moolenaar    let valone = 5678
12398a7d6542SBram Moolenaar  END
12408a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
12418a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
12428a7d6542SBram Moolenaar
12438a7d6542SBram Moolenaar  delete('Xreload.vim')
12448a7d6542SBram Moolenaar  delete('Ximport.vim')
12458a7d6542SBram Moolenaarenddef
12468a7d6542SBram Moolenaar
1247fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1248fe465a01SBram Moolenaar" script-local name.
1249fe465a01SBram Moolenaardef Test_vim9script_funcref()
1250fe465a01SBram Moolenaar  let sortlines =<< trim END
1251fe465a01SBram Moolenaar      vim9script
1252fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1253bed36b93SBram Moolenaar        return i2 - i1
1254fe465a01SBram Moolenaar      enddef
1255fe465a01SBram Moolenaar
1256fe465a01SBram Moolenaar      export def FastSort(): list<number>
1257fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1258fe465a01SBram Moolenaar      enddef
1259fe465a01SBram Moolenaar  END
1260fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1261fe465a01SBram Moolenaar
1262fe465a01SBram Moolenaar  let lines =<< trim END
1263fe465a01SBram Moolenaar    vim9script
1264fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1265fe465a01SBram Moolenaar    def Test()
1266fe465a01SBram Moolenaar      g:result = FastSort()
1267fe465a01SBram Moolenaar    enddef
1268fe465a01SBram Moolenaar    Test()
1269fe465a01SBram Moolenaar  END
1270fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1271fe465a01SBram Moolenaar
1272fe465a01SBram Moolenaar  source Xscript.vim
1273fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1274fe465a01SBram Moolenaar
1275fe465a01SBram Moolenaar  unlet g:result
1276fe465a01SBram Moolenaar  delete('Xsort.vim')
1277fe465a01SBram Moolenaar  delete('Xscript.vim')
1278fe465a01SBram Moolenaarenddef
1279fe465a01SBram Moolenaar
1280c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1281c620c055SBram Moolenaar" script where FastFilter() is called from.
1282c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1283c620c055SBram Moolenaar  let filterLines =<< trim END
1284c620c055SBram Moolenaar    vim9script
1285c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1286c620c055SBram Moolenaar      return idx % 2 == 1
1287c620c055SBram Moolenaar    enddef
1288c620c055SBram Moolenaar    export def FastFilter(): list<number>
1289c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1290c620c055SBram Moolenaar    enddef
1291c620c055SBram Moolenaar  END
1292c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1293c620c055SBram Moolenaar
1294c620c055SBram Moolenaar  let lines =<< trim END
1295c620c055SBram Moolenaar    vim9script
1296c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1297c620c055SBram Moolenaar    def Test()
1298c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1299c620c055SBram Moolenaar    enddef
1300c620c055SBram Moolenaar    Test()
1301c620c055SBram Moolenaar  END
1302c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1303c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1304c620c055SBram Moolenaar
1305c620c055SBram Moolenaar  delete('Xfilter.vim')
1306c620c055SBram Moolenaar  delete('Ximport.vim')
1307c620c055SBram Moolenaarenddef
1308c620c055SBram Moolenaar
13094c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
13104c17ad94SBram Moolenaar  let first_lines =<< trim END
13114c17ad94SBram Moolenaar    vim9script
13124c17ad94SBram Moolenaar    def FuncYes(): string
13134c17ad94SBram Moolenaar      return 'yes'
13144c17ad94SBram Moolenaar    enddef
13154c17ad94SBram Moolenaar  END
131603afdcf1SBram Moolenaar  let withno_lines =<< trim END
13174c17ad94SBram Moolenaar    def FuncNo(): string
13184c17ad94SBram Moolenaar      return 'no'
13194c17ad94SBram Moolenaar    enddef
13204c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
13214c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
13224c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
132303afdcf1SBram Moolenaar    enddef
132403afdcf1SBram Moolenaar  END
132503afdcf1SBram Moolenaar  let nono_lines =<< trim END
132603afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
132703afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
13284c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
13294c17ad94SBram Moolenaar    enddef
13304c17ad94SBram Moolenaar  END
13314c17ad94SBram Moolenaar
13324c17ad94SBram Moolenaar  # FuncNo() is defined
133303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13344c17ad94SBram Moolenaar  source Xreloaded.vim
13354c17ad94SBram Moolenaar  g:DoCheck(true)
13364c17ad94SBram Moolenaar
13374c17ad94SBram Moolenaar  # FuncNo() is not redefined
133803afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
13394c17ad94SBram Moolenaar  source Xreloaded.vim
134003afdcf1SBram Moolenaar  g:DoCheck()
13414c17ad94SBram Moolenaar
13424c17ad94SBram Moolenaar  # FuncNo() is back
134303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13444c17ad94SBram Moolenaar  source Xreloaded.vim
134503afdcf1SBram Moolenaar  g:DoCheck()
13464c17ad94SBram Moolenaar
13474c17ad94SBram Moolenaar  delete('Xreloaded.vim')
13484c17ad94SBram Moolenaarenddef
13494c17ad94SBram Moolenaar
135089483d40SBram Moolenaardef Test_vim9script_reload_delvar()
135189483d40SBram Moolenaar  # write the script with a script-local variable
135289483d40SBram Moolenaar  let lines =<< trim END
135389483d40SBram Moolenaar    vim9script
135489483d40SBram Moolenaar    let var = 'string'
135589483d40SBram Moolenaar  END
135689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
135789483d40SBram Moolenaar  source XreloadVar.vim
135889483d40SBram Moolenaar
135989483d40SBram Moolenaar  # now write the script using the same variable locally - works
136089483d40SBram Moolenaar  lines =<< trim END
136189483d40SBram Moolenaar    vim9script
136289483d40SBram Moolenaar    def Func()
136389483d40SBram Moolenaar      let var = 'string'
136489483d40SBram Moolenaar    enddef
136589483d40SBram Moolenaar  END
136689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
136789483d40SBram Moolenaar  source XreloadVar.vim
136889483d40SBram Moolenaar
136989483d40SBram Moolenaar  delete('XreloadVar.vim')
137089483d40SBram Moolenaarenddef
137189483d40SBram Moolenaar
13728a7d6542SBram Moolenaardef Test_import_absolute()
13738a7d6542SBram Moolenaar  let import_lines = [
1374e6085c53SBram Moolenaar        'vim9script',
1375e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1376e6085c53SBram Moolenaar        'def UseExported()',
1377e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1378e6085c53SBram Moolenaar        '  exported = 8888',
1379e6085c53SBram Moolenaar        '  g:imported_after = exported',
1380e6085c53SBram Moolenaar        'enddef',
1381e6085c53SBram Moolenaar        'UseExported()',
1382e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1383e6085c53SBram Moolenaar        ]
13848a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
13858a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
13868a7d6542SBram Moolenaar
13878a7d6542SBram Moolenaar  source Ximport_abs.vim
13888a7d6542SBram Moolenaar
13898a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
13904e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1391675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1392675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1393675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1394675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1395675f716eSBram Moolenaar          'exported = 8888.*' ..
1396675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1397675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1398675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1399675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1400e6085c53SBram Moolenaar        g:import_disassembled)
14018a7d6542SBram Moolenaar  unlet g:imported_abs
14024e12a5dfSBram Moolenaar  unlet g:import_disassembled
14038a7d6542SBram Moolenaar
14048a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
14058a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
14068a7d6542SBram Moolenaarenddef
14078a7d6542SBram Moolenaar
14088a7d6542SBram Moolenaardef Test_import_rtp()
14098a7d6542SBram Moolenaar  let import_lines = [
1410e6085c53SBram Moolenaar        'vim9script',
1411e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1412e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1413e6085c53SBram Moolenaar        ]
14148a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
14158a7d6542SBram Moolenaar  mkdir('import')
14168a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
14178a7d6542SBram Moolenaar
14188a7d6542SBram Moolenaar  let save_rtp = &rtp
14198a7d6542SBram Moolenaar  &rtp = getcwd()
14208a7d6542SBram Moolenaar  source Ximport_rtp.vim
14218a7d6542SBram Moolenaar  &rtp = save_rtp
14228a7d6542SBram Moolenaar
14238a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
14248a7d6542SBram Moolenaar  unlet g:imported_rtp
14258a7d6542SBram Moolenaar
14268a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
142789483d40SBram Moolenaar  delete('import', 'rf')
14288a7d6542SBram Moolenaarenddef
14298a7d6542SBram Moolenaar
143025e0f586SBram Moolenaardef Test_import_compile_error()
143125e0f586SBram Moolenaar  let export_lines = [
143225e0f586SBram Moolenaar        'vim9script',
143325e0f586SBram Moolenaar        'export def ExpFunc(): string',
143425e0f586SBram Moolenaar        '  return notDefined',
143525e0f586SBram Moolenaar        'enddef',
143625e0f586SBram Moolenaar        ]
143725e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
143825e0f586SBram Moolenaar
143925e0f586SBram Moolenaar  let import_lines = [
144025e0f586SBram Moolenaar        'vim9script',
144125e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
144225e0f586SBram Moolenaar        'def ImpFunc()',
144325e0f586SBram Moolenaar        '  echo ExpFunc()',
144425e0f586SBram Moolenaar        'enddef',
144525e0f586SBram Moolenaar        'defcompile',
144625e0f586SBram Moolenaar        ]
144725e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
144825e0f586SBram Moolenaar
144925e0f586SBram Moolenaar  try
145025e0f586SBram Moolenaar    source Ximport.vim
145125e0f586SBram Moolenaar  catch /E1001/
1452f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
145325e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
145425e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
145525e0f586SBram Moolenaar  endtry
145625e0f586SBram Moolenaar
145725e0f586SBram Moolenaar  delete('Xexported.vim')
145825e0f586SBram Moolenaar  delete('Ximport.vim')
145925e0f586SBram Moolenaarenddef
146025e0f586SBram Moolenaar
14618a7d6542SBram Moolenaardef Test_fixed_size_list()
1462f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
14638a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
14648a7d6542SBram Moolenaar  l->remove(0)
14658a7d6542SBram Moolenaar  l->add(5)
14668a7d6542SBram Moolenaar  l->insert(99, 1)
14670f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
14688a7d6542SBram Moolenaarenddef
14698a7d6542SBram Moolenaar
1470158906cfSBram Moolenaardef IfElse(what: number): string
1471158906cfSBram Moolenaar  let res = ''
1472158906cfSBram Moolenaar  if what == 1
1473158906cfSBram Moolenaar    res = "one"
1474158906cfSBram Moolenaar  elseif what == 2
1475158906cfSBram Moolenaar    res = "two"
1476a259d8d3SBram Moolenaar  else
1477158906cfSBram Moolenaar    res = "three"
1478a259d8d3SBram Moolenaar  endif
1479158906cfSBram Moolenaar  return res
1480a259d8d3SBram Moolenaarenddef
1481a259d8d3SBram Moolenaar
1482158906cfSBram Moolenaardef Test_if_elseif_else()
1483158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1484158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1485158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
14860f18b6d1SBram Moolenaarenddef
14870f18b6d1SBram Moolenaar
1488e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1489e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1490e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1491e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1492e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1493585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1494e8c4abbbSBram Moolenaarenddef
1495e8c4abbbSBram Moolenaar
14966d69bf60SBram Moolenaarlet g:bool_true = v:true
14976d69bf60SBram Moolenaarlet g:bool_false = v:false
14986d69bf60SBram Moolenaar
14996d69bf60SBram Moolenaardef Test_if_const_expr()
15006d69bf60SBram Moolenaar  let res = false
15016d69bf60SBram Moolenaar  if true ? true : false
15026d69bf60SBram Moolenaar    res = true
15036d69bf60SBram Moolenaar  endif
15046d69bf60SBram Moolenaar  assert_equal(true, res)
15056d69bf60SBram Moolenaar
1506585fea7bSBram Moolenaar  g:glob = 2
1507585fea7bSBram Moolenaar  if false
15086797966dSBram Moolenaar    execute('g:glob = 3')
1509585fea7bSBram Moolenaar  endif
1510585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1511585fea7bSBram Moolenaar  if true
15126797966dSBram Moolenaar    execute('g:glob = 3')
1513585fea7bSBram Moolenaar  endif
1514585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1515585fea7bSBram Moolenaar
15166d69bf60SBram Moolenaar  res = false
15176d69bf60SBram Moolenaar  if g:bool_true ? true : false
15186d69bf60SBram Moolenaar    res = true
15196d69bf60SBram Moolenaar  endif
15206d69bf60SBram Moolenaar  assert_equal(true, res)
15216d69bf60SBram Moolenaar
15226d69bf60SBram Moolenaar  res = false
15236d69bf60SBram Moolenaar  if true ? g:bool_true : false
15246d69bf60SBram Moolenaar    res = true
15256d69bf60SBram Moolenaar  endif
15266d69bf60SBram Moolenaar  assert_equal(true, res)
15276d69bf60SBram Moolenaar
15286d69bf60SBram Moolenaar  res = false
15296d69bf60SBram Moolenaar  if true ? true : g:bool_false
15306d69bf60SBram Moolenaar    res = true
15316d69bf60SBram Moolenaar  endif
15326d69bf60SBram Moolenaar  assert_equal(true, res)
15336d69bf60SBram Moolenaar
15346d69bf60SBram Moolenaar  res = false
15356d69bf60SBram Moolenaar  if true ? false : true
15366d69bf60SBram Moolenaar    res = true
15376d69bf60SBram Moolenaar  endif
15386d69bf60SBram Moolenaar  assert_equal(false, res)
15396d69bf60SBram Moolenaar
15406d69bf60SBram Moolenaar  res = false
15416d69bf60SBram Moolenaar  if false ? false : true
15426d69bf60SBram Moolenaar    res = true
15436d69bf60SBram Moolenaar  endif
15446d69bf60SBram Moolenaar  assert_equal(true, res)
15456d69bf60SBram Moolenaar
15466d69bf60SBram Moolenaar  res = false
15476d69bf60SBram Moolenaar  if false ? true : false
15486d69bf60SBram Moolenaar    res = true
15496d69bf60SBram Moolenaar  endif
15506d69bf60SBram Moolenaar  assert_equal(false, res)
15516d69bf60SBram Moolenaar
15526d69bf60SBram Moolenaar  res = false
1553e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1554e8c4abbbSBram Moolenaar    res = true
1555e8c4abbbSBram Moolenaar  endif
1556e8c4abbbSBram Moolenaar  assert_equal(false, res)
1557e8c4abbbSBram Moolenaar
1558e8c4abbbSBram Moolenaar  res = false
15596d69bf60SBram Moolenaar  if true && true
15606d69bf60SBram Moolenaar    res = true
15616d69bf60SBram Moolenaar  endif
15626d69bf60SBram Moolenaar  assert_equal(true, res)
15636d69bf60SBram Moolenaar
15646d69bf60SBram Moolenaar  res = false
15656d69bf60SBram Moolenaar  if true && false
15666d69bf60SBram Moolenaar    res = true
15676d69bf60SBram Moolenaar  endif
15686d69bf60SBram Moolenaar  assert_equal(false, res)
15696d69bf60SBram Moolenaar
15706d69bf60SBram Moolenaar  res = false
15716d69bf60SBram Moolenaar  if g:bool_true && false
15726d69bf60SBram Moolenaar    res = true
15736d69bf60SBram Moolenaar  endif
15746d69bf60SBram Moolenaar  assert_equal(false, res)
15756d69bf60SBram Moolenaar
15766d69bf60SBram Moolenaar  res = false
15776d69bf60SBram Moolenaar  if true && g:bool_false
15786d69bf60SBram Moolenaar    res = true
15796d69bf60SBram Moolenaar  endif
15806d69bf60SBram Moolenaar  assert_equal(false, res)
15816d69bf60SBram Moolenaar
15826d69bf60SBram Moolenaar  res = false
15836d69bf60SBram Moolenaar  if false && false
15846d69bf60SBram Moolenaar    res = true
15856d69bf60SBram Moolenaar  endif
15866d69bf60SBram Moolenaar  assert_equal(false, res)
15876d69bf60SBram Moolenaar
15886d69bf60SBram Moolenaar  res = false
15896d69bf60SBram Moolenaar  if true || false
15906d69bf60SBram Moolenaar    res = true
15916d69bf60SBram Moolenaar  endif
15926d69bf60SBram Moolenaar  assert_equal(true, res)
15936d69bf60SBram Moolenaar
15946d69bf60SBram Moolenaar  res = false
15956d69bf60SBram Moolenaar  if g:bool_true || false
15966d69bf60SBram Moolenaar    res = true
15976d69bf60SBram Moolenaar  endif
15986d69bf60SBram Moolenaar  assert_equal(true, res)
15996d69bf60SBram Moolenaar
16006d69bf60SBram Moolenaar  res = false
16016d69bf60SBram Moolenaar  if true || g:bool_false
16026d69bf60SBram Moolenaar    res = true
16036d69bf60SBram Moolenaar  endif
16046d69bf60SBram Moolenaar  assert_equal(true, res)
16056d69bf60SBram Moolenaar
16066d69bf60SBram Moolenaar  res = false
16076d69bf60SBram Moolenaar  if false || false
16086d69bf60SBram Moolenaar    res = true
16096d69bf60SBram Moolenaar  endif
16106d69bf60SBram Moolenaar  assert_equal(false, res)
161180c34ca3SBram Moolenaarenddef
16126d69bf60SBram Moolenaar
161380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
161480c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
161580c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1616e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1617e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
16186d69bf60SBram Moolenaarenddef
16196d69bf60SBram Moolenaar
162072abcf42SBram Moolenaardef RunNested(i: number): number
162172abcf42SBram Moolenaar  let x: number = 0
162272abcf42SBram Moolenaar  if i % 2
162372abcf42SBram Moolenaar    if 1
1624f5be8cdbSBram Moolenaar      # comment
162572abcf42SBram Moolenaar    else
1626f5be8cdbSBram Moolenaar      # comment
162772abcf42SBram Moolenaar    endif
162872abcf42SBram Moolenaar    x += 1
162972abcf42SBram Moolenaar  else
163072abcf42SBram Moolenaar    x += 1000
163172abcf42SBram Moolenaar  endif
163272abcf42SBram Moolenaar  return x
163372abcf42SBram Moolenaarenddef
163472abcf42SBram Moolenaar
163572abcf42SBram Moolenaardef Test_nested_if()
163672abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
163772abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
163872abcf42SBram Moolenaarenddef
163972abcf42SBram Moolenaar
1640ad39c094SBram Moolenaardef Test_execute_cmd()
1641ad39c094SBram Moolenaar  new
1642ad39c094SBram Moolenaar  setline(1, 'default')
1643ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1644ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1645a72cfb80SBram Moolenaar
1646a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1647a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1648a72cfb80SBram Moolenaar
1649ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1650ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1651a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1652ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1653a72cfb80SBram Moolenaar
1654ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1655ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1656a72cfb80SBram Moolenaar
1657ad39c094SBram Moolenaar  let cmd_first = 'call '
1658ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1659ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1660ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1661ad39c094SBram Moolenaar  bwipe!
1662585fea7bSBram Moolenaar
1663585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1664a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1665ad39c094SBram Moolenaarenddef
1666ad39c094SBram Moolenaar
166747e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1668f5be8cdbSBram Moolenaar  # only checks line continuation
166947e880d6SBram Moolenaar  let lines =<< trim END
167047e880d6SBram Moolenaar      vim9script
167147e880d6SBram Moolenaar      execute 'g:someVar'
167247e880d6SBram Moolenaar                .. ' = ' ..
167347e880d6SBram Moolenaar                   '28'
167447e880d6SBram Moolenaar      assert_equal(28, g:someVar)
167547e880d6SBram Moolenaar      unlet g:someVar
167647e880d6SBram Moolenaar  END
167747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
167847e880d6SBram Moolenaarenddef
167947e880d6SBram Moolenaar
1680ad39c094SBram Moolenaardef Test_echo_cmd()
1681a72cfb80SBram Moolenaar  echo 'some' # comment
1682585fea7bSBram Moolenaar  echon 'thing'
1683ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1684ad39c094SBram Moolenaar
1685a72cfb80SBram Moolenaar  echo "some" # comment
1686a72cfb80SBram Moolenaar  echon "thing"
1687a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1688a72cfb80SBram Moolenaar
1689ad39c094SBram Moolenaar  let str1 = 'some'
1690ad39c094SBram Moolenaar  let str2 = 'more'
1691ad39c094SBram Moolenaar  echo str1 str2
1692ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1693a72cfb80SBram Moolenaar
1694a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1695ad39c094SBram Moolenaarenddef
1696ad39c094SBram Moolenaar
1697f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1698f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1699f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1700f93c7feaSBram Moolenaar  echo 'clear'
1701df069eecSBram Moolenaar  :1messages
1702f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1703f93c7feaSBram Moolenaar
1704f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1705f93c7feaSBram Moolenaarenddef
1706f93c7feaSBram Moolenaar
170747e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1708f5be8cdbSBram Moolenaar  # only checks line continuation
170947e880d6SBram Moolenaar  let lines =<< trim END
171047e880d6SBram Moolenaar      vim9script
171147e880d6SBram Moolenaar      echomsg 'here'
171247e880d6SBram Moolenaar                .. ' is ' ..
171347e880d6SBram Moolenaar                   'a message'
171447e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
171547e880d6SBram Moolenaar  END
171647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
171747e880d6SBram Moolenaarenddef
171847e880d6SBram Moolenaar
1719f93c7feaSBram Moolenaardef Test_echoerr_cmd()
172040ee466cSBram Moolenaar  try
172140ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
172240ee466cSBram Moolenaar  catch
172340ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
172440ee466cSBram Moolenaar  endtry
1725f93c7feaSBram Moolenaarenddef
1726f93c7feaSBram Moolenaar
172747e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1728f5be8cdbSBram Moolenaar  # only checks line continuation
172947e880d6SBram Moolenaar  let lines =<< trim END
173047e880d6SBram Moolenaar      vim9script
173147e880d6SBram Moolenaar      try
173247e880d6SBram Moolenaar        echoerr 'this'
173347e880d6SBram Moolenaar                .. ' is ' ..
173447e880d6SBram Moolenaar                   'wrong'
173547e880d6SBram Moolenaar      catch
173647e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
173747e880d6SBram Moolenaar      endtry
173847e880d6SBram Moolenaar  END
173947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
174047e880d6SBram Moolenaarenddef
174147e880d6SBram Moolenaar
174241fe0617SBram Moolenaardef Test_for_outside_of_function()
174341fe0617SBram Moolenaar  let lines =<< trim END
174441fe0617SBram Moolenaar    vim9script
174541fe0617SBram Moolenaar    new
174641fe0617SBram Moolenaar    for var in range(0, 3)
174741fe0617SBram Moolenaar      append(line('$'), var)
174841fe0617SBram Moolenaar    endfor
174941fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
175041fe0617SBram Moolenaar    bwipe!
175141fe0617SBram Moolenaar  END
175241fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
175341fe0617SBram Moolenaar  source Xvim9for.vim
175441fe0617SBram Moolenaar  delete('Xvim9for.vim')
175541fe0617SBram Moolenaarenddef
17568a7d6542SBram Moolenaar
1757e8c4abbbSBram Moolenaardef Test_for_loop()
1758e8c4abbbSBram Moolenaar  let result = ''
1759e8c4abbbSBram Moolenaar  for cnt in range(7)
1760e8c4abbbSBram Moolenaar    if cnt == 4
1761e8c4abbbSBram Moolenaar      break
1762e8c4abbbSBram Moolenaar    endif
1763e8c4abbbSBram Moolenaar    if cnt == 2
1764e8c4abbbSBram Moolenaar      continue
1765e8c4abbbSBram Moolenaar    endif
1766e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1767e8c4abbbSBram Moolenaar  endfor
1768e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
17690ad3e894SBram Moolenaar
17700ad3e894SBram Moolenaar  let concat = ''
17710ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
17720ad3e894SBram Moolenaar    concat ..= str
17730ad3e894SBram Moolenaar  endfor
17740ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1775e8c4abbbSBram Moolenaarenddef
1776e8c4abbbSBram Moolenaar
1777e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1778675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1779675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1780675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1781822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
17820ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
1783675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1784675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1785675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1786e8c4abbbSBram Moolenaarenddef
1787e8c4abbbSBram Moolenaar
1788d0df1aacSBram Moolenaardef Test_while_loop()
1789d0df1aacSBram Moolenaar  let result = ''
1790d0df1aacSBram Moolenaar  let cnt = 0
1791d0df1aacSBram Moolenaar  while cnt < 555
1792d0df1aacSBram Moolenaar    if cnt == 3
1793d0df1aacSBram Moolenaar      break
1794d0df1aacSBram Moolenaar    endif
1795d0df1aacSBram Moolenaar    cnt += 1
1796d0df1aacSBram Moolenaar    if cnt == 2
1797d0df1aacSBram Moolenaar      continue
1798d0df1aacSBram Moolenaar    endif
1799d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1800d0df1aacSBram Moolenaar  endwhile
1801d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1802d0df1aacSBram Moolenaarenddef
1803d0df1aacSBram Moolenaar
1804e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1805675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1806675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1807675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1808675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1809675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1810675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1811675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1812bd5da371SBram Moolenaarenddef
1813bd5da371SBram Moolenaar
18149645e2d9SBram Moolenaardef Test_interrupt_loop()
181597acfc78SBram Moolenaar  let caught = false
18169645e2d9SBram Moolenaar  let x = 0
181797acfc78SBram Moolenaar  try
18189645e2d9SBram Moolenaar    while 1
18199645e2d9SBram Moolenaar      x += 1
18209645e2d9SBram Moolenaar      if x == 100
18219645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
18229645e2d9SBram Moolenaar      endif
18239645e2d9SBram Moolenaar    endwhile
182497acfc78SBram Moolenaar  catch
182597acfc78SBram Moolenaar    caught = true
182697acfc78SBram Moolenaar    assert_equal(100, x)
182797acfc78SBram Moolenaar  endtry
182897acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
18299645e2d9SBram Moolenaarenddef
183020431c9dSBram Moolenaar
18314fdae999SBram Moolenaardef Test_automatic_line_continuation()
18324fdae999SBram Moolenaar  let mylist = [
18334fdae999SBram Moolenaar      'one',
18344fdae999SBram Moolenaar      'two',
18354fdae999SBram Moolenaar      'three',
1836f5be8cdbSBram Moolenaar      ] # comment
18374fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
18384fdae999SBram Moolenaar
18394fdae999SBram Moolenaar  let mydict = {
18404fdae999SBram Moolenaar      'one': 1,
18414fdae999SBram Moolenaar      'two': 2,
18424fdae999SBram Moolenaar      'three':
18434fdae999SBram Moolenaar          3,
1844f5be8cdbSBram Moolenaar      } # comment
18454fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
18464fdae999SBram Moolenaar  mydict = #{
18472c330432SBram Moolenaar      one: 1,  # comment
18482c330432SBram Moolenaar      two:     # comment
18492c330432SBram Moolenaar           2,  # comment
18502c330432SBram Moolenaar      three: 3 # comment
18512c330432SBram Moolenaar      }
18522c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
18532c330432SBram Moolenaar  mydict = #{
18542c330432SBram Moolenaar      one: 1,
18554fdae999SBram Moolenaar      two:
18564fdae999SBram Moolenaar           2,
18572c330432SBram Moolenaar      three: 3
18584fdae999SBram Moolenaar      }
18594fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1860e6085c53SBram Moolenaar
1861e6085c53SBram Moolenaar  assert_equal(
1862e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1863e6085c53SBram Moolenaar        split('one two three')
1864e6085c53SBram Moolenaar        )
18654fdae999SBram Moolenaarenddef
18664fdae999SBram Moolenaar
18677a092245SBram Moolenaardef Test_vim9_comment()
18687a092245SBram Moolenaar  CheckScriptSuccess([
18697a092245SBram Moolenaar      'vim9script',
18707a092245SBram Moolenaar      '# something',
18717a092245SBram Moolenaar      ])
18727a092245SBram Moolenaar  CheckScriptFailure([
18737a092245SBram Moolenaar      'vim9script',
18747a092245SBram Moolenaar      ':# something',
18757a092245SBram Moolenaar      ], 'E488:')
18767a092245SBram Moolenaar  CheckScriptFailure([
18777a092245SBram Moolenaar      '# something',
18787a092245SBram Moolenaar      ], 'E488:')
18797a092245SBram Moolenaar  CheckScriptFailure([
18807a092245SBram Moolenaar      ':# something',
18817a092245SBram Moolenaar      ], 'E488:')
18827a092245SBram Moolenaar
18834a8d9f2eSBram Moolenaar  { # block start
18844a8d9f2eSBram Moolenaar  } # block end
18854a8d9f2eSBram Moolenaar  CheckDefFailure([
18864a8d9f2eSBram Moolenaar      '{# comment',
18874a8d9f2eSBram Moolenaar      ], 'E488:')
18884a8d9f2eSBram Moolenaar  CheckDefFailure([
18894a8d9f2eSBram Moolenaar      '{',
18904a8d9f2eSBram Moolenaar      '}# comment',
18914a8d9f2eSBram Moolenaar      ], 'E488:')
18924a8d9f2eSBram Moolenaar
18934a8d9f2eSBram Moolenaar  echo "yes" # comment
18944a8d9f2eSBram Moolenaar  CheckDefFailure([
18954a8d9f2eSBram Moolenaar      'echo "yes"# comment',
18964a8d9f2eSBram Moolenaar      ], 'E488:')
18977a092245SBram Moolenaar  CheckScriptSuccess([
18987a092245SBram Moolenaar      'vim9script',
18997a092245SBram Moolenaar      'echo "yes" # something',
19007a092245SBram Moolenaar      ])
19017a092245SBram Moolenaar  CheckScriptFailure([
19027a092245SBram Moolenaar      'vim9script',
19037a092245SBram Moolenaar      'echo "yes"# something',
19047a092245SBram Moolenaar      ], 'E121:')
19057a092245SBram Moolenaar  CheckScriptFailure([
19067a092245SBram Moolenaar      'vim9script',
19077a092245SBram Moolenaar      'echo# something',
19087a092245SBram Moolenaar      ], 'E121:')
19097a092245SBram Moolenaar  CheckScriptFailure([
19107a092245SBram Moolenaar      'echo "yes" # something',
19117a092245SBram Moolenaar      ], 'E121:')
19127a092245SBram Moolenaar
19134a8d9f2eSBram Moolenaar  exe "echo" # comment
19144a8d9f2eSBram Moolenaar  CheckDefFailure([
19154a8d9f2eSBram Moolenaar      'exe "echo"# comment',
19164a8d9f2eSBram Moolenaar      ], 'E488:')
19174a8d9f2eSBram Moolenaar  CheckScriptSuccess([
19184a8d9f2eSBram Moolenaar      'vim9script',
19194a8d9f2eSBram Moolenaar      'exe "echo" # something',
19204a8d9f2eSBram Moolenaar      ])
19214a8d9f2eSBram Moolenaar  CheckScriptFailure([
19224a8d9f2eSBram Moolenaar      'vim9script',
19234a8d9f2eSBram Moolenaar      'exe "echo"# something',
19244a8d9f2eSBram Moolenaar      ], 'E121:')
19254a8d9f2eSBram Moolenaar  CheckDefFailure([
19264a8d9f2eSBram Moolenaar      'exe # comment',
19274a8d9f2eSBram Moolenaar      ], 'E1015:')
19284a8d9f2eSBram Moolenaar  CheckScriptFailure([
19294a8d9f2eSBram Moolenaar      'vim9script',
19304a8d9f2eSBram Moolenaar      'exe# something',
19314a8d9f2eSBram Moolenaar      ], 'E121:')
19324a8d9f2eSBram Moolenaar  CheckScriptFailure([
19334a8d9f2eSBram Moolenaar      'exe "echo" # something',
19344a8d9f2eSBram Moolenaar      ], 'E121:')
19354a8d9f2eSBram Moolenaar
19367a092245SBram Moolenaar  CheckDefFailure([
19377a092245SBram Moolenaar      'try# comment',
19387a092245SBram Moolenaar      '  echo "yes"',
19397a092245SBram Moolenaar      'catch',
19407a092245SBram Moolenaar      'endtry',
19417a092245SBram Moolenaar      ], 'E488:')
19422c5ed4e3SBram Moolenaar  CheckScriptFailure([
19432c5ed4e3SBram Moolenaar      'vim9script',
19442c5ed4e3SBram Moolenaar      'try# comment',
19452c5ed4e3SBram Moolenaar      'echo "yes"',
19462c5ed4e3SBram Moolenaar      ], 'E488:')
19477a092245SBram Moolenaar  CheckDefFailure([
19487a092245SBram Moolenaar      'try',
1949a72cfb80SBram Moolenaar      '  throw#comment',
1950a72cfb80SBram Moolenaar      'catch',
1951a72cfb80SBram Moolenaar      'endtry',
1952a72cfb80SBram Moolenaar      ], 'E1015:')
1953a72cfb80SBram Moolenaar  CheckDefFailure([
1954a72cfb80SBram Moolenaar      'try',
1955a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1956a72cfb80SBram Moolenaar      'catch',
1957a72cfb80SBram Moolenaar      'endtry',
1958a72cfb80SBram Moolenaar      ], 'E488:')
1959a72cfb80SBram Moolenaar  CheckDefFailure([
1960a72cfb80SBram Moolenaar      'try',
19617a092245SBram Moolenaar      '  echo "yes"',
19627a092245SBram Moolenaar      'catch# comment',
19637a092245SBram Moolenaar      'endtry',
19647a092245SBram Moolenaar      ], 'E488:')
19652c5ed4e3SBram Moolenaar  CheckScriptFailure([
19662c5ed4e3SBram Moolenaar      'vim9script',
19672c5ed4e3SBram Moolenaar      'try',
19682c5ed4e3SBram Moolenaar      '  echo "yes"',
19692c5ed4e3SBram Moolenaar      'catch# comment',
19702c5ed4e3SBram Moolenaar      'endtry',
19712c5ed4e3SBram Moolenaar      ], 'E654:')
19722c5ed4e3SBram Moolenaar  CheckDefFailure([
19732c5ed4e3SBram Moolenaar      'try',
19742c5ed4e3SBram Moolenaar      '  echo "yes"',
19752c5ed4e3SBram Moolenaar      'catch /pat/# comment',
19762c5ed4e3SBram Moolenaar      'endtry',
19772c5ed4e3SBram Moolenaar      ], 'E488:')
19787a092245SBram Moolenaar  CheckDefFailure([
19797a092245SBram Moolenaar      'try',
19807a092245SBram Moolenaar      'echo "yes"',
19817a092245SBram Moolenaar      'catch',
19827a092245SBram Moolenaar      'endtry# comment',
19837a092245SBram Moolenaar      ], 'E488:')
19842c5ed4e3SBram Moolenaar  CheckScriptFailure([
19852c5ed4e3SBram Moolenaar      'vim9script',
19862c5ed4e3SBram Moolenaar      'try',
19872c5ed4e3SBram Moolenaar      '  echo "yes"',
19882c5ed4e3SBram Moolenaar      'catch',
19892c5ed4e3SBram Moolenaar      'endtry# comment',
19909b7bf9e9SBram Moolenaar      ], 'E488:')
19912c5ed4e3SBram Moolenaar
19922c5ed4e3SBram Moolenaar  CheckScriptSuccess([
19932c5ed4e3SBram Moolenaar      'vim9script',
19942c5ed4e3SBram Moolenaar      'hi # comment',
19952c5ed4e3SBram Moolenaar      ])
19962c5ed4e3SBram Moolenaar  CheckScriptFailure([
19972c5ed4e3SBram Moolenaar      'vim9script',
19982c5ed4e3SBram Moolenaar      'hi# comment',
19992c5ed4e3SBram Moolenaar      ], 'E416:')
20001966c248SBram Moolenaar  CheckScriptSuccess([
20011966c248SBram Moolenaar      'vim9script',
20021966c248SBram Moolenaar      'hi Search # comment',
20031966c248SBram Moolenaar      ])
20041966c248SBram Moolenaar  CheckScriptFailure([
20051966c248SBram Moolenaar      'vim9script',
20061966c248SBram Moolenaar      'hi Search# comment',
20071966c248SBram Moolenaar      ], 'E416:')
20081966c248SBram Moolenaar  CheckScriptSuccess([
20091966c248SBram Moolenaar      'vim9script',
20101966c248SBram Moolenaar      'hi link This Search # comment',
20111966c248SBram Moolenaar      ])
20121966c248SBram Moolenaar  CheckScriptFailure([
20131966c248SBram Moolenaar      'vim9script',
20141966c248SBram Moolenaar      'hi link This That# comment',
20151966c248SBram Moolenaar      ], 'E413:')
20161966c248SBram Moolenaar  CheckScriptSuccess([
20171966c248SBram Moolenaar      'vim9script',
20181966c248SBram Moolenaar      'hi clear This # comment',
20191966c248SBram Moolenaar      'hi clear # comment',
20201966c248SBram Moolenaar      ])
2021f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2022f5be8cdbSBram Moolenaar  # hi clear This# comment',
20231966c248SBram Moolenaar  CheckScriptFailure([
20241966c248SBram Moolenaar      'vim9script',
20251966c248SBram Moolenaar      'hi clear# comment',
20261966c248SBram Moolenaar      ], 'E416:')
20271966c248SBram Moolenaar
20281966c248SBram Moolenaar  CheckScriptSuccess([
20291966c248SBram Moolenaar      'vim9script',
20301966c248SBram Moolenaar      'hi Group term=bold',
20311966c248SBram Moolenaar      'match Group /todo/ # comment',
20321966c248SBram Moolenaar      ])
20331966c248SBram Moolenaar  CheckScriptFailure([
20341966c248SBram Moolenaar      'vim9script',
20351966c248SBram Moolenaar      'hi Group term=bold',
20361966c248SBram Moolenaar      'match Group /todo/# comment',
20371966c248SBram Moolenaar      ], 'E488:')
20381966c248SBram Moolenaar  CheckScriptSuccess([
20391966c248SBram Moolenaar      'vim9script',
20401966c248SBram Moolenaar      'match # comment',
20411966c248SBram Moolenaar      ])
20421966c248SBram Moolenaar  CheckScriptFailure([
20431966c248SBram Moolenaar      'vim9script',
20441966c248SBram Moolenaar      'match# comment',
20451966c248SBram Moolenaar      ], 'E475:')
20461966c248SBram Moolenaar  CheckScriptSuccess([
20471966c248SBram Moolenaar      'vim9script',
20481966c248SBram Moolenaar      'match none # comment',
20491966c248SBram Moolenaar      ])
20501966c248SBram Moolenaar  CheckScriptFailure([
20511966c248SBram Moolenaar      'vim9script',
20521966c248SBram Moolenaar      'match none# comment',
20531966c248SBram Moolenaar      ], 'E475:')
20541966c248SBram Moolenaar
20551966c248SBram Moolenaar  CheckScriptSuccess([
20561966c248SBram Moolenaar      'vim9script',
20571966c248SBram Moolenaar      'menutrans clear # comment',
20581966c248SBram Moolenaar      ])
20591966c248SBram Moolenaar  CheckScriptFailure([
20601966c248SBram Moolenaar      'vim9script',
20611966c248SBram Moolenaar      'menutrans clear# comment text',
20621966c248SBram Moolenaar      ], 'E474:')
20631966c248SBram Moolenaar
20641966c248SBram Moolenaar  CheckScriptSuccess([
20651966c248SBram Moolenaar      'vim9script',
20661966c248SBram Moolenaar      'syntax clear # comment',
20671966c248SBram Moolenaar      ])
20681966c248SBram Moolenaar  CheckScriptFailure([
20691966c248SBram Moolenaar      'vim9script',
20701966c248SBram Moolenaar      'syntax clear# comment text',
20711966c248SBram Moolenaar      ], 'E28:')
20721966c248SBram Moolenaar  CheckScriptSuccess([
20731966c248SBram Moolenaar      'vim9script',
20741966c248SBram Moolenaar      'syntax keyword Word some',
20751966c248SBram Moolenaar      'syntax clear Word # comment',
20761966c248SBram Moolenaar      ])
20771966c248SBram Moolenaar  CheckScriptFailure([
20781966c248SBram Moolenaar      'vim9script',
20791966c248SBram Moolenaar      'syntax keyword Word some',
20801966c248SBram Moolenaar      'syntax clear Word# comment text',
20811966c248SBram Moolenaar      ], 'E28:')
20821966c248SBram Moolenaar
20831966c248SBram Moolenaar  CheckScriptSuccess([
20841966c248SBram Moolenaar      'vim9script',
20851966c248SBram Moolenaar      'syntax list # comment',
20861966c248SBram Moolenaar      ])
20871966c248SBram Moolenaar  CheckScriptFailure([
20881966c248SBram Moolenaar      'vim9script',
20891966c248SBram Moolenaar      'syntax list# comment text',
20901966c248SBram Moolenaar      ], 'E28:')
20911966c248SBram Moolenaar
20921966c248SBram Moolenaar  CheckScriptSuccess([
20931966c248SBram Moolenaar      'vim9script',
20941966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
20951966c248SBram Moolenaar      ])
20961966c248SBram Moolenaar  CheckScriptFailure([
20971966c248SBram Moolenaar      'vim9script',
20981966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
20991966c248SBram Moolenaar      ], 'E475:')
21001966c248SBram Moolenaar
21011966c248SBram Moolenaar  CheckScriptSuccess([
21021966c248SBram Moolenaar      'vim9script',
21031966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
21041966c248SBram Moolenaar      ])
21051966c248SBram Moolenaar  CheckScriptFailure([
21061966c248SBram Moolenaar      'vim9script',
21071966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
21081966c248SBram Moolenaar      ], 'E789:')
21091966c248SBram Moolenaar
21101966c248SBram Moolenaar  CheckScriptSuccess([
21111966c248SBram Moolenaar      'vim9script',
21121966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
21131966c248SBram Moolenaar      ])
21141966c248SBram Moolenaar  CheckScriptFailure([
21151966c248SBram Moolenaar      'vim9script',
21161966c248SBram Moolenaar      'syntax match Word /pat/# comment',
21171966c248SBram Moolenaar      ], 'E402:')
21181966c248SBram Moolenaar
21191966c248SBram Moolenaar  CheckScriptSuccess([
21201966c248SBram Moolenaar      'vim9script',
21211966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
21221966c248SBram Moolenaar      ])
21231966c248SBram Moolenaar  CheckScriptFailure([
21241966c248SBram Moolenaar      'vim9script',
21251966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
21261966c248SBram Moolenaar      ], 'E475:')
21271966c248SBram Moolenaar  CheckScriptFailure([
21281966c248SBram Moolenaar      'vim9script',
21291966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
21301966c248SBram Moolenaar      ], 'E406:')
21311966c248SBram Moolenaar  CheckScriptFailure([
21321966c248SBram Moolenaar      'vim9script',
21331966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
21341966c248SBram Moolenaar      ], 'E475:')
21351966c248SBram Moolenaar
21361966c248SBram Moolenaar  CheckScriptSuccess([
21371966c248SBram Moolenaar      'vim9script',
21381966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
21391966c248SBram Moolenaar      ])
21401966c248SBram Moolenaar  CheckScriptFailure([
21411966c248SBram Moolenaar      'vim9script',
21421966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2143d032f34aSBram Moolenaar      ], 'E402:')
21441966c248SBram Moolenaar
21451966c248SBram Moolenaar  CheckScriptSuccess([
21461966c248SBram Moolenaar      'vim9script',
21471966c248SBram Moolenaar      'syntax sync # comment',
21481966c248SBram Moolenaar      ])
21491966c248SBram Moolenaar  CheckScriptFailure([
21501966c248SBram Moolenaar      'vim9script',
21511966c248SBram Moolenaar      'syntax sync# comment',
21521966c248SBram Moolenaar      ], 'E404:')
21531966c248SBram Moolenaar  CheckScriptSuccess([
21541966c248SBram Moolenaar      'vim9script',
21551966c248SBram Moolenaar      'syntax sync ccomment # comment',
21561966c248SBram Moolenaar      ])
21571966c248SBram Moolenaar  CheckScriptFailure([
21581966c248SBram Moolenaar      'vim9script',
21591966c248SBram Moolenaar      'syntax sync ccomment# comment',
21601966c248SBram Moolenaar      ], 'E404:')
21611966c248SBram Moolenaar
21621966c248SBram Moolenaar  CheckScriptSuccess([
21631966c248SBram Moolenaar      'vim9script',
21641966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
21651966c248SBram Moolenaar      ])
21661966c248SBram Moolenaar  CheckScriptFailure([
21671966c248SBram Moolenaar      'vim9script',
21681966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
21691966c248SBram Moolenaar      ], 'E475:')
2170a72cfb80SBram Moolenaar
2171a72cfb80SBram Moolenaar  CheckScriptSuccess([
2172a72cfb80SBram Moolenaar      'vim9script',
2173a72cfb80SBram Moolenaar      'command Echo echo # comment',
2174a72cfb80SBram Moolenaar      'command Echo # comment',
2175a72cfb80SBram Moolenaar      ])
2176a72cfb80SBram Moolenaar  CheckScriptFailure([
2177a72cfb80SBram Moolenaar      'vim9script',
2178a72cfb80SBram Moolenaar      'command Echo echo# comment',
2179a72cfb80SBram Moolenaar      'Echo',
2180a72cfb80SBram Moolenaar      ], 'E121:')
2181a72cfb80SBram Moolenaar  CheckScriptFailure([
2182a72cfb80SBram Moolenaar      'vim9script',
2183a72cfb80SBram Moolenaar      'command Echo# comment',
2184a72cfb80SBram Moolenaar      ], 'E182:')
2185a72cfb80SBram Moolenaar  CheckScriptFailure([
2186a72cfb80SBram Moolenaar      'vim9script',
2187a72cfb80SBram Moolenaar      'command Echo echo',
2188a72cfb80SBram Moolenaar      'command Echo# comment',
2189a72cfb80SBram Moolenaar      ], 'E182:')
2190a72cfb80SBram Moolenaar
2191a72cfb80SBram Moolenaar  CheckScriptSuccess([
2192a72cfb80SBram Moolenaar      'vim9script',
2193a72cfb80SBram Moolenaar      'function # comment',
2194a72cfb80SBram Moolenaar      ])
2195a72cfb80SBram Moolenaar  CheckScriptFailure([
2196a72cfb80SBram Moolenaar      'vim9script',
2197a72cfb80SBram Moolenaar      'function# comment',
2198a72cfb80SBram Moolenaar      ], 'E129:')
2199a72cfb80SBram Moolenaar  CheckScriptSuccess([
2200a72cfb80SBram Moolenaar      'vim9script',
2201a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2202a72cfb80SBram Moolenaar      ])
2203a72cfb80SBram Moolenaar  CheckScriptFailure([
2204a72cfb80SBram Moolenaar      'vim9script',
2205a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2206a72cfb80SBram Moolenaar      ], 'E488:')
2207a72cfb80SBram Moolenaar
2208a72cfb80SBram Moolenaar  CheckScriptSuccess([
2209a72cfb80SBram Moolenaar      'vim9script',
22104c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2211a72cfb80SBram Moolenaar      'endfunc',
22124c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2213a72cfb80SBram Moolenaar      ])
2214a72cfb80SBram Moolenaar  CheckScriptFailure([
2215a72cfb80SBram Moolenaar      'vim9script',
22164c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2217a72cfb80SBram Moolenaar      'endfunc',
22184c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2219a72cfb80SBram Moolenaar      ], 'E488:')
2220a72cfb80SBram Moolenaar
2221a72cfb80SBram Moolenaar  CheckScriptSuccess([
2222a72cfb80SBram Moolenaar      'vim9script',
2223a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2224a72cfb80SBram Moolenaar      ])
2225a72cfb80SBram Moolenaar  CheckScriptFailure([
2226a72cfb80SBram Moolenaar      'vim9script',
2227a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2228a72cfb80SBram Moolenaar      ], 'E488:')
2229e7e4838fSBram Moolenaar
2230e7e4838fSBram Moolenaar  CheckScriptFailure([
2231e7e4838fSBram Moolenaar      'def Test() " comment',
2232e7e4838fSBram Moolenaar      'enddef',
2233e7e4838fSBram Moolenaar      ], 'E488:')
2234e7e4838fSBram Moolenaar  CheckScriptFailure([
2235e7e4838fSBram Moolenaar      'vim9script',
2236e7e4838fSBram Moolenaar      'def Test() " comment',
2237e7e4838fSBram Moolenaar      'enddef',
2238e7e4838fSBram Moolenaar      ], 'E488:')
2239e7e4838fSBram Moolenaar
2240e7e4838fSBram Moolenaar  CheckScriptSuccess([
2241e7e4838fSBram Moolenaar      'func Test() " comment',
2242e7e4838fSBram Moolenaar      'endfunc',
2243e7e4838fSBram Moolenaar      ])
2244e7e4838fSBram Moolenaar  CheckScriptFailure([
2245e7e4838fSBram Moolenaar      'vim9script',
2246e7e4838fSBram Moolenaar      'func Test() " comment',
2247e7e4838fSBram Moolenaar      'endfunc',
2248e7e4838fSBram Moolenaar      ], 'E488:')
2249e7e4838fSBram Moolenaar
2250e7e4838fSBram Moolenaar  CheckScriptSuccess([
2251e7e4838fSBram Moolenaar      'def Test() # comment',
2252e7e4838fSBram Moolenaar      'enddef',
2253e7e4838fSBram Moolenaar      ])
2254e7e4838fSBram Moolenaar  CheckScriptFailure([
2255e7e4838fSBram Moolenaar      'func Test() # comment',
2256e7e4838fSBram Moolenaar      'endfunc',
2257e7e4838fSBram Moolenaar      ], 'E488:')
22582c5ed4e3SBram Moolenaarenddef
22592c5ed4e3SBram Moolenaar
22602c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
22612c5ed4e3SBram Moolenaar  CheckCanRunGui
22622c5ed4e3SBram Moolenaar
22632c5ed4e3SBram Moolenaar  CheckScriptFailure([
22642c5ed4e3SBram Moolenaar      'vim9script',
22652c5ed4e3SBram Moolenaar      'gui#comment'
22662c5ed4e3SBram Moolenaar      ], 'E499:')
22672c5ed4e3SBram Moolenaar  CheckScriptFailure([
22682c5ed4e3SBram Moolenaar      'vim9script',
22692c5ed4e3SBram Moolenaar      'gui -f#comment'
22702c5ed4e3SBram Moolenaar      ], 'E499:')
22717a092245SBram Moolenaarenddef
22727a092245SBram Moolenaar
2273a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
22746797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
22756797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2276a26b9700SBram Moolenaar
2277a26b9700SBram Moolenaar  edit test.vim
2278a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2279a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2280a26b9700SBram Moolenaar
2281a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2282a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2283a26b9700SBram Moolenaar
2284a26b9700SBram Moolenaar  g:entered = 0
2285a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2286a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2287a26b9700SBram Moolenaar
2288a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2289a26b9700SBram Moolenaar
2290a26b9700SBram Moolenaar  au! TabEnter
2291a26b9700SBram Moolenaar  unlet g:entered
2292d72c1bf0SBram Moolenaar
2293d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2294d72c1bf0SBram Moolenaar      'vim9script',
22956797966dSBram Moolenaar      'g:var = 123',
2296e55b1c09SBram Moolenaar      'b:var = 456',
2297e55b1c09SBram Moolenaar      'w:var = 777',
2298e55b1c09SBram Moolenaar      't:var = 888',
2299d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2300d72c1bf0SBram Moolenaar      ])
2301d72c1bf0SBram Moolenaar
2302d72c1bf0SBram Moolenaar  CheckScriptFailure([
2303d72c1bf0SBram Moolenaar      'vim9script',
2304d72c1bf0SBram Moolenaar      'let g:var = 123',
2305e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2306e55b1c09SBram Moolenaar
2307e55b1c09SBram Moolenaar  CheckScriptFailure([
2308e55b1c09SBram Moolenaar      'vim9script',
2309e55b1c09SBram Moolenaar      'let b:var = 123',
2310e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2311e55b1c09SBram Moolenaar
2312e55b1c09SBram Moolenaar  CheckScriptFailure([
2313e55b1c09SBram Moolenaar      'vim9script',
2314e55b1c09SBram Moolenaar      'let w:var = 123',
2315e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2316e55b1c09SBram Moolenaar
2317e55b1c09SBram Moolenaar  CheckScriptFailure([
2318e55b1c09SBram Moolenaar      'vim9script',
2319e55b1c09SBram Moolenaar      'let t:var = 123',
2320e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2321e55b1c09SBram Moolenaar
2322e55b1c09SBram Moolenaar  CheckScriptFailure([
2323e55b1c09SBram Moolenaar      'vim9script',
2324e55b1c09SBram Moolenaar      'let v:version = 123',
2325e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2326e55b1c09SBram Moolenaar
2327e55b1c09SBram Moolenaar  CheckScriptFailure([
2328e55b1c09SBram Moolenaar      'vim9script',
2329e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2330e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
23316797966dSBram Moolenaar
23326797966dSBram Moolenaar  CheckScriptFailure([
23336797966dSBram Moolenaar      'vim9script',
23346797966dSBram Moolenaar      'g:var = 123',
233532e35117SBram Moolenaar      'unlet g:var# comment1',
2336d72c1bf0SBram Moolenaar      ], 'E108:')
2337d72c1bf0SBram Moolenaar
2338d72c1bf0SBram Moolenaar  CheckScriptFailure([
2339d72c1bf0SBram Moolenaar      'let g:var = 123',
2340d72c1bf0SBram Moolenaar      'unlet g:var # something',
2341d72c1bf0SBram Moolenaar      ], 'E488:')
2342faac4104SBram Moolenaar
2343faac4104SBram Moolenaar  CheckScriptSuccess([
2344faac4104SBram Moolenaar      'vim9script',
234532e35117SBram Moolenaar      'if 1 # comment2',
2346faac4104SBram Moolenaar      '  echo "yes"',
2347faac4104SBram Moolenaar      'elseif 2 #comment',
2348faac4104SBram Moolenaar      '  echo "no"',
2349faac4104SBram Moolenaar      'endif',
2350faac4104SBram Moolenaar      ])
2351faac4104SBram Moolenaar
2352faac4104SBram Moolenaar  CheckScriptFailure([
2353faac4104SBram Moolenaar      'vim9script',
235432e35117SBram Moolenaar      'if 1# comment3',
2355faac4104SBram Moolenaar      '  echo "yes"',
2356faac4104SBram Moolenaar      'endif',
2357faac4104SBram Moolenaar      ], 'E15:')
2358faac4104SBram Moolenaar
2359faac4104SBram Moolenaar  CheckScriptFailure([
2360faac4104SBram Moolenaar      'vim9script',
236132e35117SBram Moolenaar      'if 0 # comment4',
2362faac4104SBram Moolenaar      '  echo "yes"',
2363faac4104SBram Moolenaar      'elseif 2#comment',
2364faac4104SBram Moolenaar      '  echo "no"',
2365faac4104SBram Moolenaar      'endif',
2366faac4104SBram Moolenaar      ], 'E15:')
2367faac4104SBram Moolenaar
2368faac4104SBram Moolenaar  CheckScriptSuccess([
2369faac4104SBram Moolenaar      'vim9script',
237032e35117SBram Moolenaar      'let v = 1 # comment5',
2371faac4104SBram Moolenaar      ])
2372faac4104SBram Moolenaar
2373faac4104SBram Moolenaar  CheckScriptFailure([
2374faac4104SBram Moolenaar      'vim9script',
237532e35117SBram Moolenaar      'let v = 1# comment6',
237632e35117SBram Moolenaar      ], 'E15:')
2377faac4104SBram Moolenaar
2378faac4104SBram Moolenaar  CheckScriptSuccess([
2379faac4104SBram Moolenaar      'vim9script',
2380faac4104SBram Moolenaar      'new'
2381faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2382df069eecSBram Moolenaar      ':$',
2383faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2384faac4104SBram Moolenaar      'bwipe!',
2385faac4104SBram Moolenaar      ])
2386faac4104SBram Moolenaar
2387f5be8cdbSBram Moolenaar  CheckScriptFailure([
2388f5be8cdbSBram Moolenaar      'vim9script',
2389f5be8cdbSBram Moolenaar      'new'
2390f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2391f5be8cdbSBram Moolenaar      ':$',
2392f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2393f5be8cdbSBram Moolenaar      'bwipe!',
2394f5be8cdbSBram Moolenaar      ], 'E488:')
2395f5be8cdbSBram Moolenaar
2396f5be8cdbSBram Moolenaar  CheckScriptFailure([
2397f5be8cdbSBram Moolenaar      'vim9script',
2398f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2399f5be8cdbSBram Moolenaar      ], 'E477:')
2400a26b9700SBram Moolenaarenddef
2401a26b9700SBram Moolenaar
24027e5bd91dSBram Moolenaardef Test_finish()
24037e5bd91dSBram Moolenaar  let lines =<< trim END
24047e5bd91dSBram Moolenaar    vim9script
24056797966dSBram Moolenaar    g:res = 'one'
24067e5bd91dSBram Moolenaar    if v:false | finish | endif
24076797966dSBram Moolenaar    g:res = 'two'
24087e5bd91dSBram Moolenaar    finish
24096797966dSBram Moolenaar    g:res = 'three'
24107e5bd91dSBram Moolenaar  END
24117e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
24127e5bd91dSBram Moolenaar  source Xfinished
24137e5bd91dSBram Moolenaar  assert_equal('two', g:res)
24147e5bd91dSBram Moolenaar
24157e5bd91dSBram Moolenaar  unlet g:res
24167e5bd91dSBram Moolenaar  delete('Xfinished')
24177e5bd91dSBram Moolenaarenddef
24187e5bd91dSBram Moolenaar
241932e35117SBram Moolenaardef Test_let_func_call()
242032e35117SBram Moolenaar  let lines =<< trim END
242132e35117SBram Moolenaar    vim9script
242232e35117SBram Moolenaar    func GetValue()
242332e35117SBram Moolenaar      if exists('g:count')
242432e35117SBram Moolenaar        let g:count += 1
242532e35117SBram Moolenaar      else
242632e35117SBram Moolenaar        let g:count = 1
242732e35117SBram Moolenaar      endif
242832e35117SBram Moolenaar      return 'this'
242932e35117SBram Moolenaar    endfunc
243032e35117SBram Moolenaar    let val: string = GetValue()
2431f5be8cdbSBram Moolenaar    # env var is always a string
2432df671b46SBram Moolenaar    let env = $TERM
243332e35117SBram Moolenaar  END
243432e35117SBram Moolenaar  writefile(lines, 'Xfinished')
243532e35117SBram Moolenaar  source Xfinished
2436f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
243732e35117SBram Moolenaar  assert_equal(1, g:count)
243832e35117SBram Moolenaar
243932e35117SBram Moolenaar  unlet g:count
244032e35117SBram Moolenaar  delete('Xfinished')
244132e35117SBram Moolenaarenddef
244232e35117SBram Moolenaar
244332e35117SBram Moolenaardef Test_let_missing_type()
244432e35117SBram Moolenaar  let lines =<< trim END
244532e35117SBram Moolenaar    vim9script
2446df671b46SBram Moolenaar    let var = g:unknown
2447227a69deSBram Moolenaar  END
2448822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2449227a69deSBram Moolenaar
2450227a69deSBram Moolenaar  lines =<< trim END
2451227a69deSBram Moolenaar    vim9script
2452227a69deSBram Moolenaar    let nr: number = 123
2453227a69deSBram Moolenaar    let var = nr
2454227a69deSBram Moolenaar  END
2455822ba247SBram Moolenaar  CheckScriptSuccess(lines)
245632e35117SBram Moolenaarenddef
245732e35117SBram Moolenaar
2458c82a5b5dSBram Moolenaardef Test_let_declaration()
2459c82a5b5dSBram Moolenaar  let lines =<< trim END
2460c82a5b5dSBram Moolenaar    vim9script
2461c82a5b5dSBram Moolenaar    let var: string
2462c82a5b5dSBram Moolenaar    g:var_uninit = var
2463c82a5b5dSBram Moolenaar    var = 'text'
2464c82a5b5dSBram Moolenaar    g:var_test = var
2465f5be8cdbSBram Moolenaar    # prefixing s: is optional
2466984dddbeSBram Moolenaar    s:var = 'prefixed'
2467984dddbeSBram Moolenaar    g:var_prefixed = s:var
2468984dddbeSBram Moolenaar
2469984dddbeSBram Moolenaar    let s:other: number
2470984dddbeSBram Moolenaar    other = 1234
2471984dddbeSBram Moolenaar    g:other_var = other
2472c82a5b5dSBram Moolenaar  END
2473c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2474c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2475c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2476984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2477984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2478c82a5b5dSBram Moolenaar
2479c82a5b5dSBram Moolenaar  unlet g:var_uninit
2480c82a5b5dSBram Moolenaar  unlet g:var_test
2481984dddbeSBram Moolenaar  unlet g:var_prefixed
2482984dddbeSBram Moolenaar  unlet g:other_var
2483c82a5b5dSBram Moolenaarenddef
2484c82a5b5dSBram Moolenaar
2485c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2486c5b1c20bSBram Moolenaar  let lines =<< trim END
2487c5b1c20bSBram Moolenaar    vim9script
2488c5b1c20bSBram Moolenaar    const var: string
2489c5b1c20bSBram Moolenaar  END
2490c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2491c5b1c20bSBram Moolenaar
2492c5b1c20bSBram Moolenaar  lines =<< trim END
2493c5b1c20bSBram Moolenaar    vim9script
2494c5b1c20bSBram Moolenaar    let 9var: string
2495c5b1c20bSBram Moolenaar  END
2496c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2497c5b1c20bSBram Moolenaarenddef
2498c5b1c20bSBram Moolenaar
249934db91f7SBram Moolenaardef Test_let_type_check()
250034db91f7SBram Moolenaar  let lines =<< trim END
250134db91f7SBram Moolenaar    vim9script
250234db91f7SBram Moolenaar    let var: string
250334db91f7SBram Moolenaar    var = 1234
250434db91f7SBram Moolenaar  END
250534db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2506984dddbeSBram Moolenaar
2507984dddbeSBram Moolenaar  lines =<< trim END
2508984dddbeSBram Moolenaar    vim9script
2509984dddbeSBram Moolenaar    let var:string
2510984dddbeSBram Moolenaar  END
2511984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2512c5b1c20bSBram Moolenaar
2513c5b1c20bSBram Moolenaar  lines =<< trim END
2514c5b1c20bSBram Moolenaar    vim9script
2515c5b1c20bSBram Moolenaar    let var: asdf
2516c5b1c20bSBram Moolenaar  END
2517c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
251834db91f7SBram Moolenaarenddef
251934db91f7SBram Moolenaar
2520a5d0077eSBram Moolenaardef Test_forward_declaration()
2521a5d0077eSBram Moolenaar  let lines =<< trim END
2522a5d0077eSBram Moolenaar    vim9script
2523a5d0077eSBram Moolenaar    def GetValue(): string
2524a5d0077eSBram Moolenaar      return theVal
2525a5d0077eSBram Moolenaar    enddef
2526a5d0077eSBram Moolenaar    let theVal = 'something'
2527822ba247SBram Moolenaar    g:initVal = GetValue()
2528a5d0077eSBram Moolenaar    theVal = 'else'
2529a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2530a5d0077eSBram Moolenaar  END
2531a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2532a5d0077eSBram Moolenaar  source Xforward
2533a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2534a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2535a5d0077eSBram Moolenaar
2536a5d0077eSBram Moolenaar  unlet g:initVal
2537a5d0077eSBram Moolenaar  unlet g:laterVal
2538a5d0077eSBram Moolenaar  delete('Xforward')
2539a5d0077eSBram Moolenaarenddef
2540a5d0077eSBram Moolenaar
25419721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
25429721fb4eSBram Moolenaar  let legacy_lines =<< trim END
25439721fb4eSBram Moolenaar    source Xvim9_script.vim
25449721fb4eSBram Moolenaar
25459721fb4eSBram Moolenaar    call assert_false(exists('local'))
25469721fb4eSBram Moolenaar    call assert_false(exists('exported'))
25479721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
25489721fb4eSBram Moolenaar    call assert_equal('global', global)
25499721fb4eSBram Moolenaar    call assert_equal('global', g:global)
25509721fb4eSBram Moolenaar
25519721fb4eSBram Moolenaar    " imported variable becomes script-local
25529721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
25539721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
25549721fb4eSBram Moolenaar    call assert_false(exists('exported'))
25559721fb4eSBram Moolenaar
25569721fb4eSBram Moolenaar    " imported function becomes script-local
25579721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
25589721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
25599721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
25609721fb4eSBram Moolenaar  END
25619721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
25629721fb4eSBram Moolenaar
25639721fb4eSBram Moolenaar  let vim9_lines =<< trim END
25649721fb4eSBram Moolenaar    vim9script
25659721fb4eSBram Moolenaar    let local = 'local'
25669721fb4eSBram Moolenaar    g:global = 'global'
25679721fb4eSBram Moolenaar    export let exported = 'exported'
25689721fb4eSBram Moolenaar    export def GetText(): string
25699721fb4eSBram Moolenaar       return 'text'
25709721fb4eSBram Moolenaar    enddef
25719721fb4eSBram Moolenaar  END
25729721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
25739721fb4eSBram Moolenaar
25749721fb4eSBram Moolenaar  source Xlegacy_script.vim
25759721fb4eSBram Moolenaar
25769721fb4eSBram Moolenaar  assert_equal('global', g:global)
2577f5be8cdbSBram Moolenaar  unlet g:global
25789721fb4eSBram Moolenaar
25799721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
25809721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
25819721fb4eSBram Moolenaarenddef
2582a5d0077eSBram Moolenaar
2583eeb27bfeSBram Moolenaardef Test_vim9_copen()
2584eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2585eeb27bfeSBram Moolenaar  copen
2586eeb27bfeSBram Moolenaar  quit
2587eeb27bfeSBram Moolenaarenddef
2588eeb27bfeSBram Moolenaar
2589585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2590585fea7bSBram Moolenaardef Test_substitute_cmd()
2591585fea7bSBram Moolenaar  new
2592585fea7bSBram Moolenaar  setline(1, 'something')
2593585fea7bSBram Moolenaar  :substitute(some(other(
2594585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2595585fea7bSBram Moolenaar  bwipe!
2596585fea7bSBram Moolenaar
2597f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2598585fea7bSBram Moolenaar  let lines =<< trim END
2599585fea7bSBram Moolenaar    vim9script
2600585fea7bSBram Moolenaar    new
2601585fea7bSBram Moolenaar    setline(1, 'something')
2602585fea7bSBram Moolenaar    :substitute(some(other(
2603585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2604585fea7bSBram Moolenaar    bwipe!
2605585fea7bSBram Moolenaar  END
2606585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2607585fea7bSBram Moolenaar  source Xvim9lines
2608585fea7bSBram Moolenaar
2609585fea7bSBram Moolenaar  delete('Xvim9lines')
2610585fea7bSBram Moolenaarenddef
2611585fea7bSBram Moolenaar
26128a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2613