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
32*4cdb13ceSBram Moolenaar  let nr: number = 1234
33*4cdb13ceSBram Moolenaar  call CheckDefFailure(['let nr: number = "asdf"'], 'E1013:')
34*4cdb13ceSBram 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
3218a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
3228a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
3238a7d6542SBram Moolenaar
3249b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
3259af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
3269af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
3279af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
3289af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
3299af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
3309af78769SBram Moolenaar                            'let y: number',
3319af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
3329af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
3339af78769SBram Moolenaar                            'let y: number',
3349af78769SBram Moolenaar                            'let z: list<number>',
3359af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
3369be61bbbSBram Moolenaar
337e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
3389be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
3399be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
3409be61bbbSBram Moolenaar
341e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
3429be61bbbSBram Moolenaar
3439be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
3449be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
3459be61bbbSBram Moolenaar
346e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
347e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
348e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
349e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
3509be61bbbSBram Moolenaar
3519be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
3529be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
3539be61bbbSBram Moolenaar
354822ba247SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
35533fa29cfSBram Moolenaar
3568a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
3578a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
3588a7d6542SBram Moolenaar
3598a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
3608a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
3618a7d6542SBram Moolenaar
3628a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
3638a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
36442a480bfSBram Moolenaar
365d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
36642a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
367cab27678SBram Moolenaar
368cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
369cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
370d72c1bf0SBram Moolenaarenddef
371d72c1bf0SBram Moolenaar
372d72c1bf0SBram Moolenaardef Test_unlet()
373d72c1bf0SBram Moolenaar  g:somevar = 'yes'
374d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
375d72c1bf0SBram Moolenaar  unlet g:somevar
376d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
377d72c1bf0SBram Moolenaar  unlet! g:somevar
378d72c1bf0SBram Moolenaar
379d72c1bf0SBram Moolenaar  call CheckScriptFailure([
380d72c1bf0SBram Moolenaar        'vim9script',
381d72c1bf0SBram Moolenaar        'let svar = 123',
382d72c1bf0SBram Moolenaar        'unlet svar',
383d72c1bf0SBram Moolenaar        ], 'E1081:')
384d72c1bf0SBram Moolenaar  call CheckScriptFailure([
385d72c1bf0SBram Moolenaar        'vim9script',
386d72c1bf0SBram Moolenaar        'let svar = 123',
387d72c1bf0SBram Moolenaar        'unlet s:svar',
388d72c1bf0SBram Moolenaar        ], 'E1081:')
389d72c1bf0SBram Moolenaar  call CheckScriptFailure([
390d72c1bf0SBram Moolenaar        'vim9script',
391d72c1bf0SBram Moolenaar        'let svar = 123',
392d72c1bf0SBram Moolenaar        'def Func()',
393d72c1bf0SBram Moolenaar        '  unlet svar',
394d72c1bf0SBram Moolenaar        'enddef',
395822ba247SBram Moolenaar        'defcompile',
396d72c1bf0SBram Moolenaar        ], 'E1081:')
397d72c1bf0SBram Moolenaar  call CheckScriptFailure([
398d72c1bf0SBram Moolenaar        'vim9script',
399d72c1bf0SBram Moolenaar        'let svar = 123',
400d72c1bf0SBram Moolenaar        'def Func()',
401d72c1bf0SBram Moolenaar        '  unlet s:svar',
402d72c1bf0SBram Moolenaar        'enddef',
403822ba247SBram Moolenaar        'defcompile',
404d72c1bf0SBram Moolenaar        ], 'E1081:')
4057bdaea6eSBram Moolenaar
4067bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
4077bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
4087bdaea6eSBram Moolenaar  unlet $ENVVAR
4097bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
410d72c1bf0SBram Moolenaarenddef
411599c89c8SBram Moolenaar
4124c17ad94SBram Moolenaardef Test_delfunction()
413f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
4144c17ad94SBram Moolenaar  CheckScriptSuccess([
4154c17ad94SBram Moolenaar      'vim9script',
4164c17ad94SBram Moolenaar      'func CheckMe()',
4174c17ad94SBram Moolenaar      '  return 123',
4184c17ad94SBram Moolenaar      'endfunc',
4194c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
4204c17ad94SBram Moolenaar      ])
4214c17ad94SBram Moolenaar
422f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
4234c17ad94SBram Moolenaar  CheckScriptFailure([
4244c17ad94SBram Moolenaar      'vim9script',
4254c17ad94SBram Moolenaar      'func DeleteMe1()',
4264c17ad94SBram Moolenaar      'endfunc',
4274c17ad94SBram Moolenaar      'delfunction DeleteMe1',
4284c17ad94SBram Moolenaar      ], 'E1084:')
4294c17ad94SBram Moolenaar  CheckScriptFailure([
4304c17ad94SBram Moolenaar      'vim9script',
4314c17ad94SBram Moolenaar      'func DeleteMe2()',
4324c17ad94SBram Moolenaar      'endfunc',
4334c17ad94SBram Moolenaar      'def DoThat()',
4344c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
4354c17ad94SBram Moolenaar      'enddef',
4364c17ad94SBram Moolenaar      'DoThat()',
4374c17ad94SBram Moolenaar      ], 'E1084:')
4384c17ad94SBram Moolenaar  CheckScriptFailure([
4394c17ad94SBram Moolenaar      'vim9script',
4404c17ad94SBram Moolenaar      'def DeleteMe3()',
4414c17ad94SBram Moolenaar      'enddef',
4424c17ad94SBram Moolenaar      'delfunction DeleteMe3',
4434c17ad94SBram Moolenaar      ], 'E1084:')
4444c17ad94SBram Moolenaar  CheckScriptFailure([
4454c17ad94SBram Moolenaar      'vim9script',
4464c17ad94SBram Moolenaar      'def DeleteMe4()',
4474c17ad94SBram Moolenaar      'enddef',
4484c17ad94SBram Moolenaar      'def DoThat()',
4494c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
4504c17ad94SBram Moolenaar      'enddef',
4514c17ad94SBram Moolenaar      'DoThat()',
4524c17ad94SBram Moolenaar      ], 'E1084:')
4534c17ad94SBram Moolenaarenddef
4544c17ad94SBram Moolenaar
455599c89c8SBram Moolenaarfunc Test_wrong_type()
456599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
457599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
458599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
459599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
460599c89c8SBram Moolenaar
461599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
462599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
46342a480bfSBram Moolenaar
46442a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
46542a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
46642a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
46742a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
46842a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
46942a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
47042a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
47142a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
47242a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
47342a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
47442a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
475a0a9f43aSBram Moolenaar
476a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
477a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
4788a7d6542SBram Moolenaarendfunc
4798a7d6542SBram Moolenaar
4808a7d6542SBram Moolenaarfunc Test_const()
4818a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
4828a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
4838a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
4849be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
4858a7d6542SBram Moolenaarendfunc
4868a7d6542SBram Moolenaar
487df069eecSBram Moolenaardef Test_range_no_colon()
488df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
489df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
490df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
491df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
492df069eecSBram Moolenaarenddef
493df069eecSBram Moolenaar
494df069eecSBram Moolenaar
4958a7d6542SBram Moolenaardef Test_block()
4968a7d6542SBram Moolenaar  let outer = 1
4978a7d6542SBram Moolenaar  {
4988a7d6542SBram Moolenaar    let inner = 2
4998a7d6542SBram Moolenaar    assert_equal(1, outer)
5008a7d6542SBram Moolenaar    assert_equal(2, inner)
5018a7d6542SBram Moolenaar  }
5028a7d6542SBram Moolenaar  assert_equal(1, outer)
5038a7d6542SBram Moolenaarenddef
5048a7d6542SBram Moolenaar
5058a7d6542SBram Moolenaarfunc Test_block_failure()
5068a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
507585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
508585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
5098a7d6542SBram Moolenaarendfunc
5108a7d6542SBram Moolenaar
511585fea7bSBram Moolenaardef Test_cmd_modifier()
512585fea7bSBram Moolenaar  tab echo '0'
513585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
514585fea7bSBram Moolenaarenddef
515585fea7bSBram Moolenaar
516d032f34aSBram Moolenaarfunc g:NoSuchFunc()
517d032f34aSBram Moolenaar  echo 'none'
518d032f34aSBram Moolenaarendfunc
519d032f34aSBram Moolenaar
5208a7d6542SBram Moolenaardef Test_try_catch()
5218a7d6542SBram Moolenaar  let l = []
5227a092245SBram Moolenaar  try # comment
5238a7d6542SBram Moolenaar    add(l, '1')
5248a7d6542SBram Moolenaar    throw 'wrong'
5258a7d6542SBram Moolenaar    add(l, '2')
5267a092245SBram Moolenaar  catch # comment
5278a7d6542SBram Moolenaar    add(l, v:exception)
5287a092245SBram Moolenaar  finally # comment
5298a7d6542SBram Moolenaar    add(l, '3')
5307a092245SBram Moolenaar  endtry # comment
5318a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
53268d130c6SBram Moolenaar
533e859312eSBram Moolenaar  l = []
534e859312eSBram Moolenaar  try
535e859312eSBram Moolenaar    try
536e859312eSBram Moolenaar      add(l, '1')
537e859312eSBram Moolenaar      throw 'wrong'
538e859312eSBram Moolenaar      add(l, '2')
539e859312eSBram Moolenaar    catch /right/
540e859312eSBram Moolenaar      add(l, v:exception)
541e859312eSBram Moolenaar    endtry
542e859312eSBram Moolenaar  catch /wrong/
543e859312eSBram Moolenaar    add(l, 'caught')
544e859312eSBram Moolenaar  finally
545e859312eSBram Moolenaar    add(l, 'finally')
546e859312eSBram Moolenaar  endtry
547e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
548e859312eSBram Moolenaar
54968d130c6SBram Moolenaar  let n: number
55068d130c6SBram Moolenaar  try
55168d130c6SBram Moolenaar    n = l[3]
55268d130c6SBram Moolenaar  catch /E684:/
55368d130c6SBram Moolenaar    n = 99
55468d130c6SBram Moolenaar  endtry
55568d130c6SBram Moolenaar  assert_equal(99, n)
55668d130c6SBram Moolenaar
55768d130c6SBram Moolenaar  try
55868d130c6SBram Moolenaar    n = g:astring[3]
55968d130c6SBram Moolenaar  catch /E714:/
56068d130c6SBram Moolenaar    n = 77
56168d130c6SBram Moolenaar  endtry
56268d130c6SBram Moolenaar  assert_equal(77, n)
56368d130c6SBram Moolenaar
56468d130c6SBram Moolenaar  try
56568d130c6SBram Moolenaar    n = l[g:astring]
56668d130c6SBram Moolenaar  catch /E39:/
56768d130c6SBram Moolenaar    n = 77
56868d130c6SBram Moolenaar  endtry
56968d130c6SBram Moolenaar  assert_equal(77, n)
57068d130c6SBram Moolenaar
57168d130c6SBram Moolenaar  try
57268d130c6SBram Moolenaar    n = s:does_not_exist
57368d130c6SBram Moolenaar  catch /E121:/
574f0b9f43cSBram Moolenaar    n = 111
575f0b9f43cSBram Moolenaar  endtry
576f0b9f43cSBram Moolenaar  assert_equal(111, n)
577f0b9f43cSBram Moolenaar
578f0b9f43cSBram Moolenaar  try
579f0b9f43cSBram Moolenaar    n = g:does_not_exist
580f0b9f43cSBram Moolenaar  catch /E121:/
58168d130c6SBram Moolenaar    n = 121
58268d130c6SBram Moolenaar  endtry
58368d130c6SBram Moolenaar  assert_equal(121, n)
58468d130c6SBram Moolenaar
58568d130c6SBram Moolenaar  let d = #{one: 1}
58668d130c6SBram Moolenaar  try
58768d130c6SBram Moolenaar    n = d[g:astring]
58868d130c6SBram Moolenaar  catch /E716:/
58968d130c6SBram Moolenaar    n = 222
59068d130c6SBram Moolenaar  endtry
59168d130c6SBram Moolenaar  assert_equal(222, n)
592f0b9f43cSBram Moolenaar
593f0b9f43cSBram Moolenaar  try
594f0b9f43cSBram Moolenaar    n = -g:astring
595f0b9f43cSBram Moolenaar  catch /E39:/
596f0b9f43cSBram Moolenaar    n = 233
597f0b9f43cSBram Moolenaar  endtry
598f0b9f43cSBram Moolenaar  assert_equal(233, n)
599f0b9f43cSBram Moolenaar
600f0b9f43cSBram Moolenaar  try
601f0b9f43cSBram Moolenaar    n = +g:astring
602f0b9f43cSBram Moolenaar  catch /E1030:/
603f0b9f43cSBram Moolenaar    n = 244
604f0b9f43cSBram Moolenaar  endtry
605f0b9f43cSBram Moolenaar  assert_equal(244, n)
606f0b9f43cSBram Moolenaar
607f0b9f43cSBram Moolenaar  try
608f0b9f43cSBram Moolenaar    n = +g:alist
609f0b9f43cSBram Moolenaar  catch /E745:/
610f0b9f43cSBram Moolenaar    n = 255
611f0b9f43cSBram Moolenaar  endtry
612f0b9f43cSBram Moolenaar  assert_equal(255, n)
613f0b9f43cSBram Moolenaar
614f0b9f43cSBram Moolenaar  let nd: dict<any>
615f0b9f43cSBram Moolenaar  try
616f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
617f0b9f43cSBram Moolenaar  catch /E1029:/
618f0b9f43cSBram Moolenaar    n = 266
619f0b9f43cSBram Moolenaar  endtry
620f0b9f43cSBram Moolenaar  assert_equal(266, n)
621f0b9f43cSBram Moolenaar
622f0b9f43cSBram Moolenaar  try
623f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
624f0b9f43cSBram Moolenaar  catch /E1093:/
625f0b9f43cSBram Moolenaar    n = 277
626f0b9f43cSBram Moolenaar  endtry
627f0b9f43cSBram Moolenaar  assert_equal(277, n)
628f0b9f43cSBram Moolenaar
629e859312eSBram Moolenaar  try
630e859312eSBram Moolenaar    &ts = g:astring
631e859312eSBram Moolenaar  catch /E1029:/
632e859312eSBram Moolenaar    n = 288
633e859312eSBram Moolenaar  endtry
634e859312eSBram Moolenaar  assert_equal(288, n)
635e859312eSBram Moolenaar
636e859312eSBram Moolenaar  try
637e859312eSBram Moolenaar    &backspace = 'asdf'
638e859312eSBram Moolenaar  catch /E474:/
639e859312eSBram Moolenaar    n = 299
640e859312eSBram Moolenaar  endtry
641e859312eSBram Moolenaar  assert_equal(299, n)
642e859312eSBram Moolenaar
643e859312eSBram Moolenaar  l = [1]
644e859312eSBram Moolenaar  try
645e859312eSBram Moolenaar    l[3] = 3
646e859312eSBram Moolenaar  catch /E684:/
647e859312eSBram Moolenaar    n = 300
648e859312eSBram Moolenaar  endtry
649e859312eSBram Moolenaar  assert_equal(300, n)
650e859312eSBram Moolenaar
651e859312eSBram Moolenaar  try
652e859312eSBram Moolenaar    d[''] = 3
653e859312eSBram Moolenaar  catch /E713:/
654e859312eSBram Moolenaar    n = 311
655e859312eSBram Moolenaar  endtry
656e859312eSBram Moolenaar  assert_equal(311, n)
657e859312eSBram Moolenaar
658e859312eSBram Moolenaar  try
659e859312eSBram Moolenaar    unlet g:does_not_exist
660e859312eSBram Moolenaar  catch /E108:/
661e859312eSBram Moolenaar    n = 322
662e859312eSBram Moolenaar  endtry
663e859312eSBram Moolenaar  assert_equal(322, n)
664e859312eSBram Moolenaar
665e859312eSBram Moolenaar  try
666e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
667e859312eSBram Moolenaar  catch /E721:/
668e859312eSBram Moolenaar    n = 333
669e859312eSBram Moolenaar  endtry
670e859312eSBram Moolenaar  assert_equal(333, n)
671e859312eSBram Moolenaar
672e859312eSBram Moolenaar  try
673e859312eSBram Moolenaar    l = DeletedFunc()
674e859312eSBram Moolenaar  catch /E933:/
675e859312eSBram Moolenaar    n = 344
676e859312eSBram Moolenaar  endtry
677e859312eSBram Moolenaar  assert_equal(344, n)
678d032f34aSBram Moolenaar
679d032f34aSBram Moolenaar  try
680d032f34aSBram Moolenaar    echo len(v:true)
681d032f34aSBram Moolenaar  catch /E701:/
682d032f34aSBram Moolenaar    n = 355
683d032f34aSBram Moolenaar  endtry
684d032f34aSBram Moolenaar  assert_equal(355, n)
685d032f34aSBram Moolenaar
686d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
687d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
688d032f34aSBram Moolenaar  try
689d032f34aSBram Moolenaar    echo P()
690d032f34aSBram Moolenaar  catch /E117:/
691d032f34aSBram Moolenaar    n = 366
692d032f34aSBram Moolenaar  endtry
693d032f34aSBram Moolenaar  assert_equal(366, n)
694d032f34aSBram Moolenaar
695d032f34aSBram Moolenaar  try
696d032f34aSBram Moolenaar    echo g:NoSuchFunc()
697d032f34aSBram Moolenaar  catch /E117:/
698d032f34aSBram Moolenaar    n = 377
699d032f34aSBram Moolenaar  endtry
700d032f34aSBram Moolenaar  assert_equal(377, n)
701d032f34aSBram Moolenaar
702d032f34aSBram Moolenaar  try
703d032f34aSBram Moolenaar    echo g:alist + 4
704d032f34aSBram Moolenaar  catch /E745:/
705d032f34aSBram Moolenaar    n = 388
706d032f34aSBram Moolenaar  endtry
707d032f34aSBram Moolenaar  assert_equal(388, n)
708d032f34aSBram Moolenaar
709d032f34aSBram Moolenaar  try
710d032f34aSBram Moolenaar    echo 4 + g:alist
711d032f34aSBram Moolenaar  catch /E745:/
712d032f34aSBram Moolenaar    n = 399
713d032f34aSBram Moolenaar  endtry
714d032f34aSBram Moolenaar  assert_equal(399, n)
715d032f34aSBram Moolenaar
716d032f34aSBram Moolenaar  try
717d032f34aSBram Moolenaar    echo g:alist.member
718d032f34aSBram Moolenaar  catch /E715:/
719d032f34aSBram Moolenaar    n = 400
720d032f34aSBram Moolenaar  endtry
721d032f34aSBram Moolenaar  assert_equal(400, n)
722d032f34aSBram Moolenaar
723d032f34aSBram Moolenaar  try
724d032f34aSBram Moolenaar    echo d.member
725d032f34aSBram Moolenaar  catch /E716:/
726d032f34aSBram Moolenaar    n = 411
727d032f34aSBram Moolenaar  endtry
728d032f34aSBram Moolenaar  assert_equal(411, n)
7298a7d6542SBram Moolenaarenddef
7308a7d6542SBram Moolenaar
731e859312eSBram Moolenaardef DeletedFunc(): list<any>
732e859312eSBram Moolenaar  return ['delete me']
733e859312eSBram Moolenaarenddef
734e859312eSBram Moolenaardefcompile
735e859312eSBram Moolenaardelfunc DeletedFunc
736e859312eSBram Moolenaar
737257cc5eeSBram Moolenaardef ThrowFromDef()
738a72cfb80SBram Moolenaar  throw "getout" # comment
739257cc5eeSBram Moolenaarenddef
740257cc5eeSBram Moolenaar
741257cc5eeSBram Moolenaarfunc CatchInFunc()
742257cc5eeSBram Moolenaar  try
743257cc5eeSBram Moolenaar    call ThrowFromDef()
744257cc5eeSBram Moolenaar  catch
745257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
746257cc5eeSBram Moolenaar  endtry
747257cc5eeSBram Moolenaarendfunc
748257cc5eeSBram Moolenaar
749257cc5eeSBram Moolenaardef CatchInDef()
750257cc5eeSBram Moolenaar  try
751257cc5eeSBram Moolenaar    ThrowFromDef()
752257cc5eeSBram Moolenaar  catch
753257cc5eeSBram Moolenaar    g:thrown_def = v:exception
754257cc5eeSBram Moolenaar  endtry
755257cc5eeSBram Moolenaarenddef
756257cc5eeSBram Moolenaar
757f575adffSBram Moolenaardef ReturnFinally(): string
758f575adffSBram Moolenaar  try
759f575adffSBram Moolenaar    return 'intry'
760f575adffSBram Moolenaar  finally
761f575adffSBram Moolenaar    g:in_finally = 'finally'
762f575adffSBram Moolenaar  endtry
763f575adffSBram Moolenaar  return 'end'
764f575adffSBram Moolenaarenddef
765f575adffSBram Moolenaar
766257cc5eeSBram Moolenaardef Test_try_catch_nested()
767257cc5eeSBram Moolenaar  CatchInFunc()
768257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
769257cc5eeSBram Moolenaar
770257cc5eeSBram Moolenaar  CatchInDef()
771257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
772f575adffSBram Moolenaar
773f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
774f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
775f575adffSBram Moolenaarenddef
776f575adffSBram Moolenaar
777f575adffSBram Moolenaardef Test_try_catch_match()
778f575adffSBram Moolenaar  let seq = 'a'
779f575adffSBram Moolenaar  try
780f575adffSBram Moolenaar    throw 'something'
781f575adffSBram Moolenaar  catch /nothing/
782f575adffSBram Moolenaar    seq ..= 'x'
783f575adffSBram Moolenaar  catch /some/
784f575adffSBram Moolenaar    seq ..= 'b'
785f575adffSBram Moolenaar  catch /asdf/
786f575adffSBram Moolenaar    seq ..= 'x'
787e8c4abbbSBram Moolenaar  catch ?a\?sdf?
788e8c4abbbSBram Moolenaar    seq ..= 'y'
789f575adffSBram Moolenaar  finally
790f575adffSBram Moolenaar    seq ..= 'c'
791f575adffSBram Moolenaar  endtry
792f575adffSBram Moolenaar  assert_equal('abc', seq)
793257cc5eeSBram Moolenaarenddef
794257cc5eeSBram Moolenaar
795e8c4abbbSBram Moolenaardef Test_try_catch_fails()
796e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
797e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
798e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
799585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
800585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
801585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
802585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
803585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
804585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
805585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
806585fea7bSBram Moolenaar
807a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
808585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
809e8c4abbbSBram Moolenaarenddef
810e8c4abbbSBram Moolenaar
811006ad48bSBram Moolenaardef Test_throw_vimscript()
812f5be8cdbSBram Moolenaar  # only checks line continuation
813006ad48bSBram Moolenaar  let lines =<< trim END
814006ad48bSBram Moolenaar      vim9script
815006ad48bSBram Moolenaar      try
816006ad48bSBram Moolenaar        throw 'one'
817006ad48bSBram Moolenaar              .. 'two'
818006ad48bSBram Moolenaar      catch
819006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
820006ad48bSBram Moolenaar      endtry
821006ad48bSBram Moolenaar  END
822006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
823006ad48bSBram Moolenaarenddef
824006ad48bSBram Moolenaar
82537c83711SBram Moolenaardef Test_cexpr_vimscript()
826f5be8cdbSBram Moolenaar  # only checks line continuation
82737c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
82837c83711SBram Moolenaar  let lines =<< trim END
82937c83711SBram Moolenaar      vim9script
83037c83711SBram Moolenaar      cexpr 'File'
83137c83711SBram Moolenaar                .. ' someFile' ..
83237c83711SBram Moolenaar                   ' line 19'
83337c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
83437c83711SBram Moolenaar  END
83537c83711SBram Moolenaar  CheckScriptSuccess(lines)
83637c83711SBram Moolenaar  set errorformat&
83737c83711SBram Moolenaarenddef
83837c83711SBram Moolenaar
839b209750bSBram Moolenaardef Test_list_vimscript()
840b209750bSBram Moolenaar  # checks line continuation and comments
841b209750bSBram Moolenaar  let lines =<< trim END
842b209750bSBram Moolenaar      vim9script
843b209750bSBram Moolenaar      let mylist = [
844b209750bSBram Moolenaar            'one',
845b209750bSBram Moolenaar            # comment
846b209750bSBram Moolenaar            'two', # empty line follows
847b209750bSBram Moolenaar
848b209750bSBram Moolenaar            'three',
849b209750bSBram Moolenaar            ]
850b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
851b209750bSBram Moolenaar  END
852b209750bSBram Moolenaar  CheckScriptSuccess(lines)
853b209750bSBram Moolenaarenddef
854b209750bSBram Moolenaar
8552a1381c3SBram Moolenaarif has('channel')
85640ee466cSBram Moolenaar  let someJob = test_null_job()
85740ee466cSBram Moolenaar
85840ee466cSBram Moolenaar  def FuncWithError()
85940ee466cSBram Moolenaar    echomsg g:someJob
86040ee466cSBram Moolenaar  enddef
86140ee466cSBram Moolenaar
86240ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
86340ee466cSBram Moolenaar    try
86440ee466cSBram Moolenaar      call FuncWithError()
86540ee466cSBram Moolenaar    catch
86640ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
86740ee466cSBram Moolenaar    endtry
86840ee466cSBram Moolenaar  endfunc
8692a1381c3SBram Moolenaarendif
87040ee466cSBram Moolenaar
8718a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
8728a7d6542SBram Moolenaar  vim9script
8738a7d6542SBram Moolenaar  let name: string = 'bob'
8748a7d6542SBram Moolenaar  def Concat(arg: string): string
8758a7d6542SBram Moolenaar    return name .. arg
8768a7d6542SBram Moolenaar  enddef
877227a69deSBram Moolenaar  g:result = Concat('bie')
878227a69deSBram Moolenaar  g:localname = name
8798a7d6542SBram Moolenaar
8808a7d6542SBram Moolenaar  export const CONST = 1234
8818a7d6542SBram Moolenaar  export let exported = 9876
8826e587dcbSBram Moolenaar  export let exp_name = 'John'
8838a7d6542SBram Moolenaar  export def Exported(): string
8848a7d6542SBram Moolenaar    return 'Exported'
8858a7d6542SBram Moolenaar  enddef
8868a7d6542SBram MoolenaarEND
8878a7d6542SBram Moolenaar
8885269bd2aSBram Moolenaardef Test_vim9_import_export()
8898a7d6542SBram Moolenaar  let import_script_lines =<< trim END
8908a7d6542SBram Moolenaar    vim9script
8918a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
8928a7d6542SBram Moolenaar    g:imported = exported
8936e587dcbSBram Moolenaar    exported += 3
8946e587dcbSBram Moolenaar    g:imported_added = exported
8958a7d6542SBram Moolenaar    g:imported_func = Exported()
8966e587dcbSBram Moolenaar
8976e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
8986e587dcbSBram Moolenaar    g:imported_name = exp_name
8996e587dcbSBram Moolenaar    exp_name ..= ' Doe'
9006e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
9015381c7a1SBram Moolenaar    g:imported_later = exported
9028a7d6542SBram Moolenaar  END
9038a7d6542SBram Moolenaar
9048a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
9058a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
9068a7d6542SBram Moolenaar
9078a7d6542SBram Moolenaar  source Ximport.vim
9088a7d6542SBram Moolenaar
9098a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
9108a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
9118a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
9126e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
9135381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
9148a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
9156e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
9166e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
9178a7d6542SBram Moolenaar  assert_false(exists('g:name'))
9188a7d6542SBram Moolenaar
9198a7d6542SBram Moolenaar  unlet g:result
9208a7d6542SBram Moolenaar  unlet g:localname
9218a7d6542SBram Moolenaar  unlet g:imported
9226e587dcbSBram Moolenaar  unlet g:imported_added
9235381c7a1SBram Moolenaar  unlet g:imported_later
9248a7d6542SBram Moolenaar  unlet g:imported_func
9256e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
9268a7d6542SBram Moolenaar  delete('Ximport.vim')
927f2d5c240SBram Moolenaar
9281c991144SBram Moolenaar  # similar, with line breaks
9291c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
9301c991144SBram Moolenaar    vim9script
9311c991144SBram Moolenaar    import {
9321c991144SBram Moolenaar        exported,
9331c991144SBram Moolenaar        Exported,
9341c991144SBram Moolenaar        }
9351c991144SBram Moolenaar        from
9361c991144SBram Moolenaar        './Xexport.vim'
9371c991144SBram Moolenaar    g:imported = exported
9381c991144SBram Moolenaar    exported += 5
9391c991144SBram Moolenaar    g:imported_added = exported
9401c991144SBram Moolenaar    g:imported_func = Exported()
9411c991144SBram Moolenaar  END
9421c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
9431c991144SBram Moolenaar  source Ximport_lbr.vim
9441c991144SBram Moolenaar
9451c991144SBram Moolenaar  assert_equal(9876, g:imported)
9461c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
9471c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
9481c991144SBram Moolenaar
9491c991144SBram Moolenaar  # exported script not sourced again
9501c991144SBram Moolenaar  assert_false(exists('g:result'))
9511c991144SBram Moolenaar  unlet g:imported
9521c991144SBram Moolenaar  unlet g:imported_added
9531c991144SBram Moolenaar  unlet g:imported_func
9541c991144SBram Moolenaar  delete('Ximport_lbr.vim')
9551c991144SBram Moolenaar
9561c991144SBram Moolenaar  # import inside :def function
9575381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
9585381c7a1SBram Moolenaar    vim9script
9595381c7a1SBram Moolenaar    def ImportInDef()
9605381c7a1SBram Moolenaar      import exported from './Xexport.vim'
9615381c7a1SBram Moolenaar      g:imported = exported
9625381c7a1SBram Moolenaar      exported += 7
9635381c7a1SBram Moolenaar      g:imported_added = exported
9645381c7a1SBram Moolenaar    enddef
9655381c7a1SBram Moolenaar    ImportInDef()
9665381c7a1SBram Moolenaar  END
9675381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
9685381c7a1SBram Moolenaar  source Ximport2.vim
969f5be8cdbSBram Moolenaar  # TODO: this should be 9879
9705381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
9715381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
9725381c7a1SBram Moolenaar  unlet g:imported
9735381c7a1SBram Moolenaar  unlet g:imported_added
9745381c7a1SBram Moolenaar  delete('Ximport2.vim')
9755381c7a1SBram Moolenaar
976f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
977f2d5c240SBram Moolenaar    vim9script
978f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
979f2d5c240SBram Moolenaar    def UseExport()
980f2d5c240SBram Moolenaar      g:imported = Export.exported
981f2d5c240SBram Moolenaar    enddef
982f2d5c240SBram Moolenaar    UseExport()
983f2d5c240SBram Moolenaar  END
984f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
985f2d5c240SBram Moolenaar  source Ximport.vim
9865381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
987f2d5c240SBram Moolenaar
988599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
989599c89c8SBram Moolenaar    vim9script
990599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
991599c89c8SBram Moolenaar    def Func()
992599c89c8SBram Moolenaar      let dummy = 1
993599c89c8SBram Moolenaar      let imported = Export + dummy
994599c89c8SBram Moolenaar    enddef
995822ba247SBram Moolenaar    defcompile
996599c89c8SBram Moolenaar  END
997599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
998599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
999599c89c8SBram Moolenaar
1000599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1001599c89c8SBram Moolenaar    vim9script
1002599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1003599c89c8SBram Moolenaar    def Func()
1004599c89c8SBram Moolenaar      let imported = Export . exported
1005599c89c8SBram Moolenaar    enddef
1006822ba247SBram Moolenaar    defcompile
1007599c89c8SBram Moolenaar  END
1008599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1009599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1010599c89c8SBram Moolenaar
1011599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1012599c89c8SBram Moolenaar    vim9script
1013599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1014599c89c8SBram Moolenaar    def Func()
1015599c89c8SBram Moolenaar      let imported = Export.
1016599c89c8SBram Moolenaar    enddef
1017822ba247SBram Moolenaar    defcompile
1018599c89c8SBram Moolenaar  END
1019599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1020599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1021599c89c8SBram Moolenaar
10221c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
10231c991144SBram Moolenaar    vim9script
10241c991144SBram Moolenaar    import *
10251c991144SBram Moolenaar        as Export
10261c991144SBram Moolenaar        from
10271c991144SBram Moolenaar        './Xexport.vim'
10281c991144SBram Moolenaar    def UseExport()
10291c991144SBram Moolenaar      g:imported = Export.exported
10301c991144SBram Moolenaar    enddef
10311c991144SBram Moolenaar    UseExport()
10321c991144SBram Moolenaar  END
10331c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
10341c991144SBram Moolenaar  source Ximport.vim
10351c991144SBram Moolenaar  assert_equal(9883, g:imported)
10361c991144SBram Moolenaar
1037f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1038f2d5c240SBram Moolenaar    vim9script
1039f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1040f2d5c240SBram Moolenaar  END
1041f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1042f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1043f2d5c240SBram Moolenaar
1044f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1045fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1046fa29c8abSBram Moolenaar    vim9script
1047fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1048fa29c8abSBram Moolenaar  END
1049fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1050fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1051fa29c8abSBram Moolenaar
1052f5be8cdbSBram Moolenaar  # try to import something that is already defined
10535269bd2aSBram Moolenaar  let import_already_defined =<< trim END
10545269bd2aSBram Moolenaar    vim9script
10555269bd2aSBram Moolenaar    let exported = 'something'
10565269bd2aSBram Moolenaar    import exported from './Xexport.vim'
10575269bd2aSBram Moolenaar  END
10585269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
10595269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
10605269bd2aSBram Moolenaar
1061f5be8cdbSBram Moolenaar  # try to import something that is already defined
10625269bd2aSBram Moolenaar  import_already_defined =<< trim END
10635269bd2aSBram Moolenaar    vim9script
10645269bd2aSBram Moolenaar    let exported = 'something'
10655269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
10665269bd2aSBram Moolenaar  END
10675269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
10685269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
10695269bd2aSBram Moolenaar
1070f5be8cdbSBram Moolenaar  # try to import something that is already defined
10715269bd2aSBram Moolenaar  import_already_defined =<< trim END
10725269bd2aSBram Moolenaar    vim9script
10735269bd2aSBram Moolenaar    let exported = 'something'
10745269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
10755269bd2aSBram Moolenaar  END
10765269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
10775269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
10785269bd2aSBram Moolenaar
1079f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1080fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1081fa29c8abSBram Moolenaar    vim9script
1082fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1083fa29c8abSBram Moolenaar  END
1084fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1085fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1086fa29c8abSBram Moolenaar
1087fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1088fa29c8abSBram Moolenaar    vim9script
1089fa29c8abSBram Moolenaar    import name './Xexport.vim'
1090fa29c8abSBram Moolenaar  END
1091fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1092fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1093fa29c8abSBram Moolenaar
1094fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1095fa29c8abSBram Moolenaar    vim9script
1096fa29c8abSBram Moolenaar    import name from Xexport.vim
1097fa29c8abSBram Moolenaar  END
1098fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1099fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1100fa29c8abSBram Moolenaar
1101fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1102fa29c8abSBram Moolenaar    vim9script
1103fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1104fa29c8abSBram Moolenaar  END
1105fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1106fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1107fa29c8abSBram Moolenaar
1108fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1109fa29c8abSBram Moolenaar    vim9script
1110fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1111fa29c8abSBram Moolenaar  END
11125269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
11135269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1114fa29c8abSBram Moolenaar
1115f2d5c240SBram Moolenaar  delete('Ximport.vim')
11165269bd2aSBram Moolenaar  delete('Ximport3.vim')
11178a7d6542SBram Moolenaar  delete('Xexport.vim')
11188a7d6542SBram Moolenaar
1119f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1120750802b5SBram Moolenaar  set cpo&vi
1121750802b5SBram Moolenaar  let cpo_before = &cpo
1122750802b5SBram Moolenaar  let lines =<< trim END
1123750802b5SBram Moolenaar    vim9script
1124750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1125750802b5SBram Moolenaar  END
1126750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1127750802b5SBram Moolenaar  source Xvim9_script
1128750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1129750802b5SBram Moolenaar  set cpo&vim
1130750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1131750802b5SBram Moolenaar  delete('Xvim9_script')
1132750802b5SBram Moolenaarenddef
1133750802b5SBram Moolenaar
1134750802b5SBram Moolenaardef Test_vim9script_fails()
11358a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
11368a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1137750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
11389721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
11399b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1140750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1141750802b5SBram Moolenaar
1142c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1143c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1144c785b9a7SBram Moolenaar
1145750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1146a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
11478a7d6542SBram Moolenaarenddef
11488a7d6542SBram Moolenaar
1149f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1150101f4810SBram Moolenaar  CheckRunVimInTerminal
1151101f4810SBram Moolenaar
11529bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1153c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
11549bb3eb3eSBram Moolenaarendfunc
11559bb3eb3eSBram Moolenaar
1156c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1157101f4810SBram Moolenaar  let export =<< trim END
1158101f4810SBram Moolenaar    vim9script
1159101f4810SBram Moolenaar    export def Foo(): number
1160101f4810SBram Moolenaar        return 0
1161101f4810SBram Moolenaar    enddef
1162101f4810SBram Moolenaar  END
11639bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
1164101f4810SBram Moolenaar
11659bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
11669bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
11679bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1168101f4810SBram Moolenaar
11699bb3eb3eSBram Moolenaar  delete('Xexport.vim')
11709bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
11719bb3eb3eSBram Moolenaarenddef
1172101f4810SBram Moolenaar
11734c17ad94SBram Moolenaardef Test_vim9script_reload_import()
11748a7d6542SBram Moolenaar  let lines =<< trim END
11758a7d6542SBram Moolenaar    vim9script
11768a7d6542SBram Moolenaar    const var = ''
11778a7d6542SBram Moolenaar    let valone = 1234
11788a7d6542SBram Moolenaar    def MyFunc(arg: string)
11798a7d6542SBram Moolenaar       valone = 5678
11808a7d6542SBram Moolenaar    enddef
11818a7d6542SBram Moolenaar  END
11828a7d6542SBram Moolenaar  let morelines =<< trim END
11838a7d6542SBram Moolenaar    let valtwo = 222
11848a7d6542SBram Moolenaar    export def GetValtwo(): number
11858a7d6542SBram Moolenaar      return valtwo
11868a7d6542SBram Moolenaar    enddef
11878a7d6542SBram Moolenaar  END
118803afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
11898a7d6542SBram Moolenaar  source Xreload.vim
11908a7d6542SBram Moolenaar  source Xreload.vim
11918a7d6542SBram Moolenaar  source Xreload.vim
11928a7d6542SBram Moolenaar
11938a7d6542SBram Moolenaar  let testlines =<< trim END
11948a7d6542SBram Moolenaar    vim9script
11958a7d6542SBram Moolenaar    def TheFunc()
11968a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
11978a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
11988a7d6542SBram Moolenaar    enddef
11998a7d6542SBram Moolenaar    TheFunc()
12008a7d6542SBram Moolenaar  END
12018a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
12028a7d6542SBram Moolenaar  source Ximport.vim
12038a7d6542SBram Moolenaar
1204f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1205f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
12068a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
12078a7d6542SBram Moolenaar  source Ximport.vim
12088a7d6542SBram Moolenaar
1209f5be8cdbSBram Moolenaar  # cannot declare a var twice
12108a7d6542SBram Moolenaar  lines =<< trim END
12118a7d6542SBram Moolenaar    vim9script
12128a7d6542SBram Moolenaar    let valone = 1234
12138a7d6542SBram Moolenaar    let valone = 5678
12148a7d6542SBram Moolenaar  END
12158a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
12168a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
12178a7d6542SBram Moolenaar
12188a7d6542SBram Moolenaar  delete('Xreload.vim')
12198a7d6542SBram Moolenaar  delete('Ximport.vim')
12208a7d6542SBram Moolenaarenddef
12218a7d6542SBram Moolenaar
1222fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1223fe465a01SBram Moolenaar" script-local name.
1224fe465a01SBram Moolenaardef Test_vim9script_funcref()
1225fe465a01SBram Moolenaar  let sortlines =<< trim END
1226fe465a01SBram Moolenaar      vim9script
1227fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1228bed36b93SBram Moolenaar        return i2 - i1
1229fe465a01SBram Moolenaar      enddef
1230fe465a01SBram Moolenaar
1231fe465a01SBram Moolenaar      export def FastSort(): list<number>
1232fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1233fe465a01SBram Moolenaar      enddef
1234fe465a01SBram Moolenaar  END
1235fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1236fe465a01SBram Moolenaar
1237fe465a01SBram Moolenaar  let lines =<< trim END
1238fe465a01SBram Moolenaar    vim9script
1239fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1240fe465a01SBram Moolenaar    def Test()
1241fe465a01SBram Moolenaar      g:result = FastSort()
1242fe465a01SBram Moolenaar    enddef
1243fe465a01SBram Moolenaar    Test()
1244fe465a01SBram Moolenaar  END
1245fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1246fe465a01SBram Moolenaar
1247fe465a01SBram Moolenaar  source Xscript.vim
1248fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1249fe465a01SBram Moolenaar
1250fe465a01SBram Moolenaar  unlet g:result
1251fe465a01SBram Moolenaar  delete('Xsort.vim')
1252fe465a01SBram Moolenaar  delete('Xscript.vim')
1253fe465a01SBram Moolenaarenddef
1254fe465a01SBram Moolenaar
1255c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1256c620c055SBram Moolenaar" script where FastFilter() is called from.
1257c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1258c620c055SBram Moolenaar  let filterLines =<< trim END
1259c620c055SBram Moolenaar    vim9script
1260c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1261c620c055SBram Moolenaar      return idx % 2 == 1
1262c620c055SBram Moolenaar    enddef
1263c620c055SBram Moolenaar    export def FastFilter(): list<number>
1264c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1265c620c055SBram Moolenaar    enddef
1266c620c055SBram Moolenaar  END
1267c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1268c620c055SBram Moolenaar
1269c620c055SBram Moolenaar  let lines =<< trim END
1270c620c055SBram Moolenaar    vim9script
1271c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1272c620c055SBram Moolenaar    def Test()
1273c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1274c620c055SBram Moolenaar    enddef
1275c620c055SBram Moolenaar    Test()
1276c620c055SBram Moolenaar  END
1277c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1278c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1279c620c055SBram Moolenaar
1280c620c055SBram Moolenaar  delete('Xfilter.vim')
1281c620c055SBram Moolenaar  delete('Ximport.vim')
1282c620c055SBram Moolenaarenddef
1283c620c055SBram Moolenaar
12844c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
12854c17ad94SBram Moolenaar  let first_lines =<< trim END
12864c17ad94SBram Moolenaar    vim9script
12874c17ad94SBram Moolenaar    def FuncYes(): string
12884c17ad94SBram Moolenaar      return 'yes'
12894c17ad94SBram Moolenaar    enddef
12904c17ad94SBram Moolenaar  END
129103afdcf1SBram Moolenaar  let withno_lines =<< trim END
12924c17ad94SBram Moolenaar    def FuncNo(): string
12934c17ad94SBram Moolenaar      return 'no'
12944c17ad94SBram Moolenaar    enddef
12954c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
12964c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
12974c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
129803afdcf1SBram Moolenaar    enddef
129903afdcf1SBram Moolenaar  END
130003afdcf1SBram Moolenaar  let nono_lines =<< trim END
130103afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
130203afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
13034c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
13044c17ad94SBram Moolenaar    enddef
13054c17ad94SBram Moolenaar  END
13064c17ad94SBram Moolenaar
13074c17ad94SBram Moolenaar  # FuncNo() is defined
130803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13094c17ad94SBram Moolenaar  source Xreloaded.vim
13104c17ad94SBram Moolenaar  g:DoCheck(true)
13114c17ad94SBram Moolenaar
13124c17ad94SBram Moolenaar  # FuncNo() is not redefined
131303afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
13144c17ad94SBram Moolenaar  source Xreloaded.vim
131503afdcf1SBram Moolenaar  g:DoCheck()
13164c17ad94SBram Moolenaar
13174c17ad94SBram Moolenaar  # FuncNo() is back
131803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13194c17ad94SBram Moolenaar  source Xreloaded.vim
132003afdcf1SBram Moolenaar  g:DoCheck()
13214c17ad94SBram Moolenaar
13224c17ad94SBram Moolenaar  delete('Xreloaded.vim')
13234c17ad94SBram Moolenaarenddef
13244c17ad94SBram Moolenaar
132589483d40SBram Moolenaardef Test_vim9script_reload_delvar()
132689483d40SBram Moolenaar  # write the script with a script-local variable
132789483d40SBram Moolenaar  let lines =<< trim END
132889483d40SBram Moolenaar    vim9script
132989483d40SBram Moolenaar    let var = 'string'
133089483d40SBram Moolenaar  END
133189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
133289483d40SBram Moolenaar  source XreloadVar.vim
133389483d40SBram Moolenaar
133489483d40SBram Moolenaar  # now write the script using the same variable locally - works
133589483d40SBram Moolenaar  lines =<< trim END
133689483d40SBram Moolenaar    vim9script
133789483d40SBram Moolenaar    def Func()
133889483d40SBram Moolenaar      let var = 'string'
133989483d40SBram Moolenaar    enddef
134089483d40SBram Moolenaar  END
134189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
134289483d40SBram Moolenaar  source XreloadVar.vim
134389483d40SBram Moolenaar
134489483d40SBram Moolenaar  delete('XreloadVar.vim')
134589483d40SBram Moolenaarenddef
134689483d40SBram Moolenaar
13478a7d6542SBram Moolenaardef Test_import_absolute()
13488a7d6542SBram Moolenaar  let import_lines = [
1349e6085c53SBram Moolenaar        'vim9script',
1350e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1351e6085c53SBram Moolenaar        'def UseExported()',
1352e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1353e6085c53SBram Moolenaar        '  exported = 8888',
1354e6085c53SBram Moolenaar        '  g:imported_after = exported',
1355e6085c53SBram Moolenaar        'enddef',
1356e6085c53SBram Moolenaar        'UseExported()',
1357e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1358e6085c53SBram Moolenaar        ]
13598a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
13608a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
13618a7d6542SBram Moolenaar
13628a7d6542SBram Moolenaar  source Ximport_abs.vim
13638a7d6542SBram Moolenaar
13648a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
13654e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1366675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1367675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1368675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1369675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1370675f716eSBram Moolenaar          'exported = 8888.*' ..
1371675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1372675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1373675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1374675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1375e6085c53SBram Moolenaar        g:import_disassembled)
13768a7d6542SBram Moolenaar  unlet g:imported_abs
13774e12a5dfSBram Moolenaar  unlet g:import_disassembled
13788a7d6542SBram Moolenaar
13798a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
13808a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
13818a7d6542SBram Moolenaarenddef
13828a7d6542SBram Moolenaar
13838a7d6542SBram Moolenaardef Test_import_rtp()
13848a7d6542SBram Moolenaar  let import_lines = [
1385e6085c53SBram Moolenaar        'vim9script',
1386e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1387e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1388e6085c53SBram Moolenaar        ]
13898a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
13908a7d6542SBram Moolenaar  mkdir('import')
13918a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
13928a7d6542SBram Moolenaar
13938a7d6542SBram Moolenaar  let save_rtp = &rtp
13948a7d6542SBram Moolenaar  &rtp = getcwd()
13958a7d6542SBram Moolenaar  source Ximport_rtp.vim
13968a7d6542SBram Moolenaar  &rtp = save_rtp
13978a7d6542SBram Moolenaar
13988a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
13998a7d6542SBram Moolenaar  unlet g:imported_rtp
14008a7d6542SBram Moolenaar
14018a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
140289483d40SBram Moolenaar  delete('import', 'rf')
14038a7d6542SBram Moolenaarenddef
14048a7d6542SBram Moolenaar
140525e0f586SBram Moolenaardef Test_import_compile_error()
140625e0f586SBram Moolenaar  let export_lines = [
140725e0f586SBram Moolenaar        'vim9script',
140825e0f586SBram Moolenaar        'export def ExpFunc(): string',
140925e0f586SBram Moolenaar        '  return notDefined',
141025e0f586SBram Moolenaar        'enddef',
141125e0f586SBram Moolenaar        ]
141225e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
141325e0f586SBram Moolenaar
141425e0f586SBram Moolenaar  let import_lines = [
141525e0f586SBram Moolenaar        'vim9script',
141625e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
141725e0f586SBram Moolenaar        'def ImpFunc()',
141825e0f586SBram Moolenaar        '  echo ExpFunc()',
141925e0f586SBram Moolenaar        'enddef',
142025e0f586SBram Moolenaar        'defcompile',
142125e0f586SBram Moolenaar        ]
142225e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
142325e0f586SBram Moolenaar
142425e0f586SBram Moolenaar  try
142525e0f586SBram Moolenaar    source Ximport.vim
142625e0f586SBram Moolenaar  catch /E1001/
1427f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
142825e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
142925e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
143025e0f586SBram Moolenaar  endtry
143125e0f586SBram Moolenaar
143225e0f586SBram Moolenaar  delete('Xexported.vim')
143325e0f586SBram Moolenaar  delete('Ximport.vim')
143425e0f586SBram Moolenaarenddef
143525e0f586SBram Moolenaar
14368a7d6542SBram Moolenaardef Test_fixed_size_list()
1437f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
14388a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
14398a7d6542SBram Moolenaar  l->remove(0)
14408a7d6542SBram Moolenaar  l->add(5)
14418a7d6542SBram Moolenaar  l->insert(99, 1)
14420f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
14438a7d6542SBram Moolenaarenddef
14448a7d6542SBram Moolenaar
1445158906cfSBram Moolenaardef IfElse(what: number): string
1446158906cfSBram Moolenaar  let res = ''
1447158906cfSBram Moolenaar  if what == 1
1448158906cfSBram Moolenaar    res = "one"
1449158906cfSBram Moolenaar  elseif what == 2
1450158906cfSBram Moolenaar    res = "two"
1451a259d8d3SBram Moolenaar  else
1452158906cfSBram Moolenaar    res = "three"
1453a259d8d3SBram Moolenaar  endif
1454158906cfSBram Moolenaar  return res
1455a259d8d3SBram Moolenaarenddef
1456a259d8d3SBram Moolenaar
1457158906cfSBram Moolenaardef Test_if_elseif_else()
1458158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1459158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1460158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
14610f18b6d1SBram Moolenaarenddef
14620f18b6d1SBram Moolenaar
1463e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1464e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1465e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1466e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1467e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1468585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1469e8c4abbbSBram Moolenaarenddef
1470e8c4abbbSBram Moolenaar
14716d69bf60SBram Moolenaarlet g:bool_true = v:true
14726d69bf60SBram Moolenaarlet g:bool_false = v:false
14736d69bf60SBram Moolenaar
14746d69bf60SBram Moolenaardef Test_if_const_expr()
14756d69bf60SBram Moolenaar  let res = false
14766d69bf60SBram Moolenaar  if true ? true : false
14776d69bf60SBram Moolenaar    res = true
14786d69bf60SBram Moolenaar  endif
14796d69bf60SBram Moolenaar  assert_equal(true, res)
14806d69bf60SBram Moolenaar
1481585fea7bSBram Moolenaar  g:glob = 2
1482585fea7bSBram Moolenaar  if false
14836797966dSBram Moolenaar    execute('g:glob = 3')
1484585fea7bSBram Moolenaar  endif
1485585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1486585fea7bSBram Moolenaar  if true
14876797966dSBram Moolenaar    execute('g:glob = 3')
1488585fea7bSBram Moolenaar  endif
1489585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1490585fea7bSBram Moolenaar
14916d69bf60SBram Moolenaar  res = false
14926d69bf60SBram Moolenaar  if g:bool_true ? true : false
14936d69bf60SBram Moolenaar    res = true
14946d69bf60SBram Moolenaar  endif
14956d69bf60SBram Moolenaar  assert_equal(true, res)
14966d69bf60SBram Moolenaar
14976d69bf60SBram Moolenaar  res = false
14986d69bf60SBram Moolenaar  if true ? g:bool_true : false
14996d69bf60SBram Moolenaar    res = true
15006d69bf60SBram Moolenaar  endif
15016d69bf60SBram Moolenaar  assert_equal(true, res)
15026d69bf60SBram Moolenaar
15036d69bf60SBram Moolenaar  res = false
15046d69bf60SBram Moolenaar  if true ? true : g:bool_false
15056d69bf60SBram Moolenaar    res = true
15066d69bf60SBram Moolenaar  endif
15076d69bf60SBram Moolenaar  assert_equal(true, res)
15086d69bf60SBram Moolenaar
15096d69bf60SBram Moolenaar  res = false
15106d69bf60SBram Moolenaar  if true ? false : true
15116d69bf60SBram Moolenaar    res = true
15126d69bf60SBram Moolenaar  endif
15136d69bf60SBram Moolenaar  assert_equal(false, res)
15146d69bf60SBram Moolenaar
15156d69bf60SBram Moolenaar  res = false
15166d69bf60SBram Moolenaar  if false ? false : true
15176d69bf60SBram Moolenaar    res = true
15186d69bf60SBram Moolenaar  endif
15196d69bf60SBram Moolenaar  assert_equal(true, res)
15206d69bf60SBram Moolenaar
15216d69bf60SBram Moolenaar  res = false
15226d69bf60SBram Moolenaar  if false ? true : false
15236d69bf60SBram Moolenaar    res = true
15246d69bf60SBram Moolenaar  endif
15256d69bf60SBram Moolenaar  assert_equal(false, res)
15266d69bf60SBram Moolenaar
15276d69bf60SBram Moolenaar  res = false
1528e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1529e8c4abbbSBram Moolenaar    res = true
1530e8c4abbbSBram Moolenaar  endif
1531e8c4abbbSBram Moolenaar  assert_equal(false, res)
1532e8c4abbbSBram Moolenaar
1533e8c4abbbSBram Moolenaar  res = false
15346d69bf60SBram Moolenaar  if true && true
15356d69bf60SBram Moolenaar    res = true
15366d69bf60SBram Moolenaar  endif
15376d69bf60SBram Moolenaar  assert_equal(true, res)
15386d69bf60SBram Moolenaar
15396d69bf60SBram Moolenaar  res = false
15406d69bf60SBram Moolenaar  if true && false
15416d69bf60SBram Moolenaar    res = true
15426d69bf60SBram Moolenaar  endif
15436d69bf60SBram Moolenaar  assert_equal(false, res)
15446d69bf60SBram Moolenaar
15456d69bf60SBram Moolenaar  res = false
15466d69bf60SBram Moolenaar  if g:bool_true && false
15476d69bf60SBram Moolenaar    res = true
15486d69bf60SBram Moolenaar  endif
15496d69bf60SBram Moolenaar  assert_equal(false, res)
15506d69bf60SBram Moolenaar
15516d69bf60SBram Moolenaar  res = false
15526d69bf60SBram Moolenaar  if true && g:bool_false
15536d69bf60SBram Moolenaar    res = true
15546d69bf60SBram Moolenaar  endif
15556d69bf60SBram Moolenaar  assert_equal(false, res)
15566d69bf60SBram Moolenaar
15576d69bf60SBram Moolenaar  res = false
15586d69bf60SBram Moolenaar  if false && false
15596d69bf60SBram Moolenaar    res = true
15606d69bf60SBram Moolenaar  endif
15616d69bf60SBram Moolenaar  assert_equal(false, res)
15626d69bf60SBram Moolenaar
15636d69bf60SBram Moolenaar  res = false
15646d69bf60SBram Moolenaar  if true || false
15656d69bf60SBram Moolenaar    res = true
15666d69bf60SBram Moolenaar  endif
15676d69bf60SBram Moolenaar  assert_equal(true, res)
15686d69bf60SBram Moolenaar
15696d69bf60SBram Moolenaar  res = false
15706d69bf60SBram Moolenaar  if g:bool_true || false
15716d69bf60SBram Moolenaar    res = true
15726d69bf60SBram Moolenaar  endif
15736d69bf60SBram Moolenaar  assert_equal(true, res)
15746d69bf60SBram Moolenaar
15756d69bf60SBram Moolenaar  res = false
15766d69bf60SBram Moolenaar  if true || g:bool_false
15776d69bf60SBram Moolenaar    res = true
15786d69bf60SBram Moolenaar  endif
15796d69bf60SBram Moolenaar  assert_equal(true, res)
15806d69bf60SBram Moolenaar
15816d69bf60SBram Moolenaar  res = false
15826d69bf60SBram Moolenaar  if false || false
15836d69bf60SBram Moolenaar    res = true
15846d69bf60SBram Moolenaar  endif
15856d69bf60SBram Moolenaar  assert_equal(false, res)
158680c34ca3SBram Moolenaarenddef
15876d69bf60SBram Moolenaar
158880c34ca3SBram Moolenaardef Test_if_const_expr_fails()
158980c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
159080c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1591e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1592e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
15936d69bf60SBram Moolenaarenddef
15946d69bf60SBram Moolenaar
159572abcf42SBram Moolenaardef RunNested(i: number): number
159672abcf42SBram Moolenaar  let x: number = 0
159772abcf42SBram Moolenaar  if i % 2
159872abcf42SBram Moolenaar    if 1
1599f5be8cdbSBram Moolenaar      # comment
160072abcf42SBram Moolenaar    else
1601f5be8cdbSBram Moolenaar      # comment
160272abcf42SBram Moolenaar    endif
160372abcf42SBram Moolenaar    x += 1
160472abcf42SBram Moolenaar  else
160572abcf42SBram Moolenaar    x += 1000
160672abcf42SBram Moolenaar  endif
160772abcf42SBram Moolenaar  return x
160872abcf42SBram Moolenaarenddef
160972abcf42SBram Moolenaar
161072abcf42SBram Moolenaardef Test_nested_if()
161172abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
161272abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
161372abcf42SBram Moolenaarenddef
161472abcf42SBram Moolenaar
1615ad39c094SBram Moolenaardef Test_execute_cmd()
1616ad39c094SBram Moolenaar  new
1617ad39c094SBram Moolenaar  setline(1, 'default')
1618ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1619ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1620a72cfb80SBram Moolenaar
1621a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1622a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1623a72cfb80SBram Moolenaar
1624ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1625ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1626a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1627ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1628a72cfb80SBram Moolenaar
1629ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1630ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1631a72cfb80SBram Moolenaar
1632ad39c094SBram Moolenaar  let cmd_first = 'call '
1633ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1634ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1635ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1636ad39c094SBram Moolenaar  bwipe!
1637585fea7bSBram Moolenaar
1638585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1639a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1640ad39c094SBram Moolenaarenddef
1641ad39c094SBram Moolenaar
164247e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1643f5be8cdbSBram Moolenaar  # only checks line continuation
164447e880d6SBram Moolenaar  let lines =<< trim END
164547e880d6SBram Moolenaar      vim9script
164647e880d6SBram Moolenaar      execute 'g:someVar'
164747e880d6SBram Moolenaar                .. ' = ' ..
164847e880d6SBram Moolenaar                   '28'
164947e880d6SBram Moolenaar      assert_equal(28, g:someVar)
165047e880d6SBram Moolenaar      unlet g:someVar
165147e880d6SBram Moolenaar  END
165247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
165347e880d6SBram Moolenaarenddef
165447e880d6SBram Moolenaar
1655ad39c094SBram Moolenaardef Test_echo_cmd()
1656a72cfb80SBram Moolenaar  echo 'some' # comment
1657585fea7bSBram Moolenaar  echon 'thing'
1658ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1659ad39c094SBram Moolenaar
1660a72cfb80SBram Moolenaar  echo "some" # comment
1661a72cfb80SBram Moolenaar  echon "thing"
1662a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1663a72cfb80SBram Moolenaar
1664ad39c094SBram Moolenaar  let str1 = 'some'
1665ad39c094SBram Moolenaar  let str2 = 'more'
1666ad39c094SBram Moolenaar  echo str1 str2
1667ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1668a72cfb80SBram Moolenaar
1669a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1670ad39c094SBram Moolenaarenddef
1671ad39c094SBram Moolenaar
1672f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1673f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1674f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1675f93c7feaSBram Moolenaar  echo 'clear'
1676df069eecSBram Moolenaar  :1messages
1677f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1678f93c7feaSBram Moolenaar
1679f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1680f93c7feaSBram Moolenaarenddef
1681f93c7feaSBram Moolenaar
168247e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1683f5be8cdbSBram Moolenaar  # only checks line continuation
168447e880d6SBram Moolenaar  let lines =<< trim END
168547e880d6SBram Moolenaar      vim9script
168647e880d6SBram Moolenaar      echomsg 'here'
168747e880d6SBram Moolenaar                .. ' is ' ..
168847e880d6SBram Moolenaar                   'a message'
168947e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
169047e880d6SBram Moolenaar  END
169147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
169247e880d6SBram Moolenaarenddef
169347e880d6SBram Moolenaar
1694f93c7feaSBram Moolenaardef Test_echoerr_cmd()
169540ee466cSBram Moolenaar  try
169640ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
169740ee466cSBram Moolenaar  catch
169840ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
169940ee466cSBram Moolenaar  endtry
1700f93c7feaSBram Moolenaarenddef
1701f93c7feaSBram Moolenaar
170247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1703f5be8cdbSBram Moolenaar  # only checks line continuation
170447e880d6SBram Moolenaar  let lines =<< trim END
170547e880d6SBram Moolenaar      vim9script
170647e880d6SBram Moolenaar      try
170747e880d6SBram Moolenaar        echoerr 'this'
170847e880d6SBram Moolenaar                .. ' is ' ..
170947e880d6SBram Moolenaar                   'wrong'
171047e880d6SBram Moolenaar      catch
171147e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
171247e880d6SBram Moolenaar      endtry
171347e880d6SBram Moolenaar  END
171447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
171547e880d6SBram Moolenaarenddef
171647e880d6SBram Moolenaar
171741fe0617SBram Moolenaardef Test_for_outside_of_function()
171841fe0617SBram Moolenaar  let lines =<< trim END
171941fe0617SBram Moolenaar    vim9script
172041fe0617SBram Moolenaar    new
172141fe0617SBram Moolenaar    for var in range(0, 3)
172241fe0617SBram Moolenaar      append(line('$'), var)
172341fe0617SBram Moolenaar    endfor
172441fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
172541fe0617SBram Moolenaar    bwipe!
172641fe0617SBram Moolenaar  END
172741fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
172841fe0617SBram Moolenaar  source Xvim9for.vim
172941fe0617SBram Moolenaar  delete('Xvim9for.vim')
173041fe0617SBram Moolenaarenddef
17318a7d6542SBram Moolenaar
1732e8c4abbbSBram Moolenaardef Test_for_loop()
1733e8c4abbbSBram Moolenaar  let result = ''
1734e8c4abbbSBram Moolenaar  for cnt in range(7)
1735e8c4abbbSBram Moolenaar    if cnt == 4
1736e8c4abbbSBram Moolenaar      break
1737e8c4abbbSBram Moolenaar    endif
1738e8c4abbbSBram Moolenaar    if cnt == 2
1739e8c4abbbSBram Moolenaar      continue
1740e8c4abbbSBram Moolenaar    endif
1741e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1742e8c4abbbSBram Moolenaar  endfor
1743e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
17440ad3e894SBram Moolenaar
17450ad3e894SBram Moolenaar  let concat = ''
17460ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
17470ad3e894SBram Moolenaar    concat ..= str
17480ad3e894SBram Moolenaar  endfor
17490ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1750e8c4abbbSBram Moolenaarenddef
1751e8c4abbbSBram Moolenaar
1752e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1753675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1754675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1755675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1756822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
17570ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
1758675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1759675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1760675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1761e8c4abbbSBram Moolenaarenddef
1762e8c4abbbSBram Moolenaar
1763d0df1aacSBram Moolenaardef Test_while_loop()
1764d0df1aacSBram Moolenaar  let result = ''
1765d0df1aacSBram Moolenaar  let cnt = 0
1766d0df1aacSBram Moolenaar  while cnt < 555
1767d0df1aacSBram Moolenaar    if cnt == 3
1768d0df1aacSBram Moolenaar      break
1769d0df1aacSBram Moolenaar    endif
1770d0df1aacSBram Moolenaar    cnt += 1
1771d0df1aacSBram Moolenaar    if cnt == 2
1772d0df1aacSBram Moolenaar      continue
1773d0df1aacSBram Moolenaar    endif
1774d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1775d0df1aacSBram Moolenaar  endwhile
1776d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1777d0df1aacSBram Moolenaarenddef
1778d0df1aacSBram Moolenaar
1779e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1780675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1781675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1782675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1783675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1784675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1785675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1786675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1787bd5da371SBram Moolenaarenddef
1788bd5da371SBram Moolenaar
17899645e2d9SBram Moolenaardef Test_interrupt_loop()
179097acfc78SBram Moolenaar  let caught = false
17919645e2d9SBram Moolenaar  let x = 0
179297acfc78SBram Moolenaar  try
17939645e2d9SBram Moolenaar    while 1
17949645e2d9SBram Moolenaar      x += 1
17959645e2d9SBram Moolenaar      if x == 100
17969645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
17979645e2d9SBram Moolenaar      endif
17989645e2d9SBram Moolenaar    endwhile
179997acfc78SBram Moolenaar  catch
180097acfc78SBram Moolenaar    caught = true
180197acfc78SBram Moolenaar    assert_equal(100, x)
180297acfc78SBram Moolenaar  endtry
180397acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
18049645e2d9SBram Moolenaarenddef
180520431c9dSBram Moolenaar
18064fdae999SBram Moolenaardef Test_automatic_line_continuation()
18074fdae999SBram Moolenaar  let mylist = [
18084fdae999SBram Moolenaar      'one',
18094fdae999SBram Moolenaar      'two',
18104fdae999SBram Moolenaar      'three',
1811f5be8cdbSBram Moolenaar      ] # comment
18124fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
18134fdae999SBram Moolenaar
18144fdae999SBram Moolenaar  let mydict = {
18154fdae999SBram Moolenaar      'one': 1,
18164fdae999SBram Moolenaar      'two': 2,
18174fdae999SBram Moolenaar      'three':
18184fdae999SBram Moolenaar          3,
1819f5be8cdbSBram Moolenaar      } # comment
18204fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
18214fdae999SBram Moolenaar  mydict = #{
18222c330432SBram Moolenaar      one: 1,  # comment
18232c330432SBram Moolenaar      two:     # comment
18242c330432SBram Moolenaar           2,  # comment
18252c330432SBram Moolenaar      three: 3 # comment
18262c330432SBram Moolenaar      }
18272c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
18282c330432SBram Moolenaar  mydict = #{
18292c330432SBram Moolenaar      one: 1,
18304fdae999SBram Moolenaar      two:
18314fdae999SBram Moolenaar           2,
18322c330432SBram Moolenaar      three: 3
18334fdae999SBram Moolenaar      }
18344fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1835e6085c53SBram Moolenaar
1836e6085c53SBram Moolenaar  assert_equal(
1837e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1838e6085c53SBram Moolenaar        split('one two three')
1839e6085c53SBram Moolenaar        )
18404fdae999SBram Moolenaarenddef
18414fdae999SBram Moolenaar
18427a092245SBram Moolenaardef Test_vim9_comment()
18437a092245SBram Moolenaar  CheckScriptSuccess([
18447a092245SBram Moolenaar      'vim9script',
18457a092245SBram Moolenaar      '# something',
18467a092245SBram Moolenaar      ])
18477a092245SBram Moolenaar  CheckScriptFailure([
18487a092245SBram Moolenaar      'vim9script',
18497a092245SBram Moolenaar      ':# something',
18507a092245SBram Moolenaar      ], 'E488:')
18517a092245SBram Moolenaar  CheckScriptFailure([
18527a092245SBram Moolenaar      '# something',
18537a092245SBram Moolenaar      ], 'E488:')
18547a092245SBram Moolenaar  CheckScriptFailure([
18557a092245SBram Moolenaar      ':# something',
18567a092245SBram Moolenaar      ], 'E488:')
18577a092245SBram Moolenaar
18584a8d9f2eSBram Moolenaar  { # block start
18594a8d9f2eSBram Moolenaar  } # block end
18604a8d9f2eSBram Moolenaar  CheckDefFailure([
18614a8d9f2eSBram Moolenaar      '{# comment',
18624a8d9f2eSBram Moolenaar      ], 'E488:')
18634a8d9f2eSBram Moolenaar  CheckDefFailure([
18644a8d9f2eSBram Moolenaar      '{',
18654a8d9f2eSBram Moolenaar      '}# comment',
18664a8d9f2eSBram Moolenaar      ], 'E488:')
18674a8d9f2eSBram Moolenaar
18684a8d9f2eSBram Moolenaar  echo "yes" # comment
18694a8d9f2eSBram Moolenaar  CheckDefFailure([
18704a8d9f2eSBram Moolenaar      'echo "yes"# comment',
18714a8d9f2eSBram Moolenaar      ], 'E488:')
18727a092245SBram Moolenaar  CheckScriptSuccess([
18737a092245SBram Moolenaar      'vim9script',
18747a092245SBram Moolenaar      'echo "yes" # something',
18757a092245SBram Moolenaar      ])
18767a092245SBram Moolenaar  CheckScriptFailure([
18777a092245SBram Moolenaar      'vim9script',
18787a092245SBram Moolenaar      'echo "yes"# something',
18797a092245SBram Moolenaar      ], 'E121:')
18807a092245SBram Moolenaar  CheckScriptFailure([
18817a092245SBram Moolenaar      'vim9script',
18827a092245SBram Moolenaar      'echo# something',
18837a092245SBram Moolenaar      ], 'E121:')
18847a092245SBram Moolenaar  CheckScriptFailure([
18857a092245SBram Moolenaar      'echo "yes" # something',
18867a092245SBram Moolenaar      ], 'E121:')
18877a092245SBram Moolenaar
18884a8d9f2eSBram Moolenaar  exe "echo" # comment
18894a8d9f2eSBram Moolenaar  CheckDefFailure([
18904a8d9f2eSBram Moolenaar      'exe "echo"# comment',
18914a8d9f2eSBram Moolenaar      ], 'E488:')
18924a8d9f2eSBram Moolenaar  CheckScriptSuccess([
18934a8d9f2eSBram Moolenaar      'vim9script',
18944a8d9f2eSBram Moolenaar      'exe "echo" # something',
18954a8d9f2eSBram Moolenaar      ])
18964a8d9f2eSBram Moolenaar  CheckScriptFailure([
18974a8d9f2eSBram Moolenaar      'vim9script',
18984a8d9f2eSBram Moolenaar      'exe "echo"# something',
18994a8d9f2eSBram Moolenaar      ], 'E121:')
19004a8d9f2eSBram Moolenaar  CheckDefFailure([
19014a8d9f2eSBram Moolenaar      'exe # comment',
19024a8d9f2eSBram Moolenaar      ], 'E1015:')
19034a8d9f2eSBram Moolenaar  CheckScriptFailure([
19044a8d9f2eSBram Moolenaar      'vim9script',
19054a8d9f2eSBram Moolenaar      'exe# something',
19064a8d9f2eSBram Moolenaar      ], 'E121:')
19074a8d9f2eSBram Moolenaar  CheckScriptFailure([
19084a8d9f2eSBram Moolenaar      'exe "echo" # something',
19094a8d9f2eSBram Moolenaar      ], 'E121:')
19104a8d9f2eSBram Moolenaar
19117a092245SBram Moolenaar  CheckDefFailure([
19127a092245SBram Moolenaar      'try# comment',
19137a092245SBram Moolenaar      '  echo "yes"',
19147a092245SBram Moolenaar      'catch',
19157a092245SBram Moolenaar      'endtry',
19167a092245SBram Moolenaar      ], 'E488:')
19172c5ed4e3SBram Moolenaar  CheckScriptFailure([
19182c5ed4e3SBram Moolenaar      'vim9script',
19192c5ed4e3SBram Moolenaar      'try# comment',
19202c5ed4e3SBram Moolenaar      'echo "yes"',
19212c5ed4e3SBram Moolenaar      ], 'E488:')
19227a092245SBram Moolenaar  CheckDefFailure([
19237a092245SBram Moolenaar      'try',
1924a72cfb80SBram Moolenaar      '  throw#comment',
1925a72cfb80SBram Moolenaar      'catch',
1926a72cfb80SBram Moolenaar      'endtry',
1927a72cfb80SBram Moolenaar      ], 'E1015:')
1928a72cfb80SBram Moolenaar  CheckDefFailure([
1929a72cfb80SBram Moolenaar      'try',
1930a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1931a72cfb80SBram Moolenaar      'catch',
1932a72cfb80SBram Moolenaar      'endtry',
1933a72cfb80SBram Moolenaar      ], 'E488:')
1934a72cfb80SBram Moolenaar  CheckDefFailure([
1935a72cfb80SBram Moolenaar      'try',
19367a092245SBram Moolenaar      '  echo "yes"',
19377a092245SBram Moolenaar      'catch# comment',
19387a092245SBram Moolenaar      'endtry',
19397a092245SBram Moolenaar      ], 'E488:')
19402c5ed4e3SBram Moolenaar  CheckScriptFailure([
19412c5ed4e3SBram Moolenaar      'vim9script',
19422c5ed4e3SBram Moolenaar      'try',
19432c5ed4e3SBram Moolenaar      '  echo "yes"',
19442c5ed4e3SBram Moolenaar      'catch# comment',
19452c5ed4e3SBram Moolenaar      'endtry',
19462c5ed4e3SBram Moolenaar      ], 'E654:')
19472c5ed4e3SBram Moolenaar  CheckDefFailure([
19482c5ed4e3SBram Moolenaar      'try',
19492c5ed4e3SBram Moolenaar      '  echo "yes"',
19502c5ed4e3SBram Moolenaar      'catch /pat/# comment',
19512c5ed4e3SBram Moolenaar      'endtry',
19522c5ed4e3SBram Moolenaar      ], 'E488:')
19537a092245SBram Moolenaar  CheckDefFailure([
19547a092245SBram Moolenaar      'try',
19557a092245SBram Moolenaar      'echo "yes"',
19567a092245SBram Moolenaar      'catch',
19577a092245SBram Moolenaar      'endtry# comment',
19587a092245SBram Moolenaar      ], 'E488:')
19592c5ed4e3SBram Moolenaar  CheckScriptFailure([
19602c5ed4e3SBram Moolenaar      'vim9script',
19612c5ed4e3SBram Moolenaar      'try',
19622c5ed4e3SBram Moolenaar      '  echo "yes"',
19632c5ed4e3SBram Moolenaar      'catch',
19642c5ed4e3SBram Moolenaar      'endtry# comment',
19659b7bf9e9SBram Moolenaar      ], 'E488:')
19662c5ed4e3SBram Moolenaar
19672c5ed4e3SBram Moolenaar  CheckScriptSuccess([
19682c5ed4e3SBram Moolenaar      'vim9script',
19692c5ed4e3SBram Moolenaar      'hi # comment',
19702c5ed4e3SBram Moolenaar      ])
19712c5ed4e3SBram Moolenaar  CheckScriptFailure([
19722c5ed4e3SBram Moolenaar      'vim9script',
19732c5ed4e3SBram Moolenaar      'hi# comment',
19742c5ed4e3SBram Moolenaar      ], 'E416:')
19751966c248SBram Moolenaar  CheckScriptSuccess([
19761966c248SBram Moolenaar      'vim9script',
19771966c248SBram Moolenaar      'hi Search # comment',
19781966c248SBram Moolenaar      ])
19791966c248SBram Moolenaar  CheckScriptFailure([
19801966c248SBram Moolenaar      'vim9script',
19811966c248SBram Moolenaar      'hi Search# comment',
19821966c248SBram Moolenaar      ], 'E416:')
19831966c248SBram Moolenaar  CheckScriptSuccess([
19841966c248SBram Moolenaar      'vim9script',
19851966c248SBram Moolenaar      'hi link This Search # comment',
19861966c248SBram Moolenaar      ])
19871966c248SBram Moolenaar  CheckScriptFailure([
19881966c248SBram Moolenaar      'vim9script',
19891966c248SBram Moolenaar      'hi link This That# comment',
19901966c248SBram Moolenaar      ], 'E413:')
19911966c248SBram Moolenaar  CheckScriptSuccess([
19921966c248SBram Moolenaar      'vim9script',
19931966c248SBram Moolenaar      'hi clear This # comment',
19941966c248SBram Moolenaar      'hi clear # comment',
19951966c248SBram Moolenaar      ])
1996f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
1997f5be8cdbSBram Moolenaar  # hi clear This# comment',
19981966c248SBram Moolenaar  CheckScriptFailure([
19991966c248SBram Moolenaar      'vim9script',
20001966c248SBram Moolenaar      'hi clear# comment',
20011966c248SBram Moolenaar      ], 'E416:')
20021966c248SBram Moolenaar
20031966c248SBram Moolenaar  CheckScriptSuccess([
20041966c248SBram Moolenaar      'vim9script',
20051966c248SBram Moolenaar      'hi Group term=bold',
20061966c248SBram Moolenaar      'match Group /todo/ # comment',
20071966c248SBram Moolenaar      ])
20081966c248SBram Moolenaar  CheckScriptFailure([
20091966c248SBram Moolenaar      'vim9script',
20101966c248SBram Moolenaar      'hi Group term=bold',
20111966c248SBram Moolenaar      'match Group /todo/# comment',
20121966c248SBram Moolenaar      ], 'E488:')
20131966c248SBram Moolenaar  CheckScriptSuccess([
20141966c248SBram Moolenaar      'vim9script',
20151966c248SBram Moolenaar      'match # comment',
20161966c248SBram Moolenaar      ])
20171966c248SBram Moolenaar  CheckScriptFailure([
20181966c248SBram Moolenaar      'vim9script',
20191966c248SBram Moolenaar      'match# comment',
20201966c248SBram Moolenaar      ], 'E475:')
20211966c248SBram Moolenaar  CheckScriptSuccess([
20221966c248SBram Moolenaar      'vim9script',
20231966c248SBram Moolenaar      'match none # comment',
20241966c248SBram Moolenaar      ])
20251966c248SBram Moolenaar  CheckScriptFailure([
20261966c248SBram Moolenaar      'vim9script',
20271966c248SBram Moolenaar      'match none# comment',
20281966c248SBram Moolenaar      ], 'E475:')
20291966c248SBram Moolenaar
20301966c248SBram Moolenaar  CheckScriptSuccess([
20311966c248SBram Moolenaar      'vim9script',
20321966c248SBram Moolenaar      'menutrans clear # comment',
20331966c248SBram Moolenaar      ])
20341966c248SBram Moolenaar  CheckScriptFailure([
20351966c248SBram Moolenaar      'vim9script',
20361966c248SBram Moolenaar      'menutrans clear# comment text',
20371966c248SBram Moolenaar      ], 'E474:')
20381966c248SBram Moolenaar
20391966c248SBram Moolenaar  CheckScriptSuccess([
20401966c248SBram Moolenaar      'vim9script',
20411966c248SBram Moolenaar      'syntax clear # comment',
20421966c248SBram Moolenaar      ])
20431966c248SBram Moolenaar  CheckScriptFailure([
20441966c248SBram Moolenaar      'vim9script',
20451966c248SBram Moolenaar      'syntax clear# comment text',
20461966c248SBram Moolenaar      ], 'E28:')
20471966c248SBram Moolenaar  CheckScriptSuccess([
20481966c248SBram Moolenaar      'vim9script',
20491966c248SBram Moolenaar      'syntax keyword Word some',
20501966c248SBram Moolenaar      'syntax clear Word # comment',
20511966c248SBram Moolenaar      ])
20521966c248SBram Moolenaar  CheckScriptFailure([
20531966c248SBram Moolenaar      'vim9script',
20541966c248SBram Moolenaar      'syntax keyword Word some',
20551966c248SBram Moolenaar      'syntax clear Word# comment text',
20561966c248SBram Moolenaar      ], 'E28:')
20571966c248SBram Moolenaar
20581966c248SBram Moolenaar  CheckScriptSuccess([
20591966c248SBram Moolenaar      'vim9script',
20601966c248SBram Moolenaar      'syntax list # comment',
20611966c248SBram Moolenaar      ])
20621966c248SBram Moolenaar  CheckScriptFailure([
20631966c248SBram Moolenaar      'vim9script',
20641966c248SBram Moolenaar      'syntax list# comment text',
20651966c248SBram Moolenaar      ], 'E28:')
20661966c248SBram Moolenaar
20671966c248SBram Moolenaar  CheckScriptSuccess([
20681966c248SBram Moolenaar      'vim9script',
20691966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
20701966c248SBram Moolenaar      ])
20711966c248SBram Moolenaar  CheckScriptFailure([
20721966c248SBram Moolenaar      'vim9script',
20731966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
20741966c248SBram Moolenaar      ], 'E475:')
20751966c248SBram Moolenaar
20761966c248SBram Moolenaar  CheckScriptSuccess([
20771966c248SBram Moolenaar      'vim9script',
20781966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
20791966c248SBram Moolenaar      ])
20801966c248SBram Moolenaar  CheckScriptFailure([
20811966c248SBram Moolenaar      'vim9script',
20821966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
20831966c248SBram Moolenaar      ], 'E789:')
20841966c248SBram Moolenaar
20851966c248SBram Moolenaar  CheckScriptSuccess([
20861966c248SBram Moolenaar      'vim9script',
20871966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
20881966c248SBram Moolenaar      ])
20891966c248SBram Moolenaar  CheckScriptFailure([
20901966c248SBram Moolenaar      'vim9script',
20911966c248SBram Moolenaar      'syntax match Word /pat/# comment',
20921966c248SBram Moolenaar      ], 'E402:')
20931966c248SBram Moolenaar
20941966c248SBram Moolenaar  CheckScriptSuccess([
20951966c248SBram Moolenaar      'vim9script',
20961966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
20971966c248SBram Moolenaar      ])
20981966c248SBram Moolenaar  CheckScriptFailure([
20991966c248SBram Moolenaar      'vim9script',
21001966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
21011966c248SBram Moolenaar      ], 'E475:')
21021966c248SBram Moolenaar  CheckScriptFailure([
21031966c248SBram Moolenaar      'vim9script',
21041966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
21051966c248SBram Moolenaar      ], 'E406:')
21061966c248SBram Moolenaar  CheckScriptFailure([
21071966c248SBram Moolenaar      'vim9script',
21081966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
21091966c248SBram Moolenaar      ], 'E475:')
21101966c248SBram Moolenaar
21111966c248SBram Moolenaar  CheckScriptSuccess([
21121966c248SBram Moolenaar      'vim9script',
21131966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
21141966c248SBram Moolenaar      ])
21151966c248SBram Moolenaar  CheckScriptFailure([
21161966c248SBram Moolenaar      'vim9script',
21171966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2118d032f34aSBram Moolenaar      ], 'E402:')
21191966c248SBram Moolenaar
21201966c248SBram Moolenaar  CheckScriptSuccess([
21211966c248SBram Moolenaar      'vim9script',
21221966c248SBram Moolenaar      'syntax sync # comment',
21231966c248SBram Moolenaar      ])
21241966c248SBram Moolenaar  CheckScriptFailure([
21251966c248SBram Moolenaar      'vim9script',
21261966c248SBram Moolenaar      'syntax sync# comment',
21271966c248SBram Moolenaar      ], 'E404:')
21281966c248SBram Moolenaar  CheckScriptSuccess([
21291966c248SBram Moolenaar      'vim9script',
21301966c248SBram Moolenaar      'syntax sync ccomment # comment',
21311966c248SBram Moolenaar      ])
21321966c248SBram Moolenaar  CheckScriptFailure([
21331966c248SBram Moolenaar      'vim9script',
21341966c248SBram Moolenaar      'syntax sync ccomment# comment',
21351966c248SBram Moolenaar      ], 'E404:')
21361966c248SBram Moolenaar
21371966c248SBram Moolenaar  CheckScriptSuccess([
21381966c248SBram Moolenaar      'vim9script',
21391966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
21401966c248SBram Moolenaar      ])
21411966c248SBram Moolenaar  CheckScriptFailure([
21421966c248SBram Moolenaar      'vim9script',
21431966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
21441966c248SBram Moolenaar      ], 'E475:')
2145a72cfb80SBram Moolenaar
2146a72cfb80SBram Moolenaar  CheckScriptSuccess([
2147a72cfb80SBram Moolenaar      'vim9script',
2148a72cfb80SBram Moolenaar      'command Echo echo # comment',
2149a72cfb80SBram Moolenaar      'command Echo # comment',
2150a72cfb80SBram Moolenaar      ])
2151a72cfb80SBram Moolenaar  CheckScriptFailure([
2152a72cfb80SBram Moolenaar      'vim9script',
2153a72cfb80SBram Moolenaar      'command Echo echo# comment',
2154a72cfb80SBram Moolenaar      'Echo',
2155a72cfb80SBram Moolenaar      ], 'E121:')
2156a72cfb80SBram Moolenaar  CheckScriptFailure([
2157a72cfb80SBram Moolenaar      'vim9script',
2158a72cfb80SBram Moolenaar      'command Echo# comment',
2159a72cfb80SBram Moolenaar      ], 'E182:')
2160a72cfb80SBram Moolenaar  CheckScriptFailure([
2161a72cfb80SBram Moolenaar      'vim9script',
2162a72cfb80SBram Moolenaar      'command Echo echo',
2163a72cfb80SBram Moolenaar      'command Echo# comment',
2164a72cfb80SBram Moolenaar      ], 'E182:')
2165a72cfb80SBram Moolenaar
2166a72cfb80SBram Moolenaar  CheckScriptSuccess([
2167a72cfb80SBram Moolenaar      'vim9script',
2168a72cfb80SBram Moolenaar      'function # comment',
2169a72cfb80SBram Moolenaar      ])
2170a72cfb80SBram Moolenaar  CheckScriptFailure([
2171a72cfb80SBram Moolenaar      'vim9script',
2172a72cfb80SBram Moolenaar      'function# comment',
2173a72cfb80SBram Moolenaar      ], 'E129:')
2174a72cfb80SBram Moolenaar  CheckScriptSuccess([
2175a72cfb80SBram Moolenaar      'vim9script',
2176a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2177a72cfb80SBram Moolenaar      ])
2178a72cfb80SBram Moolenaar  CheckScriptFailure([
2179a72cfb80SBram Moolenaar      'vim9script',
2180a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2181a72cfb80SBram Moolenaar      ], 'E488:')
2182a72cfb80SBram Moolenaar
2183a72cfb80SBram Moolenaar  CheckScriptSuccess([
2184a72cfb80SBram Moolenaar      'vim9script',
21854c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2186a72cfb80SBram Moolenaar      'endfunc',
21874c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2188a72cfb80SBram Moolenaar      ])
2189a72cfb80SBram Moolenaar  CheckScriptFailure([
2190a72cfb80SBram Moolenaar      'vim9script',
21914c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2192a72cfb80SBram Moolenaar      'endfunc',
21934c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2194a72cfb80SBram Moolenaar      ], 'E488:')
2195a72cfb80SBram Moolenaar
2196a72cfb80SBram Moolenaar  CheckScriptSuccess([
2197a72cfb80SBram Moolenaar      'vim9script',
2198a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2199a72cfb80SBram Moolenaar      ])
2200a72cfb80SBram Moolenaar  CheckScriptFailure([
2201a72cfb80SBram Moolenaar      'vim9script',
2202a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2203a72cfb80SBram Moolenaar      ], 'E488:')
2204e7e4838fSBram Moolenaar
2205e7e4838fSBram Moolenaar  CheckScriptFailure([
2206e7e4838fSBram Moolenaar      'def Test() " comment',
2207e7e4838fSBram Moolenaar      'enddef',
2208e7e4838fSBram Moolenaar      ], 'E488:')
2209e7e4838fSBram Moolenaar  CheckScriptFailure([
2210e7e4838fSBram Moolenaar      'vim9script',
2211e7e4838fSBram Moolenaar      'def Test() " comment',
2212e7e4838fSBram Moolenaar      'enddef',
2213e7e4838fSBram Moolenaar      ], 'E488:')
2214e7e4838fSBram Moolenaar
2215e7e4838fSBram Moolenaar  CheckScriptSuccess([
2216e7e4838fSBram Moolenaar      'func Test() " comment',
2217e7e4838fSBram Moolenaar      'endfunc',
2218e7e4838fSBram Moolenaar      ])
2219e7e4838fSBram Moolenaar  CheckScriptFailure([
2220e7e4838fSBram Moolenaar      'vim9script',
2221e7e4838fSBram Moolenaar      'func Test() " comment',
2222e7e4838fSBram Moolenaar      'endfunc',
2223e7e4838fSBram Moolenaar      ], 'E488:')
2224e7e4838fSBram Moolenaar
2225e7e4838fSBram Moolenaar  CheckScriptSuccess([
2226e7e4838fSBram Moolenaar      'def Test() # comment',
2227e7e4838fSBram Moolenaar      'enddef',
2228e7e4838fSBram Moolenaar      ])
2229e7e4838fSBram Moolenaar  CheckScriptFailure([
2230e7e4838fSBram Moolenaar      'func Test() # comment',
2231e7e4838fSBram Moolenaar      'endfunc',
2232e7e4838fSBram Moolenaar      ], 'E488:')
22332c5ed4e3SBram Moolenaarenddef
22342c5ed4e3SBram Moolenaar
22352c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
22362c5ed4e3SBram Moolenaar  CheckCanRunGui
22372c5ed4e3SBram Moolenaar
22382c5ed4e3SBram Moolenaar  CheckScriptFailure([
22392c5ed4e3SBram Moolenaar      'vim9script',
22402c5ed4e3SBram Moolenaar      'gui#comment'
22412c5ed4e3SBram Moolenaar      ], 'E499:')
22422c5ed4e3SBram Moolenaar  CheckScriptFailure([
22432c5ed4e3SBram Moolenaar      'vim9script',
22442c5ed4e3SBram Moolenaar      'gui -f#comment'
22452c5ed4e3SBram Moolenaar      ], 'E499:')
22467a092245SBram Moolenaarenddef
22477a092245SBram Moolenaar
2248a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
22496797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
22506797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2251a26b9700SBram Moolenaar
2252a26b9700SBram Moolenaar  edit test.vim
2253a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2254a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2255a26b9700SBram Moolenaar
2256a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2257a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2258a26b9700SBram Moolenaar
2259a26b9700SBram Moolenaar  g:entered = 0
2260a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2261a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2262a26b9700SBram Moolenaar
2263a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2264a26b9700SBram Moolenaar
2265a26b9700SBram Moolenaar  au! TabEnter
2266a26b9700SBram Moolenaar  unlet g:entered
2267d72c1bf0SBram Moolenaar
2268d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2269d72c1bf0SBram Moolenaar      'vim9script',
22706797966dSBram Moolenaar      'g:var = 123',
2271e55b1c09SBram Moolenaar      'b:var = 456',
2272e55b1c09SBram Moolenaar      'w:var = 777',
2273e55b1c09SBram Moolenaar      't:var = 888',
2274d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2275d72c1bf0SBram Moolenaar      ])
2276d72c1bf0SBram Moolenaar
2277d72c1bf0SBram Moolenaar  CheckScriptFailure([
2278d72c1bf0SBram Moolenaar      'vim9script',
2279d72c1bf0SBram Moolenaar      'let g:var = 123',
2280e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2281e55b1c09SBram Moolenaar
2282e55b1c09SBram Moolenaar  CheckScriptFailure([
2283e55b1c09SBram Moolenaar      'vim9script',
2284e55b1c09SBram Moolenaar      'let b:var = 123',
2285e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2286e55b1c09SBram Moolenaar
2287e55b1c09SBram Moolenaar  CheckScriptFailure([
2288e55b1c09SBram Moolenaar      'vim9script',
2289e55b1c09SBram Moolenaar      'let w:var = 123',
2290e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2291e55b1c09SBram Moolenaar
2292e55b1c09SBram Moolenaar  CheckScriptFailure([
2293e55b1c09SBram Moolenaar      'vim9script',
2294e55b1c09SBram Moolenaar      'let t:var = 123',
2295e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2296e55b1c09SBram Moolenaar
2297e55b1c09SBram Moolenaar  CheckScriptFailure([
2298e55b1c09SBram Moolenaar      'vim9script',
2299e55b1c09SBram Moolenaar      'let v:version = 123',
2300e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2301e55b1c09SBram Moolenaar
2302e55b1c09SBram Moolenaar  CheckScriptFailure([
2303e55b1c09SBram Moolenaar      'vim9script',
2304e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2305e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
23066797966dSBram Moolenaar
23076797966dSBram Moolenaar  CheckScriptFailure([
23086797966dSBram Moolenaar      'vim9script',
23096797966dSBram Moolenaar      'g:var = 123',
231032e35117SBram Moolenaar      'unlet g:var# comment1',
2311d72c1bf0SBram Moolenaar      ], 'E108:')
2312d72c1bf0SBram Moolenaar
2313d72c1bf0SBram Moolenaar  CheckScriptFailure([
2314d72c1bf0SBram Moolenaar      'let g:var = 123',
2315d72c1bf0SBram Moolenaar      'unlet g:var # something',
2316d72c1bf0SBram Moolenaar      ], 'E488:')
2317faac4104SBram Moolenaar
2318faac4104SBram Moolenaar  CheckScriptSuccess([
2319faac4104SBram Moolenaar      'vim9script',
232032e35117SBram Moolenaar      'if 1 # comment2',
2321faac4104SBram Moolenaar      '  echo "yes"',
2322faac4104SBram Moolenaar      'elseif 2 #comment',
2323faac4104SBram Moolenaar      '  echo "no"',
2324faac4104SBram Moolenaar      'endif',
2325faac4104SBram Moolenaar      ])
2326faac4104SBram Moolenaar
2327faac4104SBram Moolenaar  CheckScriptFailure([
2328faac4104SBram Moolenaar      'vim9script',
232932e35117SBram Moolenaar      'if 1# comment3',
2330faac4104SBram Moolenaar      '  echo "yes"',
2331faac4104SBram Moolenaar      'endif',
2332faac4104SBram Moolenaar      ], 'E15:')
2333faac4104SBram Moolenaar
2334faac4104SBram Moolenaar  CheckScriptFailure([
2335faac4104SBram Moolenaar      'vim9script',
233632e35117SBram Moolenaar      'if 0 # comment4',
2337faac4104SBram Moolenaar      '  echo "yes"',
2338faac4104SBram Moolenaar      'elseif 2#comment',
2339faac4104SBram Moolenaar      '  echo "no"',
2340faac4104SBram Moolenaar      'endif',
2341faac4104SBram Moolenaar      ], 'E15:')
2342faac4104SBram Moolenaar
2343faac4104SBram Moolenaar  CheckScriptSuccess([
2344faac4104SBram Moolenaar      'vim9script',
234532e35117SBram Moolenaar      'let v = 1 # comment5',
2346faac4104SBram Moolenaar      ])
2347faac4104SBram Moolenaar
2348faac4104SBram Moolenaar  CheckScriptFailure([
2349faac4104SBram Moolenaar      'vim9script',
235032e35117SBram Moolenaar      'let v = 1# comment6',
235132e35117SBram Moolenaar      ], 'E15:')
2352faac4104SBram Moolenaar
2353faac4104SBram Moolenaar  CheckScriptSuccess([
2354faac4104SBram Moolenaar      'vim9script',
2355faac4104SBram Moolenaar      'new'
2356faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2357df069eecSBram Moolenaar      ':$',
2358faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2359faac4104SBram Moolenaar      'bwipe!',
2360faac4104SBram Moolenaar      ])
2361faac4104SBram Moolenaar
2362f5be8cdbSBram Moolenaar  CheckScriptFailure([
2363f5be8cdbSBram Moolenaar      'vim9script',
2364f5be8cdbSBram Moolenaar      'new'
2365f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2366f5be8cdbSBram Moolenaar      ':$',
2367f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2368f5be8cdbSBram Moolenaar      'bwipe!',
2369f5be8cdbSBram Moolenaar      ], 'E488:')
2370f5be8cdbSBram Moolenaar
2371f5be8cdbSBram Moolenaar  CheckScriptFailure([
2372f5be8cdbSBram Moolenaar      'vim9script',
2373f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2374f5be8cdbSBram Moolenaar      ], 'E477:')
2375a26b9700SBram Moolenaarenddef
2376a26b9700SBram Moolenaar
23777e5bd91dSBram Moolenaardef Test_finish()
23787e5bd91dSBram Moolenaar  let lines =<< trim END
23797e5bd91dSBram Moolenaar    vim9script
23806797966dSBram Moolenaar    g:res = 'one'
23817e5bd91dSBram Moolenaar    if v:false | finish | endif
23826797966dSBram Moolenaar    g:res = 'two'
23837e5bd91dSBram Moolenaar    finish
23846797966dSBram Moolenaar    g:res = 'three'
23857e5bd91dSBram Moolenaar  END
23867e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
23877e5bd91dSBram Moolenaar  source Xfinished
23887e5bd91dSBram Moolenaar  assert_equal('two', g:res)
23897e5bd91dSBram Moolenaar
23907e5bd91dSBram Moolenaar  unlet g:res
23917e5bd91dSBram Moolenaar  delete('Xfinished')
23927e5bd91dSBram Moolenaarenddef
23937e5bd91dSBram Moolenaar
239432e35117SBram Moolenaardef Test_let_func_call()
239532e35117SBram Moolenaar  let lines =<< trim END
239632e35117SBram Moolenaar    vim9script
239732e35117SBram Moolenaar    func GetValue()
239832e35117SBram Moolenaar      if exists('g:count')
239932e35117SBram Moolenaar        let g:count += 1
240032e35117SBram Moolenaar      else
240132e35117SBram Moolenaar        let g:count = 1
240232e35117SBram Moolenaar      endif
240332e35117SBram Moolenaar      return 'this'
240432e35117SBram Moolenaar    endfunc
240532e35117SBram Moolenaar    let val: string = GetValue()
2406f5be8cdbSBram Moolenaar    # env var is always a string
2407df671b46SBram Moolenaar    let env = $TERM
240832e35117SBram Moolenaar  END
240932e35117SBram Moolenaar  writefile(lines, 'Xfinished')
241032e35117SBram Moolenaar  source Xfinished
2411f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
241232e35117SBram Moolenaar  assert_equal(1, g:count)
241332e35117SBram Moolenaar
241432e35117SBram Moolenaar  unlet g:count
241532e35117SBram Moolenaar  delete('Xfinished')
241632e35117SBram Moolenaarenddef
241732e35117SBram Moolenaar
241832e35117SBram Moolenaardef Test_let_missing_type()
241932e35117SBram Moolenaar  let lines =<< trim END
242032e35117SBram Moolenaar    vim9script
2421df671b46SBram Moolenaar    let var = g:unknown
2422227a69deSBram Moolenaar  END
2423822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2424227a69deSBram Moolenaar
2425227a69deSBram Moolenaar  lines =<< trim END
2426227a69deSBram Moolenaar    vim9script
2427227a69deSBram Moolenaar    let nr: number = 123
2428227a69deSBram Moolenaar    let var = nr
2429227a69deSBram Moolenaar  END
2430822ba247SBram Moolenaar  CheckScriptSuccess(lines)
243132e35117SBram Moolenaarenddef
243232e35117SBram Moolenaar
2433c82a5b5dSBram Moolenaardef Test_let_declaration()
2434c82a5b5dSBram Moolenaar  let lines =<< trim END
2435c82a5b5dSBram Moolenaar    vim9script
2436c82a5b5dSBram Moolenaar    let var: string
2437c82a5b5dSBram Moolenaar    g:var_uninit = var
2438c82a5b5dSBram Moolenaar    var = 'text'
2439c82a5b5dSBram Moolenaar    g:var_test = var
2440f5be8cdbSBram Moolenaar    # prefixing s: is optional
2441984dddbeSBram Moolenaar    s:var = 'prefixed'
2442984dddbeSBram Moolenaar    g:var_prefixed = s:var
2443984dddbeSBram Moolenaar
2444984dddbeSBram Moolenaar    let s:other: number
2445984dddbeSBram Moolenaar    other = 1234
2446984dddbeSBram Moolenaar    g:other_var = other
2447c82a5b5dSBram Moolenaar  END
2448c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2449c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2450c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2451984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2452984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2453c82a5b5dSBram Moolenaar
2454c82a5b5dSBram Moolenaar  unlet g:var_uninit
2455c82a5b5dSBram Moolenaar  unlet g:var_test
2456984dddbeSBram Moolenaar  unlet g:var_prefixed
2457984dddbeSBram Moolenaar  unlet g:other_var
2458c82a5b5dSBram Moolenaarenddef
2459c82a5b5dSBram Moolenaar
2460c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2461c5b1c20bSBram Moolenaar  let lines =<< trim END
2462c5b1c20bSBram Moolenaar    vim9script
2463c5b1c20bSBram Moolenaar    const var: string
2464c5b1c20bSBram Moolenaar  END
2465c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2466c5b1c20bSBram Moolenaar
2467c5b1c20bSBram Moolenaar  lines =<< trim END
2468c5b1c20bSBram Moolenaar    vim9script
2469c5b1c20bSBram Moolenaar    let 9var: string
2470c5b1c20bSBram Moolenaar  END
2471c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2472c5b1c20bSBram Moolenaarenddef
2473c5b1c20bSBram Moolenaar
247434db91f7SBram Moolenaardef Test_let_type_check()
247534db91f7SBram Moolenaar  let lines =<< trim END
247634db91f7SBram Moolenaar    vim9script
247734db91f7SBram Moolenaar    let var: string
247834db91f7SBram Moolenaar    var = 1234
247934db91f7SBram Moolenaar  END
248034db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2481984dddbeSBram Moolenaar
2482984dddbeSBram Moolenaar  lines =<< trim END
2483984dddbeSBram Moolenaar    vim9script
2484984dddbeSBram Moolenaar    let var:string
2485984dddbeSBram Moolenaar  END
2486984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2487c5b1c20bSBram Moolenaar
2488c5b1c20bSBram Moolenaar  lines =<< trim END
2489c5b1c20bSBram Moolenaar    vim9script
2490c5b1c20bSBram Moolenaar    let var: asdf
2491c5b1c20bSBram Moolenaar  END
2492c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
249334db91f7SBram Moolenaarenddef
249434db91f7SBram Moolenaar
2495a5d0077eSBram Moolenaardef Test_forward_declaration()
2496a5d0077eSBram Moolenaar  let lines =<< trim END
2497a5d0077eSBram Moolenaar    vim9script
2498a5d0077eSBram Moolenaar    def GetValue(): string
2499a5d0077eSBram Moolenaar      return theVal
2500a5d0077eSBram Moolenaar    enddef
2501a5d0077eSBram Moolenaar    let theVal = 'something'
2502822ba247SBram Moolenaar    g:initVal = GetValue()
2503a5d0077eSBram Moolenaar    theVal = 'else'
2504a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2505a5d0077eSBram Moolenaar  END
2506a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2507a5d0077eSBram Moolenaar  source Xforward
2508a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2509a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2510a5d0077eSBram Moolenaar
2511a5d0077eSBram Moolenaar  unlet g:initVal
2512a5d0077eSBram Moolenaar  unlet g:laterVal
2513a5d0077eSBram Moolenaar  delete('Xforward')
2514a5d0077eSBram Moolenaarenddef
2515a5d0077eSBram Moolenaar
25169721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
25179721fb4eSBram Moolenaar  let legacy_lines =<< trim END
25189721fb4eSBram Moolenaar    source Xvim9_script.vim
25199721fb4eSBram Moolenaar
25209721fb4eSBram Moolenaar    call assert_false(exists('local'))
25219721fb4eSBram Moolenaar    call assert_false(exists('exported'))
25229721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
25239721fb4eSBram Moolenaar    call assert_equal('global', global)
25249721fb4eSBram Moolenaar    call assert_equal('global', g:global)
25259721fb4eSBram Moolenaar
25269721fb4eSBram Moolenaar    " imported variable becomes script-local
25279721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
25289721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
25299721fb4eSBram Moolenaar    call assert_false(exists('exported'))
25309721fb4eSBram Moolenaar
25319721fb4eSBram Moolenaar    " imported function becomes script-local
25329721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
25339721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
25349721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
25359721fb4eSBram Moolenaar  END
25369721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
25379721fb4eSBram Moolenaar
25389721fb4eSBram Moolenaar  let vim9_lines =<< trim END
25399721fb4eSBram Moolenaar    vim9script
25409721fb4eSBram Moolenaar    let local = 'local'
25419721fb4eSBram Moolenaar    g:global = 'global'
25429721fb4eSBram Moolenaar    export let exported = 'exported'
25439721fb4eSBram Moolenaar    export def GetText(): string
25449721fb4eSBram Moolenaar       return 'text'
25459721fb4eSBram Moolenaar    enddef
25469721fb4eSBram Moolenaar  END
25479721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
25489721fb4eSBram Moolenaar
25499721fb4eSBram Moolenaar  source Xlegacy_script.vim
25509721fb4eSBram Moolenaar
25519721fb4eSBram Moolenaar  assert_equal('global', g:global)
2552f5be8cdbSBram Moolenaar  unlet g:global
25539721fb4eSBram Moolenaar
25549721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
25559721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
25569721fb4eSBram Moolenaarenddef
2557a5d0077eSBram Moolenaar
2558eeb27bfeSBram Moolenaardef Test_vim9_copen()
2559eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2560eeb27bfeSBram Moolenaar  copen
2561eeb27bfeSBram Moolenaar  quit
2562eeb27bfeSBram Moolenaarenddef
2563eeb27bfeSBram Moolenaar
2564585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2565585fea7bSBram Moolenaardef Test_substitute_cmd()
2566585fea7bSBram Moolenaar  new
2567585fea7bSBram Moolenaar  setline(1, 'something')
2568585fea7bSBram Moolenaar  :substitute(some(other(
2569585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2570585fea7bSBram Moolenaar  bwipe!
2571585fea7bSBram Moolenaar
2572f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2573585fea7bSBram Moolenaar  let lines =<< trim END
2574585fea7bSBram Moolenaar    vim9script
2575585fea7bSBram Moolenaar    new
2576585fea7bSBram Moolenaar    setline(1, 'something')
2577585fea7bSBram Moolenaar    :substitute(some(other(
2578585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2579585fea7bSBram Moolenaar    bwipe!
2580585fea7bSBram Moolenaar  END
2581585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2582585fea7bSBram Moolenaar  source Xvim9lines
2583585fea7bSBram Moolenaar
2584585fea7bSBram Moolenaar  delete('Xvim9lines')
2585585fea7bSBram Moolenaarenddef
2586585fea7bSBram Moolenaar
25878a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2588