18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
78a7d6542SBram Moolenaar
88a7d6542SBram Moolenaardef Test_syntax()
98a7d6542SBram Moolenaar  let var = 234
108a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
118a7d6542SBram Moolenaarenddef
128a7d6542SBram Moolenaar
136e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
146e587dcbSBram Moolenaarlet s:addToMe = 111
15401d9ffbSBram Moolenaarlet g:existing = 'yes'
16a8c17704SBram Moolenaarlet g:inc_counter = 1
17a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
18a6e67e4fSBram Moolenaarlet g:alist = [7]
19a6e67e4fSBram Moolenaarlet g:astring = 'text'
20f0b9f43cSBram Moolenaarlet g:anumber = 123
216e587dcbSBram Moolenaar
228a7d6542SBram Moolenaardef Test_assignment()
238a7d6542SBram Moolenaar  let bool1: bool = true
248a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
258a7d6542SBram Moolenaar  let bool2: bool = false
268a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
278a7d6542SBram Moolenaar
28f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string'], 'E1069:')
29f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string = "x"'], 'E1069:')
301cc2a94fSBram Moolenaar  call CheckDefFailure(['let a:string = "x"'], 'E1069:')
31f93c7feaSBram Moolenaar
32*b209750bSBram 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
47*b209750bSBram 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
17284370087SBram Moolenaardef Test_assignment_dict()
17384370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
17484370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
17584370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
17684370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
17774fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
17884370087SBram Moolenaar
179f5be8cdbSBram Moolenaar  # overwrite
180c785b9a7SBram Moolenaar  dict3['key'] = 'another'
181c785b9a7SBram Moolenaar
18284370087SBram Moolenaar  call CheckDefExecFailure(['let dd = {}', 'dd[""] = 6'], 'E713:')
18384370087SBram Moolenaar
18484370087SBram Moolenaar  # type becomes dict<any>
18584370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
18684370087SBram Moolenaarenddef
18784370087SBram Moolenaar
188d3aac291SBram Moolenaardef Test_assignment_local()
189f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
190f5be8cdbSBram Moolenaar  # changed.
191d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
192d3aac291SBram Moolenaar    let b:existing = 'yes'
193d3aac291SBram Moolenaar    let w:existing = 'yes'
194d3aac291SBram Moolenaar    let t:existing = 'yes'
195d3aac291SBram Moolenaar
196d3aac291SBram Moolenaar    def Test_assignment_local_internal()
197d3aac291SBram Moolenaar      b:newvar = 'new'
198d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
199d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
200d3aac291SBram Moolenaar      b:existing = 'no'
201d3aac291SBram Moolenaar      assert_equal('no', b:existing)
202396f3138SBram Moolenaar      b:existing ..= 'NO'
203396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
204d3aac291SBram Moolenaar
205d3aac291SBram Moolenaar      w:newvar = 'new'
206d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
207d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
208d3aac291SBram Moolenaar      w:existing = 'no'
209d3aac291SBram Moolenaar      assert_equal('no', w:existing)
210396f3138SBram Moolenaar      w:existing ..= 'NO'
211396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
212d3aac291SBram Moolenaar
213d3aac291SBram Moolenaar      t:newvar = 'new'
214d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
215d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
216d3aac291SBram Moolenaar      t:existing = 'no'
217d3aac291SBram Moolenaar      assert_equal('no', t:existing)
218396f3138SBram Moolenaar      t:existing ..= 'NO'
219396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
220d3aac291SBram Moolenaar    enddef
221d3aac291SBram Moolenaar    call Test_assignment_local_internal()
222d3aac291SBram Moolenaar  END
223d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
224d3aac291SBram Moolenaarenddef
225d3aac291SBram Moolenaar
2265deeb3f1SBram Moolenaardef Test_assignment_default()
227e69f6d04SBram Moolenaar
228cb711abfSBram Moolenaar  # Test default values.
229e69f6d04SBram Moolenaar  let thebool: bool
230e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
231e69f6d04SBram Moolenaar
232e69f6d04SBram Moolenaar  let thenumber: number
233e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
234e69f6d04SBram Moolenaar
235e69f6d04SBram Moolenaar  if has('float')
236e69f6d04SBram Moolenaar    let thefloat: float
237e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
238e69f6d04SBram Moolenaar  endif
239e69f6d04SBram Moolenaar
240e69f6d04SBram Moolenaar  let thestring: string
241e69f6d04SBram Moolenaar  assert_equal('', thestring)
242e69f6d04SBram Moolenaar
243e69f6d04SBram Moolenaar  let theblob: blob
244e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
245e69f6d04SBram Moolenaar
2465deeb3f1SBram Moolenaar  let Thefunc: func
2475deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
248e69f6d04SBram Moolenaar
249e69f6d04SBram Moolenaar  let thelist: list<any>
250e69f6d04SBram Moolenaar  assert_equal([], thelist)
251e69f6d04SBram Moolenaar
252e69f6d04SBram Moolenaar  let thedict: dict<any>
253e69f6d04SBram Moolenaar  assert_equal({}, thedict)
254e69f6d04SBram Moolenaar
2552c869deeSBram Moolenaar  if has('channel')
256e69f6d04SBram Moolenaar    let thejob: job
257e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
258e69f6d04SBram Moolenaar
259e69f6d04SBram Moolenaar    let thechannel: channel
260e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
261c785b9a7SBram Moolenaar
262c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
263f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
264c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
265c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
266c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
267c785b9a7SBram Moolenaar    endif
2682c869deeSBram Moolenaar  endif
269585fea7bSBram Moolenaar
270585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
271585fea7bSBram Moolenaar  assert_equal(5678, nr)
2728a7d6542SBram Moolenaarenddef
2738a7d6542SBram Moolenaar
27447a519a9SBram Moolenaardef Test_assignment_var_list()
27547a519a9SBram Moolenaar  let v1: string
27647a519a9SBram Moolenaar  let v2: string
2779af78769SBram Moolenaar  let vrem: list<string>
2789af78769SBram Moolenaar  [v1] = ['aaa']
2799af78769SBram Moolenaar  assert_equal('aaa', v1)
2809af78769SBram Moolenaar
28147a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
28247a519a9SBram Moolenaar  assert_equal('one', v1)
28347a519a9SBram Moolenaar  assert_equal('two', v2)
2849af78769SBram Moolenaar
2859af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
2869af78769SBram Moolenaar  assert_equal('one', v1)
2879af78769SBram Moolenaar  assert_equal('two', v2)
2889af78769SBram Moolenaar  assert_equal([], vrem)
2899af78769SBram Moolenaar
2909af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
2919af78769SBram Moolenaar  assert_equal('one', v1)
2929af78769SBram Moolenaar  assert_equal('two', v2)
2939af78769SBram Moolenaar  assert_equal(['three'], vrem)
29447a519a9SBram Moolenaarenddef
29547a519a9SBram Moolenaar
296cab27678SBram Moolenaardef Mess(): string
297cab27678SBram Moolenaar  v:foldstart = 123
298cab27678SBram Moolenaar  return 'xxx'
299cab27678SBram Moolenaarenddef
300cab27678SBram Moolenaar
301d72c1bf0SBram Moolenaardef Test_assignment_failure()
3028a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
3038a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
3048a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
3058a7d6542SBram Moolenaar
3068a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
3078a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
3088a7d6542SBram Moolenaar
3099b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
3109af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
3119af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
3129af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
3139af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
3149af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
3159af78769SBram Moolenaar                            'let y: number',
3169af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
3179af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
3189af78769SBram Moolenaar                            'let y: number',
3199af78769SBram Moolenaar                            'let z: list<number>',
3209af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
3219be61bbbSBram Moolenaar
322e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
3239be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
3249be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
3259be61bbbSBram Moolenaar
326e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
3279be61bbbSBram Moolenaar
3289be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
3299be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
3309be61bbbSBram Moolenaar
331e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
332e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
333e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
334e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
3359be61bbbSBram Moolenaar
3369be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
3379be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
3389be61bbbSBram Moolenaar
339822ba247SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
34033fa29cfSBram Moolenaar
3418a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
3428a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
3438a7d6542SBram Moolenaar
3448a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
3458a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
3468a7d6542SBram Moolenaar
3478a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
3488a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
34942a480bfSBram Moolenaar
350d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
35142a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
352cab27678SBram Moolenaar
353cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
354cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
355d72c1bf0SBram Moolenaarenddef
356d72c1bf0SBram Moolenaar
357d72c1bf0SBram Moolenaardef Test_unlet()
358d72c1bf0SBram Moolenaar  g:somevar = 'yes'
359d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
360d72c1bf0SBram Moolenaar  unlet g:somevar
361d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
362d72c1bf0SBram Moolenaar  unlet! g:somevar
363d72c1bf0SBram Moolenaar
364d72c1bf0SBram Moolenaar  call CheckScriptFailure([
365d72c1bf0SBram Moolenaar        'vim9script',
366d72c1bf0SBram Moolenaar        'let svar = 123',
367d72c1bf0SBram Moolenaar        'unlet svar',
368d72c1bf0SBram Moolenaar        ], 'E1081:')
369d72c1bf0SBram Moolenaar  call CheckScriptFailure([
370d72c1bf0SBram Moolenaar        'vim9script',
371d72c1bf0SBram Moolenaar        'let svar = 123',
372d72c1bf0SBram Moolenaar        'unlet s:svar',
373d72c1bf0SBram Moolenaar        ], 'E1081:')
374d72c1bf0SBram Moolenaar  call CheckScriptFailure([
375d72c1bf0SBram Moolenaar        'vim9script',
376d72c1bf0SBram Moolenaar        'let svar = 123',
377d72c1bf0SBram Moolenaar        'def Func()',
378d72c1bf0SBram Moolenaar        '  unlet svar',
379d72c1bf0SBram Moolenaar        'enddef',
380822ba247SBram Moolenaar        'defcompile',
381d72c1bf0SBram Moolenaar        ], 'E1081:')
382d72c1bf0SBram Moolenaar  call CheckScriptFailure([
383d72c1bf0SBram Moolenaar        'vim9script',
384d72c1bf0SBram Moolenaar        'let svar = 123',
385d72c1bf0SBram Moolenaar        'def Func()',
386d72c1bf0SBram Moolenaar        '  unlet s:svar',
387d72c1bf0SBram Moolenaar        'enddef',
388822ba247SBram Moolenaar        'defcompile',
389d72c1bf0SBram Moolenaar        ], 'E1081:')
3907bdaea6eSBram Moolenaar
3917bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
3927bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
3937bdaea6eSBram Moolenaar  unlet $ENVVAR
3947bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
395d72c1bf0SBram Moolenaarenddef
396599c89c8SBram Moolenaar
3974c17ad94SBram Moolenaardef Test_delfunction()
398f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
3994c17ad94SBram Moolenaar  CheckScriptSuccess([
4004c17ad94SBram Moolenaar      'vim9script',
4014c17ad94SBram Moolenaar      'func CheckMe()',
4024c17ad94SBram Moolenaar      '  return 123',
4034c17ad94SBram Moolenaar      'endfunc',
4044c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
4054c17ad94SBram Moolenaar      ])
4064c17ad94SBram Moolenaar
407f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
4084c17ad94SBram Moolenaar  CheckScriptFailure([
4094c17ad94SBram Moolenaar      'vim9script',
4104c17ad94SBram Moolenaar      'func DeleteMe1()',
4114c17ad94SBram Moolenaar      'endfunc',
4124c17ad94SBram Moolenaar      'delfunction DeleteMe1',
4134c17ad94SBram Moolenaar      ], 'E1084:')
4144c17ad94SBram Moolenaar  CheckScriptFailure([
4154c17ad94SBram Moolenaar      'vim9script',
4164c17ad94SBram Moolenaar      'func DeleteMe2()',
4174c17ad94SBram Moolenaar      'endfunc',
4184c17ad94SBram Moolenaar      'def DoThat()',
4194c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
4204c17ad94SBram Moolenaar      'enddef',
4214c17ad94SBram Moolenaar      'DoThat()',
4224c17ad94SBram Moolenaar      ], 'E1084:')
4234c17ad94SBram Moolenaar  CheckScriptFailure([
4244c17ad94SBram Moolenaar      'vim9script',
4254c17ad94SBram Moolenaar      'def DeleteMe3()',
4264c17ad94SBram Moolenaar      'enddef',
4274c17ad94SBram Moolenaar      'delfunction DeleteMe3',
4284c17ad94SBram Moolenaar      ], 'E1084:')
4294c17ad94SBram Moolenaar  CheckScriptFailure([
4304c17ad94SBram Moolenaar      'vim9script',
4314c17ad94SBram Moolenaar      'def DeleteMe4()',
4324c17ad94SBram Moolenaar      'enddef',
4334c17ad94SBram Moolenaar      'def DoThat()',
4344c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
4354c17ad94SBram Moolenaar      'enddef',
4364c17ad94SBram Moolenaar      'DoThat()',
4374c17ad94SBram Moolenaar      ], 'E1084:')
4384c17ad94SBram Moolenaarenddef
4394c17ad94SBram Moolenaar
440599c89c8SBram Moolenaarfunc Test_wrong_type()
441599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
442599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
443599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
444599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
445599c89c8SBram Moolenaar
446599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
447599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
44842a480bfSBram Moolenaar
44942a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
45042a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
45142a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
45242a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
45342a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
45442a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
45542a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
45642a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
45742a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
45842a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
45942a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
460a0a9f43aSBram Moolenaar
461a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
462a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
4638a7d6542SBram Moolenaarendfunc
4648a7d6542SBram Moolenaar
4658a7d6542SBram Moolenaarfunc Test_const()
4668a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
4678a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
4688a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
4699be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
4708a7d6542SBram Moolenaarendfunc
4718a7d6542SBram Moolenaar
472df069eecSBram Moolenaardef Test_range_no_colon()
473df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
474df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
475df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
476df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
477df069eecSBram Moolenaarenddef
478df069eecSBram Moolenaar
479df069eecSBram Moolenaar
4808a7d6542SBram Moolenaardef Test_block()
4818a7d6542SBram Moolenaar  let outer = 1
4828a7d6542SBram Moolenaar  {
4838a7d6542SBram Moolenaar    let inner = 2
4848a7d6542SBram Moolenaar    assert_equal(1, outer)
4858a7d6542SBram Moolenaar    assert_equal(2, inner)
4868a7d6542SBram Moolenaar  }
4878a7d6542SBram Moolenaar  assert_equal(1, outer)
4888a7d6542SBram Moolenaarenddef
4898a7d6542SBram Moolenaar
4908a7d6542SBram Moolenaarfunc Test_block_failure()
4918a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
492585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
493585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
4948a7d6542SBram Moolenaarendfunc
4958a7d6542SBram Moolenaar
496585fea7bSBram Moolenaardef Test_cmd_modifier()
497585fea7bSBram Moolenaar  tab echo '0'
498585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
499585fea7bSBram Moolenaarenddef
500585fea7bSBram Moolenaar
501d032f34aSBram Moolenaarfunc g:NoSuchFunc()
502d032f34aSBram Moolenaar  echo 'none'
503d032f34aSBram Moolenaarendfunc
504d032f34aSBram Moolenaar
5058a7d6542SBram Moolenaardef Test_try_catch()
5068a7d6542SBram Moolenaar  let l = []
5077a092245SBram Moolenaar  try # comment
5088a7d6542SBram Moolenaar    add(l, '1')
5098a7d6542SBram Moolenaar    throw 'wrong'
5108a7d6542SBram Moolenaar    add(l, '2')
5117a092245SBram Moolenaar  catch # comment
5128a7d6542SBram Moolenaar    add(l, v:exception)
5137a092245SBram Moolenaar  finally # comment
5148a7d6542SBram Moolenaar    add(l, '3')
5157a092245SBram Moolenaar  endtry # comment
5168a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
51768d130c6SBram Moolenaar
518e859312eSBram Moolenaar  l = []
519e859312eSBram Moolenaar  try
520e859312eSBram Moolenaar    try
521e859312eSBram Moolenaar      add(l, '1')
522e859312eSBram Moolenaar      throw 'wrong'
523e859312eSBram Moolenaar      add(l, '2')
524e859312eSBram Moolenaar    catch /right/
525e859312eSBram Moolenaar      add(l, v:exception)
526e859312eSBram Moolenaar    endtry
527e859312eSBram Moolenaar  catch /wrong/
528e859312eSBram Moolenaar    add(l, 'caught')
529e859312eSBram Moolenaar  finally
530e859312eSBram Moolenaar    add(l, 'finally')
531e859312eSBram Moolenaar  endtry
532e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
533e859312eSBram Moolenaar
53468d130c6SBram Moolenaar  let n: number
53568d130c6SBram Moolenaar  try
53668d130c6SBram Moolenaar    n = l[3]
53768d130c6SBram Moolenaar  catch /E684:/
53868d130c6SBram Moolenaar    n = 99
53968d130c6SBram Moolenaar  endtry
54068d130c6SBram Moolenaar  assert_equal(99, n)
54168d130c6SBram Moolenaar
54268d130c6SBram Moolenaar  try
54368d130c6SBram Moolenaar    n = g:astring[3]
54468d130c6SBram Moolenaar  catch /E714:/
54568d130c6SBram Moolenaar    n = 77
54668d130c6SBram Moolenaar  endtry
54768d130c6SBram Moolenaar  assert_equal(77, n)
54868d130c6SBram Moolenaar
54968d130c6SBram Moolenaar  try
55068d130c6SBram Moolenaar    n = l[g:astring]
55168d130c6SBram Moolenaar  catch /E39:/
55268d130c6SBram Moolenaar    n = 77
55368d130c6SBram Moolenaar  endtry
55468d130c6SBram Moolenaar  assert_equal(77, n)
55568d130c6SBram Moolenaar
55668d130c6SBram Moolenaar  try
55768d130c6SBram Moolenaar    n = s:does_not_exist
55868d130c6SBram Moolenaar  catch /E121:/
559f0b9f43cSBram Moolenaar    n = 111
560f0b9f43cSBram Moolenaar  endtry
561f0b9f43cSBram Moolenaar  assert_equal(111, n)
562f0b9f43cSBram Moolenaar
563f0b9f43cSBram Moolenaar  try
564f0b9f43cSBram Moolenaar    n = g:does_not_exist
565f0b9f43cSBram Moolenaar  catch /E121:/
56668d130c6SBram Moolenaar    n = 121
56768d130c6SBram Moolenaar  endtry
56868d130c6SBram Moolenaar  assert_equal(121, n)
56968d130c6SBram Moolenaar
57068d130c6SBram Moolenaar  let d = #{one: 1}
57168d130c6SBram Moolenaar  try
57268d130c6SBram Moolenaar    n = d[g:astring]
57368d130c6SBram Moolenaar  catch /E716:/
57468d130c6SBram Moolenaar    n = 222
57568d130c6SBram Moolenaar  endtry
57668d130c6SBram Moolenaar  assert_equal(222, n)
577f0b9f43cSBram Moolenaar
578f0b9f43cSBram Moolenaar  try
579f0b9f43cSBram Moolenaar    n = -g:astring
580f0b9f43cSBram Moolenaar  catch /E39:/
581f0b9f43cSBram Moolenaar    n = 233
582f0b9f43cSBram Moolenaar  endtry
583f0b9f43cSBram Moolenaar  assert_equal(233, n)
584f0b9f43cSBram Moolenaar
585f0b9f43cSBram Moolenaar  try
586f0b9f43cSBram Moolenaar    n = +g:astring
587f0b9f43cSBram Moolenaar  catch /E1030:/
588f0b9f43cSBram Moolenaar    n = 244
589f0b9f43cSBram Moolenaar  endtry
590f0b9f43cSBram Moolenaar  assert_equal(244, n)
591f0b9f43cSBram Moolenaar
592f0b9f43cSBram Moolenaar  try
593f0b9f43cSBram Moolenaar    n = +g:alist
594f0b9f43cSBram Moolenaar  catch /E745:/
595f0b9f43cSBram Moolenaar    n = 255
596f0b9f43cSBram Moolenaar  endtry
597f0b9f43cSBram Moolenaar  assert_equal(255, n)
598f0b9f43cSBram Moolenaar
599f0b9f43cSBram Moolenaar  let nd: dict<any>
600f0b9f43cSBram Moolenaar  try
601f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
602f0b9f43cSBram Moolenaar  catch /E1029:/
603f0b9f43cSBram Moolenaar    n = 266
604f0b9f43cSBram Moolenaar  endtry
605f0b9f43cSBram Moolenaar  assert_equal(266, n)
606f0b9f43cSBram Moolenaar
607f0b9f43cSBram Moolenaar  try
608f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
609f0b9f43cSBram Moolenaar  catch /E1093:/
610f0b9f43cSBram Moolenaar    n = 277
611f0b9f43cSBram Moolenaar  endtry
612f0b9f43cSBram Moolenaar  assert_equal(277, n)
613f0b9f43cSBram Moolenaar
614e859312eSBram Moolenaar  try
615e859312eSBram Moolenaar    &ts = g:astring
616e859312eSBram Moolenaar  catch /E1029:/
617e859312eSBram Moolenaar    n = 288
618e859312eSBram Moolenaar  endtry
619e859312eSBram Moolenaar  assert_equal(288, n)
620e859312eSBram Moolenaar
621e859312eSBram Moolenaar  try
622e859312eSBram Moolenaar    &backspace = 'asdf'
623e859312eSBram Moolenaar  catch /E474:/
624e859312eSBram Moolenaar    n = 299
625e859312eSBram Moolenaar  endtry
626e859312eSBram Moolenaar  assert_equal(299, n)
627e859312eSBram Moolenaar
628e859312eSBram Moolenaar  l = [1]
629e859312eSBram Moolenaar  try
630e859312eSBram Moolenaar    l[3] = 3
631e859312eSBram Moolenaar  catch /E684:/
632e859312eSBram Moolenaar    n = 300
633e859312eSBram Moolenaar  endtry
634e859312eSBram Moolenaar  assert_equal(300, n)
635e859312eSBram Moolenaar
636e859312eSBram Moolenaar  try
637e859312eSBram Moolenaar    d[''] = 3
638e859312eSBram Moolenaar  catch /E713:/
639e859312eSBram Moolenaar    n = 311
640e859312eSBram Moolenaar  endtry
641e859312eSBram Moolenaar  assert_equal(311, n)
642e859312eSBram Moolenaar
643e859312eSBram Moolenaar  try
644e859312eSBram Moolenaar    unlet g:does_not_exist
645e859312eSBram Moolenaar  catch /E108:/
646e859312eSBram Moolenaar    n = 322
647e859312eSBram Moolenaar  endtry
648e859312eSBram Moolenaar  assert_equal(322, n)
649e859312eSBram Moolenaar
650e859312eSBram Moolenaar  try
651e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
652e859312eSBram Moolenaar  catch /E721:/
653e859312eSBram Moolenaar    n = 333
654e859312eSBram Moolenaar  endtry
655e859312eSBram Moolenaar  assert_equal(333, n)
656e859312eSBram Moolenaar
657e859312eSBram Moolenaar  try
658e859312eSBram Moolenaar    l = DeletedFunc()
659e859312eSBram Moolenaar  catch /E933:/
660e859312eSBram Moolenaar    n = 344
661e859312eSBram Moolenaar  endtry
662e859312eSBram Moolenaar  assert_equal(344, n)
663d032f34aSBram Moolenaar
664d032f34aSBram Moolenaar  try
665d032f34aSBram Moolenaar    echo len(v:true)
666d032f34aSBram Moolenaar  catch /E701:/
667d032f34aSBram Moolenaar    n = 355
668d032f34aSBram Moolenaar  endtry
669d032f34aSBram Moolenaar  assert_equal(355, n)
670d032f34aSBram Moolenaar
671d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
672d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
673d032f34aSBram Moolenaar  try
674d032f34aSBram Moolenaar    echo P()
675d032f34aSBram Moolenaar  catch /E117:/
676d032f34aSBram Moolenaar    n = 366
677d032f34aSBram Moolenaar  endtry
678d032f34aSBram Moolenaar  assert_equal(366, n)
679d032f34aSBram Moolenaar
680d032f34aSBram Moolenaar  try
681d032f34aSBram Moolenaar    echo g:NoSuchFunc()
682d032f34aSBram Moolenaar  catch /E117:/
683d032f34aSBram Moolenaar    n = 377
684d032f34aSBram Moolenaar  endtry
685d032f34aSBram Moolenaar  assert_equal(377, n)
686d032f34aSBram Moolenaar
687d032f34aSBram Moolenaar  try
688d032f34aSBram Moolenaar    echo g:alist + 4
689d032f34aSBram Moolenaar  catch /E745:/
690d032f34aSBram Moolenaar    n = 388
691d032f34aSBram Moolenaar  endtry
692d032f34aSBram Moolenaar  assert_equal(388, n)
693d032f34aSBram Moolenaar
694d032f34aSBram Moolenaar  try
695d032f34aSBram Moolenaar    echo 4 + g:alist
696d032f34aSBram Moolenaar  catch /E745:/
697d032f34aSBram Moolenaar    n = 399
698d032f34aSBram Moolenaar  endtry
699d032f34aSBram Moolenaar  assert_equal(399, n)
700d032f34aSBram Moolenaar
701d032f34aSBram Moolenaar  try
702d032f34aSBram Moolenaar    echo g:alist.member
703d032f34aSBram Moolenaar  catch /E715:/
704d032f34aSBram Moolenaar    n = 400
705d032f34aSBram Moolenaar  endtry
706d032f34aSBram Moolenaar  assert_equal(400, n)
707d032f34aSBram Moolenaar
708d032f34aSBram Moolenaar  try
709d032f34aSBram Moolenaar    echo d.member
710d032f34aSBram Moolenaar  catch /E716:/
711d032f34aSBram Moolenaar    n = 411
712d032f34aSBram Moolenaar  endtry
713d032f34aSBram Moolenaar  assert_equal(411, n)
7148a7d6542SBram Moolenaarenddef
7158a7d6542SBram Moolenaar
716e859312eSBram Moolenaardef DeletedFunc(): list<any>
717e859312eSBram Moolenaar  return ['delete me']
718e859312eSBram Moolenaarenddef
719e859312eSBram Moolenaardefcompile
720e859312eSBram Moolenaardelfunc DeletedFunc
721e859312eSBram Moolenaar
722257cc5eeSBram Moolenaardef ThrowFromDef()
723a72cfb80SBram Moolenaar  throw "getout" # comment
724257cc5eeSBram Moolenaarenddef
725257cc5eeSBram Moolenaar
726257cc5eeSBram Moolenaarfunc CatchInFunc()
727257cc5eeSBram Moolenaar  try
728257cc5eeSBram Moolenaar    call ThrowFromDef()
729257cc5eeSBram Moolenaar  catch
730257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
731257cc5eeSBram Moolenaar  endtry
732257cc5eeSBram Moolenaarendfunc
733257cc5eeSBram Moolenaar
734257cc5eeSBram Moolenaardef CatchInDef()
735257cc5eeSBram Moolenaar  try
736257cc5eeSBram Moolenaar    ThrowFromDef()
737257cc5eeSBram Moolenaar  catch
738257cc5eeSBram Moolenaar    g:thrown_def = v:exception
739257cc5eeSBram Moolenaar  endtry
740257cc5eeSBram Moolenaarenddef
741257cc5eeSBram Moolenaar
742f575adffSBram Moolenaardef ReturnFinally(): string
743f575adffSBram Moolenaar  try
744f575adffSBram Moolenaar    return 'intry'
745f575adffSBram Moolenaar  finally
746f575adffSBram Moolenaar    g:in_finally = 'finally'
747f575adffSBram Moolenaar  endtry
748f575adffSBram Moolenaar  return 'end'
749f575adffSBram Moolenaarenddef
750f575adffSBram Moolenaar
751257cc5eeSBram Moolenaardef Test_try_catch_nested()
752257cc5eeSBram Moolenaar  CatchInFunc()
753257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
754257cc5eeSBram Moolenaar
755257cc5eeSBram Moolenaar  CatchInDef()
756257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
757f575adffSBram Moolenaar
758f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
759f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
760f575adffSBram Moolenaarenddef
761f575adffSBram Moolenaar
762f575adffSBram Moolenaardef Test_try_catch_match()
763f575adffSBram Moolenaar  let seq = 'a'
764f575adffSBram Moolenaar  try
765f575adffSBram Moolenaar    throw 'something'
766f575adffSBram Moolenaar  catch /nothing/
767f575adffSBram Moolenaar    seq ..= 'x'
768f575adffSBram Moolenaar  catch /some/
769f575adffSBram Moolenaar    seq ..= 'b'
770f575adffSBram Moolenaar  catch /asdf/
771f575adffSBram Moolenaar    seq ..= 'x'
772e8c4abbbSBram Moolenaar  catch ?a\?sdf?
773e8c4abbbSBram Moolenaar    seq ..= 'y'
774f575adffSBram Moolenaar  finally
775f575adffSBram Moolenaar    seq ..= 'c'
776f575adffSBram Moolenaar  endtry
777f575adffSBram Moolenaar  assert_equal('abc', seq)
778257cc5eeSBram Moolenaarenddef
779257cc5eeSBram Moolenaar
780e8c4abbbSBram Moolenaardef Test_try_catch_fails()
781e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
782e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
783e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
784585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
785585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
786585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
787585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
788585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
789585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
790585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
791585fea7bSBram Moolenaar
792a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
793585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
794e8c4abbbSBram Moolenaarenddef
795e8c4abbbSBram Moolenaar
796006ad48bSBram Moolenaardef Test_throw_vimscript()
797f5be8cdbSBram Moolenaar  # only checks line continuation
798006ad48bSBram Moolenaar  let lines =<< trim END
799006ad48bSBram Moolenaar      vim9script
800006ad48bSBram Moolenaar      try
801006ad48bSBram Moolenaar        throw 'one'
802006ad48bSBram Moolenaar              .. 'two'
803006ad48bSBram Moolenaar      catch
804006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
805006ad48bSBram Moolenaar      endtry
806006ad48bSBram Moolenaar  END
807006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
808006ad48bSBram Moolenaarenddef
809006ad48bSBram Moolenaar
81037c83711SBram Moolenaardef Test_cexpr_vimscript()
811f5be8cdbSBram Moolenaar  # only checks line continuation
81237c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
81337c83711SBram Moolenaar  let lines =<< trim END
81437c83711SBram Moolenaar      vim9script
81537c83711SBram Moolenaar      cexpr 'File'
81637c83711SBram Moolenaar                .. ' someFile' ..
81737c83711SBram Moolenaar                   ' line 19'
81837c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
81937c83711SBram Moolenaar  END
82037c83711SBram Moolenaar  CheckScriptSuccess(lines)
82137c83711SBram Moolenaar  set errorformat&
82237c83711SBram Moolenaarenddef
82337c83711SBram Moolenaar
824*b209750bSBram Moolenaardef Test_list_vimscript()
825*b209750bSBram Moolenaar  # checks line continuation and comments
826*b209750bSBram Moolenaar  let lines =<< trim END
827*b209750bSBram Moolenaar      vim9script
828*b209750bSBram Moolenaar      let mylist = [
829*b209750bSBram Moolenaar            'one',
830*b209750bSBram Moolenaar            # comment
831*b209750bSBram Moolenaar            'two', # empty line follows
832*b209750bSBram Moolenaar
833*b209750bSBram Moolenaar            'three',
834*b209750bSBram Moolenaar            ]
835*b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
836*b209750bSBram Moolenaar  END
837*b209750bSBram Moolenaar  CheckScriptSuccess(lines)
838*b209750bSBram Moolenaarenddef
839*b209750bSBram Moolenaar
8402a1381c3SBram Moolenaarif has('channel')
84140ee466cSBram Moolenaar  let someJob = test_null_job()
84240ee466cSBram Moolenaar
84340ee466cSBram Moolenaar  def FuncWithError()
84440ee466cSBram Moolenaar    echomsg g:someJob
84540ee466cSBram Moolenaar  enddef
84640ee466cSBram Moolenaar
84740ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
84840ee466cSBram Moolenaar    try
84940ee466cSBram Moolenaar      call FuncWithError()
85040ee466cSBram Moolenaar    catch
85140ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
85240ee466cSBram Moolenaar    endtry
85340ee466cSBram Moolenaar  endfunc
8542a1381c3SBram Moolenaarendif
85540ee466cSBram Moolenaar
8568a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
8578a7d6542SBram Moolenaar  vim9script
8588a7d6542SBram Moolenaar  let name: string = 'bob'
8598a7d6542SBram Moolenaar  def Concat(arg: string): string
8608a7d6542SBram Moolenaar    return name .. arg
8618a7d6542SBram Moolenaar  enddef
862227a69deSBram Moolenaar  g:result = Concat('bie')
863227a69deSBram Moolenaar  g:localname = name
8648a7d6542SBram Moolenaar
8658a7d6542SBram Moolenaar  export const CONST = 1234
8668a7d6542SBram Moolenaar  export let exported = 9876
8676e587dcbSBram Moolenaar  export let exp_name = 'John'
8688a7d6542SBram Moolenaar  export def Exported(): string
8698a7d6542SBram Moolenaar    return 'Exported'
8708a7d6542SBram Moolenaar  enddef
8718a7d6542SBram MoolenaarEND
8728a7d6542SBram Moolenaar
8735269bd2aSBram Moolenaardef Test_vim9_import_export()
8748a7d6542SBram Moolenaar  let import_script_lines =<< trim END
8758a7d6542SBram Moolenaar    vim9script
8768a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
8778a7d6542SBram Moolenaar    g:imported = exported
8786e587dcbSBram Moolenaar    exported += 3
8796e587dcbSBram Moolenaar    g:imported_added = exported
8808a7d6542SBram Moolenaar    g:imported_func = Exported()
8816e587dcbSBram Moolenaar
8826e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
8836e587dcbSBram Moolenaar    g:imported_name = exp_name
8846e587dcbSBram Moolenaar    exp_name ..= ' Doe'
8856e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
8865381c7a1SBram Moolenaar    g:imported_later = exported
8878a7d6542SBram Moolenaar  END
8888a7d6542SBram Moolenaar
8898a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
8908a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
8918a7d6542SBram Moolenaar
8928a7d6542SBram Moolenaar  source Ximport.vim
8938a7d6542SBram Moolenaar
8948a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
8958a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
8968a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
8976e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
8985381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
8998a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
9006e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
9016e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
9028a7d6542SBram Moolenaar  assert_false(exists('g:name'))
9038a7d6542SBram Moolenaar
9048a7d6542SBram Moolenaar  unlet g:result
9058a7d6542SBram Moolenaar  unlet g:localname
9068a7d6542SBram Moolenaar  unlet g:imported
9076e587dcbSBram Moolenaar  unlet g:imported_added
9085381c7a1SBram Moolenaar  unlet g:imported_later
9098a7d6542SBram Moolenaar  unlet g:imported_func
9106e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
9118a7d6542SBram Moolenaar  delete('Ximport.vim')
912f2d5c240SBram Moolenaar
9131c991144SBram Moolenaar  # similar, with line breaks
9141c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
9151c991144SBram Moolenaar    vim9script
9161c991144SBram Moolenaar    import {
9171c991144SBram Moolenaar        exported,
9181c991144SBram Moolenaar        Exported,
9191c991144SBram Moolenaar        }
9201c991144SBram Moolenaar        from
9211c991144SBram Moolenaar        './Xexport.vim'
9221c991144SBram Moolenaar    g:imported = exported
9231c991144SBram Moolenaar    exported += 5
9241c991144SBram Moolenaar    g:imported_added = exported
9251c991144SBram Moolenaar    g:imported_func = Exported()
9261c991144SBram Moolenaar  END
9271c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
9281c991144SBram Moolenaar  source Ximport_lbr.vim
9291c991144SBram Moolenaar
9301c991144SBram Moolenaar  assert_equal(9876, g:imported)
9311c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
9321c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
9331c991144SBram Moolenaar
9341c991144SBram Moolenaar  # exported script not sourced again
9351c991144SBram Moolenaar  assert_false(exists('g:result'))
9361c991144SBram Moolenaar  unlet g:imported
9371c991144SBram Moolenaar  unlet g:imported_added
9381c991144SBram Moolenaar  unlet g:imported_func
9391c991144SBram Moolenaar  delete('Ximport_lbr.vim')
9401c991144SBram Moolenaar
9411c991144SBram Moolenaar  # import inside :def function
9425381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
9435381c7a1SBram Moolenaar    vim9script
9445381c7a1SBram Moolenaar    def ImportInDef()
9455381c7a1SBram Moolenaar      import exported from './Xexport.vim'
9465381c7a1SBram Moolenaar      g:imported = exported
9475381c7a1SBram Moolenaar      exported += 7
9485381c7a1SBram Moolenaar      g:imported_added = exported
9495381c7a1SBram Moolenaar    enddef
9505381c7a1SBram Moolenaar    ImportInDef()
9515381c7a1SBram Moolenaar  END
9525381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
9535381c7a1SBram Moolenaar  source Ximport2.vim
954f5be8cdbSBram Moolenaar  # TODO: this should be 9879
9555381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
9565381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
9575381c7a1SBram Moolenaar  unlet g:imported
9585381c7a1SBram Moolenaar  unlet g:imported_added
9595381c7a1SBram Moolenaar  delete('Ximport2.vim')
9605381c7a1SBram Moolenaar
961f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
962f2d5c240SBram Moolenaar    vim9script
963f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
964f2d5c240SBram Moolenaar    def UseExport()
965f2d5c240SBram Moolenaar      g:imported = Export.exported
966f2d5c240SBram Moolenaar    enddef
967f2d5c240SBram Moolenaar    UseExport()
968f2d5c240SBram Moolenaar  END
969f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
970f2d5c240SBram Moolenaar  source Ximport.vim
9715381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
972f2d5c240SBram Moolenaar
973599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
974599c89c8SBram Moolenaar    vim9script
975599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
976599c89c8SBram Moolenaar    def Func()
977599c89c8SBram Moolenaar      let dummy = 1
978599c89c8SBram Moolenaar      let imported = Export + dummy
979599c89c8SBram Moolenaar    enddef
980822ba247SBram Moolenaar    defcompile
981599c89c8SBram Moolenaar  END
982599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
983599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
984599c89c8SBram Moolenaar
985599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
986599c89c8SBram Moolenaar    vim9script
987599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
988599c89c8SBram Moolenaar    def Func()
989599c89c8SBram Moolenaar      let imported = Export . exported
990599c89c8SBram Moolenaar    enddef
991822ba247SBram Moolenaar    defcompile
992599c89c8SBram Moolenaar  END
993599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
994599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
995599c89c8SBram Moolenaar
996599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
997599c89c8SBram Moolenaar    vim9script
998599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
999599c89c8SBram Moolenaar    def Func()
1000599c89c8SBram Moolenaar      let imported = Export.
1001599c89c8SBram Moolenaar    enddef
1002822ba247SBram Moolenaar    defcompile
1003599c89c8SBram Moolenaar  END
1004599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1005599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1006599c89c8SBram Moolenaar
10071c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
10081c991144SBram Moolenaar    vim9script
10091c991144SBram Moolenaar    import *
10101c991144SBram Moolenaar        as Export
10111c991144SBram Moolenaar        from
10121c991144SBram Moolenaar        './Xexport.vim'
10131c991144SBram Moolenaar    def UseExport()
10141c991144SBram Moolenaar      g:imported = Export.exported
10151c991144SBram Moolenaar    enddef
10161c991144SBram Moolenaar    UseExport()
10171c991144SBram Moolenaar  END
10181c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
10191c991144SBram Moolenaar  source Ximport.vim
10201c991144SBram Moolenaar  assert_equal(9883, g:imported)
10211c991144SBram Moolenaar
1022f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1023f2d5c240SBram Moolenaar    vim9script
1024f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1025f2d5c240SBram Moolenaar  END
1026f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1027f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1028f2d5c240SBram Moolenaar
1029f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1030fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1031fa29c8abSBram Moolenaar    vim9script
1032fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1033fa29c8abSBram Moolenaar  END
1034fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1035fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1036fa29c8abSBram Moolenaar
1037f5be8cdbSBram Moolenaar  # try to import something that is already defined
10385269bd2aSBram Moolenaar  let import_already_defined =<< trim END
10395269bd2aSBram Moolenaar    vim9script
10405269bd2aSBram Moolenaar    let exported = 'something'
10415269bd2aSBram Moolenaar    import exported from './Xexport.vim'
10425269bd2aSBram Moolenaar  END
10435269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
10445269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
10455269bd2aSBram Moolenaar
1046f5be8cdbSBram Moolenaar  # try to import something that is already defined
10475269bd2aSBram Moolenaar  import_already_defined =<< trim END
10485269bd2aSBram Moolenaar    vim9script
10495269bd2aSBram Moolenaar    let exported = 'something'
10505269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
10515269bd2aSBram Moolenaar  END
10525269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
10535269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
10545269bd2aSBram Moolenaar
1055f5be8cdbSBram Moolenaar  # try to import something that is already defined
10565269bd2aSBram Moolenaar  import_already_defined =<< trim END
10575269bd2aSBram Moolenaar    vim9script
10585269bd2aSBram Moolenaar    let exported = 'something'
10595269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
10605269bd2aSBram Moolenaar  END
10615269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
10625269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
10635269bd2aSBram Moolenaar
1064f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1065fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1066fa29c8abSBram Moolenaar    vim9script
1067fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1068fa29c8abSBram Moolenaar  END
1069fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1070fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1071fa29c8abSBram Moolenaar
1072fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1073fa29c8abSBram Moolenaar    vim9script
1074fa29c8abSBram Moolenaar    import name './Xexport.vim'
1075fa29c8abSBram Moolenaar  END
1076fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1077fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1078fa29c8abSBram Moolenaar
1079fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1080fa29c8abSBram Moolenaar    vim9script
1081fa29c8abSBram Moolenaar    import name from Xexport.vim
1082fa29c8abSBram Moolenaar  END
1083fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1084fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1085fa29c8abSBram Moolenaar
1086fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1087fa29c8abSBram Moolenaar    vim9script
1088fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1089fa29c8abSBram Moolenaar  END
1090fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1091fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1092fa29c8abSBram Moolenaar
1093fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1094fa29c8abSBram Moolenaar    vim9script
1095fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1096fa29c8abSBram Moolenaar  END
10975269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
10985269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1099fa29c8abSBram Moolenaar
1100f2d5c240SBram Moolenaar  delete('Ximport.vim')
11015269bd2aSBram Moolenaar  delete('Ximport3.vim')
11028a7d6542SBram Moolenaar  delete('Xexport.vim')
11038a7d6542SBram Moolenaar
1104f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1105750802b5SBram Moolenaar  set cpo&vi
1106750802b5SBram Moolenaar  let cpo_before = &cpo
1107750802b5SBram Moolenaar  let lines =<< trim END
1108750802b5SBram Moolenaar    vim9script
1109750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1110750802b5SBram Moolenaar  END
1111750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1112750802b5SBram Moolenaar  source Xvim9_script
1113750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1114750802b5SBram Moolenaar  set cpo&vim
1115750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1116750802b5SBram Moolenaar  delete('Xvim9_script')
1117750802b5SBram Moolenaarenddef
1118750802b5SBram Moolenaar
1119750802b5SBram Moolenaardef Test_vim9script_fails()
11208a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
11218a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1122750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
11239721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
11249b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1125750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1126750802b5SBram Moolenaar
1127c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1128c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1129c785b9a7SBram Moolenaar
1130750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1131a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
11328a7d6542SBram Moolenaarenddef
11338a7d6542SBram Moolenaar
1134f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1135101f4810SBram Moolenaar  CheckRunVimInTerminal
1136101f4810SBram Moolenaar
11379bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1138c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
11399bb3eb3eSBram Moolenaarendfunc
11409bb3eb3eSBram Moolenaar
1141c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1142101f4810SBram Moolenaar  let export =<< trim END
1143101f4810SBram Moolenaar    vim9script
1144101f4810SBram Moolenaar    export def Foo(): number
1145101f4810SBram Moolenaar        return 0
1146101f4810SBram Moolenaar    enddef
1147101f4810SBram Moolenaar  END
11489bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
1149101f4810SBram Moolenaar
11509bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
11519bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
11529bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1153101f4810SBram Moolenaar
11549bb3eb3eSBram Moolenaar  delete('Xexport.vim')
11559bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
11569bb3eb3eSBram Moolenaarenddef
1157101f4810SBram Moolenaar
11584c17ad94SBram Moolenaardef Test_vim9script_reload_import()
11598a7d6542SBram Moolenaar  let lines =<< trim END
11608a7d6542SBram Moolenaar    vim9script
11618a7d6542SBram Moolenaar    const var = ''
11628a7d6542SBram Moolenaar    let valone = 1234
11638a7d6542SBram Moolenaar    def MyFunc(arg: string)
11648a7d6542SBram Moolenaar       valone = 5678
11658a7d6542SBram Moolenaar    enddef
11668a7d6542SBram Moolenaar  END
11678a7d6542SBram Moolenaar  let morelines =<< trim END
11688a7d6542SBram Moolenaar    let valtwo = 222
11698a7d6542SBram Moolenaar    export def GetValtwo(): number
11708a7d6542SBram Moolenaar      return valtwo
11718a7d6542SBram Moolenaar    enddef
11728a7d6542SBram Moolenaar  END
117303afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
11748a7d6542SBram Moolenaar  source Xreload.vim
11758a7d6542SBram Moolenaar  source Xreload.vim
11768a7d6542SBram Moolenaar  source Xreload.vim
11778a7d6542SBram Moolenaar
11788a7d6542SBram Moolenaar  let testlines =<< trim END
11798a7d6542SBram Moolenaar    vim9script
11808a7d6542SBram Moolenaar    def TheFunc()
11818a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
11828a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
11838a7d6542SBram Moolenaar    enddef
11848a7d6542SBram Moolenaar    TheFunc()
11858a7d6542SBram Moolenaar  END
11868a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
11878a7d6542SBram Moolenaar  source Ximport.vim
11888a7d6542SBram Moolenaar
1189f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1190f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
11918a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
11928a7d6542SBram Moolenaar  source Ximport.vim
11938a7d6542SBram Moolenaar
1194f5be8cdbSBram Moolenaar  # cannot declare a var twice
11958a7d6542SBram Moolenaar  lines =<< trim END
11968a7d6542SBram Moolenaar    vim9script
11978a7d6542SBram Moolenaar    let valone = 1234
11988a7d6542SBram Moolenaar    let valone = 5678
11998a7d6542SBram Moolenaar  END
12008a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
12018a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
12028a7d6542SBram Moolenaar
12038a7d6542SBram Moolenaar  delete('Xreload.vim')
12048a7d6542SBram Moolenaar  delete('Ximport.vim')
12058a7d6542SBram Moolenaarenddef
12068a7d6542SBram Moolenaar
1207fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1208fe465a01SBram Moolenaar" script-local name.
1209fe465a01SBram Moolenaardef Test_vim9script_funcref()
1210fe465a01SBram Moolenaar  let sortlines =<< trim END
1211fe465a01SBram Moolenaar      vim9script
1212fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1213bed36b93SBram Moolenaar        return i2 - i1
1214fe465a01SBram Moolenaar      enddef
1215fe465a01SBram Moolenaar
1216fe465a01SBram Moolenaar      export def FastSort(): list<number>
1217fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1218fe465a01SBram Moolenaar      enddef
1219fe465a01SBram Moolenaar  END
1220fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1221fe465a01SBram Moolenaar
1222fe465a01SBram Moolenaar  let lines =<< trim END
1223fe465a01SBram Moolenaar    vim9script
1224fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1225fe465a01SBram Moolenaar    def Test()
1226fe465a01SBram Moolenaar      g:result = FastSort()
1227fe465a01SBram Moolenaar    enddef
1228fe465a01SBram Moolenaar    Test()
1229fe465a01SBram Moolenaar  END
1230fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1231fe465a01SBram Moolenaar
1232fe465a01SBram Moolenaar  source Xscript.vim
1233fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1234fe465a01SBram Moolenaar
1235fe465a01SBram Moolenaar  unlet g:result
1236fe465a01SBram Moolenaar  delete('Xsort.vim')
1237fe465a01SBram Moolenaar  delete('Xscript.vim')
1238fe465a01SBram Moolenaarenddef
1239fe465a01SBram Moolenaar
1240c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1241c620c055SBram Moolenaar" script where FastFilter() is called from.
1242c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1243c620c055SBram Moolenaar  let filterLines =<< trim END
1244c620c055SBram Moolenaar    vim9script
1245c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1246c620c055SBram Moolenaar      return idx % 2 == 1
1247c620c055SBram Moolenaar    enddef
1248c620c055SBram Moolenaar    export def FastFilter(): list<number>
1249c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1250c620c055SBram Moolenaar    enddef
1251c620c055SBram Moolenaar  END
1252c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1253c620c055SBram Moolenaar
1254c620c055SBram Moolenaar  let lines =<< trim END
1255c620c055SBram Moolenaar    vim9script
1256c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1257c620c055SBram Moolenaar    def Test()
1258c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1259c620c055SBram Moolenaar    enddef
1260c620c055SBram Moolenaar    Test()
1261c620c055SBram Moolenaar  END
1262c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1263c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1264c620c055SBram Moolenaar
1265c620c055SBram Moolenaar  delete('Xfilter.vim')
1266c620c055SBram Moolenaar  delete('Ximport.vim')
1267c620c055SBram Moolenaarenddef
1268c620c055SBram Moolenaar
12694c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
12704c17ad94SBram Moolenaar  let first_lines =<< trim END
12714c17ad94SBram Moolenaar    vim9script
12724c17ad94SBram Moolenaar    def FuncYes(): string
12734c17ad94SBram Moolenaar      return 'yes'
12744c17ad94SBram Moolenaar    enddef
12754c17ad94SBram Moolenaar  END
127603afdcf1SBram Moolenaar  let withno_lines =<< trim END
12774c17ad94SBram Moolenaar    def FuncNo(): string
12784c17ad94SBram Moolenaar      return 'no'
12794c17ad94SBram Moolenaar    enddef
12804c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
12814c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
12824c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
128303afdcf1SBram Moolenaar    enddef
128403afdcf1SBram Moolenaar  END
128503afdcf1SBram Moolenaar  let nono_lines =<< trim END
128603afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
128703afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
12884c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
12894c17ad94SBram Moolenaar    enddef
12904c17ad94SBram Moolenaar  END
12914c17ad94SBram Moolenaar
12924c17ad94SBram Moolenaar  # FuncNo() is defined
129303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12944c17ad94SBram Moolenaar  source Xreloaded.vim
12954c17ad94SBram Moolenaar  g:DoCheck(true)
12964c17ad94SBram Moolenaar
12974c17ad94SBram Moolenaar  # FuncNo() is not redefined
129803afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
12994c17ad94SBram Moolenaar  source Xreloaded.vim
130003afdcf1SBram Moolenaar  g:DoCheck()
13014c17ad94SBram Moolenaar
13024c17ad94SBram Moolenaar  # FuncNo() is back
130303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
13044c17ad94SBram Moolenaar  source Xreloaded.vim
130503afdcf1SBram Moolenaar  g:DoCheck()
13064c17ad94SBram Moolenaar
13074c17ad94SBram Moolenaar  delete('Xreloaded.vim')
13084c17ad94SBram Moolenaarenddef
13094c17ad94SBram Moolenaar
131089483d40SBram Moolenaardef Test_vim9script_reload_delvar()
131189483d40SBram Moolenaar  # write the script with a script-local variable
131289483d40SBram Moolenaar  let lines =<< trim END
131389483d40SBram Moolenaar    vim9script
131489483d40SBram Moolenaar    let var = 'string'
131589483d40SBram Moolenaar  END
131689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
131789483d40SBram Moolenaar  source XreloadVar.vim
131889483d40SBram Moolenaar
131989483d40SBram Moolenaar  # now write the script using the same variable locally - works
132089483d40SBram Moolenaar  lines =<< trim END
132189483d40SBram Moolenaar    vim9script
132289483d40SBram Moolenaar    def Func()
132389483d40SBram Moolenaar      let var = 'string'
132489483d40SBram Moolenaar    enddef
132589483d40SBram Moolenaar  END
132689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
132789483d40SBram Moolenaar  source XreloadVar.vim
132889483d40SBram Moolenaar
132989483d40SBram Moolenaar  delete('XreloadVar.vim')
133089483d40SBram Moolenaarenddef
133189483d40SBram Moolenaar
13328a7d6542SBram Moolenaardef Test_import_absolute()
13338a7d6542SBram Moolenaar  let import_lines = [
1334e6085c53SBram Moolenaar        'vim9script',
1335e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1336e6085c53SBram Moolenaar        'def UseExported()',
1337e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1338e6085c53SBram Moolenaar        '  exported = 8888',
1339e6085c53SBram Moolenaar        '  g:imported_after = exported',
1340e6085c53SBram Moolenaar        'enddef',
1341e6085c53SBram Moolenaar        'UseExported()',
1342e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1343e6085c53SBram Moolenaar        ]
13448a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
13458a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
13468a7d6542SBram Moolenaar
13478a7d6542SBram Moolenaar  source Ximport_abs.vim
13488a7d6542SBram Moolenaar
13498a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
13504e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1351675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1352675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1353675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1354675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1355675f716eSBram Moolenaar          'exported = 8888.*' ..
1356675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1357675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1358675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1359675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1360e6085c53SBram Moolenaar        g:import_disassembled)
13618a7d6542SBram Moolenaar  unlet g:imported_abs
13624e12a5dfSBram Moolenaar  unlet g:import_disassembled
13638a7d6542SBram Moolenaar
13648a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
13658a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
13668a7d6542SBram Moolenaarenddef
13678a7d6542SBram Moolenaar
13688a7d6542SBram Moolenaardef Test_import_rtp()
13698a7d6542SBram Moolenaar  let import_lines = [
1370e6085c53SBram Moolenaar        'vim9script',
1371e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1372e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1373e6085c53SBram Moolenaar        ]
13748a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
13758a7d6542SBram Moolenaar  mkdir('import')
13768a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
13778a7d6542SBram Moolenaar
13788a7d6542SBram Moolenaar  let save_rtp = &rtp
13798a7d6542SBram Moolenaar  &rtp = getcwd()
13808a7d6542SBram Moolenaar  source Ximport_rtp.vim
13818a7d6542SBram Moolenaar  &rtp = save_rtp
13828a7d6542SBram Moolenaar
13838a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
13848a7d6542SBram Moolenaar  unlet g:imported_rtp
13858a7d6542SBram Moolenaar
13868a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
138789483d40SBram Moolenaar  delete('import', 'rf')
13888a7d6542SBram Moolenaarenddef
13898a7d6542SBram Moolenaar
139025e0f586SBram Moolenaardef Test_import_compile_error()
139125e0f586SBram Moolenaar  let export_lines = [
139225e0f586SBram Moolenaar        'vim9script',
139325e0f586SBram Moolenaar        'export def ExpFunc(): string',
139425e0f586SBram Moolenaar        '  return notDefined',
139525e0f586SBram Moolenaar        'enddef',
139625e0f586SBram Moolenaar        ]
139725e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
139825e0f586SBram Moolenaar
139925e0f586SBram Moolenaar  let import_lines = [
140025e0f586SBram Moolenaar        'vim9script',
140125e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
140225e0f586SBram Moolenaar        'def ImpFunc()',
140325e0f586SBram Moolenaar        '  echo ExpFunc()',
140425e0f586SBram Moolenaar        'enddef',
140525e0f586SBram Moolenaar        'defcompile',
140625e0f586SBram Moolenaar        ]
140725e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
140825e0f586SBram Moolenaar
140925e0f586SBram Moolenaar  try
141025e0f586SBram Moolenaar    source Ximport.vim
141125e0f586SBram Moolenaar  catch /E1001/
1412f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
141325e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
141425e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
141525e0f586SBram Moolenaar  endtry
141625e0f586SBram Moolenaar
141725e0f586SBram Moolenaar  delete('Xexported.vim')
141825e0f586SBram Moolenaar  delete('Ximport.vim')
141925e0f586SBram Moolenaarenddef
142025e0f586SBram Moolenaar
14218a7d6542SBram Moolenaardef Test_fixed_size_list()
1422f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
14238a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
14248a7d6542SBram Moolenaar  l->remove(0)
14258a7d6542SBram Moolenaar  l->add(5)
14268a7d6542SBram Moolenaar  l->insert(99, 1)
14270f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
14288a7d6542SBram Moolenaarenddef
14298a7d6542SBram Moolenaar
1430158906cfSBram Moolenaardef IfElse(what: number): string
1431158906cfSBram Moolenaar  let res = ''
1432158906cfSBram Moolenaar  if what == 1
1433158906cfSBram Moolenaar    res = "one"
1434158906cfSBram Moolenaar  elseif what == 2
1435158906cfSBram Moolenaar    res = "two"
1436a259d8d3SBram Moolenaar  else
1437158906cfSBram Moolenaar    res = "three"
1438a259d8d3SBram Moolenaar  endif
1439158906cfSBram Moolenaar  return res
1440a259d8d3SBram Moolenaarenddef
1441a259d8d3SBram Moolenaar
1442158906cfSBram Moolenaardef Test_if_elseif_else()
1443158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1444158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1445158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
14460f18b6d1SBram Moolenaarenddef
14470f18b6d1SBram Moolenaar
1448e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1449e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1450e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1451e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1452e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1453585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1454e8c4abbbSBram Moolenaarenddef
1455e8c4abbbSBram Moolenaar
14566d69bf60SBram Moolenaarlet g:bool_true = v:true
14576d69bf60SBram Moolenaarlet g:bool_false = v:false
14586d69bf60SBram Moolenaar
14596d69bf60SBram Moolenaardef Test_if_const_expr()
14606d69bf60SBram Moolenaar  let res = false
14616d69bf60SBram Moolenaar  if true ? true : false
14626d69bf60SBram Moolenaar    res = true
14636d69bf60SBram Moolenaar  endif
14646d69bf60SBram Moolenaar  assert_equal(true, res)
14656d69bf60SBram Moolenaar
1466585fea7bSBram Moolenaar  g:glob = 2
1467585fea7bSBram Moolenaar  if false
14686797966dSBram Moolenaar    execute('g:glob = 3')
1469585fea7bSBram Moolenaar  endif
1470585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1471585fea7bSBram Moolenaar  if true
14726797966dSBram Moolenaar    execute('g:glob = 3')
1473585fea7bSBram Moolenaar  endif
1474585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1475585fea7bSBram Moolenaar
14766d69bf60SBram Moolenaar  res = false
14776d69bf60SBram Moolenaar  if g:bool_true ? true : false
14786d69bf60SBram Moolenaar    res = true
14796d69bf60SBram Moolenaar  endif
14806d69bf60SBram Moolenaar  assert_equal(true, res)
14816d69bf60SBram Moolenaar
14826d69bf60SBram Moolenaar  res = false
14836d69bf60SBram Moolenaar  if true ? g:bool_true : false
14846d69bf60SBram Moolenaar    res = true
14856d69bf60SBram Moolenaar  endif
14866d69bf60SBram Moolenaar  assert_equal(true, res)
14876d69bf60SBram Moolenaar
14886d69bf60SBram Moolenaar  res = false
14896d69bf60SBram Moolenaar  if true ? true : g:bool_false
14906d69bf60SBram Moolenaar    res = true
14916d69bf60SBram Moolenaar  endif
14926d69bf60SBram Moolenaar  assert_equal(true, res)
14936d69bf60SBram Moolenaar
14946d69bf60SBram Moolenaar  res = false
14956d69bf60SBram Moolenaar  if true ? false : true
14966d69bf60SBram Moolenaar    res = true
14976d69bf60SBram Moolenaar  endif
14986d69bf60SBram Moolenaar  assert_equal(false, res)
14996d69bf60SBram Moolenaar
15006d69bf60SBram Moolenaar  res = false
15016d69bf60SBram Moolenaar  if false ? false : true
15026d69bf60SBram Moolenaar    res = true
15036d69bf60SBram Moolenaar  endif
15046d69bf60SBram Moolenaar  assert_equal(true, res)
15056d69bf60SBram Moolenaar
15066d69bf60SBram Moolenaar  res = false
15076d69bf60SBram Moolenaar  if false ? true : false
15086d69bf60SBram Moolenaar    res = true
15096d69bf60SBram Moolenaar  endif
15106d69bf60SBram Moolenaar  assert_equal(false, res)
15116d69bf60SBram Moolenaar
15126d69bf60SBram Moolenaar  res = false
1513e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1514e8c4abbbSBram Moolenaar    res = true
1515e8c4abbbSBram Moolenaar  endif
1516e8c4abbbSBram Moolenaar  assert_equal(false, res)
1517e8c4abbbSBram Moolenaar
1518e8c4abbbSBram Moolenaar  res = false
15196d69bf60SBram Moolenaar  if true && true
15206d69bf60SBram Moolenaar    res = true
15216d69bf60SBram Moolenaar  endif
15226d69bf60SBram Moolenaar  assert_equal(true, res)
15236d69bf60SBram Moolenaar
15246d69bf60SBram Moolenaar  res = false
15256d69bf60SBram Moolenaar  if true && false
15266d69bf60SBram Moolenaar    res = true
15276d69bf60SBram Moolenaar  endif
15286d69bf60SBram Moolenaar  assert_equal(false, res)
15296d69bf60SBram Moolenaar
15306d69bf60SBram Moolenaar  res = false
15316d69bf60SBram Moolenaar  if g:bool_true && false
15326d69bf60SBram Moolenaar    res = true
15336d69bf60SBram Moolenaar  endif
15346d69bf60SBram Moolenaar  assert_equal(false, res)
15356d69bf60SBram Moolenaar
15366d69bf60SBram Moolenaar  res = false
15376d69bf60SBram Moolenaar  if true && g:bool_false
15386d69bf60SBram Moolenaar    res = true
15396d69bf60SBram Moolenaar  endif
15406d69bf60SBram Moolenaar  assert_equal(false, res)
15416d69bf60SBram Moolenaar
15426d69bf60SBram Moolenaar  res = false
15436d69bf60SBram Moolenaar  if false && false
15446d69bf60SBram Moolenaar    res = true
15456d69bf60SBram Moolenaar  endif
15466d69bf60SBram Moolenaar  assert_equal(false, res)
15476d69bf60SBram Moolenaar
15486d69bf60SBram Moolenaar  res = false
15496d69bf60SBram Moolenaar  if true || false
15506d69bf60SBram Moolenaar    res = true
15516d69bf60SBram Moolenaar  endif
15526d69bf60SBram Moolenaar  assert_equal(true, res)
15536d69bf60SBram Moolenaar
15546d69bf60SBram Moolenaar  res = false
15556d69bf60SBram Moolenaar  if g:bool_true || false
15566d69bf60SBram Moolenaar    res = true
15576d69bf60SBram Moolenaar  endif
15586d69bf60SBram Moolenaar  assert_equal(true, res)
15596d69bf60SBram Moolenaar
15606d69bf60SBram Moolenaar  res = false
15616d69bf60SBram Moolenaar  if true || g:bool_false
15626d69bf60SBram Moolenaar    res = true
15636d69bf60SBram Moolenaar  endif
15646d69bf60SBram Moolenaar  assert_equal(true, res)
15656d69bf60SBram Moolenaar
15666d69bf60SBram Moolenaar  res = false
15676d69bf60SBram Moolenaar  if false || false
15686d69bf60SBram Moolenaar    res = true
15696d69bf60SBram Moolenaar  endif
15706d69bf60SBram Moolenaar  assert_equal(false, res)
157180c34ca3SBram Moolenaarenddef
15726d69bf60SBram Moolenaar
157380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
157480c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
157580c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1576e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1577e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
15786d69bf60SBram Moolenaarenddef
15796d69bf60SBram Moolenaar
158072abcf42SBram Moolenaardef RunNested(i: number): number
158172abcf42SBram Moolenaar  let x: number = 0
158272abcf42SBram Moolenaar  if i % 2
158372abcf42SBram Moolenaar    if 1
1584f5be8cdbSBram Moolenaar      # comment
158572abcf42SBram Moolenaar    else
1586f5be8cdbSBram Moolenaar      # comment
158772abcf42SBram Moolenaar    endif
158872abcf42SBram Moolenaar    x += 1
158972abcf42SBram Moolenaar  else
159072abcf42SBram Moolenaar    x += 1000
159172abcf42SBram Moolenaar  endif
159272abcf42SBram Moolenaar  return x
159372abcf42SBram Moolenaarenddef
159472abcf42SBram Moolenaar
159572abcf42SBram Moolenaardef Test_nested_if()
159672abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
159772abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
159872abcf42SBram Moolenaarenddef
159972abcf42SBram Moolenaar
1600ad39c094SBram Moolenaardef Test_execute_cmd()
1601ad39c094SBram Moolenaar  new
1602ad39c094SBram Moolenaar  setline(1, 'default')
1603ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1604ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1605a72cfb80SBram Moolenaar
1606a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1607a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1608a72cfb80SBram Moolenaar
1609ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1610ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1611a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1612ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1613a72cfb80SBram Moolenaar
1614ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1615ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1616a72cfb80SBram Moolenaar
1617ad39c094SBram Moolenaar  let cmd_first = 'call '
1618ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1619ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1620ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1621ad39c094SBram Moolenaar  bwipe!
1622585fea7bSBram Moolenaar
1623585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1624a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1625ad39c094SBram Moolenaarenddef
1626ad39c094SBram Moolenaar
162747e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1628f5be8cdbSBram Moolenaar  # only checks line continuation
162947e880d6SBram Moolenaar  let lines =<< trim END
163047e880d6SBram Moolenaar      vim9script
163147e880d6SBram Moolenaar      execute 'g:someVar'
163247e880d6SBram Moolenaar                .. ' = ' ..
163347e880d6SBram Moolenaar                   '28'
163447e880d6SBram Moolenaar      assert_equal(28, g:someVar)
163547e880d6SBram Moolenaar      unlet g:someVar
163647e880d6SBram Moolenaar  END
163747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
163847e880d6SBram Moolenaarenddef
163947e880d6SBram Moolenaar
1640ad39c094SBram Moolenaardef Test_echo_cmd()
1641a72cfb80SBram Moolenaar  echo 'some' # comment
1642585fea7bSBram Moolenaar  echon 'thing'
1643ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1644ad39c094SBram Moolenaar
1645a72cfb80SBram Moolenaar  echo "some" # comment
1646a72cfb80SBram Moolenaar  echon "thing"
1647a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1648a72cfb80SBram Moolenaar
1649ad39c094SBram Moolenaar  let str1 = 'some'
1650ad39c094SBram Moolenaar  let str2 = 'more'
1651ad39c094SBram Moolenaar  echo str1 str2
1652ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1653a72cfb80SBram Moolenaar
1654a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1655ad39c094SBram Moolenaarenddef
1656ad39c094SBram Moolenaar
1657f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1658f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1659f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1660f93c7feaSBram Moolenaar  echo 'clear'
1661df069eecSBram Moolenaar  :1messages
1662f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1663f93c7feaSBram Moolenaar
1664f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1665f93c7feaSBram Moolenaarenddef
1666f93c7feaSBram Moolenaar
166747e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1668f5be8cdbSBram Moolenaar  # only checks line continuation
166947e880d6SBram Moolenaar  let lines =<< trim END
167047e880d6SBram Moolenaar      vim9script
167147e880d6SBram Moolenaar      echomsg 'here'
167247e880d6SBram Moolenaar                .. ' is ' ..
167347e880d6SBram Moolenaar                   'a message'
167447e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
167547e880d6SBram Moolenaar  END
167647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
167747e880d6SBram Moolenaarenddef
167847e880d6SBram Moolenaar
1679f93c7feaSBram Moolenaardef Test_echoerr_cmd()
168040ee466cSBram Moolenaar  try
168140ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
168240ee466cSBram Moolenaar  catch
168340ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
168440ee466cSBram Moolenaar  endtry
1685f93c7feaSBram Moolenaarenddef
1686f93c7feaSBram Moolenaar
168747e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1688f5be8cdbSBram Moolenaar  # only checks line continuation
168947e880d6SBram Moolenaar  let lines =<< trim END
169047e880d6SBram Moolenaar      vim9script
169147e880d6SBram Moolenaar      try
169247e880d6SBram Moolenaar        echoerr 'this'
169347e880d6SBram Moolenaar                .. ' is ' ..
169447e880d6SBram Moolenaar                   'wrong'
169547e880d6SBram Moolenaar      catch
169647e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
169747e880d6SBram Moolenaar      endtry
169847e880d6SBram Moolenaar  END
169947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
170047e880d6SBram Moolenaarenddef
170147e880d6SBram Moolenaar
170241fe0617SBram Moolenaardef Test_for_outside_of_function()
170341fe0617SBram Moolenaar  let lines =<< trim END
170441fe0617SBram Moolenaar    vim9script
170541fe0617SBram Moolenaar    new
170641fe0617SBram Moolenaar    for var in range(0, 3)
170741fe0617SBram Moolenaar      append(line('$'), var)
170841fe0617SBram Moolenaar    endfor
170941fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
171041fe0617SBram Moolenaar    bwipe!
171141fe0617SBram Moolenaar  END
171241fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
171341fe0617SBram Moolenaar  source Xvim9for.vim
171441fe0617SBram Moolenaar  delete('Xvim9for.vim')
171541fe0617SBram Moolenaarenddef
17168a7d6542SBram Moolenaar
1717e8c4abbbSBram Moolenaardef Test_for_loop()
1718e8c4abbbSBram Moolenaar  let result = ''
1719e8c4abbbSBram Moolenaar  for cnt in range(7)
1720e8c4abbbSBram Moolenaar    if cnt == 4
1721e8c4abbbSBram Moolenaar      break
1722e8c4abbbSBram Moolenaar    endif
1723e8c4abbbSBram Moolenaar    if cnt == 2
1724e8c4abbbSBram Moolenaar      continue
1725e8c4abbbSBram Moolenaar    endif
1726e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1727e8c4abbbSBram Moolenaar  endfor
1728e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
17290ad3e894SBram Moolenaar
17300ad3e894SBram Moolenaar  let concat = ''
17310ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
17320ad3e894SBram Moolenaar    concat ..= str
17330ad3e894SBram Moolenaar  endfor
17340ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1735e8c4abbbSBram Moolenaarenddef
1736e8c4abbbSBram Moolenaar
1737e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1738675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1739675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1740675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1741822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
17420ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
1743675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1744675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1745675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1746e8c4abbbSBram Moolenaarenddef
1747e8c4abbbSBram Moolenaar
1748d0df1aacSBram Moolenaardef Test_while_loop()
1749d0df1aacSBram Moolenaar  let result = ''
1750d0df1aacSBram Moolenaar  let cnt = 0
1751d0df1aacSBram Moolenaar  while cnt < 555
1752d0df1aacSBram Moolenaar    if cnt == 3
1753d0df1aacSBram Moolenaar      break
1754d0df1aacSBram Moolenaar    endif
1755d0df1aacSBram Moolenaar    cnt += 1
1756d0df1aacSBram Moolenaar    if cnt == 2
1757d0df1aacSBram Moolenaar      continue
1758d0df1aacSBram Moolenaar    endif
1759d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1760d0df1aacSBram Moolenaar  endwhile
1761d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1762d0df1aacSBram Moolenaarenddef
1763d0df1aacSBram Moolenaar
1764e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1765675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1766675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1767675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1768675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1769675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1770675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1771675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1772bd5da371SBram Moolenaarenddef
1773bd5da371SBram Moolenaar
17749645e2d9SBram Moolenaardef Test_interrupt_loop()
177597acfc78SBram Moolenaar  let caught = false
17769645e2d9SBram Moolenaar  let x = 0
177797acfc78SBram Moolenaar  try
17789645e2d9SBram Moolenaar    while 1
17799645e2d9SBram Moolenaar      x += 1
17809645e2d9SBram Moolenaar      if x == 100
17819645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
17829645e2d9SBram Moolenaar      endif
17839645e2d9SBram Moolenaar    endwhile
178497acfc78SBram Moolenaar  catch
178597acfc78SBram Moolenaar    caught = true
178697acfc78SBram Moolenaar    assert_equal(100, x)
178797acfc78SBram Moolenaar  endtry
178897acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
17899645e2d9SBram Moolenaarenddef
179020431c9dSBram Moolenaar
17914fdae999SBram Moolenaardef Test_automatic_line_continuation()
17924fdae999SBram Moolenaar  let mylist = [
17934fdae999SBram Moolenaar      'one',
17944fdae999SBram Moolenaar      'two',
17954fdae999SBram Moolenaar      'three',
1796f5be8cdbSBram Moolenaar      ] # comment
17974fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
17984fdae999SBram Moolenaar
17994fdae999SBram Moolenaar  let mydict = {
18004fdae999SBram Moolenaar      'one': 1,
18014fdae999SBram Moolenaar      'two': 2,
18024fdae999SBram Moolenaar      'three':
18034fdae999SBram Moolenaar          3,
1804f5be8cdbSBram Moolenaar      } # comment
18054fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
18064fdae999SBram Moolenaar  mydict = #{
18072c330432SBram Moolenaar      one: 1,  # comment
18082c330432SBram Moolenaar      two:     # comment
18092c330432SBram Moolenaar           2,  # comment
18102c330432SBram Moolenaar      three: 3 # comment
18112c330432SBram Moolenaar      }
18122c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
18132c330432SBram Moolenaar  mydict = #{
18142c330432SBram Moolenaar      one: 1,
18154fdae999SBram Moolenaar      two:
18164fdae999SBram Moolenaar           2,
18172c330432SBram Moolenaar      three: 3
18184fdae999SBram Moolenaar      }
18194fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1820e6085c53SBram Moolenaar
1821e6085c53SBram Moolenaar  assert_equal(
1822e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1823e6085c53SBram Moolenaar        split('one two three')
1824e6085c53SBram Moolenaar        )
18254fdae999SBram Moolenaarenddef
18264fdae999SBram Moolenaar
18277a092245SBram Moolenaardef Test_vim9_comment()
18287a092245SBram Moolenaar  CheckScriptSuccess([
18297a092245SBram Moolenaar      'vim9script',
18307a092245SBram Moolenaar      '# something',
18317a092245SBram Moolenaar      ])
18327a092245SBram Moolenaar  CheckScriptFailure([
18337a092245SBram Moolenaar      'vim9script',
18347a092245SBram Moolenaar      ':# something',
18357a092245SBram Moolenaar      ], 'E488:')
18367a092245SBram Moolenaar  CheckScriptFailure([
18377a092245SBram Moolenaar      '# something',
18387a092245SBram Moolenaar      ], 'E488:')
18397a092245SBram Moolenaar  CheckScriptFailure([
18407a092245SBram Moolenaar      ':# something',
18417a092245SBram Moolenaar      ], 'E488:')
18427a092245SBram Moolenaar
18434a8d9f2eSBram Moolenaar  { # block start
18444a8d9f2eSBram Moolenaar  } # block end
18454a8d9f2eSBram Moolenaar  CheckDefFailure([
18464a8d9f2eSBram Moolenaar      '{# comment',
18474a8d9f2eSBram Moolenaar      ], 'E488:')
18484a8d9f2eSBram Moolenaar  CheckDefFailure([
18494a8d9f2eSBram Moolenaar      '{',
18504a8d9f2eSBram Moolenaar      '}# comment',
18514a8d9f2eSBram Moolenaar      ], 'E488:')
18524a8d9f2eSBram Moolenaar
18534a8d9f2eSBram Moolenaar  echo "yes" # comment
18544a8d9f2eSBram Moolenaar  CheckDefFailure([
18554a8d9f2eSBram Moolenaar      'echo "yes"# comment',
18564a8d9f2eSBram Moolenaar      ], 'E488:')
18577a092245SBram Moolenaar  CheckScriptSuccess([
18587a092245SBram Moolenaar      'vim9script',
18597a092245SBram Moolenaar      'echo "yes" # something',
18607a092245SBram Moolenaar      ])
18617a092245SBram Moolenaar  CheckScriptFailure([
18627a092245SBram Moolenaar      'vim9script',
18637a092245SBram Moolenaar      'echo "yes"# something',
18647a092245SBram Moolenaar      ], 'E121:')
18657a092245SBram Moolenaar  CheckScriptFailure([
18667a092245SBram Moolenaar      'vim9script',
18677a092245SBram Moolenaar      'echo# something',
18687a092245SBram Moolenaar      ], 'E121:')
18697a092245SBram Moolenaar  CheckScriptFailure([
18707a092245SBram Moolenaar      'echo "yes" # something',
18717a092245SBram Moolenaar      ], 'E121:')
18727a092245SBram Moolenaar
18734a8d9f2eSBram Moolenaar  exe "echo" # comment
18744a8d9f2eSBram Moolenaar  CheckDefFailure([
18754a8d9f2eSBram Moolenaar      'exe "echo"# comment',
18764a8d9f2eSBram Moolenaar      ], 'E488:')
18774a8d9f2eSBram Moolenaar  CheckScriptSuccess([
18784a8d9f2eSBram Moolenaar      'vim9script',
18794a8d9f2eSBram Moolenaar      'exe "echo" # something',
18804a8d9f2eSBram Moolenaar      ])
18814a8d9f2eSBram Moolenaar  CheckScriptFailure([
18824a8d9f2eSBram Moolenaar      'vim9script',
18834a8d9f2eSBram Moolenaar      'exe "echo"# something',
18844a8d9f2eSBram Moolenaar      ], 'E121:')
18854a8d9f2eSBram Moolenaar  CheckDefFailure([
18864a8d9f2eSBram Moolenaar      'exe # comment',
18874a8d9f2eSBram Moolenaar      ], 'E1015:')
18884a8d9f2eSBram Moolenaar  CheckScriptFailure([
18894a8d9f2eSBram Moolenaar      'vim9script',
18904a8d9f2eSBram Moolenaar      'exe# something',
18914a8d9f2eSBram Moolenaar      ], 'E121:')
18924a8d9f2eSBram Moolenaar  CheckScriptFailure([
18934a8d9f2eSBram Moolenaar      'exe "echo" # something',
18944a8d9f2eSBram Moolenaar      ], 'E121:')
18954a8d9f2eSBram Moolenaar
18967a092245SBram Moolenaar  CheckDefFailure([
18977a092245SBram Moolenaar      'try# comment',
18987a092245SBram Moolenaar      '  echo "yes"',
18997a092245SBram Moolenaar      'catch',
19007a092245SBram Moolenaar      'endtry',
19017a092245SBram Moolenaar      ], 'E488:')
19022c5ed4e3SBram Moolenaar  CheckScriptFailure([
19032c5ed4e3SBram Moolenaar      'vim9script',
19042c5ed4e3SBram Moolenaar      'try# comment',
19052c5ed4e3SBram Moolenaar      'echo "yes"',
19062c5ed4e3SBram Moolenaar      ], 'E488:')
19077a092245SBram Moolenaar  CheckDefFailure([
19087a092245SBram Moolenaar      'try',
1909a72cfb80SBram Moolenaar      '  throw#comment',
1910a72cfb80SBram Moolenaar      'catch',
1911a72cfb80SBram Moolenaar      'endtry',
1912a72cfb80SBram Moolenaar      ], 'E1015:')
1913a72cfb80SBram Moolenaar  CheckDefFailure([
1914a72cfb80SBram Moolenaar      'try',
1915a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1916a72cfb80SBram Moolenaar      'catch',
1917a72cfb80SBram Moolenaar      'endtry',
1918a72cfb80SBram Moolenaar      ], 'E488:')
1919a72cfb80SBram Moolenaar  CheckDefFailure([
1920a72cfb80SBram Moolenaar      'try',
19217a092245SBram Moolenaar      '  echo "yes"',
19227a092245SBram Moolenaar      'catch# comment',
19237a092245SBram Moolenaar      'endtry',
19247a092245SBram Moolenaar      ], 'E488:')
19252c5ed4e3SBram Moolenaar  CheckScriptFailure([
19262c5ed4e3SBram Moolenaar      'vim9script',
19272c5ed4e3SBram Moolenaar      'try',
19282c5ed4e3SBram Moolenaar      '  echo "yes"',
19292c5ed4e3SBram Moolenaar      'catch# comment',
19302c5ed4e3SBram Moolenaar      'endtry',
19312c5ed4e3SBram Moolenaar      ], 'E654:')
19322c5ed4e3SBram Moolenaar  CheckDefFailure([
19332c5ed4e3SBram Moolenaar      'try',
19342c5ed4e3SBram Moolenaar      '  echo "yes"',
19352c5ed4e3SBram Moolenaar      'catch /pat/# comment',
19362c5ed4e3SBram Moolenaar      'endtry',
19372c5ed4e3SBram Moolenaar      ], 'E488:')
19387a092245SBram Moolenaar  CheckDefFailure([
19397a092245SBram Moolenaar      'try',
19407a092245SBram Moolenaar      'echo "yes"',
19417a092245SBram Moolenaar      'catch',
19427a092245SBram Moolenaar      'endtry# comment',
19437a092245SBram Moolenaar      ], 'E488:')
19442c5ed4e3SBram Moolenaar  CheckScriptFailure([
19452c5ed4e3SBram Moolenaar      'vim9script',
19462c5ed4e3SBram Moolenaar      'try',
19472c5ed4e3SBram Moolenaar      '  echo "yes"',
19482c5ed4e3SBram Moolenaar      'catch',
19492c5ed4e3SBram Moolenaar      'endtry# comment',
19509b7bf9e9SBram Moolenaar      ], 'E488:')
19512c5ed4e3SBram Moolenaar
19522c5ed4e3SBram Moolenaar  CheckScriptSuccess([
19532c5ed4e3SBram Moolenaar      'vim9script',
19542c5ed4e3SBram Moolenaar      'hi # comment',
19552c5ed4e3SBram Moolenaar      ])
19562c5ed4e3SBram Moolenaar  CheckScriptFailure([
19572c5ed4e3SBram Moolenaar      'vim9script',
19582c5ed4e3SBram Moolenaar      'hi# comment',
19592c5ed4e3SBram Moolenaar      ], 'E416:')
19601966c248SBram Moolenaar  CheckScriptSuccess([
19611966c248SBram Moolenaar      'vim9script',
19621966c248SBram Moolenaar      'hi Search # comment',
19631966c248SBram Moolenaar      ])
19641966c248SBram Moolenaar  CheckScriptFailure([
19651966c248SBram Moolenaar      'vim9script',
19661966c248SBram Moolenaar      'hi Search# comment',
19671966c248SBram Moolenaar      ], 'E416:')
19681966c248SBram Moolenaar  CheckScriptSuccess([
19691966c248SBram Moolenaar      'vim9script',
19701966c248SBram Moolenaar      'hi link This Search # comment',
19711966c248SBram Moolenaar      ])
19721966c248SBram Moolenaar  CheckScriptFailure([
19731966c248SBram Moolenaar      'vim9script',
19741966c248SBram Moolenaar      'hi link This That# comment',
19751966c248SBram Moolenaar      ], 'E413:')
19761966c248SBram Moolenaar  CheckScriptSuccess([
19771966c248SBram Moolenaar      'vim9script',
19781966c248SBram Moolenaar      'hi clear This # comment',
19791966c248SBram Moolenaar      'hi clear # comment',
19801966c248SBram Moolenaar      ])
1981f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
1982f5be8cdbSBram Moolenaar  # hi clear This# comment',
19831966c248SBram Moolenaar  CheckScriptFailure([
19841966c248SBram Moolenaar      'vim9script',
19851966c248SBram Moolenaar      'hi clear# comment',
19861966c248SBram Moolenaar      ], 'E416:')
19871966c248SBram Moolenaar
19881966c248SBram Moolenaar  CheckScriptSuccess([
19891966c248SBram Moolenaar      'vim9script',
19901966c248SBram Moolenaar      'hi Group term=bold',
19911966c248SBram Moolenaar      'match Group /todo/ # comment',
19921966c248SBram Moolenaar      ])
19931966c248SBram Moolenaar  CheckScriptFailure([
19941966c248SBram Moolenaar      'vim9script',
19951966c248SBram Moolenaar      'hi Group term=bold',
19961966c248SBram Moolenaar      'match Group /todo/# comment',
19971966c248SBram Moolenaar      ], 'E488:')
19981966c248SBram Moolenaar  CheckScriptSuccess([
19991966c248SBram Moolenaar      'vim9script',
20001966c248SBram Moolenaar      'match # comment',
20011966c248SBram Moolenaar      ])
20021966c248SBram Moolenaar  CheckScriptFailure([
20031966c248SBram Moolenaar      'vim9script',
20041966c248SBram Moolenaar      'match# comment',
20051966c248SBram Moolenaar      ], 'E475:')
20061966c248SBram Moolenaar  CheckScriptSuccess([
20071966c248SBram Moolenaar      'vim9script',
20081966c248SBram Moolenaar      'match none # comment',
20091966c248SBram Moolenaar      ])
20101966c248SBram Moolenaar  CheckScriptFailure([
20111966c248SBram Moolenaar      'vim9script',
20121966c248SBram Moolenaar      'match none# comment',
20131966c248SBram Moolenaar      ], 'E475:')
20141966c248SBram Moolenaar
20151966c248SBram Moolenaar  CheckScriptSuccess([
20161966c248SBram Moolenaar      'vim9script',
20171966c248SBram Moolenaar      'menutrans clear # comment',
20181966c248SBram Moolenaar      ])
20191966c248SBram Moolenaar  CheckScriptFailure([
20201966c248SBram Moolenaar      'vim9script',
20211966c248SBram Moolenaar      'menutrans clear# comment text',
20221966c248SBram Moolenaar      ], 'E474:')
20231966c248SBram Moolenaar
20241966c248SBram Moolenaar  CheckScriptSuccess([
20251966c248SBram Moolenaar      'vim9script',
20261966c248SBram Moolenaar      'syntax clear # comment',
20271966c248SBram Moolenaar      ])
20281966c248SBram Moolenaar  CheckScriptFailure([
20291966c248SBram Moolenaar      'vim9script',
20301966c248SBram Moolenaar      'syntax clear# comment text',
20311966c248SBram Moolenaar      ], 'E28:')
20321966c248SBram Moolenaar  CheckScriptSuccess([
20331966c248SBram Moolenaar      'vim9script',
20341966c248SBram Moolenaar      'syntax keyword Word some',
20351966c248SBram Moolenaar      'syntax clear Word # comment',
20361966c248SBram Moolenaar      ])
20371966c248SBram Moolenaar  CheckScriptFailure([
20381966c248SBram Moolenaar      'vim9script',
20391966c248SBram Moolenaar      'syntax keyword Word some',
20401966c248SBram Moolenaar      'syntax clear Word# comment text',
20411966c248SBram Moolenaar      ], 'E28:')
20421966c248SBram Moolenaar
20431966c248SBram Moolenaar  CheckScriptSuccess([
20441966c248SBram Moolenaar      'vim9script',
20451966c248SBram Moolenaar      'syntax list # comment',
20461966c248SBram Moolenaar      ])
20471966c248SBram Moolenaar  CheckScriptFailure([
20481966c248SBram Moolenaar      'vim9script',
20491966c248SBram Moolenaar      'syntax list# comment text',
20501966c248SBram Moolenaar      ], 'E28:')
20511966c248SBram Moolenaar
20521966c248SBram Moolenaar  CheckScriptSuccess([
20531966c248SBram Moolenaar      'vim9script',
20541966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
20551966c248SBram Moolenaar      ])
20561966c248SBram Moolenaar  CheckScriptFailure([
20571966c248SBram Moolenaar      'vim9script',
20581966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
20591966c248SBram Moolenaar      ], 'E475:')
20601966c248SBram Moolenaar
20611966c248SBram Moolenaar  CheckScriptSuccess([
20621966c248SBram Moolenaar      'vim9script',
20631966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
20641966c248SBram Moolenaar      ])
20651966c248SBram Moolenaar  CheckScriptFailure([
20661966c248SBram Moolenaar      'vim9script',
20671966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
20681966c248SBram Moolenaar      ], 'E789:')
20691966c248SBram Moolenaar
20701966c248SBram Moolenaar  CheckScriptSuccess([
20711966c248SBram Moolenaar      'vim9script',
20721966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
20731966c248SBram Moolenaar      ])
20741966c248SBram Moolenaar  CheckScriptFailure([
20751966c248SBram Moolenaar      'vim9script',
20761966c248SBram Moolenaar      'syntax match Word /pat/# comment',
20771966c248SBram Moolenaar      ], 'E402:')
20781966c248SBram Moolenaar
20791966c248SBram Moolenaar  CheckScriptSuccess([
20801966c248SBram Moolenaar      'vim9script',
20811966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
20821966c248SBram Moolenaar      ])
20831966c248SBram Moolenaar  CheckScriptFailure([
20841966c248SBram Moolenaar      'vim9script',
20851966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
20861966c248SBram Moolenaar      ], 'E475:')
20871966c248SBram Moolenaar  CheckScriptFailure([
20881966c248SBram Moolenaar      'vim9script',
20891966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
20901966c248SBram Moolenaar      ], 'E406:')
20911966c248SBram Moolenaar  CheckScriptFailure([
20921966c248SBram Moolenaar      'vim9script',
20931966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
20941966c248SBram Moolenaar      ], 'E475:')
20951966c248SBram Moolenaar
20961966c248SBram Moolenaar  CheckScriptSuccess([
20971966c248SBram Moolenaar      'vim9script',
20981966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
20991966c248SBram Moolenaar      ])
21001966c248SBram Moolenaar  CheckScriptFailure([
21011966c248SBram Moolenaar      'vim9script',
21021966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2103d032f34aSBram Moolenaar      ], 'E402:')
21041966c248SBram Moolenaar
21051966c248SBram Moolenaar  CheckScriptSuccess([
21061966c248SBram Moolenaar      'vim9script',
21071966c248SBram Moolenaar      'syntax sync # comment',
21081966c248SBram Moolenaar      ])
21091966c248SBram Moolenaar  CheckScriptFailure([
21101966c248SBram Moolenaar      'vim9script',
21111966c248SBram Moolenaar      'syntax sync# comment',
21121966c248SBram Moolenaar      ], 'E404:')
21131966c248SBram Moolenaar  CheckScriptSuccess([
21141966c248SBram Moolenaar      'vim9script',
21151966c248SBram Moolenaar      'syntax sync ccomment # comment',
21161966c248SBram Moolenaar      ])
21171966c248SBram Moolenaar  CheckScriptFailure([
21181966c248SBram Moolenaar      'vim9script',
21191966c248SBram Moolenaar      'syntax sync ccomment# comment',
21201966c248SBram Moolenaar      ], 'E404:')
21211966c248SBram Moolenaar
21221966c248SBram Moolenaar  CheckScriptSuccess([
21231966c248SBram Moolenaar      'vim9script',
21241966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
21251966c248SBram Moolenaar      ])
21261966c248SBram Moolenaar  CheckScriptFailure([
21271966c248SBram Moolenaar      'vim9script',
21281966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
21291966c248SBram Moolenaar      ], 'E475:')
2130a72cfb80SBram Moolenaar
2131a72cfb80SBram Moolenaar  CheckScriptSuccess([
2132a72cfb80SBram Moolenaar      'vim9script',
2133a72cfb80SBram Moolenaar      'command Echo echo # comment',
2134a72cfb80SBram Moolenaar      'command Echo # comment',
2135a72cfb80SBram Moolenaar      ])
2136a72cfb80SBram Moolenaar  CheckScriptFailure([
2137a72cfb80SBram Moolenaar      'vim9script',
2138a72cfb80SBram Moolenaar      'command Echo echo# comment',
2139a72cfb80SBram Moolenaar      'Echo',
2140a72cfb80SBram Moolenaar      ], 'E121:')
2141a72cfb80SBram Moolenaar  CheckScriptFailure([
2142a72cfb80SBram Moolenaar      'vim9script',
2143a72cfb80SBram Moolenaar      'command Echo# comment',
2144a72cfb80SBram Moolenaar      ], 'E182:')
2145a72cfb80SBram Moolenaar  CheckScriptFailure([
2146a72cfb80SBram Moolenaar      'vim9script',
2147a72cfb80SBram Moolenaar      'command Echo echo',
2148a72cfb80SBram Moolenaar      'command Echo# comment',
2149a72cfb80SBram Moolenaar      ], 'E182:')
2150a72cfb80SBram Moolenaar
2151a72cfb80SBram Moolenaar  CheckScriptSuccess([
2152a72cfb80SBram Moolenaar      'vim9script',
2153a72cfb80SBram Moolenaar      'function # comment',
2154a72cfb80SBram Moolenaar      ])
2155a72cfb80SBram Moolenaar  CheckScriptFailure([
2156a72cfb80SBram Moolenaar      'vim9script',
2157a72cfb80SBram Moolenaar      'function# comment',
2158a72cfb80SBram Moolenaar      ], 'E129:')
2159a72cfb80SBram Moolenaar  CheckScriptSuccess([
2160a72cfb80SBram Moolenaar      'vim9script',
2161a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2162a72cfb80SBram Moolenaar      ])
2163a72cfb80SBram Moolenaar  CheckScriptFailure([
2164a72cfb80SBram Moolenaar      'vim9script',
2165a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2166a72cfb80SBram Moolenaar      ], 'E488:')
2167a72cfb80SBram Moolenaar
2168a72cfb80SBram Moolenaar  CheckScriptSuccess([
2169a72cfb80SBram Moolenaar      'vim9script',
21704c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2171a72cfb80SBram Moolenaar      'endfunc',
21724c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2173a72cfb80SBram Moolenaar      ])
2174a72cfb80SBram Moolenaar  CheckScriptFailure([
2175a72cfb80SBram Moolenaar      'vim9script',
21764c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2177a72cfb80SBram Moolenaar      'endfunc',
21784c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2179a72cfb80SBram Moolenaar      ], 'E488:')
2180a72cfb80SBram Moolenaar
2181a72cfb80SBram Moolenaar  CheckScriptSuccess([
2182a72cfb80SBram Moolenaar      'vim9script',
2183a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2184a72cfb80SBram Moolenaar      ])
2185a72cfb80SBram Moolenaar  CheckScriptFailure([
2186a72cfb80SBram Moolenaar      'vim9script',
2187a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2188a72cfb80SBram Moolenaar      ], 'E488:')
21892c5ed4e3SBram Moolenaarenddef
21902c5ed4e3SBram Moolenaar
21912c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
21922c5ed4e3SBram Moolenaar  CheckCanRunGui
21932c5ed4e3SBram Moolenaar
21942c5ed4e3SBram Moolenaar  CheckScriptFailure([
21952c5ed4e3SBram Moolenaar      'vim9script',
21962c5ed4e3SBram Moolenaar      'gui#comment'
21972c5ed4e3SBram Moolenaar      ], 'E499:')
21982c5ed4e3SBram Moolenaar  CheckScriptFailure([
21992c5ed4e3SBram Moolenaar      'vim9script',
22002c5ed4e3SBram Moolenaar      'gui -f#comment'
22012c5ed4e3SBram Moolenaar      ], 'E499:')
22027a092245SBram Moolenaarenddef
22037a092245SBram Moolenaar
2204a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
22056797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
22066797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2207a26b9700SBram Moolenaar
2208a26b9700SBram Moolenaar  edit test.vim
2209a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2210a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2211a26b9700SBram Moolenaar
2212a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2213a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2214a26b9700SBram Moolenaar
2215a26b9700SBram Moolenaar  g:entered = 0
2216a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2217a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2218a26b9700SBram Moolenaar
2219a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2220a26b9700SBram Moolenaar
2221a26b9700SBram Moolenaar  au! TabEnter
2222a26b9700SBram Moolenaar  unlet g:entered
2223d72c1bf0SBram Moolenaar
2224d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2225d72c1bf0SBram Moolenaar      'vim9script',
22266797966dSBram Moolenaar      'g:var = 123',
2227e55b1c09SBram Moolenaar      'b:var = 456',
2228e55b1c09SBram Moolenaar      'w:var = 777',
2229e55b1c09SBram Moolenaar      't:var = 888',
2230d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2231d72c1bf0SBram Moolenaar      ])
2232d72c1bf0SBram Moolenaar
2233d72c1bf0SBram Moolenaar  CheckScriptFailure([
2234d72c1bf0SBram Moolenaar      'vim9script',
2235d72c1bf0SBram Moolenaar      'let g:var = 123',
2236e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2237e55b1c09SBram Moolenaar
2238e55b1c09SBram Moolenaar  CheckScriptFailure([
2239e55b1c09SBram Moolenaar      'vim9script',
2240e55b1c09SBram Moolenaar      'let b:var = 123',
2241e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2242e55b1c09SBram Moolenaar
2243e55b1c09SBram Moolenaar  CheckScriptFailure([
2244e55b1c09SBram Moolenaar      'vim9script',
2245e55b1c09SBram Moolenaar      'let w:var = 123',
2246e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2247e55b1c09SBram Moolenaar
2248e55b1c09SBram Moolenaar  CheckScriptFailure([
2249e55b1c09SBram Moolenaar      'vim9script',
2250e55b1c09SBram Moolenaar      'let t:var = 123',
2251e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2252e55b1c09SBram Moolenaar
2253e55b1c09SBram Moolenaar  CheckScriptFailure([
2254e55b1c09SBram Moolenaar      'vim9script',
2255e55b1c09SBram Moolenaar      'let v:version = 123',
2256e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2257e55b1c09SBram Moolenaar
2258e55b1c09SBram Moolenaar  CheckScriptFailure([
2259e55b1c09SBram Moolenaar      'vim9script',
2260e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2261e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
22626797966dSBram Moolenaar
22636797966dSBram Moolenaar  CheckScriptFailure([
22646797966dSBram Moolenaar      'vim9script',
22656797966dSBram Moolenaar      'g:var = 123',
226632e35117SBram Moolenaar      'unlet g:var# comment1',
2267d72c1bf0SBram Moolenaar      ], 'E108:')
2268d72c1bf0SBram Moolenaar
2269d72c1bf0SBram Moolenaar  CheckScriptFailure([
2270d72c1bf0SBram Moolenaar      'let g:var = 123',
2271d72c1bf0SBram Moolenaar      'unlet g:var # something',
2272d72c1bf0SBram Moolenaar      ], 'E488:')
2273faac4104SBram Moolenaar
2274faac4104SBram Moolenaar  CheckScriptSuccess([
2275faac4104SBram Moolenaar      'vim9script',
227632e35117SBram Moolenaar      'if 1 # comment2',
2277faac4104SBram Moolenaar      '  echo "yes"',
2278faac4104SBram Moolenaar      'elseif 2 #comment',
2279faac4104SBram Moolenaar      '  echo "no"',
2280faac4104SBram Moolenaar      'endif',
2281faac4104SBram Moolenaar      ])
2282faac4104SBram Moolenaar
2283faac4104SBram Moolenaar  CheckScriptFailure([
2284faac4104SBram Moolenaar      'vim9script',
228532e35117SBram Moolenaar      'if 1# comment3',
2286faac4104SBram Moolenaar      '  echo "yes"',
2287faac4104SBram Moolenaar      'endif',
2288faac4104SBram Moolenaar      ], 'E15:')
2289faac4104SBram Moolenaar
2290faac4104SBram Moolenaar  CheckScriptFailure([
2291faac4104SBram Moolenaar      'vim9script',
229232e35117SBram Moolenaar      'if 0 # comment4',
2293faac4104SBram Moolenaar      '  echo "yes"',
2294faac4104SBram Moolenaar      'elseif 2#comment',
2295faac4104SBram Moolenaar      '  echo "no"',
2296faac4104SBram Moolenaar      'endif',
2297faac4104SBram Moolenaar      ], 'E15:')
2298faac4104SBram Moolenaar
2299faac4104SBram Moolenaar  CheckScriptSuccess([
2300faac4104SBram Moolenaar      'vim9script',
230132e35117SBram Moolenaar      'let v = 1 # comment5',
2302faac4104SBram Moolenaar      ])
2303faac4104SBram Moolenaar
2304faac4104SBram Moolenaar  CheckScriptFailure([
2305faac4104SBram Moolenaar      'vim9script',
230632e35117SBram Moolenaar      'let v = 1# comment6',
230732e35117SBram Moolenaar      ], 'E15:')
2308faac4104SBram Moolenaar
2309faac4104SBram Moolenaar  CheckScriptSuccess([
2310faac4104SBram Moolenaar      'vim9script',
2311faac4104SBram Moolenaar      'new'
2312faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2313df069eecSBram Moolenaar      ':$',
2314faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2315faac4104SBram Moolenaar      'bwipe!',
2316faac4104SBram Moolenaar      ])
2317faac4104SBram Moolenaar
2318f5be8cdbSBram Moolenaar  CheckScriptFailure([
2319f5be8cdbSBram Moolenaar      'vim9script',
2320f5be8cdbSBram Moolenaar      'new'
2321f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2322f5be8cdbSBram Moolenaar      ':$',
2323f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2324f5be8cdbSBram Moolenaar      'bwipe!',
2325f5be8cdbSBram Moolenaar      ], 'E488:')
2326f5be8cdbSBram Moolenaar
2327f5be8cdbSBram Moolenaar  CheckScriptFailure([
2328f5be8cdbSBram Moolenaar      'vim9script',
2329f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2330f5be8cdbSBram Moolenaar      ], 'E477:')
2331a26b9700SBram Moolenaarenddef
2332a26b9700SBram Moolenaar
23337e5bd91dSBram Moolenaardef Test_finish()
23347e5bd91dSBram Moolenaar  let lines =<< trim END
23357e5bd91dSBram Moolenaar    vim9script
23366797966dSBram Moolenaar    g:res = 'one'
23377e5bd91dSBram Moolenaar    if v:false | finish | endif
23386797966dSBram Moolenaar    g:res = 'two'
23397e5bd91dSBram Moolenaar    finish
23406797966dSBram Moolenaar    g:res = 'three'
23417e5bd91dSBram Moolenaar  END
23427e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
23437e5bd91dSBram Moolenaar  source Xfinished
23447e5bd91dSBram Moolenaar  assert_equal('two', g:res)
23457e5bd91dSBram Moolenaar
23467e5bd91dSBram Moolenaar  unlet g:res
23477e5bd91dSBram Moolenaar  delete('Xfinished')
23487e5bd91dSBram Moolenaarenddef
23497e5bd91dSBram Moolenaar
235032e35117SBram Moolenaardef Test_let_func_call()
235132e35117SBram Moolenaar  let lines =<< trim END
235232e35117SBram Moolenaar    vim9script
235332e35117SBram Moolenaar    func GetValue()
235432e35117SBram Moolenaar      if exists('g:count')
235532e35117SBram Moolenaar        let g:count += 1
235632e35117SBram Moolenaar      else
235732e35117SBram Moolenaar        let g:count = 1
235832e35117SBram Moolenaar      endif
235932e35117SBram Moolenaar      return 'this'
236032e35117SBram Moolenaar    endfunc
236132e35117SBram Moolenaar    let val: string = GetValue()
2362f5be8cdbSBram Moolenaar    # env var is always a string
2363df671b46SBram Moolenaar    let env = $TERM
236432e35117SBram Moolenaar  END
236532e35117SBram Moolenaar  writefile(lines, 'Xfinished')
236632e35117SBram Moolenaar  source Xfinished
2367f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
236832e35117SBram Moolenaar  assert_equal(1, g:count)
236932e35117SBram Moolenaar
237032e35117SBram Moolenaar  unlet g:count
237132e35117SBram Moolenaar  delete('Xfinished')
237232e35117SBram Moolenaarenddef
237332e35117SBram Moolenaar
237432e35117SBram Moolenaardef Test_let_missing_type()
237532e35117SBram Moolenaar  let lines =<< trim END
237632e35117SBram Moolenaar    vim9script
2377df671b46SBram Moolenaar    let var = g:unknown
2378227a69deSBram Moolenaar  END
2379822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2380227a69deSBram Moolenaar
2381227a69deSBram Moolenaar  lines =<< trim END
2382227a69deSBram Moolenaar    vim9script
2383227a69deSBram Moolenaar    let nr: number = 123
2384227a69deSBram Moolenaar    let var = nr
2385227a69deSBram Moolenaar  END
2386822ba247SBram Moolenaar  CheckScriptSuccess(lines)
238732e35117SBram Moolenaarenddef
238832e35117SBram Moolenaar
2389c82a5b5dSBram Moolenaardef Test_let_declaration()
2390c82a5b5dSBram Moolenaar  let lines =<< trim END
2391c82a5b5dSBram Moolenaar    vim9script
2392c82a5b5dSBram Moolenaar    let var: string
2393c82a5b5dSBram Moolenaar    g:var_uninit = var
2394c82a5b5dSBram Moolenaar    var = 'text'
2395c82a5b5dSBram Moolenaar    g:var_test = var
2396f5be8cdbSBram Moolenaar    # prefixing s: is optional
2397984dddbeSBram Moolenaar    s:var = 'prefixed'
2398984dddbeSBram Moolenaar    g:var_prefixed = s:var
2399984dddbeSBram Moolenaar
2400984dddbeSBram Moolenaar    let s:other: number
2401984dddbeSBram Moolenaar    other = 1234
2402984dddbeSBram Moolenaar    g:other_var = other
2403c82a5b5dSBram Moolenaar  END
2404c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2405c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2406c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2407984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2408984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2409c82a5b5dSBram Moolenaar
2410c82a5b5dSBram Moolenaar  unlet g:var_uninit
2411c82a5b5dSBram Moolenaar  unlet g:var_test
2412984dddbeSBram Moolenaar  unlet g:var_prefixed
2413984dddbeSBram Moolenaar  unlet g:other_var
2414c82a5b5dSBram Moolenaarenddef
2415c82a5b5dSBram Moolenaar
2416c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2417c5b1c20bSBram Moolenaar  let lines =<< trim END
2418c5b1c20bSBram Moolenaar    vim9script
2419c5b1c20bSBram Moolenaar    const var: string
2420c5b1c20bSBram Moolenaar  END
2421c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2422c5b1c20bSBram Moolenaar
2423c5b1c20bSBram Moolenaar  lines =<< trim END
2424c5b1c20bSBram Moolenaar    vim9script
2425c5b1c20bSBram Moolenaar    let 9var: string
2426c5b1c20bSBram Moolenaar  END
2427c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2428c5b1c20bSBram Moolenaarenddef
2429c5b1c20bSBram Moolenaar
243034db91f7SBram Moolenaardef Test_let_type_check()
243134db91f7SBram Moolenaar  let lines =<< trim END
243234db91f7SBram Moolenaar    vim9script
243334db91f7SBram Moolenaar    let var: string
243434db91f7SBram Moolenaar    var = 1234
243534db91f7SBram Moolenaar  END
243634db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2437984dddbeSBram Moolenaar
2438984dddbeSBram Moolenaar  lines =<< trim END
2439984dddbeSBram Moolenaar    vim9script
2440984dddbeSBram Moolenaar    let var:string
2441984dddbeSBram Moolenaar  END
2442984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2443c5b1c20bSBram Moolenaar
2444c5b1c20bSBram Moolenaar  lines =<< trim END
2445c5b1c20bSBram Moolenaar    vim9script
2446c5b1c20bSBram Moolenaar    let var: asdf
2447c5b1c20bSBram Moolenaar  END
2448c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
244934db91f7SBram Moolenaarenddef
245034db91f7SBram Moolenaar
2451a5d0077eSBram Moolenaardef Test_forward_declaration()
2452a5d0077eSBram Moolenaar  let lines =<< trim END
2453a5d0077eSBram Moolenaar    vim9script
2454a5d0077eSBram Moolenaar    def GetValue(): string
2455a5d0077eSBram Moolenaar      return theVal
2456a5d0077eSBram Moolenaar    enddef
2457a5d0077eSBram Moolenaar    let theVal = 'something'
2458822ba247SBram Moolenaar    g:initVal = GetValue()
2459a5d0077eSBram Moolenaar    theVal = 'else'
2460a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2461a5d0077eSBram Moolenaar  END
2462a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2463a5d0077eSBram Moolenaar  source Xforward
2464a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2465a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2466a5d0077eSBram Moolenaar
2467a5d0077eSBram Moolenaar  unlet g:initVal
2468a5d0077eSBram Moolenaar  unlet g:laterVal
2469a5d0077eSBram Moolenaar  delete('Xforward')
2470a5d0077eSBram Moolenaarenddef
2471a5d0077eSBram Moolenaar
24729721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
24739721fb4eSBram Moolenaar  let legacy_lines =<< trim END
24749721fb4eSBram Moolenaar    source Xvim9_script.vim
24759721fb4eSBram Moolenaar
24769721fb4eSBram Moolenaar    call assert_false(exists('local'))
24779721fb4eSBram Moolenaar    call assert_false(exists('exported'))
24789721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
24799721fb4eSBram Moolenaar    call assert_equal('global', global)
24809721fb4eSBram Moolenaar    call assert_equal('global', g:global)
24819721fb4eSBram Moolenaar
24829721fb4eSBram Moolenaar    " imported variable becomes script-local
24839721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
24849721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
24859721fb4eSBram Moolenaar    call assert_false(exists('exported'))
24869721fb4eSBram Moolenaar
24879721fb4eSBram Moolenaar    " imported function becomes script-local
24889721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
24899721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
24909721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
24919721fb4eSBram Moolenaar  END
24929721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
24939721fb4eSBram Moolenaar
24949721fb4eSBram Moolenaar  let vim9_lines =<< trim END
24959721fb4eSBram Moolenaar    vim9script
24969721fb4eSBram Moolenaar    let local = 'local'
24979721fb4eSBram Moolenaar    g:global = 'global'
24989721fb4eSBram Moolenaar    export let exported = 'exported'
24999721fb4eSBram Moolenaar    export def GetText(): string
25009721fb4eSBram Moolenaar       return 'text'
25019721fb4eSBram Moolenaar    enddef
25029721fb4eSBram Moolenaar  END
25039721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
25049721fb4eSBram Moolenaar
25059721fb4eSBram Moolenaar  source Xlegacy_script.vim
25069721fb4eSBram Moolenaar
25079721fb4eSBram Moolenaar  assert_equal('global', g:global)
2508f5be8cdbSBram Moolenaar  unlet g:global
25099721fb4eSBram Moolenaar
25109721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
25119721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
25129721fb4eSBram Moolenaarenddef
2513a5d0077eSBram Moolenaar
2514eeb27bfeSBram Moolenaardef Test_vim9_copen()
2515eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2516eeb27bfeSBram Moolenaar  copen
2517eeb27bfeSBram Moolenaar  quit
2518eeb27bfeSBram Moolenaarenddef
2519eeb27bfeSBram Moolenaar
2520585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2521585fea7bSBram Moolenaardef Test_substitute_cmd()
2522585fea7bSBram Moolenaar  new
2523585fea7bSBram Moolenaar  setline(1, 'something')
2524585fea7bSBram Moolenaar  :substitute(some(other(
2525585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2526585fea7bSBram Moolenaar  bwipe!
2527585fea7bSBram Moolenaar
2528f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2529585fea7bSBram Moolenaar  let lines =<< trim END
2530585fea7bSBram Moolenaar    vim9script
2531585fea7bSBram Moolenaar    new
2532585fea7bSBram Moolenaar    setline(1, 'something')
2533585fea7bSBram Moolenaar    :substitute(some(other(
2534585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2535585fea7bSBram Moolenaar    bwipe!
2536585fea7bSBram Moolenaar  END
2537585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2538585fea7bSBram Moolenaar  source Xvim9lines
2539585fea7bSBram Moolenaar
2540585fea7bSBram Moolenaar  delete('Xvim9lines')
2541585fea7bSBram Moolenaarenddef
2542585fea7bSBram Moolenaar
25438a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2544