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
5018a7d6542SBram Moolenaardef Test_try_catch()
5028a7d6542SBram Moolenaar  let l = []
5037a092245SBram Moolenaar  try # comment
5048a7d6542SBram Moolenaar    add(l, '1')
5058a7d6542SBram Moolenaar    throw 'wrong'
5068a7d6542SBram Moolenaar    add(l, '2')
5077a092245SBram Moolenaar  catch # comment
5088a7d6542SBram Moolenaar    add(l, v:exception)
5097a092245SBram Moolenaar  finally # comment
5108a7d6542SBram Moolenaar    add(l, '3')
5117a092245SBram Moolenaar  endtry # comment
5128a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
51368d130c6SBram Moolenaar
514*e859312eSBram Moolenaar  l = []
515*e859312eSBram Moolenaar  try
516*e859312eSBram Moolenaar    try
517*e859312eSBram Moolenaar      add(l, '1')
518*e859312eSBram Moolenaar      throw 'wrong'
519*e859312eSBram Moolenaar      add(l, '2')
520*e859312eSBram Moolenaar    catch /right/
521*e859312eSBram Moolenaar      add(l, v:exception)
522*e859312eSBram Moolenaar    endtry
523*e859312eSBram Moolenaar  catch /wrong/
524*e859312eSBram Moolenaar    add(l, 'caught')
525*e859312eSBram Moolenaar  finally
526*e859312eSBram Moolenaar    add(l, 'finally')
527*e859312eSBram Moolenaar  endtry
528*e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
529*e859312eSBram Moolenaar
53068d130c6SBram Moolenaar  let n: number
53168d130c6SBram Moolenaar  try
53268d130c6SBram Moolenaar    n = l[3]
53368d130c6SBram Moolenaar  catch /E684:/
53468d130c6SBram Moolenaar    n = 99
53568d130c6SBram Moolenaar  endtry
53668d130c6SBram Moolenaar  assert_equal(99, n)
53768d130c6SBram Moolenaar
53868d130c6SBram Moolenaar  try
53968d130c6SBram Moolenaar    n = g:astring[3]
54068d130c6SBram Moolenaar  catch /E714:/
54168d130c6SBram Moolenaar    n = 77
54268d130c6SBram Moolenaar  endtry
54368d130c6SBram Moolenaar  assert_equal(77, n)
54468d130c6SBram Moolenaar
54568d130c6SBram Moolenaar  try
54668d130c6SBram Moolenaar    n = l[g:astring]
54768d130c6SBram Moolenaar  catch /E39:/
54868d130c6SBram Moolenaar    n = 77
54968d130c6SBram Moolenaar  endtry
55068d130c6SBram Moolenaar  assert_equal(77, n)
55168d130c6SBram Moolenaar
55268d130c6SBram Moolenaar  try
55368d130c6SBram Moolenaar    n = s:does_not_exist
55468d130c6SBram Moolenaar  catch /E121:/
555f0b9f43cSBram Moolenaar    n = 111
556f0b9f43cSBram Moolenaar  endtry
557f0b9f43cSBram Moolenaar  assert_equal(111, n)
558f0b9f43cSBram Moolenaar
559f0b9f43cSBram Moolenaar  try
560f0b9f43cSBram Moolenaar    n = g:does_not_exist
561f0b9f43cSBram Moolenaar  catch /E121:/
56268d130c6SBram Moolenaar    n = 121
56368d130c6SBram Moolenaar  endtry
56468d130c6SBram Moolenaar  assert_equal(121, n)
56568d130c6SBram Moolenaar
56668d130c6SBram Moolenaar  let d = #{one: 1}
56768d130c6SBram Moolenaar  try
56868d130c6SBram Moolenaar    n = d[g:astring]
56968d130c6SBram Moolenaar  catch /E716:/
57068d130c6SBram Moolenaar    n = 222
57168d130c6SBram Moolenaar  endtry
57268d130c6SBram Moolenaar  assert_equal(222, n)
573f0b9f43cSBram Moolenaar
574f0b9f43cSBram Moolenaar  try
575f0b9f43cSBram Moolenaar    n = -g:astring
576f0b9f43cSBram Moolenaar  catch /E39:/
577f0b9f43cSBram Moolenaar    n = 233
578f0b9f43cSBram Moolenaar  endtry
579f0b9f43cSBram Moolenaar  assert_equal(233, n)
580f0b9f43cSBram Moolenaar
581f0b9f43cSBram Moolenaar  try
582f0b9f43cSBram Moolenaar    n = +g:astring
583f0b9f43cSBram Moolenaar  catch /E1030:/
584f0b9f43cSBram Moolenaar    n = 244
585f0b9f43cSBram Moolenaar  endtry
586f0b9f43cSBram Moolenaar  assert_equal(244, n)
587f0b9f43cSBram Moolenaar
588f0b9f43cSBram Moolenaar  try
589f0b9f43cSBram Moolenaar    n = +g:alist
590f0b9f43cSBram Moolenaar  catch /E745:/
591f0b9f43cSBram Moolenaar    n = 255
592f0b9f43cSBram Moolenaar  endtry
593f0b9f43cSBram Moolenaar  assert_equal(255, n)
594f0b9f43cSBram Moolenaar
595f0b9f43cSBram Moolenaar  let nd: dict<any>
596f0b9f43cSBram Moolenaar  try
597f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
598f0b9f43cSBram Moolenaar  catch /E1029:/
599f0b9f43cSBram Moolenaar    n = 266
600f0b9f43cSBram Moolenaar  endtry
601f0b9f43cSBram Moolenaar  assert_equal(266, n)
602f0b9f43cSBram Moolenaar
603f0b9f43cSBram Moolenaar  try
604f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
605f0b9f43cSBram Moolenaar  catch /E1093:/
606f0b9f43cSBram Moolenaar    n = 277
607f0b9f43cSBram Moolenaar  endtry
608f0b9f43cSBram Moolenaar  assert_equal(277, n)
609f0b9f43cSBram Moolenaar
610*e859312eSBram Moolenaar  try
611*e859312eSBram Moolenaar    &ts = g:astring
612*e859312eSBram Moolenaar  catch /E1029:/
613*e859312eSBram Moolenaar    n = 288
614*e859312eSBram Moolenaar  endtry
615*e859312eSBram Moolenaar  assert_equal(288, n)
616*e859312eSBram Moolenaar
617*e859312eSBram Moolenaar  try
618*e859312eSBram Moolenaar    &backspace = 'asdf'
619*e859312eSBram Moolenaar  catch /E474:/
620*e859312eSBram Moolenaar    n = 299
621*e859312eSBram Moolenaar  endtry
622*e859312eSBram Moolenaar  assert_equal(299, n)
623*e859312eSBram Moolenaar
624*e859312eSBram Moolenaar  l = [1]
625*e859312eSBram Moolenaar  try
626*e859312eSBram Moolenaar    l[3] = 3
627*e859312eSBram Moolenaar  catch /E684:/
628*e859312eSBram Moolenaar    n = 300
629*e859312eSBram Moolenaar  endtry
630*e859312eSBram Moolenaar  assert_equal(300, n)
631*e859312eSBram Moolenaar
632*e859312eSBram Moolenaar  try
633*e859312eSBram Moolenaar    d[''] = 3
634*e859312eSBram Moolenaar  catch /E713:/
635*e859312eSBram Moolenaar    n = 311
636*e859312eSBram Moolenaar  endtry
637*e859312eSBram Moolenaar  assert_equal(311, n)
638*e859312eSBram Moolenaar
639*e859312eSBram Moolenaar  try
640*e859312eSBram Moolenaar    unlet g:does_not_exist
641*e859312eSBram Moolenaar  catch /E108:/
642*e859312eSBram Moolenaar    n = 322
643*e859312eSBram Moolenaar  endtry
644*e859312eSBram Moolenaar  assert_equal(322, n)
645*e859312eSBram Moolenaar
646*e859312eSBram Moolenaar  try
647*e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
648*e859312eSBram Moolenaar  catch /E721:/
649*e859312eSBram Moolenaar    n = 333
650*e859312eSBram Moolenaar  endtry
651*e859312eSBram Moolenaar  assert_equal(333, n)
652*e859312eSBram Moolenaar
653*e859312eSBram Moolenaar  try
654*e859312eSBram Moolenaar    l = DeletedFunc()
655*e859312eSBram Moolenaar  catch /E933:/
656*e859312eSBram Moolenaar    n = 344
657*e859312eSBram Moolenaar  endtry
658*e859312eSBram Moolenaar  assert_equal(344, n)
6598a7d6542SBram Moolenaarenddef
6608a7d6542SBram Moolenaar
661*e859312eSBram Moolenaardef DeletedFunc(): list<any>
662*e859312eSBram Moolenaar  return ['delete me']
663*e859312eSBram Moolenaarenddef
664*e859312eSBram Moolenaardefcompile
665*e859312eSBram Moolenaardelfunc DeletedFunc
666*e859312eSBram Moolenaar
667257cc5eeSBram Moolenaardef ThrowFromDef()
668a72cfb80SBram Moolenaar  throw "getout" # comment
669257cc5eeSBram Moolenaarenddef
670257cc5eeSBram Moolenaar
671257cc5eeSBram Moolenaarfunc CatchInFunc()
672257cc5eeSBram Moolenaar  try
673257cc5eeSBram Moolenaar    call ThrowFromDef()
674257cc5eeSBram Moolenaar  catch
675257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
676257cc5eeSBram Moolenaar  endtry
677257cc5eeSBram Moolenaarendfunc
678257cc5eeSBram Moolenaar
679257cc5eeSBram Moolenaardef CatchInDef()
680257cc5eeSBram Moolenaar  try
681257cc5eeSBram Moolenaar    ThrowFromDef()
682257cc5eeSBram Moolenaar  catch
683257cc5eeSBram Moolenaar    g:thrown_def = v:exception
684257cc5eeSBram Moolenaar  endtry
685257cc5eeSBram Moolenaarenddef
686257cc5eeSBram Moolenaar
687f575adffSBram Moolenaardef ReturnFinally(): string
688f575adffSBram Moolenaar  try
689f575adffSBram Moolenaar    return 'intry'
690f575adffSBram Moolenaar  finally
691f575adffSBram Moolenaar    g:in_finally = 'finally'
692f575adffSBram Moolenaar  endtry
693f575adffSBram Moolenaar  return 'end'
694f575adffSBram Moolenaarenddef
695f575adffSBram Moolenaar
696257cc5eeSBram Moolenaardef Test_try_catch_nested()
697257cc5eeSBram Moolenaar  CatchInFunc()
698257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
699257cc5eeSBram Moolenaar
700257cc5eeSBram Moolenaar  CatchInDef()
701257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
702f575adffSBram Moolenaar
703f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
704f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
705f575adffSBram Moolenaarenddef
706f575adffSBram Moolenaar
707f575adffSBram Moolenaardef Test_try_catch_match()
708f575adffSBram Moolenaar  let seq = 'a'
709f575adffSBram Moolenaar  try
710f575adffSBram Moolenaar    throw 'something'
711f575adffSBram Moolenaar  catch /nothing/
712f575adffSBram Moolenaar    seq ..= 'x'
713f575adffSBram Moolenaar  catch /some/
714f575adffSBram Moolenaar    seq ..= 'b'
715f575adffSBram Moolenaar  catch /asdf/
716f575adffSBram Moolenaar    seq ..= 'x'
717e8c4abbbSBram Moolenaar  catch ?a\?sdf?
718e8c4abbbSBram Moolenaar    seq ..= 'y'
719f575adffSBram Moolenaar  finally
720f575adffSBram Moolenaar    seq ..= 'c'
721f575adffSBram Moolenaar  endtry
722f575adffSBram Moolenaar  assert_equal('abc', seq)
723257cc5eeSBram Moolenaarenddef
724257cc5eeSBram Moolenaar
725e8c4abbbSBram Moolenaardef Test_try_catch_fails()
726e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
727e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
728e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
729585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
730585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
731585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
732585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
733585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
734585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
735585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
736585fea7bSBram Moolenaar
737a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
738585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
739e8c4abbbSBram Moolenaarenddef
740e8c4abbbSBram Moolenaar
741006ad48bSBram Moolenaardef Test_throw_vimscript()
742f5be8cdbSBram Moolenaar  # only checks line continuation
743006ad48bSBram Moolenaar  let lines =<< trim END
744006ad48bSBram Moolenaar      vim9script
745006ad48bSBram Moolenaar      try
746006ad48bSBram Moolenaar        throw 'one'
747006ad48bSBram Moolenaar              .. 'two'
748006ad48bSBram Moolenaar      catch
749006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
750006ad48bSBram Moolenaar      endtry
751006ad48bSBram Moolenaar  END
752006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
753006ad48bSBram Moolenaarenddef
754006ad48bSBram Moolenaar
75537c83711SBram Moolenaardef Test_cexpr_vimscript()
756f5be8cdbSBram Moolenaar  # only checks line continuation
75737c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
75837c83711SBram Moolenaar  let lines =<< trim END
75937c83711SBram Moolenaar      vim9script
76037c83711SBram Moolenaar      cexpr 'File'
76137c83711SBram Moolenaar                .. ' someFile' ..
76237c83711SBram Moolenaar                   ' line 19'
76337c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
76437c83711SBram Moolenaar  END
76537c83711SBram Moolenaar  CheckScriptSuccess(lines)
76637c83711SBram Moolenaar  set errorformat&
76737c83711SBram Moolenaarenddef
76837c83711SBram Moolenaar
7692a1381c3SBram Moolenaarif has('channel')
77040ee466cSBram Moolenaar  let someJob = test_null_job()
77140ee466cSBram Moolenaar
77240ee466cSBram Moolenaar  def FuncWithError()
77340ee466cSBram Moolenaar    echomsg g:someJob
77440ee466cSBram Moolenaar  enddef
77540ee466cSBram Moolenaar
77640ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
77740ee466cSBram Moolenaar    try
77840ee466cSBram Moolenaar      call FuncWithError()
77940ee466cSBram Moolenaar    catch
78040ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
78140ee466cSBram Moolenaar    endtry
78240ee466cSBram Moolenaar  endfunc
7832a1381c3SBram Moolenaarendif
78440ee466cSBram Moolenaar
7858a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
7868a7d6542SBram Moolenaar  vim9script
7878a7d6542SBram Moolenaar  let name: string = 'bob'
7888a7d6542SBram Moolenaar  def Concat(arg: string): string
7898a7d6542SBram Moolenaar    return name .. arg
7908a7d6542SBram Moolenaar  enddef
791227a69deSBram Moolenaar  g:result = Concat('bie')
792227a69deSBram Moolenaar  g:localname = name
7938a7d6542SBram Moolenaar
7948a7d6542SBram Moolenaar  export const CONST = 1234
7958a7d6542SBram Moolenaar  export let exported = 9876
7966e587dcbSBram Moolenaar  export let exp_name = 'John'
7978a7d6542SBram Moolenaar  export def Exported(): string
7988a7d6542SBram Moolenaar    return 'Exported'
7998a7d6542SBram Moolenaar  enddef
8008a7d6542SBram MoolenaarEND
8018a7d6542SBram Moolenaar
8025269bd2aSBram Moolenaardef Test_vim9_import_export()
8038a7d6542SBram Moolenaar  let import_script_lines =<< trim END
8048a7d6542SBram Moolenaar    vim9script
8058a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
8068a7d6542SBram Moolenaar    g:imported = exported
8076e587dcbSBram Moolenaar    exported += 3
8086e587dcbSBram Moolenaar    g:imported_added = exported
8098a7d6542SBram Moolenaar    g:imported_func = Exported()
8106e587dcbSBram Moolenaar
8116e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
8126e587dcbSBram Moolenaar    g:imported_name = exp_name
8136e587dcbSBram Moolenaar    exp_name ..= ' Doe'
8146e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
8155381c7a1SBram Moolenaar    g:imported_later = exported
8168a7d6542SBram Moolenaar  END
8178a7d6542SBram Moolenaar
8188a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
8198a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
8208a7d6542SBram Moolenaar
8218a7d6542SBram Moolenaar  source Ximport.vim
8228a7d6542SBram Moolenaar
8238a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
8248a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
8258a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
8266e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
8275381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
8288a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
8296e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
8306e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
8318a7d6542SBram Moolenaar  assert_false(exists('g:name'))
8328a7d6542SBram Moolenaar
8338a7d6542SBram Moolenaar  unlet g:result
8348a7d6542SBram Moolenaar  unlet g:localname
8358a7d6542SBram Moolenaar  unlet g:imported
8366e587dcbSBram Moolenaar  unlet g:imported_added
8375381c7a1SBram Moolenaar  unlet g:imported_later
8388a7d6542SBram Moolenaar  unlet g:imported_func
8396e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
8408a7d6542SBram Moolenaar  delete('Ximport.vim')
841f2d5c240SBram Moolenaar
8421c991144SBram Moolenaar  # similar, with line breaks
8431c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
8441c991144SBram Moolenaar    vim9script
8451c991144SBram Moolenaar    import {
8461c991144SBram Moolenaar        exported,
8471c991144SBram Moolenaar        Exported,
8481c991144SBram Moolenaar        }
8491c991144SBram Moolenaar        from
8501c991144SBram Moolenaar        './Xexport.vim'
8511c991144SBram Moolenaar    g:imported = exported
8521c991144SBram Moolenaar    exported += 5
8531c991144SBram Moolenaar    g:imported_added = exported
8541c991144SBram Moolenaar    g:imported_func = Exported()
8551c991144SBram Moolenaar  END
8561c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
8571c991144SBram Moolenaar  source Ximport_lbr.vim
8581c991144SBram Moolenaar
8591c991144SBram Moolenaar  assert_equal(9876, g:imported)
8601c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
8611c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
8621c991144SBram Moolenaar
8631c991144SBram Moolenaar  # exported script not sourced again
8641c991144SBram Moolenaar  assert_false(exists('g:result'))
8651c991144SBram Moolenaar  unlet g:imported
8661c991144SBram Moolenaar  unlet g:imported_added
8671c991144SBram Moolenaar  unlet g:imported_func
8681c991144SBram Moolenaar  delete('Ximport_lbr.vim')
8691c991144SBram Moolenaar
8701c991144SBram Moolenaar  # import inside :def function
8715381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
8725381c7a1SBram Moolenaar    vim9script
8735381c7a1SBram Moolenaar    def ImportInDef()
8745381c7a1SBram Moolenaar      import exported from './Xexport.vim'
8755381c7a1SBram Moolenaar      g:imported = exported
8765381c7a1SBram Moolenaar      exported += 7
8775381c7a1SBram Moolenaar      g:imported_added = exported
8785381c7a1SBram Moolenaar    enddef
8795381c7a1SBram Moolenaar    ImportInDef()
8805381c7a1SBram Moolenaar  END
8815381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
8825381c7a1SBram Moolenaar  source Ximport2.vim
883f5be8cdbSBram Moolenaar  # TODO: this should be 9879
8845381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
8855381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
8865381c7a1SBram Moolenaar  unlet g:imported
8875381c7a1SBram Moolenaar  unlet g:imported_added
8885381c7a1SBram Moolenaar  delete('Ximport2.vim')
8895381c7a1SBram Moolenaar
890f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
891f2d5c240SBram Moolenaar    vim9script
892f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
893f2d5c240SBram Moolenaar    def UseExport()
894f2d5c240SBram Moolenaar      g:imported = Export.exported
895f2d5c240SBram Moolenaar    enddef
896f2d5c240SBram Moolenaar    UseExport()
897f2d5c240SBram Moolenaar  END
898f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
899f2d5c240SBram Moolenaar  source Ximport.vim
9005381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
901f2d5c240SBram Moolenaar
902599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
903599c89c8SBram Moolenaar    vim9script
904599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
905599c89c8SBram Moolenaar    def Func()
906599c89c8SBram Moolenaar      let dummy = 1
907599c89c8SBram Moolenaar      let imported = Export + dummy
908599c89c8SBram Moolenaar    enddef
909822ba247SBram Moolenaar    defcompile
910599c89c8SBram Moolenaar  END
911599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
912599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
913599c89c8SBram Moolenaar
914599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
915599c89c8SBram Moolenaar    vim9script
916599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
917599c89c8SBram Moolenaar    def Func()
918599c89c8SBram Moolenaar      let imported = Export . exported
919599c89c8SBram Moolenaar    enddef
920822ba247SBram Moolenaar    defcompile
921599c89c8SBram Moolenaar  END
922599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
923599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
924599c89c8SBram Moolenaar
925599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
926599c89c8SBram Moolenaar    vim9script
927599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
928599c89c8SBram Moolenaar    def Func()
929599c89c8SBram Moolenaar      let imported = Export.
930599c89c8SBram Moolenaar    enddef
931822ba247SBram Moolenaar    defcompile
932599c89c8SBram Moolenaar  END
933599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
934599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
935599c89c8SBram Moolenaar
9361c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
9371c991144SBram Moolenaar    vim9script
9381c991144SBram Moolenaar    import *
9391c991144SBram Moolenaar        as Export
9401c991144SBram Moolenaar        from
9411c991144SBram Moolenaar        './Xexport.vim'
9421c991144SBram Moolenaar    def UseExport()
9431c991144SBram Moolenaar      g:imported = Export.exported
9441c991144SBram Moolenaar    enddef
9451c991144SBram Moolenaar    UseExport()
9461c991144SBram Moolenaar  END
9471c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
9481c991144SBram Moolenaar  source Ximport.vim
9491c991144SBram Moolenaar  assert_equal(9883, g:imported)
9501c991144SBram Moolenaar
951f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
952f2d5c240SBram Moolenaar    vim9script
953f2d5c240SBram Moolenaar    import * from './Xexport.vim'
954f2d5c240SBram Moolenaar  END
955f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
956f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
957f2d5c240SBram Moolenaar
958f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
959fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
960fa29c8abSBram Moolenaar    vim9script
961fa29c8abSBram Moolenaar    import name from './Xexport.vim'
962fa29c8abSBram Moolenaar  END
963fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
964fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
965fa29c8abSBram Moolenaar
966f5be8cdbSBram Moolenaar  # try to import something that is already defined
9675269bd2aSBram Moolenaar  let import_already_defined =<< trim END
9685269bd2aSBram Moolenaar    vim9script
9695269bd2aSBram Moolenaar    let exported = 'something'
9705269bd2aSBram Moolenaar    import exported from './Xexport.vim'
9715269bd2aSBram Moolenaar  END
9725269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
9735269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
9745269bd2aSBram Moolenaar
975f5be8cdbSBram Moolenaar  # try to import something that is already defined
9765269bd2aSBram Moolenaar  import_already_defined =<< trim END
9775269bd2aSBram Moolenaar    vim9script
9785269bd2aSBram Moolenaar    let exported = 'something'
9795269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
9805269bd2aSBram Moolenaar  END
9815269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
9825269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
9835269bd2aSBram Moolenaar
984f5be8cdbSBram Moolenaar  # try to import something that is already defined
9855269bd2aSBram Moolenaar  import_already_defined =<< trim END
9865269bd2aSBram Moolenaar    vim9script
9875269bd2aSBram Moolenaar    let exported = 'something'
9885269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
9895269bd2aSBram Moolenaar  END
9905269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
9915269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
9925269bd2aSBram Moolenaar
993f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
994fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
995fa29c8abSBram Moolenaar    vim9script
996fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
997fa29c8abSBram Moolenaar  END
998fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
999fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1000fa29c8abSBram Moolenaar
1001fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1002fa29c8abSBram Moolenaar    vim9script
1003fa29c8abSBram Moolenaar    import name './Xexport.vim'
1004fa29c8abSBram Moolenaar  END
1005fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1006fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1007fa29c8abSBram Moolenaar
1008fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1009fa29c8abSBram Moolenaar    vim9script
1010fa29c8abSBram Moolenaar    import name from Xexport.vim
1011fa29c8abSBram Moolenaar  END
1012fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1013fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1014fa29c8abSBram Moolenaar
1015fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1016fa29c8abSBram Moolenaar    vim9script
1017fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1018fa29c8abSBram Moolenaar  END
1019fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1020fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1021fa29c8abSBram Moolenaar
1022fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1023fa29c8abSBram Moolenaar    vim9script
1024fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1025fa29c8abSBram Moolenaar  END
10265269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
10275269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1028fa29c8abSBram Moolenaar
1029f2d5c240SBram Moolenaar  delete('Ximport.vim')
10305269bd2aSBram Moolenaar  delete('Ximport3.vim')
10318a7d6542SBram Moolenaar  delete('Xexport.vim')
10328a7d6542SBram Moolenaar
1033f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1034750802b5SBram Moolenaar  set cpo&vi
1035750802b5SBram Moolenaar  let cpo_before = &cpo
1036750802b5SBram Moolenaar  let lines =<< trim END
1037750802b5SBram Moolenaar    vim9script
1038750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1039750802b5SBram Moolenaar  END
1040750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1041750802b5SBram Moolenaar  source Xvim9_script
1042750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1043750802b5SBram Moolenaar  set cpo&vim
1044750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1045750802b5SBram Moolenaar  delete('Xvim9_script')
1046750802b5SBram Moolenaarenddef
1047750802b5SBram Moolenaar
1048750802b5SBram Moolenaardef Test_vim9script_fails()
10498a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
10508a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1051750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
10529721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
10539b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1054750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1055750802b5SBram Moolenaar
1056c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1057c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1058c785b9a7SBram Moolenaar
1059750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1060a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
10618a7d6542SBram Moolenaarenddef
10628a7d6542SBram Moolenaar
1063f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1064101f4810SBram Moolenaar  CheckRunVimInTerminal
1065101f4810SBram Moolenaar
10669bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1067c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
10689bb3eb3eSBram Moolenaarendfunc
10699bb3eb3eSBram Moolenaar
1070c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1071101f4810SBram Moolenaar  let export =<< trim END
1072101f4810SBram Moolenaar    vim9script
1073101f4810SBram Moolenaar    export def Foo(): number
1074101f4810SBram Moolenaar        return 0
1075101f4810SBram Moolenaar    enddef
1076101f4810SBram Moolenaar  END
10779bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
1078101f4810SBram Moolenaar
10799bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
10809bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
10819bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1082101f4810SBram Moolenaar
10839bb3eb3eSBram Moolenaar  delete('Xexport.vim')
10849bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
10859bb3eb3eSBram Moolenaarenddef
1086101f4810SBram Moolenaar
10874c17ad94SBram Moolenaardef Test_vim9script_reload_import()
10888a7d6542SBram Moolenaar  let lines =<< trim END
10898a7d6542SBram Moolenaar    vim9script
10908a7d6542SBram Moolenaar    const var = ''
10918a7d6542SBram Moolenaar    let valone = 1234
10928a7d6542SBram Moolenaar    def MyFunc(arg: string)
10938a7d6542SBram Moolenaar       valone = 5678
10948a7d6542SBram Moolenaar    enddef
10958a7d6542SBram Moolenaar  END
10968a7d6542SBram Moolenaar  let morelines =<< trim END
10978a7d6542SBram Moolenaar    let valtwo = 222
10988a7d6542SBram Moolenaar    export def GetValtwo(): number
10998a7d6542SBram Moolenaar      return valtwo
11008a7d6542SBram Moolenaar    enddef
11018a7d6542SBram Moolenaar  END
110203afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
11038a7d6542SBram Moolenaar  source Xreload.vim
11048a7d6542SBram Moolenaar  source Xreload.vim
11058a7d6542SBram Moolenaar  source Xreload.vim
11068a7d6542SBram Moolenaar
11078a7d6542SBram Moolenaar  let testlines =<< trim END
11088a7d6542SBram Moolenaar    vim9script
11098a7d6542SBram Moolenaar    def TheFunc()
11108a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
11118a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
11128a7d6542SBram Moolenaar    enddef
11138a7d6542SBram Moolenaar    TheFunc()
11148a7d6542SBram Moolenaar  END
11158a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
11168a7d6542SBram Moolenaar  source Ximport.vim
11178a7d6542SBram Moolenaar
1118f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1119f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
11208a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
11218a7d6542SBram Moolenaar  source Ximport.vim
11228a7d6542SBram Moolenaar
1123f5be8cdbSBram Moolenaar  # cannot declare a var twice
11248a7d6542SBram Moolenaar  lines =<< trim END
11258a7d6542SBram Moolenaar    vim9script
11268a7d6542SBram Moolenaar    let valone = 1234
11278a7d6542SBram Moolenaar    let valone = 5678
11288a7d6542SBram Moolenaar  END
11298a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
11308a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
11318a7d6542SBram Moolenaar
11328a7d6542SBram Moolenaar  delete('Xreload.vim')
11338a7d6542SBram Moolenaar  delete('Ximport.vim')
11348a7d6542SBram Moolenaarenddef
11358a7d6542SBram Moolenaar
1136fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1137fe465a01SBram Moolenaar" script-local name.
1138fe465a01SBram Moolenaardef Test_vim9script_funcref()
1139fe465a01SBram Moolenaar  let sortlines =<< trim END
1140fe465a01SBram Moolenaar      vim9script
1141fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1142bed36b93SBram Moolenaar        return i2 - i1
1143fe465a01SBram Moolenaar      enddef
1144fe465a01SBram Moolenaar
1145fe465a01SBram Moolenaar      export def FastSort(): list<number>
1146fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1147fe465a01SBram Moolenaar      enddef
1148fe465a01SBram Moolenaar  END
1149fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1150fe465a01SBram Moolenaar
1151fe465a01SBram Moolenaar  let lines =<< trim END
1152fe465a01SBram Moolenaar    vim9script
1153fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1154fe465a01SBram Moolenaar    def Test()
1155fe465a01SBram Moolenaar      g:result = FastSort()
1156fe465a01SBram Moolenaar    enddef
1157fe465a01SBram Moolenaar    Test()
1158fe465a01SBram Moolenaar  END
1159fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1160fe465a01SBram Moolenaar
1161fe465a01SBram Moolenaar  source Xscript.vim
1162fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1163fe465a01SBram Moolenaar
1164fe465a01SBram Moolenaar  unlet g:result
1165fe465a01SBram Moolenaar  delete('Xsort.vim')
1166fe465a01SBram Moolenaar  delete('Xscript.vim')
1167fe465a01SBram Moolenaarenddef
1168fe465a01SBram Moolenaar
1169c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1170c620c055SBram Moolenaar" script where FastFilter() is called from.
1171c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1172c620c055SBram Moolenaar  let filterLines =<< trim END
1173c620c055SBram Moolenaar    vim9script
1174c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1175c620c055SBram Moolenaar      return idx % 2 == 1
1176c620c055SBram Moolenaar    enddef
1177c620c055SBram Moolenaar    export def FastFilter(): list<number>
1178c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1179c620c055SBram Moolenaar    enddef
1180c620c055SBram Moolenaar  END
1181c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1182c620c055SBram Moolenaar
1183c620c055SBram Moolenaar  let lines =<< trim END
1184c620c055SBram Moolenaar    vim9script
1185c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1186c620c055SBram Moolenaar    def Test()
1187c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1188c620c055SBram Moolenaar    enddef
1189c620c055SBram Moolenaar    Test()
1190c620c055SBram Moolenaar  END
1191c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1192c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1193c620c055SBram Moolenaar
1194c620c055SBram Moolenaar  delete('Xfilter.vim')
1195c620c055SBram Moolenaar  delete('Ximport.vim')
1196c620c055SBram Moolenaarenddef
1197c620c055SBram Moolenaar
11984c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
11994c17ad94SBram Moolenaar  let first_lines =<< trim END
12004c17ad94SBram Moolenaar    vim9script
12014c17ad94SBram Moolenaar    def FuncYes(): string
12024c17ad94SBram Moolenaar      return 'yes'
12034c17ad94SBram Moolenaar    enddef
12044c17ad94SBram Moolenaar  END
120503afdcf1SBram Moolenaar  let withno_lines =<< trim END
12064c17ad94SBram Moolenaar    def FuncNo(): string
12074c17ad94SBram Moolenaar      return 'no'
12084c17ad94SBram Moolenaar    enddef
12094c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
12104c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
12114c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
121203afdcf1SBram Moolenaar    enddef
121303afdcf1SBram Moolenaar  END
121403afdcf1SBram Moolenaar  let nono_lines =<< trim END
121503afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
121603afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
12174c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
12184c17ad94SBram Moolenaar    enddef
12194c17ad94SBram Moolenaar  END
12204c17ad94SBram Moolenaar
12214c17ad94SBram Moolenaar  # FuncNo() is defined
122203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12234c17ad94SBram Moolenaar  source Xreloaded.vim
12244c17ad94SBram Moolenaar  g:DoCheck(true)
12254c17ad94SBram Moolenaar
12264c17ad94SBram Moolenaar  # FuncNo() is not redefined
122703afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
12284c17ad94SBram Moolenaar  source Xreloaded.vim
122903afdcf1SBram Moolenaar  g:DoCheck()
12304c17ad94SBram Moolenaar
12314c17ad94SBram Moolenaar  # FuncNo() is back
123203afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
12334c17ad94SBram Moolenaar  source Xreloaded.vim
123403afdcf1SBram Moolenaar  g:DoCheck()
12354c17ad94SBram Moolenaar
12364c17ad94SBram Moolenaar  delete('Xreloaded.vim')
12374c17ad94SBram Moolenaarenddef
12384c17ad94SBram Moolenaar
123989483d40SBram Moolenaardef Test_vim9script_reload_delvar()
124089483d40SBram Moolenaar  # write the script with a script-local variable
124189483d40SBram Moolenaar  let lines =<< trim END
124289483d40SBram Moolenaar    vim9script
124389483d40SBram Moolenaar    let var = 'string'
124489483d40SBram Moolenaar  END
124589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
124689483d40SBram Moolenaar  source XreloadVar.vim
124789483d40SBram Moolenaar
124889483d40SBram Moolenaar  # now write the script using the same variable locally - works
124989483d40SBram Moolenaar  lines =<< trim END
125089483d40SBram Moolenaar    vim9script
125189483d40SBram Moolenaar    def Func()
125289483d40SBram Moolenaar      let var = 'string'
125389483d40SBram Moolenaar    enddef
125489483d40SBram Moolenaar  END
125589483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
125689483d40SBram Moolenaar  source XreloadVar.vim
125789483d40SBram Moolenaar
125889483d40SBram Moolenaar  delete('XreloadVar.vim')
125989483d40SBram Moolenaarenddef
126089483d40SBram Moolenaar
12618a7d6542SBram Moolenaardef Test_import_absolute()
12628a7d6542SBram Moolenaar  let import_lines = [
1263e6085c53SBram Moolenaar        'vim9script',
1264e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1265e6085c53SBram Moolenaar        'def UseExported()',
1266e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1267e6085c53SBram Moolenaar        '  exported = 8888',
1268e6085c53SBram Moolenaar        '  g:imported_after = exported',
1269e6085c53SBram Moolenaar        'enddef',
1270e6085c53SBram Moolenaar        'UseExported()',
1271e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1272e6085c53SBram Moolenaar        ]
12738a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
12748a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
12758a7d6542SBram Moolenaar
12768a7d6542SBram Moolenaar  source Ximport_abs.vim
12778a7d6542SBram Moolenaar
12788a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
12794e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1280675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1281675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1282675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1283675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1284675f716eSBram Moolenaar          'exported = 8888.*' ..
1285675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1286675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1287675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1288675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1289e6085c53SBram Moolenaar        g:import_disassembled)
12908a7d6542SBram Moolenaar  unlet g:imported_abs
12914e12a5dfSBram Moolenaar  unlet g:import_disassembled
12928a7d6542SBram Moolenaar
12938a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
12948a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
12958a7d6542SBram Moolenaarenddef
12968a7d6542SBram Moolenaar
12978a7d6542SBram Moolenaardef Test_import_rtp()
12988a7d6542SBram Moolenaar  let import_lines = [
1299e6085c53SBram Moolenaar        'vim9script',
1300e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1301e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1302e6085c53SBram Moolenaar        ]
13038a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
13048a7d6542SBram Moolenaar  mkdir('import')
13058a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
13068a7d6542SBram Moolenaar
13078a7d6542SBram Moolenaar  let save_rtp = &rtp
13088a7d6542SBram Moolenaar  &rtp = getcwd()
13098a7d6542SBram Moolenaar  source Ximport_rtp.vim
13108a7d6542SBram Moolenaar  &rtp = save_rtp
13118a7d6542SBram Moolenaar
13128a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
13138a7d6542SBram Moolenaar  unlet g:imported_rtp
13148a7d6542SBram Moolenaar
13158a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
131689483d40SBram Moolenaar  delete('import', 'rf')
13178a7d6542SBram Moolenaarenddef
13188a7d6542SBram Moolenaar
131925e0f586SBram Moolenaardef Test_import_compile_error()
132025e0f586SBram Moolenaar  let export_lines = [
132125e0f586SBram Moolenaar        'vim9script',
132225e0f586SBram Moolenaar        'export def ExpFunc(): string',
132325e0f586SBram Moolenaar        '  return notDefined',
132425e0f586SBram Moolenaar        'enddef',
132525e0f586SBram Moolenaar        ]
132625e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
132725e0f586SBram Moolenaar
132825e0f586SBram Moolenaar  let import_lines = [
132925e0f586SBram Moolenaar        'vim9script',
133025e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
133125e0f586SBram Moolenaar        'def ImpFunc()',
133225e0f586SBram Moolenaar        '  echo ExpFunc()',
133325e0f586SBram Moolenaar        'enddef',
133425e0f586SBram Moolenaar        'defcompile',
133525e0f586SBram Moolenaar        ]
133625e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
133725e0f586SBram Moolenaar
133825e0f586SBram Moolenaar  try
133925e0f586SBram Moolenaar    source Ximport.vim
134025e0f586SBram Moolenaar  catch /E1001/
1341f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
134225e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
134325e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
134425e0f586SBram Moolenaar  endtry
134525e0f586SBram Moolenaar
134625e0f586SBram Moolenaar  delete('Xexported.vim')
134725e0f586SBram Moolenaar  delete('Ximport.vim')
134825e0f586SBram Moolenaarenddef
134925e0f586SBram Moolenaar
13508a7d6542SBram Moolenaardef Test_fixed_size_list()
1351f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
13528a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
13538a7d6542SBram Moolenaar  l->remove(0)
13548a7d6542SBram Moolenaar  l->add(5)
13558a7d6542SBram Moolenaar  l->insert(99, 1)
13560f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
13578a7d6542SBram Moolenaarenddef
13588a7d6542SBram Moolenaar
1359158906cfSBram Moolenaardef IfElse(what: number): string
1360158906cfSBram Moolenaar  let res = ''
1361158906cfSBram Moolenaar  if what == 1
1362158906cfSBram Moolenaar    res = "one"
1363158906cfSBram Moolenaar  elseif what == 2
1364158906cfSBram Moolenaar    res = "two"
1365a259d8d3SBram Moolenaar  else
1366158906cfSBram Moolenaar    res = "three"
1367a259d8d3SBram Moolenaar  endif
1368158906cfSBram Moolenaar  return res
1369a259d8d3SBram Moolenaarenddef
1370a259d8d3SBram Moolenaar
1371158906cfSBram Moolenaardef Test_if_elseif_else()
1372158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1373158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1374158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
13750f18b6d1SBram Moolenaarenddef
13760f18b6d1SBram Moolenaar
1377e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1378e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1379e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1380e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1381e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1382585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1383e8c4abbbSBram Moolenaarenddef
1384e8c4abbbSBram Moolenaar
13856d69bf60SBram Moolenaarlet g:bool_true = v:true
13866d69bf60SBram Moolenaarlet g:bool_false = v:false
13876d69bf60SBram Moolenaar
13886d69bf60SBram Moolenaardef Test_if_const_expr()
13896d69bf60SBram Moolenaar  let res = false
13906d69bf60SBram Moolenaar  if true ? true : false
13916d69bf60SBram Moolenaar    res = true
13926d69bf60SBram Moolenaar  endif
13936d69bf60SBram Moolenaar  assert_equal(true, res)
13946d69bf60SBram Moolenaar
1395585fea7bSBram Moolenaar  g:glob = 2
1396585fea7bSBram Moolenaar  if false
13976797966dSBram Moolenaar    execute('g:glob = 3')
1398585fea7bSBram Moolenaar  endif
1399585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1400585fea7bSBram Moolenaar  if true
14016797966dSBram Moolenaar    execute('g:glob = 3')
1402585fea7bSBram Moolenaar  endif
1403585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1404585fea7bSBram Moolenaar
14056d69bf60SBram Moolenaar  res = false
14066d69bf60SBram Moolenaar  if g:bool_true ? true : false
14076d69bf60SBram Moolenaar    res = true
14086d69bf60SBram Moolenaar  endif
14096d69bf60SBram Moolenaar  assert_equal(true, res)
14106d69bf60SBram Moolenaar
14116d69bf60SBram Moolenaar  res = false
14126d69bf60SBram Moolenaar  if true ? g:bool_true : false
14136d69bf60SBram Moolenaar    res = true
14146d69bf60SBram Moolenaar  endif
14156d69bf60SBram Moolenaar  assert_equal(true, res)
14166d69bf60SBram Moolenaar
14176d69bf60SBram Moolenaar  res = false
14186d69bf60SBram Moolenaar  if true ? true : g:bool_false
14196d69bf60SBram Moolenaar    res = true
14206d69bf60SBram Moolenaar  endif
14216d69bf60SBram Moolenaar  assert_equal(true, res)
14226d69bf60SBram Moolenaar
14236d69bf60SBram Moolenaar  res = false
14246d69bf60SBram Moolenaar  if true ? false : true
14256d69bf60SBram Moolenaar    res = true
14266d69bf60SBram Moolenaar  endif
14276d69bf60SBram Moolenaar  assert_equal(false, res)
14286d69bf60SBram Moolenaar
14296d69bf60SBram Moolenaar  res = false
14306d69bf60SBram Moolenaar  if false ? false : true
14316d69bf60SBram Moolenaar    res = true
14326d69bf60SBram Moolenaar  endif
14336d69bf60SBram Moolenaar  assert_equal(true, res)
14346d69bf60SBram Moolenaar
14356d69bf60SBram Moolenaar  res = false
14366d69bf60SBram Moolenaar  if false ? true : false
14376d69bf60SBram Moolenaar    res = true
14386d69bf60SBram Moolenaar  endif
14396d69bf60SBram Moolenaar  assert_equal(false, res)
14406d69bf60SBram Moolenaar
14416d69bf60SBram Moolenaar  res = false
1442e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1443e8c4abbbSBram Moolenaar    res = true
1444e8c4abbbSBram Moolenaar  endif
1445e8c4abbbSBram Moolenaar  assert_equal(false, res)
1446e8c4abbbSBram Moolenaar
1447e8c4abbbSBram Moolenaar  res = false
14486d69bf60SBram Moolenaar  if true && true
14496d69bf60SBram Moolenaar    res = true
14506d69bf60SBram Moolenaar  endif
14516d69bf60SBram Moolenaar  assert_equal(true, res)
14526d69bf60SBram Moolenaar
14536d69bf60SBram Moolenaar  res = false
14546d69bf60SBram Moolenaar  if true && false
14556d69bf60SBram Moolenaar    res = true
14566d69bf60SBram Moolenaar  endif
14576d69bf60SBram Moolenaar  assert_equal(false, res)
14586d69bf60SBram Moolenaar
14596d69bf60SBram Moolenaar  res = false
14606d69bf60SBram Moolenaar  if g:bool_true && false
14616d69bf60SBram Moolenaar    res = true
14626d69bf60SBram Moolenaar  endif
14636d69bf60SBram Moolenaar  assert_equal(false, res)
14646d69bf60SBram Moolenaar
14656d69bf60SBram Moolenaar  res = false
14666d69bf60SBram Moolenaar  if true && g:bool_false
14676d69bf60SBram Moolenaar    res = true
14686d69bf60SBram Moolenaar  endif
14696d69bf60SBram Moolenaar  assert_equal(false, res)
14706d69bf60SBram Moolenaar
14716d69bf60SBram Moolenaar  res = false
14726d69bf60SBram Moolenaar  if false && false
14736d69bf60SBram Moolenaar    res = true
14746d69bf60SBram Moolenaar  endif
14756d69bf60SBram Moolenaar  assert_equal(false, res)
14766d69bf60SBram Moolenaar
14776d69bf60SBram Moolenaar  res = false
14786d69bf60SBram Moolenaar  if true || false
14796d69bf60SBram Moolenaar    res = true
14806d69bf60SBram Moolenaar  endif
14816d69bf60SBram Moolenaar  assert_equal(true, res)
14826d69bf60SBram Moolenaar
14836d69bf60SBram Moolenaar  res = false
14846d69bf60SBram Moolenaar  if g:bool_true || false
14856d69bf60SBram Moolenaar    res = true
14866d69bf60SBram Moolenaar  endif
14876d69bf60SBram Moolenaar  assert_equal(true, res)
14886d69bf60SBram Moolenaar
14896d69bf60SBram Moolenaar  res = false
14906d69bf60SBram Moolenaar  if true || g:bool_false
14916d69bf60SBram Moolenaar    res = true
14926d69bf60SBram Moolenaar  endif
14936d69bf60SBram Moolenaar  assert_equal(true, res)
14946d69bf60SBram Moolenaar
14956d69bf60SBram Moolenaar  res = false
14966d69bf60SBram Moolenaar  if false || false
14976d69bf60SBram Moolenaar    res = true
14986d69bf60SBram Moolenaar  endif
14996d69bf60SBram Moolenaar  assert_equal(false, res)
150080c34ca3SBram Moolenaarenddef
15016d69bf60SBram Moolenaar
150280c34ca3SBram Moolenaardef Test_if_const_expr_fails()
150380c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
150480c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1505e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1506e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
15076d69bf60SBram Moolenaarenddef
15086d69bf60SBram Moolenaar
150972abcf42SBram Moolenaardef RunNested(i: number): number
151072abcf42SBram Moolenaar  let x: number = 0
151172abcf42SBram Moolenaar  if i % 2
151272abcf42SBram Moolenaar    if 1
1513f5be8cdbSBram Moolenaar      # comment
151472abcf42SBram Moolenaar    else
1515f5be8cdbSBram Moolenaar      # comment
151672abcf42SBram Moolenaar    endif
151772abcf42SBram Moolenaar    x += 1
151872abcf42SBram Moolenaar  else
151972abcf42SBram Moolenaar    x += 1000
152072abcf42SBram Moolenaar  endif
152172abcf42SBram Moolenaar  return x
152272abcf42SBram Moolenaarenddef
152372abcf42SBram Moolenaar
152472abcf42SBram Moolenaardef Test_nested_if()
152572abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
152672abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
152772abcf42SBram Moolenaarenddef
152872abcf42SBram Moolenaar
1529ad39c094SBram Moolenaardef Test_execute_cmd()
1530ad39c094SBram Moolenaar  new
1531ad39c094SBram Moolenaar  setline(1, 'default')
1532ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1533ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1534a72cfb80SBram Moolenaar
1535a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1536a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1537a72cfb80SBram Moolenaar
1538ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1539ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1540a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1541ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1542a72cfb80SBram Moolenaar
1543ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1544ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1545a72cfb80SBram Moolenaar
1546ad39c094SBram Moolenaar  let cmd_first = 'call '
1547ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1548ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1549ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1550ad39c094SBram Moolenaar  bwipe!
1551585fea7bSBram Moolenaar
1552585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1553a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1554ad39c094SBram Moolenaarenddef
1555ad39c094SBram Moolenaar
155647e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1557f5be8cdbSBram Moolenaar  # only checks line continuation
155847e880d6SBram Moolenaar  let lines =<< trim END
155947e880d6SBram Moolenaar      vim9script
156047e880d6SBram Moolenaar      execute 'g:someVar'
156147e880d6SBram Moolenaar                .. ' = ' ..
156247e880d6SBram Moolenaar                   '28'
156347e880d6SBram Moolenaar      assert_equal(28, g:someVar)
156447e880d6SBram Moolenaar      unlet g:someVar
156547e880d6SBram Moolenaar  END
156647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
156747e880d6SBram Moolenaarenddef
156847e880d6SBram Moolenaar
1569ad39c094SBram Moolenaardef Test_echo_cmd()
1570a72cfb80SBram Moolenaar  echo 'some' # comment
1571585fea7bSBram Moolenaar  echon 'thing'
1572ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1573ad39c094SBram Moolenaar
1574a72cfb80SBram Moolenaar  echo "some" # comment
1575a72cfb80SBram Moolenaar  echon "thing"
1576a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1577a72cfb80SBram Moolenaar
1578ad39c094SBram Moolenaar  let str1 = 'some'
1579ad39c094SBram Moolenaar  let str2 = 'more'
1580ad39c094SBram Moolenaar  echo str1 str2
1581ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1582a72cfb80SBram Moolenaar
1583a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1584ad39c094SBram Moolenaarenddef
1585ad39c094SBram Moolenaar
1586f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1587f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1588f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1589f93c7feaSBram Moolenaar  echo 'clear'
1590df069eecSBram Moolenaar  :1messages
1591f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1592f93c7feaSBram Moolenaar
1593f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1594f93c7feaSBram Moolenaarenddef
1595f93c7feaSBram Moolenaar
159647e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1597f5be8cdbSBram Moolenaar  # only checks line continuation
159847e880d6SBram Moolenaar  let lines =<< trim END
159947e880d6SBram Moolenaar      vim9script
160047e880d6SBram Moolenaar      echomsg 'here'
160147e880d6SBram Moolenaar                .. ' is ' ..
160247e880d6SBram Moolenaar                   'a message'
160347e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
160447e880d6SBram Moolenaar  END
160547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
160647e880d6SBram Moolenaarenddef
160747e880d6SBram Moolenaar
1608f93c7feaSBram Moolenaardef Test_echoerr_cmd()
160940ee466cSBram Moolenaar  try
161040ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
161140ee466cSBram Moolenaar  catch
161240ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
161340ee466cSBram Moolenaar  endtry
1614f93c7feaSBram Moolenaarenddef
1615f93c7feaSBram Moolenaar
161647e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1617f5be8cdbSBram Moolenaar  # only checks line continuation
161847e880d6SBram Moolenaar  let lines =<< trim END
161947e880d6SBram Moolenaar      vim9script
162047e880d6SBram Moolenaar      try
162147e880d6SBram Moolenaar        echoerr 'this'
162247e880d6SBram Moolenaar                .. ' is ' ..
162347e880d6SBram Moolenaar                   'wrong'
162447e880d6SBram Moolenaar      catch
162547e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
162647e880d6SBram Moolenaar      endtry
162747e880d6SBram Moolenaar  END
162847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
162947e880d6SBram Moolenaarenddef
163047e880d6SBram Moolenaar
163141fe0617SBram Moolenaardef Test_for_outside_of_function()
163241fe0617SBram Moolenaar  let lines =<< trim END
163341fe0617SBram Moolenaar    vim9script
163441fe0617SBram Moolenaar    new
163541fe0617SBram Moolenaar    for var in range(0, 3)
163641fe0617SBram Moolenaar      append(line('$'), var)
163741fe0617SBram Moolenaar    endfor
163841fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
163941fe0617SBram Moolenaar    bwipe!
164041fe0617SBram Moolenaar  END
164141fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
164241fe0617SBram Moolenaar  source Xvim9for.vim
164341fe0617SBram Moolenaar  delete('Xvim9for.vim')
164441fe0617SBram Moolenaarenddef
16458a7d6542SBram Moolenaar
1646e8c4abbbSBram Moolenaardef Test_for_loop()
1647e8c4abbbSBram Moolenaar  let result = ''
1648e8c4abbbSBram Moolenaar  for cnt in range(7)
1649e8c4abbbSBram Moolenaar    if cnt == 4
1650e8c4abbbSBram Moolenaar      break
1651e8c4abbbSBram Moolenaar    endif
1652e8c4abbbSBram Moolenaar    if cnt == 2
1653e8c4abbbSBram Moolenaar      continue
1654e8c4abbbSBram Moolenaar    endif
1655e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1656e8c4abbbSBram Moolenaar  endfor
1657e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
16580ad3e894SBram Moolenaar
16590ad3e894SBram Moolenaar  let concat = ''
16600ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
16610ad3e894SBram Moolenaar    concat ..= str
16620ad3e894SBram Moolenaar  endfor
16630ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1664e8c4abbbSBram Moolenaarenddef
1665e8c4abbbSBram Moolenaar
1666e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1667675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1668675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1669675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1670822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
16710ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
1672675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1673675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1674675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1675e8c4abbbSBram Moolenaarenddef
1676e8c4abbbSBram Moolenaar
1677d0df1aacSBram Moolenaardef Test_while_loop()
1678d0df1aacSBram Moolenaar  let result = ''
1679d0df1aacSBram Moolenaar  let cnt = 0
1680d0df1aacSBram Moolenaar  while cnt < 555
1681d0df1aacSBram Moolenaar    if cnt == 3
1682d0df1aacSBram Moolenaar      break
1683d0df1aacSBram Moolenaar    endif
1684d0df1aacSBram Moolenaar    cnt += 1
1685d0df1aacSBram Moolenaar    if cnt == 2
1686d0df1aacSBram Moolenaar      continue
1687d0df1aacSBram Moolenaar    endif
1688d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1689d0df1aacSBram Moolenaar  endwhile
1690d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1691d0df1aacSBram Moolenaarenddef
1692d0df1aacSBram Moolenaar
1693e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1694675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1695675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1696675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1697675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1698675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1699675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1700675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1701bd5da371SBram Moolenaarenddef
1702bd5da371SBram Moolenaar
17039645e2d9SBram Moolenaardef Test_interrupt_loop()
170497acfc78SBram Moolenaar  let caught = false
17059645e2d9SBram Moolenaar  let x = 0
170697acfc78SBram Moolenaar  try
17079645e2d9SBram Moolenaar    while 1
17089645e2d9SBram Moolenaar      x += 1
17099645e2d9SBram Moolenaar      if x == 100
17109645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
17119645e2d9SBram Moolenaar      endif
17129645e2d9SBram Moolenaar    endwhile
171397acfc78SBram Moolenaar  catch
171497acfc78SBram Moolenaar    caught = true
171597acfc78SBram Moolenaar    assert_equal(100, x)
171697acfc78SBram Moolenaar  endtry
171797acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
17189645e2d9SBram Moolenaarenddef
171920431c9dSBram Moolenaar
17204fdae999SBram Moolenaardef Test_automatic_line_continuation()
17214fdae999SBram Moolenaar  let mylist = [
17224fdae999SBram Moolenaar      'one',
17234fdae999SBram Moolenaar      'two',
17244fdae999SBram Moolenaar      'three',
1725f5be8cdbSBram Moolenaar      ] # comment
17264fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
17274fdae999SBram Moolenaar
17284fdae999SBram Moolenaar  let mydict = {
17294fdae999SBram Moolenaar      'one': 1,
17304fdae999SBram Moolenaar      'two': 2,
17314fdae999SBram Moolenaar      'three':
17324fdae999SBram Moolenaar          3,
1733f5be8cdbSBram Moolenaar      } # comment
17344fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
17354fdae999SBram Moolenaar  mydict = #{
17362c330432SBram Moolenaar      one: 1,  # comment
17372c330432SBram Moolenaar      two:     # comment
17382c330432SBram Moolenaar           2,  # comment
17392c330432SBram Moolenaar      three: 3 # comment
17402c330432SBram Moolenaar      }
17412c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
17422c330432SBram Moolenaar  mydict = #{
17432c330432SBram Moolenaar      one: 1,
17444fdae999SBram Moolenaar      two:
17454fdae999SBram Moolenaar           2,
17462c330432SBram Moolenaar      three: 3
17474fdae999SBram Moolenaar      }
17484fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1749e6085c53SBram Moolenaar
1750e6085c53SBram Moolenaar  assert_equal(
1751e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1752e6085c53SBram Moolenaar        split('one two three')
1753e6085c53SBram Moolenaar        )
17544fdae999SBram Moolenaarenddef
17554fdae999SBram Moolenaar
17567a092245SBram Moolenaardef Test_vim9_comment()
17577a092245SBram Moolenaar  CheckScriptSuccess([
17587a092245SBram Moolenaar      'vim9script',
17597a092245SBram Moolenaar      '# something',
17607a092245SBram Moolenaar      ])
17617a092245SBram Moolenaar  CheckScriptFailure([
17627a092245SBram Moolenaar      'vim9script',
17637a092245SBram Moolenaar      ':# something',
17647a092245SBram Moolenaar      ], 'E488:')
17657a092245SBram Moolenaar  CheckScriptFailure([
17667a092245SBram Moolenaar      '# something',
17677a092245SBram Moolenaar      ], 'E488:')
17687a092245SBram Moolenaar  CheckScriptFailure([
17697a092245SBram Moolenaar      ':# something',
17707a092245SBram Moolenaar      ], 'E488:')
17717a092245SBram Moolenaar
17724a8d9f2eSBram Moolenaar  { # block start
17734a8d9f2eSBram Moolenaar  } # block end
17744a8d9f2eSBram Moolenaar  CheckDefFailure([
17754a8d9f2eSBram Moolenaar      '{# comment',
17764a8d9f2eSBram Moolenaar      ], 'E488:')
17774a8d9f2eSBram Moolenaar  CheckDefFailure([
17784a8d9f2eSBram Moolenaar      '{',
17794a8d9f2eSBram Moolenaar      '}# comment',
17804a8d9f2eSBram Moolenaar      ], 'E488:')
17814a8d9f2eSBram Moolenaar
17824a8d9f2eSBram Moolenaar  echo "yes" # comment
17834a8d9f2eSBram Moolenaar  CheckDefFailure([
17844a8d9f2eSBram Moolenaar      'echo "yes"# comment',
17854a8d9f2eSBram Moolenaar      ], 'E488:')
17867a092245SBram Moolenaar  CheckScriptSuccess([
17877a092245SBram Moolenaar      'vim9script',
17887a092245SBram Moolenaar      'echo "yes" # something',
17897a092245SBram Moolenaar      ])
17907a092245SBram Moolenaar  CheckScriptFailure([
17917a092245SBram Moolenaar      'vim9script',
17927a092245SBram Moolenaar      'echo "yes"# something',
17937a092245SBram Moolenaar      ], 'E121:')
17947a092245SBram Moolenaar  CheckScriptFailure([
17957a092245SBram Moolenaar      'vim9script',
17967a092245SBram Moolenaar      'echo# something',
17977a092245SBram Moolenaar      ], 'E121:')
17987a092245SBram Moolenaar  CheckScriptFailure([
17997a092245SBram Moolenaar      'echo "yes" # something',
18007a092245SBram Moolenaar      ], 'E121:')
18017a092245SBram Moolenaar
18024a8d9f2eSBram Moolenaar  exe "echo" # comment
18034a8d9f2eSBram Moolenaar  CheckDefFailure([
18044a8d9f2eSBram Moolenaar      'exe "echo"# comment',
18054a8d9f2eSBram Moolenaar      ], 'E488:')
18064a8d9f2eSBram Moolenaar  CheckScriptSuccess([
18074a8d9f2eSBram Moolenaar      'vim9script',
18084a8d9f2eSBram Moolenaar      'exe "echo" # something',
18094a8d9f2eSBram Moolenaar      ])
18104a8d9f2eSBram Moolenaar  CheckScriptFailure([
18114a8d9f2eSBram Moolenaar      'vim9script',
18124a8d9f2eSBram Moolenaar      'exe "echo"# something',
18134a8d9f2eSBram Moolenaar      ], 'E121:')
18144a8d9f2eSBram Moolenaar  CheckDefFailure([
18154a8d9f2eSBram Moolenaar      'exe # comment',
18164a8d9f2eSBram Moolenaar      ], 'E1015:')
18174a8d9f2eSBram Moolenaar  CheckScriptFailure([
18184a8d9f2eSBram Moolenaar      'vim9script',
18194a8d9f2eSBram Moolenaar      'exe# something',
18204a8d9f2eSBram Moolenaar      ], 'E121:')
18214a8d9f2eSBram Moolenaar  CheckScriptFailure([
18224a8d9f2eSBram Moolenaar      'exe "echo" # something',
18234a8d9f2eSBram Moolenaar      ], 'E121:')
18244a8d9f2eSBram Moolenaar
18257a092245SBram Moolenaar  CheckDefFailure([
18267a092245SBram Moolenaar      'try# comment',
18277a092245SBram Moolenaar      '  echo "yes"',
18287a092245SBram Moolenaar      'catch',
18297a092245SBram Moolenaar      'endtry',
18307a092245SBram Moolenaar      ], 'E488:')
18312c5ed4e3SBram Moolenaar  CheckScriptFailure([
18322c5ed4e3SBram Moolenaar      'vim9script',
18332c5ed4e3SBram Moolenaar      'try# comment',
18342c5ed4e3SBram Moolenaar      'echo "yes"',
18352c5ed4e3SBram Moolenaar      ], 'E488:')
18367a092245SBram Moolenaar  CheckDefFailure([
18377a092245SBram Moolenaar      'try',
1838a72cfb80SBram Moolenaar      '  throw#comment',
1839a72cfb80SBram Moolenaar      'catch',
1840a72cfb80SBram Moolenaar      'endtry',
1841a72cfb80SBram Moolenaar      ], 'E1015:')
1842a72cfb80SBram Moolenaar  CheckDefFailure([
1843a72cfb80SBram Moolenaar      'try',
1844a72cfb80SBram Moolenaar      '  throw "yes"#comment',
1845a72cfb80SBram Moolenaar      'catch',
1846a72cfb80SBram Moolenaar      'endtry',
1847a72cfb80SBram Moolenaar      ], 'E488:')
1848a72cfb80SBram Moolenaar  CheckDefFailure([
1849a72cfb80SBram Moolenaar      'try',
18507a092245SBram Moolenaar      '  echo "yes"',
18517a092245SBram Moolenaar      'catch# comment',
18527a092245SBram Moolenaar      'endtry',
18537a092245SBram Moolenaar      ], 'E488:')
18542c5ed4e3SBram Moolenaar  CheckScriptFailure([
18552c5ed4e3SBram Moolenaar      'vim9script',
18562c5ed4e3SBram Moolenaar      'try',
18572c5ed4e3SBram Moolenaar      '  echo "yes"',
18582c5ed4e3SBram Moolenaar      'catch# comment',
18592c5ed4e3SBram Moolenaar      'endtry',
18602c5ed4e3SBram Moolenaar      ], 'E654:')
18612c5ed4e3SBram Moolenaar  CheckDefFailure([
18622c5ed4e3SBram Moolenaar      'try',
18632c5ed4e3SBram Moolenaar      '  echo "yes"',
18642c5ed4e3SBram Moolenaar      'catch /pat/# comment',
18652c5ed4e3SBram Moolenaar      'endtry',
18662c5ed4e3SBram Moolenaar      ], 'E488:')
18677a092245SBram Moolenaar  CheckDefFailure([
18687a092245SBram Moolenaar      'try',
18697a092245SBram Moolenaar      'echo "yes"',
18707a092245SBram Moolenaar      'catch',
18717a092245SBram Moolenaar      'endtry# comment',
18727a092245SBram Moolenaar      ], 'E488:')
18732c5ed4e3SBram Moolenaar  CheckScriptFailure([
18742c5ed4e3SBram Moolenaar      'vim9script',
18752c5ed4e3SBram Moolenaar      'try',
18762c5ed4e3SBram Moolenaar      '  echo "yes"',
18772c5ed4e3SBram Moolenaar      'catch',
18782c5ed4e3SBram Moolenaar      'endtry# comment',
18799b7bf9e9SBram Moolenaar      ], 'E488:')
18802c5ed4e3SBram Moolenaar
18812c5ed4e3SBram Moolenaar  CheckScriptSuccess([
18822c5ed4e3SBram Moolenaar      'vim9script',
18832c5ed4e3SBram Moolenaar      'hi # comment',
18842c5ed4e3SBram Moolenaar      ])
18852c5ed4e3SBram Moolenaar  CheckScriptFailure([
18862c5ed4e3SBram Moolenaar      'vim9script',
18872c5ed4e3SBram Moolenaar      'hi# comment',
18882c5ed4e3SBram Moolenaar      ], 'E416:')
18891966c248SBram Moolenaar  CheckScriptSuccess([
18901966c248SBram Moolenaar      'vim9script',
18911966c248SBram Moolenaar      'hi Search # comment',
18921966c248SBram Moolenaar      ])
18931966c248SBram Moolenaar  CheckScriptFailure([
18941966c248SBram Moolenaar      'vim9script',
18951966c248SBram Moolenaar      'hi Search# comment',
18961966c248SBram Moolenaar      ], 'E416:')
18971966c248SBram Moolenaar  CheckScriptSuccess([
18981966c248SBram Moolenaar      'vim9script',
18991966c248SBram Moolenaar      'hi link This Search # comment',
19001966c248SBram Moolenaar      ])
19011966c248SBram Moolenaar  CheckScriptFailure([
19021966c248SBram Moolenaar      'vim9script',
19031966c248SBram Moolenaar      'hi link This That# comment',
19041966c248SBram Moolenaar      ], 'E413:')
19051966c248SBram Moolenaar  CheckScriptSuccess([
19061966c248SBram Moolenaar      'vim9script',
19071966c248SBram Moolenaar      'hi clear This # comment',
19081966c248SBram Moolenaar      'hi clear # comment',
19091966c248SBram Moolenaar      ])
1910f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
1911f5be8cdbSBram Moolenaar  # hi clear This# comment',
19121966c248SBram Moolenaar  CheckScriptFailure([
19131966c248SBram Moolenaar      'vim9script',
19141966c248SBram Moolenaar      'hi clear# comment',
19151966c248SBram Moolenaar      ], 'E416:')
19161966c248SBram Moolenaar
19171966c248SBram Moolenaar  CheckScriptSuccess([
19181966c248SBram Moolenaar      'vim9script',
19191966c248SBram Moolenaar      'hi Group term=bold',
19201966c248SBram Moolenaar      'match Group /todo/ # comment',
19211966c248SBram Moolenaar      ])
19221966c248SBram Moolenaar  CheckScriptFailure([
19231966c248SBram Moolenaar      'vim9script',
19241966c248SBram Moolenaar      'hi Group term=bold',
19251966c248SBram Moolenaar      'match Group /todo/# comment',
19261966c248SBram Moolenaar      ], 'E488:')
19271966c248SBram Moolenaar  CheckScriptSuccess([
19281966c248SBram Moolenaar      'vim9script',
19291966c248SBram Moolenaar      'match # comment',
19301966c248SBram Moolenaar      ])
19311966c248SBram Moolenaar  CheckScriptFailure([
19321966c248SBram Moolenaar      'vim9script',
19331966c248SBram Moolenaar      'match# comment',
19341966c248SBram Moolenaar      ], 'E475:')
19351966c248SBram Moolenaar  CheckScriptSuccess([
19361966c248SBram Moolenaar      'vim9script',
19371966c248SBram Moolenaar      'match none # comment',
19381966c248SBram Moolenaar      ])
19391966c248SBram Moolenaar  CheckScriptFailure([
19401966c248SBram Moolenaar      'vim9script',
19411966c248SBram Moolenaar      'match none# comment',
19421966c248SBram Moolenaar      ], 'E475:')
19431966c248SBram Moolenaar
19441966c248SBram Moolenaar  CheckScriptSuccess([
19451966c248SBram Moolenaar      'vim9script',
19461966c248SBram Moolenaar      'menutrans clear # comment',
19471966c248SBram Moolenaar      ])
19481966c248SBram Moolenaar  CheckScriptFailure([
19491966c248SBram Moolenaar      'vim9script',
19501966c248SBram Moolenaar      'menutrans clear# comment text',
19511966c248SBram Moolenaar      ], 'E474:')
19521966c248SBram Moolenaar
19531966c248SBram Moolenaar  CheckScriptSuccess([
19541966c248SBram Moolenaar      'vim9script',
19551966c248SBram Moolenaar      'syntax clear # comment',
19561966c248SBram Moolenaar      ])
19571966c248SBram Moolenaar  CheckScriptFailure([
19581966c248SBram Moolenaar      'vim9script',
19591966c248SBram Moolenaar      'syntax clear# comment text',
19601966c248SBram Moolenaar      ], 'E28:')
19611966c248SBram Moolenaar  CheckScriptSuccess([
19621966c248SBram Moolenaar      'vim9script',
19631966c248SBram Moolenaar      'syntax keyword Word some',
19641966c248SBram Moolenaar      'syntax clear Word # comment',
19651966c248SBram Moolenaar      ])
19661966c248SBram Moolenaar  CheckScriptFailure([
19671966c248SBram Moolenaar      'vim9script',
19681966c248SBram Moolenaar      'syntax keyword Word some',
19691966c248SBram Moolenaar      'syntax clear Word# comment text',
19701966c248SBram Moolenaar      ], 'E28:')
19711966c248SBram Moolenaar
19721966c248SBram Moolenaar  CheckScriptSuccess([
19731966c248SBram Moolenaar      'vim9script',
19741966c248SBram Moolenaar      'syntax list # comment',
19751966c248SBram Moolenaar      ])
19761966c248SBram Moolenaar  CheckScriptFailure([
19771966c248SBram Moolenaar      'vim9script',
19781966c248SBram Moolenaar      'syntax list# comment text',
19791966c248SBram Moolenaar      ], 'E28:')
19801966c248SBram Moolenaar
19811966c248SBram Moolenaar  CheckScriptSuccess([
19821966c248SBram Moolenaar      'vim9script',
19831966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
19841966c248SBram Moolenaar      ])
19851966c248SBram Moolenaar  CheckScriptFailure([
19861966c248SBram Moolenaar      'vim9script',
19871966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
19881966c248SBram Moolenaar      ], 'E475:')
19891966c248SBram Moolenaar
19901966c248SBram Moolenaar  CheckScriptSuccess([
19911966c248SBram Moolenaar      'vim9script',
19921966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
19931966c248SBram Moolenaar      ])
19941966c248SBram Moolenaar  CheckScriptFailure([
19951966c248SBram Moolenaar      'vim9script',
19961966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
19971966c248SBram Moolenaar      ], 'E789:')
19981966c248SBram Moolenaar
19991966c248SBram Moolenaar  CheckScriptSuccess([
20001966c248SBram Moolenaar      'vim9script',
20011966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
20021966c248SBram Moolenaar      ])
20031966c248SBram Moolenaar  CheckScriptFailure([
20041966c248SBram Moolenaar      'vim9script',
20051966c248SBram Moolenaar      'syntax match Word /pat/# comment',
20061966c248SBram Moolenaar      ], 'E402:')
20071966c248SBram Moolenaar
20081966c248SBram Moolenaar  CheckScriptSuccess([
20091966c248SBram Moolenaar      'vim9script',
20101966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
20111966c248SBram Moolenaar      ])
20121966c248SBram Moolenaar  CheckScriptFailure([
20131966c248SBram Moolenaar      'vim9script',
20141966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
20151966c248SBram Moolenaar      ], 'E475:')
20161966c248SBram Moolenaar  CheckScriptFailure([
20171966c248SBram Moolenaar      'vim9script',
20181966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
20191966c248SBram Moolenaar      ], 'E406:')
20201966c248SBram Moolenaar  CheckScriptFailure([
20211966c248SBram Moolenaar      'vim9script',
20221966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
20231966c248SBram Moolenaar      ], 'E475:')
20241966c248SBram Moolenaar
20251966c248SBram Moolenaar  CheckScriptSuccess([
20261966c248SBram Moolenaar      'vim9script',
20271966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
20281966c248SBram Moolenaar      ])
20291966c248SBram Moolenaar  CheckScriptFailure([
20301966c248SBram Moolenaar      'vim9script',
20311966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
20321966c248SBram Moolenaar      ], 'E475:')
20331966c248SBram Moolenaar
20341966c248SBram Moolenaar  CheckScriptSuccess([
20351966c248SBram Moolenaar      'vim9script',
20361966c248SBram Moolenaar      'syntax sync # comment',
20371966c248SBram Moolenaar      ])
20381966c248SBram Moolenaar  CheckScriptFailure([
20391966c248SBram Moolenaar      'vim9script',
20401966c248SBram Moolenaar      'syntax sync# comment',
20411966c248SBram Moolenaar      ], 'E404:')
20421966c248SBram Moolenaar  CheckScriptSuccess([
20431966c248SBram Moolenaar      'vim9script',
20441966c248SBram Moolenaar      'syntax sync ccomment # comment',
20451966c248SBram Moolenaar      ])
20461966c248SBram Moolenaar  CheckScriptFailure([
20471966c248SBram Moolenaar      'vim9script',
20481966c248SBram Moolenaar      'syntax sync ccomment# comment',
20491966c248SBram Moolenaar      ], 'E404:')
20501966c248SBram Moolenaar
20511966c248SBram Moolenaar  CheckScriptSuccess([
20521966c248SBram Moolenaar      'vim9script',
20531966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
20541966c248SBram Moolenaar      ])
20551966c248SBram Moolenaar  CheckScriptFailure([
20561966c248SBram Moolenaar      'vim9script',
20571966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
20581966c248SBram Moolenaar      ], 'E475:')
2059a72cfb80SBram Moolenaar
2060a72cfb80SBram Moolenaar  CheckScriptSuccess([
2061a72cfb80SBram Moolenaar      'vim9script',
2062a72cfb80SBram Moolenaar      'command Echo echo # comment',
2063a72cfb80SBram Moolenaar      'command Echo # comment',
2064a72cfb80SBram Moolenaar      ])
2065a72cfb80SBram Moolenaar  CheckScriptFailure([
2066a72cfb80SBram Moolenaar      'vim9script',
2067a72cfb80SBram Moolenaar      'command Echo echo# comment',
2068a72cfb80SBram Moolenaar      'Echo',
2069a72cfb80SBram Moolenaar      ], 'E121:')
2070a72cfb80SBram Moolenaar  CheckScriptFailure([
2071a72cfb80SBram Moolenaar      'vim9script',
2072a72cfb80SBram Moolenaar      'command Echo# comment',
2073a72cfb80SBram Moolenaar      ], 'E182:')
2074a72cfb80SBram Moolenaar  CheckScriptFailure([
2075a72cfb80SBram Moolenaar      'vim9script',
2076a72cfb80SBram Moolenaar      'command Echo echo',
2077a72cfb80SBram Moolenaar      'command Echo# comment',
2078a72cfb80SBram Moolenaar      ], 'E182:')
2079a72cfb80SBram Moolenaar
2080a72cfb80SBram Moolenaar  CheckScriptSuccess([
2081a72cfb80SBram Moolenaar      'vim9script',
2082a72cfb80SBram Moolenaar      'function # comment',
2083a72cfb80SBram Moolenaar      ])
2084a72cfb80SBram Moolenaar  CheckScriptFailure([
2085a72cfb80SBram Moolenaar      'vim9script',
2086a72cfb80SBram Moolenaar      'function# comment',
2087a72cfb80SBram Moolenaar      ], 'E129:')
2088a72cfb80SBram Moolenaar  CheckScriptSuccess([
2089a72cfb80SBram Moolenaar      'vim9script',
2090a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2091a72cfb80SBram Moolenaar      ])
2092a72cfb80SBram Moolenaar  CheckScriptFailure([
2093a72cfb80SBram Moolenaar      'vim9script',
2094a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2095a72cfb80SBram Moolenaar      ], 'E488:')
2096a72cfb80SBram Moolenaar
2097a72cfb80SBram Moolenaar  CheckScriptSuccess([
2098a72cfb80SBram Moolenaar      'vim9script',
20994c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2100a72cfb80SBram Moolenaar      'endfunc',
21014c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2102a72cfb80SBram Moolenaar      ])
2103a72cfb80SBram Moolenaar  CheckScriptFailure([
2104a72cfb80SBram Moolenaar      'vim9script',
21054c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2106a72cfb80SBram Moolenaar      'endfunc',
21074c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2108a72cfb80SBram Moolenaar      ], 'E488:')
2109a72cfb80SBram Moolenaar
2110a72cfb80SBram Moolenaar  CheckScriptSuccess([
2111a72cfb80SBram Moolenaar      'vim9script',
2112a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2113a72cfb80SBram Moolenaar      ])
2114a72cfb80SBram Moolenaar  CheckScriptFailure([
2115a72cfb80SBram Moolenaar      'vim9script',
2116a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2117a72cfb80SBram Moolenaar      ], 'E488:')
21182c5ed4e3SBram Moolenaarenddef
21192c5ed4e3SBram Moolenaar
21202c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
21212c5ed4e3SBram Moolenaar  CheckCanRunGui
21222c5ed4e3SBram Moolenaar
21232c5ed4e3SBram Moolenaar  CheckScriptFailure([
21242c5ed4e3SBram Moolenaar      'vim9script',
21252c5ed4e3SBram Moolenaar      'gui#comment'
21262c5ed4e3SBram Moolenaar      ], 'E499:')
21272c5ed4e3SBram Moolenaar  CheckScriptFailure([
21282c5ed4e3SBram Moolenaar      'vim9script',
21292c5ed4e3SBram Moolenaar      'gui -f#comment'
21302c5ed4e3SBram Moolenaar      ], 'E499:')
21317a092245SBram Moolenaarenddef
21327a092245SBram Moolenaar
2133a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
21346797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
21356797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2136a26b9700SBram Moolenaar
2137a26b9700SBram Moolenaar  edit test.vim
2138a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2139a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2140a26b9700SBram Moolenaar
2141a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2142a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2143a26b9700SBram Moolenaar
2144a26b9700SBram Moolenaar  g:entered = 0
2145a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2146a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2147a26b9700SBram Moolenaar
2148a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2149a26b9700SBram Moolenaar
2150a26b9700SBram Moolenaar  au! TabEnter
2151a26b9700SBram Moolenaar  unlet g:entered
2152d72c1bf0SBram Moolenaar
2153d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2154d72c1bf0SBram Moolenaar      'vim9script',
21556797966dSBram Moolenaar      'g:var = 123',
2156e55b1c09SBram Moolenaar      'b:var = 456',
2157e55b1c09SBram Moolenaar      'w:var = 777',
2158e55b1c09SBram Moolenaar      't:var = 888',
2159d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2160d72c1bf0SBram Moolenaar      ])
2161d72c1bf0SBram Moolenaar
2162d72c1bf0SBram Moolenaar  CheckScriptFailure([
2163d72c1bf0SBram Moolenaar      'vim9script',
2164d72c1bf0SBram Moolenaar      'let g:var = 123',
2165e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2166e55b1c09SBram Moolenaar
2167e55b1c09SBram Moolenaar  CheckScriptFailure([
2168e55b1c09SBram Moolenaar      'vim9script',
2169e55b1c09SBram Moolenaar      'let b:var = 123',
2170e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2171e55b1c09SBram Moolenaar
2172e55b1c09SBram Moolenaar  CheckScriptFailure([
2173e55b1c09SBram Moolenaar      'vim9script',
2174e55b1c09SBram Moolenaar      'let w:var = 123',
2175e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2176e55b1c09SBram Moolenaar
2177e55b1c09SBram Moolenaar  CheckScriptFailure([
2178e55b1c09SBram Moolenaar      'vim9script',
2179e55b1c09SBram Moolenaar      'let t:var = 123',
2180e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2181e55b1c09SBram Moolenaar
2182e55b1c09SBram Moolenaar  CheckScriptFailure([
2183e55b1c09SBram Moolenaar      'vim9script',
2184e55b1c09SBram Moolenaar      'let v:version = 123',
2185e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2186e55b1c09SBram Moolenaar
2187e55b1c09SBram Moolenaar  CheckScriptFailure([
2188e55b1c09SBram Moolenaar      'vim9script',
2189e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2190e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
21916797966dSBram Moolenaar
21926797966dSBram Moolenaar  CheckScriptFailure([
21936797966dSBram Moolenaar      'vim9script',
21946797966dSBram Moolenaar      'g:var = 123',
219532e35117SBram Moolenaar      'unlet g:var# comment1',
2196d72c1bf0SBram Moolenaar      ], 'E108:')
2197d72c1bf0SBram Moolenaar
2198d72c1bf0SBram Moolenaar  CheckScriptFailure([
2199d72c1bf0SBram Moolenaar      'let g:var = 123',
2200d72c1bf0SBram Moolenaar      'unlet g:var # something',
2201d72c1bf0SBram Moolenaar      ], 'E488:')
2202faac4104SBram Moolenaar
2203faac4104SBram Moolenaar  CheckScriptSuccess([
2204faac4104SBram Moolenaar      'vim9script',
220532e35117SBram Moolenaar      'if 1 # comment2',
2206faac4104SBram Moolenaar      '  echo "yes"',
2207faac4104SBram Moolenaar      'elseif 2 #comment',
2208faac4104SBram Moolenaar      '  echo "no"',
2209faac4104SBram Moolenaar      'endif',
2210faac4104SBram Moolenaar      ])
2211faac4104SBram Moolenaar
2212faac4104SBram Moolenaar  CheckScriptFailure([
2213faac4104SBram Moolenaar      'vim9script',
221432e35117SBram Moolenaar      'if 1# comment3',
2215faac4104SBram Moolenaar      '  echo "yes"',
2216faac4104SBram Moolenaar      'endif',
2217faac4104SBram Moolenaar      ], 'E15:')
2218faac4104SBram Moolenaar
2219faac4104SBram Moolenaar  CheckScriptFailure([
2220faac4104SBram Moolenaar      'vim9script',
222132e35117SBram Moolenaar      'if 0 # comment4',
2222faac4104SBram Moolenaar      '  echo "yes"',
2223faac4104SBram Moolenaar      'elseif 2#comment',
2224faac4104SBram Moolenaar      '  echo "no"',
2225faac4104SBram Moolenaar      'endif',
2226faac4104SBram Moolenaar      ], 'E15:')
2227faac4104SBram Moolenaar
2228faac4104SBram Moolenaar  CheckScriptSuccess([
2229faac4104SBram Moolenaar      'vim9script',
223032e35117SBram Moolenaar      'let v = 1 # comment5',
2231faac4104SBram Moolenaar      ])
2232faac4104SBram Moolenaar
2233faac4104SBram Moolenaar  CheckScriptFailure([
2234faac4104SBram Moolenaar      'vim9script',
223532e35117SBram Moolenaar      'let v = 1# comment6',
223632e35117SBram Moolenaar      ], 'E15:')
2237faac4104SBram Moolenaar
2238faac4104SBram Moolenaar  CheckScriptSuccess([
2239faac4104SBram Moolenaar      'vim9script',
2240faac4104SBram Moolenaar      'new'
2241faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2242df069eecSBram Moolenaar      ':$',
2243faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2244faac4104SBram Moolenaar      'bwipe!',
2245faac4104SBram Moolenaar      ])
2246faac4104SBram Moolenaar
2247f5be8cdbSBram Moolenaar  CheckScriptFailure([
2248f5be8cdbSBram Moolenaar      'vim9script',
2249f5be8cdbSBram Moolenaar      'new'
2250f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2251f5be8cdbSBram Moolenaar      ':$',
2252f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2253f5be8cdbSBram Moolenaar      'bwipe!',
2254f5be8cdbSBram Moolenaar      ], 'E488:')
2255f5be8cdbSBram Moolenaar
2256f5be8cdbSBram Moolenaar  CheckScriptFailure([
2257f5be8cdbSBram Moolenaar      'vim9script',
2258f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2259f5be8cdbSBram Moolenaar      ], 'E477:')
2260a26b9700SBram Moolenaarenddef
2261a26b9700SBram Moolenaar
22627e5bd91dSBram Moolenaardef Test_finish()
22637e5bd91dSBram Moolenaar  let lines =<< trim END
22647e5bd91dSBram Moolenaar    vim9script
22656797966dSBram Moolenaar    g:res = 'one'
22667e5bd91dSBram Moolenaar    if v:false | finish | endif
22676797966dSBram Moolenaar    g:res = 'two'
22687e5bd91dSBram Moolenaar    finish
22696797966dSBram Moolenaar    g:res = 'three'
22707e5bd91dSBram Moolenaar  END
22717e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
22727e5bd91dSBram Moolenaar  source Xfinished
22737e5bd91dSBram Moolenaar  assert_equal('two', g:res)
22747e5bd91dSBram Moolenaar
22757e5bd91dSBram Moolenaar  unlet g:res
22767e5bd91dSBram Moolenaar  delete('Xfinished')
22777e5bd91dSBram Moolenaarenddef
22787e5bd91dSBram Moolenaar
227932e35117SBram Moolenaardef Test_let_func_call()
228032e35117SBram Moolenaar  let lines =<< trim END
228132e35117SBram Moolenaar    vim9script
228232e35117SBram Moolenaar    func GetValue()
228332e35117SBram Moolenaar      if exists('g:count')
228432e35117SBram Moolenaar        let g:count += 1
228532e35117SBram Moolenaar      else
228632e35117SBram Moolenaar        let g:count = 1
228732e35117SBram Moolenaar      endif
228832e35117SBram Moolenaar      return 'this'
228932e35117SBram Moolenaar    endfunc
229032e35117SBram Moolenaar    let val: string = GetValue()
2291f5be8cdbSBram Moolenaar    # env var is always a string
2292df671b46SBram Moolenaar    let env = $TERM
229332e35117SBram Moolenaar  END
229432e35117SBram Moolenaar  writefile(lines, 'Xfinished')
229532e35117SBram Moolenaar  source Xfinished
2296f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
229732e35117SBram Moolenaar  assert_equal(1, g:count)
229832e35117SBram Moolenaar
229932e35117SBram Moolenaar  unlet g:count
230032e35117SBram Moolenaar  delete('Xfinished')
230132e35117SBram Moolenaarenddef
230232e35117SBram Moolenaar
230332e35117SBram Moolenaardef Test_let_missing_type()
230432e35117SBram Moolenaar  let lines =<< trim END
230532e35117SBram Moolenaar    vim9script
2306df671b46SBram Moolenaar    let var = g:unknown
2307227a69deSBram Moolenaar  END
2308822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2309227a69deSBram Moolenaar
2310227a69deSBram Moolenaar  lines =<< trim END
2311227a69deSBram Moolenaar    vim9script
2312227a69deSBram Moolenaar    let nr: number = 123
2313227a69deSBram Moolenaar    let var = nr
2314227a69deSBram Moolenaar  END
2315822ba247SBram Moolenaar  CheckScriptSuccess(lines)
231632e35117SBram Moolenaarenddef
231732e35117SBram Moolenaar
2318c82a5b5dSBram Moolenaardef Test_let_declaration()
2319c82a5b5dSBram Moolenaar  let lines =<< trim END
2320c82a5b5dSBram Moolenaar    vim9script
2321c82a5b5dSBram Moolenaar    let var: string
2322c82a5b5dSBram Moolenaar    g:var_uninit = var
2323c82a5b5dSBram Moolenaar    var = 'text'
2324c82a5b5dSBram Moolenaar    g:var_test = var
2325f5be8cdbSBram Moolenaar    # prefixing s: is optional
2326984dddbeSBram Moolenaar    s:var = 'prefixed'
2327984dddbeSBram Moolenaar    g:var_prefixed = s:var
2328984dddbeSBram Moolenaar
2329984dddbeSBram Moolenaar    let s:other: number
2330984dddbeSBram Moolenaar    other = 1234
2331984dddbeSBram Moolenaar    g:other_var = other
2332c82a5b5dSBram Moolenaar  END
2333c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2334c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2335c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2336984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2337984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2338c82a5b5dSBram Moolenaar
2339c82a5b5dSBram Moolenaar  unlet g:var_uninit
2340c82a5b5dSBram Moolenaar  unlet g:var_test
2341984dddbeSBram Moolenaar  unlet g:var_prefixed
2342984dddbeSBram Moolenaar  unlet g:other_var
2343c82a5b5dSBram Moolenaarenddef
2344c82a5b5dSBram Moolenaar
2345c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2346c5b1c20bSBram Moolenaar  let lines =<< trim END
2347c5b1c20bSBram Moolenaar    vim9script
2348c5b1c20bSBram Moolenaar    const var: string
2349c5b1c20bSBram Moolenaar  END
2350c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2351c5b1c20bSBram Moolenaar
2352c5b1c20bSBram Moolenaar  lines =<< trim END
2353c5b1c20bSBram Moolenaar    vim9script
2354c5b1c20bSBram Moolenaar    let 9var: string
2355c5b1c20bSBram Moolenaar  END
2356c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2357c5b1c20bSBram Moolenaarenddef
2358c5b1c20bSBram Moolenaar
235934db91f7SBram Moolenaardef Test_let_type_check()
236034db91f7SBram Moolenaar  let lines =<< trim END
236134db91f7SBram Moolenaar    vim9script
236234db91f7SBram Moolenaar    let var: string
236334db91f7SBram Moolenaar    var = 1234
236434db91f7SBram Moolenaar  END
236534db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2366984dddbeSBram Moolenaar
2367984dddbeSBram Moolenaar  lines =<< trim END
2368984dddbeSBram Moolenaar    vim9script
2369984dddbeSBram Moolenaar    let var:string
2370984dddbeSBram Moolenaar  END
2371984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2372c5b1c20bSBram Moolenaar
2373c5b1c20bSBram Moolenaar  lines =<< trim END
2374c5b1c20bSBram Moolenaar    vim9script
2375c5b1c20bSBram Moolenaar    let var: asdf
2376c5b1c20bSBram Moolenaar  END
2377c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
237834db91f7SBram Moolenaarenddef
237934db91f7SBram Moolenaar
2380a5d0077eSBram Moolenaardef Test_forward_declaration()
2381a5d0077eSBram Moolenaar  let lines =<< trim END
2382a5d0077eSBram Moolenaar    vim9script
2383a5d0077eSBram Moolenaar    def GetValue(): string
2384a5d0077eSBram Moolenaar      return theVal
2385a5d0077eSBram Moolenaar    enddef
2386a5d0077eSBram Moolenaar    let theVal = 'something'
2387822ba247SBram Moolenaar    g:initVal = GetValue()
2388a5d0077eSBram Moolenaar    theVal = 'else'
2389a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2390a5d0077eSBram Moolenaar  END
2391a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2392a5d0077eSBram Moolenaar  source Xforward
2393a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2394a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2395a5d0077eSBram Moolenaar
2396a5d0077eSBram Moolenaar  unlet g:initVal
2397a5d0077eSBram Moolenaar  unlet g:laterVal
2398a5d0077eSBram Moolenaar  delete('Xforward')
2399a5d0077eSBram Moolenaarenddef
2400a5d0077eSBram Moolenaar
24019721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
24029721fb4eSBram Moolenaar  let legacy_lines =<< trim END
24039721fb4eSBram Moolenaar    source Xvim9_script.vim
24049721fb4eSBram Moolenaar
24059721fb4eSBram Moolenaar    call assert_false(exists('local'))
24069721fb4eSBram Moolenaar    call assert_false(exists('exported'))
24079721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
24089721fb4eSBram Moolenaar    call assert_equal('global', global)
24099721fb4eSBram Moolenaar    call assert_equal('global', g:global)
24109721fb4eSBram Moolenaar
24119721fb4eSBram Moolenaar    " imported variable becomes script-local
24129721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
24139721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
24149721fb4eSBram Moolenaar    call assert_false(exists('exported'))
24159721fb4eSBram Moolenaar
24169721fb4eSBram Moolenaar    " imported function becomes script-local
24179721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
24189721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
24199721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
24209721fb4eSBram Moolenaar  END
24219721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
24229721fb4eSBram Moolenaar
24239721fb4eSBram Moolenaar  let vim9_lines =<< trim END
24249721fb4eSBram Moolenaar    vim9script
24259721fb4eSBram Moolenaar    let local = 'local'
24269721fb4eSBram Moolenaar    g:global = 'global'
24279721fb4eSBram Moolenaar    export let exported = 'exported'
24289721fb4eSBram Moolenaar    export def GetText(): string
24299721fb4eSBram Moolenaar       return 'text'
24309721fb4eSBram Moolenaar    enddef
24319721fb4eSBram Moolenaar  END
24329721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
24339721fb4eSBram Moolenaar
24349721fb4eSBram Moolenaar  source Xlegacy_script.vim
24359721fb4eSBram Moolenaar
24369721fb4eSBram Moolenaar  assert_equal('global', g:global)
2437f5be8cdbSBram Moolenaar  unlet g:global
24389721fb4eSBram Moolenaar
24399721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
24409721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
24419721fb4eSBram Moolenaarenddef
2442a5d0077eSBram Moolenaar
2443eeb27bfeSBram Moolenaardef Test_vim9_copen()
2444eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2445eeb27bfeSBram Moolenaar  copen
2446eeb27bfeSBram Moolenaar  quit
2447eeb27bfeSBram Moolenaarenddef
2448eeb27bfeSBram Moolenaar
2449585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2450585fea7bSBram Moolenaardef Test_substitute_cmd()
2451585fea7bSBram Moolenaar  new
2452585fea7bSBram Moolenaar  setline(1, 'something')
2453585fea7bSBram Moolenaar  :substitute(some(other(
2454585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2455585fea7bSBram Moolenaar  bwipe!
2456585fea7bSBram Moolenaar
2457f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2458585fea7bSBram Moolenaar  let lines =<< trim END
2459585fea7bSBram Moolenaar    vim9script
2460585fea7bSBram Moolenaar    new
2461585fea7bSBram Moolenaar    setline(1, 'something')
2462585fea7bSBram Moolenaar    :substitute(some(other(
2463585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2464585fea7bSBram Moolenaar    bwipe!
2465585fea7bSBram Moolenaar  END
2466585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2467585fea7bSBram Moolenaar  source Xvim9lines
2468585fea7bSBram Moolenaar
2469585fea7bSBram Moolenaar  delete('Xvim9lines')
2470585fea7bSBram Moolenaarenddef
2471585fea7bSBram Moolenaar
24728a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2473