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
32b209750bSBram Moolenaar  let a: number = 6 #comment
339be61bbbSBram Moolenaar  assert_equal(6, a)
349be61bbbSBram Moolenaar
3542a480bfSBram Moolenaar  if has('channel')
3642a480bfSBram Moolenaar    let chan1: channel
37fbdd08edSBram Moolenaar    let job1: job
38f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
3942a480bfSBram Moolenaar  endif
40fbdd08edSBram Moolenaar  if has('float')
41fbdd08edSBram Moolenaar    let float1: float = 3.4
42fbdd08edSBram Moolenaar  endif
435deeb3f1SBram Moolenaar  let Funky1: func
445deeb3f1SBram Moolenaar  let Funky2: func = function('len')
454c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
4642a480bfSBram Moolenaar
47b209750bSBram Moolenaar  g:newvar = 'new'  #comment
48401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
49401d9ffbSBram Moolenaar
50401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
51401d9ffbSBram Moolenaar  g:existing = 'no'
52401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
53401d9ffbSBram Moolenaar
54b283a8a6SBram Moolenaar  v:char = 'abc'
556e587dcbSBram Moolenaar  assert_equal('abc', v:char)
56b283a8a6SBram Moolenaar
57b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
586e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
59b283a8a6SBram Moolenaar  $ENVVAR = ''
606e587dcbSBram Moolenaar
61fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
62fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
63fd1823e0SBram Moolenaar  s:addToMe += 222
64fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
650bbf722aSBram Moolenaar  s:newVar = 'new'
660bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
67a8c17704SBram Moolenaar
68a8c17704SBram Moolenaar  set ts=7
69a8c17704SBram Moolenaar  &ts += 1
70a8c17704SBram Moolenaar  assert_equal(8, &ts)
7180c34ca3SBram Moolenaar  &ts -= 3
7280c34ca3SBram Moolenaar  assert_equal(5, &ts)
7380c34ca3SBram Moolenaar  &ts *= 2
7480c34ca3SBram Moolenaar  assert_equal(10, &ts)
7580c34ca3SBram Moolenaar  &ts /= 3
7680c34ca3SBram Moolenaar  assert_equal(3, &ts)
7780c34ca3SBram Moolenaar  set ts=10
7880c34ca3SBram Moolenaar  &ts %= 4
7980c34ca3SBram Moolenaar  assert_equal(2, &ts)
80a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
81a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
82a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = [7]'], 'E1013:')
83a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
84a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = "xx"'], 'E1013:')
85a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
86a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
87a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
88cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
89585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
9080c34ca3SBram Moolenaar  &ts = 8
91a8c17704SBram Moolenaar
92a8c17704SBram Moolenaar  g:inc_counter += 1
93a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
94a8c17704SBram Moolenaar
95a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
96a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
97a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
98a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
99a8c17704SBram Moolenaar
100a8c17704SBram Moolenaar  @a = 'areg'
101a8c17704SBram Moolenaar  @a ..= 'add'
102a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
103a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
104a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
105e69f6d04SBram Moolenaar
106e69f6d04SBram Moolenaar  v:errmsg = 'none'
107e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
108e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
109e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
110e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
1115deeb3f1SBram Moolenaarenddef
1125deeb3f1SBram Moolenaar
1133b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
1143b74b6b4SBram Moolenaar  let lines =<< trim END
1153b74b6b4SBram Moolenaar      vim9script
1163b74b6b4SBram Moolenaar
117f5be8cdbSBram Moolenaar      # single character variable declarations work
1183b74b6b4SBram Moolenaar      let a: string
1193b74b6b4SBram Moolenaar      let b: number
1203b74b6b4SBram Moolenaar      let l: list<any>
1213b74b6b4SBram Moolenaar      let s: string
1223b74b6b4SBram Moolenaar      let t: number
1233b74b6b4SBram Moolenaar      let v: number
1243b74b6b4SBram Moolenaar      let w: number
1253b74b6b4SBram Moolenaar
126f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
1273b74b6b4SBram Moolenaar      a = 'script-a'
1283b74b6b4SBram Moolenaar      b = 111
1293b74b6b4SBram Moolenaar      l = [1, 2, 3]
1303b74b6b4SBram Moolenaar      s = 'script-s'
1313b74b6b4SBram Moolenaar      t = 222
1323b74b6b4SBram Moolenaar      v = 333
1333b74b6b4SBram Moolenaar      w = 444
1343b74b6b4SBram Moolenaar
1353b74b6b4SBram Moolenaar      assert_equal('script-a', a)
1363b74b6b4SBram Moolenaar      assert_equal(111, b)
1373b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
1383b74b6b4SBram Moolenaar      assert_equal('script-s', s)
1393b74b6b4SBram Moolenaar      assert_equal(222, t)
1403b74b6b4SBram Moolenaar      assert_equal(333, v)
1413b74b6b4SBram Moolenaar      assert_equal(444, w)
1423b74b6b4SBram Moolenaar  END
1433b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
1443b74b6b4SBram Moolenaar  source Xsinglechar
1453b74b6b4SBram Moolenaar  delete('Xsinglechar')
1463b74b6b4SBram Moolenaarenddef
1473b74b6b4SBram Moolenaar
14884370087SBram Moolenaardef Test_assignment_list()
14984370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
15084370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
15184370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
15284370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
15384370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
15484370087SBram Moolenaar
15584370087SBram Moolenaar  let listS: list<string> = []
15684370087SBram Moolenaar  let listN: list<number> = []
15784370087SBram Moolenaar
15884370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
15984370087SBram Moolenaar  list2[-1] = 99
16084370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
16184370087SBram Moolenaar  list2[-2] = 88
16284370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
16384370087SBram Moolenaar  list2[-3] = 77
16484370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
16584370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
166c5b1c20bSBram Moolenaar  call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
16784370087SBram Moolenaar
16884370087SBram Moolenaar  # type becomes list<any>
16984370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
17084370087SBram Moolenaarenddef
17184370087SBram Moolenaar
172*b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
173*b31be3f9SBram Moolenaar  let lines =<< trim END
174*b31be3f9SBram Moolenaar    vim9script
175*b31be3f9SBram Moolenaar    let v1: number
176*b31be3f9SBram Moolenaar    let v2: number
177*b31be3f9SBram Moolenaar    let v3: number
178*b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
179*b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
180*b31be3f9SBram Moolenaar  END
181*b31be3f9SBram Moolenaar  call CheckScriptSuccess(lines)
182*b31be3f9SBram Moolenaarenddef
183*b31be3f9SBram Moolenaar
18484370087SBram Moolenaardef Test_assignment_dict()
18584370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
18684370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
18784370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
18884370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
18974fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
19084370087SBram Moolenaar
191f5be8cdbSBram Moolenaar  # overwrite
192c785b9a7SBram Moolenaar  dict3['key'] = 'another'
193c785b9a7SBram Moolenaar
19484370087SBram Moolenaar  call CheckDefExecFailure(['let dd = {}', 'dd[""] = 6'], 'E713:')
19584370087SBram Moolenaar
19684370087SBram Moolenaar  # type becomes dict<any>
19784370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
19884370087SBram Moolenaarenddef
19984370087SBram Moolenaar
200d3aac291SBram Moolenaardef Test_assignment_local()
201f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
202f5be8cdbSBram Moolenaar  # changed.
203d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
204d3aac291SBram Moolenaar    let b:existing = 'yes'
205d3aac291SBram Moolenaar    let w:existing = 'yes'
206d3aac291SBram Moolenaar    let t:existing = 'yes'
207d3aac291SBram Moolenaar
208d3aac291SBram Moolenaar    def Test_assignment_local_internal()
209d3aac291SBram Moolenaar      b:newvar = 'new'
210d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
211d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
212d3aac291SBram Moolenaar      b:existing = 'no'
213d3aac291SBram Moolenaar      assert_equal('no', b:existing)
214396f3138SBram Moolenaar      b:existing ..= 'NO'
215396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
216d3aac291SBram Moolenaar
217d3aac291SBram Moolenaar      w:newvar = 'new'
218d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
219d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
220d3aac291SBram Moolenaar      w:existing = 'no'
221d3aac291SBram Moolenaar      assert_equal('no', w:existing)
222396f3138SBram Moolenaar      w:existing ..= 'NO'
223396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
224d3aac291SBram Moolenaar
225d3aac291SBram Moolenaar      t:newvar = 'new'
226d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
227d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
228d3aac291SBram Moolenaar      t:existing = 'no'
229d3aac291SBram Moolenaar      assert_equal('no', t:existing)
230396f3138SBram Moolenaar      t:existing ..= 'NO'
231396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
232d3aac291SBram Moolenaar    enddef
233d3aac291SBram Moolenaar    call Test_assignment_local_internal()
234d3aac291SBram Moolenaar  END
235d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
236d3aac291SBram Moolenaarenddef
237d3aac291SBram Moolenaar
2385deeb3f1SBram Moolenaardef Test_assignment_default()
239e69f6d04SBram Moolenaar
240cb711abfSBram Moolenaar  # Test default values.
241e69f6d04SBram Moolenaar  let thebool: bool
242e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
243e69f6d04SBram Moolenaar
244e69f6d04SBram Moolenaar  let thenumber: number
245e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
246e69f6d04SBram Moolenaar
247e69f6d04SBram Moolenaar  if has('float')
248e69f6d04SBram Moolenaar    let thefloat: float
249e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
250e69f6d04SBram Moolenaar  endif
251e69f6d04SBram Moolenaar
252e69f6d04SBram Moolenaar  let thestring: string
253e69f6d04SBram Moolenaar  assert_equal('', thestring)
254e69f6d04SBram Moolenaar
255e69f6d04SBram Moolenaar  let theblob: blob
256e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
257e69f6d04SBram Moolenaar
2585deeb3f1SBram Moolenaar  let Thefunc: func
2595deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
260e69f6d04SBram Moolenaar
261e69f6d04SBram Moolenaar  let thelist: list<any>
262e69f6d04SBram Moolenaar  assert_equal([], thelist)
263e69f6d04SBram Moolenaar
264e69f6d04SBram Moolenaar  let thedict: dict<any>
265e69f6d04SBram Moolenaar  assert_equal({}, thedict)
266e69f6d04SBram Moolenaar
2672c869deeSBram Moolenaar  if has('channel')
268e69f6d04SBram Moolenaar    let thejob: job
269e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
270e69f6d04SBram Moolenaar
271e69f6d04SBram Moolenaar    let thechannel: channel
272e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
273c785b9a7SBram Moolenaar
274c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
275f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
276c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
277c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
278c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
279c785b9a7SBram Moolenaar    endif
2802c869deeSBram Moolenaar  endif
281585fea7bSBram Moolenaar
282585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
283585fea7bSBram Moolenaar  assert_equal(5678, nr)
2848a7d6542SBram Moolenaarenddef
2858a7d6542SBram Moolenaar
28647a519a9SBram Moolenaardef Test_assignment_var_list()
28747a519a9SBram Moolenaar  let v1: string
28847a519a9SBram Moolenaar  let v2: string
2899af78769SBram Moolenaar  let vrem: list<string>
2909af78769SBram Moolenaar  [v1] = ['aaa']
2919af78769SBram Moolenaar  assert_equal('aaa', v1)
2929af78769SBram Moolenaar
29347a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
29447a519a9SBram Moolenaar  assert_equal('one', v1)
29547a519a9SBram Moolenaar  assert_equal('two', v2)
2969af78769SBram Moolenaar
2979af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
2989af78769SBram Moolenaar  assert_equal('one', v1)
2999af78769SBram Moolenaar  assert_equal('two', v2)
3009af78769SBram Moolenaar  assert_equal([], vrem)
3019af78769SBram Moolenaar
3029af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
3039af78769SBram Moolenaar  assert_equal('one', v1)
3049af78769SBram Moolenaar  assert_equal('two', v2)
3059af78769SBram Moolenaar  assert_equal(['three'], vrem)
30647a519a9SBram Moolenaarenddef
30747a519a9SBram Moolenaar
308cab27678SBram Moolenaardef Mess(): string
309cab27678SBram Moolenaar  v:foldstart = 123
310cab27678SBram Moolenaar  return 'xxx'
311cab27678SBram Moolenaarenddef
312cab27678SBram Moolenaar
313d72c1bf0SBram Moolenaardef Test_assignment_failure()
3148a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
3158a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
3168a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
3178a7d6542SBram Moolenaar
3188a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
3198a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
3208a7d6542SBram Moolenaar
3219b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
3229af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
3239af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
3249af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
3259af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
3269af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
3279af78769SBram Moolenaar                            'let y: number',
3289af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
3299af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
3309af78769SBram Moolenaar                            'let y: number',
3319af78769SBram Moolenaar                            'let z: list<number>',
3329af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
3339be61bbbSBram Moolenaar
334e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
3359be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
3369be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
3379be61bbbSBram Moolenaar
338e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
3399be61bbbSBram Moolenaar
3409be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
3419be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
3429be61bbbSBram Moolenaar
343e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
344e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
345e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
346e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
3479be61bbbSBram Moolenaar
3489be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
3499be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
3509be61bbbSBram Moolenaar
351822ba247SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
35233fa29cfSBram Moolenaar
3538a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
3548a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
3558a7d6542SBram Moolenaar
3568a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
3578a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
3588a7d6542SBram Moolenaar
3598a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
3608a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
36142a480bfSBram Moolenaar
362d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
36342a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
364cab27678SBram Moolenaar
365cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
366cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
367d72c1bf0SBram Moolenaarenddef
368d72c1bf0SBram Moolenaar
369d72c1bf0SBram Moolenaardef Test_unlet()
370d72c1bf0SBram Moolenaar  g:somevar = 'yes'
371d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
372d72c1bf0SBram Moolenaar  unlet g:somevar
373d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
374d72c1bf0SBram Moolenaar  unlet! g:somevar
375d72c1bf0SBram Moolenaar
376d72c1bf0SBram Moolenaar  call CheckScriptFailure([
377d72c1bf0SBram Moolenaar        'vim9script',
378d72c1bf0SBram Moolenaar        'let svar = 123',
379d72c1bf0SBram Moolenaar        'unlet svar',
380d72c1bf0SBram Moolenaar        ], 'E1081:')
381d72c1bf0SBram Moolenaar  call CheckScriptFailure([
382d72c1bf0SBram Moolenaar        'vim9script',
383d72c1bf0SBram Moolenaar        'let svar = 123',
384d72c1bf0SBram Moolenaar        'unlet s:svar',
385d72c1bf0SBram Moolenaar        ], 'E1081:')
386d72c1bf0SBram Moolenaar  call CheckScriptFailure([
387d72c1bf0SBram Moolenaar        'vim9script',
388d72c1bf0SBram Moolenaar        'let svar = 123',
389d72c1bf0SBram Moolenaar        'def Func()',
390d72c1bf0SBram Moolenaar        '  unlet svar',
391d72c1bf0SBram Moolenaar        'enddef',
392822ba247SBram Moolenaar        'defcompile',
393d72c1bf0SBram Moolenaar        ], 'E1081:')
394d72c1bf0SBram Moolenaar  call CheckScriptFailure([
395d72c1bf0SBram Moolenaar        'vim9script',
396d72c1bf0SBram Moolenaar        'let svar = 123',
397d72c1bf0SBram Moolenaar        'def Func()',
398d72c1bf0SBram Moolenaar        '  unlet s:svar',
399d72c1bf0SBram Moolenaar        'enddef',
400822ba247SBram Moolenaar        'defcompile',
401d72c1bf0SBram Moolenaar        ], 'E1081:')
4027bdaea6eSBram Moolenaar
4037bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
4047bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
4057bdaea6eSBram Moolenaar  unlet $ENVVAR
4067bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
407d72c1bf0SBram Moolenaarenddef
408599c89c8SBram Moolenaar
4094c17ad94SBram Moolenaardef Test_delfunction()
410f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
4114c17ad94SBram Moolenaar  CheckScriptSuccess([
4124c17ad94SBram Moolenaar      'vim9script',
4134c17ad94SBram Moolenaar      'func CheckMe()',
4144c17ad94SBram Moolenaar      '  return 123',
4154c17ad94SBram Moolenaar      'endfunc',
4164c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
4174c17ad94SBram Moolenaar      ])
4184c17ad94SBram Moolenaar
419f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
4204c17ad94SBram Moolenaar  CheckScriptFailure([
4214c17ad94SBram Moolenaar      'vim9script',
4224c17ad94SBram Moolenaar      'func DeleteMe1()',
4234c17ad94SBram Moolenaar      'endfunc',
4244c17ad94SBram Moolenaar      'delfunction DeleteMe1',
4254c17ad94SBram Moolenaar      ], 'E1084:')
4264c17ad94SBram Moolenaar  CheckScriptFailure([
4274c17ad94SBram Moolenaar      'vim9script',
4284c17ad94SBram Moolenaar      'func DeleteMe2()',
4294c17ad94SBram Moolenaar      'endfunc',
4304c17ad94SBram Moolenaar      'def DoThat()',
4314c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
4324c17ad94SBram Moolenaar      'enddef',
4334c17ad94SBram Moolenaar      'DoThat()',
4344c17ad94SBram Moolenaar      ], 'E1084:')
4354c17ad94SBram Moolenaar  CheckScriptFailure([
4364c17ad94SBram Moolenaar      'vim9script',
4374c17ad94SBram Moolenaar      'def DeleteMe3()',
4384c17ad94SBram Moolenaar      'enddef',
4394c17ad94SBram Moolenaar      'delfunction DeleteMe3',
4404c17ad94SBram Moolenaar      ], 'E1084:')
4414c17ad94SBram Moolenaar  CheckScriptFailure([
4424c17ad94SBram Moolenaar      'vim9script',
4434c17ad94SBram Moolenaar      'def DeleteMe4()',
4444c17ad94SBram Moolenaar      'enddef',
4454c17ad94SBram Moolenaar      'def DoThat()',
4464c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
4474c17ad94SBram Moolenaar      'enddef',
4484c17ad94SBram Moolenaar      'DoThat()',
4494c17ad94SBram Moolenaar      ], 'E1084:')
4504c17ad94SBram Moolenaarenddef
4514c17ad94SBram Moolenaar
452599c89c8SBram Moolenaarfunc Test_wrong_type()
453599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
454599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
455599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
456599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
457599c89c8SBram Moolenaar
458599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
459599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
46042a480bfSBram Moolenaar
46142a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
46242a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
46342a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
46442a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
46542a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
46642a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
46742a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
46842a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
46942a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
47042a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
47142a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
472a0a9f43aSBram Moolenaar
473a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
474a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
4758a7d6542SBram Moolenaarendfunc
4768a7d6542SBram Moolenaar
4778a7d6542SBram Moolenaarfunc Test_const()
4788a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
4798a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
4808a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
4819be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
4828a7d6542SBram Moolenaarendfunc
4838a7d6542SBram Moolenaar
484df069eecSBram Moolenaardef Test_range_no_colon()
485df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
486df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
487df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
488df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
489df069eecSBram Moolenaarenddef
490df069eecSBram Moolenaar
491df069eecSBram Moolenaar
4928a7d6542SBram Moolenaardef Test_block()
4938a7d6542SBram Moolenaar  let outer = 1
4948a7d6542SBram Moolenaar  {
4958a7d6542SBram Moolenaar    let inner = 2
4968a7d6542SBram Moolenaar    assert_equal(1, outer)
4978a7d6542SBram Moolenaar    assert_equal(2, inner)
4988a7d6542SBram Moolenaar  }
4998a7d6542SBram Moolenaar  assert_equal(1, outer)
5008a7d6542SBram Moolenaarenddef
5018a7d6542SBram Moolenaar
5028a7d6542SBram Moolenaarfunc Test_block_failure()
5038a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
504585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
505585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
5068a7d6542SBram Moolenaarendfunc
5078a7d6542SBram Moolenaar
508585fea7bSBram Moolenaardef Test_cmd_modifier()
509585fea7bSBram Moolenaar  tab echo '0'
510585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
511585fea7bSBram Moolenaarenddef
512585fea7bSBram Moolenaar
513d032f34aSBram Moolenaarfunc g:NoSuchFunc()
514d032f34aSBram Moolenaar  echo 'none'
515d032f34aSBram Moolenaarendfunc
516d032f34aSBram Moolenaar
5178a7d6542SBram Moolenaardef Test_try_catch()
5188a7d6542SBram Moolenaar  let l = []
5197a092245SBram Moolenaar  try # comment
5208a7d6542SBram Moolenaar    add(l, '1')
5218a7d6542SBram Moolenaar    throw 'wrong'
5228a7d6542SBram Moolenaar    add(l, '2')
5237a092245SBram Moolenaar  catch # comment
5248a7d6542SBram Moolenaar    add(l, v:exception)
5257a092245SBram Moolenaar  finally # comment
5268a7d6542SBram Moolenaar    add(l, '3')
5277a092245SBram Moolenaar  endtry # comment
5288a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
52968d130c6SBram Moolenaar
530e859312eSBram Moolenaar  l = []
531e859312eSBram Moolenaar  try
532e859312eSBram Moolenaar    try
533e859312eSBram Moolenaar      add(l, '1')
534e859312eSBram Moolenaar      throw 'wrong'
535e859312eSBram Moolenaar      add(l, '2')
536e859312eSBram Moolenaar    catch /right/
537e859312eSBram Moolenaar      add(l, v:exception)
538e859312eSBram Moolenaar    endtry
539e859312eSBram Moolenaar  catch /wrong/
540e859312eSBram Moolenaar    add(l, 'caught')
541e859312eSBram Moolenaar  finally
542e859312eSBram Moolenaar    add(l, 'finally')
543e859312eSBram Moolenaar  endtry
544e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
545e859312eSBram Moolenaar
54668d130c6SBram Moolenaar  let n: number
54768d130c6SBram Moolenaar  try
54868d130c6SBram Moolenaar    n = l[3]
54968d130c6SBram Moolenaar  catch /E684:/
55068d130c6SBram Moolenaar    n = 99
55168d130c6SBram Moolenaar  endtry
55268d130c6SBram Moolenaar  assert_equal(99, n)
55368d130c6SBram Moolenaar
55468d130c6SBram Moolenaar  try
55568d130c6SBram Moolenaar    n = g:astring[3]
55668d130c6SBram Moolenaar  catch /E714:/
55768d130c6SBram Moolenaar    n = 77
55868d130c6SBram Moolenaar  endtry
55968d130c6SBram Moolenaar  assert_equal(77, n)
56068d130c6SBram Moolenaar
56168d130c6SBram Moolenaar  try
56268d130c6SBram Moolenaar    n = l[g:astring]
56368d130c6SBram Moolenaar  catch /E39:/
56468d130c6SBram Moolenaar    n = 77
56568d130c6SBram Moolenaar  endtry
56668d130c6SBram Moolenaar  assert_equal(77, n)
56768d130c6SBram Moolenaar
56868d130c6SBram Moolenaar  try
56968d130c6SBram Moolenaar    n = s:does_not_exist
57068d130c6SBram Moolenaar  catch /E121:/
571f0b9f43cSBram Moolenaar    n = 111
572f0b9f43cSBram Moolenaar  endtry
573f0b9f43cSBram Moolenaar  assert_equal(111, n)
574f0b9f43cSBram Moolenaar
575f0b9f43cSBram Moolenaar  try
576f0b9f43cSBram Moolenaar    n = g:does_not_exist
577f0b9f43cSBram Moolenaar  catch /E121:/
57868d130c6SBram Moolenaar    n = 121
57968d130c6SBram Moolenaar  endtry
58068d130c6SBram Moolenaar  assert_equal(121, n)
58168d130c6SBram Moolenaar
58268d130c6SBram Moolenaar  let d = #{one: 1}
58368d130c6SBram Moolenaar  try
58468d130c6SBram Moolenaar    n = d[g:astring]
58568d130c6SBram Moolenaar  catch /E716:/
58668d130c6SBram Moolenaar    n = 222
58768d130c6SBram Moolenaar  endtry
58868d130c6SBram Moolenaar  assert_equal(222, n)
589f0b9f43cSBram Moolenaar
590f0b9f43cSBram Moolenaar  try
591f0b9f43cSBram Moolenaar    n = -g:astring
592f0b9f43cSBram Moolenaar  catch /E39:/
593f0b9f43cSBram Moolenaar    n = 233
594f0b9f43cSBram Moolenaar  endtry
595f0b9f43cSBram Moolenaar  assert_equal(233, n)
596f0b9f43cSBram Moolenaar
597f0b9f43cSBram Moolenaar  try
598f0b9f43cSBram Moolenaar    n = +g:astring
599f0b9f43cSBram Moolenaar  catch /E1030:/
600f0b9f43cSBram Moolenaar    n = 244
601f0b9f43cSBram Moolenaar  endtry
602f0b9f43cSBram Moolenaar  assert_equal(244, n)
603f0b9f43cSBram Moolenaar
604f0b9f43cSBram Moolenaar  try
605f0b9f43cSBram Moolenaar    n = +g:alist
606f0b9f43cSBram Moolenaar  catch /E745:/
607f0b9f43cSBram Moolenaar    n = 255
608f0b9f43cSBram Moolenaar  endtry
609f0b9f43cSBram Moolenaar  assert_equal(255, n)
610f0b9f43cSBram Moolenaar
611f0b9f43cSBram Moolenaar  let nd: dict<any>
612f0b9f43cSBram Moolenaar  try
613f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
614f0b9f43cSBram Moolenaar  catch /E1029:/
615f0b9f43cSBram Moolenaar    n = 266
616f0b9f43cSBram Moolenaar  endtry
617f0b9f43cSBram Moolenaar  assert_equal(266, n)
618f0b9f43cSBram Moolenaar
619f0b9f43cSBram Moolenaar  try
620f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
621f0b9f43cSBram Moolenaar  catch /E1093:/
622f0b9f43cSBram Moolenaar    n = 277
623f0b9f43cSBram Moolenaar  endtry
624f0b9f43cSBram Moolenaar  assert_equal(277, n)
625f0b9f43cSBram Moolenaar
626e859312eSBram Moolenaar  try
627e859312eSBram Moolenaar    &ts = g:astring
628e859312eSBram Moolenaar  catch /E1029:/
629e859312eSBram Moolenaar    n = 288
630e859312eSBram Moolenaar  endtry
631e859312eSBram Moolenaar  assert_equal(288, n)
632e859312eSBram Moolenaar
633e859312eSBram Moolenaar  try
634e859312eSBram Moolenaar    &backspace = 'asdf'
635e859312eSBram Moolenaar  catch /E474:/
636e859312eSBram Moolenaar    n = 299
637e859312eSBram Moolenaar  endtry
638e859312eSBram Moolenaar  assert_equal(299, n)
639e859312eSBram Moolenaar
640e859312eSBram Moolenaar  l = [1]
641e859312eSBram Moolenaar  try
642e859312eSBram Moolenaar    l[3] = 3
643e859312eSBram Moolenaar  catch /E684:/
644e859312eSBram Moolenaar    n = 300
645e859312eSBram Moolenaar  endtry
646e859312eSBram Moolenaar  assert_equal(300, n)
647e859312eSBram Moolenaar
648e859312eSBram Moolenaar  try
649e859312eSBram Moolenaar    d[''] = 3
650e859312eSBram Moolenaar  catch /E713:/
651e859312eSBram Moolenaar    n = 311
652e859312eSBram Moolenaar  endtry
653e859312eSBram Moolenaar  assert_equal(311, n)
654e859312eSBram Moolenaar
655e859312eSBram Moolenaar  try
656e859312eSBram Moolenaar    unlet g:does_not_exist
657e859312eSBram Moolenaar  catch /E108:/
658e859312eSBram Moolenaar    n = 322
659e859312eSBram Moolenaar  endtry
660e859312eSBram Moolenaar  assert_equal(322, n)
661e859312eSBram Moolenaar
662e859312eSBram Moolenaar  try
663e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
664e859312eSBram Moolenaar  catch /E721:/
665e859312eSBram Moolenaar    n = 333
666e859312eSBram Moolenaar  endtry
667e859312eSBram Moolenaar  assert_equal(333, n)
668e859312eSBram Moolenaar
669e859312eSBram Moolenaar  try
670e859312eSBram Moolenaar    l = DeletedFunc()
671e859312eSBram Moolenaar  catch /E933:/
672e859312eSBram Moolenaar    n = 344
673e859312eSBram Moolenaar  endtry
674e859312eSBram Moolenaar  assert_equal(344, n)
675d032f34aSBram Moolenaar
676d032f34aSBram Moolenaar  try
677d032f34aSBram Moolenaar    echo len(v:true)
678d032f34aSBram Moolenaar  catch /E701:/
679d032f34aSBram Moolenaar    n = 355
680d032f34aSBram Moolenaar  endtry
681d032f34aSBram Moolenaar  assert_equal(355, n)
682d032f34aSBram Moolenaar
683d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
684d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
685d032f34aSBram Moolenaar  try
686d032f34aSBram Moolenaar    echo P()
687d032f34aSBram Moolenaar  catch /E117:/
688d032f34aSBram Moolenaar    n = 366
689d032f34aSBram Moolenaar  endtry
690d032f34aSBram Moolenaar  assert_equal(366, n)
691d032f34aSBram Moolenaar
692d032f34aSBram Moolenaar  try
693d032f34aSBram Moolenaar    echo g:NoSuchFunc()
694d032f34aSBram Moolenaar  catch /E117:/
695d032f34aSBram Moolenaar    n = 377
696d032f34aSBram Moolenaar  endtry
697d032f34aSBram Moolenaar  assert_equal(377, n)
698d032f34aSBram Moolenaar
699d032f34aSBram Moolenaar  try
700d032f34aSBram Moolenaar    echo g:alist + 4
701d032f34aSBram Moolenaar  catch /E745:/
702d032f34aSBram Moolenaar    n = 388
703d032f34aSBram Moolenaar  endtry
704d032f34aSBram Moolenaar  assert_equal(388, n)
705d032f34aSBram Moolenaar
706d032f34aSBram Moolenaar  try
707d032f34aSBram Moolenaar    echo 4 + g:alist
708d032f34aSBram Moolenaar  catch /E745:/
709d032f34aSBram Moolenaar    n = 399
710d032f34aSBram Moolenaar  endtry
711d032f34aSBram Moolenaar  assert_equal(399, n)
712d032f34aSBram Moolenaar
713d032f34aSBram Moolenaar  try
714d032f34aSBram Moolenaar    echo g:alist.member
715d032f34aSBram Moolenaar  catch /E715:/
716d032f34aSBram Moolenaar    n = 400
717d032f34aSBram Moolenaar  endtry
718d032f34aSBram Moolenaar  assert_equal(400, n)
719d032f34aSBram Moolenaar
720d032f34aSBram Moolenaar  try
721d032f34aSBram Moolenaar    echo d.member
722d032f34aSBram Moolenaar  catch /E716:/
723d032f34aSBram Moolenaar    n = 411
724d032f34aSBram Moolenaar  endtry
725d032f34aSBram Moolenaar  assert_equal(411, n)
7268a7d6542SBram Moolenaarenddef
7278a7d6542SBram Moolenaar
728e859312eSBram Moolenaardef DeletedFunc(): list<any>
729e859312eSBram Moolenaar  return ['delete me']
730e859312eSBram Moolenaarenddef
731e859312eSBram Moolenaardefcompile
732e859312eSBram Moolenaardelfunc DeletedFunc
733e859312eSBram Moolenaar
734257cc5eeSBram Moolenaardef ThrowFromDef()
735a72cfb80SBram Moolenaar  throw "getout" # comment
736257cc5eeSBram Moolenaarenddef
737257cc5eeSBram Moolenaar
738257cc5eeSBram Moolenaarfunc CatchInFunc()
739257cc5eeSBram Moolenaar  try
740257cc5eeSBram Moolenaar    call ThrowFromDef()
741257cc5eeSBram Moolenaar  catch
742257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
743257cc5eeSBram Moolenaar  endtry
744257cc5eeSBram Moolenaarendfunc
745257cc5eeSBram Moolenaar
746257cc5eeSBram Moolenaardef CatchInDef()
747257cc5eeSBram Moolenaar  try
748257cc5eeSBram Moolenaar    ThrowFromDef()
749257cc5eeSBram Moolenaar  catch
750257cc5eeSBram Moolenaar    g:thrown_def = v:exception
751257cc5eeSBram Moolenaar  endtry
752257cc5eeSBram Moolenaarenddef
753257cc5eeSBram Moolenaar
754f575adffSBram Moolenaardef ReturnFinally(): string
755f575adffSBram Moolenaar  try
756f575adffSBram Moolenaar    return 'intry'
757f575adffSBram Moolenaar  finally
758f575adffSBram Moolenaar    g:in_finally = 'finally'
759f575adffSBram Moolenaar  endtry
760f575adffSBram Moolenaar  return 'end'
761f575adffSBram Moolenaarenddef
762f575adffSBram Moolenaar
763257cc5eeSBram Moolenaardef Test_try_catch_nested()
764257cc5eeSBram Moolenaar  CatchInFunc()
765257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
766257cc5eeSBram Moolenaar
767257cc5eeSBram Moolenaar  CatchInDef()
768257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
769f575adffSBram Moolenaar
770f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
771f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
772f575adffSBram Moolenaarenddef
773f575adffSBram Moolenaar
774f575adffSBram Moolenaardef Test_try_catch_match()
775f575adffSBram Moolenaar  let seq = 'a'
776f575adffSBram Moolenaar  try
777f575adffSBram Moolenaar    throw 'something'
778f575adffSBram Moolenaar  catch /nothing/
779f575adffSBram Moolenaar    seq ..= 'x'
780f575adffSBram Moolenaar  catch /some/
781f575adffSBram Moolenaar    seq ..= 'b'
782f575adffSBram Moolenaar  catch /asdf/
783f575adffSBram Moolenaar    seq ..= 'x'
784e8c4abbbSBram Moolenaar  catch ?a\?sdf?
785e8c4abbbSBram Moolenaar    seq ..= 'y'
786f575adffSBram Moolenaar  finally
787f575adffSBram Moolenaar    seq ..= 'c'
788f575adffSBram Moolenaar  endtry
789f575adffSBram Moolenaar  assert_equal('abc', seq)
790257cc5eeSBram Moolenaarenddef
791257cc5eeSBram Moolenaar
792e8c4abbbSBram Moolenaardef Test_try_catch_fails()
793e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
794e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
795e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
796585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
797585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
798585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
799585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
800585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
801585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
802585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
803585fea7bSBram Moolenaar
804a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
805585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
806e8c4abbbSBram Moolenaarenddef
807e8c4abbbSBram Moolenaar
808006ad48bSBram Moolenaardef Test_throw_vimscript()
809f5be8cdbSBram Moolenaar  # only checks line continuation
810006ad48bSBram Moolenaar  let lines =<< trim END
811006ad48bSBram Moolenaar      vim9script
812006ad48bSBram Moolenaar      try
813006ad48bSBram Moolenaar        throw 'one'
814006ad48bSBram Moolenaar              .. 'two'
815006ad48bSBram Moolenaar      catch
816006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
817006ad48bSBram Moolenaar      endtry
818006ad48bSBram Moolenaar  END
819006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
820006ad48bSBram Moolenaarenddef
821006ad48bSBram Moolenaar
82237c83711SBram Moolenaardef Test_cexpr_vimscript()
823f5be8cdbSBram Moolenaar  # only checks line continuation
82437c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
82537c83711SBram Moolenaar  let lines =<< trim END
82637c83711SBram Moolenaar      vim9script
82737c83711SBram Moolenaar      cexpr 'File'
82837c83711SBram Moolenaar                .. ' someFile' ..
82937c83711SBram Moolenaar                   ' line 19'
83037c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
83137c83711SBram Moolenaar  END
83237c83711SBram Moolenaar  CheckScriptSuccess(lines)
83337c83711SBram Moolenaar  set errorformat&
83437c83711SBram Moolenaarenddef
83537c83711SBram Moolenaar
836b209750bSBram Moolenaardef Test_list_vimscript()
837b209750bSBram Moolenaar  # checks line continuation and comments
838b209750bSBram Moolenaar  let lines =<< trim END
839b209750bSBram Moolenaar      vim9script
840b209750bSBram Moolenaar      let mylist = [
841b209750bSBram Moolenaar            'one',
842b209750bSBram Moolenaar            # comment
843b209750bSBram Moolenaar            'two', # empty line follows
844b209750bSBram Moolenaar
845b209750bSBram Moolenaar            'three',
846b209750bSBram Moolenaar            ]
847b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
848b209750bSBram Moolenaar  END
849b209750bSBram Moolenaar  CheckScriptSuccess(lines)
850b209750bSBram Moolenaarenddef
851b209750bSBram Moolenaar
8522a1381c3SBram Moolenaarif has('channel')
85340ee466cSBram Moolenaar  let someJob = test_null_job()
85440ee466cSBram Moolenaar
85540ee466cSBram Moolenaar  def FuncWithError()
85640ee466cSBram Moolenaar    echomsg g:someJob
85740ee466cSBram Moolenaar  enddef
85840ee466cSBram Moolenaar
85940ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
86040ee466cSBram Moolenaar    try
86140ee466cSBram Moolenaar      call FuncWithError()
86240ee466cSBram Moolenaar    catch
86340ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
86440ee466cSBram Moolenaar    endtry
86540ee466cSBram Moolenaar  endfunc
8662a1381c3SBram Moolenaarendif
86740ee466cSBram Moolenaar
8688a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
8698a7d6542SBram Moolenaar  vim9script
8708a7d6542SBram Moolenaar  let name: string = 'bob'
8718a7d6542SBram Moolenaar  def Concat(arg: string): string
8728a7d6542SBram Moolenaar    return name .. arg
8738a7d6542SBram Moolenaar  enddef
874227a69deSBram Moolenaar  g:result = Concat('bie')
875227a69deSBram Moolenaar  g:localname = name
8768a7d6542SBram Moolenaar
8778a7d6542SBram Moolenaar  export const CONST = 1234
8788a7d6542SBram Moolenaar  export let exported = 9876
8796e587dcbSBram Moolenaar  export let exp_name = 'John'
8808a7d6542SBram Moolenaar  export def Exported(): string
8818a7d6542SBram Moolenaar    return 'Exported'
8828a7d6542SBram Moolenaar  enddef
8838a7d6542SBram MoolenaarEND
8848a7d6542SBram Moolenaar
8855269bd2aSBram Moolenaardef Test_vim9_import_export()
8868a7d6542SBram Moolenaar  let import_script_lines =<< trim END
8878a7d6542SBram Moolenaar    vim9script
8888a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
8898a7d6542SBram Moolenaar    g:imported = exported
8906e587dcbSBram Moolenaar    exported += 3
8916e587dcbSBram Moolenaar    g:imported_added = exported
8928a7d6542SBram Moolenaar    g:imported_func = Exported()
8936e587dcbSBram Moolenaar
8946e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
8956e587dcbSBram Moolenaar    g:imported_name = exp_name
8966e587dcbSBram Moolenaar    exp_name ..= ' Doe'
8976e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
8985381c7a1SBram Moolenaar    g:imported_later = exported
8998a7d6542SBram Moolenaar  END
9008a7d6542SBram Moolenaar
9018a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
9028a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
9038a7d6542SBram Moolenaar
9048a7d6542SBram Moolenaar  source Ximport.vim
9058a7d6542SBram Moolenaar
9068a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
9078a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
9088a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
9096e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
9105381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
9118a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
9126e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
9136e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
9148a7d6542SBram Moolenaar  assert_false(exists('g:name'))
9158a7d6542SBram Moolenaar
9168a7d6542SBram Moolenaar  unlet g:result
9178a7d6542SBram Moolenaar  unlet g:localname
9188a7d6542SBram Moolenaar  unlet g:imported
9196e587dcbSBram Moolenaar  unlet g:imported_added
9205381c7a1SBram Moolenaar  unlet g:imported_later
9218a7d6542SBram Moolenaar  unlet g:imported_func
9226e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
9238a7d6542SBram Moolenaar  delete('Ximport.vim')
924f2d5c240SBram Moolenaar
9251c991144SBram Moolenaar  # similar, with line breaks
9261c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
9271c991144SBram Moolenaar    vim9script
9281c991144SBram Moolenaar    import {
9291c991144SBram Moolenaar        exported,
9301c991144SBram Moolenaar        Exported,
9311c991144SBram Moolenaar        }
9321c991144SBram Moolenaar        from
9331c991144SBram Moolenaar        './Xexport.vim'
9341c991144SBram Moolenaar    g:imported = exported
9351c991144SBram Moolenaar    exported += 5
9361c991144SBram Moolenaar    g:imported_added = exported
9371c991144SBram Moolenaar    g:imported_func = Exported()
9381c991144SBram Moolenaar  END
9391c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
9401c991144SBram Moolenaar  source Ximport_lbr.vim
9411c991144SBram Moolenaar
9421c991144SBram Moolenaar  assert_equal(9876, g:imported)
9431c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
9441c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
9451c991144SBram Moolenaar
9461c991144SBram Moolenaar  # exported script not sourced again
9471c991144SBram Moolenaar  assert_false(exists('g:result'))
9481c991144SBram Moolenaar  unlet g:imported
9491c991144SBram Moolenaar  unlet g:imported_added
9501c991144SBram Moolenaar  unlet g:imported_func
9511c991144SBram Moolenaar  delete('Ximport_lbr.vim')
9521c991144SBram Moolenaar
9531c991144SBram Moolenaar  # import inside :def function
9545381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
9555381c7a1SBram Moolenaar    vim9script
9565381c7a1SBram Moolenaar    def ImportInDef()
9575381c7a1SBram Moolenaar      import exported from './Xexport.vim'
9585381c7a1SBram Moolenaar      g:imported = exported
9595381c7a1SBram Moolenaar      exported += 7
9605381c7a1SBram Moolenaar      g:imported_added = exported
9615381c7a1SBram Moolenaar    enddef
9625381c7a1SBram Moolenaar    ImportInDef()
9635381c7a1SBram Moolenaar  END
9645381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
9655381c7a1SBram Moolenaar  source Ximport2.vim
966f5be8cdbSBram Moolenaar  # TODO: this should be 9879
9675381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
9685381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
9695381c7a1SBram Moolenaar  unlet g:imported
9705381c7a1SBram Moolenaar  unlet g:imported_added
9715381c7a1SBram Moolenaar  delete('Ximport2.vim')
9725381c7a1SBram Moolenaar
973f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
974f2d5c240SBram Moolenaar    vim9script
975f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
976f2d5c240SBram Moolenaar    def UseExport()
977f2d5c240SBram Moolenaar      g:imported = Export.exported
978f2d5c240SBram Moolenaar    enddef
979f2d5c240SBram Moolenaar    UseExport()
980f2d5c240SBram Moolenaar  END
981f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
982f2d5c240SBram Moolenaar  source Ximport.vim
9835381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
984f2d5c240SBram Moolenaar
985599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
986599c89c8SBram Moolenaar    vim9script
987599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
988599c89c8SBram Moolenaar    def Func()
989599c89c8SBram Moolenaar      let dummy = 1
990599c89c8SBram Moolenaar      let imported = Export + dummy
991599c89c8SBram Moolenaar    enddef
992822ba247SBram Moolenaar    defcompile
993599c89c8SBram Moolenaar  END
994599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
995599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
996599c89c8SBram Moolenaar
997599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
998599c89c8SBram Moolenaar    vim9script
999599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1000599c89c8SBram Moolenaar    def Func()
1001599c89c8SBram Moolenaar      let imported = Export . exported
1002599c89c8SBram Moolenaar    enddef
1003822ba247SBram Moolenaar    defcompile
1004599c89c8SBram Moolenaar  END
1005599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1006599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1007599c89c8SBram Moolenaar
1008599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1009599c89c8SBram Moolenaar    vim9script
1010599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1011599c89c8SBram Moolenaar    def Func()
1012599c89c8SBram Moolenaar      let imported = Export.
1013599c89c8SBram Moolenaar    enddef
1014822ba247SBram Moolenaar    defcompile
1015599c89c8SBram Moolenaar  END
1016599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1017599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1018599c89c8SBram Moolenaar
10191c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
10201c991144SBram Moolenaar    vim9script
10211c991144SBram Moolenaar    import *
10221c991144SBram Moolenaar        as Export
10231c991144SBram Moolenaar        from
10241c991144SBram Moolenaar        './Xexport.vim'
10251c991144SBram Moolenaar    def UseExport()
10261c991144SBram Moolenaar      g:imported = Export.exported
10271c991144SBram Moolenaar    enddef
10281c991144SBram Moolenaar    UseExport()
10291c991144SBram Moolenaar  END
10301c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
10311c991144SBram Moolenaar  source Ximport.vim
10321c991144SBram Moolenaar  assert_equal(9883, g:imported)
10331c991144SBram Moolenaar
1034f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1035f2d5c240SBram Moolenaar    vim9script
1036f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1037f2d5c240SBram Moolenaar  END
1038f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1039f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1040f2d5c240SBram Moolenaar
1041f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1042fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1043fa29c8abSBram Moolenaar    vim9script
1044fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1045fa29c8abSBram Moolenaar  END
1046fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1047fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1048fa29c8abSBram Moolenaar
1049f5be8cdbSBram Moolenaar  # try to import something that is already defined
10505269bd2aSBram Moolenaar  let import_already_defined =<< trim END
10515269bd2aSBram Moolenaar    vim9script
10525269bd2aSBram Moolenaar    let exported = 'something'
10535269bd2aSBram Moolenaar    import exported from './Xexport.vim'
10545269bd2aSBram Moolenaar  END
10555269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
10565269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
10575269bd2aSBram Moolenaar
1058f5be8cdbSBram Moolenaar  # try to import something that is already defined
10595269bd2aSBram Moolenaar  import_already_defined =<< trim END
10605269bd2aSBram Moolenaar    vim9script
10615269bd2aSBram Moolenaar    let exported = 'something'
10625269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
10635269bd2aSBram Moolenaar  END
10645269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
10655269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
10665269bd2aSBram Moolenaar
1067f5be8cdbSBram Moolenaar  # try to import something that is already defined
10685269bd2aSBram Moolenaar  import_already_defined =<< trim END
10695269bd2aSBram Moolenaar    vim9script
10705269bd2aSBram Moolenaar    let exported = 'something'
10715269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
10725269bd2aSBram Moolenaar  END
10735269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
10745269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
10755269bd2aSBram Moolenaar
1076f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1077fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1078fa29c8abSBram Moolenaar    vim9script
1079fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1080fa29c8abSBram Moolenaar  END
1081fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1082fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1083fa29c8abSBram Moolenaar
1084fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1085fa29c8abSBram Moolenaar    vim9script
1086fa29c8abSBram Moolenaar    import name './Xexport.vim'
1087fa29c8abSBram Moolenaar  END
1088fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1089fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1090fa29c8abSBram Moolenaar
1091fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1092fa29c8abSBram Moolenaar    vim9script
1093fa29c8abSBram Moolenaar    import name from Xexport.vim
1094fa29c8abSBram Moolenaar  END
1095fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1096fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1097fa29c8abSBram Moolenaar
1098fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1099fa29c8abSBram Moolenaar    vim9script
1100fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1101fa29c8abSBram Moolenaar  END
1102fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1103fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1104fa29c8abSBram Moolenaar
1105fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1106fa29c8abSBram Moolenaar    vim9script
1107fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1108fa29c8abSBram Moolenaar  END
11095269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
11105269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1111fa29c8abSBram Moolenaar
1112f2d5c240SBram Moolenaar  delete('Ximport.vim')
11135269bd2aSBram Moolenaar  delete('Ximport3.vim')
11148a7d6542SBram Moolenaar  delete('Xexport.vim')
11158a7d6542SBram Moolenaar
1116f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1117750802b5SBram Moolenaar  set cpo&vi
1118750802b5SBram Moolenaar  let cpo_before = &cpo
1119750802b5SBram Moolenaar  let lines =<< trim END
1120750802b5SBram Moolenaar    vim9script
1121750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1122750802b5SBram Moolenaar  END
1123750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1124750802b5SBram Moolenaar  source Xvim9_script
1125750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1126750802b5SBram Moolenaar  set cpo&vim
1127750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1128750802b5SBram Moolenaar  delete('Xvim9_script')
1129750802b5SBram Moolenaarenddef
1130750802b5SBram Moolenaar
1131750802b5SBram Moolenaardef Test_vim9script_fails()
11328a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
11338a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1134750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
11359721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
11369b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1137750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1138750802b5SBram Moolenaar
1139c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1140c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1141c785b9a7SBram Moolenaar
1142750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1143a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
11448a7d6542SBram Moolenaarenddef
11458a7d6542SBram Moolenaar
1146f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1147101f4810SBram Moolenaar  CheckRunVimInTerminal
1148101f4810SBram Moolenaar
11499bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1150c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
11519bb3eb3eSBram Moolenaarendfunc
11529bb3eb3eSBram Moolenaar
1153c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1154101f4810SBram Moolenaar  let export =<< trim END
1155101f4810SBram Moolenaar    vim9script
1156101f4810SBram Moolenaar    export def Foo(): number
1157101f4810SBram Moolenaar        return 0
1158101f4810SBram Moolenaar    enddef
1159101f4810SBram Moolenaar  END
11609bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
1161101f4810SBram Moolenaar
11629bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
11639bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
11649bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1165101f4810SBram Moolenaar
11669bb3eb3eSBram Moolenaar  delete('Xexport.vim')
11679bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
11689bb3eb3eSBram Moolenaarenddef
1169101f4810SBram Moolenaar
11704c17ad94SBram Moolenaardef Test_vim9script_reload_import()
11718a7d6542SBram Moolenaar  let lines =<< trim END
11728a7d6542SBram Moolenaar    vim9script
11738a7d6542SBram Moolenaar    const var = ''
11748a7d6542SBram Moolenaar    let valone = 1234
11758a7d6542SBram Moolenaar    def MyFunc(arg: string)
11768a7d6542SBram Moolenaar       valone = 5678
11778a7d6542SBram Moolenaar    enddef
11788a7d6542SBram Moolenaar  END
11798a7d6542SBram Moolenaar  let morelines =<< trim END
11808a7d6542SBram Moolenaar    let valtwo = 222
11818a7d6542SBram Moolenaar    export def GetValtwo(): number
11828a7d6542SBram Moolenaar      return valtwo
11838a7d6542SBram Moolenaar    enddef
11848a7d6542SBram Moolenaar  END
118503afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
11868a7d6542SBram Moolenaar  source Xreload.vim
11878a7d6542SBram Moolenaar  source Xreload.vim
11888a7d6542SBram Moolenaar  source Xreload.vim
11898a7d6542SBram Moolenaar
11908a7d6542SBram Moolenaar  let testlines =<< trim END
11918a7d6542SBram Moolenaar    vim9script
11928a7d6542SBram Moolenaar    def TheFunc()
11938a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
11948a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
11958a7d6542SBram Moolenaar    enddef
11968a7d6542SBram Moolenaar    TheFunc()
11978a7d6542SBram Moolenaar  END
11988a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
11998a7d6542SBram Moolenaar  source Ximport.vim
12008a7d6542SBram Moolenaar
1201f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1202f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
12038a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
12048a7d6542SBram Moolenaar  source Ximport.vim
12058a7d6542SBram Moolenaar
1206f5be8cdbSBram Moolenaar  # cannot declare a var twice
12078a7d6542SBram Moolenaar  lines =<< trim END
12088a7d6542SBram Moolenaar    vim9script
12098a7d6542SBram Moolenaar    let valone = 1234
12108a7d6542SBram Moolenaar    let valone = 5678
12118a7d6542SBram Moolenaar  END
12128a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
12138a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
12148a7d6542SBram Moolenaar
12158a7d6542SBram Moolenaar  delete('Xreload.vim')
12168a7d6542SBram Moolenaar  delete('Ximport.vim')
12178a7d6542SBram Moolenaarenddef
12188a7d6542SBram Moolenaar
1219fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1220fe465a01SBram Moolenaar" script-local name.
1221fe465a01SBram Moolenaardef Test_vim9script_funcref()
1222fe465a01SBram Moolenaar  let sortlines =<< trim END
1223fe465a01SBram Moolenaar      vim9script
1224fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1225bed36b93SBram Moolenaar        return i2 - i1
1226fe465a01SBram Moolenaar      enddef
1227fe465a01SBram Moolenaar
1228fe465a01SBram Moolenaar      export def FastSort(): list<number>
1229fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1230fe465a01SBram Moolenaar      enddef
1231fe465a01SBram Moolenaar  END
1232fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1233fe465a01SBram Moolenaar
1234fe465a01SBram Moolenaar  let lines =<< trim END
1235fe465a01SBram Moolenaar    vim9script
1236fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1237fe465a01SBram Moolenaar    def Test()
1238fe465a01SBram Moolenaar      g:result = FastSort()
1239fe465a01SBram Moolenaar    enddef
1240fe465a01SBram Moolenaar    Test()
1241fe465a01SBram Moolenaar  END
1242fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1243fe465a01SBram Moolenaar
1244fe465a01SBram Moolenaar  source Xscript.vim
1245fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1246fe465a01SBram Moolenaar
1247fe465a01SBram Moolenaar  unlet g:result
1248fe465a01SBram Moolenaar  delete('Xsort.vim')
1249fe465a01SBram Moolenaar  delete('Xscript.vim')
1250fe465a01SBram Moolenaarenddef
1251fe465a01SBram Moolenaar
1252c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1253c620c055SBram Moolenaar" script where FastFilter() is called from.
1254c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1255c620c055SBram Moolenaar  let filterLines =<< trim END
1256c620c055SBram Moolenaar    vim9script
1257c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1258c620c055SBram Moolenaar      return idx % 2 == 1
1259c620c055SBram Moolenaar    enddef
1260c620c055SBram Moolenaar    export def FastFilter(): list<number>
1261c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1262c620c055SBram Moolenaar    enddef
1263c620c055SBram Moolenaar  END
1264c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1265c620c055SBram Moolenaar
1266c620c055SBram Moolenaar  let lines =<< trim END
1267c620c055SBram Moolenaar    vim9script
1268c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1269c620c055SBram Moolenaar    def Test()
1270c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1271c620c055SBram Moolenaar    enddef
1272c620c055SBram Moolenaar    Test()
1273c620c055SBram Moolenaar  END
1274c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1275c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1276c620c055SBram Moolenaar
1277c620c055SBram Moolenaar  delete('Xfilter.vim')
1278c620c055SBram Moolenaar  delete('Ximport.vim')
1279c620c055SBram Moolenaarenddef
1280c620c055SBram Moolenaar
12814c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
12824c17ad94SBram Moolenaar  let first_lines =<< trim END
12834c17ad94SBram Moolenaar    vim9script
12844c17ad94SBram Moolenaar    def FuncYes(): string
12854c17ad94SBram Moolenaar      return 'yes'
12864c17ad94SBram Moolenaar    enddef
12874c17ad94SBram Moolenaar  END
128803afdcf1SBram Moolenaar  let withno_lines =<< trim END
12894c17ad94SBram Moolenaar    def FuncNo(): string
12904c17ad94SBram Moolenaar      return 'no'
12914c17ad94SBram Moolenaar    enddef
12924c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
12934c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
12944c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
129503afdcf1SBram Moolenaar    enddef
129603afdcf1SBram Moolenaar  END
129703afdcf1SBram Moolenaar  let nono_lines =<< trim END
129803afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
129903afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
13004c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
13014c17ad94SBram Moolenaar    enddef
13024c17ad94SBram Moolenaar  END
13034c17ad94SBram Moolenaar
13044c17ad94SBram Moolenaar  # FuncNo() is defined
130503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13064c17ad94SBram Moolenaar  source Xreloaded.vim
13074c17ad94SBram Moolenaar  g:DoCheck(true)
13084c17ad94SBram Moolenaar
13094c17ad94SBram Moolenaar  # FuncNo() is not redefined
131003afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
13114c17ad94SBram Moolenaar  source Xreloaded.vim
131203afdcf1SBram Moolenaar  g:DoCheck()
13134c17ad94SBram Moolenaar
13144c17ad94SBram Moolenaar  # FuncNo() is back
131503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13164c17ad94SBram Moolenaar  source Xreloaded.vim
131703afdcf1SBram Moolenaar  g:DoCheck()
13184c17ad94SBram Moolenaar
13194c17ad94SBram Moolenaar  delete('Xreloaded.vim')
13204c17ad94SBram Moolenaarenddef
13214c17ad94SBram Moolenaar
132289483d40SBram Moolenaardef Test_vim9script_reload_delvar()
132389483d40SBram Moolenaar  # write the script with a script-local variable
132489483d40SBram Moolenaar  let lines =<< trim END
132589483d40SBram Moolenaar    vim9script
132689483d40SBram Moolenaar    let var = 'string'
132789483d40SBram Moolenaar  END
132889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
132989483d40SBram Moolenaar  source XreloadVar.vim
133089483d40SBram Moolenaar
133189483d40SBram Moolenaar  # now write the script using the same variable locally - works
133289483d40SBram Moolenaar  lines =<< trim END
133389483d40SBram Moolenaar    vim9script
133489483d40SBram Moolenaar    def Func()
133589483d40SBram Moolenaar      let var = 'string'
133689483d40SBram Moolenaar    enddef
133789483d40SBram Moolenaar  END
133889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
133989483d40SBram Moolenaar  source XreloadVar.vim
134089483d40SBram Moolenaar
134189483d40SBram Moolenaar  delete('XreloadVar.vim')
134289483d40SBram Moolenaarenddef
134389483d40SBram Moolenaar
13448a7d6542SBram Moolenaardef Test_import_absolute()
13458a7d6542SBram Moolenaar  let import_lines = [
1346e6085c53SBram Moolenaar        'vim9script',
1347e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1348e6085c53SBram Moolenaar        'def UseExported()',
1349e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1350e6085c53SBram Moolenaar        '  exported = 8888',
1351e6085c53SBram Moolenaar        '  g:imported_after = exported',
1352e6085c53SBram Moolenaar        'enddef',
1353e6085c53SBram Moolenaar        'UseExported()',
1354e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1355e6085c53SBram Moolenaar        ]
13568a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
13578a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
13588a7d6542SBram Moolenaar
13598a7d6542SBram Moolenaar  source Ximport_abs.vim
13608a7d6542SBram Moolenaar
13618a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
13624e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1363675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1364675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1365675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1366675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1367675f716eSBram Moolenaar          'exported = 8888.*' ..
1368675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1369675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1370675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1371675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1372e6085c53SBram Moolenaar        g:import_disassembled)
13738a7d6542SBram Moolenaar  unlet g:imported_abs
13744e12a5dfSBram Moolenaar  unlet g:import_disassembled
13758a7d6542SBram Moolenaar
13768a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
13778a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
13788a7d6542SBram Moolenaarenddef
13798a7d6542SBram Moolenaar
13808a7d6542SBram Moolenaardef Test_import_rtp()
13818a7d6542SBram Moolenaar  let import_lines = [
1382e6085c53SBram Moolenaar        'vim9script',
1383e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1384e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1385e6085c53SBram Moolenaar        ]
13868a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
13878a7d6542SBram Moolenaar  mkdir('import')
13888a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
13898a7d6542SBram Moolenaar
13908a7d6542SBram Moolenaar  let save_rtp = &rtp
13918a7d6542SBram Moolenaar  &rtp = getcwd()
13928a7d6542SBram Moolenaar  source Ximport_rtp.vim
13938a7d6542SBram Moolenaar  &rtp = save_rtp
13948a7d6542SBram Moolenaar
13958a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
13968a7d6542SBram Moolenaar  unlet g:imported_rtp
13978a7d6542SBram Moolenaar
13988a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
139989483d40SBram Moolenaar  delete('import', 'rf')
14008a7d6542SBram Moolenaarenddef
14018a7d6542SBram Moolenaar
140225e0f586SBram Moolenaardef Test_import_compile_error()
140325e0f586SBram Moolenaar  let export_lines = [
140425e0f586SBram Moolenaar        'vim9script',
140525e0f586SBram Moolenaar        'export def ExpFunc(): string',
140625e0f586SBram Moolenaar        '  return notDefined',
140725e0f586SBram Moolenaar        'enddef',
140825e0f586SBram Moolenaar        ]
140925e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
141025e0f586SBram Moolenaar
141125e0f586SBram Moolenaar  let import_lines = [
141225e0f586SBram Moolenaar        'vim9script',
141325e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
141425e0f586SBram Moolenaar        'def ImpFunc()',
141525e0f586SBram Moolenaar        '  echo ExpFunc()',
141625e0f586SBram Moolenaar        'enddef',
141725e0f586SBram Moolenaar        'defcompile',
141825e0f586SBram Moolenaar        ]
141925e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
142025e0f586SBram Moolenaar
142125e0f586SBram Moolenaar  try
142225e0f586SBram Moolenaar    source Ximport.vim
142325e0f586SBram Moolenaar  catch /E1001/
1424f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
142525e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
142625e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
142725e0f586SBram Moolenaar  endtry
142825e0f586SBram Moolenaar
142925e0f586SBram Moolenaar  delete('Xexported.vim')
143025e0f586SBram Moolenaar  delete('Ximport.vim')
143125e0f586SBram Moolenaarenddef
143225e0f586SBram Moolenaar
14338a7d6542SBram Moolenaardef Test_fixed_size_list()
1434f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
14358a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
14368a7d6542SBram Moolenaar  l->remove(0)
14378a7d6542SBram Moolenaar  l->add(5)
14388a7d6542SBram Moolenaar  l->insert(99, 1)
14390f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
14408a7d6542SBram Moolenaarenddef
14418a7d6542SBram Moolenaar
1442158906cfSBram Moolenaardef IfElse(what: number): string
1443158906cfSBram Moolenaar  let res = ''
1444158906cfSBram Moolenaar  if what == 1
1445158906cfSBram Moolenaar    res = "one"
1446158906cfSBram Moolenaar  elseif what == 2
1447158906cfSBram Moolenaar    res = "two"
1448a259d8d3SBram Moolenaar  else
1449158906cfSBram Moolenaar    res = "three"
1450a259d8d3SBram Moolenaar  endif
1451158906cfSBram Moolenaar  return res
1452a259d8d3SBram Moolenaarenddef
1453a259d8d3SBram Moolenaar
1454158906cfSBram Moolenaardef Test_if_elseif_else()
1455158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1456158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1457158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
14580f18b6d1SBram Moolenaarenddef
14590f18b6d1SBram Moolenaar
1460e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1461e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1462e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1463e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1464e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1465585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1466e8c4abbbSBram Moolenaarenddef
1467e8c4abbbSBram Moolenaar
14686d69bf60SBram Moolenaarlet g:bool_true = v:true
14696d69bf60SBram Moolenaarlet g:bool_false = v:false
14706d69bf60SBram Moolenaar
14716d69bf60SBram Moolenaardef Test_if_const_expr()
14726d69bf60SBram Moolenaar  let res = false
14736d69bf60SBram Moolenaar  if true ? true : false
14746d69bf60SBram Moolenaar    res = true
14756d69bf60SBram Moolenaar  endif
14766d69bf60SBram Moolenaar  assert_equal(true, res)
14776d69bf60SBram Moolenaar
1478585fea7bSBram Moolenaar  g:glob = 2
1479585fea7bSBram Moolenaar  if false
14806797966dSBram Moolenaar    execute('g:glob = 3')
1481585fea7bSBram Moolenaar  endif
1482585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1483585fea7bSBram Moolenaar  if true
14846797966dSBram Moolenaar    execute('g:glob = 3')
1485585fea7bSBram Moolenaar  endif
1486585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1487585fea7bSBram Moolenaar
14886d69bf60SBram Moolenaar  res = false
14896d69bf60SBram Moolenaar  if g:bool_true ? true : false
14906d69bf60SBram Moolenaar    res = true
14916d69bf60SBram Moolenaar  endif
14926d69bf60SBram Moolenaar  assert_equal(true, res)
14936d69bf60SBram Moolenaar
14946d69bf60SBram Moolenaar  res = false
14956d69bf60SBram Moolenaar  if true ? g:bool_true : false
14966d69bf60SBram Moolenaar    res = true
14976d69bf60SBram Moolenaar  endif
14986d69bf60SBram Moolenaar  assert_equal(true, res)
14996d69bf60SBram Moolenaar
15006d69bf60SBram Moolenaar  res = false
15016d69bf60SBram Moolenaar  if true ? true : g:bool_false
15026d69bf60SBram Moolenaar    res = true
15036d69bf60SBram Moolenaar  endif
15046d69bf60SBram Moolenaar  assert_equal(true, res)
15056d69bf60SBram Moolenaar
15066d69bf60SBram Moolenaar  res = false
15076d69bf60SBram Moolenaar  if true ? false : true
15086d69bf60SBram Moolenaar    res = true
15096d69bf60SBram Moolenaar  endif
15106d69bf60SBram Moolenaar  assert_equal(false, res)
15116d69bf60SBram Moolenaar
15126d69bf60SBram Moolenaar  res = false
15136d69bf60SBram Moolenaar  if false ? false : true
15146d69bf60SBram Moolenaar    res = true
15156d69bf60SBram Moolenaar  endif
15166d69bf60SBram Moolenaar  assert_equal(true, res)
15176d69bf60SBram Moolenaar
15186d69bf60SBram Moolenaar  res = false
15196d69bf60SBram Moolenaar  if false ? true : false
15206d69bf60SBram Moolenaar    res = true
15216d69bf60SBram Moolenaar  endif
15226d69bf60SBram Moolenaar  assert_equal(false, res)
15236d69bf60SBram Moolenaar
15246d69bf60SBram Moolenaar  res = false
1525e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1526e8c4abbbSBram Moolenaar    res = true
1527e8c4abbbSBram Moolenaar  endif
1528e8c4abbbSBram Moolenaar  assert_equal(false, res)
1529e8c4abbbSBram Moolenaar
1530e8c4abbbSBram Moolenaar  res = false
15316d69bf60SBram Moolenaar  if true && true
15326d69bf60SBram Moolenaar    res = true
15336d69bf60SBram Moolenaar  endif
15346d69bf60SBram Moolenaar  assert_equal(true, res)
15356d69bf60SBram Moolenaar
15366d69bf60SBram Moolenaar  res = false
15376d69bf60SBram Moolenaar  if true && false
15386d69bf60SBram Moolenaar    res = true
15396d69bf60SBram Moolenaar  endif
15406d69bf60SBram Moolenaar  assert_equal(false, res)
15416d69bf60SBram Moolenaar
15426d69bf60SBram Moolenaar  res = false
15436d69bf60SBram Moolenaar  if g:bool_true && false
15446d69bf60SBram Moolenaar    res = true
15456d69bf60SBram Moolenaar  endif
15466d69bf60SBram Moolenaar  assert_equal(false, res)
15476d69bf60SBram Moolenaar
15486d69bf60SBram Moolenaar  res = false
15496d69bf60SBram Moolenaar  if true && g:bool_false
15506d69bf60SBram Moolenaar    res = true
15516d69bf60SBram Moolenaar  endif
15526d69bf60SBram Moolenaar  assert_equal(false, res)
15536d69bf60SBram Moolenaar
15546d69bf60SBram Moolenaar  res = false
15556d69bf60SBram Moolenaar  if false && false
15566d69bf60SBram Moolenaar    res = true
15576d69bf60SBram Moolenaar  endif
15586d69bf60SBram Moolenaar  assert_equal(false, res)
15596d69bf60SBram Moolenaar
15606d69bf60SBram Moolenaar  res = false
15616d69bf60SBram Moolenaar  if true || false
15626d69bf60SBram Moolenaar    res = true
15636d69bf60SBram Moolenaar  endif
15646d69bf60SBram Moolenaar  assert_equal(true, res)
15656d69bf60SBram Moolenaar
15666d69bf60SBram Moolenaar  res = false
15676d69bf60SBram Moolenaar  if g:bool_true || false
15686d69bf60SBram Moolenaar    res = true
15696d69bf60SBram Moolenaar  endif
15706d69bf60SBram Moolenaar  assert_equal(true, res)
15716d69bf60SBram Moolenaar
15726d69bf60SBram Moolenaar  res = false
15736d69bf60SBram Moolenaar  if true || g:bool_false
15746d69bf60SBram Moolenaar    res = true
15756d69bf60SBram Moolenaar  endif
15766d69bf60SBram Moolenaar  assert_equal(true, res)
15776d69bf60SBram Moolenaar
15786d69bf60SBram Moolenaar  res = false
15796d69bf60SBram Moolenaar  if false || false
15806d69bf60SBram Moolenaar    res = true
15816d69bf60SBram Moolenaar  endif
15826d69bf60SBram Moolenaar  assert_equal(false, res)
158380c34ca3SBram Moolenaarenddef
15846d69bf60SBram Moolenaar
158580c34ca3SBram Moolenaardef Test_if_const_expr_fails()
158680c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
158780c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1588e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1589e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
15906d69bf60SBram Moolenaarenddef
15916d69bf60SBram Moolenaar
159272abcf42SBram Moolenaardef RunNested(i: number): number
159372abcf42SBram Moolenaar  let x: number = 0
159472abcf42SBram Moolenaar  if i % 2
159572abcf42SBram Moolenaar    if 1
1596f5be8cdbSBram Moolenaar      # comment
159772abcf42SBram Moolenaar    else
1598f5be8cdbSBram Moolenaar      # comment
159972abcf42SBram Moolenaar    endif
160072abcf42SBram Moolenaar    x += 1
160172abcf42SBram Moolenaar  else
160272abcf42SBram Moolenaar    x += 1000
160372abcf42SBram Moolenaar  endif
160472abcf42SBram Moolenaar  return x
160572abcf42SBram Moolenaarenddef
160672abcf42SBram Moolenaar
160772abcf42SBram Moolenaardef Test_nested_if()
160872abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
160972abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
161072abcf42SBram Moolenaarenddef
161172abcf42SBram Moolenaar
1612ad39c094SBram Moolenaardef Test_execute_cmd()
1613ad39c094SBram Moolenaar  new
1614ad39c094SBram Moolenaar  setline(1, 'default')
1615ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1616ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1617a72cfb80SBram Moolenaar
1618a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1619a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1620a72cfb80SBram Moolenaar
1621ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1622ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1623a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1624ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1625a72cfb80SBram Moolenaar
1626ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1627ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1628a72cfb80SBram Moolenaar
1629ad39c094SBram Moolenaar  let cmd_first = 'call '
1630ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1631ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1632ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1633ad39c094SBram Moolenaar  bwipe!
1634585fea7bSBram Moolenaar
1635585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1636a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1637ad39c094SBram Moolenaarenddef
1638ad39c094SBram Moolenaar
163947e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1640f5be8cdbSBram Moolenaar  # only checks line continuation
164147e880d6SBram Moolenaar  let lines =<< trim END
164247e880d6SBram Moolenaar      vim9script
164347e880d6SBram Moolenaar      execute 'g:someVar'
164447e880d6SBram Moolenaar                .. ' = ' ..
164547e880d6SBram Moolenaar                   '28'
164647e880d6SBram Moolenaar      assert_equal(28, g:someVar)
164747e880d6SBram Moolenaar      unlet g:someVar
164847e880d6SBram Moolenaar  END
164947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
165047e880d6SBram Moolenaarenddef
165147e880d6SBram Moolenaar
1652ad39c094SBram Moolenaardef Test_echo_cmd()
1653a72cfb80SBram Moolenaar  echo 'some' # comment
1654585fea7bSBram Moolenaar  echon 'thing'
1655ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1656ad39c094SBram Moolenaar
1657a72cfb80SBram Moolenaar  echo "some" # comment
1658a72cfb80SBram Moolenaar  echon "thing"
1659a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1660a72cfb80SBram Moolenaar
1661ad39c094SBram Moolenaar  let str1 = 'some'
1662ad39c094SBram Moolenaar  let str2 = 'more'
1663ad39c094SBram Moolenaar  echo str1 str2
1664ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1665a72cfb80SBram Moolenaar
1666a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1667ad39c094SBram Moolenaarenddef
1668ad39c094SBram Moolenaar
1669f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1670f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1671f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1672f93c7feaSBram Moolenaar  echo 'clear'
1673df069eecSBram Moolenaar  :1messages
1674f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1675f93c7feaSBram Moolenaar
1676f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1677f93c7feaSBram Moolenaarenddef
1678f93c7feaSBram Moolenaar
167947e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1680f5be8cdbSBram Moolenaar  # only checks line continuation
168147e880d6SBram Moolenaar  let lines =<< trim END
168247e880d6SBram Moolenaar      vim9script
168347e880d6SBram Moolenaar      echomsg 'here'
168447e880d6SBram Moolenaar                .. ' is ' ..
168547e880d6SBram Moolenaar                   'a message'
168647e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
168747e880d6SBram Moolenaar  END
168847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
168947e880d6SBram Moolenaarenddef
169047e880d6SBram Moolenaar
1691f93c7feaSBram Moolenaardef Test_echoerr_cmd()
169240ee466cSBram Moolenaar  try
169340ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
169440ee466cSBram Moolenaar  catch
169540ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
169640ee466cSBram Moolenaar  endtry
1697f93c7feaSBram Moolenaarenddef
1698f93c7feaSBram Moolenaar
169947e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1700f5be8cdbSBram Moolenaar  # only checks line continuation
170147e880d6SBram Moolenaar  let lines =<< trim END
170247e880d6SBram Moolenaar      vim9script
170347e880d6SBram Moolenaar      try
170447e880d6SBram Moolenaar        echoerr 'this'
170547e880d6SBram Moolenaar                .. ' is ' ..
170647e880d6SBram Moolenaar                   'wrong'
170747e880d6SBram Moolenaar      catch
170847e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
170947e880d6SBram Moolenaar      endtry
171047e880d6SBram Moolenaar  END
171147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
171247e880d6SBram Moolenaarenddef
171347e880d6SBram Moolenaar
171441fe0617SBram Moolenaardef Test_for_outside_of_function()
171541fe0617SBram Moolenaar  let lines =<< trim END
171641fe0617SBram Moolenaar    vim9script
171741fe0617SBram Moolenaar    new
171841fe0617SBram Moolenaar    for var in range(0, 3)
171941fe0617SBram Moolenaar      append(line('$'), var)
172041fe0617SBram Moolenaar    endfor
172141fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
172241fe0617SBram Moolenaar    bwipe!
172341fe0617SBram Moolenaar  END
172441fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
172541fe0617SBram Moolenaar  source Xvim9for.vim
172641fe0617SBram Moolenaar  delete('Xvim9for.vim')
172741fe0617SBram Moolenaarenddef
17288a7d6542SBram Moolenaar
1729e8c4abbbSBram Moolenaardef Test_for_loop()
1730e8c4abbbSBram Moolenaar  let result = ''
1731e8c4abbbSBram Moolenaar  for cnt in range(7)
1732e8c4abbbSBram Moolenaar    if cnt == 4
1733e8c4abbbSBram Moolenaar      break
1734e8c4abbbSBram Moolenaar    endif
1735e8c4abbbSBram Moolenaar    if cnt == 2
1736e8c4abbbSBram Moolenaar      continue
1737e8c4abbbSBram Moolenaar    endif
1738e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1739e8c4abbbSBram Moolenaar  endfor
1740e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
17410ad3e894SBram Moolenaar
17420ad3e894SBram Moolenaar  let concat = ''
17430ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
17440ad3e894SBram Moolenaar    concat ..= str
17450ad3e894SBram Moolenaar  endfor
17460ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1747e8c4abbbSBram Moolenaarenddef
1748e8c4abbbSBram Moolenaar
1749e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1750675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1751675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1752675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1753822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
17540ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
1755675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1756675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1757675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1758e8c4abbbSBram Moolenaarenddef
1759e8c4abbbSBram Moolenaar
1760d0df1aacSBram Moolenaardef Test_while_loop()
1761d0df1aacSBram Moolenaar  let result = ''
1762d0df1aacSBram Moolenaar  let cnt = 0
1763d0df1aacSBram Moolenaar  while cnt < 555
1764d0df1aacSBram Moolenaar    if cnt == 3
1765d0df1aacSBram Moolenaar      break
1766d0df1aacSBram Moolenaar    endif
1767d0df1aacSBram Moolenaar    cnt += 1
1768d0df1aacSBram Moolenaar    if cnt == 2
1769d0df1aacSBram Moolenaar      continue
1770d0df1aacSBram Moolenaar    endif
1771d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1772d0df1aacSBram Moolenaar  endwhile
1773d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1774d0df1aacSBram Moolenaarenddef
1775d0df1aacSBram Moolenaar
1776e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1777675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1778675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1779675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1780675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1781675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1782675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1783675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1784bd5da371SBram Moolenaarenddef
1785bd5da371SBram Moolenaar
17869645e2d9SBram Moolenaardef Test_interrupt_loop()
178797acfc78SBram Moolenaar  let caught = false
17889645e2d9SBram Moolenaar  let x = 0
178997acfc78SBram Moolenaar  try
17909645e2d9SBram Moolenaar    while 1
17919645e2d9SBram Moolenaar      x += 1
17929645e2d9SBram Moolenaar      if x == 100
17939645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
17949645e2d9SBram Moolenaar      endif
17959645e2d9SBram Moolenaar    endwhile
179697acfc78SBram Moolenaar  catch
179797acfc78SBram Moolenaar    caught = true
179897acfc78SBram Moolenaar    assert_equal(100, x)
179997acfc78SBram Moolenaar  endtry
180097acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
18019645e2d9SBram Moolenaarenddef
180220431c9dSBram Moolenaar
18034fdae999SBram Moolenaardef Test_automatic_line_continuation()
18044fdae999SBram Moolenaar  let mylist = [
18054fdae999SBram Moolenaar      'one',
18064fdae999SBram Moolenaar      'two',
18074fdae999SBram Moolenaar      'three',
1808f5be8cdbSBram Moolenaar      ] # comment
18094fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
18104fdae999SBram Moolenaar
18114fdae999SBram Moolenaar  let mydict = {
18124fdae999SBram Moolenaar      'one': 1,
18134fdae999SBram Moolenaar      'two': 2,
18144fdae999SBram Moolenaar      'three':
18154fdae999SBram Moolenaar          3,
1816f5be8cdbSBram Moolenaar      } # comment
18174fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
18184fdae999SBram Moolenaar  mydict = #{
18192c330432SBram Moolenaar      one: 1,  # comment
18202c330432SBram Moolenaar      two:     # comment
18212c330432SBram Moolenaar           2,  # comment
18222c330432SBram Moolenaar      three: 3 # comment
18232c330432SBram Moolenaar      }
18242c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
18252c330432SBram Moolenaar  mydict = #{
18262c330432SBram Moolenaar      one: 1,
18274fdae999SBram Moolenaar      two:
18284fdae999SBram Moolenaar           2,
18292c330432SBram Moolenaar      three: 3
18304fdae999SBram Moolenaar      }
18314fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1832e6085c53SBram Moolenaar
1833e6085c53SBram Moolenaar  assert_equal(
1834e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1835e6085c53SBram Moolenaar        split('one two three')
1836e6085c53SBram Moolenaar        )
18374fdae999SBram Moolenaarenddef
18384fdae999SBram Moolenaar
18397a092245SBram Moolenaardef Test_vim9_comment()
18407a092245SBram Moolenaar  CheckScriptSuccess([
18417a092245SBram Moolenaar      'vim9script',
18427a092245SBram Moolenaar      '# something',
18437a092245SBram Moolenaar      ])
18447a092245SBram Moolenaar  CheckScriptFailure([
18457a092245SBram Moolenaar      'vim9script',
18467a092245SBram Moolenaar      ':# something',
18477a092245SBram Moolenaar      ], 'E488:')
18487a092245SBram Moolenaar  CheckScriptFailure([
18497a092245SBram Moolenaar      '# something',
18507a092245SBram Moolenaar      ], 'E488:')
18517a092245SBram Moolenaar  CheckScriptFailure([
18527a092245SBram Moolenaar      ':# something',
18537a092245SBram Moolenaar      ], 'E488:')
18547a092245SBram Moolenaar
18554a8d9f2eSBram Moolenaar  { # block start
18564a8d9f2eSBram Moolenaar  } # block end
18574a8d9f2eSBram Moolenaar  CheckDefFailure([
18584a8d9f2eSBram Moolenaar      '{# comment',
18594a8d9f2eSBram Moolenaar      ], 'E488:')
18604a8d9f2eSBram Moolenaar  CheckDefFailure([
18614a8d9f2eSBram Moolenaar      '{',
18624a8d9f2eSBram Moolenaar      '}# comment',
18634a8d9f2eSBram Moolenaar      ], 'E488:')
18644a8d9f2eSBram Moolenaar
18654a8d9f2eSBram Moolenaar  echo "yes" # comment
18664a8d9f2eSBram Moolenaar  CheckDefFailure([
18674a8d9f2eSBram Moolenaar      'echo "yes"# comment',
18684a8d9f2eSBram Moolenaar      ], 'E488:')
18697a092245SBram Moolenaar  CheckScriptSuccess([
18707a092245SBram Moolenaar      'vim9script',
18717a092245SBram Moolenaar      'echo "yes" # something',
18727a092245SBram Moolenaar      ])
18737a092245SBram Moolenaar  CheckScriptFailure([
18747a092245SBram Moolenaar      'vim9script',
18757a092245SBram Moolenaar      'echo "yes"# something',
18767a092245SBram Moolenaar      ], 'E121:')
18777a092245SBram Moolenaar  CheckScriptFailure([
18787a092245SBram Moolenaar      'vim9script',
18797a092245SBram Moolenaar      'echo# something',
18807a092245SBram Moolenaar      ], 'E121:')
18817a092245SBram Moolenaar  CheckScriptFailure([
18827a092245SBram Moolenaar      'echo "yes" # something',
18837a092245SBram Moolenaar      ], 'E121:')
18847a092245SBram Moolenaar
18854a8d9f2eSBram Moolenaar  exe "echo" # comment
18864a8d9f2eSBram Moolenaar  CheckDefFailure([
18874a8d9f2eSBram Moolenaar      'exe "echo"# comment',
18884a8d9f2eSBram Moolenaar      ], 'E488:')
18894a8d9f2eSBram Moolenaar  CheckScriptSuccess([
18904a8d9f2eSBram Moolenaar      'vim9script',
18914a8d9f2eSBram Moolenaar      'exe "echo" # something',
18924a8d9f2eSBram Moolenaar      ])
18934a8d9f2eSBram Moolenaar  CheckScriptFailure([
18944a8d9f2eSBram Moolenaar      'vim9script',
18954a8d9f2eSBram Moolenaar      'exe "echo"# something',
18964a8d9f2eSBram Moolenaar      ], 'E121:')
18974a8d9f2eSBram Moolenaar  CheckDefFailure([
18984a8d9f2eSBram Moolenaar      'exe # comment',
18994a8d9f2eSBram Moolenaar      ], 'E1015:')
19004a8d9f2eSBram Moolenaar  CheckScriptFailure([
19014a8d9f2eSBram Moolenaar      'vim9script',
19024a8d9f2eSBram Moolenaar      'exe# something',
19034a8d9f2eSBram Moolenaar      ], 'E121:')
19044a8d9f2eSBram Moolenaar  CheckScriptFailure([
19054a8d9f2eSBram Moolenaar      'exe "echo" # something',
19064a8d9f2eSBram Moolenaar      ], 'E121:')
19074a8d9f2eSBram Moolenaar
19087a092245SBram Moolenaar  CheckDefFailure([
19097a092245SBram Moolenaar      'try# comment',
19107a092245SBram Moolenaar      '  echo "yes"',
19117a092245SBram Moolenaar      'catch',
19127a092245SBram Moolenaar      'endtry',
19137a092245SBram Moolenaar      ], 'E488:')
19142c5ed4e3SBram Moolenaar  CheckScriptFailure([
19152c5ed4e3SBram Moolenaar      'vim9script',
19162c5ed4e3SBram Moolenaar      'try# comment',
19172c5ed4e3SBram Moolenaar      'echo "yes"',
19182c5ed4e3SBram Moolenaar      ], 'E488:')
19197a092245SBram Moolenaar  CheckDefFailure([
19207a092245SBram Moolenaar      'try',
1921a72cfb80SBram Moolenaar      '  throw#comment',
1922a72cfb80SBram Moolenaar      'catch',
1923a72cfb80SBram Moolenaar      'endtry',
1924a72cfb80SBram Moolenaar      ], 'E1015:')
1925a72cfb80SBram Moolenaar  CheckDefFailure([
1926a72cfb80SBram Moolenaar      'try',
1927a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1928a72cfb80SBram Moolenaar      'catch',
1929a72cfb80SBram Moolenaar      'endtry',
1930a72cfb80SBram Moolenaar      ], 'E488:')
1931a72cfb80SBram Moolenaar  CheckDefFailure([
1932a72cfb80SBram Moolenaar      'try',
19337a092245SBram Moolenaar      '  echo "yes"',
19347a092245SBram Moolenaar      'catch# comment',
19357a092245SBram Moolenaar      'endtry',
19367a092245SBram Moolenaar      ], 'E488:')
19372c5ed4e3SBram Moolenaar  CheckScriptFailure([
19382c5ed4e3SBram Moolenaar      'vim9script',
19392c5ed4e3SBram Moolenaar      'try',
19402c5ed4e3SBram Moolenaar      '  echo "yes"',
19412c5ed4e3SBram Moolenaar      'catch# comment',
19422c5ed4e3SBram Moolenaar      'endtry',
19432c5ed4e3SBram Moolenaar      ], 'E654:')
19442c5ed4e3SBram Moolenaar  CheckDefFailure([
19452c5ed4e3SBram Moolenaar      'try',
19462c5ed4e3SBram Moolenaar      '  echo "yes"',
19472c5ed4e3SBram Moolenaar      'catch /pat/# comment',
19482c5ed4e3SBram Moolenaar      'endtry',
19492c5ed4e3SBram Moolenaar      ], 'E488:')
19507a092245SBram Moolenaar  CheckDefFailure([
19517a092245SBram Moolenaar      'try',
19527a092245SBram Moolenaar      'echo "yes"',
19537a092245SBram Moolenaar      'catch',
19547a092245SBram Moolenaar      'endtry# comment',
19557a092245SBram Moolenaar      ], 'E488:')
19562c5ed4e3SBram Moolenaar  CheckScriptFailure([
19572c5ed4e3SBram Moolenaar      'vim9script',
19582c5ed4e3SBram Moolenaar      'try',
19592c5ed4e3SBram Moolenaar      '  echo "yes"',
19602c5ed4e3SBram Moolenaar      'catch',
19612c5ed4e3SBram Moolenaar      'endtry# comment',
19629b7bf9e9SBram Moolenaar      ], 'E488:')
19632c5ed4e3SBram Moolenaar
19642c5ed4e3SBram Moolenaar  CheckScriptSuccess([
19652c5ed4e3SBram Moolenaar      'vim9script',
19662c5ed4e3SBram Moolenaar      'hi # comment',
19672c5ed4e3SBram Moolenaar      ])
19682c5ed4e3SBram Moolenaar  CheckScriptFailure([
19692c5ed4e3SBram Moolenaar      'vim9script',
19702c5ed4e3SBram Moolenaar      'hi# comment',
19712c5ed4e3SBram Moolenaar      ], 'E416:')
19721966c248SBram Moolenaar  CheckScriptSuccess([
19731966c248SBram Moolenaar      'vim9script',
19741966c248SBram Moolenaar      'hi Search # comment',
19751966c248SBram Moolenaar      ])
19761966c248SBram Moolenaar  CheckScriptFailure([
19771966c248SBram Moolenaar      'vim9script',
19781966c248SBram Moolenaar      'hi Search# comment',
19791966c248SBram Moolenaar      ], 'E416:')
19801966c248SBram Moolenaar  CheckScriptSuccess([
19811966c248SBram Moolenaar      'vim9script',
19821966c248SBram Moolenaar      'hi link This Search # comment',
19831966c248SBram Moolenaar      ])
19841966c248SBram Moolenaar  CheckScriptFailure([
19851966c248SBram Moolenaar      'vim9script',
19861966c248SBram Moolenaar      'hi link This That# comment',
19871966c248SBram Moolenaar      ], 'E413:')
19881966c248SBram Moolenaar  CheckScriptSuccess([
19891966c248SBram Moolenaar      'vim9script',
19901966c248SBram Moolenaar      'hi clear This # comment',
19911966c248SBram Moolenaar      'hi clear # comment',
19921966c248SBram Moolenaar      ])
1993f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
1994f5be8cdbSBram Moolenaar  # hi clear This# comment',
19951966c248SBram Moolenaar  CheckScriptFailure([
19961966c248SBram Moolenaar      'vim9script',
19971966c248SBram Moolenaar      'hi clear# comment',
19981966c248SBram Moolenaar      ], 'E416:')
19991966c248SBram Moolenaar
20001966c248SBram Moolenaar  CheckScriptSuccess([
20011966c248SBram Moolenaar      'vim9script',
20021966c248SBram Moolenaar      'hi Group term=bold',
20031966c248SBram Moolenaar      'match Group /todo/ # comment',
20041966c248SBram Moolenaar      ])
20051966c248SBram Moolenaar  CheckScriptFailure([
20061966c248SBram Moolenaar      'vim9script',
20071966c248SBram Moolenaar      'hi Group term=bold',
20081966c248SBram Moolenaar      'match Group /todo/# comment',
20091966c248SBram Moolenaar      ], 'E488:')
20101966c248SBram Moolenaar  CheckScriptSuccess([
20111966c248SBram Moolenaar      'vim9script',
20121966c248SBram Moolenaar      'match # comment',
20131966c248SBram Moolenaar      ])
20141966c248SBram Moolenaar  CheckScriptFailure([
20151966c248SBram Moolenaar      'vim9script',
20161966c248SBram Moolenaar      'match# comment',
20171966c248SBram Moolenaar      ], 'E475:')
20181966c248SBram Moolenaar  CheckScriptSuccess([
20191966c248SBram Moolenaar      'vim9script',
20201966c248SBram Moolenaar      'match none # comment',
20211966c248SBram Moolenaar      ])
20221966c248SBram Moolenaar  CheckScriptFailure([
20231966c248SBram Moolenaar      'vim9script',
20241966c248SBram Moolenaar      'match none# comment',
20251966c248SBram Moolenaar      ], 'E475:')
20261966c248SBram Moolenaar
20271966c248SBram Moolenaar  CheckScriptSuccess([
20281966c248SBram Moolenaar      'vim9script',
20291966c248SBram Moolenaar      'menutrans clear # comment',
20301966c248SBram Moolenaar      ])
20311966c248SBram Moolenaar  CheckScriptFailure([
20321966c248SBram Moolenaar      'vim9script',
20331966c248SBram Moolenaar      'menutrans clear# comment text',
20341966c248SBram Moolenaar      ], 'E474:')
20351966c248SBram Moolenaar
20361966c248SBram Moolenaar  CheckScriptSuccess([
20371966c248SBram Moolenaar      'vim9script',
20381966c248SBram Moolenaar      'syntax clear # comment',
20391966c248SBram Moolenaar      ])
20401966c248SBram Moolenaar  CheckScriptFailure([
20411966c248SBram Moolenaar      'vim9script',
20421966c248SBram Moolenaar      'syntax clear# comment text',
20431966c248SBram Moolenaar      ], 'E28:')
20441966c248SBram Moolenaar  CheckScriptSuccess([
20451966c248SBram Moolenaar      'vim9script',
20461966c248SBram Moolenaar      'syntax keyword Word some',
20471966c248SBram Moolenaar      'syntax clear Word # comment',
20481966c248SBram Moolenaar      ])
20491966c248SBram Moolenaar  CheckScriptFailure([
20501966c248SBram Moolenaar      'vim9script',
20511966c248SBram Moolenaar      'syntax keyword Word some',
20521966c248SBram Moolenaar      'syntax clear Word# comment text',
20531966c248SBram Moolenaar      ], 'E28:')
20541966c248SBram Moolenaar
20551966c248SBram Moolenaar  CheckScriptSuccess([
20561966c248SBram Moolenaar      'vim9script',
20571966c248SBram Moolenaar      'syntax list # comment',
20581966c248SBram Moolenaar      ])
20591966c248SBram Moolenaar  CheckScriptFailure([
20601966c248SBram Moolenaar      'vim9script',
20611966c248SBram Moolenaar      'syntax list# comment text',
20621966c248SBram Moolenaar      ], 'E28:')
20631966c248SBram Moolenaar
20641966c248SBram Moolenaar  CheckScriptSuccess([
20651966c248SBram Moolenaar      'vim9script',
20661966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
20671966c248SBram Moolenaar      ])
20681966c248SBram Moolenaar  CheckScriptFailure([
20691966c248SBram Moolenaar      'vim9script',
20701966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
20711966c248SBram Moolenaar      ], 'E475:')
20721966c248SBram Moolenaar
20731966c248SBram Moolenaar  CheckScriptSuccess([
20741966c248SBram Moolenaar      'vim9script',
20751966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
20761966c248SBram Moolenaar      ])
20771966c248SBram Moolenaar  CheckScriptFailure([
20781966c248SBram Moolenaar      'vim9script',
20791966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
20801966c248SBram Moolenaar      ], 'E789:')
20811966c248SBram Moolenaar
20821966c248SBram Moolenaar  CheckScriptSuccess([
20831966c248SBram Moolenaar      'vim9script',
20841966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
20851966c248SBram Moolenaar      ])
20861966c248SBram Moolenaar  CheckScriptFailure([
20871966c248SBram Moolenaar      'vim9script',
20881966c248SBram Moolenaar      'syntax match Word /pat/# comment',
20891966c248SBram Moolenaar      ], 'E402:')
20901966c248SBram Moolenaar
20911966c248SBram Moolenaar  CheckScriptSuccess([
20921966c248SBram Moolenaar      'vim9script',
20931966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
20941966c248SBram Moolenaar      ])
20951966c248SBram Moolenaar  CheckScriptFailure([
20961966c248SBram Moolenaar      'vim9script',
20971966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
20981966c248SBram Moolenaar      ], 'E475:')
20991966c248SBram Moolenaar  CheckScriptFailure([
21001966c248SBram Moolenaar      'vim9script',
21011966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
21021966c248SBram Moolenaar      ], 'E406:')
21031966c248SBram Moolenaar  CheckScriptFailure([
21041966c248SBram Moolenaar      'vim9script',
21051966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
21061966c248SBram Moolenaar      ], 'E475:')
21071966c248SBram Moolenaar
21081966c248SBram Moolenaar  CheckScriptSuccess([
21091966c248SBram Moolenaar      'vim9script',
21101966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
21111966c248SBram Moolenaar      ])
21121966c248SBram Moolenaar  CheckScriptFailure([
21131966c248SBram Moolenaar      'vim9script',
21141966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2115d032f34aSBram Moolenaar      ], 'E402:')
21161966c248SBram Moolenaar
21171966c248SBram Moolenaar  CheckScriptSuccess([
21181966c248SBram Moolenaar      'vim9script',
21191966c248SBram Moolenaar      'syntax sync # comment',
21201966c248SBram Moolenaar      ])
21211966c248SBram Moolenaar  CheckScriptFailure([
21221966c248SBram Moolenaar      'vim9script',
21231966c248SBram Moolenaar      'syntax sync# comment',
21241966c248SBram Moolenaar      ], 'E404:')
21251966c248SBram Moolenaar  CheckScriptSuccess([
21261966c248SBram Moolenaar      'vim9script',
21271966c248SBram Moolenaar      'syntax sync ccomment # comment',
21281966c248SBram Moolenaar      ])
21291966c248SBram Moolenaar  CheckScriptFailure([
21301966c248SBram Moolenaar      'vim9script',
21311966c248SBram Moolenaar      'syntax sync ccomment# comment',
21321966c248SBram Moolenaar      ], 'E404:')
21331966c248SBram Moolenaar
21341966c248SBram Moolenaar  CheckScriptSuccess([
21351966c248SBram Moolenaar      'vim9script',
21361966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
21371966c248SBram Moolenaar      ])
21381966c248SBram Moolenaar  CheckScriptFailure([
21391966c248SBram Moolenaar      'vim9script',
21401966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
21411966c248SBram Moolenaar      ], 'E475:')
2142a72cfb80SBram Moolenaar
2143a72cfb80SBram Moolenaar  CheckScriptSuccess([
2144a72cfb80SBram Moolenaar      'vim9script',
2145a72cfb80SBram Moolenaar      'command Echo echo # comment',
2146a72cfb80SBram Moolenaar      'command Echo # comment',
2147a72cfb80SBram Moolenaar      ])
2148a72cfb80SBram Moolenaar  CheckScriptFailure([
2149a72cfb80SBram Moolenaar      'vim9script',
2150a72cfb80SBram Moolenaar      'command Echo echo# comment',
2151a72cfb80SBram Moolenaar      'Echo',
2152a72cfb80SBram Moolenaar      ], 'E121:')
2153a72cfb80SBram Moolenaar  CheckScriptFailure([
2154a72cfb80SBram Moolenaar      'vim9script',
2155a72cfb80SBram Moolenaar      'command Echo# comment',
2156a72cfb80SBram Moolenaar      ], 'E182:')
2157a72cfb80SBram Moolenaar  CheckScriptFailure([
2158a72cfb80SBram Moolenaar      'vim9script',
2159a72cfb80SBram Moolenaar      'command Echo echo',
2160a72cfb80SBram Moolenaar      'command Echo# comment',
2161a72cfb80SBram Moolenaar      ], 'E182:')
2162a72cfb80SBram Moolenaar
2163a72cfb80SBram Moolenaar  CheckScriptSuccess([
2164a72cfb80SBram Moolenaar      'vim9script',
2165a72cfb80SBram Moolenaar      'function # comment',
2166a72cfb80SBram Moolenaar      ])
2167a72cfb80SBram Moolenaar  CheckScriptFailure([
2168a72cfb80SBram Moolenaar      'vim9script',
2169a72cfb80SBram Moolenaar      'function# comment',
2170a72cfb80SBram Moolenaar      ], 'E129:')
2171a72cfb80SBram Moolenaar  CheckScriptSuccess([
2172a72cfb80SBram Moolenaar      'vim9script',
2173a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2174a72cfb80SBram Moolenaar      ])
2175a72cfb80SBram Moolenaar  CheckScriptFailure([
2176a72cfb80SBram Moolenaar      'vim9script',
2177a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2178a72cfb80SBram Moolenaar      ], 'E488:')
2179a72cfb80SBram Moolenaar
2180a72cfb80SBram Moolenaar  CheckScriptSuccess([
2181a72cfb80SBram Moolenaar      'vim9script',
21824c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2183a72cfb80SBram Moolenaar      'endfunc',
21844c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2185a72cfb80SBram Moolenaar      ])
2186a72cfb80SBram Moolenaar  CheckScriptFailure([
2187a72cfb80SBram Moolenaar      'vim9script',
21884c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2189a72cfb80SBram Moolenaar      'endfunc',
21904c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2191a72cfb80SBram Moolenaar      ], 'E488:')
2192a72cfb80SBram Moolenaar
2193a72cfb80SBram Moolenaar  CheckScriptSuccess([
2194a72cfb80SBram Moolenaar      'vim9script',
2195a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2196a72cfb80SBram Moolenaar      ])
2197a72cfb80SBram Moolenaar  CheckScriptFailure([
2198a72cfb80SBram Moolenaar      'vim9script',
2199a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2200a72cfb80SBram Moolenaar      ], 'E488:')
22012c5ed4e3SBram Moolenaarenddef
22022c5ed4e3SBram Moolenaar
22032c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
22042c5ed4e3SBram Moolenaar  CheckCanRunGui
22052c5ed4e3SBram Moolenaar
22062c5ed4e3SBram Moolenaar  CheckScriptFailure([
22072c5ed4e3SBram Moolenaar      'vim9script',
22082c5ed4e3SBram Moolenaar      'gui#comment'
22092c5ed4e3SBram Moolenaar      ], 'E499:')
22102c5ed4e3SBram Moolenaar  CheckScriptFailure([
22112c5ed4e3SBram Moolenaar      'vim9script',
22122c5ed4e3SBram Moolenaar      'gui -f#comment'
22132c5ed4e3SBram Moolenaar      ], 'E499:')
22147a092245SBram Moolenaarenddef
22157a092245SBram Moolenaar
2216a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
22176797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
22186797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2219a26b9700SBram Moolenaar
2220a26b9700SBram Moolenaar  edit test.vim
2221a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2222a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2223a26b9700SBram Moolenaar
2224a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2225a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2226a26b9700SBram Moolenaar
2227a26b9700SBram Moolenaar  g:entered = 0
2228a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2229a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2230a26b9700SBram Moolenaar
2231a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2232a26b9700SBram Moolenaar
2233a26b9700SBram Moolenaar  au! TabEnter
2234a26b9700SBram Moolenaar  unlet g:entered
2235d72c1bf0SBram Moolenaar
2236d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2237d72c1bf0SBram Moolenaar      'vim9script',
22386797966dSBram Moolenaar      'g:var = 123',
2239e55b1c09SBram Moolenaar      'b:var = 456',
2240e55b1c09SBram Moolenaar      'w:var = 777',
2241e55b1c09SBram Moolenaar      't:var = 888',
2242d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2243d72c1bf0SBram Moolenaar      ])
2244d72c1bf0SBram Moolenaar
2245d72c1bf0SBram Moolenaar  CheckScriptFailure([
2246d72c1bf0SBram Moolenaar      'vim9script',
2247d72c1bf0SBram Moolenaar      'let g:var = 123',
2248e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2249e55b1c09SBram Moolenaar
2250e55b1c09SBram Moolenaar  CheckScriptFailure([
2251e55b1c09SBram Moolenaar      'vim9script',
2252e55b1c09SBram Moolenaar      'let b:var = 123',
2253e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2254e55b1c09SBram Moolenaar
2255e55b1c09SBram Moolenaar  CheckScriptFailure([
2256e55b1c09SBram Moolenaar      'vim9script',
2257e55b1c09SBram Moolenaar      'let w:var = 123',
2258e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2259e55b1c09SBram Moolenaar
2260e55b1c09SBram Moolenaar  CheckScriptFailure([
2261e55b1c09SBram Moolenaar      'vim9script',
2262e55b1c09SBram Moolenaar      'let t:var = 123',
2263e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2264e55b1c09SBram Moolenaar
2265e55b1c09SBram Moolenaar  CheckScriptFailure([
2266e55b1c09SBram Moolenaar      'vim9script',
2267e55b1c09SBram Moolenaar      'let v:version = 123',
2268e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2269e55b1c09SBram Moolenaar
2270e55b1c09SBram Moolenaar  CheckScriptFailure([
2271e55b1c09SBram Moolenaar      'vim9script',
2272e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2273e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
22746797966dSBram Moolenaar
22756797966dSBram Moolenaar  CheckScriptFailure([
22766797966dSBram Moolenaar      'vim9script',
22776797966dSBram Moolenaar      'g:var = 123',
227832e35117SBram Moolenaar      'unlet g:var# comment1',
2279d72c1bf0SBram Moolenaar      ], 'E108:')
2280d72c1bf0SBram Moolenaar
2281d72c1bf0SBram Moolenaar  CheckScriptFailure([
2282d72c1bf0SBram Moolenaar      'let g:var = 123',
2283d72c1bf0SBram Moolenaar      'unlet g:var # something',
2284d72c1bf0SBram Moolenaar      ], 'E488:')
2285faac4104SBram Moolenaar
2286faac4104SBram Moolenaar  CheckScriptSuccess([
2287faac4104SBram Moolenaar      'vim9script',
228832e35117SBram Moolenaar      'if 1 # comment2',
2289faac4104SBram Moolenaar      '  echo "yes"',
2290faac4104SBram Moolenaar      'elseif 2 #comment',
2291faac4104SBram Moolenaar      '  echo "no"',
2292faac4104SBram Moolenaar      'endif',
2293faac4104SBram Moolenaar      ])
2294faac4104SBram Moolenaar
2295faac4104SBram Moolenaar  CheckScriptFailure([
2296faac4104SBram Moolenaar      'vim9script',
229732e35117SBram Moolenaar      'if 1# comment3',
2298faac4104SBram Moolenaar      '  echo "yes"',
2299faac4104SBram Moolenaar      'endif',
2300faac4104SBram Moolenaar      ], 'E15:')
2301faac4104SBram Moolenaar
2302faac4104SBram Moolenaar  CheckScriptFailure([
2303faac4104SBram Moolenaar      'vim9script',
230432e35117SBram Moolenaar      'if 0 # comment4',
2305faac4104SBram Moolenaar      '  echo "yes"',
2306faac4104SBram Moolenaar      'elseif 2#comment',
2307faac4104SBram Moolenaar      '  echo "no"',
2308faac4104SBram Moolenaar      'endif',
2309faac4104SBram Moolenaar      ], 'E15:')
2310faac4104SBram Moolenaar
2311faac4104SBram Moolenaar  CheckScriptSuccess([
2312faac4104SBram Moolenaar      'vim9script',
231332e35117SBram Moolenaar      'let v = 1 # comment5',
2314faac4104SBram Moolenaar      ])
2315faac4104SBram Moolenaar
2316faac4104SBram Moolenaar  CheckScriptFailure([
2317faac4104SBram Moolenaar      'vim9script',
231832e35117SBram Moolenaar      'let v = 1# comment6',
231932e35117SBram Moolenaar      ], 'E15:')
2320faac4104SBram Moolenaar
2321faac4104SBram Moolenaar  CheckScriptSuccess([
2322faac4104SBram Moolenaar      'vim9script',
2323faac4104SBram Moolenaar      'new'
2324faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2325df069eecSBram Moolenaar      ':$',
2326faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2327faac4104SBram Moolenaar      'bwipe!',
2328faac4104SBram Moolenaar      ])
2329faac4104SBram Moolenaar
2330f5be8cdbSBram Moolenaar  CheckScriptFailure([
2331f5be8cdbSBram Moolenaar      'vim9script',
2332f5be8cdbSBram Moolenaar      'new'
2333f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2334f5be8cdbSBram Moolenaar      ':$',
2335f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2336f5be8cdbSBram Moolenaar      'bwipe!',
2337f5be8cdbSBram Moolenaar      ], 'E488:')
2338f5be8cdbSBram Moolenaar
2339f5be8cdbSBram Moolenaar  CheckScriptFailure([
2340f5be8cdbSBram Moolenaar      'vim9script',
2341f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2342f5be8cdbSBram Moolenaar      ], 'E477:')
2343a26b9700SBram Moolenaarenddef
2344a26b9700SBram Moolenaar
23457e5bd91dSBram Moolenaardef Test_finish()
23467e5bd91dSBram Moolenaar  let lines =<< trim END
23477e5bd91dSBram Moolenaar    vim9script
23486797966dSBram Moolenaar    g:res = 'one'
23497e5bd91dSBram Moolenaar    if v:false | finish | endif
23506797966dSBram Moolenaar    g:res = 'two'
23517e5bd91dSBram Moolenaar    finish
23526797966dSBram Moolenaar    g:res = 'three'
23537e5bd91dSBram Moolenaar  END
23547e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
23557e5bd91dSBram Moolenaar  source Xfinished
23567e5bd91dSBram Moolenaar  assert_equal('two', g:res)
23577e5bd91dSBram Moolenaar
23587e5bd91dSBram Moolenaar  unlet g:res
23597e5bd91dSBram Moolenaar  delete('Xfinished')
23607e5bd91dSBram Moolenaarenddef
23617e5bd91dSBram Moolenaar
236232e35117SBram Moolenaardef Test_let_func_call()
236332e35117SBram Moolenaar  let lines =<< trim END
236432e35117SBram Moolenaar    vim9script
236532e35117SBram Moolenaar    func GetValue()
236632e35117SBram Moolenaar      if exists('g:count')
236732e35117SBram Moolenaar        let g:count += 1
236832e35117SBram Moolenaar      else
236932e35117SBram Moolenaar        let g:count = 1
237032e35117SBram Moolenaar      endif
237132e35117SBram Moolenaar      return 'this'
237232e35117SBram Moolenaar    endfunc
237332e35117SBram Moolenaar    let val: string = GetValue()
2374f5be8cdbSBram Moolenaar    # env var is always a string
2375df671b46SBram Moolenaar    let env = $TERM
237632e35117SBram Moolenaar  END
237732e35117SBram Moolenaar  writefile(lines, 'Xfinished')
237832e35117SBram Moolenaar  source Xfinished
2379f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
238032e35117SBram Moolenaar  assert_equal(1, g:count)
238132e35117SBram Moolenaar
238232e35117SBram Moolenaar  unlet g:count
238332e35117SBram Moolenaar  delete('Xfinished')
238432e35117SBram Moolenaarenddef
238532e35117SBram Moolenaar
238632e35117SBram Moolenaardef Test_let_missing_type()
238732e35117SBram Moolenaar  let lines =<< trim END
238832e35117SBram Moolenaar    vim9script
2389df671b46SBram Moolenaar    let var = g:unknown
2390227a69deSBram Moolenaar  END
2391822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2392227a69deSBram Moolenaar
2393227a69deSBram Moolenaar  lines =<< trim END
2394227a69deSBram Moolenaar    vim9script
2395227a69deSBram Moolenaar    let nr: number = 123
2396227a69deSBram Moolenaar    let var = nr
2397227a69deSBram Moolenaar  END
2398822ba247SBram Moolenaar  CheckScriptSuccess(lines)
239932e35117SBram Moolenaarenddef
240032e35117SBram Moolenaar
2401c82a5b5dSBram Moolenaardef Test_let_declaration()
2402c82a5b5dSBram Moolenaar  let lines =<< trim END
2403c82a5b5dSBram Moolenaar    vim9script
2404c82a5b5dSBram Moolenaar    let var: string
2405c82a5b5dSBram Moolenaar    g:var_uninit = var
2406c82a5b5dSBram Moolenaar    var = 'text'
2407c82a5b5dSBram Moolenaar    g:var_test = var
2408f5be8cdbSBram Moolenaar    # prefixing s: is optional
2409984dddbeSBram Moolenaar    s:var = 'prefixed'
2410984dddbeSBram Moolenaar    g:var_prefixed = s:var
2411984dddbeSBram Moolenaar
2412984dddbeSBram Moolenaar    let s:other: number
2413984dddbeSBram Moolenaar    other = 1234
2414984dddbeSBram Moolenaar    g:other_var = other
2415c82a5b5dSBram Moolenaar  END
2416c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2417c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2418c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2419984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2420984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2421c82a5b5dSBram Moolenaar
2422c82a5b5dSBram Moolenaar  unlet g:var_uninit
2423c82a5b5dSBram Moolenaar  unlet g:var_test
2424984dddbeSBram Moolenaar  unlet g:var_prefixed
2425984dddbeSBram Moolenaar  unlet g:other_var
2426c82a5b5dSBram Moolenaarenddef
2427c82a5b5dSBram Moolenaar
2428c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2429c5b1c20bSBram Moolenaar  let lines =<< trim END
2430c5b1c20bSBram Moolenaar    vim9script
2431c5b1c20bSBram Moolenaar    const var: string
2432c5b1c20bSBram Moolenaar  END
2433c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2434c5b1c20bSBram Moolenaar
2435c5b1c20bSBram Moolenaar  lines =<< trim END
2436c5b1c20bSBram Moolenaar    vim9script
2437c5b1c20bSBram Moolenaar    let 9var: string
2438c5b1c20bSBram Moolenaar  END
2439c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2440c5b1c20bSBram Moolenaarenddef
2441c5b1c20bSBram Moolenaar
244234db91f7SBram Moolenaardef Test_let_type_check()
244334db91f7SBram Moolenaar  let lines =<< trim END
244434db91f7SBram Moolenaar    vim9script
244534db91f7SBram Moolenaar    let var: string
244634db91f7SBram Moolenaar    var = 1234
244734db91f7SBram Moolenaar  END
244834db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2449984dddbeSBram Moolenaar
2450984dddbeSBram Moolenaar  lines =<< trim END
2451984dddbeSBram Moolenaar    vim9script
2452984dddbeSBram Moolenaar    let var:string
2453984dddbeSBram Moolenaar  END
2454984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2455c5b1c20bSBram Moolenaar
2456c5b1c20bSBram Moolenaar  lines =<< trim END
2457c5b1c20bSBram Moolenaar    vim9script
2458c5b1c20bSBram Moolenaar    let var: asdf
2459c5b1c20bSBram Moolenaar  END
2460c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
246134db91f7SBram Moolenaarenddef
246234db91f7SBram Moolenaar
2463a5d0077eSBram Moolenaardef Test_forward_declaration()
2464a5d0077eSBram Moolenaar  let lines =<< trim END
2465a5d0077eSBram Moolenaar    vim9script
2466a5d0077eSBram Moolenaar    def GetValue(): string
2467a5d0077eSBram Moolenaar      return theVal
2468a5d0077eSBram Moolenaar    enddef
2469a5d0077eSBram Moolenaar    let theVal = 'something'
2470822ba247SBram Moolenaar    g:initVal = GetValue()
2471a5d0077eSBram Moolenaar    theVal = 'else'
2472a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2473a5d0077eSBram Moolenaar  END
2474a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2475a5d0077eSBram Moolenaar  source Xforward
2476a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2477a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2478a5d0077eSBram Moolenaar
2479a5d0077eSBram Moolenaar  unlet g:initVal
2480a5d0077eSBram Moolenaar  unlet g:laterVal
2481a5d0077eSBram Moolenaar  delete('Xforward')
2482a5d0077eSBram Moolenaarenddef
2483a5d0077eSBram Moolenaar
24849721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
24859721fb4eSBram Moolenaar  let legacy_lines =<< trim END
24869721fb4eSBram Moolenaar    source Xvim9_script.vim
24879721fb4eSBram Moolenaar
24889721fb4eSBram Moolenaar    call assert_false(exists('local'))
24899721fb4eSBram Moolenaar    call assert_false(exists('exported'))
24909721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
24919721fb4eSBram Moolenaar    call assert_equal('global', global)
24929721fb4eSBram Moolenaar    call assert_equal('global', g:global)
24939721fb4eSBram Moolenaar
24949721fb4eSBram Moolenaar    " imported variable becomes script-local
24959721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
24969721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
24979721fb4eSBram Moolenaar    call assert_false(exists('exported'))
24989721fb4eSBram Moolenaar
24999721fb4eSBram Moolenaar    " imported function becomes script-local
25009721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
25019721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
25029721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
25039721fb4eSBram Moolenaar  END
25049721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
25059721fb4eSBram Moolenaar
25069721fb4eSBram Moolenaar  let vim9_lines =<< trim END
25079721fb4eSBram Moolenaar    vim9script
25089721fb4eSBram Moolenaar    let local = 'local'
25099721fb4eSBram Moolenaar    g:global = 'global'
25109721fb4eSBram Moolenaar    export let exported = 'exported'
25119721fb4eSBram Moolenaar    export def GetText(): string
25129721fb4eSBram Moolenaar       return 'text'
25139721fb4eSBram Moolenaar    enddef
25149721fb4eSBram Moolenaar  END
25159721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
25169721fb4eSBram Moolenaar
25179721fb4eSBram Moolenaar  source Xlegacy_script.vim
25189721fb4eSBram Moolenaar
25199721fb4eSBram Moolenaar  assert_equal('global', g:global)
2520f5be8cdbSBram Moolenaar  unlet g:global
25219721fb4eSBram Moolenaar
25229721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
25239721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
25249721fb4eSBram Moolenaarenddef
2525a5d0077eSBram Moolenaar
2526eeb27bfeSBram Moolenaardef Test_vim9_copen()
2527eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2528eeb27bfeSBram Moolenaar  copen
2529eeb27bfeSBram Moolenaar  quit
2530eeb27bfeSBram Moolenaarenddef
2531eeb27bfeSBram Moolenaar
2532585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2533585fea7bSBram Moolenaardef Test_substitute_cmd()
2534585fea7bSBram Moolenaar  new
2535585fea7bSBram Moolenaar  setline(1, 'something')
2536585fea7bSBram Moolenaar  :substitute(some(other(
2537585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2538585fea7bSBram Moolenaar  bwipe!
2539585fea7bSBram Moolenaar
2540f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2541585fea7bSBram Moolenaar  let lines =<< trim END
2542585fea7bSBram Moolenaar    vim9script
2543585fea7bSBram Moolenaar    new
2544585fea7bSBram Moolenaar    setline(1, 'something')
2545585fea7bSBram Moolenaar    :substitute(some(other(
2546585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2547585fea7bSBram Moolenaar    bwipe!
2548585fea7bSBram Moolenaar  END
2549585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2550585fea7bSBram Moolenaar  source Xvim9lines
2551585fea7bSBram Moolenaar
2552585fea7bSBram Moolenaar  delete('Xvim9lines')
2553585fea7bSBram Moolenaarenddef
2554585fea7bSBram Moolenaar
25558a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2556