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:')
471925e9fd6SBram Moolenaar
472925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
473925e9fd6SBram Moolenaar  let lines =<< trim END
474925e9fd6SBram Moolenaar      vim9script
475925e9fd6SBram Moolenaar      def g:Global(): string
476925e9fd6SBram Moolenaar        return "yes"
477925e9fd6SBram Moolenaar      enddef
478925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
479925e9fd6SBram Moolenaar      def! g:Global(): string
480925e9fd6SBram Moolenaar        return "no"
481925e9fd6SBram Moolenaar      enddef
482925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
483925e9fd6SBram Moolenaar      delfunc g:Global
484925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
485925e9fd6SBram Moolenaar  END
486925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
487925e9fd6SBram Moolenaar
488925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
489925e9fd6SBram Moolenaar  lines =<< trim END
490925e9fd6SBram Moolenaar      vim9script
491925e9fd6SBram Moolenaar      func g:Global()
492925e9fd6SBram Moolenaar        return "yes"
493925e9fd6SBram Moolenaar      endfunc
494925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
495925e9fd6SBram Moolenaar      def! g:Global(): string
496925e9fd6SBram Moolenaar        return "no"
497925e9fd6SBram Moolenaar      enddef
498925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
499925e9fd6SBram Moolenaar      delfunc g:Global
500925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
501925e9fd6SBram Moolenaar  END
502925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
503925e9fd6SBram Moolenaar
504925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
505925e9fd6SBram Moolenaar  lines =<< trim END
506925e9fd6SBram Moolenaar      vim9script
507925e9fd6SBram Moolenaar      def g:Global(): string
508925e9fd6SBram Moolenaar        return "yes"
509925e9fd6SBram Moolenaar      enddef
510925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
511925e9fd6SBram Moolenaar      func! g:Global()
512925e9fd6SBram Moolenaar        return "no"
513925e9fd6SBram Moolenaar      endfunc
514925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
515925e9fd6SBram Moolenaar      delfunc g:Global
516925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
517925e9fd6SBram Moolenaar  END
518925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
5194c17ad94SBram Moolenaarenddef
5204c17ad94SBram Moolenaar
521599c89c8SBram Moolenaarfunc Test_wrong_type()
522599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
523599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
524599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
525599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
526599c89c8SBram Moolenaar
527599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
528599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
52942a480bfSBram Moolenaar
53042a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
53142a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
53242a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
53342a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
53442a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
53542a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
53642a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
53742a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
53842a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
53942a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
54042a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
541a0a9f43aSBram Moolenaar
542a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
543a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
5448a7d6542SBram Moolenaarendfunc
5458a7d6542SBram Moolenaar
5468a7d6542SBram Moolenaarfunc Test_const()
5478a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
5488a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
5498a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
5509be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
5518a7d6542SBram Moolenaarendfunc
5528a7d6542SBram Moolenaar
553df069eecSBram Moolenaardef Test_range_no_colon()
554df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
555df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
556df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
557df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
558df069eecSBram Moolenaarenddef
559df069eecSBram Moolenaar
560df069eecSBram Moolenaar
5618a7d6542SBram Moolenaardef Test_block()
5628a7d6542SBram Moolenaar  let outer = 1
5638a7d6542SBram Moolenaar  {
5648a7d6542SBram Moolenaar    let inner = 2
5658a7d6542SBram Moolenaar    assert_equal(1, outer)
5668a7d6542SBram Moolenaar    assert_equal(2, inner)
5678a7d6542SBram Moolenaar  }
5688a7d6542SBram Moolenaar  assert_equal(1, outer)
5698a7d6542SBram Moolenaarenddef
5708a7d6542SBram Moolenaar
5718a7d6542SBram Moolenaarfunc Test_block_failure()
5728a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
573585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
574585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
5758a7d6542SBram Moolenaarendfunc
5768a7d6542SBram Moolenaar
577585fea7bSBram Moolenaardef Test_cmd_modifier()
578585fea7bSBram Moolenaar  tab echo '0'
579585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
580585fea7bSBram Moolenaarenddef
581585fea7bSBram Moolenaar
582d032f34aSBram Moolenaarfunc g:NoSuchFunc()
583d032f34aSBram Moolenaar  echo 'none'
584d032f34aSBram Moolenaarendfunc
585d032f34aSBram Moolenaar
5868a7d6542SBram Moolenaardef Test_try_catch()
5878a7d6542SBram Moolenaar  let l = []
5887a092245SBram Moolenaar  try # comment
5898a7d6542SBram Moolenaar    add(l, '1')
5908a7d6542SBram Moolenaar    throw 'wrong'
5918a7d6542SBram Moolenaar    add(l, '2')
5927a092245SBram Moolenaar  catch # comment
5938a7d6542SBram Moolenaar    add(l, v:exception)
5947a092245SBram Moolenaar  finally # comment
5958a7d6542SBram Moolenaar    add(l, '3')
5967a092245SBram Moolenaar  endtry # comment
5978a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
59868d130c6SBram Moolenaar
599e859312eSBram Moolenaar  l = []
600e859312eSBram Moolenaar  try
601e859312eSBram Moolenaar    try
602e859312eSBram Moolenaar      add(l, '1')
603e859312eSBram Moolenaar      throw 'wrong'
604e859312eSBram Moolenaar      add(l, '2')
605e859312eSBram Moolenaar    catch /right/
606e859312eSBram Moolenaar      add(l, v:exception)
607e859312eSBram Moolenaar    endtry
608e859312eSBram Moolenaar  catch /wrong/
609e859312eSBram Moolenaar    add(l, 'caught')
610e859312eSBram Moolenaar  finally
611e859312eSBram Moolenaar    add(l, 'finally')
612e859312eSBram Moolenaar  endtry
613e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
614e859312eSBram Moolenaar
61568d130c6SBram Moolenaar  let n: number
61668d130c6SBram Moolenaar  try
61768d130c6SBram Moolenaar    n = l[3]
61868d130c6SBram Moolenaar  catch /E684:/
61968d130c6SBram Moolenaar    n = 99
62068d130c6SBram Moolenaar  endtry
62168d130c6SBram Moolenaar  assert_equal(99, n)
62268d130c6SBram Moolenaar
62368d130c6SBram Moolenaar  try
62468d130c6SBram Moolenaar    n = g:astring[3]
62568d130c6SBram Moolenaar  catch /E714:/
62668d130c6SBram Moolenaar    n = 77
62768d130c6SBram Moolenaar  endtry
62868d130c6SBram Moolenaar  assert_equal(77, n)
62968d130c6SBram Moolenaar
63068d130c6SBram Moolenaar  try
63168d130c6SBram Moolenaar    n = l[g:astring]
63268d130c6SBram Moolenaar  catch /E39:/
63368d130c6SBram Moolenaar    n = 77
63468d130c6SBram Moolenaar  endtry
63568d130c6SBram Moolenaar  assert_equal(77, n)
63668d130c6SBram Moolenaar
63768d130c6SBram Moolenaar  try
63868d130c6SBram Moolenaar    n = s:does_not_exist
63968d130c6SBram Moolenaar  catch /E121:/
640f0b9f43cSBram Moolenaar    n = 111
641f0b9f43cSBram Moolenaar  endtry
642f0b9f43cSBram Moolenaar  assert_equal(111, n)
643f0b9f43cSBram Moolenaar
644f0b9f43cSBram Moolenaar  try
645f0b9f43cSBram Moolenaar    n = g:does_not_exist
646f0b9f43cSBram Moolenaar  catch /E121:/
64768d130c6SBram Moolenaar    n = 121
64868d130c6SBram Moolenaar  endtry
64968d130c6SBram Moolenaar  assert_equal(121, n)
65068d130c6SBram Moolenaar
65168d130c6SBram Moolenaar  let d = #{one: 1}
65268d130c6SBram Moolenaar  try
65368d130c6SBram Moolenaar    n = d[g:astring]
65468d130c6SBram Moolenaar  catch /E716:/
65568d130c6SBram Moolenaar    n = 222
65668d130c6SBram Moolenaar  endtry
65768d130c6SBram Moolenaar  assert_equal(222, n)
658f0b9f43cSBram Moolenaar
659f0b9f43cSBram Moolenaar  try
660f0b9f43cSBram Moolenaar    n = -g:astring
661f0b9f43cSBram Moolenaar  catch /E39:/
662f0b9f43cSBram Moolenaar    n = 233
663f0b9f43cSBram Moolenaar  endtry
664f0b9f43cSBram Moolenaar  assert_equal(233, n)
665f0b9f43cSBram Moolenaar
666f0b9f43cSBram Moolenaar  try
667f0b9f43cSBram Moolenaar    n = +g:astring
668f0b9f43cSBram Moolenaar  catch /E1030:/
669f0b9f43cSBram Moolenaar    n = 244
670f0b9f43cSBram Moolenaar  endtry
671f0b9f43cSBram Moolenaar  assert_equal(244, n)
672f0b9f43cSBram Moolenaar
673f0b9f43cSBram Moolenaar  try
674f0b9f43cSBram Moolenaar    n = +g:alist
675f0b9f43cSBram Moolenaar  catch /E745:/
676f0b9f43cSBram Moolenaar    n = 255
677f0b9f43cSBram Moolenaar  endtry
678f0b9f43cSBram Moolenaar  assert_equal(255, n)
679f0b9f43cSBram Moolenaar
680f0b9f43cSBram Moolenaar  let nd: dict<any>
681f0b9f43cSBram Moolenaar  try
682f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
683f0b9f43cSBram Moolenaar  catch /E1029:/
684f0b9f43cSBram Moolenaar    n = 266
685f0b9f43cSBram Moolenaar  endtry
686f0b9f43cSBram Moolenaar  assert_equal(266, n)
687f0b9f43cSBram Moolenaar
688f0b9f43cSBram Moolenaar  try
689f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
690f0b9f43cSBram Moolenaar  catch /E1093:/
691f0b9f43cSBram Moolenaar    n = 277
692f0b9f43cSBram Moolenaar  endtry
693f0b9f43cSBram Moolenaar  assert_equal(277, n)
694f0b9f43cSBram Moolenaar
695e859312eSBram Moolenaar  try
696e859312eSBram Moolenaar    &ts = g:astring
697e859312eSBram Moolenaar  catch /E1029:/
698e859312eSBram Moolenaar    n = 288
699e859312eSBram Moolenaar  endtry
700e859312eSBram Moolenaar  assert_equal(288, n)
701e859312eSBram Moolenaar
702e859312eSBram Moolenaar  try
703e859312eSBram Moolenaar    &backspace = 'asdf'
704e859312eSBram Moolenaar  catch /E474:/
705e859312eSBram Moolenaar    n = 299
706e859312eSBram Moolenaar  endtry
707e859312eSBram Moolenaar  assert_equal(299, n)
708e859312eSBram Moolenaar
709e859312eSBram Moolenaar  l = [1]
710e859312eSBram Moolenaar  try
711e859312eSBram Moolenaar    l[3] = 3
712e859312eSBram Moolenaar  catch /E684:/
713e859312eSBram Moolenaar    n = 300
714e859312eSBram Moolenaar  endtry
715e859312eSBram Moolenaar  assert_equal(300, n)
716e859312eSBram Moolenaar
717e859312eSBram Moolenaar  try
718e859312eSBram Moolenaar    d[''] = 3
719e859312eSBram Moolenaar  catch /E713:/
720e859312eSBram Moolenaar    n = 311
721e859312eSBram Moolenaar  endtry
722e859312eSBram Moolenaar  assert_equal(311, n)
723e859312eSBram Moolenaar
724e859312eSBram Moolenaar  try
725e859312eSBram Moolenaar    unlet g:does_not_exist
726e859312eSBram Moolenaar  catch /E108:/
727e859312eSBram Moolenaar    n = 322
728e859312eSBram Moolenaar  endtry
729e859312eSBram Moolenaar  assert_equal(322, n)
730e859312eSBram Moolenaar
731e859312eSBram Moolenaar  try
732e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
733e859312eSBram Moolenaar  catch /E721:/
734e859312eSBram Moolenaar    n = 333
735e859312eSBram Moolenaar  endtry
736e859312eSBram Moolenaar  assert_equal(333, n)
737e859312eSBram Moolenaar
738e859312eSBram Moolenaar  try
739e859312eSBram Moolenaar    l = DeletedFunc()
740e859312eSBram Moolenaar  catch /E933:/
741e859312eSBram Moolenaar    n = 344
742e859312eSBram Moolenaar  endtry
743e859312eSBram Moolenaar  assert_equal(344, n)
744d032f34aSBram Moolenaar
745d032f34aSBram Moolenaar  try
746d032f34aSBram Moolenaar    echo len(v:true)
747d032f34aSBram Moolenaar  catch /E701:/
748d032f34aSBram Moolenaar    n = 355
749d032f34aSBram Moolenaar  endtry
750d032f34aSBram Moolenaar  assert_equal(355, n)
751d032f34aSBram Moolenaar
752d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
753d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
754d032f34aSBram Moolenaar  try
755d032f34aSBram Moolenaar    echo P()
756d032f34aSBram Moolenaar  catch /E117:/
757d032f34aSBram Moolenaar    n = 366
758d032f34aSBram Moolenaar  endtry
759d032f34aSBram Moolenaar  assert_equal(366, n)
760d032f34aSBram Moolenaar
761d032f34aSBram Moolenaar  try
762d032f34aSBram Moolenaar    echo g:NoSuchFunc()
763d032f34aSBram Moolenaar  catch /E117:/
764d032f34aSBram Moolenaar    n = 377
765d032f34aSBram Moolenaar  endtry
766d032f34aSBram Moolenaar  assert_equal(377, n)
767d032f34aSBram Moolenaar
768d032f34aSBram Moolenaar  try
769d032f34aSBram Moolenaar    echo g:alist + 4
770d032f34aSBram Moolenaar  catch /E745:/
771d032f34aSBram Moolenaar    n = 388
772d032f34aSBram Moolenaar  endtry
773d032f34aSBram Moolenaar  assert_equal(388, n)
774d032f34aSBram Moolenaar
775d032f34aSBram Moolenaar  try
776d032f34aSBram Moolenaar    echo 4 + g:alist
777d032f34aSBram Moolenaar  catch /E745:/
778d032f34aSBram Moolenaar    n = 399
779d032f34aSBram Moolenaar  endtry
780d032f34aSBram Moolenaar  assert_equal(399, n)
781d032f34aSBram Moolenaar
782d032f34aSBram Moolenaar  try
783d032f34aSBram Moolenaar    echo g:alist.member
784d032f34aSBram Moolenaar  catch /E715:/
785d032f34aSBram Moolenaar    n = 400
786d032f34aSBram Moolenaar  endtry
787d032f34aSBram Moolenaar  assert_equal(400, n)
788d032f34aSBram Moolenaar
789d032f34aSBram Moolenaar  try
790d032f34aSBram Moolenaar    echo d.member
791d032f34aSBram Moolenaar  catch /E716:/
792d032f34aSBram Moolenaar    n = 411
793d032f34aSBram Moolenaar  endtry
794d032f34aSBram Moolenaar  assert_equal(411, n)
7958a7d6542SBram Moolenaarenddef
7968a7d6542SBram Moolenaar
797e859312eSBram Moolenaardef DeletedFunc(): list<any>
798e859312eSBram Moolenaar  return ['delete me']
799e859312eSBram Moolenaarenddef
800e859312eSBram Moolenaardefcompile
801e859312eSBram Moolenaardelfunc DeletedFunc
802e859312eSBram Moolenaar
803257cc5eeSBram Moolenaardef ThrowFromDef()
804a72cfb80SBram Moolenaar  throw "getout" # comment
805257cc5eeSBram Moolenaarenddef
806257cc5eeSBram Moolenaar
807257cc5eeSBram Moolenaarfunc CatchInFunc()
808257cc5eeSBram Moolenaar  try
809257cc5eeSBram Moolenaar    call ThrowFromDef()
810257cc5eeSBram Moolenaar  catch
811257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
812257cc5eeSBram Moolenaar  endtry
813257cc5eeSBram Moolenaarendfunc
814257cc5eeSBram Moolenaar
815257cc5eeSBram Moolenaardef CatchInDef()
816257cc5eeSBram Moolenaar  try
817257cc5eeSBram Moolenaar    ThrowFromDef()
818257cc5eeSBram Moolenaar  catch
819257cc5eeSBram Moolenaar    g:thrown_def = v:exception
820257cc5eeSBram Moolenaar  endtry
821257cc5eeSBram Moolenaarenddef
822257cc5eeSBram Moolenaar
823f575adffSBram Moolenaardef ReturnFinally(): string
824f575adffSBram Moolenaar  try
825f575adffSBram Moolenaar    return 'intry'
826f575adffSBram Moolenaar  finally
827f575adffSBram Moolenaar    g:in_finally = 'finally'
828f575adffSBram Moolenaar  endtry
829f575adffSBram Moolenaar  return 'end'
830f575adffSBram Moolenaarenddef
831f575adffSBram Moolenaar
832257cc5eeSBram Moolenaardef Test_try_catch_nested()
833257cc5eeSBram Moolenaar  CatchInFunc()
834257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
835257cc5eeSBram Moolenaar
836257cc5eeSBram Moolenaar  CatchInDef()
837257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
838f575adffSBram Moolenaar
839f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
840f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
841f575adffSBram Moolenaarenddef
842f575adffSBram Moolenaar
843f575adffSBram Moolenaardef Test_try_catch_match()
844f575adffSBram Moolenaar  let seq = 'a'
845f575adffSBram Moolenaar  try
846f575adffSBram Moolenaar    throw 'something'
847f575adffSBram Moolenaar  catch /nothing/
848f575adffSBram Moolenaar    seq ..= 'x'
849f575adffSBram Moolenaar  catch /some/
850f575adffSBram Moolenaar    seq ..= 'b'
851f575adffSBram Moolenaar  catch /asdf/
852f575adffSBram Moolenaar    seq ..= 'x'
853e8c4abbbSBram Moolenaar  catch ?a\?sdf?
854e8c4abbbSBram Moolenaar    seq ..= 'y'
855f575adffSBram Moolenaar  finally
856f575adffSBram Moolenaar    seq ..= 'c'
857f575adffSBram Moolenaar  endtry
858f575adffSBram Moolenaar  assert_equal('abc', seq)
859257cc5eeSBram Moolenaarenddef
860257cc5eeSBram Moolenaar
861e8c4abbbSBram Moolenaardef Test_try_catch_fails()
862e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
863e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
864e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
865585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
866585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
867585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
868585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
869585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
870585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
871585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
872585fea7bSBram Moolenaar
873a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
874585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
875e8c4abbbSBram Moolenaarenddef
876e8c4abbbSBram Moolenaar
877006ad48bSBram Moolenaardef Test_throw_vimscript()
878f5be8cdbSBram Moolenaar  # only checks line continuation
879006ad48bSBram Moolenaar  let lines =<< trim END
880006ad48bSBram Moolenaar      vim9script
881006ad48bSBram Moolenaar      try
882006ad48bSBram Moolenaar        throw 'one'
883006ad48bSBram Moolenaar              .. 'two'
884006ad48bSBram Moolenaar      catch
885006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
886006ad48bSBram Moolenaar      endtry
887006ad48bSBram Moolenaar  END
888006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
889006ad48bSBram Moolenaarenddef
890006ad48bSBram Moolenaar
89137c83711SBram Moolenaardef Test_cexpr_vimscript()
892f5be8cdbSBram Moolenaar  # only checks line continuation
89337c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
89437c83711SBram Moolenaar  let lines =<< trim END
89537c83711SBram Moolenaar      vim9script
89637c83711SBram Moolenaar      cexpr 'File'
89737c83711SBram Moolenaar                .. ' someFile' ..
89837c83711SBram Moolenaar                   ' line 19'
89937c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
90037c83711SBram Moolenaar  END
90137c83711SBram Moolenaar  CheckScriptSuccess(lines)
90237c83711SBram Moolenaar  set errorformat&
90337c83711SBram Moolenaarenddef
90437c83711SBram Moolenaar
905b209750bSBram Moolenaardef Test_list_vimscript()
906b209750bSBram Moolenaar  # checks line continuation and comments
907b209750bSBram Moolenaar  let lines =<< trim END
908b209750bSBram Moolenaar      vim9script
909b209750bSBram Moolenaar      let mylist = [
910b209750bSBram Moolenaar            'one',
911b209750bSBram Moolenaar            # comment
912b209750bSBram Moolenaar            'two', # empty line follows
913b209750bSBram Moolenaar
914b209750bSBram Moolenaar            'three',
915b209750bSBram Moolenaar            ]
916b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
917b209750bSBram Moolenaar  END
918b209750bSBram Moolenaar  CheckScriptSuccess(lines)
919b209750bSBram Moolenaarenddef
920b209750bSBram Moolenaar
9212a1381c3SBram Moolenaarif has('channel')
92240ee466cSBram Moolenaar  let someJob = test_null_job()
92340ee466cSBram Moolenaar
92440ee466cSBram Moolenaar  def FuncWithError()
92540ee466cSBram Moolenaar    echomsg g:someJob
92640ee466cSBram Moolenaar  enddef
92740ee466cSBram Moolenaar
92840ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
92940ee466cSBram Moolenaar    try
93040ee466cSBram Moolenaar      call FuncWithError()
93140ee466cSBram Moolenaar    catch
93240ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
93340ee466cSBram Moolenaar    endtry
93440ee466cSBram Moolenaar  endfunc
9352a1381c3SBram Moolenaarendif
93640ee466cSBram Moolenaar
9378a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
9388a7d6542SBram Moolenaar  vim9script
9398a7d6542SBram Moolenaar  let name: string = 'bob'
9408a7d6542SBram Moolenaar  def Concat(arg: string): string
9418a7d6542SBram Moolenaar    return name .. arg
9428a7d6542SBram Moolenaar  enddef
943227a69deSBram Moolenaar  g:result = Concat('bie')
944227a69deSBram Moolenaar  g:localname = name
9458a7d6542SBram Moolenaar
9468a7d6542SBram Moolenaar  export const CONST = 1234
9478a7d6542SBram Moolenaar  export let exported = 9876
9486e587dcbSBram Moolenaar  export let exp_name = 'John'
9498a7d6542SBram Moolenaar  export def Exported(): string
9508a7d6542SBram Moolenaar    return 'Exported'
9518a7d6542SBram Moolenaar  enddef
9528a7d6542SBram MoolenaarEND
9538a7d6542SBram Moolenaar
9545269bd2aSBram Moolenaardef Test_vim9_import_export()
9558a7d6542SBram Moolenaar  let import_script_lines =<< trim END
9568a7d6542SBram Moolenaar    vim9script
9578a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
9588a7d6542SBram Moolenaar    g:imported = exported
9596e587dcbSBram Moolenaar    exported += 3
9606e587dcbSBram Moolenaar    g:imported_added = exported
9618a7d6542SBram Moolenaar    g:imported_func = Exported()
9626e587dcbSBram Moolenaar
96340f4f7a4SBram Moolenaar    def GetExported(): string
96440f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
96540f4f7a4SBram Moolenaar      return local_dict.ref()
96640f4f7a4SBram Moolenaar    enddef
96740f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
96840f4f7a4SBram Moolenaar
9696e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
9706e587dcbSBram Moolenaar    g:imported_name = exp_name
9716e587dcbSBram Moolenaar    exp_name ..= ' Doe'
9726e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
9735381c7a1SBram Moolenaar    g:imported_later = exported
9748a7d6542SBram Moolenaar  END
9758a7d6542SBram Moolenaar
9768a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
9778a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
9788a7d6542SBram Moolenaar
9798a7d6542SBram Moolenaar  source Ximport.vim
9808a7d6542SBram Moolenaar
9818a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
9828a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
9838a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
9846e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
9855381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
9868a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
98740f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
9886e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
9896e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
9908a7d6542SBram Moolenaar  assert_false(exists('g:name'))
9918a7d6542SBram Moolenaar
9928a7d6542SBram Moolenaar  unlet g:result
9938a7d6542SBram Moolenaar  unlet g:localname
9948a7d6542SBram Moolenaar  unlet g:imported
9956e587dcbSBram Moolenaar  unlet g:imported_added
9965381c7a1SBram Moolenaar  unlet g:imported_later
9978a7d6542SBram Moolenaar  unlet g:imported_func
9986e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
9998a7d6542SBram Moolenaar  delete('Ximport.vim')
1000f2d5c240SBram Moolenaar
10011c991144SBram Moolenaar  # similar, with line breaks
10021c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
10031c991144SBram Moolenaar    vim9script
10041c991144SBram Moolenaar    import {
10051c991144SBram Moolenaar        exported,
10061c991144SBram Moolenaar        Exported,
10071c991144SBram Moolenaar        }
10081c991144SBram Moolenaar        from
10091c991144SBram Moolenaar        './Xexport.vim'
10101c991144SBram Moolenaar    g:imported = exported
10111c991144SBram Moolenaar    exported += 5
10121c991144SBram Moolenaar    g:imported_added = exported
10131c991144SBram Moolenaar    g:imported_func = Exported()
10141c991144SBram Moolenaar  END
10151c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
10161c991144SBram Moolenaar  source Ximport_lbr.vim
10171c991144SBram Moolenaar
10181c991144SBram Moolenaar  assert_equal(9876, g:imported)
10191c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
10201c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
10211c991144SBram Moolenaar
10221c991144SBram Moolenaar  # exported script not sourced again
10231c991144SBram Moolenaar  assert_false(exists('g:result'))
10241c991144SBram Moolenaar  unlet g:imported
10251c991144SBram Moolenaar  unlet g:imported_added
10261c991144SBram Moolenaar  unlet g:imported_func
10271c991144SBram Moolenaar  delete('Ximport_lbr.vim')
10281c991144SBram Moolenaar
10291c991144SBram Moolenaar  # import inside :def function
10305381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
10315381c7a1SBram Moolenaar    vim9script
10325381c7a1SBram Moolenaar    def ImportInDef()
10335381c7a1SBram Moolenaar      import exported from './Xexport.vim'
10345381c7a1SBram Moolenaar      g:imported = exported
10355381c7a1SBram Moolenaar      exported += 7
10365381c7a1SBram Moolenaar      g:imported_added = exported
10375381c7a1SBram Moolenaar    enddef
10385381c7a1SBram Moolenaar    ImportInDef()
10395381c7a1SBram Moolenaar  END
10405381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
10415381c7a1SBram Moolenaar  source Ximport2.vim
1042f5be8cdbSBram Moolenaar  # TODO: this should be 9879
10435381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
10445381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
10455381c7a1SBram Moolenaar  unlet g:imported
10465381c7a1SBram Moolenaar  unlet g:imported_added
10475381c7a1SBram Moolenaar  delete('Ximport2.vim')
10485381c7a1SBram Moolenaar
1049f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1050f2d5c240SBram Moolenaar    vim9script
1051f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1052f2d5c240SBram Moolenaar    def UseExport()
1053f2d5c240SBram Moolenaar      g:imported = Export.exported
1054f2d5c240SBram Moolenaar    enddef
1055f2d5c240SBram Moolenaar    UseExport()
1056f2d5c240SBram Moolenaar  END
1057f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1058f2d5c240SBram Moolenaar  source Ximport.vim
10595381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1060f2d5c240SBram Moolenaar
1061599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1062599c89c8SBram Moolenaar    vim9script
1063599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1064599c89c8SBram Moolenaar    def Func()
1065599c89c8SBram Moolenaar      let dummy = 1
1066599c89c8SBram Moolenaar      let imported = Export + dummy
1067599c89c8SBram Moolenaar    enddef
1068822ba247SBram Moolenaar    defcompile
1069599c89c8SBram Moolenaar  END
1070599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1071599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1072599c89c8SBram Moolenaar
1073599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1074599c89c8SBram Moolenaar    vim9script
1075599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1076599c89c8SBram Moolenaar    def Func()
1077599c89c8SBram Moolenaar      let imported = Export . exported
1078599c89c8SBram Moolenaar    enddef
1079822ba247SBram Moolenaar    defcompile
1080599c89c8SBram Moolenaar  END
1081599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1082599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1083599c89c8SBram Moolenaar
1084599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1085599c89c8SBram Moolenaar    vim9script
1086599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1087599c89c8SBram Moolenaar    def Func()
1088599c89c8SBram Moolenaar      let imported = Export.
1089599c89c8SBram Moolenaar    enddef
1090822ba247SBram Moolenaar    defcompile
1091599c89c8SBram Moolenaar  END
1092599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1093599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1094599c89c8SBram Moolenaar
10951c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
10961c991144SBram Moolenaar    vim9script
10971c991144SBram Moolenaar    import *
10981c991144SBram Moolenaar        as Export
10991c991144SBram Moolenaar        from
11001c991144SBram Moolenaar        './Xexport.vim'
11011c991144SBram Moolenaar    def UseExport()
11021c991144SBram Moolenaar      g:imported = Export.exported
11031c991144SBram Moolenaar    enddef
11041c991144SBram Moolenaar    UseExport()
11051c991144SBram Moolenaar  END
11061c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
11071c991144SBram Moolenaar  source Ximport.vim
11081c991144SBram Moolenaar  assert_equal(9883, g:imported)
11091c991144SBram Moolenaar
1110f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1111f2d5c240SBram Moolenaar    vim9script
1112f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1113f2d5c240SBram Moolenaar  END
1114f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1115f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1116f2d5c240SBram Moolenaar
1117f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1118fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1119fa29c8abSBram Moolenaar    vim9script
1120fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1121fa29c8abSBram Moolenaar  END
1122fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1123fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1124fa29c8abSBram Moolenaar
1125f5be8cdbSBram Moolenaar  # try to import something that is already defined
11265269bd2aSBram Moolenaar  let import_already_defined =<< trim END
11275269bd2aSBram Moolenaar    vim9script
11285269bd2aSBram Moolenaar    let exported = 'something'
11295269bd2aSBram Moolenaar    import exported from './Xexport.vim'
11305269bd2aSBram Moolenaar  END
11315269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
11325269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
11335269bd2aSBram Moolenaar
1134f5be8cdbSBram Moolenaar  # try to import something that is already defined
11355269bd2aSBram Moolenaar  import_already_defined =<< trim END
11365269bd2aSBram Moolenaar    vim9script
11375269bd2aSBram Moolenaar    let exported = 'something'
11385269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
11395269bd2aSBram Moolenaar  END
11405269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
11415269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
11425269bd2aSBram Moolenaar
1143f5be8cdbSBram Moolenaar  # try to import something that is already defined
11445269bd2aSBram Moolenaar  import_already_defined =<< trim END
11455269bd2aSBram Moolenaar    vim9script
11465269bd2aSBram Moolenaar    let exported = 'something'
11475269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
11485269bd2aSBram Moolenaar  END
11495269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
11505269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
11515269bd2aSBram Moolenaar
1152f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1153fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1154fa29c8abSBram Moolenaar    vim9script
1155fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1156fa29c8abSBram Moolenaar  END
1157fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1158fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1159fa29c8abSBram Moolenaar
1160fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1161fa29c8abSBram Moolenaar    vim9script
1162fa29c8abSBram Moolenaar    import name './Xexport.vim'
1163fa29c8abSBram Moolenaar  END
1164fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1165fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1166fa29c8abSBram Moolenaar
1167fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1168fa29c8abSBram Moolenaar    vim9script
1169fa29c8abSBram Moolenaar    import name from Xexport.vim
1170fa29c8abSBram Moolenaar  END
1171fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1172fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1173fa29c8abSBram Moolenaar
1174fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1175fa29c8abSBram Moolenaar    vim9script
1176fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1177fa29c8abSBram Moolenaar  END
1178fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1179fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1180fa29c8abSBram Moolenaar
1181fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1182fa29c8abSBram Moolenaar    vim9script
1183fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1184fa29c8abSBram Moolenaar  END
11855269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
11865269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1187fa29c8abSBram Moolenaar
1188f2d5c240SBram Moolenaar  delete('Ximport.vim')
11895269bd2aSBram Moolenaar  delete('Ximport3.vim')
11908a7d6542SBram Moolenaar  delete('Xexport.vim')
11918a7d6542SBram Moolenaar
1192f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1193750802b5SBram Moolenaar  set cpo&vi
1194750802b5SBram Moolenaar  let cpo_before = &cpo
1195750802b5SBram Moolenaar  let lines =<< trim END
1196750802b5SBram Moolenaar    vim9script
1197750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1198750802b5SBram Moolenaar  END
1199750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1200750802b5SBram Moolenaar  source Xvim9_script
1201750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1202750802b5SBram Moolenaar  set cpo&vim
1203750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1204750802b5SBram Moolenaar  delete('Xvim9_script')
1205750802b5SBram Moolenaarenddef
1206750802b5SBram Moolenaar
1207750802b5SBram Moolenaardef Test_vim9script_fails()
12088a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
12098a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1210750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
12119721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
12129b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1213750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1214750802b5SBram Moolenaar
1215c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1216c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1217c785b9a7SBram Moolenaar
1218750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1219a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
12208a7d6542SBram Moolenaarenddef
12218a7d6542SBram Moolenaar
1222f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1223101f4810SBram Moolenaar  CheckRunVimInTerminal
1224101f4810SBram Moolenaar
12259bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1226c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
12279bb3eb3eSBram Moolenaarendfunc
12289bb3eb3eSBram Moolenaar
1229c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1230101f4810SBram Moolenaar  let export =<< trim END
1231101f4810SBram Moolenaar    vim9script
1232101f4810SBram Moolenaar    export def Foo(): number
1233101f4810SBram Moolenaar        return 0
1234101f4810SBram Moolenaar    enddef
1235101f4810SBram Moolenaar  END
12369bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
1237101f4810SBram Moolenaar
12389bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
12399bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
12409bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1241101f4810SBram Moolenaar
12429bb3eb3eSBram Moolenaar  delete('Xexport.vim')
12439bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
12449bb3eb3eSBram Moolenaarenddef
1245101f4810SBram Moolenaar
12464c17ad94SBram Moolenaardef Test_vim9script_reload_import()
12478a7d6542SBram Moolenaar  let lines =<< trim END
12488a7d6542SBram Moolenaar    vim9script
12498a7d6542SBram Moolenaar    const var = ''
12508a7d6542SBram Moolenaar    let valone = 1234
12518a7d6542SBram Moolenaar    def MyFunc(arg: string)
12528a7d6542SBram Moolenaar       valone = 5678
12538a7d6542SBram Moolenaar    enddef
12548a7d6542SBram Moolenaar  END
12558a7d6542SBram Moolenaar  let morelines =<< trim END
12568a7d6542SBram Moolenaar    let valtwo = 222
12578a7d6542SBram Moolenaar    export def GetValtwo(): number
12588a7d6542SBram Moolenaar      return valtwo
12598a7d6542SBram Moolenaar    enddef
12608a7d6542SBram Moolenaar  END
126103afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
12628a7d6542SBram Moolenaar  source Xreload.vim
12638a7d6542SBram Moolenaar  source Xreload.vim
12648a7d6542SBram Moolenaar  source Xreload.vim
12658a7d6542SBram Moolenaar
12668a7d6542SBram Moolenaar  let testlines =<< trim END
12678a7d6542SBram Moolenaar    vim9script
12688a7d6542SBram Moolenaar    def TheFunc()
12698a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
12708a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
12718a7d6542SBram Moolenaar    enddef
12728a7d6542SBram Moolenaar    TheFunc()
12738a7d6542SBram Moolenaar  END
12748a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
12758a7d6542SBram Moolenaar  source Ximport.vim
12768a7d6542SBram Moolenaar
1277f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1278f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
12798a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
12808a7d6542SBram Moolenaar  source Ximport.vim
12818a7d6542SBram Moolenaar
1282f5be8cdbSBram Moolenaar  # cannot declare a var twice
12838a7d6542SBram Moolenaar  lines =<< trim END
12848a7d6542SBram Moolenaar    vim9script
12858a7d6542SBram Moolenaar    let valone = 1234
12868a7d6542SBram Moolenaar    let valone = 5678
12878a7d6542SBram Moolenaar  END
12888a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
12898a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
12908a7d6542SBram Moolenaar
12918a7d6542SBram Moolenaar  delete('Xreload.vim')
12928a7d6542SBram Moolenaar  delete('Ximport.vim')
12938a7d6542SBram Moolenaarenddef
12948a7d6542SBram Moolenaar
1295fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1296fe465a01SBram Moolenaar" script-local name.
1297fe465a01SBram Moolenaardef Test_vim9script_funcref()
1298fe465a01SBram Moolenaar  let sortlines =<< trim END
1299fe465a01SBram Moolenaar      vim9script
1300fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1301bed36b93SBram Moolenaar        return i2 - i1
1302fe465a01SBram Moolenaar      enddef
1303fe465a01SBram Moolenaar
1304fe465a01SBram Moolenaar      export def FastSort(): list<number>
1305fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1306fe465a01SBram Moolenaar      enddef
1307fe465a01SBram Moolenaar  END
1308fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1309fe465a01SBram Moolenaar
1310fe465a01SBram Moolenaar  let lines =<< trim END
1311fe465a01SBram Moolenaar    vim9script
1312fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1313fe465a01SBram Moolenaar    def Test()
1314fe465a01SBram Moolenaar      g:result = FastSort()
1315fe465a01SBram Moolenaar    enddef
1316fe465a01SBram Moolenaar    Test()
1317fe465a01SBram Moolenaar  END
1318fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1319fe465a01SBram Moolenaar
1320fe465a01SBram Moolenaar  source Xscript.vim
1321fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1322fe465a01SBram Moolenaar
1323fe465a01SBram Moolenaar  unlet g:result
1324fe465a01SBram Moolenaar  delete('Xsort.vim')
1325fe465a01SBram Moolenaar  delete('Xscript.vim')
1326fe465a01SBram Moolenaarenddef
1327fe465a01SBram Moolenaar
1328c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1329c620c055SBram Moolenaar" script where FastFilter() is called from.
1330c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1331c620c055SBram Moolenaar  let filterLines =<< trim END
1332c620c055SBram Moolenaar    vim9script
1333c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1334c620c055SBram Moolenaar      return idx % 2 == 1
1335c620c055SBram Moolenaar    enddef
1336c620c055SBram Moolenaar    export def FastFilter(): list<number>
1337c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1338c620c055SBram Moolenaar    enddef
1339c620c055SBram Moolenaar  END
1340c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1341c620c055SBram Moolenaar
1342c620c055SBram Moolenaar  let lines =<< trim END
1343c620c055SBram Moolenaar    vim9script
1344c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1345c620c055SBram Moolenaar    def Test()
1346c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1347c620c055SBram Moolenaar    enddef
1348c620c055SBram Moolenaar    Test()
1349c620c055SBram Moolenaar  END
1350c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1351c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1352c620c055SBram Moolenaar
1353c620c055SBram Moolenaar  delete('Xfilter.vim')
1354c620c055SBram Moolenaar  delete('Ximport.vim')
1355c620c055SBram Moolenaarenddef
1356c620c055SBram Moolenaar
13574c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
13584c17ad94SBram Moolenaar  let first_lines =<< trim END
13594c17ad94SBram Moolenaar    vim9script
13604c17ad94SBram Moolenaar    def FuncYes(): string
13614c17ad94SBram Moolenaar      return 'yes'
13624c17ad94SBram Moolenaar    enddef
13634c17ad94SBram Moolenaar  END
136403afdcf1SBram Moolenaar  let withno_lines =<< trim END
13654c17ad94SBram Moolenaar    def FuncNo(): string
13664c17ad94SBram Moolenaar      return 'no'
13674c17ad94SBram Moolenaar    enddef
13684c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
13694c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
13704c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
137103afdcf1SBram Moolenaar    enddef
137203afdcf1SBram Moolenaar  END
137303afdcf1SBram Moolenaar  let nono_lines =<< trim END
137403afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
137503afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
13764c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
13774c17ad94SBram Moolenaar    enddef
13784c17ad94SBram Moolenaar  END
13794c17ad94SBram Moolenaar
13804c17ad94SBram Moolenaar  # FuncNo() is defined
138103afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13824c17ad94SBram Moolenaar  source Xreloaded.vim
13834c17ad94SBram Moolenaar  g:DoCheck(true)
13844c17ad94SBram Moolenaar
13854c17ad94SBram Moolenaar  # FuncNo() is not redefined
138603afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
13874c17ad94SBram Moolenaar  source Xreloaded.vim
138803afdcf1SBram Moolenaar  g:DoCheck()
13894c17ad94SBram Moolenaar
13904c17ad94SBram Moolenaar  # FuncNo() is back
139103afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13924c17ad94SBram Moolenaar  source Xreloaded.vim
139303afdcf1SBram Moolenaar  g:DoCheck()
13944c17ad94SBram Moolenaar
13954c17ad94SBram Moolenaar  delete('Xreloaded.vim')
13964c17ad94SBram Moolenaarenddef
13974c17ad94SBram Moolenaar
139889483d40SBram Moolenaardef Test_vim9script_reload_delvar()
139989483d40SBram Moolenaar  # write the script with a script-local variable
140089483d40SBram Moolenaar  let lines =<< trim END
140189483d40SBram Moolenaar    vim9script
140289483d40SBram Moolenaar    let var = 'string'
140389483d40SBram Moolenaar  END
140489483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
140589483d40SBram Moolenaar  source XreloadVar.vim
140689483d40SBram Moolenaar
140789483d40SBram Moolenaar  # now write the script using the same variable locally - works
140889483d40SBram Moolenaar  lines =<< trim END
140989483d40SBram Moolenaar    vim9script
141089483d40SBram Moolenaar    def Func()
141189483d40SBram Moolenaar      let var = 'string'
141289483d40SBram Moolenaar    enddef
141389483d40SBram Moolenaar  END
141489483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
141589483d40SBram Moolenaar  source XreloadVar.vim
141689483d40SBram Moolenaar
141789483d40SBram Moolenaar  delete('XreloadVar.vim')
141889483d40SBram Moolenaarenddef
141989483d40SBram Moolenaar
14208a7d6542SBram Moolenaardef Test_import_absolute()
14218a7d6542SBram Moolenaar  let import_lines = [
1422e6085c53SBram Moolenaar        'vim9script',
1423e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1424e6085c53SBram Moolenaar        'def UseExported()',
1425e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1426e6085c53SBram Moolenaar        '  exported = 8888',
1427e6085c53SBram Moolenaar        '  g:imported_after = exported',
1428e6085c53SBram Moolenaar        'enddef',
1429e6085c53SBram Moolenaar        'UseExported()',
1430e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1431e6085c53SBram Moolenaar        ]
14328a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
14338a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
14348a7d6542SBram Moolenaar
14358a7d6542SBram Moolenaar  source Ximport_abs.vim
14368a7d6542SBram Moolenaar
14378a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
14384e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1439675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1440675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1441675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1442675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1443675f716eSBram Moolenaar          'exported = 8888.*' ..
1444675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1445675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1446675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1447675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1448e6085c53SBram Moolenaar        g:import_disassembled)
14498a7d6542SBram Moolenaar  unlet g:imported_abs
14504e12a5dfSBram Moolenaar  unlet g:import_disassembled
14518a7d6542SBram Moolenaar
14528a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
14538a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
14548a7d6542SBram Moolenaarenddef
14558a7d6542SBram Moolenaar
14568a7d6542SBram Moolenaardef Test_import_rtp()
14578a7d6542SBram Moolenaar  let import_lines = [
1458e6085c53SBram Moolenaar        'vim9script',
1459e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1460e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1461e6085c53SBram Moolenaar        ]
14628a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
14638a7d6542SBram Moolenaar  mkdir('import')
14648a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
14658a7d6542SBram Moolenaar
14668a7d6542SBram Moolenaar  let save_rtp = &rtp
14678a7d6542SBram Moolenaar  &rtp = getcwd()
14688a7d6542SBram Moolenaar  source Ximport_rtp.vim
14698a7d6542SBram Moolenaar  &rtp = save_rtp
14708a7d6542SBram Moolenaar
14718a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
14728a7d6542SBram Moolenaar  unlet g:imported_rtp
14738a7d6542SBram Moolenaar
14748a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
147589483d40SBram Moolenaar  delete('import', 'rf')
14768a7d6542SBram Moolenaarenddef
14778a7d6542SBram Moolenaar
147825e0f586SBram Moolenaardef Test_import_compile_error()
147925e0f586SBram Moolenaar  let export_lines = [
148025e0f586SBram Moolenaar        'vim9script',
148125e0f586SBram Moolenaar        'export def ExpFunc(): string',
148225e0f586SBram Moolenaar        '  return notDefined',
148325e0f586SBram Moolenaar        'enddef',
148425e0f586SBram Moolenaar        ]
148525e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
148625e0f586SBram Moolenaar
148725e0f586SBram Moolenaar  let import_lines = [
148825e0f586SBram Moolenaar        'vim9script',
148925e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
149025e0f586SBram Moolenaar        'def ImpFunc()',
149125e0f586SBram Moolenaar        '  echo ExpFunc()',
149225e0f586SBram Moolenaar        'enddef',
149325e0f586SBram Moolenaar        'defcompile',
149425e0f586SBram Moolenaar        ]
149525e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
149625e0f586SBram Moolenaar
149725e0f586SBram Moolenaar  try
149825e0f586SBram Moolenaar    source Ximport.vim
149925e0f586SBram Moolenaar  catch /E1001/
1500f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
150125e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
150225e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
150325e0f586SBram Moolenaar  endtry
150425e0f586SBram Moolenaar
150525e0f586SBram Moolenaar  delete('Xexported.vim')
150625e0f586SBram Moolenaar  delete('Ximport.vim')
150725e0f586SBram Moolenaarenddef
150825e0f586SBram Moolenaar
15098a7d6542SBram Moolenaardef Test_fixed_size_list()
1510f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
15118a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
15128a7d6542SBram Moolenaar  l->remove(0)
15138a7d6542SBram Moolenaar  l->add(5)
15148a7d6542SBram Moolenaar  l->insert(99, 1)
15150f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
15168a7d6542SBram Moolenaarenddef
15178a7d6542SBram Moolenaar
1518158906cfSBram Moolenaardef IfElse(what: number): string
1519158906cfSBram Moolenaar  let res = ''
1520158906cfSBram Moolenaar  if what == 1
1521158906cfSBram Moolenaar    res = "one"
1522158906cfSBram Moolenaar  elseif what == 2
1523158906cfSBram Moolenaar    res = "two"
1524a259d8d3SBram Moolenaar  else
1525158906cfSBram Moolenaar    res = "three"
1526a259d8d3SBram Moolenaar  endif
1527158906cfSBram Moolenaar  return res
1528a259d8d3SBram Moolenaarenddef
1529a259d8d3SBram Moolenaar
1530158906cfSBram Moolenaardef Test_if_elseif_else()
1531158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1532158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1533158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
15340f18b6d1SBram Moolenaarenddef
15350f18b6d1SBram Moolenaar
1536e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1537e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1538e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1539e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1540e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1541585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1542e8c4abbbSBram Moolenaarenddef
1543e8c4abbbSBram Moolenaar
15446d69bf60SBram Moolenaarlet g:bool_true = v:true
15456d69bf60SBram Moolenaarlet g:bool_false = v:false
15466d69bf60SBram Moolenaar
15476d69bf60SBram Moolenaardef Test_if_const_expr()
15486d69bf60SBram Moolenaar  let res = false
15496d69bf60SBram Moolenaar  if true ? true : false
15506d69bf60SBram Moolenaar    res = true
15516d69bf60SBram Moolenaar  endif
15526d69bf60SBram Moolenaar  assert_equal(true, res)
15536d69bf60SBram Moolenaar
1554585fea7bSBram Moolenaar  g:glob = 2
1555585fea7bSBram Moolenaar  if false
15566797966dSBram Moolenaar    execute('g:glob = 3')
1557585fea7bSBram Moolenaar  endif
1558585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1559585fea7bSBram Moolenaar  if true
15606797966dSBram Moolenaar    execute('g:glob = 3')
1561585fea7bSBram Moolenaar  endif
1562585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1563585fea7bSBram Moolenaar
15646d69bf60SBram Moolenaar  res = false
15656d69bf60SBram Moolenaar  if g:bool_true ? true : false
15666d69bf60SBram Moolenaar    res = true
15676d69bf60SBram Moolenaar  endif
15686d69bf60SBram Moolenaar  assert_equal(true, res)
15696d69bf60SBram Moolenaar
15706d69bf60SBram Moolenaar  res = false
15716d69bf60SBram Moolenaar  if true ? g:bool_true : false
15726d69bf60SBram Moolenaar    res = true
15736d69bf60SBram Moolenaar  endif
15746d69bf60SBram Moolenaar  assert_equal(true, res)
15756d69bf60SBram Moolenaar
15766d69bf60SBram Moolenaar  res = false
15776d69bf60SBram Moolenaar  if true ? true : g:bool_false
15786d69bf60SBram Moolenaar    res = true
15796d69bf60SBram Moolenaar  endif
15806d69bf60SBram Moolenaar  assert_equal(true, res)
15816d69bf60SBram Moolenaar
15826d69bf60SBram Moolenaar  res = false
15836d69bf60SBram Moolenaar  if true ? false : true
15846d69bf60SBram Moolenaar    res = true
15856d69bf60SBram Moolenaar  endif
15866d69bf60SBram Moolenaar  assert_equal(false, res)
15876d69bf60SBram Moolenaar
15886d69bf60SBram Moolenaar  res = false
15896d69bf60SBram Moolenaar  if false ? false : true
15906d69bf60SBram Moolenaar    res = true
15916d69bf60SBram Moolenaar  endif
15926d69bf60SBram Moolenaar  assert_equal(true, res)
15936d69bf60SBram Moolenaar
15946d69bf60SBram Moolenaar  res = false
15956d69bf60SBram Moolenaar  if false ? true : false
15966d69bf60SBram Moolenaar    res = true
15976d69bf60SBram Moolenaar  endif
15986d69bf60SBram Moolenaar  assert_equal(false, res)
15996d69bf60SBram Moolenaar
16006d69bf60SBram Moolenaar  res = false
1601e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1602e8c4abbbSBram Moolenaar    res = true
1603e8c4abbbSBram Moolenaar  endif
1604e8c4abbbSBram Moolenaar  assert_equal(false, res)
1605e8c4abbbSBram Moolenaar
1606e8c4abbbSBram Moolenaar  res = false
16076d69bf60SBram Moolenaar  if true && true
16086d69bf60SBram Moolenaar    res = true
16096d69bf60SBram Moolenaar  endif
16106d69bf60SBram Moolenaar  assert_equal(true, res)
16116d69bf60SBram Moolenaar
16126d69bf60SBram Moolenaar  res = false
16136d69bf60SBram Moolenaar  if true && false
16146d69bf60SBram Moolenaar    res = true
16156d69bf60SBram Moolenaar  endif
16166d69bf60SBram Moolenaar  assert_equal(false, res)
16176d69bf60SBram Moolenaar
16186d69bf60SBram Moolenaar  res = false
16196d69bf60SBram Moolenaar  if g:bool_true && false
16206d69bf60SBram Moolenaar    res = true
16216d69bf60SBram Moolenaar  endif
16226d69bf60SBram Moolenaar  assert_equal(false, res)
16236d69bf60SBram Moolenaar
16246d69bf60SBram Moolenaar  res = false
16256d69bf60SBram Moolenaar  if true && g:bool_false
16266d69bf60SBram Moolenaar    res = true
16276d69bf60SBram Moolenaar  endif
16286d69bf60SBram Moolenaar  assert_equal(false, res)
16296d69bf60SBram Moolenaar
16306d69bf60SBram Moolenaar  res = false
16316d69bf60SBram Moolenaar  if false && false
16326d69bf60SBram Moolenaar    res = true
16336d69bf60SBram Moolenaar  endif
16346d69bf60SBram Moolenaar  assert_equal(false, res)
16356d69bf60SBram Moolenaar
16366d69bf60SBram Moolenaar  res = false
16376d69bf60SBram Moolenaar  if true || false
16386d69bf60SBram Moolenaar    res = true
16396d69bf60SBram Moolenaar  endif
16406d69bf60SBram Moolenaar  assert_equal(true, res)
16416d69bf60SBram Moolenaar
16426d69bf60SBram Moolenaar  res = false
16436d69bf60SBram Moolenaar  if g:bool_true || false
16446d69bf60SBram Moolenaar    res = true
16456d69bf60SBram Moolenaar  endif
16466d69bf60SBram Moolenaar  assert_equal(true, res)
16476d69bf60SBram Moolenaar
16486d69bf60SBram Moolenaar  res = false
16496d69bf60SBram Moolenaar  if true || g:bool_false
16506d69bf60SBram Moolenaar    res = true
16516d69bf60SBram Moolenaar  endif
16526d69bf60SBram Moolenaar  assert_equal(true, res)
16536d69bf60SBram Moolenaar
16546d69bf60SBram Moolenaar  res = false
16556d69bf60SBram Moolenaar  if false || false
16566d69bf60SBram Moolenaar    res = true
16576d69bf60SBram Moolenaar  endif
16586d69bf60SBram Moolenaar  assert_equal(false, res)
165980c34ca3SBram Moolenaarenddef
16606d69bf60SBram Moolenaar
166180c34ca3SBram Moolenaardef Test_if_const_expr_fails()
166280c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
166380c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1664e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1665e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
16666d69bf60SBram Moolenaarenddef
16676d69bf60SBram Moolenaar
166872abcf42SBram Moolenaardef RunNested(i: number): number
166972abcf42SBram Moolenaar  let x: number = 0
167072abcf42SBram Moolenaar  if i % 2
167172abcf42SBram Moolenaar    if 1
1672f5be8cdbSBram Moolenaar      # comment
167372abcf42SBram Moolenaar    else
1674f5be8cdbSBram Moolenaar      # comment
167572abcf42SBram Moolenaar    endif
167672abcf42SBram Moolenaar    x += 1
167772abcf42SBram Moolenaar  else
167872abcf42SBram Moolenaar    x += 1000
167972abcf42SBram Moolenaar  endif
168072abcf42SBram Moolenaar  return x
168172abcf42SBram Moolenaarenddef
168272abcf42SBram Moolenaar
168372abcf42SBram Moolenaardef Test_nested_if()
168472abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
168572abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
168672abcf42SBram Moolenaarenddef
168772abcf42SBram Moolenaar
1688ad39c094SBram Moolenaardef Test_execute_cmd()
1689ad39c094SBram Moolenaar  new
1690ad39c094SBram Moolenaar  setline(1, 'default')
1691ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1692ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1693a72cfb80SBram Moolenaar
1694a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1695a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1696a72cfb80SBram Moolenaar
1697ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1698ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1699a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1700ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1701a72cfb80SBram Moolenaar
1702ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1703ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1704a72cfb80SBram Moolenaar
1705ad39c094SBram Moolenaar  let cmd_first = 'call '
1706ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1707ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1708ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1709ad39c094SBram Moolenaar  bwipe!
1710585fea7bSBram Moolenaar
1711*2d6b20d6SBram Moolenaar  let n = true
1712*2d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
1713*2d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
1714*2d6b20d6SBram Moolenaar
1715585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1716a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1717ad39c094SBram Moolenaarenddef
1718ad39c094SBram Moolenaar
171947e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1720f5be8cdbSBram Moolenaar  # only checks line continuation
172147e880d6SBram Moolenaar  let lines =<< trim END
172247e880d6SBram Moolenaar      vim9script
172347e880d6SBram Moolenaar      execute 'g:someVar'
172447e880d6SBram Moolenaar                .. ' = ' ..
172547e880d6SBram Moolenaar                   '28'
172647e880d6SBram Moolenaar      assert_equal(28, g:someVar)
172747e880d6SBram Moolenaar      unlet g:someVar
172847e880d6SBram Moolenaar  END
172947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
173047e880d6SBram Moolenaarenddef
173147e880d6SBram Moolenaar
1732ad39c094SBram Moolenaardef Test_echo_cmd()
1733a72cfb80SBram Moolenaar  echo 'some' # comment
1734585fea7bSBram Moolenaar  echon 'thing'
1735ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1736ad39c094SBram Moolenaar
1737a72cfb80SBram Moolenaar  echo "some" # comment
1738a72cfb80SBram Moolenaar  echon "thing"
1739a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1740a72cfb80SBram Moolenaar
1741ad39c094SBram Moolenaar  let str1 = 'some'
1742ad39c094SBram Moolenaar  let str2 = 'more'
1743ad39c094SBram Moolenaar  echo str1 str2
1744ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1745a72cfb80SBram Moolenaar
1746a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1747ad39c094SBram Moolenaarenddef
1748ad39c094SBram Moolenaar
1749f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1750f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1751f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1752f93c7feaSBram Moolenaar  echo 'clear'
1753df069eecSBram Moolenaar  :1messages
1754f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1755f93c7feaSBram Moolenaar
1756f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1757f93c7feaSBram Moolenaarenddef
1758f93c7feaSBram Moolenaar
175947e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1760f5be8cdbSBram Moolenaar  # only checks line continuation
176147e880d6SBram Moolenaar  let lines =<< trim END
176247e880d6SBram Moolenaar      vim9script
176347e880d6SBram Moolenaar      echomsg 'here'
176447e880d6SBram Moolenaar                .. ' is ' ..
176547e880d6SBram Moolenaar                   'a message'
176647e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
176747e880d6SBram Moolenaar  END
176847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
176947e880d6SBram Moolenaarenddef
177047e880d6SBram Moolenaar
1771f93c7feaSBram Moolenaardef Test_echoerr_cmd()
177240ee466cSBram Moolenaar  try
177340ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
177440ee466cSBram Moolenaar  catch
177540ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
177640ee466cSBram Moolenaar  endtry
1777f93c7feaSBram Moolenaarenddef
1778f93c7feaSBram Moolenaar
177947e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1780f5be8cdbSBram Moolenaar  # only checks line continuation
178147e880d6SBram Moolenaar  let lines =<< trim END
178247e880d6SBram Moolenaar      vim9script
178347e880d6SBram Moolenaar      try
178447e880d6SBram Moolenaar        echoerr 'this'
178547e880d6SBram Moolenaar                .. ' is ' ..
178647e880d6SBram Moolenaar                   'wrong'
178747e880d6SBram Moolenaar      catch
178847e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
178947e880d6SBram Moolenaar      endtry
179047e880d6SBram Moolenaar  END
179147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
179247e880d6SBram Moolenaarenddef
179347e880d6SBram Moolenaar
179441fe0617SBram Moolenaardef Test_for_outside_of_function()
179541fe0617SBram Moolenaar  let lines =<< trim END
179641fe0617SBram Moolenaar    vim9script
179741fe0617SBram Moolenaar    new
179841fe0617SBram Moolenaar    for var in range(0, 3)
179941fe0617SBram Moolenaar      append(line('$'), var)
180041fe0617SBram Moolenaar    endfor
180141fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
180241fe0617SBram Moolenaar    bwipe!
180341fe0617SBram Moolenaar  END
180441fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
180541fe0617SBram Moolenaar  source Xvim9for.vim
180641fe0617SBram Moolenaar  delete('Xvim9for.vim')
180741fe0617SBram Moolenaarenddef
18088a7d6542SBram Moolenaar
1809e8c4abbbSBram Moolenaardef Test_for_loop()
1810e8c4abbbSBram Moolenaar  let result = ''
1811e8c4abbbSBram Moolenaar  for cnt in range(7)
1812e8c4abbbSBram Moolenaar    if cnt == 4
1813e8c4abbbSBram Moolenaar      break
1814e8c4abbbSBram Moolenaar    endif
1815e8c4abbbSBram Moolenaar    if cnt == 2
1816e8c4abbbSBram Moolenaar      continue
1817e8c4abbbSBram Moolenaar    endif
1818e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1819e8c4abbbSBram Moolenaar  endfor
1820e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
18210ad3e894SBram Moolenaar
18220ad3e894SBram Moolenaar  let concat = ''
18230ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
18240ad3e894SBram Moolenaar    concat ..= str
18250ad3e894SBram Moolenaar  endfor
18260ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1827e8c4abbbSBram Moolenaarenddef
1828e8c4abbbSBram Moolenaar
1829e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1830675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1831675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1832675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1833822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
18340ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
1835675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1836675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1837675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1838e8c4abbbSBram Moolenaarenddef
1839e8c4abbbSBram Moolenaar
1840d0df1aacSBram Moolenaardef Test_while_loop()
1841d0df1aacSBram Moolenaar  let result = ''
1842d0df1aacSBram Moolenaar  let cnt = 0
1843d0df1aacSBram Moolenaar  while cnt < 555
1844d0df1aacSBram Moolenaar    if cnt == 3
1845d0df1aacSBram Moolenaar      break
1846d0df1aacSBram Moolenaar    endif
1847d0df1aacSBram Moolenaar    cnt += 1
1848d0df1aacSBram Moolenaar    if cnt == 2
1849d0df1aacSBram Moolenaar      continue
1850d0df1aacSBram Moolenaar    endif
1851d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1852d0df1aacSBram Moolenaar  endwhile
1853d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1854d0df1aacSBram Moolenaarenddef
1855d0df1aacSBram Moolenaar
1856e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1857675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1858675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1859675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1860675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1861675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1862675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1863675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1864bd5da371SBram Moolenaarenddef
1865bd5da371SBram Moolenaar
18669645e2d9SBram Moolenaardef Test_interrupt_loop()
186797acfc78SBram Moolenaar  let caught = false
18689645e2d9SBram Moolenaar  let x = 0
186997acfc78SBram Moolenaar  try
18709645e2d9SBram Moolenaar    while 1
18719645e2d9SBram Moolenaar      x += 1
18729645e2d9SBram Moolenaar      if x == 100
18739645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
18749645e2d9SBram Moolenaar      endif
18759645e2d9SBram Moolenaar    endwhile
187697acfc78SBram Moolenaar  catch
187797acfc78SBram Moolenaar    caught = true
187897acfc78SBram Moolenaar    assert_equal(100, x)
187997acfc78SBram Moolenaar  endtry
188097acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
18819645e2d9SBram Moolenaarenddef
188220431c9dSBram Moolenaar
18834fdae999SBram Moolenaardef Test_automatic_line_continuation()
18844fdae999SBram Moolenaar  let mylist = [
18854fdae999SBram Moolenaar      'one',
18864fdae999SBram Moolenaar      'two',
18874fdae999SBram Moolenaar      'three',
1888f5be8cdbSBram Moolenaar      ] # comment
18894fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
18904fdae999SBram Moolenaar
18914fdae999SBram Moolenaar  let mydict = {
18924fdae999SBram Moolenaar      'one': 1,
18934fdae999SBram Moolenaar      'two': 2,
18944fdae999SBram Moolenaar      'three':
18954fdae999SBram Moolenaar          3,
1896f5be8cdbSBram Moolenaar      } # comment
18974fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
18984fdae999SBram Moolenaar  mydict = #{
18992c330432SBram Moolenaar      one: 1,  # comment
19002c330432SBram Moolenaar      two:     # comment
19012c330432SBram Moolenaar           2,  # comment
19022c330432SBram Moolenaar      three: 3 # comment
19032c330432SBram Moolenaar      }
19042c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
19052c330432SBram Moolenaar  mydict = #{
19062c330432SBram Moolenaar      one: 1,
19074fdae999SBram Moolenaar      two:
19084fdae999SBram Moolenaar           2,
19092c330432SBram Moolenaar      three: 3
19104fdae999SBram Moolenaar      }
19114fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1912e6085c53SBram Moolenaar
1913e6085c53SBram Moolenaar  assert_equal(
1914e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1915e6085c53SBram Moolenaar        split('one two three')
1916e6085c53SBram Moolenaar        )
19174fdae999SBram Moolenaarenddef
19184fdae999SBram Moolenaar
19197a092245SBram Moolenaardef Test_vim9_comment()
19207a092245SBram Moolenaar  CheckScriptSuccess([
19217a092245SBram Moolenaar      'vim9script',
19227a092245SBram Moolenaar      '# something',
19237a092245SBram Moolenaar      ])
19247a092245SBram Moolenaar  CheckScriptFailure([
19257a092245SBram Moolenaar      'vim9script',
19267a092245SBram Moolenaar      ':# something',
19277a092245SBram Moolenaar      ], 'E488:')
19287a092245SBram Moolenaar  CheckScriptFailure([
19297a092245SBram Moolenaar      '# something',
19307a092245SBram Moolenaar      ], 'E488:')
19317a092245SBram Moolenaar  CheckScriptFailure([
19327a092245SBram Moolenaar      ':# something',
19337a092245SBram Moolenaar      ], 'E488:')
19347a092245SBram Moolenaar
19354a8d9f2eSBram Moolenaar  { # block start
19364a8d9f2eSBram Moolenaar  } # block end
19374a8d9f2eSBram Moolenaar  CheckDefFailure([
19384a8d9f2eSBram Moolenaar      '{# comment',
19394a8d9f2eSBram Moolenaar      ], 'E488:')
19404a8d9f2eSBram Moolenaar  CheckDefFailure([
19414a8d9f2eSBram Moolenaar      '{',
19424a8d9f2eSBram Moolenaar      '}# comment',
19434a8d9f2eSBram Moolenaar      ], 'E488:')
19444a8d9f2eSBram Moolenaar
19454a8d9f2eSBram Moolenaar  echo "yes" # comment
19464a8d9f2eSBram Moolenaar  CheckDefFailure([
19474a8d9f2eSBram Moolenaar      'echo "yes"# comment',
19484a8d9f2eSBram Moolenaar      ], 'E488:')
19497a092245SBram Moolenaar  CheckScriptSuccess([
19507a092245SBram Moolenaar      'vim9script',
19517a092245SBram Moolenaar      'echo "yes" # something',
19527a092245SBram Moolenaar      ])
19537a092245SBram Moolenaar  CheckScriptFailure([
19547a092245SBram Moolenaar      'vim9script',
19557a092245SBram Moolenaar      'echo "yes"# something',
19567a092245SBram Moolenaar      ], 'E121:')
19577a092245SBram Moolenaar  CheckScriptFailure([
19587a092245SBram Moolenaar      'vim9script',
19597a092245SBram Moolenaar      'echo# something',
19607a092245SBram Moolenaar      ], 'E121:')
19617a092245SBram Moolenaar  CheckScriptFailure([
19627a092245SBram Moolenaar      'echo "yes" # something',
19637a092245SBram Moolenaar      ], 'E121:')
19647a092245SBram Moolenaar
19654a8d9f2eSBram Moolenaar  exe "echo" # comment
19664a8d9f2eSBram Moolenaar  CheckDefFailure([
19674a8d9f2eSBram Moolenaar      'exe "echo"# comment',
19684a8d9f2eSBram Moolenaar      ], 'E488:')
19694a8d9f2eSBram Moolenaar  CheckScriptSuccess([
19704a8d9f2eSBram Moolenaar      'vim9script',
19714a8d9f2eSBram Moolenaar      'exe "echo" # something',
19724a8d9f2eSBram Moolenaar      ])
19734a8d9f2eSBram Moolenaar  CheckScriptFailure([
19744a8d9f2eSBram Moolenaar      'vim9script',
19754a8d9f2eSBram Moolenaar      'exe "echo"# something',
19764a8d9f2eSBram Moolenaar      ], 'E121:')
19774a8d9f2eSBram Moolenaar  CheckDefFailure([
19784a8d9f2eSBram Moolenaar      'exe # comment',
19794a8d9f2eSBram Moolenaar      ], 'E1015:')
19804a8d9f2eSBram Moolenaar  CheckScriptFailure([
19814a8d9f2eSBram Moolenaar      'vim9script',
19824a8d9f2eSBram Moolenaar      'exe# something',
19834a8d9f2eSBram Moolenaar      ], 'E121:')
19844a8d9f2eSBram Moolenaar  CheckScriptFailure([
19854a8d9f2eSBram Moolenaar      'exe "echo" # something',
19864a8d9f2eSBram Moolenaar      ], 'E121:')
19874a8d9f2eSBram Moolenaar
19887a092245SBram Moolenaar  CheckDefFailure([
19897a092245SBram Moolenaar      'try# comment',
19907a092245SBram Moolenaar      '  echo "yes"',
19917a092245SBram Moolenaar      'catch',
19927a092245SBram Moolenaar      'endtry',
19937a092245SBram Moolenaar      ], 'E488:')
19942c5ed4e3SBram Moolenaar  CheckScriptFailure([
19952c5ed4e3SBram Moolenaar      'vim9script',
19962c5ed4e3SBram Moolenaar      'try# comment',
19972c5ed4e3SBram Moolenaar      'echo "yes"',
19982c5ed4e3SBram Moolenaar      ], 'E488:')
19997a092245SBram Moolenaar  CheckDefFailure([
20007a092245SBram Moolenaar      'try',
2001a72cfb80SBram Moolenaar      '  throw#comment',
2002a72cfb80SBram Moolenaar      'catch',
2003a72cfb80SBram Moolenaar      'endtry',
2004a72cfb80SBram Moolenaar      ], 'E1015:')
2005a72cfb80SBram Moolenaar  CheckDefFailure([
2006a72cfb80SBram Moolenaar      'try',
2007a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2008a72cfb80SBram Moolenaar      'catch',
2009a72cfb80SBram Moolenaar      'endtry',
2010a72cfb80SBram Moolenaar      ], 'E488:')
2011a72cfb80SBram Moolenaar  CheckDefFailure([
2012a72cfb80SBram Moolenaar      'try',
20137a092245SBram Moolenaar      '  echo "yes"',
20147a092245SBram Moolenaar      'catch# comment',
20157a092245SBram Moolenaar      'endtry',
20167a092245SBram Moolenaar      ], 'E488:')
20172c5ed4e3SBram Moolenaar  CheckScriptFailure([
20182c5ed4e3SBram Moolenaar      'vim9script',
20192c5ed4e3SBram Moolenaar      'try',
20202c5ed4e3SBram Moolenaar      '  echo "yes"',
20212c5ed4e3SBram Moolenaar      'catch# comment',
20222c5ed4e3SBram Moolenaar      'endtry',
20232c5ed4e3SBram Moolenaar      ], 'E654:')
20242c5ed4e3SBram Moolenaar  CheckDefFailure([
20252c5ed4e3SBram Moolenaar      'try',
20262c5ed4e3SBram Moolenaar      '  echo "yes"',
20272c5ed4e3SBram Moolenaar      'catch /pat/# comment',
20282c5ed4e3SBram Moolenaar      'endtry',
20292c5ed4e3SBram Moolenaar      ], 'E488:')
20307a092245SBram Moolenaar  CheckDefFailure([
20317a092245SBram Moolenaar      'try',
20327a092245SBram Moolenaar      'echo "yes"',
20337a092245SBram Moolenaar      'catch',
20347a092245SBram Moolenaar      'endtry# comment',
20357a092245SBram Moolenaar      ], 'E488:')
20362c5ed4e3SBram Moolenaar  CheckScriptFailure([
20372c5ed4e3SBram Moolenaar      'vim9script',
20382c5ed4e3SBram Moolenaar      'try',
20392c5ed4e3SBram Moolenaar      '  echo "yes"',
20402c5ed4e3SBram Moolenaar      'catch',
20412c5ed4e3SBram Moolenaar      'endtry# comment',
20429b7bf9e9SBram Moolenaar      ], 'E488:')
20432c5ed4e3SBram Moolenaar
20442c5ed4e3SBram Moolenaar  CheckScriptSuccess([
20452c5ed4e3SBram Moolenaar      'vim9script',
20462c5ed4e3SBram Moolenaar      'hi # comment',
20472c5ed4e3SBram Moolenaar      ])
20482c5ed4e3SBram Moolenaar  CheckScriptFailure([
20492c5ed4e3SBram Moolenaar      'vim9script',
20502c5ed4e3SBram Moolenaar      'hi# comment',
20512c5ed4e3SBram Moolenaar      ], 'E416:')
20521966c248SBram Moolenaar  CheckScriptSuccess([
20531966c248SBram Moolenaar      'vim9script',
20541966c248SBram Moolenaar      'hi Search # comment',
20551966c248SBram Moolenaar      ])
20561966c248SBram Moolenaar  CheckScriptFailure([
20571966c248SBram Moolenaar      'vim9script',
20581966c248SBram Moolenaar      'hi Search# comment',
20591966c248SBram Moolenaar      ], 'E416:')
20601966c248SBram Moolenaar  CheckScriptSuccess([
20611966c248SBram Moolenaar      'vim9script',
20621966c248SBram Moolenaar      'hi link This Search # comment',
20631966c248SBram Moolenaar      ])
20641966c248SBram Moolenaar  CheckScriptFailure([
20651966c248SBram Moolenaar      'vim9script',
20661966c248SBram Moolenaar      'hi link This That# comment',
20671966c248SBram Moolenaar      ], 'E413:')
20681966c248SBram Moolenaar  CheckScriptSuccess([
20691966c248SBram Moolenaar      'vim9script',
20701966c248SBram Moolenaar      'hi clear This # comment',
20711966c248SBram Moolenaar      'hi clear # comment',
20721966c248SBram Moolenaar      ])
2073f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2074f5be8cdbSBram Moolenaar  # hi clear This# comment',
20751966c248SBram Moolenaar  CheckScriptFailure([
20761966c248SBram Moolenaar      'vim9script',
20771966c248SBram Moolenaar      'hi clear# comment',
20781966c248SBram Moolenaar      ], 'E416:')
20791966c248SBram Moolenaar
20801966c248SBram Moolenaar  CheckScriptSuccess([
20811966c248SBram Moolenaar      'vim9script',
20821966c248SBram Moolenaar      'hi Group term=bold',
20831966c248SBram Moolenaar      'match Group /todo/ # comment',
20841966c248SBram Moolenaar      ])
20851966c248SBram Moolenaar  CheckScriptFailure([
20861966c248SBram Moolenaar      'vim9script',
20871966c248SBram Moolenaar      'hi Group term=bold',
20881966c248SBram Moolenaar      'match Group /todo/# comment',
20891966c248SBram Moolenaar      ], 'E488:')
20901966c248SBram Moolenaar  CheckScriptSuccess([
20911966c248SBram Moolenaar      'vim9script',
20921966c248SBram Moolenaar      'match # comment',
20931966c248SBram Moolenaar      ])
20941966c248SBram Moolenaar  CheckScriptFailure([
20951966c248SBram Moolenaar      'vim9script',
20961966c248SBram Moolenaar      'match# comment',
20971966c248SBram Moolenaar      ], 'E475:')
20981966c248SBram Moolenaar  CheckScriptSuccess([
20991966c248SBram Moolenaar      'vim9script',
21001966c248SBram Moolenaar      'match none # comment',
21011966c248SBram Moolenaar      ])
21021966c248SBram Moolenaar  CheckScriptFailure([
21031966c248SBram Moolenaar      'vim9script',
21041966c248SBram Moolenaar      'match none# comment',
21051966c248SBram Moolenaar      ], 'E475:')
21061966c248SBram Moolenaar
21071966c248SBram Moolenaar  CheckScriptSuccess([
21081966c248SBram Moolenaar      'vim9script',
21091966c248SBram Moolenaar      'menutrans clear # comment',
21101966c248SBram Moolenaar      ])
21111966c248SBram Moolenaar  CheckScriptFailure([
21121966c248SBram Moolenaar      'vim9script',
21131966c248SBram Moolenaar      'menutrans clear# comment text',
21141966c248SBram Moolenaar      ], 'E474:')
21151966c248SBram Moolenaar
21161966c248SBram Moolenaar  CheckScriptSuccess([
21171966c248SBram Moolenaar      'vim9script',
21181966c248SBram Moolenaar      'syntax clear # comment',
21191966c248SBram Moolenaar      ])
21201966c248SBram Moolenaar  CheckScriptFailure([
21211966c248SBram Moolenaar      'vim9script',
21221966c248SBram Moolenaar      'syntax clear# comment text',
21231966c248SBram Moolenaar      ], 'E28:')
21241966c248SBram Moolenaar  CheckScriptSuccess([
21251966c248SBram Moolenaar      'vim9script',
21261966c248SBram Moolenaar      'syntax keyword Word some',
21271966c248SBram Moolenaar      'syntax clear Word # comment',
21281966c248SBram Moolenaar      ])
21291966c248SBram Moolenaar  CheckScriptFailure([
21301966c248SBram Moolenaar      'vim9script',
21311966c248SBram Moolenaar      'syntax keyword Word some',
21321966c248SBram Moolenaar      'syntax clear Word# comment text',
21331966c248SBram Moolenaar      ], 'E28:')
21341966c248SBram Moolenaar
21351966c248SBram Moolenaar  CheckScriptSuccess([
21361966c248SBram Moolenaar      'vim9script',
21371966c248SBram Moolenaar      'syntax list # comment',
21381966c248SBram Moolenaar      ])
21391966c248SBram Moolenaar  CheckScriptFailure([
21401966c248SBram Moolenaar      'vim9script',
21411966c248SBram Moolenaar      'syntax list# comment text',
21421966c248SBram Moolenaar      ], 'E28:')
21431966c248SBram Moolenaar
21441966c248SBram Moolenaar  CheckScriptSuccess([
21451966c248SBram Moolenaar      'vim9script',
21461966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
21471966c248SBram Moolenaar      ])
21481966c248SBram Moolenaar  CheckScriptFailure([
21491966c248SBram Moolenaar      'vim9script',
21501966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
21511966c248SBram Moolenaar      ], 'E475:')
21521966c248SBram Moolenaar
21531966c248SBram Moolenaar  CheckScriptSuccess([
21541966c248SBram Moolenaar      'vim9script',
21551966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
21561966c248SBram Moolenaar      ])
21571966c248SBram Moolenaar  CheckScriptFailure([
21581966c248SBram Moolenaar      'vim9script',
21591966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
21601966c248SBram Moolenaar      ], 'E789:')
21611966c248SBram Moolenaar
21621966c248SBram Moolenaar  CheckScriptSuccess([
21631966c248SBram Moolenaar      'vim9script',
21641966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
21651966c248SBram Moolenaar      ])
21661966c248SBram Moolenaar  CheckScriptFailure([
21671966c248SBram Moolenaar      'vim9script',
21681966c248SBram Moolenaar      'syntax match Word /pat/# comment',
21691966c248SBram Moolenaar      ], 'E402:')
21701966c248SBram Moolenaar
21711966c248SBram Moolenaar  CheckScriptSuccess([
21721966c248SBram Moolenaar      'vim9script',
21731966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
21741966c248SBram Moolenaar      ])
21751966c248SBram Moolenaar  CheckScriptFailure([
21761966c248SBram Moolenaar      'vim9script',
21771966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
21781966c248SBram Moolenaar      ], 'E475:')
21791966c248SBram Moolenaar  CheckScriptFailure([
21801966c248SBram Moolenaar      'vim9script',
21811966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
21821966c248SBram Moolenaar      ], 'E406:')
21831966c248SBram Moolenaar  CheckScriptFailure([
21841966c248SBram Moolenaar      'vim9script',
21851966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
21861966c248SBram Moolenaar      ], 'E475:')
21871966c248SBram Moolenaar
21881966c248SBram Moolenaar  CheckScriptSuccess([
21891966c248SBram Moolenaar      'vim9script',
21901966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
21911966c248SBram Moolenaar      ])
21921966c248SBram Moolenaar  CheckScriptFailure([
21931966c248SBram Moolenaar      'vim9script',
21941966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2195d032f34aSBram Moolenaar      ], 'E402:')
21961966c248SBram Moolenaar
21971966c248SBram Moolenaar  CheckScriptSuccess([
21981966c248SBram Moolenaar      'vim9script',
21991966c248SBram Moolenaar      'syntax sync # comment',
22001966c248SBram Moolenaar      ])
22011966c248SBram Moolenaar  CheckScriptFailure([
22021966c248SBram Moolenaar      'vim9script',
22031966c248SBram Moolenaar      'syntax sync# comment',
22041966c248SBram Moolenaar      ], 'E404:')
22051966c248SBram Moolenaar  CheckScriptSuccess([
22061966c248SBram Moolenaar      'vim9script',
22071966c248SBram Moolenaar      'syntax sync ccomment # comment',
22081966c248SBram Moolenaar      ])
22091966c248SBram Moolenaar  CheckScriptFailure([
22101966c248SBram Moolenaar      'vim9script',
22111966c248SBram Moolenaar      'syntax sync ccomment# comment',
22121966c248SBram Moolenaar      ], 'E404:')
22131966c248SBram Moolenaar
22141966c248SBram Moolenaar  CheckScriptSuccess([
22151966c248SBram Moolenaar      'vim9script',
22161966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
22171966c248SBram Moolenaar      ])
22181966c248SBram Moolenaar  CheckScriptFailure([
22191966c248SBram Moolenaar      'vim9script',
22201966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
22211966c248SBram Moolenaar      ], 'E475:')
2222a72cfb80SBram Moolenaar
2223a72cfb80SBram Moolenaar  CheckScriptSuccess([
2224a72cfb80SBram Moolenaar      'vim9script',
2225a72cfb80SBram Moolenaar      'command Echo echo # comment',
2226a72cfb80SBram Moolenaar      'command Echo # comment',
2227a72cfb80SBram Moolenaar      ])
2228a72cfb80SBram Moolenaar  CheckScriptFailure([
2229a72cfb80SBram Moolenaar      'vim9script',
2230a72cfb80SBram Moolenaar      'command Echo echo# comment',
2231a72cfb80SBram Moolenaar      'Echo',
2232a72cfb80SBram Moolenaar      ], 'E121:')
2233a72cfb80SBram Moolenaar  CheckScriptFailure([
2234a72cfb80SBram Moolenaar      'vim9script',
2235a72cfb80SBram Moolenaar      'command Echo# comment',
2236a72cfb80SBram Moolenaar      ], 'E182:')
2237a72cfb80SBram Moolenaar  CheckScriptFailure([
2238a72cfb80SBram Moolenaar      'vim9script',
2239a72cfb80SBram Moolenaar      'command Echo echo',
2240a72cfb80SBram Moolenaar      'command Echo# comment',
2241a72cfb80SBram Moolenaar      ], 'E182:')
2242a72cfb80SBram Moolenaar
2243a72cfb80SBram Moolenaar  CheckScriptSuccess([
2244a72cfb80SBram Moolenaar      'vim9script',
2245a72cfb80SBram Moolenaar      'function # comment',
2246a72cfb80SBram Moolenaar      ])
2247a72cfb80SBram Moolenaar  CheckScriptFailure([
2248a72cfb80SBram Moolenaar      'vim9script',
2249a72cfb80SBram Moolenaar      'function# comment',
2250a72cfb80SBram Moolenaar      ], 'E129:')
2251a72cfb80SBram Moolenaar  CheckScriptSuccess([
2252a72cfb80SBram Moolenaar      'vim9script',
2253a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2254a72cfb80SBram Moolenaar      ])
2255a72cfb80SBram Moolenaar  CheckScriptFailure([
2256a72cfb80SBram Moolenaar      'vim9script',
2257a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2258a72cfb80SBram Moolenaar      ], 'E488:')
2259a72cfb80SBram Moolenaar
2260a72cfb80SBram Moolenaar  CheckScriptSuccess([
2261a72cfb80SBram Moolenaar      'vim9script',
22624c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2263a72cfb80SBram Moolenaar      'endfunc',
22644c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2265a72cfb80SBram Moolenaar      ])
2266a72cfb80SBram Moolenaar  CheckScriptFailure([
2267a72cfb80SBram Moolenaar      'vim9script',
22684c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2269a72cfb80SBram Moolenaar      'endfunc',
22704c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2271a72cfb80SBram Moolenaar      ], 'E488:')
2272a72cfb80SBram Moolenaar
2273a72cfb80SBram Moolenaar  CheckScriptSuccess([
2274a72cfb80SBram Moolenaar      'vim9script',
2275a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2276a72cfb80SBram Moolenaar      ])
2277a72cfb80SBram Moolenaar  CheckScriptFailure([
2278a72cfb80SBram Moolenaar      'vim9script',
2279a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2280a72cfb80SBram Moolenaar      ], 'E488:')
2281e7e4838fSBram Moolenaar
2282e7e4838fSBram Moolenaar  CheckScriptFailure([
2283e7e4838fSBram Moolenaar      'def Test() " comment',
2284e7e4838fSBram Moolenaar      'enddef',
2285e7e4838fSBram Moolenaar      ], 'E488:')
2286e7e4838fSBram Moolenaar  CheckScriptFailure([
2287e7e4838fSBram Moolenaar      'vim9script',
2288e7e4838fSBram Moolenaar      'def Test() " comment',
2289e7e4838fSBram Moolenaar      'enddef',
2290e7e4838fSBram Moolenaar      ], 'E488:')
2291e7e4838fSBram Moolenaar
2292e7e4838fSBram Moolenaar  CheckScriptSuccess([
2293e7e4838fSBram Moolenaar      'func Test() " comment',
2294e7e4838fSBram Moolenaar      'endfunc',
2295e7e4838fSBram Moolenaar      ])
2296e7e4838fSBram Moolenaar  CheckScriptFailure([
2297e7e4838fSBram Moolenaar      'vim9script',
2298e7e4838fSBram Moolenaar      'func Test() " comment',
2299e7e4838fSBram Moolenaar      'endfunc',
2300e7e4838fSBram Moolenaar      ], 'E488:')
2301e7e4838fSBram Moolenaar
2302e7e4838fSBram Moolenaar  CheckScriptSuccess([
2303e7e4838fSBram Moolenaar      'def Test() # comment',
2304e7e4838fSBram Moolenaar      'enddef',
2305e7e4838fSBram Moolenaar      ])
2306e7e4838fSBram Moolenaar  CheckScriptFailure([
2307e7e4838fSBram Moolenaar      'func Test() # comment',
2308e7e4838fSBram Moolenaar      'endfunc',
2309e7e4838fSBram Moolenaar      ], 'E488:')
23102c5ed4e3SBram Moolenaarenddef
23112c5ed4e3SBram Moolenaar
23122c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
23132c5ed4e3SBram Moolenaar  CheckCanRunGui
23142c5ed4e3SBram Moolenaar
23152c5ed4e3SBram Moolenaar  CheckScriptFailure([
23162c5ed4e3SBram Moolenaar      'vim9script',
23172c5ed4e3SBram Moolenaar      'gui#comment'
23182c5ed4e3SBram Moolenaar      ], 'E499:')
23192c5ed4e3SBram Moolenaar  CheckScriptFailure([
23202c5ed4e3SBram Moolenaar      'vim9script',
23212c5ed4e3SBram Moolenaar      'gui -f#comment'
23222c5ed4e3SBram Moolenaar      ], 'E499:')
23237a092245SBram Moolenaarenddef
23247a092245SBram Moolenaar
2325a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
23266797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
23276797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2328a26b9700SBram Moolenaar
2329a26b9700SBram Moolenaar  edit test.vim
2330a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2331a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2332a26b9700SBram Moolenaar
2333a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2334a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2335a26b9700SBram Moolenaar
2336a26b9700SBram Moolenaar  g:entered = 0
2337a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2338a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2339a26b9700SBram Moolenaar
2340a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2341a26b9700SBram Moolenaar
2342a26b9700SBram Moolenaar  au! TabEnter
2343a26b9700SBram Moolenaar  unlet g:entered
2344d72c1bf0SBram Moolenaar
2345d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2346d72c1bf0SBram Moolenaar      'vim9script',
23476797966dSBram Moolenaar      'g:var = 123',
2348e55b1c09SBram Moolenaar      'b:var = 456',
2349e55b1c09SBram Moolenaar      'w:var = 777',
2350e55b1c09SBram Moolenaar      't:var = 888',
2351d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2352d72c1bf0SBram Moolenaar      ])
2353d72c1bf0SBram Moolenaar
2354d72c1bf0SBram Moolenaar  CheckScriptFailure([
2355d72c1bf0SBram Moolenaar      'vim9script',
2356d72c1bf0SBram Moolenaar      'let g:var = 123',
2357e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2358e55b1c09SBram Moolenaar
2359e55b1c09SBram Moolenaar  CheckScriptFailure([
2360e55b1c09SBram Moolenaar      'vim9script',
2361e55b1c09SBram Moolenaar      'let b:var = 123',
2362e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2363e55b1c09SBram Moolenaar
2364e55b1c09SBram Moolenaar  CheckScriptFailure([
2365e55b1c09SBram Moolenaar      'vim9script',
2366e55b1c09SBram Moolenaar      'let w:var = 123',
2367e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2368e55b1c09SBram Moolenaar
2369e55b1c09SBram Moolenaar  CheckScriptFailure([
2370e55b1c09SBram Moolenaar      'vim9script',
2371e55b1c09SBram Moolenaar      'let t:var = 123',
2372e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2373e55b1c09SBram Moolenaar
2374e55b1c09SBram Moolenaar  CheckScriptFailure([
2375e55b1c09SBram Moolenaar      'vim9script',
2376e55b1c09SBram Moolenaar      'let v:version = 123',
2377e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2378e55b1c09SBram Moolenaar
2379e55b1c09SBram Moolenaar  CheckScriptFailure([
2380e55b1c09SBram Moolenaar      'vim9script',
2381e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2382e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
23836797966dSBram Moolenaar
23846797966dSBram Moolenaar  CheckScriptFailure([
23856797966dSBram Moolenaar      'vim9script',
23866797966dSBram Moolenaar      'g:var = 123',
238732e35117SBram Moolenaar      'unlet g:var# comment1',
2388d72c1bf0SBram Moolenaar      ], 'E108:')
2389d72c1bf0SBram Moolenaar
2390d72c1bf0SBram Moolenaar  CheckScriptFailure([
2391d72c1bf0SBram Moolenaar      'let g:var = 123',
2392d72c1bf0SBram Moolenaar      'unlet g:var # something',
2393d72c1bf0SBram Moolenaar      ], 'E488:')
2394faac4104SBram Moolenaar
2395faac4104SBram Moolenaar  CheckScriptSuccess([
2396faac4104SBram Moolenaar      'vim9script',
239732e35117SBram Moolenaar      'if 1 # comment2',
2398faac4104SBram Moolenaar      '  echo "yes"',
2399faac4104SBram Moolenaar      'elseif 2 #comment',
2400faac4104SBram Moolenaar      '  echo "no"',
2401faac4104SBram Moolenaar      'endif',
2402faac4104SBram Moolenaar      ])
2403faac4104SBram Moolenaar
2404faac4104SBram Moolenaar  CheckScriptFailure([
2405faac4104SBram Moolenaar      'vim9script',
240632e35117SBram Moolenaar      'if 1# comment3',
2407faac4104SBram Moolenaar      '  echo "yes"',
2408faac4104SBram Moolenaar      'endif',
2409faac4104SBram Moolenaar      ], 'E15:')
2410faac4104SBram Moolenaar
2411faac4104SBram Moolenaar  CheckScriptFailure([
2412faac4104SBram Moolenaar      'vim9script',
241332e35117SBram Moolenaar      'if 0 # comment4',
2414faac4104SBram Moolenaar      '  echo "yes"',
2415faac4104SBram Moolenaar      'elseif 2#comment',
2416faac4104SBram Moolenaar      '  echo "no"',
2417faac4104SBram Moolenaar      'endif',
2418faac4104SBram Moolenaar      ], 'E15:')
2419faac4104SBram Moolenaar
2420faac4104SBram Moolenaar  CheckScriptSuccess([
2421faac4104SBram Moolenaar      'vim9script',
242232e35117SBram Moolenaar      'let v = 1 # comment5',
2423faac4104SBram Moolenaar      ])
2424faac4104SBram Moolenaar
2425faac4104SBram Moolenaar  CheckScriptFailure([
2426faac4104SBram Moolenaar      'vim9script',
242732e35117SBram Moolenaar      'let v = 1# comment6',
242832e35117SBram Moolenaar      ], 'E15:')
2429faac4104SBram Moolenaar
2430faac4104SBram Moolenaar  CheckScriptSuccess([
2431faac4104SBram Moolenaar      'vim9script',
2432faac4104SBram Moolenaar      'new'
2433faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2434df069eecSBram Moolenaar      ':$',
2435faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2436faac4104SBram Moolenaar      'bwipe!',
2437faac4104SBram Moolenaar      ])
2438faac4104SBram Moolenaar
2439f5be8cdbSBram Moolenaar  CheckScriptFailure([
2440f5be8cdbSBram Moolenaar      'vim9script',
2441f5be8cdbSBram Moolenaar      'new'
2442f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2443f5be8cdbSBram Moolenaar      ':$',
2444f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2445f5be8cdbSBram Moolenaar      'bwipe!',
2446f5be8cdbSBram Moolenaar      ], 'E488:')
2447f5be8cdbSBram Moolenaar
2448f5be8cdbSBram Moolenaar  CheckScriptFailure([
2449f5be8cdbSBram Moolenaar      'vim9script',
2450f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2451f5be8cdbSBram Moolenaar      ], 'E477:')
2452a26b9700SBram Moolenaarenddef
2453a26b9700SBram Moolenaar
24547e5bd91dSBram Moolenaardef Test_finish()
24557e5bd91dSBram Moolenaar  let lines =<< trim END
24567e5bd91dSBram Moolenaar    vim9script
24576797966dSBram Moolenaar    g:res = 'one'
24587e5bd91dSBram Moolenaar    if v:false | finish | endif
24596797966dSBram Moolenaar    g:res = 'two'
24607e5bd91dSBram Moolenaar    finish
24616797966dSBram Moolenaar    g:res = 'three'
24627e5bd91dSBram Moolenaar  END
24637e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
24647e5bd91dSBram Moolenaar  source Xfinished
24657e5bd91dSBram Moolenaar  assert_equal('two', g:res)
24667e5bd91dSBram Moolenaar
24677e5bd91dSBram Moolenaar  unlet g:res
24687e5bd91dSBram Moolenaar  delete('Xfinished')
24697e5bd91dSBram Moolenaarenddef
24707e5bd91dSBram Moolenaar
247132e35117SBram Moolenaardef Test_let_func_call()
247232e35117SBram Moolenaar  let lines =<< trim END
247332e35117SBram Moolenaar    vim9script
247432e35117SBram Moolenaar    func GetValue()
247532e35117SBram Moolenaar      if exists('g:count')
247632e35117SBram Moolenaar        let g:count += 1
247732e35117SBram Moolenaar      else
247832e35117SBram Moolenaar        let g:count = 1
247932e35117SBram Moolenaar      endif
248032e35117SBram Moolenaar      return 'this'
248132e35117SBram Moolenaar    endfunc
248232e35117SBram Moolenaar    let val: string = GetValue()
2483f5be8cdbSBram Moolenaar    # env var is always a string
2484df671b46SBram Moolenaar    let env = $TERM
248532e35117SBram Moolenaar  END
248632e35117SBram Moolenaar  writefile(lines, 'Xfinished')
248732e35117SBram Moolenaar  source Xfinished
2488f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
248932e35117SBram Moolenaar  assert_equal(1, g:count)
249032e35117SBram Moolenaar
249132e35117SBram Moolenaar  unlet g:count
249232e35117SBram Moolenaar  delete('Xfinished')
249332e35117SBram Moolenaarenddef
249432e35117SBram Moolenaar
249532e35117SBram Moolenaardef Test_let_missing_type()
249632e35117SBram Moolenaar  let lines =<< trim END
249732e35117SBram Moolenaar    vim9script
2498df671b46SBram Moolenaar    let var = g:unknown
2499227a69deSBram Moolenaar  END
2500822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2501227a69deSBram Moolenaar
2502227a69deSBram Moolenaar  lines =<< trim END
2503227a69deSBram Moolenaar    vim9script
2504227a69deSBram Moolenaar    let nr: number = 123
2505227a69deSBram Moolenaar    let var = nr
2506227a69deSBram Moolenaar  END
2507822ba247SBram Moolenaar  CheckScriptSuccess(lines)
250832e35117SBram Moolenaarenddef
250932e35117SBram Moolenaar
2510c82a5b5dSBram Moolenaardef Test_let_declaration()
2511c82a5b5dSBram Moolenaar  let lines =<< trim END
2512c82a5b5dSBram Moolenaar    vim9script
2513c82a5b5dSBram Moolenaar    let var: string
2514c82a5b5dSBram Moolenaar    g:var_uninit = var
2515c82a5b5dSBram Moolenaar    var = 'text'
2516c82a5b5dSBram Moolenaar    g:var_test = var
2517f5be8cdbSBram Moolenaar    # prefixing s: is optional
2518984dddbeSBram Moolenaar    s:var = 'prefixed'
2519984dddbeSBram Moolenaar    g:var_prefixed = s:var
2520984dddbeSBram Moolenaar
2521984dddbeSBram Moolenaar    let s:other: number
2522984dddbeSBram Moolenaar    other = 1234
2523984dddbeSBram Moolenaar    g:other_var = other
2524c82a5b5dSBram Moolenaar  END
2525c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2526c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2527c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2528984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2529984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2530c82a5b5dSBram Moolenaar
2531c82a5b5dSBram Moolenaar  unlet g:var_uninit
2532c82a5b5dSBram Moolenaar  unlet g:var_test
2533984dddbeSBram Moolenaar  unlet g:var_prefixed
2534984dddbeSBram Moolenaar  unlet g:other_var
2535c82a5b5dSBram Moolenaarenddef
2536c82a5b5dSBram Moolenaar
2537c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2538c5b1c20bSBram Moolenaar  let lines =<< trim END
2539c5b1c20bSBram Moolenaar    vim9script
2540c5b1c20bSBram Moolenaar    const var: string
2541c5b1c20bSBram Moolenaar  END
2542c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2543c5b1c20bSBram Moolenaar
2544c5b1c20bSBram Moolenaar  lines =<< trim END
2545c5b1c20bSBram Moolenaar    vim9script
2546c5b1c20bSBram Moolenaar    let 9var: string
2547c5b1c20bSBram Moolenaar  END
2548c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2549c5b1c20bSBram Moolenaarenddef
2550c5b1c20bSBram Moolenaar
255134db91f7SBram Moolenaardef Test_let_type_check()
255234db91f7SBram Moolenaar  let lines =<< trim END
255334db91f7SBram Moolenaar    vim9script
255434db91f7SBram Moolenaar    let var: string
255534db91f7SBram Moolenaar    var = 1234
255634db91f7SBram Moolenaar  END
255734db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2558984dddbeSBram Moolenaar
2559984dddbeSBram Moolenaar  lines =<< trim END
2560984dddbeSBram Moolenaar    vim9script
2561984dddbeSBram Moolenaar    let var:string
2562984dddbeSBram Moolenaar  END
2563984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2564c5b1c20bSBram Moolenaar
2565c5b1c20bSBram Moolenaar  lines =<< trim END
2566c5b1c20bSBram Moolenaar    vim9script
2567c5b1c20bSBram Moolenaar    let var: asdf
2568c5b1c20bSBram Moolenaar  END
2569c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
257034db91f7SBram Moolenaarenddef
257134db91f7SBram Moolenaar
2572a5d0077eSBram Moolenaardef Test_forward_declaration()
2573a5d0077eSBram Moolenaar  let lines =<< trim END
2574a5d0077eSBram Moolenaar    vim9script
2575a5d0077eSBram Moolenaar    def GetValue(): string
2576a5d0077eSBram Moolenaar      return theVal
2577a5d0077eSBram Moolenaar    enddef
2578a5d0077eSBram Moolenaar    let theVal = 'something'
2579822ba247SBram Moolenaar    g:initVal = GetValue()
2580a5d0077eSBram Moolenaar    theVal = 'else'
2581a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2582a5d0077eSBram Moolenaar  END
2583a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2584a5d0077eSBram Moolenaar  source Xforward
2585a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2586a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2587a5d0077eSBram Moolenaar
2588a5d0077eSBram Moolenaar  unlet g:initVal
2589a5d0077eSBram Moolenaar  unlet g:laterVal
2590a5d0077eSBram Moolenaar  delete('Xforward')
2591a5d0077eSBram Moolenaarenddef
2592a5d0077eSBram Moolenaar
25939721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
25949721fb4eSBram Moolenaar  let legacy_lines =<< trim END
25959721fb4eSBram Moolenaar    source Xvim9_script.vim
25969721fb4eSBram Moolenaar
25979721fb4eSBram Moolenaar    call assert_false(exists('local'))
25989721fb4eSBram Moolenaar    call assert_false(exists('exported'))
25999721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
26009721fb4eSBram Moolenaar    call assert_equal('global', global)
26019721fb4eSBram Moolenaar    call assert_equal('global', g:global)
26029721fb4eSBram Moolenaar
26039721fb4eSBram Moolenaar    " imported variable becomes script-local
26049721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
26059721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
26069721fb4eSBram Moolenaar    call assert_false(exists('exported'))
26079721fb4eSBram Moolenaar
26089721fb4eSBram Moolenaar    " imported function becomes script-local
26099721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
26109721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
26119721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
26129721fb4eSBram Moolenaar  END
26139721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
26149721fb4eSBram Moolenaar
26159721fb4eSBram Moolenaar  let vim9_lines =<< trim END
26169721fb4eSBram Moolenaar    vim9script
26179721fb4eSBram Moolenaar    let local = 'local'
26189721fb4eSBram Moolenaar    g:global = 'global'
26199721fb4eSBram Moolenaar    export let exported = 'exported'
26209721fb4eSBram Moolenaar    export def GetText(): string
26219721fb4eSBram Moolenaar       return 'text'
26229721fb4eSBram Moolenaar    enddef
26239721fb4eSBram Moolenaar  END
26249721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
26259721fb4eSBram Moolenaar
26269721fb4eSBram Moolenaar  source Xlegacy_script.vim
26279721fb4eSBram Moolenaar
26289721fb4eSBram Moolenaar  assert_equal('global', g:global)
2629f5be8cdbSBram Moolenaar  unlet g:global
26309721fb4eSBram Moolenaar
26319721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
26329721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
26339721fb4eSBram Moolenaarenddef
2634a5d0077eSBram Moolenaar
2635eeb27bfeSBram Moolenaardef Test_vim9_copen()
2636eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2637eeb27bfeSBram Moolenaar  copen
2638eeb27bfeSBram Moolenaar  quit
2639eeb27bfeSBram Moolenaarenddef
2640eeb27bfeSBram Moolenaar
2641*2d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
2642*2d6b20d6SBram Moolenaardef Test_vim9_autoload()
2643*2d6b20d6SBram Moolenaar  let lines =<< trim END
2644*2d6b20d6SBram Moolenaar     vim9script
2645*2d6b20d6SBram Moolenaar     def foo#test()
2646*2d6b20d6SBram Moolenaar         echomsg getreg('"')
2647*2d6b20d6SBram Moolenaar     enddef
2648*2d6b20d6SBram Moolenaar  END
2649*2d6b20d6SBram Moolenaar
2650*2d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
2651*2d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
2652*2d6b20d6SBram Moolenaar  let save_rtp = &rtp
2653*2d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
2654*2d6b20d6SBram Moolenaar  augroup test
2655*2d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
2656*2d6b20d6SBram Moolenaar  augroup END
2657*2d6b20d6SBram Moolenaar
2658*2d6b20d6SBram Moolenaar  normal Y
2659*2d6b20d6SBram Moolenaar
2660*2d6b20d6SBram Moolenaar  augroup test
2661*2d6b20d6SBram Moolenaar    autocmd!
2662*2d6b20d6SBram Moolenaar  augroup END
2663*2d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
2664*2d6b20d6SBram Moolenaar  &rtp = save_rtp
2665*2d6b20d6SBram Moolenaarenddef
2666*2d6b20d6SBram Moolenaar
2667585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2668585fea7bSBram Moolenaardef Test_substitute_cmd()
2669585fea7bSBram Moolenaar  new
2670585fea7bSBram Moolenaar  setline(1, 'something')
2671585fea7bSBram Moolenaar  :substitute(some(other(
2672585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2673585fea7bSBram Moolenaar  bwipe!
2674585fea7bSBram Moolenaar
2675f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2676585fea7bSBram Moolenaar  let lines =<< trim END
2677585fea7bSBram Moolenaar    vim9script
2678585fea7bSBram Moolenaar    new
2679585fea7bSBram Moolenaar    setline(1, 'something')
2680585fea7bSBram Moolenaar    :substitute(some(other(
2681585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2682585fea7bSBram Moolenaar    bwipe!
2683585fea7bSBram Moolenaar  END
2684585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2685585fea7bSBram Moolenaar  source Xvim9lines
2686585fea7bSBram Moolenaar
2687585fea7bSBram Moolenaar  delete('Xvim9lines')
2688585fea7bSBram Moolenaarenddef
2689585fea7bSBram Moolenaar
26908a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2691