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
329be61bbbSBram Moolenaar  let a: number = 6
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
47401d9ffbSBram Moolenaar  g:newvar = 'new'
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
501*d032f34aSBram Moolenaarfunc g:NoSuchFunc()
502*d032f34aSBram Moolenaar  echo 'none'
503*d032f34aSBram Moolenaarendfunc
504*d032f34aSBram 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)
663*d032f34aSBram Moolenaar
664*d032f34aSBram Moolenaar  try
665*d032f34aSBram Moolenaar    echo len(v:true)
666*d032f34aSBram Moolenaar  catch /E701:/
667*d032f34aSBram Moolenaar    n = 355
668*d032f34aSBram Moolenaar  endtry
669*d032f34aSBram Moolenaar  assert_equal(355, n)
670*d032f34aSBram Moolenaar
671*d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
672*d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
673*d032f34aSBram Moolenaar  try
674*d032f34aSBram Moolenaar    echo P()
675*d032f34aSBram Moolenaar  catch /E117:/
676*d032f34aSBram Moolenaar    n = 366
677*d032f34aSBram Moolenaar  endtry
678*d032f34aSBram Moolenaar  assert_equal(366, n)
679*d032f34aSBram Moolenaar
680*d032f34aSBram Moolenaar  try
681*d032f34aSBram Moolenaar    echo g:NoSuchFunc()
682*d032f34aSBram Moolenaar  catch /E117:/
683*d032f34aSBram Moolenaar    n = 377
684*d032f34aSBram Moolenaar  endtry
685*d032f34aSBram Moolenaar  assert_equal(377, n)
686*d032f34aSBram Moolenaar
687*d032f34aSBram Moolenaar  try
688*d032f34aSBram Moolenaar    echo g:alist + 4
689*d032f34aSBram Moolenaar  catch /E745:/
690*d032f34aSBram Moolenaar    n = 388
691*d032f34aSBram Moolenaar  endtry
692*d032f34aSBram Moolenaar  assert_equal(388, n)
693*d032f34aSBram Moolenaar
694*d032f34aSBram Moolenaar  try
695*d032f34aSBram Moolenaar    echo 4 + g:alist
696*d032f34aSBram Moolenaar  catch /E745:/
697*d032f34aSBram Moolenaar    n = 399
698*d032f34aSBram Moolenaar  endtry
699*d032f34aSBram Moolenaar  assert_equal(399, n)
700*d032f34aSBram Moolenaar
701*d032f34aSBram Moolenaar  try
702*d032f34aSBram Moolenaar    echo g:alist.member
703*d032f34aSBram Moolenaar  catch /E715:/
704*d032f34aSBram Moolenaar    n = 400
705*d032f34aSBram Moolenaar  endtry
706*d032f34aSBram Moolenaar  assert_equal(400, n)
707*d032f34aSBram Moolenaar
708*d032f34aSBram Moolenaar  try
709*d032f34aSBram Moolenaar    echo d.member
710*d032f34aSBram Moolenaar  catch /E716:/
711*d032f34aSBram Moolenaar    n = 411
712*d032f34aSBram Moolenaar  endtry
713*d032f34aSBram 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
8242a1381c3SBram Moolenaarif has('channel')
82540ee466cSBram Moolenaar  let someJob = test_null_job()
82640ee466cSBram Moolenaar
82740ee466cSBram Moolenaar  def FuncWithError()
82840ee466cSBram Moolenaar    echomsg g:someJob
82940ee466cSBram Moolenaar  enddef
83040ee466cSBram Moolenaar
83140ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
83240ee466cSBram Moolenaar    try
83340ee466cSBram Moolenaar      call FuncWithError()
83440ee466cSBram Moolenaar    catch
83540ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
83640ee466cSBram Moolenaar    endtry
83740ee466cSBram Moolenaar  endfunc
8382a1381c3SBram Moolenaarendif
83940ee466cSBram Moolenaar
8408a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
8418a7d6542SBram Moolenaar  vim9script
8428a7d6542SBram Moolenaar  let name: string = 'bob'
8438a7d6542SBram Moolenaar  def Concat(arg: string): string
8448a7d6542SBram Moolenaar    return name .. arg
8458a7d6542SBram Moolenaar  enddef
846227a69deSBram Moolenaar  g:result = Concat('bie')
847227a69deSBram Moolenaar  g:localname = name
8488a7d6542SBram Moolenaar
8498a7d6542SBram Moolenaar  export const CONST = 1234
8508a7d6542SBram Moolenaar  export let exported = 9876
8516e587dcbSBram Moolenaar  export let exp_name = 'John'
8528a7d6542SBram Moolenaar  export def Exported(): string
8538a7d6542SBram Moolenaar    return 'Exported'
8548a7d6542SBram Moolenaar  enddef
8558a7d6542SBram MoolenaarEND
8568a7d6542SBram Moolenaar
8575269bd2aSBram Moolenaardef Test_vim9_import_export()
8588a7d6542SBram Moolenaar  let import_script_lines =<< trim END
8598a7d6542SBram Moolenaar    vim9script
8608a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
8618a7d6542SBram Moolenaar    g:imported = exported
8626e587dcbSBram Moolenaar    exported += 3
8636e587dcbSBram Moolenaar    g:imported_added = exported
8648a7d6542SBram Moolenaar    g:imported_func = Exported()
8656e587dcbSBram Moolenaar
8666e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
8676e587dcbSBram Moolenaar    g:imported_name = exp_name
8686e587dcbSBram Moolenaar    exp_name ..= ' Doe'
8696e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
8705381c7a1SBram Moolenaar    g:imported_later = exported
8718a7d6542SBram Moolenaar  END
8728a7d6542SBram Moolenaar
8738a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
8748a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
8758a7d6542SBram Moolenaar
8768a7d6542SBram Moolenaar  source Ximport.vim
8778a7d6542SBram Moolenaar
8788a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
8798a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
8808a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
8816e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
8825381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
8838a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
8846e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
8856e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
8868a7d6542SBram Moolenaar  assert_false(exists('g:name'))
8878a7d6542SBram Moolenaar
8888a7d6542SBram Moolenaar  unlet g:result
8898a7d6542SBram Moolenaar  unlet g:localname
8908a7d6542SBram Moolenaar  unlet g:imported
8916e587dcbSBram Moolenaar  unlet g:imported_added
8925381c7a1SBram Moolenaar  unlet g:imported_later
8938a7d6542SBram Moolenaar  unlet g:imported_func
8946e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
8958a7d6542SBram Moolenaar  delete('Ximport.vim')
896f2d5c240SBram Moolenaar
8971c991144SBram Moolenaar  # similar, with line breaks
8981c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
8991c991144SBram Moolenaar    vim9script
9001c991144SBram Moolenaar    import {
9011c991144SBram Moolenaar        exported,
9021c991144SBram Moolenaar        Exported,
9031c991144SBram Moolenaar        }
9041c991144SBram Moolenaar        from
9051c991144SBram Moolenaar        './Xexport.vim'
9061c991144SBram Moolenaar    g:imported = exported
9071c991144SBram Moolenaar    exported += 5
9081c991144SBram Moolenaar    g:imported_added = exported
9091c991144SBram Moolenaar    g:imported_func = Exported()
9101c991144SBram Moolenaar  END
9111c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
9121c991144SBram Moolenaar  source Ximport_lbr.vim
9131c991144SBram Moolenaar
9141c991144SBram Moolenaar  assert_equal(9876, g:imported)
9151c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
9161c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
9171c991144SBram Moolenaar
9181c991144SBram Moolenaar  # exported script not sourced again
9191c991144SBram Moolenaar  assert_false(exists('g:result'))
9201c991144SBram Moolenaar  unlet g:imported
9211c991144SBram Moolenaar  unlet g:imported_added
9221c991144SBram Moolenaar  unlet g:imported_func
9231c991144SBram Moolenaar  delete('Ximport_lbr.vim')
9241c991144SBram Moolenaar
9251c991144SBram Moolenaar  # import inside :def function
9265381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
9275381c7a1SBram Moolenaar    vim9script
9285381c7a1SBram Moolenaar    def ImportInDef()
9295381c7a1SBram Moolenaar      import exported from './Xexport.vim'
9305381c7a1SBram Moolenaar      g:imported = exported
9315381c7a1SBram Moolenaar      exported += 7
9325381c7a1SBram Moolenaar      g:imported_added = exported
9335381c7a1SBram Moolenaar    enddef
9345381c7a1SBram Moolenaar    ImportInDef()
9355381c7a1SBram Moolenaar  END
9365381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
9375381c7a1SBram Moolenaar  source Ximport2.vim
938f5be8cdbSBram Moolenaar  # TODO: this should be 9879
9395381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
9405381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
9415381c7a1SBram Moolenaar  unlet g:imported
9425381c7a1SBram Moolenaar  unlet g:imported_added
9435381c7a1SBram Moolenaar  delete('Ximport2.vim')
9445381c7a1SBram Moolenaar
945f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
946f2d5c240SBram Moolenaar    vim9script
947f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
948f2d5c240SBram Moolenaar    def UseExport()
949f2d5c240SBram Moolenaar      g:imported = Export.exported
950f2d5c240SBram Moolenaar    enddef
951f2d5c240SBram Moolenaar    UseExport()
952f2d5c240SBram Moolenaar  END
953f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
954f2d5c240SBram Moolenaar  source Ximport.vim
9555381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
956f2d5c240SBram Moolenaar
957599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
958599c89c8SBram Moolenaar    vim9script
959599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
960599c89c8SBram Moolenaar    def Func()
961599c89c8SBram Moolenaar      let dummy = 1
962599c89c8SBram Moolenaar      let imported = Export + dummy
963599c89c8SBram Moolenaar    enddef
964822ba247SBram Moolenaar    defcompile
965599c89c8SBram Moolenaar  END
966599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
967599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
968599c89c8SBram Moolenaar
969599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
970599c89c8SBram Moolenaar    vim9script
971599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
972599c89c8SBram Moolenaar    def Func()
973599c89c8SBram Moolenaar      let imported = Export . exported
974599c89c8SBram Moolenaar    enddef
975822ba247SBram Moolenaar    defcompile
976599c89c8SBram Moolenaar  END
977599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
978599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
979599c89c8SBram Moolenaar
980599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
981599c89c8SBram Moolenaar    vim9script
982599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
983599c89c8SBram Moolenaar    def Func()
984599c89c8SBram Moolenaar      let imported = Export.
985599c89c8SBram Moolenaar    enddef
986822ba247SBram Moolenaar    defcompile
987599c89c8SBram Moolenaar  END
988599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
989599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
990599c89c8SBram Moolenaar
9911c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
9921c991144SBram Moolenaar    vim9script
9931c991144SBram Moolenaar    import *
9941c991144SBram Moolenaar        as Export
9951c991144SBram Moolenaar        from
9961c991144SBram Moolenaar        './Xexport.vim'
9971c991144SBram Moolenaar    def UseExport()
9981c991144SBram Moolenaar      g:imported = Export.exported
9991c991144SBram Moolenaar    enddef
10001c991144SBram Moolenaar    UseExport()
10011c991144SBram Moolenaar  END
10021c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
10031c991144SBram Moolenaar  source Ximport.vim
10041c991144SBram Moolenaar  assert_equal(9883, g:imported)
10051c991144SBram Moolenaar
1006f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1007f2d5c240SBram Moolenaar    vim9script
1008f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1009f2d5c240SBram Moolenaar  END
1010f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1011f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1012f2d5c240SBram Moolenaar
1013f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1014fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1015fa29c8abSBram Moolenaar    vim9script
1016fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1017fa29c8abSBram Moolenaar  END
1018fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1019fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1020fa29c8abSBram Moolenaar
1021f5be8cdbSBram Moolenaar  # try to import something that is already defined
10225269bd2aSBram Moolenaar  let import_already_defined =<< trim END
10235269bd2aSBram Moolenaar    vim9script
10245269bd2aSBram Moolenaar    let exported = 'something'
10255269bd2aSBram Moolenaar    import exported from './Xexport.vim'
10265269bd2aSBram Moolenaar  END
10275269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
10285269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
10295269bd2aSBram Moolenaar
1030f5be8cdbSBram Moolenaar  # try to import something that is already defined
10315269bd2aSBram Moolenaar  import_already_defined =<< trim END
10325269bd2aSBram Moolenaar    vim9script
10335269bd2aSBram Moolenaar    let exported = 'something'
10345269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
10355269bd2aSBram Moolenaar  END
10365269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
10375269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
10385269bd2aSBram Moolenaar
1039f5be8cdbSBram Moolenaar  # try to import something that is already defined
10405269bd2aSBram Moolenaar  import_already_defined =<< trim END
10415269bd2aSBram Moolenaar    vim9script
10425269bd2aSBram Moolenaar    let exported = 'something'
10435269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
10445269bd2aSBram Moolenaar  END
10455269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
10465269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
10475269bd2aSBram Moolenaar
1048f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1049fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1050fa29c8abSBram Moolenaar    vim9script
1051fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1052fa29c8abSBram Moolenaar  END
1053fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1054fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1055fa29c8abSBram Moolenaar
1056fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1057fa29c8abSBram Moolenaar    vim9script
1058fa29c8abSBram Moolenaar    import name './Xexport.vim'
1059fa29c8abSBram Moolenaar  END
1060fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1061fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1062fa29c8abSBram Moolenaar
1063fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1064fa29c8abSBram Moolenaar    vim9script
1065fa29c8abSBram Moolenaar    import name from Xexport.vim
1066fa29c8abSBram Moolenaar  END
1067fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1068fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1069fa29c8abSBram Moolenaar
1070fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1071fa29c8abSBram Moolenaar    vim9script
1072fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1073fa29c8abSBram Moolenaar  END
1074fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1075fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1076fa29c8abSBram Moolenaar
1077fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1078fa29c8abSBram Moolenaar    vim9script
1079fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1080fa29c8abSBram Moolenaar  END
10815269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
10825269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1083fa29c8abSBram Moolenaar
1084f2d5c240SBram Moolenaar  delete('Ximport.vim')
10855269bd2aSBram Moolenaar  delete('Ximport3.vim')
10868a7d6542SBram Moolenaar  delete('Xexport.vim')
10878a7d6542SBram Moolenaar
1088f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1089750802b5SBram Moolenaar  set cpo&vi
1090750802b5SBram Moolenaar  let cpo_before = &cpo
1091750802b5SBram Moolenaar  let lines =<< trim END
1092750802b5SBram Moolenaar    vim9script
1093750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1094750802b5SBram Moolenaar  END
1095750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1096750802b5SBram Moolenaar  source Xvim9_script
1097750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1098750802b5SBram Moolenaar  set cpo&vim
1099750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1100750802b5SBram Moolenaar  delete('Xvim9_script')
1101750802b5SBram Moolenaarenddef
1102750802b5SBram Moolenaar
1103750802b5SBram Moolenaardef Test_vim9script_fails()
11048a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
11058a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1106750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
11079721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
11089b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1109750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1110750802b5SBram Moolenaar
1111c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1112c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1113c785b9a7SBram Moolenaar
1114750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1115a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
11168a7d6542SBram Moolenaarenddef
11178a7d6542SBram Moolenaar
1118f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1119101f4810SBram Moolenaar  CheckRunVimInTerminal
1120101f4810SBram Moolenaar
11219bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1122c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
11239bb3eb3eSBram Moolenaarendfunc
11249bb3eb3eSBram Moolenaar
1125c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1126101f4810SBram Moolenaar  let export =<< trim END
1127101f4810SBram Moolenaar    vim9script
1128101f4810SBram Moolenaar    export def Foo(): number
1129101f4810SBram Moolenaar        return 0
1130101f4810SBram Moolenaar    enddef
1131101f4810SBram Moolenaar  END
11329bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
1133101f4810SBram Moolenaar
11349bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
11359bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
11369bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1137101f4810SBram Moolenaar
11389bb3eb3eSBram Moolenaar  delete('Xexport.vim')
11399bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
11409bb3eb3eSBram Moolenaarenddef
1141101f4810SBram Moolenaar
11424c17ad94SBram Moolenaardef Test_vim9script_reload_import()
11438a7d6542SBram Moolenaar  let lines =<< trim END
11448a7d6542SBram Moolenaar    vim9script
11458a7d6542SBram Moolenaar    const var = ''
11468a7d6542SBram Moolenaar    let valone = 1234
11478a7d6542SBram Moolenaar    def MyFunc(arg: string)
11488a7d6542SBram Moolenaar       valone = 5678
11498a7d6542SBram Moolenaar    enddef
11508a7d6542SBram Moolenaar  END
11518a7d6542SBram Moolenaar  let morelines =<< trim END
11528a7d6542SBram Moolenaar    let valtwo = 222
11538a7d6542SBram Moolenaar    export def GetValtwo(): number
11548a7d6542SBram Moolenaar      return valtwo
11558a7d6542SBram Moolenaar    enddef
11568a7d6542SBram Moolenaar  END
115703afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
11588a7d6542SBram Moolenaar  source Xreload.vim
11598a7d6542SBram Moolenaar  source Xreload.vim
11608a7d6542SBram Moolenaar  source Xreload.vim
11618a7d6542SBram Moolenaar
11628a7d6542SBram Moolenaar  let testlines =<< trim END
11638a7d6542SBram Moolenaar    vim9script
11648a7d6542SBram Moolenaar    def TheFunc()
11658a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
11668a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
11678a7d6542SBram Moolenaar    enddef
11688a7d6542SBram Moolenaar    TheFunc()
11698a7d6542SBram Moolenaar  END
11708a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
11718a7d6542SBram Moolenaar  source Ximport.vim
11728a7d6542SBram Moolenaar
1173f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1174f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
11758a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
11768a7d6542SBram Moolenaar  source Ximport.vim
11778a7d6542SBram Moolenaar
1178f5be8cdbSBram Moolenaar  # cannot declare a var twice
11798a7d6542SBram Moolenaar  lines =<< trim END
11808a7d6542SBram Moolenaar    vim9script
11818a7d6542SBram Moolenaar    let valone = 1234
11828a7d6542SBram Moolenaar    let valone = 5678
11838a7d6542SBram Moolenaar  END
11848a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
11858a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
11868a7d6542SBram Moolenaar
11878a7d6542SBram Moolenaar  delete('Xreload.vim')
11888a7d6542SBram Moolenaar  delete('Ximport.vim')
11898a7d6542SBram Moolenaarenddef
11908a7d6542SBram Moolenaar
1191fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1192fe465a01SBram Moolenaar" script-local name.
1193fe465a01SBram Moolenaardef Test_vim9script_funcref()
1194fe465a01SBram Moolenaar  let sortlines =<< trim END
1195fe465a01SBram Moolenaar      vim9script
1196fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1197bed36b93SBram Moolenaar        return i2 - i1
1198fe465a01SBram Moolenaar      enddef
1199fe465a01SBram Moolenaar
1200fe465a01SBram Moolenaar      export def FastSort(): list<number>
1201fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1202fe465a01SBram Moolenaar      enddef
1203fe465a01SBram Moolenaar  END
1204fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1205fe465a01SBram Moolenaar
1206fe465a01SBram Moolenaar  let lines =<< trim END
1207fe465a01SBram Moolenaar    vim9script
1208fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1209fe465a01SBram Moolenaar    def Test()
1210fe465a01SBram Moolenaar      g:result = FastSort()
1211fe465a01SBram Moolenaar    enddef
1212fe465a01SBram Moolenaar    Test()
1213fe465a01SBram Moolenaar  END
1214fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1215fe465a01SBram Moolenaar
1216fe465a01SBram Moolenaar  source Xscript.vim
1217fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1218fe465a01SBram Moolenaar
1219fe465a01SBram Moolenaar  unlet g:result
1220fe465a01SBram Moolenaar  delete('Xsort.vim')
1221fe465a01SBram Moolenaar  delete('Xscript.vim')
1222fe465a01SBram Moolenaarenddef
1223fe465a01SBram Moolenaar
1224c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1225c620c055SBram Moolenaar" script where FastFilter() is called from.
1226c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1227c620c055SBram Moolenaar  let filterLines =<< trim END
1228c620c055SBram Moolenaar    vim9script
1229c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1230c620c055SBram Moolenaar      return idx % 2 == 1
1231c620c055SBram Moolenaar    enddef
1232c620c055SBram Moolenaar    export def FastFilter(): list<number>
1233c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1234c620c055SBram Moolenaar    enddef
1235c620c055SBram Moolenaar  END
1236c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1237c620c055SBram Moolenaar
1238c620c055SBram Moolenaar  let lines =<< trim END
1239c620c055SBram Moolenaar    vim9script
1240c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1241c620c055SBram Moolenaar    def Test()
1242c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1243c620c055SBram Moolenaar    enddef
1244c620c055SBram Moolenaar    Test()
1245c620c055SBram Moolenaar  END
1246c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1247c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1248c620c055SBram Moolenaar
1249c620c055SBram Moolenaar  delete('Xfilter.vim')
1250c620c055SBram Moolenaar  delete('Ximport.vim')
1251c620c055SBram Moolenaarenddef
1252c620c055SBram Moolenaar
12534c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
12544c17ad94SBram Moolenaar  let first_lines =<< trim END
12554c17ad94SBram Moolenaar    vim9script
12564c17ad94SBram Moolenaar    def FuncYes(): string
12574c17ad94SBram Moolenaar      return 'yes'
12584c17ad94SBram Moolenaar    enddef
12594c17ad94SBram Moolenaar  END
126003afdcf1SBram Moolenaar  let withno_lines =<< trim END
12614c17ad94SBram Moolenaar    def FuncNo(): string
12624c17ad94SBram Moolenaar      return 'no'
12634c17ad94SBram Moolenaar    enddef
12644c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
12654c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
12664c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
126703afdcf1SBram Moolenaar    enddef
126803afdcf1SBram Moolenaar  END
126903afdcf1SBram Moolenaar  let nono_lines =<< trim END
127003afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
127103afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
12724c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
12734c17ad94SBram Moolenaar    enddef
12744c17ad94SBram Moolenaar  END
12754c17ad94SBram Moolenaar
12764c17ad94SBram Moolenaar  # FuncNo() is defined
127703afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12784c17ad94SBram Moolenaar  source Xreloaded.vim
12794c17ad94SBram Moolenaar  g:DoCheck(true)
12804c17ad94SBram Moolenaar
12814c17ad94SBram Moolenaar  # FuncNo() is not redefined
128203afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
12834c17ad94SBram Moolenaar  source Xreloaded.vim
128403afdcf1SBram Moolenaar  g:DoCheck()
12854c17ad94SBram Moolenaar
12864c17ad94SBram Moolenaar  # FuncNo() is back
128703afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12884c17ad94SBram Moolenaar  source Xreloaded.vim
128903afdcf1SBram Moolenaar  g:DoCheck()
12904c17ad94SBram Moolenaar
12914c17ad94SBram Moolenaar  delete('Xreloaded.vim')
12924c17ad94SBram Moolenaarenddef
12934c17ad94SBram Moolenaar
129489483d40SBram Moolenaardef Test_vim9script_reload_delvar()
129589483d40SBram Moolenaar  # write the script with a script-local variable
129689483d40SBram Moolenaar  let lines =<< trim END
129789483d40SBram Moolenaar    vim9script
129889483d40SBram Moolenaar    let var = 'string'
129989483d40SBram Moolenaar  END
130089483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
130189483d40SBram Moolenaar  source XreloadVar.vim
130289483d40SBram Moolenaar
130389483d40SBram Moolenaar  # now write the script using the same variable locally - works
130489483d40SBram Moolenaar  lines =<< trim END
130589483d40SBram Moolenaar    vim9script
130689483d40SBram Moolenaar    def Func()
130789483d40SBram Moolenaar      let var = 'string'
130889483d40SBram Moolenaar    enddef
130989483d40SBram Moolenaar  END
131089483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
131189483d40SBram Moolenaar  source XreloadVar.vim
131289483d40SBram Moolenaar
131389483d40SBram Moolenaar  delete('XreloadVar.vim')
131489483d40SBram Moolenaarenddef
131589483d40SBram Moolenaar
13168a7d6542SBram Moolenaardef Test_import_absolute()
13178a7d6542SBram Moolenaar  let import_lines = [
1318e6085c53SBram Moolenaar        'vim9script',
1319e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1320e6085c53SBram Moolenaar        'def UseExported()',
1321e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1322e6085c53SBram Moolenaar        '  exported = 8888',
1323e6085c53SBram Moolenaar        '  g:imported_after = exported',
1324e6085c53SBram Moolenaar        'enddef',
1325e6085c53SBram Moolenaar        'UseExported()',
1326e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1327e6085c53SBram Moolenaar        ]
13288a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
13298a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
13308a7d6542SBram Moolenaar
13318a7d6542SBram Moolenaar  source Ximport_abs.vim
13328a7d6542SBram Moolenaar
13338a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
13344e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1335675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1336675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1337675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1338675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1339675f716eSBram Moolenaar          'exported = 8888.*' ..
1340675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1341675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1342675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1343675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1344e6085c53SBram Moolenaar        g:import_disassembled)
13458a7d6542SBram Moolenaar  unlet g:imported_abs
13464e12a5dfSBram Moolenaar  unlet g:import_disassembled
13478a7d6542SBram Moolenaar
13488a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
13498a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
13508a7d6542SBram Moolenaarenddef
13518a7d6542SBram Moolenaar
13528a7d6542SBram Moolenaardef Test_import_rtp()
13538a7d6542SBram Moolenaar  let import_lines = [
1354e6085c53SBram Moolenaar        'vim9script',
1355e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1356e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1357e6085c53SBram Moolenaar        ]
13588a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
13598a7d6542SBram Moolenaar  mkdir('import')
13608a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
13618a7d6542SBram Moolenaar
13628a7d6542SBram Moolenaar  let save_rtp = &rtp
13638a7d6542SBram Moolenaar  &rtp = getcwd()
13648a7d6542SBram Moolenaar  source Ximport_rtp.vim
13658a7d6542SBram Moolenaar  &rtp = save_rtp
13668a7d6542SBram Moolenaar
13678a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
13688a7d6542SBram Moolenaar  unlet g:imported_rtp
13698a7d6542SBram Moolenaar
13708a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
137189483d40SBram Moolenaar  delete('import', 'rf')
13728a7d6542SBram Moolenaarenddef
13738a7d6542SBram Moolenaar
137425e0f586SBram Moolenaardef Test_import_compile_error()
137525e0f586SBram Moolenaar  let export_lines = [
137625e0f586SBram Moolenaar        'vim9script',
137725e0f586SBram Moolenaar        'export def ExpFunc(): string',
137825e0f586SBram Moolenaar        '  return notDefined',
137925e0f586SBram Moolenaar        'enddef',
138025e0f586SBram Moolenaar        ]
138125e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
138225e0f586SBram Moolenaar
138325e0f586SBram Moolenaar  let import_lines = [
138425e0f586SBram Moolenaar        'vim9script',
138525e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
138625e0f586SBram Moolenaar        'def ImpFunc()',
138725e0f586SBram Moolenaar        '  echo ExpFunc()',
138825e0f586SBram Moolenaar        'enddef',
138925e0f586SBram Moolenaar        'defcompile',
139025e0f586SBram Moolenaar        ]
139125e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
139225e0f586SBram Moolenaar
139325e0f586SBram Moolenaar  try
139425e0f586SBram Moolenaar    source Ximport.vim
139525e0f586SBram Moolenaar  catch /E1001/
1396f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
139725e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
139825e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
139925e0f586SBram Moolenaar  endtry
140025e0f586SBram Moolenaar
140125e0f586SBram Moolenaar  delete('Xexported.vim')
140225e0f586SBram Moolenaar  delete('Ximport.vim')
140325e0f586SBram Moolenaarenddef
140425e0f586SBram Moolenaar
14058a7d6542SBram Moolenaardef Test_fixed_size_list()
1406f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
14078a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
14088a7d6542SBram Moolenaar  l->remove(0)
14098a7d6542SBram Moolenaar  l->add(5)
14108a7d6542SBram Moolenaar  l->insert(99, 1)
14110f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
14128a7d6542SBram Moolenaarenddef
14138a7d6542SBram Moolenaar
1414158906cfSBram Moolenaardef IfElse(what: number): string
1415158906cfSBram Moolenaar  let res = ''
1416158906cfSBram Moolenaar  if what == 1
1417158906cfSBram Moolenaar    res = "one"
1418158906cfSBram Moolenaar  elseif what == 2
1419158906cfSBram Moolenaar    res = "two"
1420a259d8d3SBram Moolenaar  else
1421158906cfSBram Moolenaar    res = "three"
1422a259d8d3SBram Moolenaar  endif
1423158906cfSBram Moolenaar  return res
1424a259d8d3SBram Moolenaarenddef
1425a259d8d3SBram Moolenaar
1426158906cfSBram Moolenaardef Test_if_elseif_else()
1427158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1428158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1429158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
14300f18b6d1SBram Moolenaarenddef
14310f18b6d1SBram Moolenaar
1432e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1433e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1434e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1435e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1436e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1437585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1438e8c4abbbSBram Moolenaarenddef
1439e8c4abbbSBram Moolenaar
14406d69bf60SBram Moolenaarlet g:bool_true = v:true
14416d69bf60SBram Moolenaarlet g:bool_false = v:false
14426d69bf60SBram Moolenaar
14436d69bf60SBram Moolenaardef Test_if_const_expr()
14446d69bf60SBram Moolenaar  let res = false
14456d69bf60SBram Moolenaar  if true ? true : false
14466d69bf60SBram Moolenaar    res = true
14476d69bf60SBram Moolenaar  endif
14486d69bf60SBram Moolenaar  assert_equal(true, res)
14496d69bf60SBram Moolenaar
1450585fea7bSBram Moolenaar  g:glob = 2
1451585fea7bSBram Moolenaar  if false
14526797966dSBram Moolenaar    execute('g:glob = 3')
1453585fea7bSBram Moolenaar  endif
1454585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1455585fea7bSBram Moolenaar  if true
14566797966dSBram Moolenaar    execute('g:glob = 3')
1457585fea7bSBram Moolenaar  endif
1458585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1459585fea7bSBram Moolenaar
14606d69bf60SBram Moolenaar  res = false
14616d69bf60SBram Moolenaar  if g:bool_true ? true : false
14626d69bf60SBram Moolenaar    res = true
14636d69bf60SBram Moolenaar  endif
14646d69bf60SBram Moolenaar  assert_equal(true, res)
14656d69bf60SBram Moolenaar
14666d69bf60SBram Moolenaar  res = false
14676d69bf60SBram Moolenaar  if true ? g:bool_true : false
14686d69bf60SBram Moolenaar    res = true
14696d69bf60SBram Moolenaar  endif
14706d69bf60SBram Moolenaar  assert_equal(true, res)
14716d69bf60SBram Moolenaar
14726d69bf60SBram Moolenaar  res = false
14736d69bf60SBram Moolenaar  if true ? true : g:bool_false
14746d69bf60SBram Moolenaar    res = true
14756d69bf60SBram Moolenaar  endif
14766d69bf60SBram Moolenaar  assert_equal(true, res)
14776d69bf60SBram Moolenaar
14786d69bf60SBram Moolenaar  res = false
14796d69bf60SBram Moolenaar  if true ? false : true
14806d69bf60SBram Moolenaar    res = true
14816d69bf60SBram Moolenaar  endif
14826d69bf60SBram Moolenaar  assert_equal(false, res)
14836d69bf60SBram Moolenaar
14846d69bf60SBram Moolenaar  res = false
14856d69bf60SBram Moolenaar  if false ? false : true
14866d69bf60SBram Moolenaar    res = true
14876d69bf60SBram Moolenaar  endif
14886d69bf60SBram Moolenaar  assert_equal(true, res)
14896d69bf60SBram Moolenaar
14906d69bf60SBram Moolenaar  res = false
14916d69bf60SBram Moolenaar  if false ? true : false
14926d69bf60SBram Moolenaar    res = true
14936d69bf60SBram Moolenaar  endif
14946d69bf60SBram Moolenaar  assert_equal(false, res)
14956d69bf60SBram Moolenaar
14966d69bf60SBram Moolenaar  res = false
1497e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1498e8c4abbbSBram Moolenaar    res = true
1499e8c4abbbSBram Moolenaar  endif
1500e8c4abbbSBram Moolenaar  assert_equal(false, res)
1501e8c4abbbSBram Moolenaar
1502e8c4abbbSBram Moolenaar  res = false
15036d69bf60SBram Moolenaar  if true && true
15046d69bf60SBram Moolenaar    res = true
15056d69bf60SBram Moolenaar  endif
15066d69bf60SBram Moolenaar  assert_equal(true, res)
15076d69bf60SBram Moolenaar
15086d69bf60SBram Moolenaar  res = false
15096d69bf60SBram Moolenaar  if true && false
15106d69bf60SBram Moolenaar    res = true
15116d69bf60SBram Moolenaar  endif
15126d69bf60SBram Moolenaar  assert_equal(false, res)
15136d69bf60SBram Moolenaar
15146d69bf60SBram Moolenaar  res = false
15156d69bf60SBram Moolenaar  if g:bool_true && false
15166d69bf60SBram Moolenaar    res = true
15176d69bf60SBram Moolenaar  endif
15186d69bf60SBram Moolenaar  assert_equal(false, res)
15196d69bf60SBram Moolenaar
15206d69bf60SBram Moolenaar  res = false
15216d69bf60SBram Moolenaar  if true && g:bool_false
15226d69bf60SBram Moolenaar    res = true
15236d69bf60SBram Moolenaar  endif
15246d69bf60SBram Moolenaar  assert_equal(false, res)
15256d69bf60SBram Moolenaar
15266d69bf60SBram Moolenaar  res = false
15276d69bf60SBram Moolenaar  if false && false
15286d69bf60SBram Moolenaar    res = true
15296d69bf60SBram Moolenaar  endif
15306d69bf60SBram Moolenaar  assert_equal(false, res)
15316d69bf60SBram Moolenaar
15326d69bf60SBram Moolenaar  res = false
15336d69bf60SBram Moolenaar  if true || false
15346d69bf60SBram Moolenaar    res = true
15356d69bf60SBram Moolenaar  endif
15366d69bf60SBram Moolenaar  assert_equal(true, res)
15376d69bf60SBram Moolenaar
15386d69bf60SBram Moolenaar  res = false
15396d69bf60SBram Moolenaar  if g:bool_true || false
15406d69bf60SBram Moolenaar    res = true
15416d69bf60SBram Moolenaar  endif
15426d69bf60SBram Moolenaar  assert_equal(true, res)
15436d69bf60SBram Moolenaar
15446d69bf60SBram Moolenaar  res = false
15456d69bf60SBram Moolenaar  if true || g:bool_false
15466d69bf60SBram Moolenaar    res = true
15476d69bf60SBram Moolenaar  endif
15486d69bf60SBram Moolenaar  assert_equal(true, res)
15496d69bf60SBram Moolenaar
15506d69bf60SBram Moolenaar  res = false
15516d69bf60SBram Moolenaar  if false || false
15526d69bf60SBram Moolenaar    res = true
15536d69bf60SBram Moolenaar  endif
15546d69bf60SBram Moolenaar  assert_equal(false, res)
155580c34ca3SBram Moolenaarenddef
15566d69bf60SBram Moolenaar
155780c34ca3SBram Moolenaardef Test_if_const_expr_fails()
155880c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
155980c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1560e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1561e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
15626d69bf60SBram Moolenaarenddef
15636d69bf60SBram Moolenaar
156472abcf42SBram Moolenaardef RunNested(i: number): number
156572abcf42SBram Moolenaar  let x: number = 0
156672abcf42SBram Moolenaar  if i % 2
156772abcf42SBram Moolenaar    if 1
1568f5be8cdbSBram Moolenaar      # comment
156972abcf42SBram Moolenaar    else
1570f5be8cdbSBram Moolenaar      # comment
157172abcf42SBram Moolenaar    endif
157272abcf42SBram Moolenaar    x += 1
157372abcf42SBram Moolenaar  else
157472abcf42SBram Moolenaar    x += 1000
157572abcf42SBram Moolenaar  endif
157672abcf42SBram Moolenaar  return x
157772abcf42SBram Moolenaarenddef
157872abcf42SBram Moolenaar
157972abcf42SBram Moolenaardef Test_nested_if()
158072abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
158172abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
158272abcf42SBram Moolenaarenddef
158372abcf42SBram Moolenaar
1584ad39c094SBram Moolenaardef Test_execute_cmd()
1585ad39c094SBram Moolenaar  new
1586ad39c094SBram Moolenaar  setline(1, 'default')
1587ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1588ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1589a72cfb80SBram Moolenaar
1590a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1591a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1592a72cfb80SBram Moolenaar
1593ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1594ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1595a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1596ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1597a72cfb80SBram Moolenaar
1598ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1599ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1600a72cfb80SBram Moolenaar
1601ad39c094SBram Moolenaar  let cmd_first = 'call '
1602ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1603ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1604ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1605ad39c094SBram Moolenaar  bwipe!
1606585fea7bSBram Moolenaar
1607585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1608a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1609ad39c094SBram Moolenaarenddef
1610ad39c094SBram Moolenaar
161147e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1612f5be8cdbSBram Moolenaar  # only checks line continuation
161347e880d6SBram Moolenaar  let lines =<< trim END
161447e880d6SBram Moolenaar      vim9script
161547e880d6SBram Moolenaar      execute 'g:someVar'
161647e880d6SBram Moolenaar                .. ' = ' ..
161747e880d6SBram Moolenaar                   '28'
161847e880d6SBram Moolenaar      assert_equal(28, g:someVar)
161947e880d6SBram Moolenaar      unlet g:someVar
162047e880d6SBram Moolenaar  END
162147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
162247e880d6SBram Moolenaarenddef
162347e880d6SBram Moolenaar
1624ad39c094SBram Moolenaardef Test_echo_cmd()
1625a72cfb80SBram Moolenaar  echo 'some' # comment
1626585fea7bSBram Moolenaar  echon 'thing'
1627ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1628ad39c094SBram Moolenaar
1629a72cfb80SBram Moolenaar  echo "some" # comment
1630a72cfb80SBram Moolenaar  echon "thing"
1631a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1632a72cfb80SBram Moolenaar
1633ad39c094SBram Moolenaar  let str1 = 'some'
1634ad39c094SBram Moolenaar  let str2 = 'more'
1635ad39c094SBram Moolenaar  echo str1 str2
1636ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1637a72cfb80SBram Moolenaar
1638a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1639ad39c094SBram Moolenaarenddef
1640ad39c094SBram Moolenaar
1641f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1642f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1643f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1644f93c7feaSBram Moolenaar  echo 'clear'
1645df069eecSBram Moolenaar  :1messages
1646f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1647f93c7feaSBram Moolenaar
1648f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1649f93c7feaSBram Moolenaarenddef
1650f93c7feaSBram Moolenaar
165147e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1652f5be8cdbSBram Moolenaar  # only checks line continuation
165347e880d6SBram Moolenaar  let lines =<< trim END
165447e880d6SBram Moolenaar      vim9script
165547e880d6SBram Moolenaar      echomsg 'here'
165647e880d6SBram Moolenaar                .. ' is ' ..
165747e880d6SBram Moolenaar                   'a message'
165847e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
165947e880d6SBram Moolenaar  END
166047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
166147e880d6SBram Moolenaarenddef
166247e880d6SBram Moolenaar
1663f93c7feaSBram Moolenaardef Test_echoerr_cmd()
166440ee466cSBram Moolenaar  try
166540ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
166640ee466cSBram Moolenaar  catch
166740ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
166840ee466cSBram Moolenaar  endtry
1669f93c7feaSBram Moolenaarenddef
1670f93c7feaSBram Moolenaar
167147e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1672f5be8cdbSBram Moolenaar  # only checks line continuation
167347e880d6SBram Moolenaar  let lines =<< trim END
167447e880d6SBram Moolenaar      vim9script
167547e880d6SBram Moolenaar      try
167647e880d6SBram Moolenaar        echoerr 'this'
167747e880d6SBram Moolenaar                .. ' is ' ..
167847e880d6SBram Moolenaar                   'wrong'
167947e880d6SBram Moolenaar      catch
168047e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
168147e880d6SBram Moolenaar      endtry
168247e880d6SBram Moolenaar  END
168347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
168447e880d6SBram Moolenaarenddef
168547e880d6SBram Moolenaar
168641fe0617SBram Moolenaardef Test_for_outside_of_function()
168741fe0617SBram Moolenaar  let lines =<< trim END
168841fe0617SBram Moolenaar    vim9script
168941fe0617SBram Moolenaar    new
169041fe0617SBram Moolenaar    for var in range(0, 3)
169141fe0617SBram Moolenaar      append(line('$'), var)
169241fe0617SBram Moolenaar    endfor
169341fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
169441fe0617SBram Moolenaar    bwipe!
169541fe0617SBram Moolenaar  END
169641fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
169741fe0617SBram Moolenaar  source Xvim9for.vim
169841fe0617SBram Moolenaar  delete('Xvim9for.vim')
169941fe0617SBram Moolenaarenddef
17008a7d6542SBram Moolenaar
1701e8c4abbbSBram Moolenaardef Test_for_loop()
1702e8c4abbbSBram Moolenaar  let result = ''
1703e8c4abbbSBram Moolenaar  for cnt in range(7)
1704e8c4abbbSBram Moolenaar    if cnt == 4
1705e8c4abbbSBram Moolenaar      break
1706e8c4abbbSBram Moolenaar    endif
1707e8c4abbbSBram Moolenaar    if cnt == 2
1708e8c4abbbSBram Moolenaar      continue
1709e8c4abbbSBram Moolenaar    endif
1710e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1711e8c4abbbSBram Moolenaar  endfor
1712e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
17130ad3e894SBram Moolenaar
17140ad3e894SBram Moolenaar  let concat = ''
17150ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
17160ad3e894SBram Moolenaar    concat ..= str
17170ad3e894SBram Moolenaar  endfor
17180ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1719e8c4abbbSBram Moolenaarenddef
1720e8c4abbbSBram Moolenaar
1721e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1722675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1723675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1724675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1725822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
17260ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
1727675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1728675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1729675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1730e8c4abbbSBram Moolenaarenddef
1731e8c4abbbSBram Moolenaar
1732d0df1aacSBram Moolenaardef Test_while_loop()
1733d0df1aacSBram Moolenaar  let result = ''
1734d0df1aacSBram Moolenaar  let cnt = 0
1735d0df1aacSBram Moolenaar  while cnt < 555
1736d0df1aacSBram Moolenaar    if cnt == 3
1737d0df1aacSBram Moolenaar      break
1738d0df1aacSBram Moolenaar    endif
1739d0df1aacSBram Moolenaar    cnt += 1
1740d0df1aacSBram Moolenaar    if cnt == 2
1741d0df1aacSBram Moolenaar      continue
1742d0df1aacSBram Moolenaar    endif
1743d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1744d0df1aacSBram Moolenaar  endwhile
1745d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1746d0df1aacSBram Moolenaarenddef
1747d0df1aacSBram Moolenaar
1748e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1749675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1750675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1751675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1752675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1753675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1754675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1755675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1756bd5da371SBram Moolenaarenddef
1757bd5da371SBram Moolenaar
17589645e2d9SBram Moolenaardef Test_interrupt_loop()
175997acfc78SBram Moolenaar  let caught = false
17609645e2d9SBram Moolenaar  let x = 0
176197acfc78SBram Moolenaar  try
17629645e2d9SBram Moolenaar    while 1
17639645e2d9SBram Moolenaar      x += 1
17649645e2d9SBram Moolenaar      if x == 100
17659645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
17669645e2d9SBram Moolenaar      endif
17679645e2d9SBram Moolenaar    endwhile
176897acfc78SBram Moolenaar  catch
176997acfc78SBram Moolenaar    caught = true
177097acfc78SBram Moolenaar    assert_equal(100, x)
177197acfc78SBram Moolenaar  endtry
177297acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
17739645e2d9SBram Moolenaarenddef
177420431c9dSBram Moolenaar
17754fdae999SBram Moolenaardef Test_automatic_line_continuation()
17764fdae999SBram Moolenaar  let mylist = [
17774fdae999SBram Moolenaar      'one',
17784fdae999SBram Moolenaar      'two',
17794fdae999SBram Moolenaar      'three',
1780f5be8cdbSBram Moolenaar      ] # comment
17814fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
17824fdae999SBram Moolenaar
17834fdae999SBram Moolenaar  let mydict = {
17844fdae999SBram Moolenaar      'one': 1,
17854fdae999SBram Moolenaar      'two': 2,
17864fdae999SBram Moolenaar      'three':
17874fdae999SBram Moolenaar          3,
1788f5be8cdbSBram Moolenaar      } # comment
17894fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
17904fdae999SBram Moolenaar  mydict = #{
17912c330432SBram Moolenaar      one: 1,  # comment
17922c330432SBram Moolenaar      two:     # comment
17932c330432SBram Moolenaar           2,  # comment
17942c330432SBram Moolenaar      three: 3 # comment
17952c330432SBram Moolenaar      }
17962c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
17972c330432SBram Moolenaar  mydict = #{
17982c330432SBram Moolenaar      one: 1,
17994fdae999SBram Moolenaar      two:
18004fdae999SBram Moolenaar           2,
18012c330432SBram Moolenaar      three: 3
18024fdae999SBram Moolenaar      }
18034fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1804e6085c53SBram Moolenaar
1805e6085c53SBram Moolenaar  assert_equal(
1806e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1807e6085c53SBram Moolenaar        split('one two three')
1808e6085c53SBram Moolenaar        )
18094fdae999SBram Moolenaarenddef
18104fdae999SBram Moolenaar
18117a092245SBram Moolenaardef Test_vim9_comment()
18127a092245SBram Moolenaar  CheckScriptSuccess([
18137a092245SBram Moolenaar      'vim9script',
18147a092245SBram Moolenaar      '# something',
18157a092245SBram Moolenaar      ])
18167a092245SBram Moolenaar  CheckScriptFailure([
18177a092245SBram Moolenaar      'vim9script',
18187a092245SBram Moolenaar      ':# something',
18197a092245SBram Moolenaar      ], 'E488:')
18207a092245SBram Moolenaar  CheckScriptFailure([
18217a092245SBram Moolenaar      '# something',
18227a092245SBram Moolenaar      ], 'E488:')
18237a092245SBram Moolenaar  CheckScriptFailure([
18247a092245SBram Moolenaar      ':# something',
18257a092245SBram Moolenaar      ], 'E488:')
18267a092245SBram Moolenaar
18274a8d9f2eSBram Moolenaar  { # block start
18284a8d9f2eSBram Moolenaar  } # block end
18294a8d9f2eSBram Moolenaar  CheckDefFailure([
18304a8d9f2eSBram Moolenaar      '{# comment',
18314a8d9f2eSBram Moolenaar      ], 'E488:')
18324a8d9f2eSBram Moolenaar  CheckDefFailure([
18334a8d9f2eSBram Moolenaar      '{',
18344a8d9f2eSBram Moolenaar      '}# comment',
18354a8d9f2eSBram Moolenaar      ], 'E488:')
18364a8d9f2eSBram Moolenaar
18374a8d9f2eSBram Moolenaar  echo "yes" # comment
18384a8d9f2eSBram Moolenaar  CheckDefFailure([
18394a8d9f2eSBram Moolenaar      'echo "yes"# comment',
18404a8d9f2eSBram Moolenaar      ], 'E488:')
18417a092245SBram Moolenaar  CheckScriptSuccess([
18427a092245SBram Moolenaar      'vim9script',
18437a092245SBram Moolenaar      'echo "yes" # something',
18447a092245SBram Moolenaar      ])
18457a092245SBram Moolenaar  CheckScriptFailure([
18467a092245SBram Moolenaar      'vim9script',
18477a092245SBram Moolenaar      'echo "yes"# something',
18487a092245SBram Moolenaar      ], 'E121:')
18497a092245SBram Moolenaar  CheckScriptFailure([
18507a092245SBram Moolenaar      'vim9script',
18517a092245SBram Moolenaar      'echo# something',
18527a092245SBram Moolenaar      ], 'E121:')
18537a092245SBram Moolenaar  CheckScriptFailure([
18547a092245SBram Moolenaar      'echo "yes" # something',
18557a092245SBram Moolenaar      ], 'E121:')
18567a092245SBram Moolenaar
18574a8d9f2eSBram Moolenaar  exe "echo" # comment
18584a8d9f2eSBram Moolenaar  CheckDefFailure([
18594a8d9f2eSBram Moolenaar      'exe "echo"# comment',
18604a8d9f2eSBram Moolenaar      ], 'E488:')
18614a8d9f2eSBram Moolenaar  CheckScriptSuccess([
18624a8d9f2eSBram Moolenaar      'vim9script',
18634a8d9f2eSBram Moolenaar      'exe "echo" # something',
18644a8d9f2eSBram Moolenaar      ])
18654a8d9f2eSBram Moolenaar  CheckScriptFailure([
18664a8d9f2eSBram Moolenaar      'vim9script',
18674a8d9f2eSBram Moolenaar      'exe "echo"# something',
18684a8d9f2eSBram Moolenaar      ], 'E121:')
18694a8d9f2eSBram Moolenaar  CheckDefFailure([
18704a8d9f2eSBram Moolenaar      'exe # comment',
18714a8d9f2eSBram Moolenaar      ], 'E1015:')
18724a8d9f2eSBram Moolenaar  CheckScriptFailure([
18734a8d9f2eSBram Moolenaar      'vim9script',
18744a8d9f2eSBram Moolenaar      'exe# something',
18754a8d9f2eSBram Moolenaar      ], 'E121:')
18764a8d9f2eSBram Moolenaar  CheckScriptFailure([
18774a8d9f2eSBram Moolenaar      'exe "echo" # something',
18784a8d9f2eSBram Moolenaar      ], 'E121:')
18794a8d9f2eSBram Moolenaar
18807a092245SBram Moolenaar  CheckDefFailure([
18817a092245SBram Moolenaar      'try# comment',
18827a092245SBram Moolenaar      '  echo "yes"',
18837a092245SBram Moolenaar      'catch',
18847a092245SBram Moolenaar      'endtry',
18857a092245SBram Moolenaar      ], 'E488:')
18862c5ed4e3SBram Moolenaar  CheckScriptFailure([
18872c5ed4e3SBram Moolenaar      'vim9script',
18882c5ed4e3SBram Moolenaar      'try# comment',
18892c5ed4e3SBram Moolenaar      'echo "yes"',
18902c5ed4e3SBram Moolenaar      ], 'E488:')
18917a092245SBram Moolenaar  CheckDefFailure([
18927a092245SBram Moolenaar      'try',
1893a72cfb80SBram Moolenaar      '  throw#comment',
1894a72cfb80SBram Moolenaar      'catch',
1895a72cfb80SBram Moolenaar      'endtry',
1896a72cfb80SBram Moolenaar      ], 'E1015:')
1897a72cfb80SBram Moolenaar  CheckDefFailure([
1898a72cfb80SBram Moolenaar      'try',
1899a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1900a72cfb80SBram Moolenaar      'catch',
1901a72cfb80SBram Moolenaar      'endtry',
1902a72cfb80SBram Moolenaar      ], 'E488:')
1903a72cfb80SBram Moolenaar  CheckDefFailure([
1904a72cfb80SBram Moolenaar      'try',
19057a092245SBram Moolenaar      '  echo "yes"',
19067a092245SBram Moolenaar      'catch# comment',
19077a092245SBram Moolenaar      'endtry',
19087a092245SBram Moolenaar      ], 'E488:')
19092c5ed4e3SBram Moolenaar  CheckScriptFailure([
19102c5ed4e3SBram Moolenaar      'vim9script',
19112c5ed4e3SBram Moolenaar      'try',
19122c5ed4e3SBram Moolenaar      '  echo "yes"',
19132c5ed4e3SBram Moolenaar      'catch# comment',
19142c5ed4e3SBram Moolenaar      'endtry',
19152c5ed4e3SBram Moolenaar      ], 'E654:')
19162c5ed4e3SBram Moolenaar  CheckDefFailure([
19172c5ed4e3SBram Moolenaar      'try',
19182c5ed4e3SBram Moolenaar      '  echo "yes"',
19192c5ed4e3SBram Moolenaar      'catch /pat/# comment',
19202c5ed4e3SBram Moolenaar      'endtry',
19212c5ed4e3SBram Moolenaar      ], 'E488:')
19227a092245SBram Moolenaar  CheckDefFailure([
19237a092245SBram Moolenaar      'try',
19247a092245SBram Moolenaar      'echo "yes"',
19257a092245SBram Moolenaar      'catch',
19267a092245SBram Moolenaar      'endtry# comment',
19277a092245SBram Moolenaar      ], 'E488:')
19282c5ed4e3SBram Moolenaar  CheckScriptFailure([
19292c5ed4e3SBram Moolenaar      'vim9script',
19302c5ed4e3SBram Moolenaar      'try',
19312c5ed4e3SBram Moolenaar      '  echo "yes"',
19322c5ed4e3SBram Moolenaar      'catch',
19332c5ed4e3SBram Moolenaar      'endtry# comment',
19349b7bf9e9SBram Moolenaar      ], 'E488:')
19352c5ed4e3SBram Moolenaar
19362c5ed4e3SBram Moolenaar  CheckScriptSuccess([
19372c5ed4e3SBram Moolenaar      'vim9script',
19382c5ed4e3SBram Moolenaar      'hi # comment',
19392c5ed4e3SBram Moolenaar      ])
19402c5ed4e3SBram Moolenaar  CheckScriptFailure([
19412c5ed4e3SBram Moolenaar      'vim9script',
19422c5ed4e3SBram Moolenaar      'hi# comment',
19432c5ed4e3SBram Moolenaar      ], 'E416:')
19441966c248SBram Moolenaar  CheckScriptSuccess([
19451966c248SBram Moolenaar      'vim9script',
19461966c248SBram Moolenaar      'hi Search # comment',
19471966c248SBram Moolenaar      ])
19481966c248SBram Moolenaar  CheckScriptFailure([
19491966c248SBram Moolenaar      'vim9script',
19501966c248SBram Moolenaar      'hi Search# comment',
19511966c248SBram Moolenaar      ], 'E416:')
19521966c248SBram Moolenaar  CheckScriptSuccess([
19531966c248SBram Moolenaar      'vim9script',
19541966c248SBram Moolenaar      'hi link This Search # comment',
19551966c248SBram Moolenaar      ])
19561966c248SBram Moolenaar  CheckScriptFailure([
19571966c248SBram Moolenaar      'vim9script',
19581966c248SBram Moolenaar      'hi link This That# comment',
19591966c248SBram Moolenaar      ], 'E413:')
19601966c248SBram Moolenaar  CheckScriptSuccess([
19611966c248SBram Moolenaar      'vim9script',
19621966c248SBram Moolenaar      'hi clear This # comment',
19631966c248SBram Moolenaar      'hi clear # comment',
19641966c248SBram Moolenaar      ])
1965f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
1966f5be8cdbSBram Moolenaar  # hi clear This# comment',
19671966c248SBram Moolenaar  CheckScriptFailure([
19681966c248SBram Moolenaar      'vim9script',
19691966c248SBram Moolenaar      'hi clear# comment',
19701966c248SBram Moolenaar      ], 'E416:')
19711966c248SBram Moolenaar
19721966c248SBram Moolenaar  CheckScriptSuccess([
19731966c248SBram Moolenaar      'vim9script',
19741966c248SBram Moolenaar      'hi Group term=bold',
19751966c248SBram Moolenaar      'match Group /todo/ # comment',
19761966c248SBram Moolenaar      ])
19771966c248SBram Moolenaar  CheckScriptFailure([
19781966c248SBram Moolenaar      'vim9script',
19791966c248SBram Moolenaar      'hi Group term=bold',
19801966c248SBram Moolenaar      'match Group /todo/# comment',
19811966c248SBram Moolenaar      ], 'E488:')
19821966c248SBram Moolenaar  CheckScriptSuccess([
19831966c248SBram Moolenaar      'vim9script',
19841966c248SBram Moolenaar      'match # comment',
19851966c248SBram Moolenaar      ])
19861966c248SBram Moolenaar  CheckScriptFailure([
19871966c248SBram Moolenaar      'vim9script',
19881966c248SBram Moolenaar      'match# comment',
19891966c248SBram Moolenaar      ], 'E475:')
19901966c248SBram Moolenaar  CheckScriptSuccess([
19911966c248SBram Moolenaar      'vim9script',
19921966c248SBram Moolenaar      'match none # comment',
19931966c248SBram Moolenaar      ])
19941966c248SBram Moolenaar  CheckScriptFailure([
19951966c248SBram Moolenaar      'vim9script',
19961966c248SBram Moolenaar      'match none# comment',
19971966c248SBram Moolenaar      ], 'E475:')
19981966c248SBram Moolenaar
19991966c248SBram Moolenaar  CheckScriptSuccess([
20001966c248SBram Moolenaar      'vim9script',
20011966c248SBram Moolenaar      'menutrans clear # comment',
20021966c248SBram Moolenaar      ])
20031966c248SBram Moolenaar  CheckScriptFailure([
20041966c248SBram Moolenaar      'vim9script',
20051966c248SBram Moolenaar      'menutrans clear# comment text',
20061966c248SBram Moolenaar      ], 'E474:')
20071966c248SBram Moolenaar
20081966c248SBram Moolenaar  CheckScriptSuccess([
20091966c248SBram Moolenaar      'vim9script',
20101966c248SBram Moolenaar      'syntax clear # comment',
20111966c248SBram Moolenaar      ])
20121966c248SBram Moolenaar  CheckScriptFailure([
20131966c248SBram Moolenaar      'vim9script',
20141966c248SBram Moolenaar      'syntax clear# comment text',
20151966c248SBram Moolenaar      ], 'E28:')
20161966c248SBram Moolenaar  CheckScriptSuccess([
20171966c248SBram Moolenaar      'vim9script',
20181966c248SBram Moolenaar      'syntax keyword Word some',
20191966c248SBram Moolenaar      'syntax clear Word # comment',
20201966c248SBram Moolenaar      ])
20211966c248SBram Moolenaar  CheckScriptFailure([
20221966c248SBram Moolenaar      'vim9script',
20231966c248SBram Moolenaar      'syntax keyword Word some',
20241966c248SBram Moolenaar      'syntax clear Word# comment text',
20251966c248SBram Moolenaar      ], 'E28:')
20261966c248SBram Moolenaar
20271966c248SBram Moolenaar  CheckScriptSuccess([
20281966c248SBram Moolenaar      'vim9script',
20291966c248SBram Moolenaar      'syntax list # comment',
20301966c248SBram Moolenaar      ])
20311966c248SBram Moolenaar  CheckScriptFailure([
20321966c248SBram Moolenaar      'vim9script',
20331966c248SBram Moolenaar      'syntax list# comment text',
20341966c248SBram Moolenaar      ], 'E28:')
20351966c248SBram Moolenaar
20361966c248SBram Moolenaar  CheckScriptSuccess([
20371966c248SBram Moolenaar      'vim9script',
20381966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
20391966c248SBram Moolenaar      ])
20401966c248SBram Moolenaar  CheckScriptFailure([
20411966c248SBram Moolenaar      'vim9script',
20421966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
20431966c248SBram Moolenaar      ], 'E475:')
20441966c248SBram Moolenaar
20451966c248SBram Moolenaar  CheckScriptSuccess([
20461966c248SBram Moolenaar      'vim9script',
20471966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
20481966c248SBram Moolenaar      ])
20491966c248SBram Moolenaar  CheckScriptFailure([
20501966c248SBram Moolenaar      'vim9script',
20511966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
20521966c248SBram Moolenaar      ], 'E789:')
20531966c248SBram Moolenaar
20541966c248SBram Moolenaar  CheckScriptSuccess([
20551966c248SBram Moolenaar      'vim9script',
20561966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
20571966c248SBram Moolenaar      ])
20581966c248SBram Moolenaar  CheckScriptFailure([
20591966c248SBram Moolenaar      'vim9script',
20601966c248SBram Moolenaar      'syntax match Word /pat/# comment',
20611966c248SBram Moolenaar      ], 'E402:')
20621966c248SBram Moolenaar
20631966c248SBram Moolenaar  CheckScriptSuccess([
20641966c248SBram Moolenaar      'vim9script',
20651966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
20661966c248SBram Moolenaar      ])
20671966c248SBram Moolenaar  CheckScriptFailure([
20681966c248SBram Moolenaar      'vim9script',
20691966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
20701966c248SBram Moolenaar      ], 'E475:')
20711966c248SBram Moolenaar  CheckScriptFailure([
20721966c248SBram Moolenaar      'vim9script',
20731966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
20741966c248SBram Moolenaar      ], 'E406:')
20751966c248SBram Moolenaar  CheckScriptFailure([
20761966c248SBram Moolenaar      'vim9script',
20771966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
20781966c248SBram Moolenaar      ], 'E475:')
20791966c248SBram Moolenaar
20801966c248SBram Moolenaar  CheckScriptSuccess([
20811966c248SBram Moolenaar      'vim9script',
20821966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
20831966c248SBram Moolenaar      ])
20841966c248SBram Moolenaar  CheckScriptFailure([
20851966c248SBram Moolenaar      'vim9script',
20861966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2087*d032f34aSBram Moolenaar      ], 'E402:')
20881966c248SBram Moolenaar
20891966c248SBram Moolenaar  CheckScriptSuccess([
20901966c248SBram Moolenaar      'vim9script',
20911966c248SBram Moolenaar      'syntax sync # comment',
20921966c248SBram Moolenaar      ])
20931966c248SBram Moolenaar  CheckScriptFailure([
20941966c248SBram Moolenaar      'vim9script',
20951966c248SBram Moolenaar      'syntax sync# comment',
20961966c248SBram Moolenaar      ], 'E404:')
20971966c248SBram Moolenaar  CheckScriptSuccess([
20981966c248SBram Moolenaar      'vim9script',
20991966c248SBram Moolenaar      'syntax sync ccomment # comment',
21001966c248SBram Moolenaar      ])
21011966c248SBram Moolenaar  CheckScriptFailure([
21021966c248SBram Moolenaar      'vim9script',
21031966c248SBram Moolenaar      'syntax sync ccomment# comment',
21041966c248SBram Moolenaar      ], 'E404:')
21051966c248SBram Moolenaar
21061966c248SBram Moolenaar  CheckScriptSuccess([
21071966c248SBram Moolenaar      'vim9script',
21081966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
21091966c248SBram Moolenaar      ])
21101966c248SBram Moolenaar  CheckScriptFailure([
21111966c248SBram Moolenaar      'vim9script',
21121966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
21131966c248SBram Moolenaar      ], 'E475:')
2114a72cfb80SBram Moolenaar
2115a72cfb80SBram Moolenaar  CheckScriptSuccess([
2116a72cfb80SBram Moolenaar      'vim9script',
2117a72cfb80SBram Moolenaar      'command Echo echo # comment',
2118a72cfb80SBram Moolenaar      'command Echo # comment',
2119a72cfb80SBram Moolenaar      ])
2120a72cfb80SBram Moolenaar  CheckScriptFailure([
2121a72cfb80SBram Moolenaar      'vim9script',
2122a72cfb80SBram Moolenaar      'command Echo echo# comment',
2123a72cfb80SBram Moolenaar      'Echo',
2124a72cfb80SBram Moolenaar      ], 'E121:')
2125a72cfb80SBram Moolenaar  CheckScriptFailure([
2126a72cfb80SBram Moolenaar      'vim9script',
2127a72cfb80SBram Moolenaar      'command Echo# comment',
2128a72cfb80SBram Moolenaar      ], 'E182:')
2129a72cfb80SBram Moolenaar  CheckScriptFailure([
2130a72cfb80SBram Moolenaar      'vim9script',
2131a72cfb80SBram Moolenaar      'command Echo echo',
2132a72cfb80SBram Moolenaar      'command Echo# comment',
2133a72cfb80SBram Moolenaar      ], 'E182:')
2134a72cfb80SBram Moolenaar
2135a72cfb80SBram Moolenaar  CheckScriptSuccess([
2136a72cfb80SBram Moolenaar      'vim9script',
2137a72cfb80SBram Moolenaar      'function # comment',
2138a72cfb80SBram Moolenaar      ])
2139a72cfb80SBram Moolenaar  CheckScriptFailure([
2140a72cfb80SBram Moolenaar      'vim9script',
2141a72cfb80SBram Moolenaar      'function# comment',
2142a72cfb80SBram Moolenaar      ], 'E129:')
2143a72cfb80SBram Moolenaar  CheckScriptSuccess([
2144a72cfb80SBram Moolenaar      'vim9script',
2145a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2146a72cfb80SBram Moolenaar      ])
2147a72cfb80SBram Moolenaar  CheckScriptFailure([
2148a72cfb80SBram Moolenaar      'vim9script',
2149a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2150a72cfb80SBram Moolenaar      ], 'E488:')
2151a72cfb80SBram Moolenaar
2152a72cfb80SBram Moolenaar  CheckScriptSuccess([
2153a72cfb80SBram Moolenaar      'vim9script',
21544c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2155a72cfb80SBram Moolenaar      'endfunc',
21564c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2157a72cfb80SBram Moolenaar      ])
2158a72cfb80SBram Moolenaar  CheckScriptFailure([
2159a72cfb80SBram Moolenaar      'vim9script',
21604c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2161a72cfb80SBram Moolenaar      'endfunc',
21624c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2163a72cfb80SBram Moolenaar      ], 'E488:')
2164a72cfb80SBram Moolenaar
2165a72cfb80SBram Moolenaar  CheckScriptSuccess([
2166a72cfb80SBram Moolenaar      'vim9script',
2167a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2168a72cfb80SBram Moolenaar      ])
2169a72cfb80SBram Moolenaar  CheckScriptFailure([
2170a72cfb80SBram Moolenaar      'vim9script',
2171a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2172a72cfb80SBram Moolenaar      ], 'E488:')
21732c5ed4e3SBram Moolenaarenddef
21742c5ed4e3SBram Moolenaar
21752c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
21762c5ed4e3SBram Moolenaar  CheckCanRunGui
21772c5ed4e3SBram Moolenaar
21782c5ed4e3SBram Moolenaar  CheckScriptFailure([
21792c5ed4e3SBram Moolenaar      'vim9script',
21802c5ed4e3SBram Moolenaar      'gui#comment'
21812c5ed4e3SBram Moolenaar      ], 'E499:')
21822c5ed4e3SBram Moolenaar  CheckScriptFailure([
21832c5ed4e3SBram Moolenaar      'vim9script',
21842c5ed4e3SBram Moolenaar      'gui -f#comment'
21852c5ed4e3SBram Moolenaar      ], 'E499:')
21867a092245SBram Moolenaarenddef
21877a092245SBram Moolenaar
2188a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
21896797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
21906797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2191a26b9700SBram Moolenaar
2192a26b9700SBram Moolenaar  edit test.vim
2193a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2194a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2195a26b9700SBram Moolenaar
2196a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2197a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2198a26b9700SBram Moolenaar
2199a26b9700SBram Moolenaar  g:entered = 0
2200a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2201a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2202a26b9700SBram Moolenaar
2203a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2204a26b9700SBram Moolenaar
2205a26b9700SBram Moolenaar  au! TabEnter
2206a26b9700SBram Moolenaar  unlet g:entered
2207d72c1bf0SBram Moolenaar
2208d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2209d72c1bf0SBram Moolenaar      'vim9script',
22106797966dSBram Moolenaar      'g:var = 123',
2211e55b1c09SBram Moolenaar      'b:var = 456',
2212e55b1c09SBram Moolenaar      'w:var = 777',
2213e55b1c09SBram Moolenaar      't:var = 888',
2214d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2215d72c1bf0SBram Moolenaar      ])
2216d72c1bf0SBram Moolenaar
2217d72c1bf0SBram Moolenaar  CheckScriptFailure([
2218d72c1bf0SBram Moolenaar      'vim9script',
2219d72c1bf0SBram Moolenaar      'let g:var = 123',
2220e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2221e55b1c09SBram Moolenaar
2222e55b1c09SBram Moolenaar  CheckScriptFailure([
2223e55b1c09SBram Moolenaar      'vim9script',
2224e55b1c09SBram Moolenaar      'let b:var = 123',
2225e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2226e55b1c09SBram Moolenaar
2227e55b1c09SBram Moolenaar  CheckScriptFailure([
2228e55b1c09SBram Moolenaar      'vim9script',
2229e55b1c09SBram Moolenaar      'let w:var = 123',
2230e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2231e55b1c09SBram Moolenaar
2232e55b1c09SBram Moolenaar  CheckScriptFailure([
2233e55b1c09SBram Moolenaar      'vim9script',
2234e55b1c09SBram Moolenaar      'let t:var = 123',
2235e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2236e55b1c09SBram Moolenaar
2237e55b1c09SBram Moolenaar  CheckScriptFailure([
2238e55b1c09SBram Moolenaar      'vim9script',
2239e55b1c09SBram Moolenaar      'let v:version = 123',
2240e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2241e55b1c09SBram Moolenaar
2242e55b1c09SBram Moolenaar  CheckScriptFailure([
2243e55b1c09SBram Moolenaar      'vim9script',
2244e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2245e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
22466797966dSBram Moolenaar
22476797966dSBram Moolenaar  CheckScriptFailure([
22486797966dSBram Moolenaar      'vim9script',
22496797966dSBram Moolenaar      'g:var = 123',
225032e35117SBram Moolenaar      'unlet g:var# comment1',
2251d72c1bf0SBram Moolenaar      ], 'E108:')
2252d72c1bf0SBram Moolenaar
2253d72c1bf0SBram Moolenaar  CheckScriptFailure([
2254d72c1bf0SBram Moolenaar      'let g:var = 123',
2255d72c1bf0SBram Moolenaar      'unlet g:var # something',
2256d72c1bf0SBram Moolenaar      ], 'E488:')
2257faac4104SBram Moolenaar
2258faac4104SBram Moolenaar  CheckScriptSuccess([
2259faac4104SBram Moolenaar      'vim9script',
226032e35117SBram Moolenaar      'if 1 # comment2',
2261faac4104SBram Moolenaar      '  echo "yes"',
2262faac4104SBram Moolenaar      'elseif 2 #comment',
2263faac4104SBram Moolenaar      '  echo "no"',
2264faac4104SBram Moolenaar      'endif',
2265faac4104SBram Moolenaar      ])
2266faac4104SBram Moolenaar
2267faac4104SBram Moolenaar  CheckScriptFailure([
2268faac4104SBram Moolenaar      'vim9script',
226932e35117SBram Moolenaar      'if 1# comment3',
2270faac4104SBram Moolenaar      '  echo "yes"',
2271faac4104SBram Moolenaar      'endif',
2272faac4104SBram Moolenaar      ], 'E15:')
2273faac4104SBram Moolenaar
2274faac4104SBram Moolenaar  CheckScriptFailure([
2275faac4104SBram Moolenaar      'vim9script',
227632e35117SBram Moolenaar      'if 0 # comment4',
2277faac4104SBram Moolenaar      '  echo "yes"',
2278faac4104SBram Moolenaar      'elseif 2#comment',
2279faac4104SBram Moolenaar      '  echo "no"',
2280faac4104SBram Moolenaar      'endif',
2281faac4104SBram Moolenaar      ], 'E15:')
2282faac4104SBram Moolenaar
2283faac4104SBram Moolenaar  CheckScriptSuccess([
2284faac4104SBram Moolenaar      'vim9script',
228532e35117SBram Moolenaar      'let v = 1 # comment5',
2286faac4104SBram Moolenaar      ])
2287faac4104SBram Moolenaar
2288faac4104SBram Moolenaar  CheckScriptFailure([
2289faac4104SBram Moolenaar      'vim9script',
229032e35117SBram Moolenaar      'let v = 1# comment6',
229132e35117SBram Moolenaar      ], 'E15:')
2292faac4104SBram Moolenaar
2293faac4104SBram Moolenaar  CheckScriptSuccess([
2294faac4104SBram Moolenaar      'vim9script',
2295faac4104SBram Moolenaar      'new'
2296faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2297df069eecSBram Moolenaar      ':$',
2298faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2299faac4104SBram Moolenaar      'bwipe!',
2300faac4104SBram Moolenaar      ])
2301faac4104SBram Moolenaar
2302f5be8cdbSBram Moolenaar  CheckScriptFailure([
2303f5be8cdbSBram Moolenaar      'vim9script',
2304f5be8cdbSBram Moolenaar      'new'
2305f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2306f5be8cdbSBram Moolenaar      ':$',
2307f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2308f5be8cdbSBram Moolenaar      'bwipe!',
2309f5be8cdbSBram Moolenaar      ], 'E488:')
2310f5be8cdbSBram Moolenaar
2311f5be8cdbSBram Moolenaar  CheckScriptFailure([
2312f5be8cdbSBram Moolenaar      'vim9script',
2313f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2314f5be8cdbSBram Moolenaar      ], 'E477:')
2315a26b9700SBram Moolenaarenddef
2316a26b9700SBram Moolenaar
23177e5bd91dSBram Moolenaardef Test_finish()
23187e5bd91dSBram Moolenaar  let lines =<< trim END
23197e5bd91dSBram Moolenaar    vim9script
23206797966dSBram Moolenaar    g:res = 'one'
23217e5bd91dSBram Moolenaar    if v:false | finish | endif
23226797966dSBram Moolenaar    g:res = 'two'
23237e5bd91dSBram Moolenaar    finish
23246797966dSBram Moolenaar    g:res = 'three'
23257e5bd91dSBram Moolenaar  END
23267e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
23277e5bd91dSBram Moolenaar  source Xfinished
23287e5bd91dSBram Moolenaar  assert_equal('two', g:res)
23297e5bd91dSBram Moolenaar
23307e5bd91dSBram Moolenaar  unlet g:res
23317e5bd91dSBram Moolenaar  delete('Xfinished')
23327e5bd91dSBram Moolenaarenddef
23337e5bd91dSBram Moolenaar
233432e35117SBram Moolenaardef Test_let_func_call()
233532e35117SBram Moolenaar  let lines =<< trim END
233632e35117SBram Moolenaar    vim9script
233732e35117SBram Moolenaar    func GetValue()
233832e35117SBram Moolenaar      if exists('g:count')
233932e35117SBram Moolenaar        let g:count += 1
234032e35117SBram Moolenaar      else
234132e35117SBram Moolenaar        let g:count = 1
234232e35117SBram Moolenaar      endif
234332e35117SBram Moolenaar      return 'this'
234432e35117SBram Moolenaar    endfunc
234532e35117SBram Moolenaar    let val: string = GetValue()
2346f5be8cdbSBram Moolenaar    # env var is always a string
2347df671b46SBram Moolenaar    let env = $TERM
234832e35117SBram Moolenaar  END
234932e35117SBram Moolenaar  writefile(lines, 'Xfinished')
235032e35117SBram Moolenaar  source Xfinished
2351f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
235232e35117SBram Moolenaar  assert_equal(1, g:count)
235332e35117SBram Moolenaar
235432e35117SBram Moolenaar  unlet g:count
235532e35117SBram Moolenaar  delete('Xfinished')
235632e35117SBram Moolenaarenddef
235732e35117SBram Moolenaar
235832e35117SBram Moolenaardef Test_let_missing_type()
235932e35117SBram Moolenaar  let lines =<< trim END
236032e35117SBram Moolenaar    vim9script
2361df671b46SBram Moolenaar    let var = g:unknown
2362227a69deSBram Moolenaar  END
2363822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2364227a69deSBram Moolenaar
2365227a69deSBram Moolenaar  lines =<< trim END
2366227a69deSBram Moolenaar    vim9script
2367227a69deSBram Moolenaar    let nr: number = 123
2368227a69deSBram Moolenaar    let var = nr
2369227a69deSBram Moolenaar  END
2370822ba247SBram Moolenaar  CheckScriptSuccess(lines)
237132e35117SBram Moolenaarenddef
237232e35117SBram Moolenaar
2373c82a5b5dSBram Moolenaardef Test_let_declaration()
2374c82a5b5dSBram Moolenaar  let lines =<< trim END
2375c82a5b5dSBram Moolenaar    vim9script
2376c82a5b5dSBram Moolenaar    let var: string
2377c82a5b5dSBram Moolenaar    g:var_uninit = var
2378c82a5b5dSBram Moolenaar    var = 'text'
2379c82a5b5dSBram Moolenaar    g:var_test = var
2380f5be8cdbSBram Moolenaar    # prefixing s: is optional
2381984dddbeSBram Moolenaar    s:var = 'prefixed'
2382984dddbeSBram Moolenaar    g:var_prefixed = s:var
2383984dddbeSBram Moolenaar
2384984dddbeSBram Moolenaar    let s:other: number
2385984dddbeSBram Moolenaar    other = 1234
2386984dddbeSBram Moolenaar    g:other_var = other
2387c82a5b5dSBram Moolenaar  END
2388c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2389c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2390c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2391984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2392984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2393c82a5b5dSBram Moolenaar
2394c82a5b5dSBram Moolenaar  unlet g:var_uninit
2395c82a5b5dSBram Moolenaar  unlet g:var_test
2396984dddbeSBram Moolenaar  unlet g:var_prefixed
2397984dddbeSBram Moolenaar  unlet g:other_var
2398c82a5b5dSBram Moolenaarenddef
2399c82a5b5dSBram Moolenaar
2400c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2401c5b1c20bSBram Moolenaar  let lines =<< trim END
2402c5b1c20bSBram Moolenaar    vim9script
2403c5b1c20bSBram Moolenaar    const var: string
2404c5b1c20bSBram Moolenaar  END
2405c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2406c5b1c20bSBram Moolenaar
2407c5b1c20bSBram Moolenaar  lines =<< trim END
2408c5b1c20bSBram Moolenaar    vim9script
2409c5b1c20bSBram Moolenaar    let 9var: string
2410c5b1c20bSBram Moolenaar  END
2411c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2412c5b1c20bSBram Moolenaarenddef
2413c5b1c20bSBram Moolenaar
241434db91f7SBram Moolenaardef Test_let_type_check()
241534db91f7SBram Moolenaar  let lines =<< trim END
241634db91f7SBram Moolenaar    vim9script
241734db91f7SBram Moolenaar    let var: string
241834db91f7SBram Moolenaar    var = 1234
241934db91f7SBram Moolenaar  END
242034db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2421984dddbeSBram Moolenaar
2422984dddbeSBram Moolenaar  lines =<< trim END
2423984dddbeSBram Moolenaar    vim9script
2424984dddbeSBram Moolenaar    let var:string
2425984dddbeSBram Moolenaar  END
2426984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2427c5b1c20bSBram Moolenaar
2428c5b1c20bSBram Moolenaar  lines =<< trim END
2429c5b1c20bSBram Moolenaar    vim9script
2430c5b1c20bSBram Moolenaar    let var: asdf
2431c5b1c20bSBram Moolenaar  END
2432c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
243334db91f7SBram Moolenaarenddef
243434db91f7SBram Moolenaar
2435a5d0077eSBram Moolenaardef Test_forward_declaration()
2436a5d0077eSBram Moolenaar  let lines =<< trim END
2437a5d0077eSBram Moolenaar    vim9script
2438a5d0077eSBram Moolenaar    def GetValue(): string
2439a5d0077eSBram Moolenaar      return theVal
2440a5d0077eSBram Moolenaar    enddef
2441a5d0077eSBram Moolenaar    let theVal = 'something'
2442822ba247SBram Moolenaar    g:initVal = GetValue()
2443a5d0077eSBram Moolenaar    theVal = 'else'
2444a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2445a5d0077eSBram Moolenaar  END
2446a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2447a5d0077eSBram Moolenaar  source Xforward
2448a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2449a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2450a5d0077eSBram Moolenaar
2451a5d0077eSBram Moolenaar  unlet g:initVal
2452a5d0077eSBram Moolenaar  unlet g:laterVal
2453a5d0077eSBram Moolenaar  delete('Xforward')
2454a5d0077eSBram Moolenaarenddef
2455a5d0077eSBram Moolenaar
24569721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
24579721fb4eSBram Moolenaar  let legacy_lines =<< trim END
24589721fb4eSBram Moolenaar    source Xvim9_script.vim
24599721fb4eSBram Moolenaar
24609721fb4eSBram Moolenaar    call assert_false(exists('local'))
24619721fb4eSBram Moolenaar    call assert_false(exists('exported'))
24629721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
24639721fb4eSBram Moolenaar    call assert_equal('global', global)
24649721fb4eSBram Moolenaar    call assert_equal('global', g:global)
24659721fb4eSBram Moolenaar
24669721fb4eSBram Moolenaar    " imported variable becomes script-local
24679721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
24689721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
24699721fb4eSBram Moolenaar    call assert_false(exists('exported'))
24709721fb4eSBram Moolenaar
24719721fb4eSBram Moolenaar    " imported function becomes script-local
24729721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
24739721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
24749721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
24759721fb4eSBram Moolenaar  END
24769721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
24779721fb4eSBram Moolenaar
24789721fb4eSBram Moolenaar  let vim9_lines =<< trim END
24799721fb4eSBram Moolenaar    vim9script
24809721fb4eSBram Moolenaar    let local = 'local'
24819721fb4eSBram Moolenaar    g:global = 'global'
24829721fb4eSBram Moolenaar    export let exported = 'exported'
24839721fb4eSBram Moolenaar    export def GetText(): string
24849721fb4eSBram Moolenaar       return 'text'
24859721fb4eSBram Moolenaar    enddef
24869721fb4eSBram Moolenaar  END
24879721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
24889721fb4eSBram Moolenaar
24899721fb4eSBram Moolenaar  source Xlegacy_script.vim
24909721fb4eSBram Moolenaar
24919721fb4eSBram Moolenaar  assert_equal('global', g:global)
2492f5be8cdbSBram Moolenaar  unlet g:global
24939721fb4eSBram Moolenaar
24949721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
24959721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
24969721fb4eSBram Moolenaarenddef
2497a5d0077eSBram Moolenaar
2498eeb27bfeSBram Moolenaardef Test_vim9_copen()
2499eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2500eeb27bfeSBram Moolenaar  copen
2501eeb27bfeSBram Moolenaar  quit
2502eeb27bfeSBram Moolenaarenddef
2503eeb27bfeSBram Moolenaar
2504585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2505585fea7bSBram Moolenaardef Test_substitute_cmd()
2506585fea7bSBram Moolenaar  new
2507585fea7bSBram Moolenaar  setline(1, 'something')
2508585fea7bSBram Moolenaar  :substitute(some(other(
2509585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2510585fea7bSBram Moolenaar  bwipe!
2511585fea7bSBram Moolenaar
2512f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2513585fea7bSBram Moolenaar  let lines =<< trim END
2514585fea7bSBram Moolenaar    vim9script
2515585fea7bSBram Moolenaar    new
2516585fea7bSBram Moolenaar    setline(1, 'something')
2517585fea7bSBram Moolenaar    :substitute(some(other(
2518585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2519585fea7bSBram Moolenaar    bwipe!
2520585fea7bSBram Moolenaar  END
2521585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2522585fea7bSBram Moolenaar  source Xvim9lines
2523585fea7bSBram Moolenaar
2524585fea7bSBram Moolenaar  delete('Xvim9lines')
2525585fea7bSBram Moolenaarenddef
2526585fea7bSBram Moolenaar
25278a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2528